From ccd6b59d25ab4c26ac68a7deb248ca0fdb63a301 Mon Sep 17 00:00:00 2001 From: Andrew Shkrob Date: Wed, 4 Oct 2023 19:43:07 +0200 Subject: [PATCH] [android-auto] Navigation Screen refactoring Signed-off-by: Andrew Shkrob --- .../car/screens/NavigationScreen.java | 38 +++++++++++-------- .../organicmaps/car/util/RoutingUtils.java | 17 +-------- data/strings/strings.txt | 2 +- 3 files changed, 25 insertions(+), 32 deletions(-) diff --git a/android/app/src/main/java/app/organicmaps/car/screens/NavigationScreen.java b/android/app/src/main/java/app/organicmaps/car/screens/NavigationScreen.java index 96ecaa7fd8..11aad9045b 100644 --- a/android/app/src/main/java/app/organicmaps/car/screens/NavigationScreen.java +++ b/android/app/src/main/java/app/organicmaps/car/screens/NavigationScreen.java @@ -53,6 +53,14 @@ public class NavigationScreen extends BaseMapScreen implements RoutingController @NonNull private final LocationListener mLocationListener = (unused) -> updateTrip(); + @NonNull + private Trip mTrip = new Trip.Builder().setLoading(true).build(); + + // This value is used to decide whether to display the "trip finished" toast or not + // False: trip is finished -> show toast + // True: navigation is cancelled by the user or host -> don't show toast + private boolean mNavigationCancelled = false; + private NavigationScreen(@NonNull Builder builder) { super(builder.mCarContext, builder.mSurfaceRenderer); @@ -81,14 +89,15 @@ public class NavigationScreen extends BaseMapScreen implements RoutingController public void onStopNavigation() { LocationHelper.from(getCarContext()).removeListener(mLocationListener); + mNavigationCancelled = true; mRoutingController.cancel(); } @Override public void onNavigationCancelled() { - // TODO (AndrewShkrob): Add localized string. - CarToast.makeText(getCarContext(), "Navigation finished", CarToast.LENGTH_LONG).show(); + if (!mNavigationCancelled) + CarToast.makeText(getCarContext(), getCarContext().getString(R.string.trip_finished), CarToast.LENGTH_LONG).show(); finish(); getScreenManager().popToRoot(); } @@ -126,15 +135,17 @@ public class NavigationScreen extends BaseMapScreen implements RoutingController ThemeUtils.update(getCarContext()); mNavigationManager.navigationEnded(); mNavigationManager.clearNavigationManagerCallback(); - RoutingUtils.resetTrip(); } @NonNull private ActionStrip createActionStrip() { final Action.Builder stopActionBuilder = new Action.Builder(); - stopActionBuilder.setTitle(getCarContext().getString(R.string.current_location_unknown_stop_button)); - stopActionBuilder.setOnClickListener(mRoutingController::cancel); + stopActionBuilder.setIcon(new CarIcon.Builder(IconCompat.createWithResource(getCarContext(), R.drawable.ic_close)).build()); + stopActionBuilder.setOnClickListener(() -> { + mNavigationCancelled = true; + mRoutingController.cancel(); + }); final ActionStrip.Builder builder = new ActionStrip.Builder(); builder.addAction(createTtsAction()); @@ -146,12 +157,10 @@ public class NavigationScreen extends BaseMapScreen implements RoutingController @Nullable private TravelEstimate getDestinationTravelEstimate() { - final Trip trip = RoutingUtils.getLastTrip(); - - if (trip.isLoading()) + if (mTrip.isLoading()) return null; - List travelEstimates = trip.getDestinationTravelEstimates(); + List travelEstimates = mTrip.getDestinationTravelEstimates(); if (travelEstimates.size() != 1) throw new RuntimeException("TravelEstimates size must be 1"); @@ -162,16 +171,15 @@ public class NavigationScreen extends BaseMapScreen implements RoutingController private NavigationTemplate.NavigationInfo getNavigationInfo() { final androidx.car.app.navigation.model.RoutingInfo.Builder builder = new androidx.car.app.navigation.model.RoutingInfo.Builder(); - final Trip trip = RoutingUtils.getLastTrip(); - if (trip.isLoading()) + if (mTrip.isLoading()) { builder.setLoading(true); return builder.build(); } - final List steps = trip.getSteps(); - final List stepsEstimates = trip.getStepTravelEstimates(); + final List steps = mTrip.getSteps(); + final List stepsEstimates = mTrip.getStepTravelEstimates(); if (steps.isEmpty()) throw new RuntimeException("Steps size must be at least 1"); @@ -208,8 +216,8 @@ public class NavigationScreen extends BaseMapScreen implements RoutingController private void updateTrip() { final RoutingInfo info = Framework.nativeGetRouteFollowingInfo(); - final Trip trip = RoutingUtils.createTrip(getCarContext(), info, RoutingController.get().getEndPoint()); - mNavigationManager.updateTrip(trip); + mTrip = RoutingUtils.createTrip(getCarContext(), info, RoutingController.get().getEndPoint()); + mNavigationManager.updateTrip(mTrip); invalidate(); } diff --git a/android/app/src/main/java/app/organicmaps/car/util/RoutingUtils.java b/android/app/src/main/java/app/organicmaps/car/util/RoutingUtils.java index eafaa258d6..0013c78a32 100644 --- a/android/app/src/main/java/app/organicmaps/car/util/RoutingUtils.java +++ b/android/app/src/main/java/app/organicmaps/car/util/RoutingUtils.java @@ -25,22 +25,8 @@ import java.util.Objects; public final class RoutingUtils { - @NonNull - private static Trip mCachedTrip = new Trip.Builder().setLoading(true).build(); - private RoutingUtils() {} - @NonNull - public static Trip getLastTrip() - { - return mCachedTrip; - } - - public static void resetTrip() - { - mCachedTrip = new Trip.Builder().setLoading(true).build(); - } - @NonNull public static Trip createTrip(@NonNull final CarContext context, @Nullable final RoutingInfo info, @Nullable MapObject endPoint) { @@ -70,8 +56,7 @@ public final class RoutingUtils builder.addStep(createCurrentStep(context, info), createTravelEstimate(info.distToTurn, 0)); if (!TextUtils.isEmpty(info.nextStreet)) builder.addStep(createNextStep(context, info), createTravelEstimate(app.organicmaps.util.Distance.EMPTY, 0)); - mCachedTrip = builder.build(); - return mCachedTrip; + return builder.build(); } @NonNull diff --git a/data/strings/strings.txt b/data/strings/strings.txt index 26cf61256c..a6438e9832 100644 --- a/data/strings/strings.txt +++ b/data/strings/strings.txt @@ -22888,7 +22888,7 @@ tr = Yok [trip_finished] - tags = ios + tags = android,ios en = You have arrived! af = U het aangekom! ar = لقد وصلت!