package fr.svpro.radiomercure; import android.Manifest; import android.annotation.SuppressLint; import android.app.AlertDialog; import android.app.Dialog; import android.app.DownloadManager; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Environment; import android.os.IBinder; import android.os.PowerManager; import android.provider.Settings; import android.view.Menu; import android.view.MenuItem; import android.webkit.CookieManager; import android.webkit.URLUtil; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.RequiresApi; import androidx.appcompat.app.ActionBarDrawerToggle; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; import androidx.core.app.ActivityCompat; import androidx.core.view.GravityCompat; import androidx.drawerlayout.widget.DrawerLayout; import com.google.android.material.navigation.NavigationView; import java.util.Objects; public class MainActivity extends AppCompatActivity { private static final int WRITE_EXTERNAL_STORAGE_RC = 100; private WebView web; private String url, userAgent, contentDisposition, mimeType; private Dialog dialog; private TextView tv_close, tv_version; private static String versionName; private static final String NUMERO_TEL_RADIO = "+33375411456"; private static final String URL_PLATEFORM = "https://podcast.radiomercure.fr"; //"https://www.radiomercure.fr/?playerbar-pageinicial"; private static final String URL_STREAM = "https://live.radiomercure.fr/on-air/live"; private MediaPlayerService player; boolean serviceBound = false; static { versionName = BuildConfig.VERSION_NAME; } //Navigation private NavigationView navigationView; private DrawerLayout drawerLayout; private Toolbar toolbar; @SuppressLint({"SetJavaScriptEnabled", "WrongViewCast", "JavascriptInterface", "MissingInflatedId"}) @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //menu latéral navigationView = findViewById(R.id.navigation_drawer); navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { // Navigation drawer item switch (item.getItemId()) { case R.id.historique: web.loadUrl(URL_PLATEFORM + "/pages/historique-de-la-radio"); break; case R.id.live: Toast.makeText(MainActivity.this, R.string.toast_live, Toast.LENGTH_SHORT).show(); lectureAudio(URL_STREAM); break; case R.id.tel: Intent intent = new Intent(Intent.ACTION_DIAL); intent.setData(Uri.parse("tel:" + NUMERO_TEL_RADIO)); startActivity(intent); break; case R.id.mail: Intent form_mail = new Intent(MainActivity.this,MailActivity.class); startActivity(form_mail); break; case R.id.promouvoir: web.loadUrl(URL_PLATEFORM + "/pages/vos-evenements-a-la-radio"); break; case R.id.home: web.loadUrl(URL_PLATEFORM); break; case R.id.podmap: web.loadUrl(URL_PLATEFORM + "/map"); break; case R.id.share: String urlPage = web.getUrl(); Intent share = new Intent(Intent.ACTION_SEND); share.setType("text/plain"); share.putExtra(Intent.EXTRA_SUBJECT, "Partager page..."); share.putExtra(Intent.EXTRA_TEXT, urlPage); startActivity(Intent.createChooser(share, "Partager sur...")); break; case R.id.privacy: web.loadUrl(URL_PLATEFORM + "/pages/politique-de-confidentialite"); break; case R.id.about: dialog.show(); break; case R.id.exit: System.exit(0); break; } drawerLayout.closeDrawer(GravityCompat.START); return true; } }); //toolbar toolbar = findViewById(R.id.toolBar); drawerLayout = findViewById(R.id.drawer_layout); toolbar.setTitle("Radio Mercure"); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); drawerLayout.addDrawerListener(toggle); toggle.syncState(); //------Demande d'autorisation de désactiver l'optimisation de la batterie------// AlertDialog.Builder dialogOptBattery = new AlertDialog.Builder(this); dialogOptBattery.setMessage(R.string.dialog_battery_msg) .setTitle(R.string.dialog_battery_titre); dialogOptBattery.setPositiveButton(R.string.dialog_button_oui, (dialog12, id) -> { Intent intent = new Intent(); intent.setAction(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS); //intent.setData(Uri.parse("package:"+ getApplicationInfo().packageName)); startActivity(intent); }); dialogOptBattery.setNegativeButton(R.string.dialog_button_non, (dialog1, id) -> { // User cancelled the dialog Toast.makeText(this, R.string.battery_annul, Toast.LENGTH_SHORT).show(); }); AlertDialog alertDialog = dialogOptBattery.create(); PowerManager powerManager = (PowerManager) getApplicationContext().getSystemService(POWER_SERVICE); if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (!powerManager.isIgnoringBatteryOptimizations(getApplication().getPackageName())) { alertDialog.show(); } } //------------------------------------------------------------------------------------------------// //WebBiew affichage du site web = findViewById(R.id.wv); web.setWebViewClient(new WebViewClient()); web.getSettings().setUserAgentString("Mozilla/5.0 "+ getApplicationInfo().packageName); web.getSettings().setJavaScriptEnabled(true); web.getSettings().setAllowFileAccess(true); web.getSettings().setAllowFileAccessFromFileURLs(true); web.getSettings().setAllowUniversalAccessFromFileURLs(true); web.getSettings().setDatabaseEnabled(true); web.getSettings().setDomStorageEnabled(true); web.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT); // web.getSettings().setAppCachePath(web.getContext().getCacheDir().getAbsolutePath()); web.getSettings().setUseWideViewPort(true); web.getSettings().setLoadWithOverviewMode(true); web.getSettings().setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN); web.getSettings().setAllowFileAccessFromFileURLs(true); //Log.w("AGENT", web.getSettings().getUserAgentString()); //if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { // web.getSettings().setAllowFileAccessFromFileURLs(true); //} web.loadUrl(URL_PLATEFORM); web.setDownloadListener((url, userAgent, contentDisposition, mimeType, contentLength) -> { MainActivity.this.url = url; MainActivity.this.userAgent = userAgent; MainActivity.this.contentDisposition = contentDisposition; MainActivity.this.mimeType = mimeType; String permission = Manifest.permission.WRITE_EXTERNAL_STORAGE; if (ActivityCompat.checkSelfPermission(MainActivity.this, permission) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, WRITE_EXTERNAL_STORAGE_RC); } else { TelechargemntPodcast(); } }); createDialog(); // Ouverture depuis liens externes Intent appLinkIntent = getIntent(); String appLinkAction = appLinkIntent.getAction(); Uri appLinkData = appLinkIntent.getData(); handleIntent(getIntent()); } protected void onNewIntent(Intent intent) { super.onNewIntent(intent); handleIntent(intent); } private void handleIntent(Intent intent) { String appLinkAction = intent.getAction(); Uri appLinkData = intent.getData(); if (Intent.ACTION_VIEW.equals(appLinkAction) && appLinkData != null){ String recipeId = appLinkData.getLastPathSegment(); Uri appData = Uri.parse(URL_PLATEFORM).buildUpon() .appendPath(recipeId).build(); web.loadUrl(URL_PLATEFORM + appLinkData.getPath()); } } public boolean onCreateOptionsMenu(Menu menuOpt) { getMenuInflater().inflate(R.menu.option,menuOpt); return true; } public boolean onOptionsItemSelected(@NonNull MenuItem item) { int id = item.getItemId(); switch (id) { case R.id.clear_cache: web.clearCache(true); Toast.makeText(this, "Effacement du cache...", Toast.LENGTH_SHORT).show(); reStart(); return true; case R.id.share: String urlPage = web.getUrl(); Intent share = new Intent(Intent.ACTION_SEND); share.setType("text/plain"); share.putExtra(Intent.EXTRA_SUBJECT, "Partager page..."); share.putExtra(Intent.EXTRA_TEXT, urlPage); startActivity(Intent.createChooser(share, "Partager sur...")); break; case R.id.about: dialog.show(); break; case R.id.exit: System.exit(0); break; default: // } return super.onOptionsItemSelected(item); } private void createDialog() { dialog=new Dialog(this); dialog.setTitle(R.string.dialog_about_titre); dialog.setContentView(R.layout.about_dialog); tv_close= (TextView) dialog.findViewById(R.id.tv_close); tv_version = (TextView) dialog.findViewById(R.id.tv_version); tv_close.setOnClickListener(v -> dialog.dismiss()); tv_version.setText(getString(R.string.app_version) + versionName); } private void TelechargemntPodcast() { DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url)); request.setMimeType(mimeType); //------------------------COOKIE!!------------------------ String cookies = CookieManager.getInstance().getCookie(url); request.addRequestHeader("cookie", cookies); //------------------------COOKIE!!------------------------ request.addRequestHeader("User-Agent", userAgent); request.setDescription("Téléchargement..."); request.setTitle(URLUtil.guessFileName(url, contentDisposition, mimeType)); request.allowScanningByMediaScanner(); request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); String fileName = URLUtil.guessFileName(url, contentDisposition, mimeType); request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName); DownloadManager dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE); dm.enqueue(request); Toast.makeText(getApplicationContext(), "Téléchargement de " + URLUtil.guessFileName(url, contentDisposition, mimeType), Toast.LENGTH_LONG).show(); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == WRITE_EXTERNAL_STORAGE_RC) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { TelechargemntPodcast(); } } } @Override public void onBackPressed() { if (drawerLayout.isDrawerOpen(GravityCompat.START)) { drawerLayout.closeDrawer(GravityCompat.START); } else if (web.canGoBack()) { web.goBack(); if (Objects.equals(web.getOriginalUrl(), URL_PLATEFORM + "/")) { // Cliquez sur retour pour quitter Toast.makeText(this, R.string.toast_quitter, Toast.LENGTH_SHORT).show(); } } else { super.onBackPressed(); System.exit(0); } } private void reStart() { Intent intent = getIntent(); finish(); startActivity(intent); } //Binding this Client to the AudioPlayer Service private ServiceConnection serviceConnection = new ServiceConnection() { @RequiresApi(api = Build.VERSION_CODES.O) @Override public void onServiceConnected(ComponentName name, IBinder service) { // We've bound to LocalService, cast the IBinder and get LocalService instance MediaPlayerService.LocalBinder binder = (MediaPlayerService.LocalBinder) service; player = binder.getService(); serviceBound = true; } @Override public void onServiceDisconnected(ComponentName name) { serviceBound = false; } }; @RequiresApi(api = Build.VERSION_CODES.O) @SuppressLint("UseCompatLoadingForDrawables") private void lectureAudio(String chemin) { //Check is service is active if (!serviceBound) { Intent playerIntent = new Intent(this, MediaPlayerService.class); playerIntent.putExtra("media",chemin); startService(playerIntent); bindService(playerIntent, serviceConnection, Context.BIND_AUTO_CREATE); //Toast.makeText(this, "Lecture", Toast.LENGTH_SHORT).show(); } else { onDestroy(); reStart(); } } @Override public void onSaveInstanceState(Bundle savedInstanceState) { savedInstanceState.putBoolean("ServiceState", serviceBound); super.onSaveInstanceState(savedInstanceState); } @Override public void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); serviceBound = savedInstanceState.getBoolean("ServiceState"); } @Override protected void onDestroy() { super.onDestroy(); if (serviceBound) { unbindService(serviceConnection); //service is active player.stopSelf(); } } }