From 781292e38b36648946921d0fadecbb3b2b7376cf Mon Sep 17 00:00:00 2001 From: Andrea Torlaschi Date: Wed, 24 Aug 2016 15:07:14 +0200 Subject: [PATCH] ImportKeys: Fix start of operation after request of permission, fixes for permissions, refactoring --- .../keychain/ui/ImportKeysFileFragment.java | 8 +---- .../keychain/ui/ImportKeysListFragment.java | 7 ++-- .../keychain/ui/util/PermissionsUtil.java | 35 +++++++++++++++---- 3 files changed, 31 insertions(+), 19 deletions(-) diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysFileFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysFileFragment.java index 170221df5..22223d6af 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysFileFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysFileFragment.java @@ -49,9 +49,6 @@ public class ImportKeysFileFragment extends Fragment { private Activity mActivity; private ImportKeysListener mCallback; - private View mBrowse; - private View mClipboardButton; - private Uri mCurrentUri; private static final int REQUEST_CODE_FILE = 0x00007003; @@ -131,17 +128,14 @@ public class ImportKeysFileFragment extends Fragment { if (resultCode == Activity.RESULT_OK && data != null && data.getData() != null) { mCurrentUri = data.getData(); - if (PermissionsUtil.checkAndRequestReadPermission(mActivity, mCurrentUri)) { + if (PermissionsUtil.checkAndRequestReadPermission(this, mCurrentUri)) { startImportingKeys(); } } break; } - default: super.onActivityResult(requestCode, resultCode, data); - - break; } } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java index ad6c41f2c..c20243a70 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java @@ -165,16 +165,13 @@ public class ImportKeysListFragment extends Fragment implements loadState(new CloudLoaderState(query, cloudSearchPrefs)); } - if (dataUri == null || PermissionsUtil.checkAndRequestReadPermission(mActivity, dataUri)) { - restartLoaders(); - } - mBinding.basic.importKeys.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { mListener.importKeys(mAdapter.getEntries()); } }); + mBinding.basic.listKeys.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { @@ -232,7 +229,7 @@ public class ImportKeysListFragment extends Fragment implements BytesLoaderState ls = (BytesLoaderState) mLoaderState; if (ls.mDataUri != null && - !PermissionsUtil.checkAndRequestReadPermission(mActivity, ls.mDataUri)) { + !PermissionsUtil.checkAndRequestReadPermission(this, ls.mDataUri)) { return; } } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/PermissionsUtil.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/PermissionsUtil.java index e39e73147..e2e965779 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/PermissionsUtil.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/PermissionsUtil.java @@ -1,11 +1,14 @@ package org.sufficientlysecure.keychain.ui.util; import android.Manifest; +import android.annotation.SuppressLint; import android.app.Activity; import android.content.ContentResolver; +import android.content.Context; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Build; +import android.support.v4.app.Fragment; import android.support.v4.content.ContextCompat; import android.widget.Toast; @@ -24,28 +27,45 @@ public class PermissionsUtil { *

* see https://commonsware.com/blog/2015/10/07/runtime-permissions-files-action-send.html */ + @SuppressLint("NewApi") // Api level is checked in checkReadPermission public static boolean checkAndRequestReadPermission(Activity activity, Uri uri) { + boolean result = checkReadPermission(activity, uri); + if (!result) { + activity.requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, + PERMISSION_READ_EXTERNAL_STORAGE); + } + return result; + } + + public static boolean checkAndRequestReadPermission(Fragment fragment, Uri uri) { + boolean result = checkReadPermission(fragment.getContext(), uri); + if (!result) { + fragment.requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, + PERMISSION_READ_EXTERNAL_STORAGE); + } + return result; + } + + private static boolean checkReadPermission(Context context, Uri uri) { if (!ContentResolver.SCHEME_FILE.equals(uri.getScheme())) { return true; } - // Additional check due to https://commonsware.com/blog/2015/11/09/you-cannot-hold-nonexistent-permissions.html + // Additional check due to: + // https://commonsware.com/blog/2015/11/09/you-cannot-hold-nonexistent-permissions.html if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { return true; } - if (ContextCompat.checkSelfPermission(activity, Manifest.permission.READ_EXTERNAL_STORAGE) + if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { return true; } - activity.requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, - PERMISSION_READ_EXTERNAL_STORAGE); - return false; } - public static boolean checkReadPermissionResult(Activity activity, + public static boolean checkReadPermissionResult(Context context, int requestCode, int[] grantResults) { @@ -59,7 +79,8 @@ public class PermissionsUtil { if (permissionWasGranted) { return true; } else { - Toast.makeText(activity, R.string.error_denied_storage_permission, Toast.LENGTH_LONG).show(); + Toast.makeText(context, R.string.error_denied_storage_permission, Toast.LENGTH_LONG) + .show(); return false; }