From 2f137a36c0b951103a36acef10baf9ef0cf52108 Mon Sep 17 00:00:00 2001 From: Austin Hogan Date: Sat, 14 Sep 2019 16:44:42 -0400 Subject: [PATCH] Resolves #525 - 1.6.5 (2019-9-14) codename: ingus * Better Service Management * Listener warning notification for Android 8.0+ * Improve Exit Button * Fixed occasional blank music notification --- app/build.gradle | 4 +- app/src/main/assets/changelog.txt | 6 +++ .../com/adam/aslfms/PermissionsActivity.java | 7 ++- .../com/adam/aslfms/SettingsActivity.java | 49 +++++++++++++++---- .../service/ControllerReceiverService.java | 45 ++++++++--------- .../aslfms/service/ScrobblingService.java | 34 ++++++++++--- .../com/adam/aslfms/util/AppSettings.java | 11 +++++ .../main/java/com/adam/aslfms/util/Util.java | 15 +----- 8 files changed, 111 insertions(+), 60 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 726a8664..84896ab9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -6,8 +6,8 @@ android { applicationId "com.adam.aslfms" minSdkVersion 14 targetSdkVersion 26 - versionCode = 56 - versionName = "1.6.5" + versionCode = 57 + versionName = "1.6.6" testApplicationId "com.adam.aslfms.test" testInstrumentationRunner "android.test.InstrumentationTestRunner" diff --git a/app/src/main/assets/changelog.txt b/app/src/main/assets/changelog.txt index cb2b7c2e..41f338bc 100644 --- a/app/src/main/assets/changelog.txt +++ b/app/src/main/assets/changelog.txt @@ -2,6 +2,12 @@ Visit, https://github.com/simple-last-fm-scrobbler/sls For more details. +- 1.6.5 (2019-9-14) codename: ingus + * Better Service Management + * Listener warning notification for Android 8.0+ + * Improve Exit Button + * Fixed occasional blank music notification + - 1.6.5 (2019-9-13) codename: hingus * Better Service Management * Update Permissions UI diff --git a/app/src/main/java/com/adam/aslfms/PermissionsActivity.java b/app/src/main/java/com/adam/aslfms/PermissionsActivity.java index 9d188bfe..7daf204e 100644 --- a/app/src/main/java/com/adam/aslfms/PermissionsActivity.java +++ b/app/src/main/java/com/adam/aslfms/PermissionsActivity.java @@ -40,7 +40,6 @@ import android.widget.TextView; import com.adam.aslfms.util.AppSettings; -import com.adam.aslfms.util.InternalTrackTransmitter; import com.adam.aslfms.util.MyContextWrapper; import com.adam.aslfms.util.Util; /** @@ -178,10 +177,10 @@ public void onClick(DialogInterface dialog, int which) { } }; AlertDialog.Builder builder = new AlertDialog.Builder(this); - String message = ctx.getResources().getString(R.string.are_you_sure); + String message = ctx.getResources().getString(R.string.warning) + "! " + ctx.getResources().getString(R.string.are_you_sure); if (Build.VERSION_CODES.O <= Build.VERSION.SDK_INT && !Util.checkNotificationListenerPermission(ctx)){ - message += " " + ctx.getResources().getString(R.string.warning_will_not_scrobble); - message += "/" + ctx.getResources().getString(R.string.permission_notification_listener); + message += " - " + ctx.getResources().getString(R.string.warning_will_not_scrobble); + message += " - " + ctx.getResources().getString(R.string.permission_notification_listener); } builder.setMessage(message).setPositiveButton(R.string.yes, dialogClickListener) .setNegativeButton(R.string.no, dialogClickListener).show(); diff --git a/app/src/main/java/com/adam/aslfms/SettingsActivity.java b/app/src/main/java/com/adam/aslfms/SettingsActivity.java index 096eee81..f3bd5af9 100644 --- a/app/src/main/java/com/adam/aslfms/SettingsActivity.java +++ b/app/src/main/java/com/adam/aslfms/SettingsActivity.java @@ -23,20 +23,23 @@ import android.content.BroadcastReceiver; import android.content.Context; +import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.content.res.Resources; import android.database.SQLException; +import android.os.Build; import android.os.Bundle; import android.preference.Preference; import android.preference.PreferenceScreen; import android.support.design.widget.Snackbar; +import android.support.v4.app.ActivityCompat; +import android.support.v7.app.AlertDialog; import android.util.Log; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; -import com.adam.aslfms.service.NetApp; import com.adam.aslfms.service.ScrobblingService; import com.adam.aslfms.util.AppSettings; import com.adam.aslfms.util.MyContextWrapper; @@ -207,14 +210,7 @@ public boolean onOptionsItemSelected(MenuItem item) { new WhatsNewDialog(this).show(); return true; case R.id.menu_exit: - boolean currentActiveState = settings.isActiveAppEnabled(Util.checkPower(this)); - settings.setActiveAppEnabled(Util.checkPower(this),false); - Util.runServices(this); - Util.stopAllServices(this); - settings.setActiveAppEnabled(Util.checkPower(this),currentActiveState); - finish(); - android.os.Process.killProcess(android.os.Process.myPid()); - System.exit(1); + handleAppExit(); return true; } return super.onOptionsItemSelected(item); @@ -233,4 +229,39 @@ private void checkNetwork() { Snackbar.make(getListView(), getString(R.string.limited_network), Snackbar.LENGTH_SHORT).show(); } } + + private void handleAppExit(){ + DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + switch (which) { + case DialogInterface.BUTTON_POSITIVE: + boolean currentActiveState = settings.isActiveAppEnabled(Util.checkPower(mCtx)); + settings.setActiveAppEnabled(Util.checkPower(mCtx),false); + settings.setTempExitAppEnabled(Util.checkPower(mCtx),true); + Util.runServices(mCtx); + Util.stopAllServices(mCtx); + settings.setActiveAppEnabled(Util.checkPower(mCtx),currentActiveState); + settings.setTempExitAppEnabled(Util.checkPower(mCtx), false); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + finishAndRemoveTask(); + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { + SettingsActivity.this.finishAffinity(); + } + ActivityCompat.finishAffinity(SettingsActivity.this ); + SettingsActivity.this.finish(); + android.os.Process.killProcess(android.os.Process.myPid()); + System.exit(1); + break; + case DialogInterface.BUTTON_NEGATIVE: + break; + } + } + }; + AlertDialog.Builder builder = new AlertDialog.Builder(this); + String message = mCtx.getResources().getString(R.string.warning) + "! " + mCtx.getResources().getString(R.string.are_you_sure) + " - " + mCtx.getResources().getString(R.string.warning_will_not_scrobble); + builder.setMessage(message).setPositiveButton(R.string.yes, dialogClickListener) + .setNegativeButton(R.string.no, dialogClickListener).show(); + } } diff --git a/app/src/main/java/com/adam/aslfms/service/ControllerReceiverService.java b/app/src/main/java/com/adam/aslfms/service/ControllerReceiverService.java index 9fee87f2..22dcb4e6 100644 --- a/app/src/main/java/com/adam/aslfms/service/ControllerReceiverService.java +++ b/app/src/main/java/com/adam/aslfms/service/ControllerReceiverService.java @@ -51,6 +51,8 @@ public class ControllerReceiverService extends NotificationListenerService { private static final String TAG = "ControllerReceiverSrvc"; private ControllerReceiverSession mControllerReceiverSession; + AppSettings settings = null; + Bundle extras = null; @Override public IBinder onBind(Intent intent) { @@ -60,19 +62,12 @@ public IBinder onBind(Intent intent) { @Override public void onCreate() { super.onCreate(); - if (!Util.checkNotificationListenerPermission(this)){ - return; - } + Log.d(TAG,"created"); - AppSettings settings = new AppSettings(this); + settings = new AppSettings(this); - Bundle extras = new Bundle(); - extras.putString("track", ""); - extras.putString("artist", ""); - extras.putString("album", ""); - extras.putString("app_name", ""); this.startForeground(NotificationCreator.FOREGROUND_ID, NotificationCreator.prepareNotification(extras, this)); - init(); + init(extras); if (!settings.isActiveAppEnabled(Util.checkPower(this))) { this.stopForeground(true); } @@ -80,20 +75,13 @@ public void onCreate() { @Override public int onStartCommand(Intent intent, int flags, int startId) { - if (!Util.checkNotificationListenerPermission(this)){ - return Service.START_NOT_STICKY; - } Log.d(TAG,"started"); - AppSettings settings = new AppSettings(this); - Bundle extras = new Bundle(); - extras.putString("track", ""); - extras.putString("artist", ""); - extras.putString("album", ""); - extras.putString("app_name", ""); - this.startForeground(NotificationCreator.FOREGROUND_ID, NotificationCreator.prepareNotification(extras, this)); - init(); - if (!settings.isActiveAppEnabled(Util.checkPower(this))) { - this.stopForeground(true); + settings = new AppSettings(this); + if (intent != null) { + extras = intent.getExtras(); + } + init(extras); + if (settings.isTempExitAppEnabled(Util.checkPower(this))) { return Service.START_NOT_STICKY; } return Service.START_STICKY; @@ -117,7 +105,7 @@ public void onDestroy() { @Override public void onListenerConnected() { super.onListenerConnected(); - init(); + init(extras); } @Override @@ -127,7 +115,14 @@ public void onListenerDisconnected() { requestRebind(new ComponentName(getApplicationContext(), ControllerReceiverService.class)); } - public void init(){ + public void init(Bundle extras){ + // foreground + if (settings.isActiveAppEnabled(Util.checkPower(this))) { + this.startForeground(NotificationCreator.FOREGROUND_ID, NotificationCreator.prepareNotification(extras, this)); + } else { + this.stopForeground(true); + } + // media manager MediaSessionManager mediaSessionManager = null; try { Log.d(TAG,"Detecting initial media session"); diff --git a/app/src/main/java/com/adam/aslfms/service/ScrobblingService.java b/app/src/main/java/com/adam/aslfms/service/ScrobblingService.java index cadb57cb..18567246 100644 --- a/app/src/main/java/com/adam/aslfms/service/ScrobblingService.java +++ b/app/src/main/java/com/adam/aslfms/service/ScrobblingService.java @@ -30,6 +30,7 @@ import android.util.Log; import android.widget.Toast; +import com.adam.aslfms.PermissionsActivity; import com.adam.aslfms.R; import com.adam.aslfms.util.AppSettings; import com.adam.aslfms.util.InternalTrackTransmitter; @@ -98,8 +99,7 @@ public int onStartCommand(Intent i, int flags, int startId) { foreGroundService(); - if (!settings.isActiveAppEnabled(Util.checkPower(mCtx))) { - this.stopForeground(true); + if (settings.isTempExitAppEnabled(Util.checkPower(mCtx))) { return Service.START_NOT_STICKY; } return Service.START_STICKY; @@ -112,8 +112,25 @@ private void handleCommand(Intent i, int startId) { } String action = i.getAction(); Bundle extras = i.getExtras(); - if (action == null || action.equals(ACTION_START_SCROBBLER_SERVICE )) { - // + if (action == null){ + // weird null action + } else if (action.equals(ACTION_START_SCROBBLER_SERVICE )) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && !Util.isMyServiceRunning(this, ControllerReceiverService.class)) { + if (!Util.checkNotificationListenerPermission(this)){ + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + Util.myNotify(this, this.getResources().getString(R.string.warning), this.getResources().getString(R.string.permission_notification_listener_notice), 72135, PermissionsActivity.class); + } + } else { + Intent ii = new Intent(this, ControllerReceiverService.class); + ii.putExtras(bundleTrack()); + Log.d(TAG, "(re)starting controllerreceiver"); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + this.startForegroundService(ii); + } else { + this.startService(ii); + } + } + } } else if (action.equals(ACTION_CLEARCREDS)) { if (extras.getBoolean("clearall", false)) { mNetManager.launchClearAllCreds(); @@ -457,7 +474,7 @@ private void scrobble(boolean playbackComplete) { } } - private void foreGroundService(){ + private Bundle bundleTrack(){ Bundle extras = new Bundle(); if (mCurrentTrack != null) { extras.putString("track", mCurrentTrack.getTrack()); @@ -470,9 +487,14 @@ private void foreGroundService(){ extras.putString("album", ""); extras.putString("app_name", ""); } - this.startForeground(NotificationCreator.FOREGROUND_ID, NotificationCreator.prepareNotification(extras, mCtx)); + return extras; + } + + private void foreGroundService(){ if (!settings.isActiveAppEnabled(Util.checkPower(mCtx))) { this.stopForeground(true); + } else { + this.startForeground(NotificationCreator.FOREGROUND_ID, NotificationCreator.prepareNotification(bundleTrack(), mCtx)); } } } \ No newline at end of file diff --git a/app/src/main/java/com/adam/aslfms/util/AppSettings.java b/app/src/main/java/com/adam/aslfms/util/AppSettings.java index 0f1f850b..c20e32da 100644 --- a/app/src/main/java/com/adam/aslfms/util/AppSettings.java +++ b/app/src/main/java/com/adam/aslfms/util/AppSettings.java @@ -69,6 +69,7 @@ public class AppSettings { private static final String KEY_SESSION = "sessionKey"; private static final String KEY_SCROBBLES = "totalScrobbles"; + private static final String KEY_TEMP_APP_ENABLE = "enable_temp_app"; private static final String KEY_ACTIVE_APP_ENABLE = "enable_active_app"; private static final String KEY_SCROBBLING_ENABLE = "enable_scrobbling"; private static final String KEY_NOWPLAYING_ENABLE = "enable_nowplaying"; @@ -500,6 +501,16 @@ && getAdvancedOptions_raw(PowerOptions.PLUGGED_IN) == AdvancedOptions.SAME_AS_BA getAdvancedOptions(pow).isActiveAppEnabled()); } + public void setTempExitAppEnabled(PowerOptions pow, boolean b) { + Editor e = prefs.edit(); + e.putBoolean(KEY_TEMP_APP_ENABLE + pow.getSettingsPath(), b); + e.commit(); + } + + public boolean isTempExitAppEnabled(PowerOptions pow) { + return prefs.getBoolean(KEY_TEMP_APP_ENABLE + pow.getSettingsPath(), false); + } + public void setScrobblingEnabled(PowerOptions pow, boolean b) { Editor e = prefs.edit(); e.putBoolean(KEY_SCROBBLING_ENABLE + pow.getSettingsPath(), b); diff --git a/app/src/main/java/com/adam/aslfms/util/Util.java b/app/src/main/java/com/adam/aslfms/util/Util.java index 8980dc68..22636a59 100644 --- a/app/src/main/java/com/adam/aslfms/util/Util.java +++ b/app/src/main/java/com/adam/aslfms/util/Util.java @@ -598,7 +598,7 @@ public static void stopAllServices(Context context) { } - private static boolean isMyServiceRunning(Context context, Class serviceClass) { + public static boolean isMyServiceRunning(Context context, Class serviceClass) { ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { if (serviceClass.getName().equals(service.service.getClassName())) { @@ -609,19 +609,6 @@ private static boolean isMyServiceRunning(Context context, Class serviceClass) { } public static void runServices(Context context) { - // Start listening service if applicable - AppSettings appSettings = new AppSettings(context); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && Util.checkNotificationListenerPermission(context)) { - if (!isMyServiceRunning(context, ControllerReceiverService.class)) { - Log.d(TAG, "(re)starting controllerreceiver"); - Intent ii = new Intent(context, ControllerReceiverService.class); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - context.startForegroundService(ii); - } else { - context.startService(ii); - } - } - } if (!isMyServiceRunning(context, ScrobblingService.class)) { Log.d(TAG, "(re)starting scrobbleservice"); Intent i = new Intent(context, ScrobblingService.class);