From 2779176bbe51652c03dbdc06278bf21910e419c2 Mon Sep 17 00:00:00 2001 From: seven332 Date: Sun, 7 Feb 2016 11:54:49 +0800 Subject: [PATCH] Add permission request --- .../com/hippo/ehviewer/ui/MainActivity.java | 23 +++++++ .../com/hippo/util/PermissionRequester.java | 60 +++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 app/src/main/java/com/hippo/util/PermissionRequester.java diff --git a/app/src/main/java/com/hippo/ehviewer/ui/MainActivity.java b/app/src/main/java/com/hippo/ehviewer/ui/MainActivity.java index 507f7a762..534540fbb 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/MainActivity.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/MainActivity.java @@ -16,10 +16,13 @@ package com.hippo.ehviewer.ui; +import android.Manifest; import android.content.Intent; +import android.content.pm.PackageManager; import android.os.Bundle; import android.os.PersistableBundle; import android.support.annotation.IdRes; +import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.design.widget.NavigationView; import android.support.v4.widget.DrawerLayout; @@ -37,10 +40,13 @@ import com.hippo.ehviewer.ui.scene.WarningScene; import com.hippo.scene.Announcer; import com.hippo.scene.SceneFragment; import com.hippo.scene.StageActivity; +import com.hippo.util.PermissionRequester; public final class MainActivity extends StageActivity implements NavigationView.OnNavigationItemSelectedListener { + private static final int PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE = 0; + private static final String KEY_NAV_CHECKED_ITEM = "nav_checked_item"; private DrawerLayout mDrawerLayout; @@ -96,6 +102,7 @@ public final class MainActivity extends StageActivity if (intent != null && Intent.ACTION_VIEW.equals(intent.getAction())) { Toast.makeText(this, R.string.error_cannot_parse_the_url, Toast.LENGTH_SHORT).show(); finish(); + return; } else { if (Settings.getShowWarning()) { setDrawerLayoutEnable(false); @@ -111,6 +118,10 @@ public final class MainActivity extends StageActivity } } } + + // Check permission + PermissionRequester.request(this, Manifest.permission.WRITE_EXTERNAL_STORAGE, + getString(R.string.write_rationale), PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE); } private void onRestore(Bundle savedInstanceState) { @@ -130,6 +141,18 @@ public final class MainActivity extends StageActivity setNavCheckedItem(mNavCheckedItem); } + @Override + public void onRequestPermissionsResult(int requestCode, + @NonNull String[] permissions, @NonNull int[] grantResults) { + if (requestCode == PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE) { + if (grantResults.length == 1 && grantResults[0] != PackageManager.PERMISSION_GRANTED) { + Toast.makeText(this, R.string.you_rejected_me, Toast.LENGTH_SHORT).show(); + } + } else { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + } + } + public void setDrawerLayoutEnable(boolean enable) { if (enable) { mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED); diff --git a/app/src/main/java/com/hippo/util/PermissionRequester.java b/app/src/main/java/com/hippo/util/PermissionRequester.java new file mode 100644 index 000000000..b0034b818 --- /dev/null +++ b/app/src/main/java/com/hippo/util/PermissionRequester.java @@ -0,0 +1,60 @@ +/* + * Copyright 2015 Hippo Seven + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.hippo.util; + +import android.app.Activity; +import android.content.DialogInterface; +import android.content.pm.PackageManager; +import android.support.v4.app.ActivityCompat; +import android.support.v7.app.AlertDialog; + +public class PermissionRequester { + + /** + * @return true for there no need to request, do your work it now. + * false for do in {@link android.support.v4.app.ActivityCompat.OnRequestPermissionsResultCallback#onRequestPermissionsResult(int, String[], int[])} + */ + public static boolean request(final Activity activity, final String permission, String rationale, final int requestCode) { + if (!(activity instanceof ActivityCompat.OnRequestPermissionsResultCallback)) { + throw new IllegalStateException("The Activity must implement ActivityCompat.OnRequestPermissionsResultCallback"); + } + + if (ActivityCompat.checkSelfPermission(activity, permission) + == PackageManager.PERMISSION_GRANTED) { + return true; + } + + if (ActivityCompat.shouldShowRequestPermissionRationale(activity, permission)) { + new AlertDialog.Builder(activity) + .setMessage(rationale) + .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + ActivityCompat.requestPermissions(activity, + new String[]{permission}, + requestCode); + } + }).setNegativeButton(android.R.string.cancel, null); + } else { + ActivityCompat.requestPermissions(activity, + new String[]{permission}, + requestCode); + } + + return false; + } +}