/* Montréal Just in Case Copyright (C) 2011 Mudar Noufal <mn@mudar.ca> Geographic locations of public safety services. A Montréal Open Data project. This file is part of Montréal Just in Case. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ package ca.mudar.mtlaucasou.util; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; import android.provider.Settings; import android.support.annotation.Nullable; import android.support.design.widget.Snackbar; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; import android.view.View; import ca.mudar.mtlaucasou.Const; import ca.mudar.mtlaucasou.R; import ca.mudar.mtlaucasou.data.UserPrefs; import static android.Manifest.permission.ACCESS_COARSE_LOCATION; import static android.Manifest.permission.ACCESS_FINE_LOCATION; import static ca.mudar.mtlaucasou.util.LogUtils.makeLogTag; /** * Utility class for access to runtime permissions. */ public abstract class PermissionUtils { private static final String TAG = makeLogTag("PermissionUtils"); public static boolean checkLocationPermission(Context context) { return (ContextCompat.checkSelfPermission(context, ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(context, ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED); } /** * Requests the fine location permission. */ public static void requestLocationPermission(AppCompatActivity activity) { ActivityCompat.requestPermissions(activity, new String[]{ACCESS_FINE_LOCATION}, Const.RequestCodes.LOCATION_PERMISSION); } /** * After onRequestPermissionsResult(), if the permission is still not granted, a call to * this method tries to explain to the user why * * @param activity * @param snackbarView * @return */ public static void showLocationRationaleOrSurrender(final AppCompatActivity activity, @Nullable View snackbarView) { final View view = (snackbarView != null) ? snackbarView : activity.findViewById(android.R.id.content); if (ActivityCompat.shouldShowRequestPermissionRationale(activity, ACCESS_FINE_LOCATION)) { // Display a dialog with rationale. Snackbar .make(view, R.string.snackbar_location_permission_needed, Snackbar.LENGTH_LONG) .setAction(R.string.btn_ok, new View.OnClickListener() { @Override public void onClick(View view) { requestLocationPermission(activity); } }) .show(); } else { UserPrefs.getInstance(activity.getApplicationContext()).setPermissionDeniedForEver(true); Snackbar .make(view, R.string.snackbar_location_permission_denied, Snackbar.LENGTH_LONG) .setAction(R.string.btn_device_settings, new View.OnClickListener() { @Override public void onClick(View view) { activity.startActivity(newAppSettingsIntent(activity)); } }) .show(); } } public static boolean checkPermissionWasDeniedForEver(Context context) { final UserPrefs prefs = UserPrefs.getInstance(context); if (prefs.isPermissionDeniedForEver()) { // User has previously deniedForEver if (checkLocationPermission(context)) { // User has changed his mind, granting permission from app settings. prefs.setPermissionDeniedForEver(false); } else { // User has previously deniedForEver return true; } } return false; } public static Intent newAppSettingsIntent(Activity activity) { final Intent intent = new Intent(); intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri uri = Uri.fromParts("package", activity.getPackageName(), null); intent.setData(uri); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); return intent; } }