forked from organicmaps/organicmaps
[android] Move location permission request logic to LocationHelper
Signed-off-by: Roman Tsisyk <roman@tsisyk.com>
This commit is contained in:
parent
b1e852bd48
commit
5f4e2a5017
7 changed files with 172 additions and 181 deletions
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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())
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
Loading…
Add table
Reference in a new issue