diff --git a/OsmAnd/src/net/osmand/plus/OsmandApplication.java b/OsmAnd/src/net/osmand/plus/OsmandApplication.java index 0383905c896..73aa1423551 100644 --- a/OsmAnd/src/net/osmand/plus/OsmandApplication.java +++ b/OsmAnd/src/net/osmand/plus/OsmandApplication.java @@ -23,6 +23,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.car.app.CarToast; +import androidx.core.app.ActivityCompat; import androidx.lifecycle.DefaultLifecycleObserver; import androidx.lifecycle.LifecycleObserver; import androidx.lifecycle.LifecycleOwner; @@ -157,6 +158,7 @@ public class OsmandApplication extends MultiDexApplication { NavigationCarAppService navigationCarAppService; NavigationSession carNavigationSession; + ActivityCompat.OnRequestPermissionsResultCallback androidAutoPermissionRequestResultListener; private final SQLiteAPI sqliteAPI = new SQLiteAPIImpl(this); private final OsmAndTaskManager taskManager = new OsmAndTaskManager(this); @@ -697,6 +699,15 @@ public void setNavigationCarAppService(@Nullable NavigationCarAppService navigat this.navigationCarAppService = navigationCarAppService; } + @Nullable + public ActivityCompat.OnRequestPermissionsResultCallback getAndroidAutoPermissionRequestResultListener() { + return androidAutoPermissionRequestResultListener; + } + + public void setAndroidAutoPermissionRequestResultListener(@Nullable ActivityCompat.OnRequestPermissionsResultCallback callback) { + this.androidAutoPermissionRequestResultListener = callback; + } + @Nullable public NavigationSession getCarNavigationSession() { return carNavigationSession; diff --git a/OsmAnd/src/net/osmand/plus/auto/NavigationCarAppService.java b/OsmAnd/src/net/osmand/plus/auto/NavigationCarAppService.java index 68928b94d43..e44b7b75648 100644 --- a/OsmAnd/src/net/osmand/plus/auto/NavigationCarAppService.java +++ b/OsmAnd/src/net/osmand/plus/auto/NavigationCarAppService.java @@ -10,6 +10,7 @@ import androidx.car.app.CarAppService; import androidx.car.app.Session; import androidx.car.app.validation.HostValidator; +import androidx.core.app.ActivityCompat; import androidx.lifecycle.DefaultLifecycleObserver; import androidx.lifecycle.LifecycleOwner; @@ -28,7 +29,7 @@ * details, see the Android for * Cars Library developer guide. */ -public final class NavigationCarAppService extends CarAppService { +public final class NavigationCarAppService extends CarAppService implements ActivityCompat.OnRequestPermissionsResultCallback { private static final org.apache.commons.logging.Log LOG = PlatformUtil.getLog(NavigationCarAppService.class); private boolean foreground = false; @@ -45,9 +46,23 @@ public static Uri createDeepLinkUri(@NonNull String deepLinkAction) { return Uri.fromParts(NavigationSession.URI_SCHEME, NavigationSession.URI_HOST, deepLinkAction); } + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + int result = super.onStartCommand(intent, flags, startId); + getApp().setNavigationCarAppService(this); + return result; + } + + @Override + public void onCreate() { + super.onCreate(); + getApp().setAndroidAutoPermissionRequestResultListener(this); + } + @Override public void onDestroy() { super.onDestroy(); + getApp().setAndroidAutoPermissionRequestResultListener(null); getApp().setNavigationCarAppService(null); } @@ -55,13 +70,13 @@ public void onDestroy() { @NonNull public Session onCreateSession() { OsmandApplication app = getApp(); - getApp().setNavigationCarAppService(this); startForegroundWithPermission(app); NavigationSession session = new NavigationSession(); session.getLifecycle() .addObserver(new DefaultLifecycleObserver() { @Override public void onDestroy(@NonNull LifecycleOwner owner) { + foreground = false; stopForeground(STOP_FOREGROUND_REMOVE); } }); @@ -69,17 +84,17 @@ public void onDestroy(@NonNull LifecycleOwner owner) { return session; } - private void startForegroundWithPermission(OsmandApplication app) { - if (!foreground && OsmAndLocationProvider.isLocationPermissionAvailable(app)) { + private void startForegroundWithPermission(@NonNull OsmandApplication app) { + if (!foreground && app.getCarNavigationSession() != null && OsmAndLocationProvider.isLocationPermissionAvailable(app)) { foreground = true; Notification notification = app.getNotificationHelper().buildCarAppNotification(); startForeground(app.getNotificationHelper().getOsmandNotificationId(NotificationType.CAR_APP), notification); } } - public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { List permissionsList = Arrays.asList(permissions); - if (permissionsList.contains(Manifest.permission.ACCESS_FINE_LOCATION) || + if (getApp().getCarNavigationSession() != null && permissionsList.contains(Manifest.permission.ACCESS_FINE_LOCATION) || permissionsList.contains(Manifest.permission.ACCESS_COARSE_LOCATION)) { startForegroundWithPermission(getApp()); } diff --git a/OsmAnd/src/net/osmand/plus/helpers/MapPermissionsResultCallback.java b/OsmAnd/src/net/osmand/plus/helpers/MapPermissionsResultCallback.java index 35464f19825..5c0964fd915 100644 --- a/OsmAnd/src/net/osmand/plus/helpers/MapPermissionsResultCallback.java +++ b/OsmAnd/src/net/osmand/plus/helpers/MapPermissionsResultCallback.java @@ -42,9 +42,9 @@ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permis controlsHelper.onRequestPermissionsResult(requestCode, permissions, grantResults); } - NavigationCarAppService navigationCarAppService = app.getNavigationCarAppService(); - if (navigationCarAppService != null) { - navigationCarAppService.onRequestPermissionsResult(requestCode, permissions, grantResults); + OnRequestPermissionsResultCallback aaCallback = app.getAndroidAutoPermissionRequestResultListener(); + if (aaCallback != null) { + aaCallback.onRequestPermissionsResult(requestCode, permissions, grantResults); } if (requestCode == DownloadActivity.PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE