Skip to content

Commit 6c6123b

Browse files
feat: support navigation disposal on app exit on android (#308)
Co-authored-by: Joonas Kerttula <[email protected]>
1 parent 8397699 commit 6c6123b

File tree

6 files changed

+51
-12
lines changed

6 files changed

+51
-12
lines changed

android/src/main/java/com/google/android/react/navsdk/EnumTranslationUtil.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,14 @@ public static AlternateRoutesStrategy getAlternateRoutesStrategyFromJsValue(int
4343
}
4444
}
4545

46+
public static @Navigator.TaskRemovedBehavior int getTaskRemovedBehaviourFromJsValue(int jsValue) {
47+
return switch (jsValue) {
48+
case 0 -> Navigator.TaskRemovedBehavior.CONTINUE_SERVICE;
49+
case 1 -> Navigator.TaskRemovedBehavior.QUIT_SERVICE;
50+
default -> Navigator.TaskRemovedBehavior.CONTINUE_SERVICE;
51+
};
52+
}
53+
4654
public static int getMapTypeFromJsValue(int jsValue) {
4755
switch (jsValue) {
4856
case 1:

android/src/main/java/com/google/android/react/navsdk/NavModule.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ public class NavModule extends ReactContextBaseJavaModule implements INavigation
7575
private boolean mIsListeningRoadSnappedLocation = false;
7676

7777
private HashMap<String, Object> tocParamsMap;
78+
private @Navigator.TaskRemovedBehavior int taskRemovedBehaviour;
7879

7980
public interface ModuleReadyListener {
8081
void onModuleReady();
@@ -216,8 +217,12 @@ private void cleanup() {
216217
}
217218

218219
@ReactMethod
219-
public void initializeNavigator(@Nullable ReadableMap tocParams) {
220+
public void initializeNavigator(
221+
@Nullable ReadableMap tocParams, int taskRemovedBehaviourJsValue) {
220222
this.tocParamsMap = tocParams.toHashMap();
223+
this.taskRemovedBehaviour =
224+
EnumTranslationUtil.getTaskRemovedBehaviourFromJsValue(taskRemovedBehaviourJsValue);
225+
221226
if (getTermsAccepted()) {
222227
initializeNavigationApi();
223228
} else {
@@ -270,6 +275,7 @@ private void initializeNavigationApi() {
270275
public void onNavigatorReady(Navigator navigator) {
271276
// Keep a reference to the Navigator (used to configure and start nav)
272277
mNavigator = navigator;
278+
mNavigator.setTaskRemovedBehavior(taskRemovedBehaviour);
273279
mRoadSnappedLocationProvider =
274280
NavigationApi.getRoadSnappedLocationProvider(getCurrentActivity().getApplication());
275281
onNavigationReady();

example/src/App.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import NavigationScreen from './screens/NavigationScreen';
2626
import MultipleMapsScreen from './screens/MultipleMapsScreen';
2727
import {
2828
NavigationProvider,
29+
TaskRemovedBehavior,
2930
type TermsAndConditionsDialogOptions,
3031
} from '@googlemaps/react-native-navigation-sdk';
3132

@@ -67,6 +68,7 @@ export default function App() {
6768
return (
6869
<NavigationProvider
6970
termsAndConditionsDialogOptions={termsAndConditionsDialogOptions}
71+
taskRemovedBehavior={TaskRemovedBehavior.CONTINUE_SERVICE}
7072
>
7173
<NavigationContainer>
7274
<Stack.Navigator initialRouteName="Home">

src/navigation/navigation/NavigationProvider.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import type {
1919
NavigationController,
2020
NavigationCallbacks,
2121
TermsAndConditionsDialogOptions,
22+
TaskRemovedBehavior,
2223
} from './types';
2324
import { useNavigationController } from './useNavigationController';
2425

@@ -34,15 +35,20 @@ const NavigationContext = createContext<NavigationContextProps | undefined>(
3435

3536
interface NavigationProviderProps {
3637
termsAndConditionsDialogOptions: TermsAndConditionsDialogOptions;
38+
taskRemovedBehavior?: TaskRemovedBehavior;
3739
children: ReactNode;
3840
}
3941

4042
export const NavigationProvider = ({
4143
termsAndConditionsDialogOptions,
44+
taskRemovedBehavior,
4245
children,
4346
}: NavigationProviderProps) => {
4447
const { navigationController, addListeners, removeListeners } =
45-
useNavigationController(termsAndConditionsDialogOptions);
48+
useNavigationController(
49+
termsAndConditionsDialogOptions,
50+
taskRemovedBehavior
51+
);
4652
return (
4753
<NavigationContext.Provider
4854
value={{

src/navigation/navigation/types.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,16 @@ export interface NavigationController {
392392
readonly simulator: Simulator;
393393
}
394394

395+
/**
396+
* Defines how application should behave when a application task is removed.
397+
*/
398+
export enum TaskRemovedBehavior {
399+
/** The default state, indicating that navigation guidance, location updates, and notification should persist after user removes the application task. */
400+
CONTINUE_SERVICE = 0,
401+
/** Indicates that navigation guidance, location updates, and notification should shut down immediately when the user removes the application task. */
402+
QUIT_SERVICE,
403+
}
404+
395405
/**
396406
* Defines the turn-by-turn event data.
397407
*/

src/navigation/navigation/useNavigationController.ts

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,14 @@ import type {
2222
RouteSegment,
2323
TimeAndDistance,
2424
} from '../types';
25-
import type {
26-
NavigationCallbacks,
27-
TermsAndConditionsDialogOptions,
28-
NavigationController,
29-
RoutingOptions,
30-
SpeedAlertOptions,
31-
LocationSimulationOptions,
25+
import {
26+
type NavigationCallbacks,
27+
type TermsAndConditionsDialogOptions,
28+
type NavigationController,
29+
type RoutingOptions,
30+
type SpeedAlertOptions,
31+
type LocationSimulationOptions,
32+
TaskRemovedBehavior,
3233
} from './types';
3334
import { getRouteStatusFromStringValue } from '../navigationView';
3435
import { useMemo } from 'react';
@@ -37,7 +38,8 @@ const { NavModule, NavEventDispatcher } = NativeModules;
3738
const androidBridge: string = 'NavJavascriptBridge';
3839

3940
export const useNavigationController = (
40-
termsAndConditionsDialogOptions: TermsAndConditionsDialogOptions
41+
termsAndConditionsDialogOptions: TermsAndConditionsDialogOptions,
42+
taskRemovedBehavior: TaskRemovedBehavior = TaskRemovedBehavior.CONTINUE_SERVICE
4143
): {
4244
navigationController: NavigationController;
4345
addListeners: (listeners: Partial<NavigationCallbacks>) => void;
@@ -79,7 +81,8 @@ export const useNavigationController = (
7981
() => ({
8082
init: async () => {
8183
return await NavModule.initializeNavigator(
82-
termsAndConditionsDialogOptions
84+
termsAndConditionsDialogOptions,
85+
taskRemovedBehavior
8386
);
8487
},
8588

@@ -192,7 +195,11 @@ export const useNavigationController = (
192195
},
193196
},
194197
}),
195-
[moduleListenersHandler, termsAndConditionsDialogOptions]
198+
[
199+
moduleListenersHandler,
200+
taskRemovedBehavior,
201+
termsAndConditionsDialogOptions,
202+
]
196203
);
197204

198205
return {

0 commit comments

Comments
 (0)