[android-auto] Log screens' lifecycle

Signed-off-by: Andrei Shkrob <github@shkrob.dev>
This commit is contained in:
Andrei Shkrob
2025-09-25 22:43:18 +02:00
committed by x7z4w
parent 5035aa3f79
commit 3fcf653deb
24 changed files with 102 additions and 24 deletions

View File

@@ -16,7 +16,8 @@ import app.organicmaps.sdk.util.log.Logger;
public abstract class Renderer implements DefaultLifecycleObserver public abstract class Renderer implements DefaultLifecycleObserver
{ {
private static final String TAG = Renderer.class.getSimpleName(); @NonNull
private final String TAG;
private SurfaceCallback mSurfaceCallback; private SurfaceCallback mSurfaceCallback;
@@ -46,6 +47,7 @@ public abstract class Renderer implements DefaultLifecycleObserver
public Renderer(@NonNull CarContext carContext, @NonNull DisplayManager displayManager, public Renderer(@NonNull CarContext carContext, @NonNull DisplayManager displayManager,
@NonNull LocationHelper locationHelper, @NonNull LifecycleOwner lifecycleOwner) @NonNull LocationHelper locationHelper, @NonNull LifecycleOwner lifecycleOwner)
{ {
TAG = getClass().getSimpleName();
Logger.d(TAG, "SurfaceRenderer()"); Logger.d(TAG, "SurfaceRenderer()");
mIsRunning = true; mIsRunning = true;
mCarContext = carContext; mCarContext = carContext;

View File

@@ -11,7 +11,8 @@ import app.organicmaps.sdk.util.log.Logger;
abstract class SurfaceCallbackBase implements SurfaceCallback abstract class SurfaceCallbackBase implements SurfaceCallback
{ {
private static final String TAG = SurfaceCallbackBase.class.getSimpleName(); @NonNull
private final String TAG;
@NonNull @NonNull
protected final CarContext mCarContext; protected final CarContext mCarContext;
@@ -21,6 +22,7 @@ abstract class SurfaceCallbackBase implements SurfaceCallback
public SurfaceCallbackBase(@NonNull CarContext carContext) public SurfaceCallbackBase(@NonNull CarContext carContext)
{ {
TAG = getClass().getSimpleName();
mCarContext = carContext; mCarContext = carContext;
} }

View File

@@ -46,7 +46,7 @@ public class CategoriesScreen extends BaseMapScreen
@NonNull @NonNull
@Override @Override
public Template onGetTemplate() protected Template onGetTemplateImpl()
{ {
final MapWithContentTemplate.Builder builder = new MapWithContentTemplate.Builder(); final MapWithContentTemplate.Builder builder = new MapWithContentTemplate.Builder();
builder.setMapController(UiHelpers.createMapController(getCarContext(), getSurfaceRenderer())); builder.setMapController(UiHelpers.createMapController(getCarContext(), getSurfaceRenderer()));

View File

@@ -43,7 +43,7 @@ public class ErrorScreen extends BaseScreen implements UserActionRequired
@NonNull @NonNull
@Override @Override
public Template onGetTemplate() protected Template onGetTemplateImpl()
{ {
final MessageTemplate.Builder builder = new MessageTemplate.Builder(getCarContext().getString(mErrorMessage)); final MessageTemplate.Builder builder = new MessageTemplate.Builder(getCarContext().getString(mErrorMessage));

View File

@@ -22,7 +22,7 @@ public class FreeDriveScreen extends BaseMapScreen
@NonNull @NonNull
@Override @Override
public Template onGetTemplate() protected Template onGetTemplateImpl()
{ {
final NavigationTemplate.Builder builder = new NavigationTemplate.Builder(); final NavigationTemplate.Builder builder = new NavigationTemplate.Builder();
builder.setMapActionStrip(UiHelpers.createMapActionStrip(getCarContext(), getSurfaceRenderer())); builder.setMapActionStrip(UiHelpers.createMapActionStrip(getCarContext(), getSurfaceRenderer()));

View File

@@ -22,7 +22,7 @@ public class MapPlaceholderScreen extends BaseScreen
@NonNull @NonNull
@Override @Override
public Template onGetTemplate() protected Template onGetTemplateImpl()
{ {
final MessageTemplate.Builder builder = final MessageTemplate.Builder builder =
new MessageTemplate.Builder(getCarContext().getString(R.string.car_used_on_the_phone_screen)); new MessageTemplate.Builder(getCarContext().getString(R.string.car_used_on_the_phone_screen));

View File

@@ -31,7 +31,7 @@ public class MapScreen extends BaseMapScreen
@NonNull @NonNull
@Override @Override
public Template onGetTemplate() protected Template onGetTemplateImpl()
{ {
SuggestionsHelpers.updateSuggestions(getCarContext()); SuggestionsHelpers.updateSuggestions(getCarContext());

View File

@@ -70,7 +70,7 @@ public class NavigationScreen extends BaseMapScreen implements RoutingController
@NonNull @NonNull
@Override @Override
public Template onGetTemplate() protected Template onGetTemplateImpl()
{ {
final NavigationTemplate.Builder builder = new NavigationTemplate.Builder(); final NavigationTemplate.Builder builder = new NavigationTemplate.Builder();
builder.setBackgroundColor(Colors.NAVIGATION_TEMPLATE_BACKGROUND); builder.setBackgroundColor(Colors.NAVIGATION_TEMPLATE_BACKGROUND);
@@ -132,7 +132,7 @@ public class NavigationScreen extends BaseMapScreen implements RoutingController
@Override @Override
public void onCreate(@NonNull LifecycleOwner owner) public void onCreate(@NonNull LifecycleOwner owner)
{ {
Logger.d(TAG); super.onCreate(owner);
mRoutingController.attach(this); mRoutingController.attach(this);
ThemeUtils.update(getCarContext()); ThemeUtils.update(getCarContext());
mNavigationManager.setNavigationManagerCallback(this); mNavigationManager.setNavigationManagerCallback(this);
@@ -148,13 +148,14 @@ public class NavigationScreen extends BaseMapScreen implements RoutingController
@Override @Override
public void onResume(@NonNull LifecycleOwner owner) public void onResume(@NonNull LifecycleOwner owner)
{ {
Logger.d(TAG); super.onResume(owner);
mRoutingController.attach(this); mRoutingController.attach(this);
} }
@Override @Override
public void onDestroy(@NonNull LifecycleOwner owner) public void onDestroy(@NonNull LifecycleOwner owner)
{ {
super.onDestroy(owner);
NavigationService.stopService(getCarContext()); NavigationService.stopService(getCarContext());
MwmApplication.from(getCarContext()).getLocationHelper().removeListener(mLocationListener); MwmApplication.from(getCarContext()).getLocationHelper().removeListener(mLocationListener);

View File

@@ -68,7 +68,7 @@ public class PlaceScreen extends BaseMapScreen implements OnBackPressedCallback.
@NonNull @NonNull
@Override @Override
public Template onGetTemplate() protected Template onGetTemplateImpl()
{ {
final MapWithContentTemplate.Builder builder = new MapWithContentTemplate.Builder(); final MapWithContentTemplate.Builder builder = new MapWithContentTemplate.Builder();
builder.setMapController(UiHelpers.createMapController(getCarContext(), getSurfaceRenderer())); builder.setMapController(UiHelpers.createMapController(getCarContext(), getSurfaceRenderer()));
@@ -80,6 +80,7 @@ public class PlaceScreen extends BaseMapScreen implements OnBackPressedCallback.
@Override @Override
public void onCreate(@NonNull LifecycleOwner owner) public void onCreate(@NonNull LifecycleOwner owner)
{ {
super.onCreate(owner);
mRoutingController.restore(); mRoutingController.restore();
if (mRoutingController.isNavigating() && mRoutingController.getLastRouterType() == ROUTER) if (mRoutingController.isNavigating() && mRoutingController.getLastRouterType() == ROUTER)
{ {
@@ -112,12 +113,14 @@ public class PlaceScreen extends BaseMapScreen implements OnBackPressedCallback.
@Override @Override
public void onResume(@NonNull LifecycleOwner owner) public void onResume(@NonNull LifecycleOwner owner)
{ {
super.onResume(owner);
mRoutingController.attach(this); mRoutingController.attach(this);
} }
@Override @Override
public void onDestroy(@NonNull LifecycleOwner owner) public void onDestroy(@NonNull LifecycleOwner owner)
{ {
super.onDestroy(owner);
if (mRoutingController.isPlanning()) if (mRoutingController.isPlanning())
mRoutingController.onSaveState(); mRoutingController.onSaveState();
if (!mRoutingController.isNavigating()) if (!mRoutingController.isNavigating())

View File

@@ -1,15 +1,71 @@
package app.organicmaps.car.screens.base; package app.organicmaps.car.screens.base;
import androidx.annotation.CallSuper;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.car.app.CarContext; import androidx.car.app.CarContext;
import androidx.car.app.Screen; import androidx.car.app.Screen;
import androidx.car.app.model.Template;
import androidx.lifecycle.DefaultLifecycleObserver; import androidx.lifecycle.DefaultLifecycleObserver;
import androidx.lifecycle.LifecycleOwner;
import app.organicmaps.sdk.util.log.Logger;
public abstract class BaseScreen extends Screen implements DefaultLifecycleObserver public abstract class BaseScreen extends Screen implements DefaultLifecycleObserver
{ {
@NonNull
private final String TAG;
public BaseScreen(@NonNull CarContext carContext) public BaseScreen(@NonNull CarContext carContext)
{ {
super(carContext); super(carContext);
TAG = getClass().getSimpleName();
getLifecycle().addObserver(this); getLifecycle().addObserver(this);
} }
@NonNull
protected abstract Template onGetTemplateImpl();
@Override
@NonNull
public final Template onGetTemplate()
{
Logger.d(TAG);
return onGetTemplateImpl();
}
@CallSuper
public void onCreate(@NonNull LifecycleOwner owner)
{
Logger.d(TAG);
}
@CallSuper
public void onStart(@NonNull LifecycleOwner owner)
{
Logger.d(TAG);
}
@CallSuper
public void onResume(@NonNull LifecycleOwner owner)
{
Logger.d(TAG);
}
@CallSuper
public void onPause(@NonNull LifecycleOwner owner)
{
Logger.d(TAG);
}
@CallSuper
public void onStop(@NonNull LifecycleOwner owner)
{
Logger.d(TAG);
}
@CallSuper
public void onDestroy(@NonNull LifecycleOwner owner)
{
Logger.d(TAG);
}
} }

View File

@@ -32,7 +32,7 @@ public class BookmarkCategoriesScreen extends BaseMapScreen
@NonNull @NonNull
@Override @Override
public Template onGetTemplate() protected Template onGetTemplateImpl()
{ {
final MapWithContentTemplate.Builder builder = new MapWithContentTemplate.Builder(); final MapWithContentTemplate.Builder builder = new MapWithContentTemplate.Builder();
builder.setMapController(UiHelpers.createMapController(getCarContext(), getSurfaceRenderer())); builder.setMapController(UiHelpers.createMapController(getCarContext(), getSurfaceRenderer()));

View File

@@ -41,7 +41,7 @@ public class BookmarksScreen extends BaseMapScreen
@NonNull @NonNull
@Override @Override
public Template onGetTemplate() protected Template onGetTemplateImpl()
{ {
final MapWithContentTemplate.Builder builder = new MapWithContentTemplate.Builder(); final MapWithContentTemplate.Builder builder = new MapWithContentTemplate.Builder();
builder.setMapController(UiHelpers.createMapController(getCarContext(), getSurfaceRenderer())); builder.setMapController(UiHelpers.createMapController(getCarContext(), getSurfaceRenderer()));
@@ -52,6 +52,7 @@ public class BookmarksScreen extends BaseMapScreen
@Override @Override
public void onStop(@NonNull LifecycleOwner owner) public void onStop(@NonNull LifecycleOwner owner)
{ {
super.onStop(owner);
if (!mIsOnSortingScreen) if (!mIsOnSortingScreen)
mBookmarksLoader.cancel(); mBookmarksLoader.cancel();
} }

View File

@@ -53,7 +53,7 @@ class SortingScreen extends BaseMapScreen
@NonNull @NonNull
@Override @Override
public Template onGetTemplate() protected Template onGetTemplateImpl()
{ {
final MapWithContentTemplate.Builder builder = new MapWithContentTemplate.Builder(); final MapWithContentTemplate.Builder builder = new MapWithContentTemplate.Builder();
builder.setMapController(UiHelpers.createMapController(getCarContext(), getSurfaceRenderer())); builder.setMapController(UiHelpers.createMapController(getCarContext(), getSurfaceRenderer()));

View File

@@ -23,6 +23,7 @@ class DownloadMapsForFirstLaunchScreen extends DownloadMapsScreen
@Override @Override
public void onResume(@NonNull LifecycleOwner owner) public void onResume(@NonNull LifecycleOwner owner)
{ {
super.onResume(owner);
// Attempting to streamline initial download by including the current country in the list of missing maps for // Attempting to streamline initial download by including the current country in the list of missing maps for
// simultaneous retrieval. // simultaneous retrieval.
final Location location = MwmApplication.from(getCarContext()).getLocationHelper().getSavedLocation(); final Location location = MwmApplication.from(getCarContext()).getLocationHelper().getSavedLocation();

View File

@@ -34,7 +34,7 @@ public abstract class DownloadMapsScreen extends BaseScreen
@NonNull @NonNull
@Override @Override
public final Template onGetTemplate() protected final Template onGetTemplateImpl()
{ {
final MessageTemplate.Builder builder = new MessageTemplate.Builder(getText(getMapsSize(mMissingMaps))); final MessageTemplate.Builder builder = new MessageTemplate.Builder(getText(getMapsSize(mMissingMaps)));
final Header.Builder headerBuilder = new Header.Builder(); final Header.Builder headerBuilder = new Header.Builder();

View File

@@ -102,6 +102,7 @@ class DownloaderScreen extends BaseScreen
@Override @Override
public void onResume(@NonNull LifecycleOwner owner) public void onResume(@NonNull LifecycleOwner owner)
{ {
super.onResume(owner);
if (mSubscriptionSlot == 0) if (mSubscriptionSlot == 0)
mSubscriptionSlot = MapManager.nativeSubscribe(mStorageCallback); mSubscriptionSlot = MapManager.nativeSubscribe(mStorageCallback);
for (final var item : mMissingMaps.entrySet()) for (final var item : mMissingMaps.entrySet())
@@ -114,6 +115,7 @@ class DownloaderScreen extends BaseScreen
@Override @Override
public void onPause(@NonNull LifecycleOwner owner) public void onPause(@NonNull LifecycleOwner owner)
{ {
super.onPause(owner);
if (!mIsDownloadFailed) if (!mIsDownloadFailed)
cancelMapsDownloading(); cancelMapsDownloading();
if (mSubscriptionSlot != 0) if (mSubscriptionSlot != 0)
@@ -125,7 +127,7 @@ class DownloaderScreen extends BaseScreen
@NonNull @NonNull
@Override @Override
public Template onGetTemplate() protected Template onGetTemplateImpl()
{ {
final MessageTemplate.Builder builder = new MessageTemplate.Builder(getText()); final MessageTemplate.Builder builder = new MessageTemplate.Builder(getText());
builder.setLoading(true); builder.setLoading(true);

View File

@@ -37,7 +37,7 @@ public class RequestPermissionsScreenWithApi extends BaseScreen implements UserA
@NonNull @NonNull
@Override @Override
public Template onGetTemplate() protected Template onGetTemplateImpl()
{ {
final MessageTemplate.Builder builder = final MessageTemplate.Builder builder =
new MessageTemplate.Builder(getCarContext().getString(R.string.aa_request_permission_activity_text)); new MessageTemplate.Builder(getCarContext().getString(R.string.aa_request_permission_activity_text));
@@ -63,6 +63,7 @@ public class RequestPermissionsScreenWithApi extends BaseScreen implements UserA
@Override @Override
public void onResume(@NonNull LifecycleOwner owner) public void onResume(@NonNull LifecycleOwner owner)
{ {
super.onResume(owner);
// Let's review the permissions once more, as we might enter this function following an ErrorScreen situation // Let's review the permissions once more, as we might enter this function following an ErrorScreen situation
// where the user manually enabled location permissions. // where the user manually enabled location permissions.
if (LocationUtils.checkFineLocationPermission(getCarContext())) if (LocationUtils.checkFineLocationPermission(getCarContext()))

View File

@@ -47,7 +47,7 @@ public class RequestPermissionsScreenWithNotification extends BaseScreen impleme
@NonNull @NonNull
@Override @Override
public Template onGetTemplate() protected Template onGetTemplateImpl()
{ {
final MessageTemplate.Builder builder = final MessageTemplate.Builder builder =
new MessageTemplate.Builder(getCarContext().getString(R.string.aa_location_permissions_request)); new MessageTemplate.Builder(getCarContext().getString(R.string.aa_location_permissions_request));
@@ -66,6 +66,7 @@ public class RequestPermissionsScreenWithNotification extends BaseScreen impleme
@RequiresPermission(value = Manifest.permission.POST_NOTIFICATIONS) @RequiresPermission(value = Manifest.permission.POST_NOTIFICATIONS)
public void onStart(@NonNull LifecycleOwner owner) public void onStart(@NonNull LifecycleOwner owner)
{ {
super.onStart(owner);
mIsPermissionCheckEnabled = true; mIsPermissionCheckEnabled = true;
mBackgroundExecutor.execute(this::checkPermissions); mBackgroundExecutor.execute(this::checkPermissions);
sendPermissionsRequestNotification(); sendPermissionsRequestNotification();
@@ -74,12 +75,14 @@ public class RequestPermissionsScreenWithNotification extends BaseScreen impleme
@Override @Override
public void onStop(@NonNull LifecycleOwner owner) public void onStop(@NonNull LifecycleOwner owner)
{ {
super.onStop(owner);
mIsPermissionCheckEnabled = false; mIsPermissionCheckEnabled = false;
} }
@Override @Override
public void onDestroy(@NonNull LifecycleOwner owner) public void onDestroy(@NonNull LifecycleOwner owner)
{ {
super.onDestroy(owner);
NotificationManagerCompat.from(getCarContext()).cancel(NOTIFICATION_ID); NotificationManagerCompat.from(getCarContext()).cancel(NOTIFICATION_ID);
} }

View File

@@ -54,7 +54,7 @@ public class SearchOnMapScreen extends BaseMapScreen implements SearchListener
@NonNull @NonNull
@Override @Override
public Template onGetTemplate() protected Template onGetTemplateImpl()
{ {
final MapWithContentTemplate.Builder builder = new MapWithContentTemplate.Builder(); final MapWithContentTemplate.Builder builder = new MapWithContentTemplate.Builder();
builder.setMapController(UiHelpers.createMapController(getCarContext(), getSurfaceRenderer())); builder.setMapController(UiHelpers.createMapController(getCarContext(), getSurfaceRenderer()));
@@ -136,12 +136,14 @@ public class SearchOnMapScreen extends BaseMapScreen implements SearchListener
@Override @Override
public void onStart(@NonNull LifecycleOwner owner) public void onStart(@NonNull LifecycleOwner owner)
{ {
super.onStart(owner);
SearchEngine.INSTANCE.addListener(this); SearchEngine.INSTANCE.addListener(this);
} }
@Override @Override
public void onResume(@NonNull LifecycleOwner owner) public void onResume(@NonNull LifecycleOwner owner)
{ {
super.onResume(owner);
SearchEngine.INSTANCE.cancel(); SearchEngine.INSTANCE.cancel();
final MapObject location = MwmApplication.from(getCarContext()).getLocationHelper().getMyPosition(); final MapObject location = MwmApplication.from(getCarContext()).getLocationHelper().getMyPosition();
@@ -156,6 +158,7 @@ public class SearchOnMapScreen extends BaseMapScreen implements SearchListener
@Override @Override
public void onStop(@NonNull LifecycleOwner owner) public void onStop(@NonNull LifecycleOwner owner)
{ {
super.onStop(owner);
SearchEngine.INSTANCE.removeListener(this); SearchEngine.INSTANCE.removeListener(this);
SearchEngine.INSTANCE.cancel(); SearchEngine.INSTANCE.cancel();
} }

View File

@@ -50,7 +50,7 @@ public class SearchScreen extends BaseMapScreen implements SearchTemplate.Search
@NonNull @NonNull
@Override @Override
public Template onGetTemplate() protected Template onGetTemplateImpl()
{ {
final SearchTemplate.Builder builder = new SearchTemplate.Builder(this); final SearchTemplate.Builder builder = new SearchTemplate.Builder(this);
builder.setHeaderAction(Action.BACK); builder.setHeaderAction(Action.BACK);
@@ -106,12 +106,14 @@ public class SearchScreen extends BaseMapScreen implements SearchTemplate.Search
@Override @Override
public void onStart(@NonNull LifecycleOwner owner) public void onStart(@NonNull LifecycleOwner owner)
{ {
super.onStart(owner);
SearchEngine.INSTANCE.addListener(this); SearchEngine.INSTANCE.addListener(this);
} }
@Override @Override
public void onStop(@NonNull LifecycleOwner owner) public void onStop(@NonNull LifecycleOwner owner)
{ {
super.onStop(owner);
SearchEngine.INSTANCE.removeListener(this); SearchEngine.INSTANCE.removeListener(this);
SearchEngine.INSTANCE.cancel(); SearchEngine.INSTANCE.cancel();
} }

View File

@@ -45,7 +45,7 @@ public class DrivingOptionsScreen extends BaseMapScreen
@NonNull @NonNull
@Override @Override
public Template onGetTemplate() protected Template onGetTemplateImpl()
{ {
final MapWithContentTemplate.Builder builder = new MapWithContentTemplate.Builder(); final MapWithContentTemplate.Builder builder = new MapWithContentTemplate.Builder();
builder.setMapController(UiHelpers.createMapController(getCarContext(), getSurfaceRenderer())); builder.setMapController(UiHelpers.createMapController(getCarContext(), getSurfaceRenderer()));
@@ -56,6 +56,7 @@ public class DrivingOptionsScreen extends BaseMapScreen
@Override @Override
public void onStop(@NonNull LifecycleOwner owner) public void onStop(@NonNull LifecycleOwner owner)
{ {
super.onStop(owner);
for (final DrivingOption drivingOption : mDrivingOptions) for (final DrivingOption drivingOption : mDrivingOptions)
{ {
if (Boolean.TRUE.equals(mInitialDrivingOptionsState.get(drivingOption.roadType)) if (Boolean.TRUE.equals(mInitialDrivingOptionsState.get(drivingOption.roadType))

View File

@@ -27,7 +27,7 @@ public class HelpScreen extends BaseMapScreen
@NonNull @NonNull
@Override @Override
public Template onGetTemplate() protected Template onGetTemplateImpl()
{ {
final MapWithContentTemplate.Builder builder = new MapWithContentTemplate.Builder(); final MapWithContentTemplate.Builder builder = new MapWithContentTemplate.Builder();
builder.setMapController(UiHelpers.createMapController(getCarContext(), getSurfaceRenderer())); builder.setMapController(UiHelpers.createMapController(getCarContext(), getSurfaceRenderer()));

View File

@@ -40,7 +40,7 @@ public class SettingsScreen extends BaseMapScreen
@NonNull @NonNull
@Override @Override
public Template onGetTemplate() protected Template onGetTemplateImpl()
{ {
final MapWithContentTemplate.Builder builder = new MapWithContentTemplate.Builder(); final MapWithContentTemplate.Builder builder = new MapWithContentTemplate.Builder();
builder.setMapController(UiHelpers.createMapController(getCarContext(), getSurfaceRenderer())); builder.setMapController(UiHelpers.createMapController(getCarContext(), getSurfaceRenderer()));

View File

@@ -35,7 +35,7 @@ public class ThemeScreen extends BaseMapScreen
@NonNull @NonNull
@Override @Override
public Template onGetTemplate() protected Template onGetTemplateImpl()
{ {
final MapWithContentTemplate.Builder builder = new MapWithContentTemplate.Builder(); final MapWithContentTemplate.Builder builder = new MapWithContentTemplate.Builder();
builder.setMapController(UiHelpers.createMapController(getCarContext(), getSurfaceRenderer())); builder.setMapController(UiHelpers.createMapController(getCarContext(), getSurfaceRenderer()));