From f861d7c10edab469289cd4c7f06f5a2e56e2b04b Mon Sep 17 00:00:00 2001 From: dkanada Date: Sun, 25 Apr 2021 13:58:03 +0900 Subject: [PATCH] use dialogs instead of snackbars for permission errors --- .../activities/base/AbsBaseActivity.java | 65 +++++++++---------- .../base/AbsMusicPanelActivity.java | 22 ++++--- .../base/AbsMusicServiceActivity.java | 7 +- 3 files changed, 49 insertions(+), 45 deletions(-) diff --git a/app/src/main/java/com/dkanada/gramophone/activities/base/AbsBaseActivity.java b/app/src/main/java/com/dkanada/gramophone/activities/base/AbsBaseActivity.java index 43a1c1bf..279ef6bd 100644 --- a/app/src/main/java/com/dkanada/gramophone/activities/base/AbsBaseActivity.java +++ b/app/src/main/java/com/dkanada/gramophone/activities/base/AbsBaseActivity.java @@ -1,32 +1,31 @@ package com.dkanada.gramophone.activities.base; -import android.Manifest; +import android.app.AlertDialog; import android.content.pm.PackageManager; import android.os.Build; import android.os.Bundle; -import android.view.View; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.app.ActivityCompat; -import com.kabouzeid.appthemehelper.ThemeStore; import com.dkanada.gramophone.util.NavigationUtil; import com.dkanada.gramophone.R; -import com.google.android.material.snackbar.Snackbar; + +import java.util.List; public abstract class AbsBaseActivity extends AbsThemeActivity { private static final int PERMISSION_REQUEST = 100; - private boolean hadPermissions; - private String[] permissions; + private List permissions; + private boolean allowed; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); permissions = getPermissionsToRequest(); - hadPermissions = hasPermissions(); + allowed = hasPermissions(); } @Override @@ -41,26 +40,22 @@ public abstract class AbsBaseActivity extends AbsThemeActivity { @Override protected void onResume() { super.onResume(); - if (hasPermissions() != hadPermissions) { + if (hasPermissions() != allowed) { super.recreate(); } } - protected String[] getPermissionsToRequest() { + protected List getPermissionsToRequest() { return null; } - protected View getSnackBarContainer() { - return getWindow().getDecorView(); - } - protected String getPermissionDeniedMessage() { return getString(R.string.permissions_denied); } protected void requestPermissions() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && permissions != null) { - requestPermissions(permissions, PERMISSION_REQUEST); + requestPermissions(permissions.toArray(new String[0]), PERMISSION_REQUEST); } } @@ -77,28 +72,32 @@ public abstract class AbsBaseActivity extends AbsThemeActivity { } @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults); - if (requestCode == PERMISSION_REQUEST) { - for (int grantResult : grantResults) { - if (grantResult != PackageManager.PERMISSION_GRANTED) { - if (ActivityCompat.shouldShowRequestPermissionRationale(AbsBaseActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { - Snackbar.make(getSnackBarContainer(), getPermissionDeniedMessage(), Snackbar.LENGTH_SHORT) - .setAction(R.string.action_grant, view -> requestPermissions()) - .setActionTextColor(ThemeStore.accentColor(this)) - .show(); - } else { - Snackbar.make(getSnackBarContainer(), getPermissionDeniedMessage(), Snackbar.LENGTH_SHORT) - .setAction(R.string.action_settings, view -> NavigationUtil.openSettings(this)) - .setActionTextColor(ThemeStore.accentColor(this)) - .show(); - } + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] results) { + super.onRequestPermissionsResult(requestCode, permissions, results); - return; - } + if (requestCode != PERMISSION_REQUEST) { + return; + } + + for (int i = 0; i < permissions.length; i++) { + String permission = permissions[i]; + int result = results[i]; + + if (result == PackageManager.PERMISSION_GRANTED) { + continue; } - super.recreate(); + AlertDialog.Builder builder = new AlertDialog.Builder(this) + .setMessage(getPermissionDeniedMessage()) + .setTitle(R.string.permissions_denied) + .setNegativeButton(R.string.ignore, (dialog, which) -> { }) + .setPositiveButton(R.string.action_settings, (dialog, id) -> NavigationUtil.openSettings(this)); + + if (ActivityCompat.shouldShowRequestPermissionRationale(this, permission)) { + builder.setPositiveButton(R.string.action_grant, (dialog, id) -> requestPermissions()); + } + + builder.show(); } } } diff --git a/app/src/main/java/com/dkanada/gramophone/activities/base/AbsMusicPanelActivity.java b/app/src/main/java/com/dkanada/gramophone/activities/base/AbsMusicPanelActivity.java index 2e97984b..cf7b2259 100644 --- a/app/src/main/java/com/dkanada/gramophone/activities/base/AbsMusicPanelActivity.java +++ b/app/src/main/java/com/dkanada/gramophone/activities/base/AbsMusicPanelActivity.java @@ -249,6 +249,7 @@ public abstract class AbsMusicPanelActivity extends AbsMusicServiceActivity impl @Override public void setLightStatusbar(boolean enabled) { lightStatusbar = enabled; + if (getPanelState() == SlidingUpPanelLayout.PanelState.COLLAPSED) { super.setLightStatusbar(enabled); } @@ -257,8 +258,12 @@ public abstract class AbsMusicPanelActivity extends AbsMusicServiceActivity impl @Override public void setNavigationbarColor(int color) { this.navigationbarColor = color; + + if (navigationBarColorAnimator != null) { + navigationBarColorAnimator.cancel(); + } + if (getPanelState() == SlidingUpPanelLayout.PanelState.COLLAPSED) { - if (navigationBarColorAnimator != null) navigationBarColorAnimator.cancel(); super.setNavigationbarColor(color); } } @@ -266,9 +271,10 @@ public abstract class AbsMusicPanelActivity extends AbsMusicServiceActivity impl private void animateNavigationBarColor(int color) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { if (navigationBarColorAnimator != null) navigationBarColorAnimator.cancel(); + navigationBarColorAnimator = ValueAnimator - .ofArgb(getWindow().getNavigationBarColor(), color) - .setDuration(ViewUtil.PHONOGRAPH_ANIM_TIME); + .ofArgb(getWindow().getNavigationBarColor(), color) + .setDuration(ViewUtil.PHONOGRAPH_ANIM_TIME); navigationBarColorAnimator.setInterpolator(new PathInterpolator(0.4f, 0f, 1f, 1f)); navigationBarColorAnimator.addUpdateListener(animation -> AbsMusicPanelActivity.super.setNavigationbarColor((Integer) animation.getAnimatedValue())); @@ -279,19 +285,17 @@ public abstract class AbsMusicPanelActivity extends AbsMusicServiceActivity impl @Override protected void onDestroy() { super.onDestroy(); - if (navigationBarColorAnimator != null) navigationBarColorAnimator.cancel(); // just in case + if (navigationBarColorAnimator != null) { + navigationBarColorAnimator.cancel(); + } } @Override public void setTaskDescriptionColor(@ColorInt int color) { this.taskColor = color; + if (getPanelState() == null || getPanelState() == SlidingUpPanelLayout.PanelState.COLLAPSED) { super.setTaskDescriptionColor(color); } } - - @Override - protected View getSnackBarContainer() { - return findViewById(R.id.content_container); - } } diff --git a/app/src/main/java/com/dkanada/gramophone/activities/base/AbsMusicServiceActivity.java b/app/src/main/java/com/dkanada/gramophone/activities/base/AbsMusicServiceActivity.java index 81c752cd..5971eefc 100644 --- a/app/src/main/java/com/dkanada/gramophone/activities/base/AbsMusicServiceActivity.java +++ b/app/src/main/java/com/dkanada/gramophone/activities/base/AbsMusicServiceActivity.java @@ -19,6 +19,7 @@ import com.dkanada.gramophone.service.MusicService; import java.lang.ref.WeakReference; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; public abstract class AbsMusicServiceActivity extends AbsBaseActivity implements MusicServiceEventListener { @@ -32,6 +33,7 @@ public abstract class AbsMusicServiceActivity extends AbsBaseActivity implements @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + serviceToken = MusicPlayerRemote.bindToService(this, new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { @@ -151,7 +153,6 @@ public abstract class AbsMusicServiceActivity extends AbsBaseActivity implements } private static final class MusicStateReceiver extends BroadcastReceiver { - private final WeakReference reference; public MusicStateReceiver(final AbsMusicServiceActivity activity) { @@ -190,7 +191,7 @@ public abstract class AbsMusicServiceActivity extends AbsBaseActivity implements } @Override - protected String[] getPermissionsToRequest() { - return new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + protected List getPermissionsToRequest() { + return Arrays.asList(Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE); } }