Moved permission logic to AbsBaseActivity.

This commit is contained in:
Karim Abou Zeid 2015-10-18 18:52:10 +02:00
commit 4d84e4d600
2 changed files with 57 additions and 61 deletions

View file

@ -1,29 +1,48 @@
package com.kabouzeid.gramophone.ui.activities.base; package com.kabouzeid.gramophone.ui.activities.base;
import android.Manifest;
import android.annotation.SuppressLint;
import android.content.pm.PackageManager;
import android.media.AudioManager; import android.media.AudioManager;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.widget.Toast;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.interfaces.KabViewsDisableAble; import com.kabouzeid.gramophone.interfaces.KabViewsDisableAble;
/** /**
* @author Karim Abou Zeid (kabouzeid) * @author Karim Abou Zeid (kabouzeid)
*/ */
public abstract class AbsBaseActivity extends AbsThemeActivity implements KabViewsDisableAble { public abstract class AbsBaseActivity extends AbsThemeActivity implements KabViewsDisableAble {
public static final int REQUEST_EXTERNAL_STORAGE_PERMISSION = 0;
private boolean areViewsEnabled; private boolean areViewsEnabled;
private boolean hasExternalStoragePermission;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setVolumeControlStream(AudioManager.STREAM_MUSIC); setVolumeControlStream(AudioManager.STREAM_MUSIC);
checkExternalStoragePermissions();
} }
@Override @Override
protected void onResume() { protected void onResume() {
super.onResume(); super.onResume();
enableViews(); enableViews();
// the handler is necessary to avoid "java.lang.RuntimeException: Performing pause of activity that is not resumed"
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
recreateIfPermissionsChanged();
}
}, 200);
} }
@Override @Override
@ -63,4 +82,42 @@ public abstract class AbsBaseActivity extends AbsThemeActivity implements KabVie
public boolean areViewsEnabled() { public boolean areViewsEnabled() {
return areViewsEnabled; return areViewsEnabled;
} }
protected void recreateIfPermissionsChanged() {
if (didPermissionsChanged()) {
recreate();
}
}
private boolean didPermissionsChanged() {
return hasExternalStoragePermission != hasExternalStoragePermission();
}
private void checkExternalStoragePermissions() {
hasExternalStoragePermission = hasExternalStoragePermission();
if (!hasExternalStoragePermission) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_EXTERNAL_STORAGE_PERMISSION);
}
}
}
@SuppressLint("NewApi")
private boolean hasExternalStoragePermission() {
return Build.VERSION.SDK_INT < Build.VERSION_CODES.M || checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_EXTERNAL_STORAGE_PERMISSION) {
for (int grantResult : grantResults) {
if (grantResult == PackageManager.PERMISSION_GRANTED) {
recreate();
return;
}
}
Toast.makeText(this, getResources().getString(R.string.permission_to_access_external_storage_denied), Toast.LENGTH_SHORT).show();
}
}
} }

View file

@ -1,22 +1,15 @@
package com.kabouzeid.gramophone.ui.activities.base; package com.kabouzeid.gramophone.ui.activities.base;
import android.Manifest;
import android.annotation.SuppressLint;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.content.ServiceConnection; import android.content.ServiceConnection;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder; import android.os.IBinder;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.widget.Toast;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote; import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.interfaces.MusicServiceEventListener; import com.kabouzeid.gramophone.interfaces.MusicServiceEventListener;
import com.kabouzeid.gramophone.service.MusicService; import com.kabouzeid.gramophone.service.MusicService;
@ -30,45 +23,19 @@ import java.util.ArrayList;
public abstract class AbsMusicServiceActivity extends AbsBaseActivity implements ServiceConnection, MusicServiceEventListener { public abstract class AbsMusicServiceActivity extends AbsBaseActivity implements ServiceConnection, MusicServiceEventListener {
public static final String TAG = AbsMusicServiceActivity.class.getSimpleName(); public static final String TAG = AbsMusicServiceActivity.class.getSimpleName();
public static final int REQUEST_EXTERNAL_STORAGE_PERMISSION = 0;
private final ArrayList<MusicServiceEventListener> mMusicServiceEventListeners = new ArrayList<>(); private final ArrayList<MusicServiceEventListener> mMusicServiceEventListeners = new ArrayList<>();
private MusicPlayerRemote.ServiceToken serviceToken; private MusicPlayerRemote.ServiceToken serviceToken;
private MusicStateReceiver musicStateReceiver; private MusicStateReceiver musicStateReceiver;
private boolean receiverRegistered; private boolean receiverRegistered;
private boolean hasExternalStoragePermission;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
checkExternalStoragePermissions();
serviceToken = MusicPlayerRemote.bindToService(this, this); serviceToken = MusicPlayerRemote.bindToService(this, this);
} }
@Override
protected void onResume() {
super.onResume();
// the handler is necessary to avoid "java.lang.RuntimeException: Performing pause of activity that is not resumed"
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
recreateIfPermissionsChanged();
}
}, 200);
}
protected void recreateIfPermissionsChanged() {
if (didPermissionsChanged()) {
recreate();
}
}
private boolean didPermissionsChanged() {
return hasExternalStoragePermission != hasExternalStoragePermission();
}
@Override @Override
public void onServiceConnected(ComponentName name, IBinder service) { public void onServiceConnected(ComponentName name, IBinder service) {
if (!receiverRegistered) { if (!receiverRegistered) {
@ -195,32 +162,4 @@ public abstract class AbsMusicServiceActivity extends AbsBaseActivity implements
} }
} }
} }
private void checkExternalStoragePermissions() {
hasExternalStoragePermission = hasExternalStoragePermission();
if (!hasExternalStoragePermission) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_EXTERNAL_STORAGE_PERMISSION);
}
}
}
@SuppressLint("NewApi")
private boolean hasExternalStoragePermission() {
return Build.VERSION.SDK_INT < Build.VERSION_CODES.M || checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_EXTERNAL_STORAGE_PERMISSION) {
for (int grantResult : grantResults) {
if (grantResult == PackageManager.PERMISSION_GRANTED) {
recreate();
return;
}
}
Toast.makeText(AbsMusicServiceActivity.this, getResources().getString(R.string.permission_to_access_external_storage_denied), Toast.LENGTH_SHORT).show();
}
}
} }