From a580c19dc0c3d0859a85725cd04989371381f7a6 Mon Sep 17 00:00:00 2001 From: Andrei Shkrob Date: Sun, 3 Aug 2025 15:05:32 +0200 Subject: [PATCH] [android-auto] Fix null pointer exception Signed-off-by: Andrei Shkrob --- .../src/main/java/app/organicmaps/MapFragment.java | 6 +++--- .../java/app/organicmaps/car/SurfaceRenderer.java | 4 ++-- .../app/src/main/java/app/organicmaps/sdk/Map.java | 14 ++++++++++---- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/android/app/src/main/java/app/organicmaps/MapFragment.java b/android/app/src/main/java/app/organicmaps/MapFragment.java index b76d97292..7bfa884d5 100644 --- a/android/app/src/main/java/app/organicmaps/MapFragment.java +++ b/android/app/src/main/java/app/organicmaps/MapFragment.java @@ -24,9 +24,8 @@ public class MapFragment extends BaseMwmFragment implements View.OnTouchListener { private static final String TAG = MapFragment.class.getSimpleName(); - @SuppressWarnings("NonNullFieldNotInitialized") @NonNull - private Map mMap; + private final Map mMap = new Map(DisplayType.Device); public void updateCompassOffset(int offsetX, int offsetY) { @@ -87,7 +86,8 @@ public class MapFragment extends BaseMwmFragment implements View.OnTouchListener { Logger.d(TAG); super.onAttach(context); - mMap = new Map(DisplayType.Device, MwmApplication.from(requireContext()).getLocationHelper()); + + mMap.setLocationHelper(MwmApplication.from(requireContext()).getLocationHelper()); mMap.setMapRenderingListener((MapRenderingListener) context); mMap.setCallbackUnsupported(this::reportUnsupported); } diff --git a/android/app/src/main/java/app/organicmaps/car/SurfaceRenderer.java b/android/app/src/main/java/app/organicmaps/car/SurfaceRenderer.java index 2855afbe6..810dff898 100644 --- a/android/app/src/main/java/app/organicmaps/car/SurfaceRenderer.java +++ b/android/app/src/main/java/app/organicmaps/car/SurfaceRenderer.java @@ -31,7 +31,7 @@ public class SurfaceRenderer implements DefaultLifecycleObserver, SurfaceCallbac private final CarContext mCarContext; @NonNull - private final Map mMap; + private final Map mMap = new Map(Car); @NonNull private Rect mVisibleArea = new Rect(); @@ -45,7 +45,6 @@ public class SurfaceRenderer implements DefaultLifecycleObserver, SurfaceCallbac { Logger.d(TAG, "SurfaceRenderer()"); mCarContext = carContext; - mMap = new Map(Car, MwmApplication.from(mCarContext).getLocationHelper()); mIsRunning = true; lifecycle.addObserver(this); mMap.setMapRenderingListener(this); @@ -60,6 +59,7 @@ public class SurfaceRenderer implements DefaultLifecycleObserver, SurfaceCallbac mSurface.release(); mSurface = surfaceContainer.getSurface(); + mMap.setLocationHelper(MwmApplication.from(mCarContext).getLocationHelper()); mMap.onSurfaceCreated(mCarContext, mSurface, new Rect(0, 0, surfaceContainer.getWidth(), surfaceContainer.getHeight()), surfaceContainer.getDpi()); diff --git a/android/app/src/main/java/app/organicmaps/sdk/Map.java b/android/app/src/main/java/app/organicmaps/sdk/Map.java index f5dce6179..cc3e3fdac 100644 --- a/android/app/src/main/java/app/organicmaps/sdk/Map.java +++ b/android/app/src/main/java/app/organicmaps/sdk/Map.java @@ -56,8 +56,8 @@ public final class Map @NonNull private final DisplayType mDisplayType; - @NonNull - private final LocationHelper mLocationHelper; + @Nullable + private LocationHelper mLocationHelper; private int mCurrentCompassOffsetX; private int mCurrentCompassOffsetY; @@ -79,13 +79,17 @@ public final class Map private static int sCurrentDpi = 0; - public Map(@NonNull DisplayType mapType, @NonNull LocationHelper locationHelper) + public Map(@NonNull DisplayType mapType) { mDisplayType = mapType; - mLocationHelper = locationHelper; onCreate(false); } + public void setLocationHelper(@NonNull LocationHelper locationHelper) + { + mLocationHelper = locationHelper; + } + /** * Moves the map compass using the given offsets. * @@ -142,6 +146,8 @@ public final class Map public void onSurfaceCreated(final Context context, final Surface surface, Rect surfaceFrame, int surfaceDpi) { + assert mLocationHelper != null : "LocationHelper must be initialized before calling onSurfaceCreated"; + if (isThemeChangingProcess(context)) { Logger.d(TAG, "Theme changing process, skip 'onSurfaceCreated' callback");