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 d59ae5ce2..33d501a4e 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysFileFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysFileFragment.java @@ -17,33 +17,28 @@ package org.sufficientlysecure.keychain.ui; -import android.Manifest; import android.app.Activity; -import android.content.ContentResolver; import android.content.Intent; -import android.content.pm.PackageManager; import android.net.Uri; -import android.os.Build; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.app.Fragment; -import android.support.v4.content.ContextCompat; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; -import android.widget.Toast; import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.compatibility.ClipboardReflection; -import org.sufficientlysecure.keychain.keyimport.processing.ImportKeysListener; import org.sufficientlysecure.keychain.keyimport.processing.BytesLoaderState; +import org.sufficientlysecure.keychain.keyimport.processing.ImportKeysListener; import org.sufficientlysecure.keychain.pgp.PgpHelper; import org.sufficientlysecure.keychain.ui.util.Notify; import org.sufficientlysecure.keychain.ui.util.Notify.Style; +import org.sufficientlysecure.keychain.ui.util.PermissionsUtil; import org.sufficientlysecure.keychain.util.FileHelper; import org.sufficientlysecure.keychain.util.Log; @@ -60,7 +55,6 @@ public class ImportKeysFileFragment extends Fragment { private Uri mCurrentUri; private static final int REQUEST_CODE_FILE = 0x00007003; - private static final int REQUEST_PERMISSION_READ_EXTERNAL_STORAGE = 12; /** * Creates new instance of this fragment @@ -154,7 +148,7 @@ public class ImportKeysFileFragment extends Fragment { if (resultCode == Activity.RESULT_OK && data != null && data.getData() != null) { mCurrentUri = data.getData(); - if (checkAndRequestReadPermission(mCurrentUri)) { + if (PermissionsUtil.checkAndRequestReadPermission(mActivity, mCurrentUri)) { startImportingKeys(); } } @@ -189,53 +183,15 @@ public class ImportKeysFileFragment extends Fragment { } } - /** - * Request READ_EXTERNAL_STORAGE permission on Android >= 6.0 to read content from "file" Uris. - *

- * This method returns true on Android < 6, or if permission is already granted. It - * requests the permission and returns false otherwise. - *

- * see https://commonsware.com/blog/2015/10/07/runtime-permissions-files-action-send.html - */ - private boolean checkAndRequestReadPermission(final 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 - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { - return true; - } - - if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_EXTERNAL_STORAGE) - == PackageManager.PERMISSION_GRANTED) { - return true; - } - - requestPermissions( - new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, - REQUEST_PERMISSION_READ_EXTERNAL_STORAGE); - - return false; - } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { - if (requestCode != REQUEST_PERMISSION_READ_EXTERNAL_STORAGE) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults); - return; - } - - boolean permissionWasGranted = grantResults.length > 0 - && grantResults[0] == PackageManager.PERMISSION_GRANTED; - - if (permissionWasGranted) { + if (PermissionsUtil.checkReadPermissionResult(mActivity, requestCode, grantResults)) { startImportingKeys(); } else { - Toast.makeText(mActivity, R.string.error_denied_storage_permission, Toast.LENGTH_LONG).show(); mActivity.setResult(Activity.RESULT_CANCELED); mActivity.finish(); } 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 c6105b18e..72d148550 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java @@ -18,20 +18,15 @@ package org.sufficientlysecure.keychain.ui; -import android.Manifest; import android.app.Activity; -import android.content.ContentResolver; -import android.content.pm.PackageManager; import android.databinding.DataBindingUtil; import android.net.Uri; -import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.support.annotation.NonNull; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.LoaderManager; -import android.support.v4.content.ContextCompat; import android.support.v4.content.Loader; import android.support.v4.util.LongSparseArray; import android.support.v7.widget.LinearLayoutManager; @@ -39,7 +34,6 @@ import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.Toast; import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R; @@ -55,6 +49,7 @@ import org.sufficientlysecure.keychain.keyimport.processing.LoaderState; import org.sufficientlysecure.keychain.operations.results.GetKeyResult; import org.sufficientlysecure.keychain.service.input.RequiredInputParcel; import org.sufficientlysecure.keychain.ui.adapter.ImportKeysAdapter; +import org.sufficientlysecure.keychain.ui.util.PermissionsUtil; import org.sufficientlysecure.keychain.util.Log; import org.sufficientlysecure.keychain.util.ParcelableFileCache.IteratorWithSize; import org.sufficientlysecure.keychain.util.ParcelableProxy; @@ -74,8 +69,6 @@ public class ImportKeysListFragment extends Fragment implements public static final String ARG_NON_INTERACTIVE = "non_interactive"; public static final String ARG_CLOUD_SEARCH_PREFS = "cloud_search_prefs"; - private static final int REQUEST_PERMISSION_READ_EXTERNAL_STORAGE = 12; - private FragmentActivity mActivity; private ImportKeysListFragmentBinding binding; @@ -222,61 +215,21 @@ public class ImportKeysListFragment extends Fragment implements mLoaderState = new CloudLoaderState(query, cloudSearchPrefs); } - if (dataUri == null || checkAndRequestReadPermission(dataUri)) { + if (dataUri == null || PermissionsUtil.checkAndRequestReadPermission(mActivity, dataUri)) { restartLoaders(); } return view; } - /** - * Request READ_EXTERNAL_STORAGE permission on Android >= 6.0 to read content from "file" Uris. - *

- * This method returns true on Android < 6, or if permission is already granted. It - * requests the permission and returns false otherwise. - *

- * see https://commonsware.com/blog/2015/10/07/runtime-permissions-files-action-send.html - */ - private boolean checkAndRequestReadPermission(final 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 - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { - return true; - } - - if (ContextCompat.checkSelfPermission(mActivity, Manifest.permission.READ_EXTERNAL_STORAGE) - == PackageManager.PERMISSION_GRANTED) { - return true; - } - - requestPermissions( - new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, - REQUEST_PERMISSION_READ_EXTERNAL_STORAGE); - - return false; - } - @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { - if (requestCode != REQUEST_PERMISSION_READ_EXTERNAL_STORAGE) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults); - return; - } - - boolean permissionWasGranted = grantResults.length > 0 - && grantResults[0] == PackageManager.PERMISSION_GRANTED; - - if (permissionWasGranted) { - // permission granted -> load key + if (PermissionsUtil.checkReadPermissionResult(mActivity, requestCode, grantResults)) { restartLoaders(); } else { - Toast.makeText(mActivity, R.string.error_denied_storage_permission, Toast.LENGTH_LONG).show(); mActivity.setResult(Activity.RESULT_CANCELED); mActivity.finish(); } @@ -292,7 +245,8 @@ public class ImportKeysListFragment extends Fragment implements if (mLoaderState instanceof BytesLoaderState) { BytesLoaderState ls = (BytesLoaderState) mLoaderState; - if (ls.mDataUri != null && !checkAndRequestReadPermission(ls.mDataUri)) { + if (ls.mDataUri != null && + !PermissionsUtil.checkAndRequestReadPermission(mActivity, 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 new file mode 100644 index 000000000..14086c087 --- /dev/null +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/PermissionsUtil.java @@ -0,0 +1,70 @@ +package org.sufficientlysecure.keychain.ui.util; + +import android.Manifest; +import android.app.Activity; +import android.content.ContentResolver; +import android.content.pm.PackageManager; +import android.net.Uri; +import android.os.Build; +import android.support.v4.content.ContextCompat; +import android.widget.Toast; + +import org.sufficientlysecure.keychain.R; + +/** + * Created by Andrea on 19/06/2016. + */ +public class PermissionsUtil { + + private static final int PERMISSION_READ_EXTERNAL_STORAGE = 1; + + /** + * Request READ_EXTERNAL_STORAGE permission on Android >= 6.0 to read content from "file" Uris. + *

+ * This method returns true on Android < 6, or if permission is already granted. It + * requests the permission and returns false otherwise. + *

+ * see https://commonsware.com/blog/2015/10/07/runtime-permissions-files-action-send.html + */ + public static boolean checkAndRequestReadPermission(Activity activity, 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 + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { + return true; + } + + if (ContextCompat.checkSelfPermission(activity, 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, + int requestCode, + int[] grantResults) { + + if (requestCode != PERMISSION_READ_EXTERNAL_STORAGE) { + return false; + } + + boolean permissionWasGranted = grantResults.length > 0 + && grantResults[0] == PackageManager.PERMISSION_GRANTED; + + if (permissionWasGranted) { + return true; + } else { + Toast.makeText(activity, R.string.error_denied_storage_permission, Toast.LENGTH_LONG).show(); + + return false; + } + } + +}