package com.orgzly.android.util; import android.Manifest; import android.content.Context; import android.content.pm.PackageManager; import android.support.design.widget.Snackbar; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.view.View; import com.orgzly.R; import com.orgzly.android.ui.CommonActivity; import com.orgzly.android.ui.util.ActivityUtils; public class AppPermissions { public static final int FOR_LOCAL_REPO = 1; public static final int FOR_BOOK_EXPORT = 2; public static final int FOR_SYNC_START = 3; public static boolean isNotGranted(Context context, int requestCode) { String permission = permissionForRequest(requestCode); return ContextCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED; } public static boolean isGrantedOrRequest(final CommonActivity activity, int requestCode) { String permission = permissionForRequest(requestCode); int rationale = rationaleForRequest(requestCode); if (isNotGranted(activity, requestCode)) { /* Should we show an explanation? */ if (ActivityCompat.shouldShowRequestPermissionRationale(activity, permission)) { View view = activity.findViewById(R.id.main_content); activity.showSnackbar(Snackbar.make(view, rationale, MiscUtils.SNACKBAR_WITH_ACTION_DURATION) .setAction(R.string.settings, new View.OnClickListener() { @Override public void onClick(View v) { ActivityUtils.openAppInfoSettings(activity); } })); } else { /* No explanation needed -- request the permission. */ ActivityCompat.requestPermissions(activity, new String[] { permission }, requestCode); } return false; } else { return true; } } /** * Mapping of request code to actual permissions. */ private static String permissionForRequest(int requestCode) { switch (requestCode) { case FOR_LOCAL_REPO: return Manifest.permission.WRITE_EXTERNAL_STORAGE; case FOR_BOOK_EXPORT: return Manifest.permission.WRITE_EXTERNAL_STORAGE; case FOR_SYNC_START: return Manifest.permission.WRITE_EXTERNAL_STORAGE; } throw new IllegalArgumentException("Unknown permission for request code " + requestCode); } /** * Mapping of request code to explanation. */ private static int rationaleForRequest(int requestCode) { switch (requestCode) { case FOR_LOCAL_REPO: return R.string.permissions_rationale_for_local_repo; case FOR_BOOK_EXPORT: return R.string.permissions_rationale_for_book_export; case FOR_SYNC_START: return R.string.permissions_rationale_for_sync_start; } throw new IllegalArgumentException("Unknown rationale for request code " + requestCode); } }