From 0bfde98313dbd0312224c0a4896648b9fa6d57c3 Mon Sep 17 00:00:00 2001 From: "Github Workflow (on behalf of OS-pedrogustavobilro)" Date: Wed, 15 Jul 2026 10:22:57 +0000 Subject: [PATCH 01/12] chore(release): publish [skip ci] - @capacitor/app@8.1.1 - @capacitor/browser@8.0.4 - @capacitor/device@8.0.3 - @capacitor/local-notifications@8.2.1 - @capacitor/motion@8.0.1 - @capacitor/push-notifications@8.1.2 - @capacitor/splash-screen@8.0.2 - @capacitor/status-bar@8.0.3 --- app/CHANGELOG.md | 4 ++++ app/package.json | 2 +- browser/CHANGELOG.md | 4 ++++ browser/package.json | 2 +- device/CHANGELOG.md | 4 ++++ device/package.json | 2 +- local-notifications/CHANGELOG.md | 4 ++++ local-notifications/package.json | 2 +- motion/CHANGELOG.md | 4 ++++ motion/package.json | 2 +- push-notifications/CHANGELOG.md | 4 ++++ push-notifications/package.json | 2 +- splash-screen/CHANGELOG.md | 4 ++++ splash-screen/package.json | 2 +- status-bar/CHANGELOG.md | 4 ++++ status-bar/package.json | 2 +- 16 files changed, 40 insertions(+), 8 deletions(-) diff --git a/app/CHANGELOG.md b/app/CHANGELOG.md index a0804ec944..ab43e182ae 100644 --- a/app/CHANGELOG.md +++ b/app/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.1.1](https://github.com/ionic-team/capacitor-plugins/compare/@capacitor/app@8.1.0...@capacitor/app@8.1.1) (2026-07-15) + +**Note:** Version bump only for package @capacitor/app + # [8.1.0](https://github.com/ionic-team/capacitor-plugins/compare/@capacitor/app@8.0.1...@capacitor/app@8.1.0) (2026-03-25) ### Features diff --git a/app/package.json b/app/package.json index 2e32b8bfc8..49484ecda2 100644 --- a/app/package.json +++ b/app/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/app", - "version": "8.1.0", + "version": "8.1.1", "description": "The App API handles high level App state and events.For example, this API emits events when the app enters and leaves the foreground, handles deeplinks, opens other apps, and manages persisted plugin state.", "main": "dist/plugin.cjs.js", "module": "dist/esm/index.js", diff --git a/browser/CHANGELOG.md b/browser/CHANGELOG.md index 01cf44a2e6..351199704b 100644 --- a/browser/CHANGELOG.md +++ b/browser/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.0.4](https://github.com/ionic-team/capacitor-plugins/compare/@capacitor/browser@8.0.3...@capacitor/browser@8.0.4) (2026-07-15) + +**Note:** Version bump only for package @capacitor/browser + ## [8.0.3](https://github.com/ionic-team/capacitor-plugins/compare/@capacitor/browser@8.0.2...@capacitor/browser@8.0.3) (2026-03-25) **Note:** Version bump only for package @capacitor/browser diff --git a/browser/package.json b/browser/package.json index 3ebc4697eb..64ef0cacf0 100644 --- a/browser/package.json +++ b/browser/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/browser", - "version": "8.0.3", + "version": "8.0.4", "description": "The Browser API provides the ability to open an in-app browser and subscribe to browser events.", "main": "dist/plugin.cjs.js", "module": "dist/esm/index.js", diff --git a/device/CHANGELOG.md b/device/CHANGELOG.md index 6df85e4b40..bd47a65bdb 100644 --- a/device/CHANGELOG.md +++ b/device/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.0.3](https://github.com/ionic-team/capacitor-plugins/compare/@capacitor/device@8.0.2...@capacitor/device@8.0.3) (2026-07-15) + +**Note:** Version bump only for package @capacitor/device + ## [8.0.2](https://github.com/ionic-team/capacitor-plugins/compare/@capacitor/device@8.0.1...@capacitor/device@8.0.2) (2026-03-25) **Note:** Version bump only for package @capacitor/device diff --git a/device/package.json b/device/package.json index 7347267dc2..c620bfc11d 100644 --- a/device/package.json +++ b/device/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/device", - "version": "8.0.2", + "version": "8.0.3", "description": "The Device API exposes internal information about the device, such as the model and operating system version, along with user information such as unique ids.", "main": "dist/plugin.cjs.js", "module": "dist/esm/index.js", diff --git a/local-notifications/CHANGELOG.md b/local-notifications/CHANGELOG.md index 88aa019d9b..2e6a8ad8a5 100644 --- a/local-notifications/CHANGELOG.md +++ b/local-notifications/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.2.1](https://github.com/ionic-team/capacitor-plugins/compare/@capacitor/local-notifications@8.2.0...@capacitor/local-notifications@8.2.1) (2026-07-15) + +**Note:** Version bump only for package @capacitor/local-notifications + # [8.2.0](https://github.com/ionic-team/capacitor-plugins/compare/@capacitor/local-notifications@8.1.0...@capacitor/local-notifications@8.2.0) (2026-05-15) ### Features diff --git a/local-notifications/package.json b/local-notifications/package.json index 42ac83bcca..824a111a4f 100644 --- a/local-notifications/package.json +++ b/local-notifications/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/local-notifications", - "version": "8.2.0", + "version": "8.2.1", "description": "The Local Notifications API provides a way to schedule device notifications locally (i.e. without a server sending push notifications).", "main": "dist/plugin.cjs.js", "module": "dist/esm/index.js", diff --git a/motion/CHANGELOG.md b/motion/CHANGELOG.md index 97608da71c..67b1eac2d6 100644 --- a/motion/CHANGELOG.md +++ b/motion/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.0.1](https://github.com/ionic-team/capacitor-plugins/compare/@capacitor/motion@8.0.0...@capacitor/motion@8.0.1) (2026-07-15) + +**Note:** Version bump only for package @capacitor/motion + # [8.0.0](https://github.com/ionic-team/capacitor-plugins/compare/@capacitor/motion@8.0.0-beta.0...@capacitor/motion@8.0.0) (2025-12-08) **Note:** Version bump only for package @capacitor/motion diff --git a/motion/package.json b/motion/package.json index 6115f71e04..f87996a066 100644 --- a/motion/package.json +++ b/motion/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/motion", - "version": "8.0.0", + "version": "8.0.1", "description": "The Motion API tracks accelerometer and device orientation (compass heading, etc.)", "main": "dist/plugin.cjs.js", "module": "dist/esm/index.js", diff --git a/push-notifications/CHANGELOG.md b/push-notifications/CHANGELOG.md index 59002744fd..d596403c39 100644 --- a/push-notifications/CHANGELOG.md +++ b/push-notifications/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.1.2](https://github.com/ionic-team/capacitor-plugins/compare/@capacitor/push-notifications@8.1.1...@capacitor/push-notifications@8.1.2) (2026-07-15) + +**Note:** Version bump only for package @capacitor/push-notifications + ## [8.1.1](https://github.com/ionic-team/capacitor-plugins/compare/@capacitor/push-notifications@8.1.0...@capacitor/push-notifications@8.1.1) (2026-05-15) **Note:** Version bump only for package @capacitor/push-notifications diff --git a/push-notifications/package.json b/push-notifications/package.json index 0855573a7c..681080fc2e 100644 --- a/push-notifications/package.json +++ b/push-notifications/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/push-notifications", - "version": "8.1.1", + "version": "8.1.2", "description": "The Push Notifications API provides access to native push notifications.", "main": "dist/plugin.cjs.js", "module": "dist/esm/index.js", diff --git a/splash-screen/CHANGELOG.md b/splash-screen/CHANGELOG.md index f4ee24b7cb..9311509a36 100644 --- a/splash-screen/CHANGELOG.md +++ b/splash-screen/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.0.2](https://github.com/ionic-team/capacitor-plugins/compare/@capacitor/splash-screen@8.0.1...@capacitor/splash-screen@8.0.2) (2026-07-15) + +**Note:** Version bump only for package @capacitor/splash-screen + ## [8.0.1](https://github.com/ionic-team/capacitor-plugins/compare/@capacitor/splash-screen@8.0.0...@capacitor/splash-screen@8.0.1) (2026-02-12) ### Bug Fixes diff --git a/splash-screen/package.json b/splash-screen/package.json index 3ddab3dabb..7db62aae7b 100644 --- a/splash-screen/package.json +++ b/splash-screen/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/splash-screen", - "version": "8.0.1", + "version": "8.0.2", "description": "The Splash Screen API provides methods for showing or hiding a Splash image.", "main": "dist/plugin.cjs.js", "module": "dist/esm/index.js", diff --git a/status-bar/CHANGELOG.md b/status-bar/CHANGELOG.md index 8a9086a818..0fe7e11efe 100644 --- a/status-bar/CHANGELOG.md +++ b/status-bar/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.0.3](https://github.com/ionic-team/capacitor-plugins/compare/@capacitor/status-bar@8.0.2...@capacitor/status-bar@8.0.3) (2026-07-15) + +**Note:** Version bump only for package @capacitor/status-bar + ## [8.0.2](https://github.com/ionic-team/capacitor-plugins/compare/@capacitor/status-bar@8.0.1...@capacitor/status-bar@8.0.2) (2026-03-25) ### Bug Fixes diff --git a/status-bar/package.json b/status-bar/package.json index 6b266c03f2..e7c0c362f7 100644 --- a/status-bar/package.json +++ b/status-bar/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/status-bar", - "version": "8.0.2", + "version": "8.0.3", "description": "The StatusBar API Provides methods for configuring the style of the Status Bar, along with showing or hiding it.", "main": "dist/plugin.cjs.js", "module": "dist/esm/index.js", From 816b70fcecbb0eb411e5beceb804ebd712fb5a69 Mon Sep 17 00:00:00 2001 From: Mark Anderson Date: Tue, 4 Aug 2026 15:55:55 -0400 Subject: [PATCH 02/12] chore: bootstrap releases with release-please (#2575) --- .release-please-manifest.json | 3 +++ release-please-config.json | 13 +++++++++++++ 2 files changed, 16 insertions(+) create mode 100644 .release-please-manifest.json create mode 100644 release-please-config.json diff --git a/.release-please-manifest.json b/.release-please-manifest.json new file mode 100644 index 0000000000..46b1b67c03 --- /dev/null +++ b/.release-please-manifest.json @@ -0,0 +1,3 @@ +{ + ".": "0.0.0" +} \ No newline at end of file diff --git a/release-please-config.json b/release-please-config.json new file mode 100644 index 0000000000..161d1adb0a --- /dev/null +++ b/release-please-config.json @@ -0,0 +1,13 @@ +{ + "packages": { + ".": { + "changelog-path": "CHANGELOG.md", + "release-type": "node", + "bump-minor-pre-major": false, + "bump-patch-for-minor-pre-major": false, + "draft": false, + "prerelease": false + } + }, + "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json" +} \ No newline at end of file From 7888ae6665e3f512b49cca603d618b3a838ee356 Mon Sep 17 00:00:00 2001 From: Mark Anderson Date: Tue, 4 Aug 2026 16:03:26 -0400 Subject: [PATCH 03/12] chore: change release-please release type --- release-please-config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release-please-config.json b/release-please-config.json index 161d1adb0a..e032b6fb7d 100644 --- a/release-please-config.json +++ b/release-please-config.json @@ -2,7 +2,7 @@ "packages": { ".": { "changelog-path": "CHANGELOG.md", - "release-type": "node", + "release-type": "node-workspace", "bump-minor-pre-major": false, "bump-patch-for-minor-pre-major": false, "draft": false, From 7d6db06c8d3a96d8e0fe692bfa75544df7d4c257 Mon Sep 17 00:00:00 2001 From: Mark Anderson Date: Tue, 4 Aug 2026 16:05:53 -0400 Subject: [PATCH 04/12] chore: changed manifest for monorepo --- .release-please-manifest.json | 7 ++++++- release-please-config.json | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 46b1b67c03..1ed8b58d75 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,8 @@ { - ".": "0.0.0" + "plugins": [ + { + "type": "node-workspace", + "updatePeerDependencies": true + } +] } \ No newline at end of file diff --git a/release-please-config.json b/release-please-config.json index e032b6fb7d..161d1adb0a 100644 --- a/release-please-config.json +++ b/release-please-config.json @@ -2,7 +2,7 @@ "packages": { ".": { "changelog-path": "CHANGELOG.md", - "release-type": "node-workspace", + "release-type": "node", "bump-minor-pre-major": false, "bump-patch-for-minor-pre-major": false, "draft": false, From 7aa810e6d625545ba07b5dafb5f796b3c5bd5006 Mon Sep 17 00:00:00 2001 From: Mark Anderson Date: Tue, 4 Aug 2026 16:06:28 -0400 Subject: [PATCH 05/12] chore: changed manifest for monorepo --- .release-please-manifest.json | 1 + 1 file changed, 1 insertion(+) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 1ed8b58d75..b0c081c191 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,4 +1,5 @@ { + ".": "0.0.0", "plugins": [ { "type": "node-workspace", From 47402f4a01af38eaf76cb5a5ff6ee7e659b18c03 Mon Sep 17 00:00:00 2001 From: Mark Anderson Date: Tue, 4 Aug 2026 16:10:15 -0400 Subject: [PATCH 06/12] chore: one last? fixup --- .release-please-manifest.json | 10 +--------- release-please-config.json | 1 + 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index b0c081c191..9e26dfeeb6 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,9 +1 @@ -{ - ".": "0.0.0", - "plugins": [ - { - "type": "node-workspace", - "updatePeerDependencies": true - } -] -} \ No newline at end of file +{} \ No newline at end of file diff --git a/release-please-config.json b/release-please-config.json index 161d1adb0a..d1ef040c97 100644 --- a/release-please-config.json +++ b/release-please-config.json @@ -9,5 +9,6 @@ "prerelease": false } }, + "plugins": ["node-workspace"], "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json" } \ No newline at end of file From 8697a12bcc2a468e6902f98838ff5c589dadf050 Mon Sep 17 00:00:00 2001 From: Pedro Bilro Date: Fri, 7 Aug 2026 14:08:20 +0100 Subject: [PATCH 07/12] chore: remove commented cocoapods-deploy.yml (#2582) --- .github/cocoapods-deploy.yml | 39 ------------------------------------ 1 file changed, 39 deletions(-) delete mode 100644 .github/cocoapods-deploy.yml diff --git a/.github/cocoapods-deploy.yml b/.github/cocoapods-deploy.yml deleted file mode 100644 index 11355e9bf6..0000000000 --- a/.github/cocoapods-deploy.yml +++ /dev/null @@ -1,39 +0,0 @@ - -# This workflow is a WIP to get the plugins to deploy to cocoapods -# Its put on hold as it's currently failing during the pod trunk push command -# See the docs on how to run during manual deployment - -# name: Cocoapods Deploy - -# on: -# workflow_dispatch: - -# jobs: -# deploy-cocoapods: -# runs-on: macos-latest -# timeout-minutes: 30 -# steps: -# - uses: actions/setup-node@v1 -# with: -# node-version: 14.x -# - uses: actions/checkout@v2 -# with: -# fetch-depth: 0 -# - name: Install Cocoapods -# run: | -# gem install cocoapods -# - name: Restore Dependency Cache -# id: cache-modules -# uses: actions/cache@v2 -# with: -# path: | -# node_modules -# */node_modules -# key: dependency-cache-${{ hashFiles('package.json', '*/package.json') }} -# - run: npm install -# - name: Deploy to Cocoapods -# run: | -# set -eo pipefail -# npm run publish:cocoapod -# env: -# COCOAPODS_TRUNK_TOKEN: ${{ secrets.COCOAPODS_TRUNK_TOKEN }} \ No newline at end of file From 89070d432771b94c97294ed57b8d4843fc9f5392 Mon Sep 17 00:00:00 2001 From: "Alex J." Date: Mon, 17 Aug 2026 09:42:10 -0400 Subject: [PATCH 08/12] chore: migrate local notifications to new repo (#2584) --- README.md | 2 +- local-notifications/CHANGELOG.md | 4 ++++ local-notifications/README.md | 6 ++++++ nx.json | 1 - package.json | 1 - 5 files changed, 11 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 7889384089..12dcbd0f95 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,6 @@ This repository contains the official Capacitor plugins maintained by the Capaci | [`@capacitor/clipboard`](https://capacitorjs.com/docs/apis/clipboard) | [`./clipboard`](./clipboard) | [![npm badge](https://img.shields.io/npm/v/@capacitor/clipboard?style=flat-square)](https://www.npmjs.com/package/@capacitor/clipboard) | [`@capacitor/device`](https://capacitorjs.com/docs/apis/device) | [`./device`](./device) | [![npm badge](https://img.shields.io/npm/v/@capacitor/device?style=flat-square)](https://www.npmjs.com/package/@capacitor/device) | [`@capacitor/dialog`](https://capacitorjs.com/docs/apis/dialog) | [`./dialog`](./dialog) | [![npm badge](https://img.shields.io/npm/v/@capacitor/dialog?style=flat-square)](https://www.npmjs.com/package/@capacitor/dialog) -| [`@capacitor/local-notifications`](https://capacitorjs.com/docs/apis/local-notifications) | [`./local-notifications`](./local-notifications) | [![npm badge](https://img.shields.io/npm/v/@capacitor/local-notifications?style=flat-square)](https://www.npmjs.com/package/@capacitor/local-notifications) | [`@capacitor/motion`](https://capacitorjs.com/docs/apis/motion) | [`./motion`](./motion) | [![npm badge](https://img.shields.io/npm/v/@capacitor/motion?style=flat-square)](https://www.npmjs.com/package/@capacitor/motion) | [`@capacitor/network`](https://capacitorjs.com/docs/apis/network) | [`./network`](./network) | [![npm badge](https://img.shields.io/npm/v/@capacitor/network?style=flat-square)](https://www.npmjs.com/package/@capacitor/network) | [`@capacitor/preferences`](https://capacitorjs.com/docs/apis/preferences) | [`./preferences`](./preferences) | [![npm badge](https://img.shields.io/npm/v/@capacitor/preferences?style=flat-square)](https://www.npmjs.com/package/@capacitor/preferences) @@ -52,6 +51,7 @@ These are official Capacitor plugins that are not contained in this repository. | [Google Maps](https://github.com/ionic-team/capacitor-google-maps) | [`@capacitor/google-maps`](https://capacitorjs.com/docs/apis/google-maps) | [![npm badge](https://img.shields.io/npm/v/@capacitor/google-maps?style=flat-square)](https://www.npmjs.com/package/@capacitor/google-maps) | | [Haptics](https://github.com/ionic-team/capacitor-haptics) (*) | [`@capacitor/haptics`](https://capacitorjs.com/docs/apis/haptics) | [![npm badge](https://img.shields.io/npm/v/@capacitor/haptics?style=flat-square)](https://www.npmjs.com/package/@capacitor/haptics) | | [Keyboard](https://github.com/ionic-team/capacitor-keyboard) (*) | [`@capacitor/keyboard`](https://capacitorjs.com/docs/apis/keyboard) | [![npm badge](https://img.shields.io/npm/v/@capacitor/keyboard?style=flat-square)](https://www.npmjs.com/package/@capacitor/keyboard) | +| [Local Notifications](https://github.com/ionic-team/capacitor-local-notifications) (*) | [`@capacitor/local-notifications`](https://capacitorjs.com/docs/apis/local-notifications) | [![npm badge](https://img.shields.io/npm/v/@capacitor/local-notifications?style=flat-square)](https://www.npmjs.com/package/@capacitor/local-notifications) | (*) These plugins were once part of this repository, but have been since been revamped and/or migrated to a separate repository. The code pre-migration [still remains in this repository](https://github.com/ionic-team/capacitor-plugins/tree/7.x) for historic purposes. diff --git a/local-notifications/CHANGELOG.md b/local-notifications/CHANGELOG.md index 2e6a8ad8a5..d7b12e2733 100644 --- a/local-notifications/CHANGELOG.md +++ b/local-notifications/CHANGELOG.md @@ -1,3 +1,7 @@ +# ⓘ Plugin migrated + +**From version 8.3.0 onwards, this plugin is now hosted in a separate repository. Refer to the [updated CHANGELOG](https://github.com/ionic-team/capacitor-local-notifications/blob/main/CHANGELOG.md).** + # Change Log All notable changes to this project will be documented in this file. diff --git a/local-notifications/README.md b/local-notifications/README.md index c88bde1a33..2b948657a7 100644 --- a/local-notifications/README.md +++ b/local-notifications/README.md @@ -1,3 +1,9 @@ +# ⓘ Plugin migrated + +**From version 8.3.0 onwards, this plugin is now hosted in a separate repository. Refer to [capacitor-local-notifications repository](https://github.com/ionic-team/capacitor-local-notifications).** + +This file remains here to serve as documentation for version 8.2.1. + # @capacitor/local-notifications The Local Notifications API provides a way to schedule device notifications locally (i.e. without a server sending push notifications). diff --git a/nx.json b/nx.json index 7e51533bfe..cb877a20f5 100644 --- a/nx.json +++ b/nx.json @@ -19,7 +19,6 @@ "{projectRoot}/clipboard/dist", "{projectRoot}/device/dist", "{projectRoot}/dialog/dist", - "{projectRoot}/local-notifications/dist", "{projectRoot}/motion/dist", "{projectRoot}/network/dist", "{projectRoot}/preferences/dist", diff --git a/package.json b/package.json index 4cf06e1528..c260598438 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,6 @@ "clipboard", "device", "dialog", - "local-notifications", "motion", "network", "preferences", From fa8ddfb4e671fa1c91e6d92c80512f09cfd3a335 Mon Sep 17 00:00:00 2001 From: Pedro Bilro Date: Wed, 16 Sep 2026 11:53:40 +0100 Subject: [PATCH 09/12] fix(share): Add nonce validation to broadcast receiver on Android (#2592) --- .../plugins/share/SharePlugin.java | 33 +++++++++++++++++-- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/share/android/src/main/java/com/capacitorjs/plugins/share/SharePlugin.java b/share/android/src/main/java/com/capacitorjs/plugins/share/SharePlugin.java index dcfa338315..9b97dc0135 100644 --- a/share/android/src/main/java/com/capacitorjs/plugins/share/SharePlugin.java +++ b/share/android/src/main/java/com/capacitorjs/plugins/share/SharePlugin.java @@ -19,25 +19,44 @@ import java.io.File; import java.util.ArrayList; import java.util.List; +import java.util.UUID; import org.json.JSONException; @CapacitorPlugin(name = "Share") public class SharePlugin extends Plugin { + private static final String NONCE_EXTRA_KEY = "_share_nonce"; + private BroadcastReceiver broadcastReceiver; private boolean stopped = false; private boolean isPresenting = false; private ComponentName chosenComponent; + private String expectedNonce; @Override public void load() { broadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { + // Validate nonce to prevent spoofing from other apps + // Reference: https://github.com/ionic-team/capacitor-plugins/pull/2592 + String receivedNonce = intent.getStringExtra(NONCE_EXTRA_KEY); + if (receivedNonce == null || !receivedNonce.equals(expectedNonce)) { + // Reject broadcasts that don't have the correct nonce + return; + } + + ComponentName component; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - chosenComponent = intent.getParcelableExtra(Intent.EXTRA_CHOSEN_COMPONENT, ComponentName.class); + component = intent.getParcelableExtra(Intent.EXTRA_CHOSEN_COMPONENT, ComponentName.class); } else { - chosenComponent = getParcelableExtraLegacy(intent, Intent.EXTRA_CHOSEN_COMPONENT); + component = getParcelableExtraLegacy(intent, Intent.EXTRA_CHOSEN_COMPONENT); + } + + // Only clear nonce if we successfully got the component data + if (component != null) { + chosenComponent = component; + expectedNonce = null; } } }; @@ -64,6 +83,7 @@ private void activityResult(PluginCall call, ActivityResult result) { call.resolve(callResult); } isPresenting = false; + expectedNonce = null; } @PluginMethod @@ -117,6 +137,12 @@ public void share(PluginCall call) { if (files != null && files.length() != 0) { shareFiles(files, intent, call); } + + // Generate a random nonce to prevent spoofing via exported receiver + expectedNonce = UUID.randomUUID().toString(); + Intent callbackIntent = new Intent(Intent.EXTRA_CHOSEN_COMPONENT); + callbackIntent.putExtra(NONCE_EXTRA_KEY, expectedNonce); + int flags = PendingIntent.FLAG_UPDATE_CURRENT; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { flags = flags | PendingIntent.FLAG_MUTABLE; @@ -126,7 +152,7 @@ public void share(PluginCall call) { } // requestCode parameter is not used. Providing 0 - PendingIntent pi = PendingIntent.getBroadcast(getContext(), 0, new Intent(Intent.EXTRA_CHOSEN_COMPONENT), flags); + PendingIntent pi = PendingIntent.getBroadcast(getContext(), 0, callbackIntent, flags); Intent chooser = Intent.createChooser(intent, dialogTitle, pi.getIntentSender()); chosenComponent = null; chooser.addCategory(Intent.CATEGORY_DEFAULT); @@ -180,6 +206,7 @@ private void shareFiles(JSArray files, Intent intent, PluginCall call) { @Override protected void handleOnDestroy() { + expectedNonce = null; if (broadcastReceiver != null) { getActivity().unregisterReceiver(broadcastReceiver); } From 467dafd615514c19701d75fe6edc143901e4dc93 Mon Sep 17 00:00:00 2001 From: "Github Workflow (on behalf of OS-pedrogustavobilro)" Date: Wed, 16 Sep 2026 15:31:18 +0000 Subject: [PATCH 10/12] chore(release): publish [skip ci] - @capacitor/share@8.0.2 --- share/CHANGELOG.md | 6 ++++++ share/package.json | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/share/CHANGELOG.md b/share/CHANGELOG.md index 603440a833..ff6ca30ddb 100644 --- a/share/CHANGELOG.md +++ b/share/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.0.2](https://github.com/ionic-team/capacitor-plugins/compare/@capacitor/share@8.0.1...@capacitor/share@8.0.2) (2026-09-16) + +### Bug Fixes + +- **share:** Add nonce validation to broadcast receiver on Android ([#2592](https://github.com/ionic-team/capacitor-plugins/issues/2592)) ([fa8ddfb](https://github.com/ionic-team/capacitor-plugins/commit/fa8ddfb4e671fa1c91e6d92c80512f09cfd3a335)) + ## [8.0.1](https://github.com/ionic-team/capacitor-plugins/compare/@capacitor/share@8.0.0...@capacitor/share@8.0.1) (2026-02-12) ### Bug Fixes diff --git a/share/package.json b/share/package.json index a86f3aed39..1213430554 100644 --- a/share/package.json +++ b/share/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/share", - "version": "8.0.1", + "version": "8.0.2", "description": "The Share API provides methods for sharing content in any sharing-enabled apps the user may have installed.", "main": "dist/plugin.cjs.js", "module": "dist/esm/index.js", From fd606deafbd52754d54a9c6dfcfef79f4ccc0b1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oskar=20Go=C5=82=C4=99biewski?= Date: Thu, 17 Sep 2026 12:38:49 +0200 Subject: [PATCH 11/12] fix(push-notifications): show foreground notification image on Android (#2572) Co-authored-by: OS-ruimoreiramendes --- .../PushNotificationsPlugin.java | 68 ++++++++++++++++++- 1 file changed, 67 insertions(+), 1 deletion(-) diff --git a/push-notifications/android/src/main/java/com/capacitorjs/plugins/pushnotifications/PushNotificationsPlugin.java b/push-notifications/android/src/main/java/com/capacitorjs/plugins/pushnotifications/PushNotificationsPlugin.java index 6d339d6dfb..63916663af 100644 --- a/push-notifications/android/src/main/java/com/capacitorjs/plugins/pushnotifications/PushNotificationsPlugin.java +++ b/push-notifications/android/src/main/java/com/capacitorjs/plugins/pushnotifications/PushNotificationsPlugin.java @@ -7,20 +7,30 @@ import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; +import android.graphics.Bitmap; import android.net.Uri; import android.os.Build; import android.os.Bundle; +import android.os.Looper; import android.service.notification.StatusBarNotification; +import androidx.core.app.NotificationCompat; import com.getcapacitor.*; import com.getcapacitor.annotation.CapacitorPlugin; import com.getcapacitor.annotation.Permission; import com.getcapacitor.annotation.PermissionCallback; +import com.google.android.gms.tasks.Tasks; import com.google.firebase.messaging.CommonNotificationBuilder; import com.google.firebase.messaging.FirebaseMessaging; +import com.google.firebase.messaging.ImageDownload; import com.google.firebase.messaging.NotificationParams; import com.google.firebase.messaging.RemoteMessage; import java.util.Arrays; import java.util.List; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; import org.json.JSONException; import org.json.JSONObject; @@ -30,6 +40,7 @@ ) public class PushNotificationsPlugin extends Plugin { + private static final int IMAGE_DOWNLOAD_TIMEOUT_SECONDS = 5; static final String PUSH_NOTIFICATIONS = "receive"; public static Bridge staticBridge = null; @@ -279,7 +290,7 @@ public void fireNotification(RemoteMessage remoteMessage) { CommonNotificationBuilder.DisplayNotificationInfo notificationInfo = CommonNotificationBuilder.createNotificationInfo(getContext(), getContext(), params, channelId, bundle); - notificationManager.notify(notificationInfo.tag, notificationInfo.id, notificationInfo.notificationBuilder.build()); + showForegroundNotification(notificationInfo, notification.getImageUrl()); } } } @@ -296,6 +307,61 @@ public void fireNotification(RemoteMessage remoteMessage) { notifyListeners("pushNotificationReceived", remoteMessageData, true); } + private void showForegroundNotification(CommonNotificationBuilder.DisplayNotificationInfo notificationInfo, Uri imageUrl) { + Runnable showNotification = () -> { + try { + applyNotificationImage(notificationInfo.notificationBuilder, imageUrl); + } catch (RuntimeException e) { + Logger.error("Unexpected error while applying notification image", e); + } finally { + notificationManager.notify(notificationInfo.tag, notificationInfo.id, notificationInfo.notificationBuilder.build()); + } + }; + + if (Looper.myLooper() != Looper.getMainLooper()) { + showNotification.run(); + return; + } + + ExecutorService displayExecutor = Executors.newSingleThreadExecutor(); + displayExecutor.execute(() -> { + try { + showNotification.run(); + } finally { + displayExecutor.shutdown(); + } + }); + } + + private void applyNotificationImage(NotificationCompat.Builder notificationBuilder, Uri imageUrl) { + if (imageUrl == null) { + return; + } + + ImageDownload imageDownload = ImageDownload.create(imageUrl.toString()); + if (imageDownload == null) { + return; + } + + ExecutorService imageExecutor = Executors.newSingleThreadExecutor(); + try { + imageDownload.start(imageExecutor); + Bitmap bitmap = Tasks.await(imageDownload.getTask(), IMAGE_DOWNLOAD_TIMEOUT_SECONDS, TimeUnit.SECONDS); + notificationBuilder.setLargeIcon(bitmap); + notificationBuilder.setStyle(new NotificationCompat.BigPictureStyle().bigPicture(bitmap).bigLargeIcon((Bitmap) null)); + } catch (ExecutionException e) { + Logger.warn("Failed to download notification image: " + e.getCause()); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + Logger.warn("Notification image download was interrupted"); + } catch (TimeoutException e) { + Logger.warn("Notification image download timed out"); + } finally { + imageDownload.close(); + imageExecutor.shutdownNow(); + } + } + public static PushNotificationsPlugin getPushNotificationsInstance() { if (staticBridge != null && staticBridge.getWebView() != null) { PluginHandle handle = staticBridge.getPlugin("PushNotifications"); From ed6cf8f1f64ce63ab7630c41831b6606c9c6636c Mon Sep 17 00:00:00 2001 From: Michal D Date: Thu, 17 Sep 2026 19:11:53 +0200 Subject: [PATCH 12/12] fix(share): present share sheet from the topmost view controller on iOS (#2574) Co-authored-by: OS-ruimoreiramendes --- .../ios/Sources/SharePlugin/SharePlugin.swift | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/share/ios/Sources/SharePlugin/SharePlugin.swift b/share/ios/Sources/SharePlugin/SharePlugin.swift index 73aa61b2b2..234c5f2865 100644 --- a/share/ios/Sources/SharePlugin/SharePlugin.swift +++ b/share/ios/Sources/SharePlugin/SharePlugin.swift @@ -64,12 +64,28 @@ public class SharePlugin: CAPPlugin, CAPBridgedPlugin { } } - if self?.bridge?.viewController?.presentedViewController != nil { - call.reject("Can't share while sharing is in progress") - return + // Present from the topmost presented view controller so the share sheet appears + // above any view controller the app has presented over the webview. With nothing + // presented this resolves to the bridge view controller, i.e. unchanged behaviour. + // A share is only in progress when a share sheet is already presented. + var presenter = self?.bridge?.viewController + while let presented = presenter?.presentedViewController { + if presented is UIActivityViewController { + call.reject("Can't share while sharing is in progress") + return + } + presenter = presented + } + // `setCenteredPopover` anchors to the bridge view controller's view, which is not in + // the presenter's hierarchy when presenting from a different view controller. Anchor + // the popover to the presenting view controller's own view instead, centered and + // without an arrow, matching `setCenteredPopover` behaviour. + if let popover = actionController.popoverPresentationController, let presenterView = presenter?.view { + popover.sourceView = presenterView + popover.sourceRect = CGRect(x: presenterView.bounds.midX, y: presenterView.bounds.midY, width: 0, height: 0) + popover.permittedArrowDirections = [] } - self?.setCenteredPopover(actionController) - self?.bridge?.viewController?.present(actionController, animated: true, completion: nil) + presenter?.present(actionController, animated: true, completion: nil) } } }