Fixed and improved visual external storage permission related stuff.

This commit is contained in:
Karim Abou Zeid 2016-03-24 16:36:03 +01:00
commit 293600ba0d
5 changed files with 49 additions and 41 deletions

View file

@ -379,7 +379,7 @@ public class MusicPlayerRemote {
}
}
public static boolean isServiceAvailable() {
public static boolean isServiceConnected() {
return musicService != null;
}
}

View file

@ -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";

View file

@ -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;
}
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);
}
}
}

View file

@ -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() {

View file

@ -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;
}