From c621a8be14c053086fa83cc7be9888ac40cd16dc Mon Sep 17 00:00:00 2001 From: Joseph Pender Date: Thu, 24 Jul 2025 16:15:37 -0500 Subject: [PATCH 01/16] Adding togglePredictiveBack function --- app/README.md | 27 +++++++++++++++++++ .../capacitorjs/plugins/app/AppPlugin.java | 18 +++++++++++++ app/src/definitions.ts | 13 +++++++++ app/src/web.ts | 4 +++ 4 files changed, 62 insertions(+) diff --git a/app/README.md b/app/README.md index aa136f6ae..c2846326d 100644 --- a/app/README.md +++ b/app/README.md @@ -76,6 +76,7 @@ const checkAppLaunchUrl = async () => { * [`getState()`](#getstate) * [`getLaunchUrl()`](#getlaunchurl) * [`minimizeApp()`](#minimizeapp) +* [`togglePredictiveBack(...)`](#togglepredictiveback) * [`addListener('appStateChange', ...)`](#addlistenerappstatechange-) * [`addListener('pause', ...)`](#addlistenerpause-) * [`addListener('resume', ...)`](#addlistenerresume-) @@ -167,6 +168,25 @@ Only available for Android. -------------------- +### togglePredictiveBack(...) + +```typescript +togglePredictiveBack(options: TogglePredictiveBackOptions) => Promise +``` + +Toggles support for Android's predictive back button support. + +Only available for Android. + +| Param | Type | +| ------------- | ----------------------------------------------------------------------------------- | +| **`options`** | TogglePredictiveBackOptions | + +**Since:** 8.0.0 + +-------------------- + + ### addListener('appStateChange', ...) ```typescript @@ -364,6 +384,13 @@ Remove all native listeners for this plugin | **`url`** | string | The url used to open the app. | 1.0.0 | +#### TogglePredictiveBackOptions + +| Prop | Type | +| ------------- | -------------------- | +| **`enabled`** | boolean | + + #### PluginListenerHandle | Prop | Type | diff --git a/app/android/src/main/java/com/capacitorjs/plugins/app/AppPlugin.java b/app/android/src/main/java/com/capacitorjs/plugins/app/AppPlugin.java index 0ca7fa152..c85e01ea2 100644 --- a/app/android/src/main/java/com/capacitorjs/plugins/app/AppPlugin.java +++ b/app/android/src/main/java/com/capacitorjs/plugins/app/AppPlugin.java @@ -25,6 +25,8 @@ public class AppPlugin extends Plugin { private static final String EVENT_RESUME = "resume"; private boolean hasPausedEver = false; + private OnBackPressedCallback onbackPressedCallback; + public void load() { bridge .getApp() @@ -59,7 +61,10 @@ public void handleOnBackPressed() { } } }; + getActivity().getOnBackPressedDispatcher().addCallback(getActivity(), callback); + + this.onbackPressedCallback = callback; } @PluginMethod @@ -112,6 +117,19 @@ public void minimizeApp(PluginCall call) { call.resolve(); } + @PluginMethod + public void togglePredictiveBack(PluginCall call) { + if (this.onbackPressedCallback == null) { + call.resolve(); + return; + } + + Boolean enabled = call.getBoolean("enabled"); + + this.onbackPressedCallback.setEnabled(!enabled); + call.resolve(); + } + /** * Handle ACTION_VIEW intents to store a URL that was used to open the app * @param intent diff --git a/app/src/definitions.ts b/app/src/definitions.ts index ff8324896..9736d43c0 100644 --- a/app/src/definitions.ts +++ b/app/src/definitions.ts @@ -125,6 +125,10 @@ export interface BackButtonListenerEvent { canGoBack: boolean; } +export interface TogglePredictiveBackOptions { + enabled: boolean; +} + export type StateChangeListener = (state: AppState) => void; export type URLOpenListener = (event: URLOpenListenerEvent) => void; export type RestoredListener = (event: RestoredListenerEvent) => void; @@ -171,6 +175,15 @@ export interface AppPlugin { */ minimizeApp(): Promise; + /** + * Toggles support for Android's predictive back button support. + * + * Only available for Android. + * + * @since 8.0.0 + */ + togglePredictiveBack(options: TogglePredictiveBackOptions): Promise; + /** * Listen for changes in the app or the activity states. * diff --git a/app/src/web.ts b/app/src/web.ts index 1db1ff356..b4ef9c7ee 100644 --- a/app/src/web.ts +++ b/app/src/web.ts @@ -32,6 +32,10 @@ export class AppWeb extends WebPlugin implements AppPlugin { throw this.unimplemented('Not implemented on web.'); } + async togglePredictiveBack(): Promise { + throw this.unimplemented('Not implemented on web.'); + } + private handleVisibilityChange = () => { const data = { isActive: document.hidden !== true, From 72cbebac2f74764470a4994503c462673ebd1b93 Mon Sep 17 00:00:00 2001 From: Joseph Pender Date: Thu, 24 Jul 2025 16:54:01 -0500 Subject: [PATCH 02/16] Refining documentation --- app/README.md | 12 +++++++----- app/src/definitions.ts | 11 +++++++++-- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/app/README.md b/app/README.md index c2846326d..34579e0e4 100644 --- a/app/README.md +++ b/app/README.md @@ -174,9 +174,11 @@ Only available for Android. togglePredictiveBack(options: TogglePredictiveBackOptions) => Promise ``` -Toggles support for Android's predictive back button support. +Toggles support for Android's predictive back gesture. -Only available for Android. +Enabling this will disable this plugin's `backButton` listener. + +Only available for Android 15+. | Param | Type | | ------------- | ----------------------------------------------------------------------------------- | @@ -386,9 +388,9 @@ Remove all native listeners for this plugin #### TogglePredictiveBackOptions -| Prop | Type | -| ------------- | -------------------- | -| **`enabled`** | boolean | +| Prop | Type | Description | Since | +| ------------- | -------------------- | ----------------------------------------------------------------------- | ----- | +| **`enabled`** | boolean | Indicates whether to enable or disable predictive back gesture support. | 8.0.0 | #### PluginListenerHandle diff --git a/app/src/definitions.ts b/app/src/definitions.ts index 9736d43c0..44b1a705d 100644 --- a/app/src/definitions.ts +++ b/app/src/definitions.ts @@ -126,6 +126,11 @@ export interface BackButtonListenerEvent { } export interface TogglePredictiveBackOptions { + /** + * Indicates whether to enable or disable predictive back gesture support. + * + * @since 8.0.0 + */ enabled: boolean; } @@ -176,9 +181,11 @@ export interface AppPlugin { minimizeApp(): Promise; /** - * Toggles support for Android's predictive back button support. + * Toggles support for Android's predictive back gesture. * - * Only available for Android. + * Enabling this will disable this plugin's `backButton` listener. + * + * Only available for Android 15+. * * @since 8.0.0 */ From 1b48812ff9d6e9ebf8aa3451cbd1bc68e4965ec2 Mon Sep 17 00:00:00 2001 From: Joseph Pender Date: Fri, 25 Jul 2025 14:57:53 -0500 Subject: [PATCH 03/16] Adding unimplemented togglePredictiveBack method to iOS --- app/ios/Sources/AppPlugin/AppPlugin.swift | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/ios/Sources/AppPlugin/AppPlugin.swift b/app/ios/Sources/AppPlugin/AppPlugin.swift index 0f6086507..e36d9c8f6 100644 --- a/app/ios/Sources/AppPlugin/AppPlugin.swift +++ b/app/ios/Sources/AppPlugin/AppPlugin.swift @@ -10,7 +10,8 @@ public class AppPlugin: CAPPlugin, CAPBridgedPlugin { CAPPluginMethod(name: "getInfo", returnType: CAPPluginReturnPromise), CAPPluginMethod(name: "getLaunchUrl", returnType: CAPPluginReturnPromise), CAPPluginMethod(name: "getState", returnType: CAPPluginReturnPromise), - CAPPluginMethod(name: "minimizeApp", returnType: CAPPluginReturnPromise) + CAPPluginMethod(name: "minimizeApp", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "togglePredictiveBack", returnType: CAPPluginReturnPromise) ] private var observers: [NSObjectProtocol] = [] @@ -113,4 +114,8 @@ public class AppPlugin: CAPPlugin, CAPBridgedPlugin { @objc func minimizeApp(_ call: CAPPluginCall) { call.unimplemented() } + + @objc func togglePredictiveBack(_ call: CAPPluginCall) { + call.unimplemented() + } } From 412af44396c5aeb0fecd48400897bd738bfc14ff Mon Sep 17 00:00:00 2001 From: Joseph Pender Date: Fri, 25 Jul 2025 14:58:18 -0500 Subject: [PATCH 04/16] fmt --- .../src/main/java/com/capacitorjs/plugins/app/AppPlugin.java | 2 +- app/ios/Sources/AppPlugin/AppPlugin.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/android/src/main/java/com/capacitorjs/plugins/app/AppPlugin.java b/app/android/src/main/java/com/capacitorjs/plugins/app/AppPlugin.java index c85e01ea2..53b5c90b0 100644 --- a/app/android/src/main/java/com/capacitorjs/plugins/app/AppPlugin.java +++ b/app/android/src/main/java/com/capacitorjs/plugins/app/AppPlugin.java @@ -26,7 +26,7 @@ public class AppPlugin extends Plugin { private boolean hasPausedEver = false; private OnBackPressedCallback onbackPressedCallback; - + public void load() { bridge .getApp() diff --git a/app/ios/Sources/AppPlugin/AppPlugin.swift b/app/ios/Sources/AppPlugin/AppPlugin.swift index e36d9c8f6..ea7fc17b8 100644 --- a/app/ios/Sources/AppPlugin/AppPlugin.swift +++ b/app/ios/Sources/AppPlugin/AppPlugin.swift @@ -114,7 +114,7 @@ public class AppPlugin: CAPPlugin, CAPBridgedPlugin { @objc func minimizeApp(_ call: CAPPluginCall) { call.unimplemented() } - + @objc func togglePredictiveBack(_ call: CAPPluginCall) { call.unimplemented() } From 53d9457ef79c90ab86424ab8a01c9ed5096cfa40 Mon Sep 17 00:00:00 2001 From: Joseph Pender Date: Thu, 31 Jul 2025 09:21:06 -0500 Subject: [PATCH 05/16] code refinements --- .../src/main/java/com/capacitorjs/plugins/app/AppPlugin.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/android/src/main/java/com/capacitorjs/plugins/app/AppPlugin.java b/app/android/src/main/java/com/capacitorjs/plugins/app/AppPlugin.java index 53b5c90b0..dc445142f 100644 --- a/app/android/src/main/java/com/capacitorjs/plugins/app/AppPlugin.java +++ b/app/android/src/main/java/com/capacitorjs/plugins/app/AppPlugin.java @@ -46,7 +46,7 @@ public void load() { notifyListeners(EVENT_RESTORED_RESULT, result.getWrappedResult(), true); } ); - OnBackPressedCallback callback = new OnBackPressedCallback(true) { + this.onbackPressedCallback = new OnBackPressedCallback(true) { @Override public void handleOnBackPressed() { if (!hasListeners(EVENT_BACK_BUTTON)) { @@ -62,9 +62,8 @@ public void handleOnBackPressed() { } }; - getActivity().getOnBackPressedDispatcher().addCallback(getActivity(), callback); + getActivity().getOnBackPressedDispatcher().addCallback(getActivity(), this.onbackPressedCallback); - this.onbackPressedCallback = callback; } @PluginMethod From ddceb59c5a263c56b21e1b365e7e0ebce31488c7 Mon Sep 17 00:00:00 2001 From: Joseph Pender Date: Thu, 31 Jul 2025 09:28:18 -0500 Subject: [PATCH 06/16] reject if callback is not set --- .../src/main/java/com/capacitorjs/plugins/app/AppPlugin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/android/src/main/java/com/capacitorjs/plugins/app/AppPlugin.java b/app/android/src/main/java/com/capacitorjs/plugins/app/AppPlugin.java index dc445142f..6f62fc546 100644 --- a/app/android/src/main/java/com/capacitorjs/plugins/app/AppPlugin.java +++ b/app/android/src/main/java/com/capacitorjs/plugins/app/AppPlugin.java @@ -119,7 +119,7 @@ public void minimizeApp(PluginCall call) { @PluginMethod public void togglePredictiveBack(PluginCall call) { if (this.onbackPressedCallback == null) { - call.resolve(); + call.reject("onbackPressedCallback is not set"); return; } From eea84f425b09bd7ec3952a620ce60a8b6e2f84d3 Mon Sep 17 00:00:00 2001 From: Joseph Pender Date: Thu, 31 Jul 2025 09:33:00 -0500 Subject: [PATCH 07/16] typos --- .../java/com/capacitorjs/plugins/app/AppPlugin.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/android/src/main/java/com/capacitorjs/plugins/app/AppPlugin.java b/app/android/src/main/java/com/capacitorjs/plugins/app/AppPlugin.java index 6f62fc546..7aa15ffb1 100644 --- a/app/android/src/main/java/com/capacitorjs/plugins/app/AppPlugin.java +++ b/app/android/src/main/java/com/capacitorjs/plugins/app/AppPlugin.java @@ -25,7 +25,7 @@ public class AppPlugin extends Plugin { private static final String EVENT_RESUME = "resume"; private boolean hasPausedEver = false; - private OnBackPressedCallback onbackPressedCallback; + private OnBackPressedCallback onBackPressedCallback; public void load() { bridge @@ -46,7 +46,7 @@ public void load() { notifyListeners(EVENT_RESTORED_RESULT, result.getWrappedResult(), true); } ); - this.onbackPressedCallback = new OnBackPressedCallback(true) { + this.onBackPressedCallback = new OnBackPressedCallback(true) { @Override public void handleOnBackPressed() { if (!hasListeners(EVENT_BACK_BUTTON)) { @@ -62,7 +62,7 @@ public void handleOnBackPressed() { } }; - getActivity().getOnBackPressedDispatcher().addCallback(getActivity(), this.onbackPressedCallback); + getActivity().getOnBackPressedDispatcher().addCallback(getActivity(), this.onBackPressedCallback); } @@ -118,14 +118,14 @@ public void minimizeApp(PluginCall call) { @PluginMethod public void togglePredictiveBack(PluginCall call) { - if (this.onbackPressedCallback == null) { - call.reject("onbackPressedCallback is not set"); + if (this.onBackPressedCallback == null) { + call.reject("onBackPressedCallback is not set"); return; } Boolean enabled = call.getBoolean("enabled"); - this.onbackPressedCallback.setEnabled(!enabled); + this.onBackPressedCallback.setEnabled(!enabled); call.resolve(); } From 0caed9ca2b0ed0c39116c01ac89d9fb3bdf095f6 Mon Sep 17 00:00:00 2001 From: Joseph Pender Date: Thu, 31 Jul 2025 09:34:38 -0500 Subject: [PATCH 08/16] fixing support android version docs --- app/README.md | 2 +- app/src/definitions.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/README.md b/app/README.md index 34579e0e4..0f7e6e838 100644 --- a/app/README.md +++ b/app/README.md @@ -178,7 +178,7 @@ Toggles support for Android's predictive back gesture. Enabling this will disable this plugin's `backButton` listener. -Only available for Android 15+. +Only available for Android 13+. | Param | Type | | ------------- | ----------------------------------------------------------------------------------- | diff --git a/app/src/definitions.ts b/app/src/definitions.ts index 44b1a705d..0e07e5e30 100644 --- a/app/src/definitions.ts +++ b/app/src/definitions.ts @@ -185,7 +185,7 @@ export interface AppPlugin { * * Enabling this will disable this plugin's `backButton` listener. * - * Only available for Android 15+. + * Only available for Android 13+. * * @since 8.0.0 */ From e7c55109cf0f3079db8ab9fe66098ffae52a00af Mon Sep 17 00:00:00 2001 From: Joseph Pender Date: Thu, 31 Jul 2025 09:34:48 -0500 Subject: [PATCH 09/16] fmt --- .../capacitorjs/plugins/app/AppPlugin.java | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/app/android/src/main/java/com/capacitorjs/plugins/app/AppPlugin.java b/app/android/src/main/java/com/capacitorjs/plugins/app/AppPlugin.java index 7aa15ffb1..088635cdf 100644 --- a/app/android/src/main/java/com/capacitorjs/plugins/app/AppPlugin.java +++ b/app/android/src/main/java/com/capacitorjs/plugins/app/AppPlugin.java @@ -46,24 +46,24 @@ public void load() { notifyListeners(EVENT_RESTORED_RESULT, result.getWrappedResult(), true); } ); - this.onBackPressedCallback = new OnBackPressedCallback(true) { - @Override - public void handleOnBackPressed() { - if (!hasListeners(EVENT_BACK_BUTTON)) { - if (bridge.getWebView().canGoBack()) { - bridge.getWebView().goBack(); + this.onBackPressedCallback = + new OnBackPressedCallback(true) { + @Override + public void handleOnBackPressed() { + if (!hasListeners(EVENT_BACK_BUTTON)) { + if (bridge.getWebView().canGoBack()) { + bridge.getWebView().goBack(); + } + } else { + JSObject data = new JSObject(); + data.put("canGoBack", bridge.getWebView().canGoBack()); + notifyListeners(EVENT_BACK_BUTTON, data, true); + bridge.triggerJSEvent("backbutton", "document"); } - } else { - JSObject data = new JSObject(); - data.put("canGoBack", bridge.getWebView().canGoBack()); - notifyListeners(EVENT_BACK_BUTTON, data, true); - bridge.triggerJSEvent("backbutton", "document"); } - } - }; + }; getActivity().getOnBackPressedDispatcher().addCallback(getActivity(), this.onBackPressedCallback); - } @PluginMethod From e179e79b61b6f202bb3681ada2fcbf1b8cc5f99c Mon Sep 17 00:00:00 2001 From: Joseph Pender Date: Thu, 31 Jul 2025 11:15:05 -0500 Subject: [PATCH 10/16] Adding support for plugin config --- .../java/com/capacitorjs/plugins/app/AppPlugin.java | 4 +++- app/src/definitions.ts | 10 ++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/app/android/src/main/java/com/capacitorjs/plugins/app/AppPlugin.java b/app/android/src/main/java/com/capacitorjs/plugins/app/AppPlugin.java index 088635cdf..44ac13cc9 100644 --- a/app/android/src/main/java/com/capacitorjs/plugins/app/AppPlugin.java +++ b/app/android/src/main/java/com/capacitorjs/plugins/app/AppPlugin.java @@ -28,6 +28,8 @@ public class AppPlugin extends Plugin { private OnBackPressedCallback onBackPressedCallback; public void load() { + boolean disableBackButtonHandler = bridge.getConfig().getPluginConfiguration("App").getBoolean("disableBackButtonListener", false); + bridge .getApp() .setStatusChangeListener( @@ -47,7 +49,7 @@ public void load() { } ); this.onBackPressedCallback = - new OnBackPressedCallback(true) { + new OnBackPressedCallback(!disableBackButtonHandler) { @Override public void handleOnBackPressed() { if (!hasListeners(EVENT_BACK_BUTTON)) { diff --git a/app/src/definitions.ts b/app/src/definitions.ts index 0e07e5e30..fb0848ed7 100644 --- a/app/src/definitions.ts +++ b/app/src/definitions.ts @@ -1,5 +1,15 @@ +/// + import type { PluginListenerHandle } from '@capacitor/core'; +declare module '@capacitor/cli' { + export interface PluginsConfig { + App?: { + disableBackButtonListener?: boolean; + }; + } +} + export interface AppInfo { /** * The name of the app. From 86ba3691fadd5d914c00d10187e19bbb08166fb9 Mon Sep 17 00:00:00 2001 From: Joseph Pender Date: Thu, 31 Jul 2025 11:34:23 -0500 Subject: [PATCH 11/16] renaming `togglePredictiveBack` --- app/README.md | 26 +++++++++---------- .../capacitorjs/plugins/app/AppPlugin.java | 4 +-- app/ios/Sources/AppPlugin/AppPlugin.swift | 4 +-- app/src/definitions.ts | 24 +++++++++++------ app/src/web.ts | 2 +- 5 files changed, 33 insertions(+), 27 deletions(-) diff --git a/app/README.md b/app/README.md index 0f7e6e838..ebb693b72 100644 --- a/app/README.md +++ b/app/README.md @@ -76,7 +76,7 @@ const checkAppLaunchUrl = async () => { * [`getState()`](#getstate) * [`getLaunchUrl()`](#getlaunchurl) * [`minimizeApp()`](#minimizeapp) -* [`togglePredictiveBack(...)`](#togglepredictiveback) +* [`toggleBackButtonHandler(...)`](#togglebackbuttonhandler) * [`addListener('appStateChange', ...)`](#addlistenerappstatechange-) * [`addListener('pause', ...)`](#addlistenerpause-) * [`addListener('resume', ...)`](#addlistenerresume-) @@ -168,21 +168,19 @@ Only available for Android. -------------------- -### togglePredictiveBack(...) +### toggleBackButtonHandler(...) ```typescript -togglePredictiveBack(options: TogglePredictiveBackOptions) => Promise +toggleBackButtonHandler(options: ToggleBackButtonHandlerOptions) => Promise ``` -Toggles support for Android's predictive back gesture. +Enables or disables the plugin's back button handling during runtime. -Enabling this will disable this plugin's `backButton` listener. - -Only available for Android 13+. +Only available for Android. -| Param | Type | -| ------------- | ----------------------------------------------------------------------------------- | -| **`options`** | TogglePredictiveBackOptions | +| Param | Type | +| ------------- | ----------------------------------------------------------------------------------------- | +| **`options`** | ToggleBackButtonHandlerOptions | **Since:** 8.0.0 @@ -386,11 +384,11 @@ Remove all native listeners for this plugin | **`url`** | string | The url used to open the app. | 1.0.0 | -#### TogglePredictiveBackOptions +#### ToggleBackButtonHandlerOptions -| Prop | Type | Description | Since | -| ------------- | -------------------- | ----------------------------------------------------------------------- | ----- | -| **`enabled`** | boolean | Indicates whether to enable or disable predictive back gesture support. | 8.0.0 | +| Prop | Type | Description | Since | +| ------------- | -------------------- | -------------------------------------------------------------------- | ----- | +| **`enabled`** | boolean | Indicates whether to enable or disable default back button handling. | 8.0.0 | #### PluginListenerHandle diff --git a/app/android/src/main/java/com/capacitorjs/plugins/app/AppPlugin.java b/app/android/src/main/java/com/capacitorjs/plugins/app/AppPlugin.java index 44ac13cc9..3dfc807cc 100644 --- a/app/android/src/main/java/com/capacitorjs/plugins/app/AppPlugin.java +++ b/app/android/src/main/java/com/capacitorjs/plugins/app/AppPlugin.java @@ -119,7 +119,7 @@ public void minimizeApp(PluginCall call) { } @PluginMethod - public void togglePredictiveBack(PluginCall call) { + public void toggleBackButtonHandler(PluginCall call) { if (this.onBackPressedCallback == null) { call.reject("onBackPressedCallback is not set"); return; @@ -127,7 +127,7 @@ public void togglePredictiveBack(PluginCall call) { Boolean enabled = call.getBoolean("enabled"); - this.onBackPressedCallback.setEnabled(!enabled); + this.onBackPressedCallback.setEnabled(enabled); call.resolve(); } diff --git a/app/ios/Sources/AppPlugin/AppPlugin.swift b/app/ios/Sources/AppPlugin/AppPlugin.swift index ea7fc17b8..a6c4451fd 100644 --- a/app/ios/Sources/AppPlugin/AppPlugin.swift +++ b/app/ios/Sources/AppPlugin/AppPlugin.swift @@ -11,7 +11,7 @@ public class AppPlugin: CAPPlugin, CAPBridgedPlugin { CAPPluginMethod(name: "getLaunchUrl", returnType: CAPPluginReturnPromise), CAPPluginMethod(name: "getState", returnType: CAPPluginReturnPromise), CAPPluginMethod(name: "minimizeApp", returnType: CAPPluginReturnPromise), - CAPPluginMethod(name: "togglePredictiveBack", returnType: CAPPluginReturnPromise) + CAPPluginMethod(name: "toggleBackButtonHandler", returnType: CAPPluginReturnPromise) ] private var observers: [NSObjectProtocol] = [] @@ -115,7 +115,7 @@ public class AppPlugin: CAPPlugin, CAPBridgedPlugin { call.unimplemented() } - @objc func togglePredictiveBack(_ call: CAPPluginCall) { + @objc func toggleBackButtonHandler(_ call: CAPPluginCall) { call.unimplemented() } } diff --git a/app/src/definitions.ts b/app/src/definitions.ts index fb0848ed7..80e873a5b 100644 --- a/app/src/definitions.ts +++ b/app/src/definitions.ts @@ -5,7 +5,15 @@ import type { PluginListenerHandle } from '@capacitor/core'; declare module '@capacitor/cli' { export interface PluginsConfig { App?: { - disableBackButtonListener?: boolean; + /** + * Disable the plugin's default back button handling. + * + * Only available for Android. + * + * @since 8.0.0 + * @default false + */ + disableBackButtonHandler?: boolean; }; } } @@ -135,9 +143,9 @@ export interface BackButtonListenerEvent { canGoBack: boolean; } -export interface TogglePredictiveBackOptions { +export interface ToggleBackButtonHandlerOptions { /** - * Indicates whether to enable or disable predictive back gesture support. + * Indicates whether to enable or disable default back button handling. * * @since 8.0.0 */ @@ -191,15 +199,15 @@ export interface AppPlugin { minimizeApp(): Promise; /** - * Toggles support for Android's predictive back gesture. + * Enables or disables the plugin's back button handling during runtime. * - * Enabling this will disable this plugin's `backButton` listener. - * - * Only available for Android 13+. + * Only available for Android. * * @since 8.0.0 */ - togglePredictiveBack(options: TogglePredictiveBackOptions): Promise; + toggleBackButtonHandler( + options: ToggleBackButtonHandlerOptions, + ): Promise; /** * Listen for changes in the app or the activity states. diff --git a/app/src/web.ts b/app/src/web.ts index b4ef9c7ee..62288cc07 100644 --- a/app/src/web.ts +++ b/app/src/web.ts @@ -32,7 +32,7 @@ export class AppWeb extends WebPlugin implements AppPlugin { throw this.unimplemented('Not implemented on web.'); } - async togglePredictiveBack(): Promise { + async toggleBackButtonHandler(): Promise { throw this.unimplemented('Not implemented on web.'); } From 44415b9fdb5199c8057e26d5baab851970f7f5da Mon Sep 17 00:00:00 2001 From: Joseph Pender Date: Thu, 28 Aug 2025 07:59:29 -0500 Subject: [PATCH 12/16] Adding new configuration documentation --- app/README.md | 43 ++++++++++++++++++++++++++++++++++++++++++ app/package.json | 1 + app/src/definitions.ts | 1 + 3 files changed, 45 insertions(+) diff --git a/app/README.md b/app/README.md index ebb693b72..49d813a32 100644 --- a/app/README.md +++ b/app/README.md @@ -67,6 +67,49 @@ const checkAppLaunchUrl = async () => { }; ``` +## Configuration + + + + +| Prop | Type | Description | Default | Since | +| ------------------------------ | -------------------- | ------------------------------------------------------------------------------ | ------------------ | ----- | +| **`disableBackButtonHandler`** | boolean | Disable the plugin's default back button handling. Only available for Android. | false | 8.0.0 | + +### Examples + +In `capacitor.config.json`: + +```json +{ + "plugins": { + "App": { + "disableBackButtonHandler": true + } + } +} +``` + +In `capacitor.config.ts`: + +```ts +/// + +import { CapacitorConfig } from '@capacitor/cli'; + +const config: CapacitorConfig = { + plugins: { + App: { + disableBackButtonHandler: true, + }, + }, +}; + +export default config; +``` + + + ## API diff --git a/app/package.json b/app/package.json index e7948a0e2..717b0f432 100644 --- a/app/package.json +++ b/app/package.json @@ -51,6 +51,7 @@ "@capacitor/core": "^7.0.0", "@capacitor/docgen": "0.2.2", "@capacitor/ios": "^7.0.0", + "@capacitor/cli": "^7.0.0", "@ionic/eslint-config": "^0.4.0", "@ionic/prettier-config": "~1.0.1", "@ionic/swiftlint-config": "^1.1.2", diff --git a/app/src/definitions.ts b/app/src/definitions.ts index 80e873a5b..29bcf33d1 100644 --- a/app/src/definitions.ts +++ b/app/src/definitions.ts @@ -12,6 +12,7 @@ declare module '@capacitor/cli' { * * @since 8.0.0 * @default false + * @example true */ disableBackButtonHandler?: boolean; }; From 87e5a052479c5fe318502136c1c6e1f6c510cbcb Mon Sep 17 00:00:00 2001 From: Joseph Pender Date: Thu, 28 Aug 2025 08:01:19 -0500 Subject: [PATCH 13/16] Adjusting feature release version --- app/src/definitions.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/definitions.ts b/app/src/definitions.ts index 29bcf33d1..5745a1d66 100644 --- a/app/src/definitions.ts +++ b/app/src/definitions.ts @@ -10,7 +10,7 @@ declare module '@capacitor/cli' { * * Only available for Android. * - * @since 8.0.0 + * @since 7.1.0 * @default false * @example true */ @@ -148,7 +148,7 @@ export interface ToggleBackButtonHandlerOptions { /** * Indicates whether to enable or disable default back button handling. * - * @since 8.0.0 + * @since 7.1.0 */ enabled: boolean; } @@ -204,7 +204,7 @@ export interface AppPlugin { * * Only available for Android. * - * @since 8.0.0 + * @since 7.1.0 */ toggleBackButtonHandler( options: ToggleBackButtonHandlerOptions, From 245fd9cdd89cfec27e9f2dc84269088740131ce2 Mon Sep 17 00:00:00 2001 From: Joseph Pender Date: Thu, 28 Aug 2025 08:45:08 -0500 Subject: [PATCH 14/16] using PluginConfig, also using correct name of the configuration --- .../src/main/java/com/capacitorjs/plugins/app/AppPlugin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/android/src/main/java/com/capacitorjs/plugins/app/AppPlugin.java b/app/android/src/main/java/com/capacitorjs/plugins/app/AppPlugin.java index 3dfc807cc..0b6295b5f 100644 --- a/app/android/src/main/java/com/capacitorjs/plugins/app/AppPlugin.java +++ b/app/android/src/main/java/com/capacitorjs/plugins/app/AppPlugin.java @@ -28,7 +28,7 @@ public class AppPlugin extends Plugin { private OnBackPressedCallback onBackPressedCallback; public void load() { - boolean disableBackButtonHandler = bridge.getConfig().getPluginConfiguration("App").getBoolean("disableBackButtonListener", false); + boolean disableBackButtonHandler = getConfig().getBoolean("disableBackButtonHandler", false); bridge .getApp() From 6022ecde411879461b0a08519dfe23a7835cf4ec Mon Sep 17 00:00:00 2001 From: Joseph Pender Date: Thu, 28 Aug 2025 08:50:36 -0500 Subject: [PATCH 15/16] Building README --- app/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/README.md b/app/README.md index 49d813a32..a90390bf3 100644 --- a/app/README.md +++ b/app/README.md @@ -74,7 +74,7 @@ const checkAppLaunchUrl = async () => { | Prop | Type | Description | Default | Since | | ------------------------------ | -------------------- | ------------------------------------------------------------------------------ | ------------------ | ----- | -| **`disableBackButtonHandler`** | boolean | Disable the plugin's default back button handling. Only available for Android. | false | 8.0.0 | +| **`disableBackButtonHandler`** | boolean | Disable the plugin's default back button handling. Only available for Android. | false | 7.1.0 | ### Examples @@ -225,7 +225,7 @@ Only available for Android. | ------------- | ----------------------------------------------------------------------------------------- | | **`options`** | ToggleBackButtonHandlerOptions | -**Since:** 8.0.0 +**Since:** 7.1.0 -------------------- @@ -431,7 +431,7 @@ Remove all native listeners for this plugin | Prop | Type | Description | Since | | ------------- | -------------------- | -------------------------------------------------------------------- | ----- | -| **`enabled`** | boolean | Indicates whether to enable or disable default back button handling. | 8.0.0 | +| **`enabled`** | boolean | Indicates whether to enable or disable default back button handling. | 7.1.0 | #### PluginListenerHandle From e882a9fa72f1240f7d27d322e231da0caf493167 Mon Sep 17 00:00:00 2001 From: Joseph Pender Date: Fri, 29 Aug 2025 09:50:12 -0500 Subject: [PATCH 16/16] Moving around dev dependencies --- app/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/package.json b/app/package.json index f2e50d77e..296169c05 100644 --- a/app/package.json +++ b/app/package.json @@ -48,10 +48,10 @@ }, "devDependencies": { "@capacitor/android": "^7.0.0", + "@capacitor/cli": "^7.0.0", "@capacitor/core": "^7.0.0", "@capacitor/docgen": "0.2.2", "@capacitor/ios": "^7.0.0", - "@capacitor/cli": "^7.0.0", "@ionic/eslint-config": "^0.4.0", "@ionic/prettier-config": "~1.0.1", "@ionic/swiftlint-config": "^1.1.2",