Add External permission with permissionDispatcher

This commit is contained in:
J-Jamet
2018-03-01 14:13:19 +01:00
parent 24eeff1d61
commit 60e2209281
4 changed files with 98 additions and 58 deletions

View File

@@ -62,6 +62,7 @@ android {
def supportVersion = "25.4.0" def supportVersion = "25.4.0"
def spongycastleVersion = "1.58.0.0" def spongycastleVersion = "1.58.0.0"
def permissionDispatcherVersion = "3.1.0"
dependencies { dependencies {
androidTestCompile "junit:junit:4.12" androidTestCompile "junit:junit:4.12"
@@ -72,7 +73,14 @@ dependencies {
compile "com.android.support:cardview-v7:$supportVersion" compile "com.android.support:cardview-v7:$supportVersion"
compile "com.madgag.spongycastle:core:$spongycastleVersion" compile "com.madgag.spongycastle:core:$spongycastleVersion"
compile "com.madgag.spongycastle:prov:$spongycastleVersion" compile "com.madgag.spongycastle:prov:$spongycastleVersion"
// Time
compile "joda-time:joda-time:2.9.9" compile "joda-time:joda-time:2.9.9"
compile "org.sufficientlysecure:html-textview:3.5" compile "org.sufficientlysecure:html-textview:3.5"
compile "com.nononsenseapps:filepicker:4.1.0" compile "com.nononsenseapps:filepicker:4.1.0"
// Permissions
compile ("com.github.hotchemi:permissionsdispatcher:$permissionDispatcherVersion") {
// if you don't use android.app.Fragment you can exclude support for them
exclude module: "support-v13"
}
annotationProcessor "com.github.hotchemi:permissionsdispatcher-processor:$permissionDispatcherVersion"
} }

View File

@@ -22,15 +22,14 @@ package com.keepassdroid.fileselect;
import android.Manifest; import android.Manifest;
import android.content.ActivityNotFoundException; import android.content.ActivityNotFoundException;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.os.Environment; import android.os.Environment;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
import android.support.v4.app.ActivityCompat; import android.support.v7.app.AlertDialog;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar; import android.support.v7.widget.Toolbar;
@@ -41,19 +40,19 @@ import android.view.View;
import android.widget.EditText; import android.widget.EditText;
import android.widget.Toast; import android.widget.Toast;
import com.keepassdroid.fragments.AssignMasterKeyDialogFragment;
import com.keepassdroid.fragments.CreateFileDialogFragment;
import com.keepassdroid.activities.GroupActivity; import com.keepassdroid.activities.GroupActivity;
import com.keepassdroid.password.PasswordActivity;
import com.keepassdroid.tasks.ProgressTask;
import com.keepassdroid.app.App; import com.keepassdroid.app.App;
import com.keepassdroid.compat.ContentResolverCompat; import com.keepassdroid.compat.ContentResolverCompat;
import com.keepassdroid.compat.StorageAF; import com.keepassdroid.compat.StorageAF;
import com.keepassdroid.database.edit.CreateDB; import com.keepassdroid.database.edit.CreateDB;
import com.keepassdroid.database.edit.FileOnFinish; import com.keepassdroid.database.edit.FileOnFinish;
import com.keepassdroid.database.exception.ContentFileNotFoundException; import com.keepassdroid.database.exception.ContentFileNotFoundException;
import com.keepassdroid.fragments.AssignMasterKeyDialogFragment;
import com.keepassdroid.fragments.CreateFileDialogFragment;
import com.keepassdroid.intents.Intents; import com.keepassdroid.intents.Intents;
import com.keepassdroid.password.PasswordActivity;
import com.keepassdroid.stylish.StylishActivity; import com.keepassdroid.stylish.StylishActivity;
import com.keepassdroid.tasks.ProgressTask;
import com.keepassdroid.utils.EmptyUtils; import com.keepassdroid.utils.EmptyUtils;
import com.keepassdroid.utils.Interaction; import com.keepassdroid.utils.Interaction;
import com.keepassdroid.utils.MenuUtil; import com.keepassdroid.utils.MenuUtil;
@@ -68,6 +67,14 @@ import java.io.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
import java.net.URLDecoder; import java.net.URLDecoder;
import permissions.dispatcher.NeedsPermission;
import permissions.dispatcher.OnNeverAskAgain;
import permissions.dispatcher.OnPermissionDenied;
import permissions.dispatcher.OnShowRationale;
import permissions.dispatcher.PermissionRequest;
import permissions.dispatcher.RuntimePermissions;
@RuntimePermissions
public class FileSelectActivity extends StylishActivity implements public class FileSelectActivity extends StylishActivity implements
CreateFileDialogFragment.DefinePathDialogListener , CreateFileDialogFragment.DefinePathDialogListener ,
AssignMasterKeyDialogFragment.AssignPasswordDialogListener, AssignMasterKeyDialogFragment.AssignPasswordDialogListener,
@@ -77,7 +84,6 @@ public class FileSelectActivity extends StylishActivity implements
private static final String TAG = "FileSelectActivity"; private static final String TAG = "FileSelectActivity";
private static final int MY_PERMISSIONS_REQUEST_EXTERNAL_STORAGE = 111;
private RecyclerView mListFiles; private RecyclerView mListFiles;
private FileSelectAdapter mAdapter; private FileSelectAdapter mAdapter;
private View fileListTitle; private View fileListTitle;
@@ -501,59 +507,37 @@ public class FileSelectActivity extends StylishActivity implements
mAdapter.notifyDataSetChanged(); mAdapter.notifyDataSetChanged();
} }
private void checkStoragePermission() { @NeedsPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
// Here, thisActivity is the current activity void checkStoragePermission() {}
if (ContextCompat.checkSelfPermission(FileSelectActivity.this,
Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation? @OnShowRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)
//if (ActivityCompat.shouldShowRequestPermissionRationale(FileSelectActivity.this, void showRationaleForExternalStorage(final PermissionRequest request) {
// Manifest.permission.WRITE_EXTERNAL_STORAGE)) { new AlertDialog.Builder(this)
.setMessage(R.string.permission_external_storage_rationale)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
request.proceed();
}
})
.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
request.cancel();
}
})
.show();
}
// Show an explanation to the user *asynchronously* -- don't block @OnPermissionDenied(Manifest.permission.WRITE_EXTERNAL_STORAGE)
// this thread waiting for the user's response! After the user void showDeniedForExternalStorage() {
// sees the explanation, try again to request the permission. Toast.makeText(this, R.string.permission_external_storage_denied, Toast.LENGTH_SHORT).show();
}
//} else { @OnNeverAskAgain(Manifest.permission.WRITE_EXTERNAL_STORAGE)
void showNeverAskForExternalStorage() {
// No explanation needed, we can request the permission. Toast.makeText(this, R.string.permission_external_storage_neverask, Toast.LENGTH_SHORT).show();
}
ActivityCompat.requestPermissions(FileSelectActivity.this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
MY_PERMISSIONS_REQUEST_EXTERNAL_STORAGE);
// MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
// app-defined int constant. The callback method gets the
// result of the request.
//}
}
}
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_EXTERNAL_STORAGE: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, yay! Do the
// contacts-related task you need to do.
} else {
// permission denied, boo! Disable the
// functionality that depends on this permission.
}
return;
}
// other 'case' lines to check for other
// permissions this app might request
}
}
@Override @Override
public boolean onCreateOptionsMenu(Menu menu) { public boolean onCreateOptionsMenu(Menu menu) {

View File

@@ -19,6 +19,7 @@
*/ */
package com.keepassdroid.password; package com.keepassdroid.password;
import android.Manifest;
import android.app.Activity; import android.app.Activity;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener; import android.content.DialogInterface.OnClickListener;
@@ -32,6 +33,7 @@ import android.os.Handler;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
import android.support.annotation.RequiresApi; import android.support.annotation.RequiresApi;
import android.support.v4.hardware.fingerprint.FingerprintManagerCompat; import android.support.v4.hardware.fingerprint.FingerprintManagerCompat;
import android.support.v7.app.AlertDialog;
import android.support.v7.widget.Toolbar; import android.support.v7.widget.Toolbar;
import android.text.Editable; import android.text.Editable;
import android.text.TextWatcher; import android.text.TextWatcher;
@@ -76,6 +78,14 @@ import static com.keepassdroid.fingerprint.FingerPrintHelper.Mode.NOT_CONFIGURED
import static com.keepassdroid.fingerprint.FingerPrintHelper.Mode.OPEN_MODE; import static com.keepassdroid.fingerprint.FingerPrintHelper.Mode.OPEN_MODE;
import static com.keepassdroid.fingerprint.FingerPrintHelper.Mode.STORE_MODE; import static com.keepassdroid.fingerprint.FingerPrintHelper.Mode.STORE_MODE;
import permissions.dispatcher.NeedsPermission;
import permissions.dispatcher.OnNeverAskAgain;
import permissions.dispatcher.OnPermissionDenied;
import permissions.dispatcher.OnShowRationale;
import permissions.dispatcher.PermissionRequest;
import permissions.dispatcher.RuntimePermissions;
@RuntimePermissions
public class PasswordActivity extends LockingActivity public class PasswordActivity extends LockingActivity
implements FingerPrintHelper.FingerPrintCallback, UriIntentInitTaskCallback { implements FingerPrintHelper.FingerPrintCallback, UriIntentInitTaskCallback {
@@ -261,6 +271,9 @@ public class PasswordActivity extends LockingActivity
// For check shutdown // For check shutdown
super.onResume(); super.onResume();
// Check the storage permission
checkStoragePermission();
new UriIntentInitTask(this, mRememberKeyfile) new UriIntentInitTask(this, mRememberKeyfile)
.execute(getIntent()); .execute(getIntent());
} }
@@ -843,4 +856,36 @@ public class PasswordActivity extends LockingActivity
} }
} }
} }
@NeedsPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
void checkStoragePermission() {}
@OnShowRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)
void showRationaleForExternalStorage(final PermissionRequest request) {
new AlertDialog.Builder(this)
.setMessage(R.string.permission_external_storage_rationale)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
request.proceed();
}
})
.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
request.cancel();
}
})
.show();
}
@OnPermissionDenied(Manifest.permission.WRITE_EXTERNAL_STORAGE)
void showDeniedForExternalStorage() {
Toast.makeText(this, R.string.permission_external_storage_denied, Toast.LENGTH_SHORT).show();
}
@OnNeverAskAgain(Manifest.permission.WRITE_EXTERNAL_STORAGE)
void showNeverAskForExternalStorage() {
Toast.makeText(this, R.string.permission_external_storage_neverask, Toast.LENGTH_SHORT).show();
}
} }

View File

@@ -253,6 +253,9 @@
<string name="full_file_path_enable_summary">View the full file path</string> <string name="full_file_path_enable_summary">View the full file path</string>
<string name="recycle_bin_title">Use Recycle Bin</string> <string name="recycle_bin_title">Use Recycle Bin</string>
<string name="recycle_bin_summary">Move a group or entry to the Recycle Bin before deleting</string> <string name="recycle_bin_summary">Move a group or entry to the Recycle Bin before deleting</string>
<string name="permission_external_storage_rationale">Application need external storage permission</string>
<string name="permission_external_storage_denied">Permission_external_storage_denied</string>
<string name="permission_external_storage_neverask">Permission_external_storage_neverask</string>
<string-array name="clipboard_timeout_options"> <string-array name="clipboard_timeout_options">
<item>5 seconds</item> <item>5 seconds</item>