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.view.View; 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.AppCompatActivity; import androidx.core.app.ActivityCompat; import com.google.android.material.floatingactionbutton.FloatingActionButton; import com.google.android.material.snackbar.Snackbar; 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; private TextView 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 MediaPlayerService player; boolean serviceBound = false; private FloatingActionButton fbtn_live; static { versionName = BuildConfig.VERSION_NAME; } @SuppressLint({"SetJavaScriptEnabled", "WrongViewCast", "JavascriptInterface"}) @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); fbtn_live = (FloatingActionButton) findViewById(R.id.fbtn_live); fbtn_live.setOnClickListener(new View.OnClickListener() { @RequiresApi(api = Build.VERSION_CODES.O) @Override public void onClick(View v) { Snackbar.make(v, "Vous écoutez Radio Mercure en direct", Snackbar.LENGTH_LONG) .setAction("Action", null).show(); lectureAudio("https://live.radiomercure.fr/on-air/live"); fbtn_live.setImageResource(android.R.drawable.ic_media_pause); } }); //------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, "Annulation par l'utilisateur", 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().setAppCacheEnabled(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); //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(); } private void createDialog() { dialog=new Dialog(this); dialog.setTitle("A Propos de l'Application"); 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("RADIO MERCURE - 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 boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.option,menu); return super.onCreateOptionsMenu(menu); } @RequiresApi(api = Build.VERSION_CODES.O) @SuppressLint("UseCompatLoadingForDrawables") @Override public boolean onOptionsItemSelected(@NonNull MenuItem item) { int id = item.getItemId(); switch (id){ case R.id.refresh: web.clearCache(true); reStart(); //web.reload(); //Toast.makeText(this, "Rechargement...", Toast.LENGTH_SHORT).show(); return true; case R.id.exit: System.exit(0); return true; case R.id.about: dialog.show(); return true; case R.id.tel: Intent intent = new Intent(Intent.ACTION_DIAL); intent.setData(Uri.parse("tel:" + NUMERO_TEL_RADIO)); startActivity(intent); return true; //case R.id.live: //lectureAudio("https://live.radiomercure.fr/on-air/live"); //Toast.makeText(this, "Vous écoutez Radio Mercure en direct", Toast.LENGTH_SHORT).show(); //return true; default: return super.onOptionsItemSelected(item); } } @Override public void onBackPressed() { if (web.canGoBack()) { web.goBack(); } 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(); } } }