From 526389aaa05e83aa1cc84a10479baf8e8949c155 Mon Sep 17 00:00:00 2001 From: Rui Mendes Date: Mon, 10 Aug 2026 10:55:00 +0100 Subject: [PATCH 1/4] docs: add @NativePlugin removal to Capacitor 9 upgrade guide --- docs/main/updating/9-0.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/docs/main/updating/9-0.md b/docs/main/updating/9-0.md index 5e10ecf7..16e5e2bd 100644 --- a/docs/main/updating/9-0.md +++ b/docs/main/updating/9-0.md @@ -23,3 +23,20 @@ Capacitor 9 removes the Java APIs that were deprecated in previous major version | `Bridge.CAPACITOR_HTTPS_INTERCEPTOR_START` | `CAPACITOR_HTTP_INTERCEPTOR_START`, all proxied requests are handled by it | | `Plugin.getConfigValue(String)` | `getConfig()` and the typed accessors on `PluginConfig` | | `MessageHandler(Bridge, WebView, Object)` constructor | `MessageHandler(Bridge, WebView)` | + +### Removal of the legacy `@NativePlugin` annotation + +The `@NativePlugin` annotation, deprecated since Capacitor 3.0 in favor of `@CapacitorPlugin`, has been removed in Capacitor 9 along with the deprecated permission and activity-result APIs that only existed to support it. For the overall migration pattern (annotation switch, callback-based activity and permission results, new Permissions API), see the [Capacitor 3 plugin migration guide](/updating/plugins/3-0). The specific method replacements removed in this release are listed below. + +| Removed | Replacement | +| :------ | :---------- | +| `@NativePlugin` | `@CapacitorPlugin` | +| `Plugin.saveCall(PluginCall)` | `Bridge.saveCall(PluginCall)` or `PluginCall.setKeepAlive(true)` | +| `Plugin.getSavedCall()` (no-arg) | `Bridge.getSavedCall(String)` | +| `Plugin.freeSavedCall()` | `PluginCall.release(Bridge)` | +| `Plugin.hasDefinedPermissions(String[])` | `Plugin.isPermissionDeclared(String)` | +| `Plugin.pluginRequestPermission(String, int)` | `Plugin.requestPermissionForAlias(...)` with `@PermissionCallback` | +| `Plugin.pluginRequestPermissions(String[], int)` | `Plugin.requestPermissionForAliases(...)` with `@PermissionCallback` | +| `Plugin.pluginRequestAllPermissions()` | `Plugin.requestAllPermissions(PluginCall, String)` with `@PermissionCallback` | +| `Plugin.startActivityForResult(PluginCall, Intent, int)` | `Plugin.startActivityForResult(PluginCall, Intent, String)` with `@ActivityCallback` | +| `Bridge.startActivityForPluginWithResult(PluginCall, Intent, int)` | `Plugin.startActivityForResult(PluginCall, Intent, String)` with `@ActivityCallback` | From 066527d26767cbe33f05749a77f3bc08cd8ca642 Mon Sep 17 00:00:00 2001 From: Rui Mendes Date: Mon, 10 Aug 2026 11:13:14 +0100 Subject: [PATCH 2/4] note that @NativePlugin was removed in Capacitor 9 --- docs/plugins/creating-plugins/android-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/plugins/creating-plugins/android-guide.md b/docs/plugins/creating-plugins/android-guide.md index 92db9de2..55de6d18 100644 --- a/docs/plugins/creating-plugins/android-guide.md +++ b/docs/plugins/creating-plugins/android-guide.md @@ -139,7 +139,7 @@ Before following this section, make sure you've set up your permission aliases a ### Annotation Changes -> Still using `@NativePlugin`? See the [upgrade guide](/main/updating/plugins/3-0.md#use-the-new-capacitorplugin-annotation) to switch to `@CapacitorPlugin`. +> The `@NativePlugin` annotation was removed in Capacitor 9. If your plugin still uses it, see the [upgrade guide](/main/updating/plugins/3-0.md#use-the-new-capacitorplugin-annotation) to switch to `@CapacitorPlugin`. ```diff @CapacitorPlugin( From 3075614e0c4bd8ffa9424297c0436d7761cb8dfb Mon Sep 17 00:00:00 2001 From: Rui Mendes Date: Mon, 10 Aug 2026 12:50:53 +0100 Subject: [PATCH 3/4] docs: add Plugin.hasPermission removal to Capacitor 9 upgrade guide --- docs/main/updating/9-0.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/main/updating/9-0.md b/docs/main/updating/9-0.md index 16e5e2bd..39b25fed 100644 --- a/docs/main/updating/9-0.md +++ b/docs/main/updating/9-0.md @@ -35,6 +35,7 @@ The `@NativePlugin` annotation, deprecated since Capacitor 3.0 in favor of `@Cap | `Plugin.getSavedCall()` (no-arg) | `Bridge.getSavedCall(String)` | | `Plugin.freeSavedCall()` | `PluginCall.release(Bridge)` | | `Plugin.hasDefinedPermissions(String[])` | `Plugin.isPermissionDeclared(String)` | +| `Plugin.hasPermission(String)` | `Plugin.getPermissionState(String)` / `getPermissionStates()`, or `ActivityCompat.checkSelfPermission(Context, String)` | | `Plugin.pluginRequestPermission(String, int)` | `Plugin.requestPermissionForAlias(...)` with `@PermissionCallback` | | `Plugin.pluginRequestPermissions(String[], int)` | `Plugin.requestPermissionForAliases(...)` with `@PermissionCallback` | | `Plugin.pluginRequestAllPermissions()` | `Plugin.requestAllPermissions(PluginCall, String)` with `@PermissionCallback` | From 9ed79250c80a85ef47ab5c67dc58be3eb0ff8da1 Mon Sep 17 00:00:00 2001 From: Rui Mendes Date: Mon, 10 Aug 2026 15:26:14 +0100 Subject: [PATCH 4/4] docs: add @CapacitorPlugin.requestCodes and Bridge.getPluginWithRequestCode removals to Capacitor 9 upgrade guide --- docs/main/updating/9-0.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/main/updating/9-0.md b/docs/main/updating/9-0.md index 39b25fed..b6dd382f 100644 --- a/docs/main/updating/9-0.md +++ b/docs/main/updating/9-0.md @@ -31,6 +31,8 @@ The `@NativePlugin` annotation, deprecated since Capacitor 3.0 in favor of `@Cap | Removed | Replacement | | :------ | :---------- | | `@NativePlugin` | `@CapacitorPlugin` | +| `@CapacitorPlugin(requestCodes = {...})` attribute | Use `Plugin.startActivityForResult(PluginCall, Intent, String)` with `@ActivityCallback` for activity results, and `Plugin.requestPermissionForAlias(...)` / `requestPermissionForAliases(...)` / `requestAllPermissions(...)` with `@PermissionCallback` for permission requests | +| `Bridge.getPluginWithRequestCode(int)` | No replacement — use the callback-based `@ActivityCallback` / `@PermissionCallback` pattern instead | | `Plugin.saveCall(PluginCall)` | `Bridge.saveCall(PluginCall)` or `PluginCall.setKeepAlive(true)` | | `Plugin.getSavedCall()` (no-arg) | `Bridge.getSavedCall(String)` | | `Plugin.freeSavedCall()` | `PluginCall.release(Bridge)` |