[android] Move location permission request logic to LocationHelper

Signed-off-by: Roman Tsisyk <roman@tsisyk.com>
This commit is contained in:
Roman Tsisyk 2022-10-05 11:07:37 +03:00 committed by Alexander Borsuk
parent b1e852bd48
commit 5f4e2a5017
7 changed files with 172 additions and 181 deletions

View file

@ -408,7 +408,7 @@ public class MapFragment extends BaseMwmFragment
static native void nativeScalePlus();
static native void nativeScaleMinus();
public static native boolean nativeShowMapForUrl(String url);
static native boolean nativeIsEngineCreated();
public static native boolean nativeIsEngineCreated();
static native boolean nativeDestroySurfaceOnDetach();
private static native boolean nativeCreateEngine(Surface surface, int density,
boolean firstLaunch,

View file

@ -4,7 +4,6 @@ import static com.mapswithme.maps.widget.placepage.PlacePageButtons.PLACEPAGE_MO
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
@ -25,6 +24,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StyleRes;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
@ -92,7 +92,7 @@ import com.mapswithme.maps.widget.placepage.PlacePageFactory;
import com.mapswithme.maps.widget.placepage.RoutingModeListener;
import com.mapswithme.util.Config;
import com.mapswithme.util.Counters;
import com.mapswithme.util.PermissionsUtils;
import com.mapswithme.util.LocationUtils;
import com.mapswithme.util.SharingUtils;
import com.mapswithme.util.ThemeSwitcher;
import com.mapswithme.util.ThemeUtils;
@ -136,8 +136,6 @@ public class MwmActivity extends BaseMwmFragmentActivity
private static final String EXTRA_LOCATION_DIALOG_IS_ANNOYING = "LOCATION_DIALOG_IS_ANNOYING";
private static final String EXTRA_CURRENT_LAYOUT_MODE = "CURRENT_LAYOUT_MODE";
private static final int REQ_CODE_LOCATION_PERMISSION = 1;
private static final int REQ_CODE_LOCATION_PERMISSION_ON_CLICK = 2;
public static final int REQ_CODE_ERROR_DRIVING_OPTIONS_DIALOG = 5;
public static final int REQ_CODE_DRIVING_OPTIONS = 6;
private static final int REQ_CODE_ISOLINES_ERROR = 8;
@ -183,10 +181,6 @@ public class MwmActivity extends BaseMwmFragmentActivity
@NonNull
private FloatingSearchToolbarController mSearchController;
private boolean mLocationErrorDialogAnnoying = false;
@Nullable
private Dialog mLocationErrorDialog;
private boolean mRestoreRoutingPlanFragmentNeeded;
@Nullable
private Bundle mSavedForTabletState;
@ -218,8 +212,6 @@ public class MwmActivity extends BaseMwmFragmentActivity
public void onRenderingCreated()
{
checkMeasurementSystem();
LocationHelper.INSTANCE.attach(this);
}
@Override
@ -234,14 +226,6 @@ public class MwmActivity extends BaseMwmFragmentActivity
runTasks();
}
private void myPositionClick()
{
mLocationErrorDialogAnnoying = false;
LocationHelper.INSTANCE.setStopLocationUpdateByUser(false);
LocationHelper.INSTANCE.switchToNextMode();
LocationHelper.INSTANCE.restart();
}
private void runTasks()
{
while (!mTasks.isEmpty())
@ -385,7 +369,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
super.onSafeCreate(savedInstanceState);
if (savedInstanceState != null)
{
mLocationErrorDialogAnnoying = savedInstanceState.getBoolean(EXTRA_LOCATION_DIALOG_IS_ANNOYING);
LocationHelper.INSTANCE.setLocationErrorDialogAnnoying(savedInstanceState.getBoolean(EXTRA_LOCATION_DIALOG_IS_ANNOYING));
mCurrentLayoutMode = MapButtonsController.LayoutMode.values()[savedInstanceState.getInt(EXTRA_CURRENT_LAYOUT_MODE)];
}
else
@ -657,12 +641,9 @@ public class MwmActivity extends BaseMwmFragmentActivity
MapFragment.nativeScaleMinus();
break;
case myPosition:
if (!PermissionsUtils.isFineLocationGranted(getApplicationContext()))
{
PermissionsUtils.requestLocationPermission(MwmActivity.this, REQ_CODE_LOCATION_PERMISSION_ON_CLICK);
return;
}
myPositionClick();
LocationHelper.INSTANCE.switchToNextMode();
if (!LocationUtils.isFineLocationGranted(getApplicationContext()))
LocationHelper.INSTANCE.requestPermissions();
break;
case toggleMapLayer:
toggleMapLayerBottomSheet();
@ -810,8 +791,8 @@ public class MwmActivity extends BaseMwmFragmentActivity
public void startLocationToPoint(final @Nullable MapObject endPoint)
{
closeFloatingPanels();
if (!PermissionsUtils.isFineLocationGranted(MwmActivity.this))
PermissionsUtils.requestLocationPermission(MwmActivity.this, REQ_CODE_LOCATION_PERMISSION);
if (!LocationUtils.isFineLocationGranted(getApplicationContext()))
LocationHelper.INSTANCE.requestPermissions();
MapObject startPoint = LocationHelper.INSTANCE.getMyPosition();
RoutingController.get().prepare(startPoint, endPoint);
@ -854,7 +835,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
mNavigationController.onActivitySaveInstanceState(this, outState);
RoutingController.get().onSaveState();
outState.putBoolean(EXTRA_LOCATION_DIALOG_IS_ANNOYING, mLocationErrorDialogAnnoying);
outState.putBoolean(EXTRA_LOCATION_DIALOG_IS_ANNOYING, LocationHelper.INSTANCE.isLocationErrorDialogAnnoying());
outState.putInt(EXTRA_CURRENT_LAYOUT_MODE, mCurrentLayoutMode.ordinal());
if (!isChangingConfigurations())
@ -931,25 +912,6 @@ public class MwmActivity extends BaseMwmFragmentActivity
rebuildLastRouteInternal();
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults)
{
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode != REQ_CODE_LOCATION_PERMISSION && requestCode != REQ_CODE_LOCATION_PERMISSION_ON_CLICK)
return;
if (!PermissionsUtils.isLocationGranted(this))
{
Utils.showSnackbar(requireActivity(), findViewById(R.id.coordinator), findViewById(R.id.menu_frame),
R.string.location_is_disabled_long_text);
return;
}
if (requestCode == REQ_CODE_LOCATION_PERMISSION_ON_CLICK)
myPositionClick();
}
private void onIsolinesStateChanged(@NonNull IsolinesState type)
{
if (type != IsolinesState.EXPIREDDATA)
@ -1081,8 +1043,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
BookmarkManager.INSTANCE.addLoadingListener(this);
RoutingController.get().attach(this);
IsolinesManager.from(getApplicationContext()).attach(this::onIsolinesStateChanged);
if (MapFragment.nativeIsEngineCreated())
LocationHelper.INSTANCE.attach(this);
LocationHelper.INSTANCE.attach(this);
mPlacePageController.onActivityStarted(this);
mSearchController.attach(this);
MwmApplication.backgroundTracker(requireActivity()).addListener(this);
@ -1282,7 +1243,8 @@ public class MwmActivity extends BaseMwmFragmentActivity
}
@Override
public FragmentActivity requireActivity()
@NonNull
public AppCompatActivity requireActivity()
{
return this;
}
@ -1653,9 +1615,6 @@ public class MwmActivity extends BaseMwmFragmentActivity
@Override
public void onLocationUpdated(@NonNull Location location)
{
if (mLocationErrorDialog != null && mLocationErrorDialog.isShowing())
mLocationErrorDialog.dismiss();
if (!RoutingController.get().isNavigating())
return;
@ -1674,57 +1633,8 @@ public class MwmActivity extends BaseMwmFragmentActivity
@Override
public void onLocationDenied()
{
PermissionsUtils.requestLocationPermission(this, REQ_CODE_LOCATION_PERMISSION);
}
@Override
public void onLocationDisabled()
{
if (mLocationErrorDialogAnnoying || (mLocationErrorDialog != null && mLocationErrorDialog.isShowing()))
return;
AlertDialog.Builder builder = new AlertDialog.Builder(this)
.setTitle(R.string.enable_location_services)
.setMessage(R.string.location_is_disabled_long_text)
.setOnDismissListener(dialog -> mLocationErrorDialog = null)
.setOnCancelListener(dialog -> mLocationErrorDialogAnnoying = true)
.setNegativeButton(R.string.close, (dialog, which) -> mLocationErrorDialogAnnoying = true);
final Intent intent = Utils.makeSystemLocationSettingIntent(this);
if (intent != null)
{
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
builder.setPositiveButton(R.string.connection_settings, (dialog, which) -> startActivity(intent));
}
mLocationErrorDialog = builder.show();
}
@Override
public void onLocationNotFound()
{
if (mLocationErrorDialogAnnoying || (mLocationErrorDialog != null && mLocationErrorDialog.isShowing()))
return;
final String message = String.format("%s\n\n%s", getString(R.string.current_location_unknown_message),
getString(R.string.current_location_unknown_title));
mLocationErrorDialog = new AlertDialog.Builder(this)
.setMessage(message)
.setOnDismissListener(dialog -> mLocationErrorDialog = null)
.setNegativeButton(R.string.current_location_unknown_stop_button, (dialog, which) ->
{
LocationHelper.INSTANCE.setStopLocationUpdateByUser(true);
LocationHelper.INSTANCE.stop();
})
.setPositiveButton(R.string.current_location_unknown_continue_button, (dialog, which) ->
{
if (!LocationHelper.INSTANCE.isActive())
LocationHelper.INSTANCE.start();
LocationHelper.INSTANCE.switchToNextMode();
// TODO(AB): Leads to inconsistent UX: dialog won't appear later if user cancels and starts location search again.
mLocationErrorDialogAnnoying = true;
})
.show();
Utils.showSnackbar(this, findViewById(R.id.coordinator), findViewById(R.id.menu_frame),
R.string.location_is_disabled_long_text);
}
@Override

View file

@ -1,5 +1,8 @@
package com.mapswithme.maps;
import static android.Manifest.permission.ACCESS_COARSE_LOCATION;
import static android.Manifest.permission.ACCESS_FINE_LOCATION;
import android.app.Activity;
import android.content.Context;
import android.content.DialogInterface;
@ -11,15 +14,14 @@ import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import com.mapswithme.maps.api.Const;
import com.mapswithme.maps.api.ParsedMwmRequest;
import com.mapswithme.maps.base.BaseActivity;
import com.mapswithme.maps.base.BaseActivityDelegate;
import com.mapswithme.maps.location.LocationHelper;
import com.mapswithme.util.Config;
import com.mapswithme.util.Counters;
import com.mapswithme.util.PermissionsUtils;
import com.mapswithme.util.LocationUtils;
import com.mapswithme.util.ThemeUtils;
import com.mapswithme.util.UiUtils;
import com.mapswithme.util.concurrency.UiThread;
@ -94,9 +96,12 @@ public class SplashActivity extends AppCompatActivity implements BaseActivity
mBaseDelegate.onResume();
if (mCanceled)
return;
if (!Config.isLocationRequested() && !PermissionsUtils.isLocationGranted(this))
if (!Config.isLocationRequested() && !LocationUtils.isLocationGranted(this))
{
PermissionsUtils.requestLocationPermission(SplashActivity.this, REQUEST_PERMISSIONS);
ActivityCompat.requestPermissions(this, new String[]{
ACCESS_COARSE_LOCATION,
ACCESS_FINE_LOCATION
}, REQUEST_PERMISSIONS);
return;
}
@ -167,7 +172,7 @@ public class SplashActivity extends AppCompatActivity implements BaseActivity
return;
}
if (Counters.isFirstLaunch(this) && PermissionsUtils.isLocationGranted(this))
if (Counters.isFirstLaunch(this) && LocationUtils.isLocationGranted(this))
{
LocationHelper.INSTANCE.onEnteredIntoFirstRun();
if (!LocationHelper.INSTANCE.isActive())

View file

@ -5,13 +5,15 @@ import android.location.Location;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.UiThread;
abstract class BaseLocationProvider
{
interface Listener
{
@UiThread
void onLocationChanged(@NonNull Location location);
void onLocationDenied();
@UiThread
void onLocationDisabled();
}

View file

@ -1,17 +1,26 @@
package com.mapswithme.maps.location;
import android.app.Activity;
import static android.Manifest.permission.ACCESS_COARSE_LOCATION;
import static android.Manifest.permission.ACCESS_FINE_LOCATION;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.location.Location;
import android.location.LocationManager;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.UiThread;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import com.mapswithme.maps.Framework;
import com.mapswithme.maps.MwmApplication;
import com.mapswithme.maps.R;
import com.mapswithme.maps.background.AppBackgroundTracker;
import com.mapswithme.maps.base.Initializable;
import com.mapswithme.maps.bookmarks.data.FeatureId;
@ -21,7 +30,6 @@ import com.mapswithme.util.Config;
import com.mapswithme.util.Listeners;
import com.mapswithme.util.LocationUtils;
import com.mapswithme.util.NetworkPolicy;
import com.mapswithme.util.PermissionsUtils;
import com.mapswithme.util.Utils;
import com.mapswithme.util.log.Logger;
@ -73,6 +81,11 @@ public enum LocationHelper implements Initializable<Context>, AppBackgroundTrack
private boolean mInFirstRun;
private boolean mActive;
private boolean mLocationUpdateStoppedByUser;
private boolean mLocationErrorDialogAnnoying;
@Nullable
private Dialog mLocationErrorDialog;
@Nullable
ActivityResultLauncher<String[]> mPermissionRequest;
@SuppressWarnings("FieldCanBeLocal")
private final LocationState.ModeChangeListener mMyPositionModeListener =
@ -93,8 +106,8 @@ public enum LocationHelper implements Initializable<Context>, AppBackgroundTrack
private final LocationState.LocationPendingTimeoutListener mLocationPendingTimeoutListener = () -> {
if (mActive)
{
if (PermissionsUtils.isLocationGranted(mContext) && LocationUtils.areLocationServicesTurnedOn(mContext))
notifyLocationNotFound();
if (LocationUtils.isLocationGranted(mContext) && LocationUtils.areLocationServicesTurnedOn(mContext))
onLocationNotFound();
}
};
@ -158,15 +171,21 @@ public enum LocationHelper implements Initializable<Context>, AppBackgroundTrack
return mActive;
}
public void setStopLocationUpdateByUser(boolean isStopped)
private void setStopLocationUpdateByUser(boolean isStopped)
{
Logger.d(TAG, "Set stop location update by user: " + isStopped);
mLocationUpdateStoppedByUser = isStopped;
}
private boolean isLocationUpdateStoppedByUser()
public boolean isLocationErrorDialogAnnoying()
{
return mLocationUpdateStoppedByUser;
return mLocationErrorDialogAnnoying;
}
public void setLocationErrorDialogAnnoying(boolean isAnnoying)
{
Logger.d(TAG, "Set stop location error dialog is annoying: " + isAnnoying);
mLocationErrorDialogAnnoying = isAnnoying;
}
@Override
@ -221,6 +240,9 @@ public enum LocationHelper implements Initializable<Context>, AppBackgroundTrack
if (mSavedLocation == null)
throw new IllegalStateException("No saved location");
if (mLocationErrorDialog != null && mLocationErrorDialog.isShowing())
mLocationErrorDialog.dismiss();
for (LocationListener listener : mListeners)
listener.onLocationUpdated(mSavedLocation);
mListeners.finishIterate();
@ -262,7 +284,7 @@ public enum LocationHelper implements Initializable<Context>, AppBackgroundTrack
@Override
public void onLocationChanged(@NonNull Location location)
{
Logger.d(TAG, "onLocationChanged, location = " + location);
Logger.d(TAG, "location = " + location);
if (!LocationUtils.isAccuracySatisfied(location))
{
@ -286,17 +308,11 @@ public enum LocationHelper implements Initializable<Context>, AppBackgroundTrack
}
@Override
public void onLocationDenied()
{
mSavedLocation = null;
nativeOnLocationError(ERROR_DENIED);
if (mUiCallback != null)
mUiCallback.onLocationDenied();
}
@Override
@UiThread
public void onLocationDisabled()
{
Logger.d(TAG, "");
if (LocationUtils.areLocationServicesTurnedOn(mContext) &&
!(mLocationProvider instanceof AndroidNativeProvider))
{
@ -310,8 +326,53 @@ public enum LocationHelper implements Initializable<Context>, AppBackgroundTrack
mSavedLocation = null;
nativeOnLocationError(ERROR_GPS_OFF);
if (mUiCallback != null)
mUiCallback.onLocationDisabled();
if (mLocationErrorDialogAnnoying || (mLocationErrorDialog != null && mLocationErrorDialog.isShowing()))
return;
AlertDialog.Builder builder = new AlertDialog.Builder(mContext)
.setTitle(R.string.enable_location_services)
.setMessage(R.string.location_is_disabled_long_text)
.setOnDismissListener(dialog -> mLocationErrorDialog = null)
.setOnCancelListener(dialog -> setLocationErrorDialogAnnoying(true))
.setNegativeButton(R.string.close, (dialog, which) -> setLocationErrorDialogAnnoying(true));
final Intent intent = Utils.makeSystemLocationSettingIntent(mContext);
if (intent != null)
{
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
builder.setPositiveButton(R.string.connection_settings, (dialog, which) -> mContext.startActivity(intent));
}
mLocationErrorDialog = builder.show();
}
@UiThread
private void onLocationNotFound()
{
Logger.d(TAG, "");
if (mLocationErrorDialogAnnoying || (mLocationErrorDialog != null && mLocationErrorDialog.isShowing()))
return;
final String message = String.format("%s\n\n%s", mContext.getString(R.string.current_location_unknown_message),
mContext.getString(R.string.current_location_unknown_title));
mLocationErrorDialog = new AlertDialog.Builder(mContext)
.setMessage(message)
.setOnDismissListener(dialog -> mLocationErrorDialog = null)
.setNegativeButton(R.string.current_location_unknown_stop_button, (dialog, which) ->
{
setStopLocationUpdateByUser(true);
stop();
})
.setPositiveButton(R.string.current_location_unknown_continue_button, (dialog, which) ->
{
if (!isActive())
start();
switchToNextMode();
setLocationErrorDialogAnnoying(true);
})
.show();
}
private void notifyMyPositionModeChanged(int newMode)
@ -322,13 +383,6 @@ public enum LocationHelper implements Initializable<Context>, AppBackgroundTrack
mUiCallback.onMyPositionModeChanged(newMode);
}
private void notifyLocationNotFound()
{
Logger.d(TAG, "notifyLocationNotFound()");
if (mUiCallback != null)
mUiCallback.onLocationNotFound();
}
/**
* Registers listener to obtain location updates.
*
@ -439,21 +493,24 @@ public enum LocationHelper implements Initializable<Context>, AppBackgroundTrack
return;
}
if (isLocationUpdateStoppedByUser())
if (mLocationUpdateStoppedByUser)
{
Logger.d(TAG, "Location updates are stopped by the user manually, so skip provider start"
+ " until the user starts it manually.");
onLocationDisabled();
nativeOnLocationError(ERROR_GPS_OFF);
return;
}
long oldInterval = mInterval;
Logger.d(TAG, "Old time interval (ms): " + oldInterval);
calcLocationUpdatesInterval();
if (!PermissionsUtils.isLocationGranted(mContext))
if (!LocationUtils.isLocationGranted(mContext))
{
Logger.w(TAG, "Dynamic permissions ACCESS_COARSE_LOCATION and/or ACCESS_FINE_LOCATION are granted");
onLocationDenied();
mSavedLocation = null;
nativeOnLocationError(ERROR_DENIED);
if (mUiCallback != null)
requestPermissions();
return;
}
Logger.i(TAG, "start(): interval = " + mInterval + " provider = '" + mLocationProvider + "' mInFirstRun = " + mInFirstRun);
@ -516,6 +573,10 @@ public enum LocationHelper implements Initializable<Context>, AppBackgroundTrack
mUiCallback = callback;
mPermissionRequest = mUiCallback.requireActivity()
.registerForActivityResult(new ActivityResultContracts.RequestMultiplePermissions(),
result -> onRequestPermissionsResult());
if (!Config.isScreenSleepEnabled()) {
Utils.keepScreenOn(true, mUiCallback.requireActivity().getWindow());
}
@ -551,9 +612,44 @@ public enum LocationHelper implements Initializable<Context>, AppBackgroundTrack
}
Utils.keepScreenOn(false, mUiCallback.requireActivity().getWindow());
mPermissionRequest.unregister();
mPermissionRequest = null;
mUiCallback = null;
}
@UiThread
public void requestPermissions()
{
if (mUiCallback == null)
throw new IllegalStateException("Not attached");
Logger.d(TAG, "");
mPermissionRequest.launch(new String[]{
ACCESS_COARSE_LOCATION,
ACCESS_FINE_LOCATION
});
}
@UiThread
private void onRequestPermissionsResult()
{
if (!LocationUtils.isLocationGranted(mContext))
{
Logger.w(TAG, "Permissions have not been granted");
mSavedLocation = null;
nativeOnLocationError(ERROR_DENIED);
if (mUiCallback != null)
mUiCallback.onLocationDenied();
return;
}
Logger.i(TAG, "Permissions have been granted");
setLocationErrorDialogAnnoying(false);
setStopLocationUpdateByUser(false);
restart();
}
@UiThread
public boolean isInFirstRun()
{
@ -608,13 +704,12 @@ public enum LocationHelper implements Initializable<Context>, AppBackgroundTrack
public interface UiCallback
{
Activity requireActivity();
@NonNull
AppCompatActivity requireActivity();
void onMyPositionModeChanged(int newMode);
void onLocationUpdated(@NonNull Location location);
void onCompassUpdated(@NonNull CompassData compass);
void onLocationDenied();
void onLocationDisabled();
void onLocationNotFound();
void onRoutingFinish();
}
}

View file

@ -1,6 +1,10 @@
package com.mapswithme.util;
import static android.Manifest.permission.ACCESS_COARSE_LOCATION;
import static android.Manifest.permission.ACCESS_FINE_LOCATION;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationManager;
import android.os.Build;
@ -8,6 +12,7 @@ import android.provider.Settings;
import android.view.Surface;
import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
public class LocationUtils
{
@ -110,4 +115,14 @@ public class LocationUtils
return false;
}
}
public static boolean isFineLocationGranted(@NonNull Context context)
{
return ContextCompat.checkSelfPermission(context, ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED;
}
public static boolean isLocationGranted(@NonNull Context context)
{
return isFineLocationGranted(context) || ContextCompat.checkSelfPermission(context, ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED;
}
}

View file

@ -1,36 +0,0 @@
package com.mapswithme.util;
import static android.Manifest.permission.ACCESS_COARSE_LOCATION;
import static android.Manifest.permission.ACCESS_FINE_LOCATION;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import androidx.annotation.NonNull;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
public final class PermissionsUtils
{
private PermissionsUtils() {}
public static boolean isFineLocationGranted(@NonNull Context context)
{
return ContextCompat.checkSelfPermission(context, ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED;
}
public static boolean isLocationGranted(@NonNull Context context)
{
return isFineLocationGranted(context) ||
ContextCompat.checkSelfPermission(context, ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED;
}
public static void requestLocationPermission(@NonNull Activity activity, int code)
{
ActivityCompat.requestPermissions(activity, new String[]{
ACCESS_COARSE_LOCATION,
ACCESS_FINE_LOCATION
}, code);
}
}