use dialogs instead of snackbars for permission errors

This commit is contained in:
dkanada 2021-04-25 13:58:03 +09:00
commit f861d7c10e
3 changed files with 50 additions and 46 deletions

View file

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

View file

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

View file

@ -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<AbsMusicServiceActivity> 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<String> getPermissionsToRequest() {
return Arrays.asList(Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
}