use dialogs instead of snackbars for permission errors
This commit is contained in:
parent
6540f58560
commit
f861d7c10e
3 changed files with 50 additions and 46 deletions
|
|
@ -1,32 +1,31 @@
|
||||||
package com.dkanada.gramophone.activities.base;
|
package com.dkanada.gramophone.activities.base;
|
||||||
|
|
||||||
import android.Manifest;
|
import android.app.AlertDialog;
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.view.View;
|
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.core.app.ActivityCompat;
|
import androidx.core.app.ActivityCompat;
|
||||||
|
|
||||||
import com.kabouzeid.appthemehelper.ThemeStore;
|
|
||||||
import com.dkanada.gramophone.util.NavigationUtil;
|
import com.dkanada.gramophone.util.NavigationUtil;
|
||||||
import com.dkanada.gramophone.R;
|
import com.dkanada.gramophone.R;
|
||||||
import com.google.android.material.snackbar.Snackbar;
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public abstract class AbsBaseActivity extends AbsThemeActivity {
|
public abstract class AbsBaseActivity extends AbsThemeActivity {
|
||||||
private static final int PERMISSION_REQUEST = 100;
|
private static final int PERMISSION_REQUEST = 100;
|
||||||
|
|
||||||
private boolean hadPermissions;
|
private List<String> permissions;
|
||||||
private String[] permissions;
|
private boolean allowed;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
permissions = getPermissionsToRequest();
|
permissions = getPermissionsToRequest();
|
||||||
hadPermissions = hasPermissions();
|
allowed = hasPermissions();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -41,26 +40,22 @@ public abstract class AbsBaseActivity extends AbsThemeActivity {
|
||||||
@Override
|
@Override
|
||||||
protected void onResume() {
|
protected void onResume() {
|
||||||
super.onResume();
|
super.onResume();
|
||||||
if (hasPermissions() != hadPermissions) {
|
if (hasPermissions() != allowed) {
|
||||||
super.recreate();
|
super.recreate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected String[] getPermissionsToRequest() {
|
protected List<String> getPermissionsToRequest() {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected View getSnackBarContainer() {
|
|
||||||
return getWindow().getDecorView();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected String getPermissionDeniedMessage() {
|
protected String getPermissionDeniedMessage() {
|
||||||
return getString(R.string.permissions_denied);
|
return getString(R.string.permissions_denied);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void requestPermissions() {
|
protected void requestPermissions() {
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && permissions != null) {
|
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
|
@Override
|
||||||
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
|
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] results) {
|
||||||
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
|
super.onRequestPermissionsResult(requestCode, permissions, results);
|
||||||
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();
|
|
||||||
}
|
|
||||||
|
|
||||||
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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -249,6 +249,7 @@ public abstract class AbsMusicPanelActivity extends AbsMusicServiceActivity impl
|
||||||
@Override
|
@Override
|
||||||
public void setLightStatusbar(boolean enabled) {
|
public void setLightStatusbar(boolean enabled) {
|
||||||
lightStatusbar = enabled;
|
lightStatusbar = enabled;
|
||||||
|
|
||||||
if (getPanelState() == SlidingUpPanelLayout.PanelState.COLLAPSED) {
|
if (getPanelState() == SlidingUpPanelLayout.PanelState.COLLAPSED) {
|
||||||
super.setLightStatusbar(enabled);
|
super.setLightStatusbar(enabled);
|
||||||
}
|
}
|
||||||
|
|
@ -257,8 +258,12 @@ public abstract class AbsMusicPanelActivity extends AbsMusicServiceActivity impl
|
||||||
@Override
|
@Override
|
||||||
public void setNavigationbarColor(int color) {
|
public void setNavigationbarColor(int color) {
|
||||||
this.navigationbarColor = color;
|
this.navigationbarColor = color;
|
||||||
|
|
||||||
|
if (navigationBarColorAnimator != null) {
|
||||||
|
navigationBarColorAnimator.cancel();
|
||||||
|
}
|
||||||
|
|
||||||
if (getPanelState() == SlidingUpPanelLayout.PanelState.COLLAPSED) {
|
if (getPanelState() == SlidingUpPanelLayout.PanelState.COLLAPSED) {
|
||||||
if (navigationBarColorAnimator != null) navigationBarColorAnimator.cancel();
|
|
||||||
super.setNavigationbarColor(color);
|
super.setNavigationbarColor(color);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -266,9 +271,10 @@ public abstract class AbsMusicPanelActivity extends AbsMusicServiceActivity impl
|
||||||
private void animateNavigationBarColor(int color) {
|
private void animateNavigationBarColor(int color) {
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
||||||
if (navigationBarColorAnimator != null) navigationBarColorAnimator.cancel();
|
if (navigationBarColorAnimator != null) navigationBarColorAnimator.cancel();
|
||||||
|
|
||||||
navigationBarColorAnimator = ValueAnimator
|
navigationBarColorAnimator = ValueAnimator
|
||||||
.ofArgb(getWindow().getNavigationBarColor(), color)
|
.ofArgb(getWindow().getNavigationBarColor(), color)
|
||||||
.setDuration(ViewUtil.PHONOGRAPH_ANIM_TIME);
|
.setDuration(ViewUtil.PHONOGRAPH_ANIM_TIME);
|
||||||
|
|
||||||
navigationBarColorAnimator.setInterpolator(new PathInterpolator(0.4f, 0f, 1f, 1f));
|
navigationBarColorAnimator.setInterpolator(new PathInterpolator(0.4f, 0f, 1f, 1f));
|
||||||
navigationBarColorAnimator.addUpdateListener(animation -> AbsMusicPanelActivity.super.setNavigationbarColor((Integer) animation.getAnimatedValue()));
|
navigationBarColorAnimator.addUpdateListener(animation -> AbsMusicPanelActivity.super.setNavigationbarColor((Integer) animation.getAnimatedValue()));
|
||||||
|
|
@ -279,19 +285,17 @@ public abstract class AbsMusicPanelActivity extends AbsMusicServiceActivity impl
|
||||||
@Override
|
@Override
|
||||||
protected void onDestroy() {
|
protected void onDestroy() {
|
||||||
super.onDestroy();
|
super.onDestroy();
|
||||||
if (navigationBarColorAnimator != null) navigationBarColorAnimator.cancel(); // just in case
|
if (navigationBarColorAnimator != null) {
|
||||||
|
navigationBarColorAnimator.cancel();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setTaskDescriptionColor(@ColorInt int color) {
|
public void setTaskDescriptionColor(@ColorInt int color) {
|
||||||
this.taskColor = color;
|
this.taskColor = color;
|
||||||
|
|
||||||
if (getPanelState() == null || getPanelState() == SlidingUpPanelLayout.PanelState.COLLAPSED) {
|
if (getPanelState() == null || getPanelState() == SlidingUpPanelLayout.PanelState.COLLAPSED) {
|
||||||
super.setTaskDescriptionColor(color);
|
super.setTaskDescriptionColor(color);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
protected View getSnackBarContainer() {
|
|
||||||
return findViewById(R.id.content_container);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@ import com.dkanada.gramophone.service.MusicService;
|
||||||
|
|
||||||
import java.lang.ref.WeakReference;
|
import java.lang.ref.WeakReference;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public abstract class AbsMusicServiceActivity extends AbsBaseActivity implements MusicServiceEventListener {
|
public abstract class AbsMusicServiceActivity extends AbsBaseActivity implements MusicServiceEventListener {
|
||||||
|
|
@ -32,6 +33,7 @@ public abstract class AbsMusicServiceActivity extends AbsBaseActivity implements
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
serviceToken = MusicPlayerRemote.bindToService(this, new ServiceConnection() {
|
serviceToken = MusicPlayerRemote.bindToService(this, new ServiceConnection() {
|
||||||
@Override
|
@Override
|
||||||
public void onServiceConnected(ComponentName name, IBinder service) {
|
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 static final class MusicStateReceiver extends BroadcastReceiver {
|
||||||
|
|
||||||
private final WeakReference<AbsMusicServiceActivity> reference;
|
private final WeakReference<AbsMusicServiceActivity> reference;
|
||||||
|
|
||||||
public MusicStateReceiver(final AbsMusicServiceActivity activity) {
|
public MusicStateReceiver(final AbsMusicServiceActivity activity) {
|
||||||
|
|
@ -190,7 +191,7 @@ public abstract class AbsMusicServiceActivity extends AbsBaseActivity implements
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected String[] getPermissionsToRequest() {
|
protected List<String> getPermissionsToRequest() {
|
||||||
return new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE};
|
return Arrays.asList(Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue