diff --git a/android/src/com/mapswithme/maps/MapFragment.java b/android/src/com/mapswithme/maps/MapFragment.java index 47bd53f414..7f728fed31 100644 --- a/android/src/com/mapswithme/maps/MapFragment.java +++ b/android/src/com/mapswithme/maps/MapFragment.java @@ -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, diff --git a/android/src/com/mapswithme/maps/MwmActivity.java b/android/src/com/mapswithme/maps/MwmActivity.java index 251bbb331b..7ca64650d7 100644 --- a/android/src/com/mapswithme/maps/MwmActivity.java +++ b/android/src/com/mapswithme/maps/MwmActivity.java @@ -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 diff --git a/android/src/com/mapswithme/maps/SplashActivity.java b/android/src/com/mapswithme/maps/SplashActivity.java index 91085971ab..0c34e10f1a 100644 --- a/android/src/com/mapswithme/maps/SplashActivity.java +++ b/android/src/com/mapswithme/maps/SplashActivity.java @@ -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()) diff --git a/android/src/com/mapswithme/maps/location/BaseLocationProvider.java b/android/src/com/mapswithme/maps/location/BaseLocationProvider.java index 0ae439feaa..75bd571397 100644 --- a/android/src/com/mapswithme/maps/location/BaseLocationProvider.java +++ b/android/src/com/mapswithme/maps/location/BaseLocationProvider.java @@ -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(); } diff --git a/android/src/com/mapswithme/maps/location/LocationHelper.java b/android/src/com/mapswithme/maps/location/LocationHelper.java index d0b6dec6b0..9e71a0ec8d 100644 --- a/android/src/com/mapswithme/maps/location/LocationHelper.java +++ b/android/src/com/mapswithme/maps/location/LocationHelper.java @@ -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, AppBackgroundTrack private boolean mInFirstRun; private boolean mActive; private boolean mLocationUpdateStoppedByUser; + private boolean mLocationErrorDialogAnnoying; + @Nullable + private Dialog mLocationErrorDialog; + @Nullable + ActivityResultLauncher mPermissionRequest; @SuppressWarnings("FieldCanBeLocal") private final LocationState.ModeChangeListener mMyPositionModeListener = @@ -93,8 +106,8 @@ public enum LocationHelper implements Initializable, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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(); } } diff --git a/android/src/com/mapswithme/util/LocationUtils.java b/android/src/com/mapswithme/util/LocationUtils.java index 7212600284..f95cd303f2 100644 --- a/android/src/com/mapswithme/util/LocationUtils.java +++ b/android/src/com/mapswithme/util/LocationUtils.java @@ -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; + } } diff --git a/android/src/com/mapswithme/util/PermissionsUtils.java b/android/src/com/mapswithme/util/PermissionsUtils.java deleted file mode 100644 index 0a1ad4cee4..0000000000 --- a/android/src/com/mapswithme/util/PermissionsUtils.java +++ /dev/null @@ -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); - } -}