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