From 293600ba0db1ebac6ab661424503275117468e81 Mon Sep 17 00:00:00 2001 From: Karim Abou Zeid Date: Thu, 24 Mar 2016 16:36:03 +0100 Subject: [PATCH] Fixed and improved visual external storage permission related stuff. --- .../gramophone/helper/MusicPlayerRemote.java | 2 +- .../gramophone/service/MusicService.java | 28 +++++------ .../ui/activities/base/AbsBaseActivity.java | 47 +++++++++---------- .../base/AbsMusicServiceActivity.java | 8 ++++ .../base/AbsSlidingMusicPanelActivity.java | 5 ++ 5 files changed, 49 insertions(+), 41 deletions(-) diff --git a/app/src/main/java/com/kabouzeid/gramophone/helper/MusicPlayerRemote.java b/app/src/main/java/com/kabouzeid/gramophone/helper/MusicPlayerRemote.java index 06d2512e..aff789d2 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/helper/MusicPlayerRemote.java +++ b/app/src/main/java/com/kabouzeid/gramophone/helper/MusicPlayerRemote.java @@ -379,7 +379,7 @@ public class MusicPlayerRemote { } } - public static boolean isServiceAvailable() { + public static boolean isServiceConnected() { return musicService != null; } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java b/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java index 4c820e55..5e158656 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java +++ b/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java @@ -66,25 +66,25 @@ import hugo.weaving.DebugLog; public class MusicService extends Service implements SharedPreferences.OnSharedPreferenceChangeListener, Playback.PlaybackCallbacks { public static final String TAG = MusicService.class.getSimpleName(); - public static final String PHONOGRAPH_PACKAGE_NAME = "com.kabouzeid.gramophone"; + public static final String PHONOGRAPH_PACKAGE_NAME = "com.kabouzeid.gramophone" + ".temp_sticky_intent_fix"; // TODO remove ".temp_sticky_intent_fix" in a future update. public static final String MUSIC_PACKAGE_NAME = "com.android.music"; - public static final String ACTION_TOGGLE_PAUSE = "com.kabouzeid.gramophone.togglepause"; - public static final String ACTION_PLAY = "com.kabouzeid.gramophone.play"; - public static final String ACTION_PAUSE = "com.kabouzeid.gramophone.pause"; - public static final String ACTION_STOP = "com.kabouzeid.gramophone.stop"; - public static final String ACTION_SKIP = "com.kabouzeid.gramophone.skip"; - public static final String ACTION_REWIND = "com.kabouzeid.gramophone.rewind"; - public static final String ACTION_QUIT = "com.kabouzeid.gramophone.quitservice"; + public static final String ACTION_TOGGLE_PAUSE = PHONOGRAPH_PACKAGE_NAME + ".togglepause"; + public static final String ACTION_PLAY = PHONOGRAPH_PACKAGE_NAME + ".play"; + public static final String ACTION_PAUSE = PHONOGRAPH_PACKAGE_NAME + ".pause"; + public static final String ACTION_STOP = PHONOGRAPH_PACKAGE_NAME + ".stop"; + public static final String ACTION_SKIP = PHONOGRAPH_PACKAGE_NAME + ".skip"; + public static final String ACTION_REWIND = PHONOGRAPH_PACKAGE_NAME + ".rewind"; + public static final String ACTION_QUIT = PHONOGRAPH_PACKAGE_NAME + ".quitservice"; // do not change these three strings as it will break support with other apps (e.g. last.fm scrobbling) - public static final String META_CHANGED = "com.kabouzeid.gramophone.metachanged"; - public static final String QUEUE_CHANGED = "com.kabouzeid.gramophone.queuechanged"; - public static final String PLAY_STATE_CHANGED = "com.kabouzeid.gramophone.playstatechanged"; + public static final String META_CHANGED = PHONOGRAPH_PACKAGE_NAME + ".metachanged"; + public static final String QUEUE_CHANGED = PHONOGRAPH_PACKAGE_NAME + ".queuechanged"; + public static final String PLAY_STATE_CHANGED = PHONOGRAPH_PACKAGE_NAME + ".playstatechanged"; - public static final String REPEAT_MODE_CHANGED = "com.kabouzeid.gramophone.repeatmodechanged"; - public static final String SHUFFLE_MODE_CHANGED = "com.kabouzeid.gramophone.shufflemodechanged"; - public static final String MEDIA_STORE_CHANGED = "com.kabouzeid.gramophone.mediastorechanged"; + public static final String REPEAT_MODE_CHANGED = PHONOGRAPH_PACKAGE_NAME + ".repeatmodechanged"; + public static final String SHUFFLE_MODE_CHANGED = PHONOGRAPH_PACKAGE_NAME + ".shufflemodechanged"; + public static final String MEDIA_STORE_CHANGED = PHONOGRAPH_PACKAGE_NAME + ".mediastorechanged"; public static final String SAVED_POSITION = "POSITION"; public static final String SAVED_POSITION_IN_TRACK = "POSITION_IN_TRACK"; diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsBaseActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsBaseActivity.java index 31ca3a85..c122e294 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsBaseActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsBaseActivity.java @@ -24,10 +24,7 @@ import com.kabouzeid.gramophone.R; public abstract class AbsBaseActivity extends AbsThemeActivity { public static final int PERMISSION_REQUEST = 100; - private boolean areViewsEnabled; - private boolean recreating; - - private boolean createdWithPermissionsGranted; + private boolean hadPermissions; private String[] permissions; private String permissionDeniedMessage; @@ -37,7 +34,7 @@ public abstract class AbsBaseActivity extends AbsThemeActivity { setVolumeControlStream(AudioManager.STREAM_MUSIC); permissions = getPermissionsToRequest(); - createdWithPermissionsGranted = hasPermissions(); + hadPermissions = hasPermissions(); setPermissionDeniedMessage(null); } @@ -53,24 +50,17 @@ public abstract class AbsBaseActivity extends AbsThemeActivity { @Override protected void onResume() { super.onResume(); - - if (hasPermissions() != createdWithPermissionsGranted) { + final boolean hasPermissions = hasPermissions(); + if (hasPermissions != hadPermissions) { + hadPermissions = hasPermissions; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - onPermissionsChanged(); + onHasPermissionsChanged(hasPermissions); } } } - protected void onPermissionsChanged() { - postRecreate(); - } - - @Override - public void postRecreate() { - if (!recreating) { - recreating = true; - super.postRecreate(); - } + protected void onHasPermissionsChanged(boolean hasPermissions) { + // implemented by sub classes } @Override @@ -91,12 +81,16 @@ public abstract class AbsBaseActivity extends AbsThemeActivity { return null; } + protected View getSnackBarContainer() { + return getWindow().getDecorView(); + } + protected void setPermissionDeniedMessage(String message) { - if (message == null) { - permissionDeniedMessage = getString(R.string.permissions_denied); - } else { - permissionDeniedMessage = message; - } + permissionDeniedMessage = message; + } + + private String getPermissionDeniedMessage() { + return permissionDeniedMessage == null ? getString(R.string.permissions_denied) : permissionDeniedMessage; } protected void requestPermissions() { @@ -124,7 +118,7 @@ public abstract class AbsBaseActivity extends AbsThemeActivity { if (grantResult != PackageManager.PERMISSION_GRANTED) { if (ActivityCompat.shouldShowRequestPermissionRationale(AbsBaseActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { //User has deny from permission dialog - Snackbar.make(getWindow().getDecorView(), permissionDeniedMessage, + Snackbar.make(getSnackBarContainer(), getPermissionDeniedMessage(), Snackbar.LENGTH_INDEFINITE) .setAction(R.string.action_grant, new View.OnClickListener() { @Override @@ -136,7 +130,7 @@ public abstract class AbsBaseActivity extends AbsThemeActivity { .show(); } else { // User has deny permission and checked never show permission dialog so you can redirect to Application settings page - Snackbar.make(getWindow().getDecorView(), permissionDeniedMessage, + Snackbar.make(getSnackBarContainer(), getPermissionDeniedMessage(), Snackbar.LENGTH_INDEFINITE) .setAction(R.string.action_settings, new View.OnClickListener() { @Override @@ -154,7 +148,8 @@ public abstract class AbsBaseActivity extends AbsThemeActivity { return; } } - onPermissionsChanged(); + hadPermissions = true; + onHasPermissionsChanged(true); } } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsMusicServiceActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsMusicServiceActivity.java index ab696b28..0183a174 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsMusicServiceActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsMusicServiceActivity.java @@ -208,6 +208,14 @@ public abstract class AbsMusicServiceActivity extends AbsBaseActivity implements } } + @Override + protected void onHasPermissionsChanged(boolean hasPermissions) { + super.onHasPermissionsChanged(hasPermissions); + Intent intent = new Intent(MusicService.MEDIA_STORE_CHANGED); + intent.putExtra("from_permissions_changed", true); // just in case we need to know this at some point + sendBroadcast(intent); + } + @Nullable @Override protected String[] getPermissionsToRequest() { diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsSlidingMusicPanelActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsSlidingMusicPanelActivity.java index 40450a8f..07915c8e 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsSlidingMusicPanelActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsSlidingMusicPanelActivity.java @@ -220,6 +220,11 @@ public abstract class AbsSlidingMusicPanelActivity extends AbsMusicServiceActivi } } + @Override + protected View getSnackBarContainer() { + return findViewById(R.id.content_container); + } + public SlidingUpPanelLayout getSlidingUpPanelLayout() { return slidingUpPanelLayout; }