From c226537afe8e0ce03e255ab0c893bf7791b842a6 Mon Sep 17 00:00:00 2001 From: OS-pedrogustavobilro Date: Thu, 6 Nov 2025 11:42:09 +0000 Subject: [PATCH 01/15] chore(cli): Update plugins with breaking changes for Cap 8 migrate For now, only status-bar has the possibility of breaking changes. May still be changed. --- cli/src/tasks/migrate.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/cli/src/tasks/migrate.ts b/cli/src/tasks/migrate.ts index 4b76836e6..e1a83f1b5 100644 --- a/cli/src/tasks/migrate.ts +++ b/cli/src/tasks/migrate.ts @@ -373,11 +373,7 @@ async function installLatestLibs(dependencyManager: string, runInstall: boolean, async function writeBreakingChanges() { const breaking = [ - '@capacitor/app', - '@capacitor/device', - '@capacitor/haptics', - '@capacitor/splash-screen', - '@capacitor/statusbar', + '@capacitor/status-bar', ]; const broken = []; for (const lib of breaking) { From 94023e91c00811992761028676e30cf831d99760 Mon Sep 17 00:00:00 2001 From: OS-pedrogustavobilro Date: Thu, 6 Nov 2025 11:49:49 +0000 Subject: [PATCH 02/15] chore(cli): Update Capacitor major and deployment targets --- cli/src/tasks/migrate.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/cli/src/tasks/migrate.ts b/cli/src/tasks/migrate.ts index e1a83f1b5..3de8841ed 100644 --- a/cli/src/tasks/migrate.ts +++ b/cli/src/tasks/migrate.ts @@ -46,10 +46,10 @@ const plugins = [ '@capacitor/text-zoom', '@capacitor/toast', ]; -const coreVersion = '^7.0.0'; -const pluginVersion = '^7.0.0'; +const coreVersion = 'next'; +const pluginVersion = 'next'; const gradleVersion = '8.11.1'; -const iOSVersion = '14'; +const iOSVersion = '15'; let installFailed = false; export async function migrateCommand(config: Config, noprompt: boolean, packagemanager: string): Promise { @@ -58,14 +58,14 @@ export async function migrateCommand(config: Config, noprompt: boolean, packagem } const capMajor = await checkCapacitorMajorVersion(config); - if (capMajor < 6) { - fatal('Migrate can only be used on Capacitor 6, please use the CLI in Capacitor 6 to upgrade to 6 first'); + if (capMajor < 7) { + fatal('Migrate can only be used on Capacitor 7, please use the CLI in Capacitor 7 to upgrade to 7 first'); } const jdkMajor = await checkJDKMajorVersion(); if (jdkMajor < 21) { - logger.warn('Capacitor 7 requires JDK 21 or higher. Some steps may fail.'); + logger.warn('Capacitor 8 requires JDK 21 or higher. Some steps may fail.'); } const variablesAndClasspaths: @@ -92,7 +92,7 @@ export async function migrateCommand(config: Config, noprompt: boolean, packagem const { migrateconfirm } = noprompt ? { migrateconfirm: 'y' } - : await logPrompt(`Capacitor 7 sets a deployment target of iOS ${iOSVersion} and Android 15 (SDK 35). \n`, { + : await logPrompt(`Capacitor 8 sets a deployment target of iOS ${iOSVersion} and Android 16 (SDK 36). \n`, { type: 'text', name: 'migrateconfirm', message: `Are you sure you want to migrate? (Y/n)`, From 485281fabffa5bc9b164767992ee2cc22c5e3d39 Mon Sep 17 00:00:00 2001 From: OS-pedrogustavobilro Date: Thu, 6 Nov 2025 11:54:24 +0000 Subject: [PATCH 03/15] chore(cli): update google maps default versions Matches what Capacitor Google Maps is using as default if no variable exists --- cli/src/tasks/migrate.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cli/src/tasks/migrate.ts b/cli/src/tasks/migrate.ts index 3de8841ed..81d1fbe05 100644 --- a/cli/src/tasks/migrate.ts +++ b/cli/src/tasks/migrate.ts @@ -280,10 +280,10 @@ export async function migrateCommand(config: Config, noprompt: boolean, packagem androidxMaterialVersion: '1.12.0', androidxExifInterfaceVersion: '1.3.7', androidxCoreKTXVersion: '1.12.0', - googleMapsPlayServicesVersion: '18.2.0', + googleMapsPlayServicesVersion: '19.0.0', googleMapsUtilsVersion: '3.8.2', - googleMapsKtxVersion: '5.0.0', - googleMapsUtilsKtxVersion: '5.0.0', + googleMapsKtxVersion: '5.1.1', + googleMapsUtilsKtxVersion: '5.1.1', kotlinxCoroutinesVersion: '1.7.3', coreSplashScreenVersion: '1.0.1', }; From 5dd652ac109b5e2e8e14e9a4f2833b96f09f6673 Mon Sep 17 00:00:00 2001 From: OS-pedrogustavobilro Date: Thu, 6 Nov 2025 12:05:34 +0000 Subject: [PATCH 04/15] chore(cli): Add density to AndroidManifest.xml im migrate command Capacitor 8 added density to "configChanges" property for the Android template, this makes sure it's also added there. Re-uses the existing command for navigation, which came from Capacitor 7. --- cli/src/tasks/migrate.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cli/src/tasks/migrate.ts b/cli/src/tasks/migrate.ts index 81d1fbe05..4a51ff8a4 100644 --- a/cli/src/tasks/migrate.ts +++ b/cli/src/tasks/migrate.ts @@ -188,8 +188,8 @@ export async function migrateCommand(config: Config, noprompt: boolean, packagem } if (allDependencies['@capacitor/android'] && existsSync(config.android.platformDirAbs)) { - // AndroidManifest.xml add navigation" - await runTask(`Migrating AndroidManifest.xml by adding navigation to Activity configChanges.`, () => { + // AndroidManifest.xml add "density" + await runTask(`Migrating AndroidManifest.xml by adding density to Activity configChanges.`, () => { return updateAndroidManifest(join(config.android.srcMainDirAbs, 'AndroidManifest.xml')); }); @@ -617,12 +617,12 @@ async function updateAndroidManifest(filename: string) { return; } - if (txt.includes('navigation')) { + if (txt.includes('|density')) { return; // Probably already updated } const replaced = txt.replace( - 'android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode"', 'android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode|navigation"', + 'android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode|navigation|density"', ); writeFileSync(filename, replaced, 'utf-8'); From cf5b1b0fde182fd0831d13dbd7dd4f8d4833c968 Mon Sep 17 00:00:00 2001 From: OS-pedrogustavobilro Date: Thu, 6 Nov 2025 12:30:22 +0000 Subject: [PATCH 05/15] chore(cli): Update gradle version for migrate command --- cli/src/tasks/migrate.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/src/tasks/migrate.ts b/cli/src/tasks/migrate.ts index 4a51ff8a4..65c6bca2e 100644 --- a/cli/src/tasks/migrate.ts +++ b/cli/src/tasks/migrate.ts @@ -48,7 +48,7 @@ const plugins = [ ]; const coreVersion = 'next'; const pluginVersion = 'next'; -const gradleVersion = '8.11.1'; +const gradleVersion = '8.14.3'; const iOSVersion = '15'; let installFailed = false; From 12f10d7a1b2e4b46101f029f834e804e0f665515 Mon Sep 17 00:00:00 2001 From: OS-pedrogustavobilro Date: Thu, 6 Nov 2025 13:39:36 +0000 Subject: [PATCH 06/15] chore(cli): Update capacitor update link for official plugins --- cli/src/tasks/migrate.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/src/tasks/migrate.ts b/cli/src/tasks/migrate.ts index 65c6bca2e..4a652ba25 100644 --- a/cli/src/tasks/migrate.ts +++ b/cli/src/tasks/migrate.ts @@ -383,7 +383,7 @@ async function writeBreakingChanges() { } if (broken.length > 0) { logger.info( - `IMPORTANT: Review https://capacitorjs.com/docs/next/updating/7-0#plugins for breaking changes in these plugins that you use: ${broken.join( + `IMPORTANT: Review https://capacitorjs.com/docs/next/updating/8-0#plugins for breaking changes in these plugins that you use: ${broken.join( ', ', )}.`, ); From 1905659af19bec6de77600477e248f61a6162674 Mon Sep 17 00:00:00 2001 From: OS-pedrogustavobilro Date: Thu, 6 Nov 2025 16:15:54 +0000 Subject: [PATCH 07/15] chore(cli): Add step to migrate app/build.gradle The gradle version that Capacitor 8 uses brings upon warnings that would eventually turn into compilation errors. This commit adds a step to fix those app/build.gradle, by making use of the updated Groovy Gradle DSL syntax for assigning certain properties in the gradle file. This way, the build.gradle will resemble that of the updated android app template for Cap 8. --- cli/src/tasks/migrate.ts | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/cli/src/tasks/migrate.ts b/cli/src/tasks/migrate.ts index 4a652ba25..1b9095ab4 100644 --- a/cli/src/tasks/migrate.ts +++ b/cli/src/tasks/migrate.ts @@ -222,9 +222,13 @@ export async function migrateCommand(config: Config, noprompt: boolean, packagem } else { logger.warn('Skipped upgrading gradle wrapper files'); } - await runTask(`Migrating build.gradle file.`, () => { + await runTask(`Migrating root build.gradle file.`, () => { return updateBuildGradle(join(config.android.platformDirAbs, 'build.gradle'), variablesAndClasspaths); }); + + await runTask(`Migrating app build.gradle file.`, () => { + return updateAppBuildGradle(join(config.android.appDirAbs, 'build.gradle')); + }); // Variables gradle await runTask(`Migrating variables.gradle file.`, () => { @@ -544,6 +548,24 @@ async function updateBuildGradle( writeFileSync(filename, replaced, 'utf-8'); } +async function updateAppBuildGradle(filename: string) { + const txt = readFile(filename); + if (!txt) { + return; + } + let replaced = txt; + + const gradlePproperties = ['compileSdk', 'namespace', 'ignoreAssetsPattern']; + for (const prop of gradlePproperties) { + // Use updated Groovy DSL syntax with " = " assignment + const regex = new RegExp(`(^\\s*${prop})\\s+(?!=)(.+)$`,'gm'); + replaced = replaced.replace(regex, (_match, key, value) => { + return `${key} = ${value.trim()}`; + }); + } + writeFileSync(filename, replaced, 'utf-8'); +} + async function updateFile( config: Config, filename: string, From dae720528b309b9846a60fea565640cbc9530a85 Mon Sep 17 00:00:00 2001 From: OS-pedrogustavobilro Date: Fri, 7 Nov 2025 13:50:35 +0000 Subject: [PATCH 08/15] chore(cli): Update android dependency versions for migrate command Tested on several existing capacitor apps that use existing plugins, all is working with the latest versions. --- cli/src/tasks/migrate.ts | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/cli/src/tasks/migrate.ts b/cli/src/tasks/migrate.ts index 1b9095ab4..e3f6f7654 100644 --- a/cli/src/tasks/migrate.ts +++ b/cli/src/tasks/migrate.ts @@ -278,18 +278,18 @@ export async function migrateCommand(config: Config, noprompt: boolean, packagem } } const pluginVariables: { [key: string]: string } = { - firebaseMessagingVersion: '24.1.0', + firebaseMessagingVersion: '25.0.1', playServicesLocationVersion: '21.3.0', - androidxBrowserVersion: '1.8.0', - androidxMaterialVersion: '1.12.0', - androidxExifInterfaceVersion: '1.3.7', - androidxCoreKTXVersion: '1.12.0', - googleMapsPlayServicesVersion: '19.0.0', - googleMapsUtilsVersion: '3.8.2', - googleMapsKtxVersion: '5.1.1', - googleMapsUtilsKtxVersion: '5.1.1', - kotlinxCoroutinesVersion: '1.7.3', - coreSplashScreenVersion: '1.0.1', + androidxBrowserVersion: '1.9.0', + androidxMaterialVersion: '1.13.0', + androidxExifInterfaceVersion: '1.4.0', + androidxCoreKTXVersion: '1.17.0', + googleMapsPlayServicesVersion: '19.2.0', + googleMapsUtilsVersion: '3.19.1', + googleMapsKtxVersion: '5.2.1', + googleMapsUtilsKtxVersion: '5.2.1', + kotlinxCoroutinesVersion: '1.10.2', + coreSplashScreenVersion: '1.2.0', }; for (const variable of Object.keys(pluginVariables)) { await updateFile(config, variablesPath, `${variable} = '`, `'`, pluginVariables[variable], true); From 426e434e8c9f6de9fcd69d40fa4b8222dbbee96c Mon Sep 17 00:00:00 2001 From: OS-pedrogustavobilro Date: Fri, 7 Nov 2025 14:06:36 +0000 Subject: [PATCH 09/15] chore: run fmt for cli --- cli/src/tasks/migrate.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/cli/src/tasks/migrate.ts b/cli/src/tasks/migrate.ts index e3f6f7654..56793fe8b 100644 --- a/cli/src/tasks/migrate.ts +++ b/cli/src/tasks/migrate.ts @@ -225,7 +225,7 @@ export async function migrateCommand(config: Config, noprompt: boolean, packagem await runTask(`Migrating root build.gradle file.`, () => { return updateBuildGradle(join(config.android.platformDirAbs, 'build.gradle'), variablesAndClasspaths); }); - + await runTask(`Migrating app build.gradle file.`, () => { return updateAppBuildGradle(join(config.android.appDirAbs, 'build.gradle')); }); @@ -376,9 +376,7 @@ async function installLatestLibs(dependencyManager: string, runInstall: boolean, } async function writeBreakingChanges() { - const breaking = [ - '@capacitor/status-bar', - ]; + const breaking = ['@capacitor/status-bar']; const broken = []; for (const lib of breaking) { if (allDependencies[lib]) { @@ -558,7 +556,7 @@ async function updateAppBuildGradle(filename: string) { const gradlePproperties = ['compileSdk', 'namespace', 'ignoreAssetsPattern']; for (const prop of gradlePproperties) { // Use updated Groovy DSL syntax with " = " assignment - const regex = new RegExp(`(^\\s*${prop})\\s+(?!=)(.+)$`,'gm'); + const regex = new RegExp(`(^\\s*${prop})\\s+(?!=)(.+)$`, 'gm'); replaced = replaced.replace(regex, (_match, key, value) => { return `${key} = ${value.trim()}`; }); From d477b3567f91d9c10dc94f72d527cd09a2554404 Mon Sep 17 00:00:00 2001 From: Pedro Bilro Date: Mon, 10 Nov 2025 13:04:59 +0000 Subject: [PATCH 10/15] chore(cli): Update androidx exif version for migrate command Co-authored-by: jcesarmobile --- cli/src/tasks/migrate.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/src/tasks/migrate.ts b/cli/src/tasks/migrate.ts index 56793fe8b..7c6608a42 100644 --- a/cli/src/tasks/migrate.ts +++ b/cli/src/tasks/migrate.ts @@ -282,7 +282,7 @@ export async function migrateCommand(config: Config, noprompt: boolean, packagem playServicesLocationVersion: '21.3.0', androidxBrowserVersion: '1.9.0', androidxMaterialVersion: '1.13.0', - androidxExifInterfaceVersion: '1.4.0', + androidxExifInterfaceVersion: '1.4.1', androidxCoreKTXVersion: '1.17.0', googleMapsPlayServicesVersion: '19.2.0', googleMapsUtilsVersion: '3.19.1', From 6955aab16ff984ea375a4a00b192ce435802a433 Mon Sep 17 00:00:00 2001 From: OS-pedrogustavobilro Date: Mon, 10 Nov 2025 15:55:56 +0000 Subject: [PATCH 11/15] chore(cli): Remove old method to add namespace from manifest --- cli/src/android/update.ts | 2 - cli/src/tasks/migrate.ts | 99 --------------------------------------- 2 files changed, 101 deletions(-) diff --git a/cli/src/android/update.ts b/cli/src/android/update.ts index 8c04a1527..16e8c4935 100644 --- a/cli/src/android/update.ts +++ b/cli/src/android/update.ts @@ -19,7 +19,6 @@ import { } from '../plugin'; import type { Plugin } from '../plugin'; import { copy as copyTask } from '../tasks/copy'; -import { patchOldCapacitorPlugins } from '../tasks/migrate'; import { readdirp, convertToUnixPath } from '../util/fs'; import { resolveNode } from '../util/node'; import { extractTemplate } from '../util/template'; @@ -39,7 +38,6 @@ export async function updateAndroid(config: Config): Promise { await writePluginsJson(config, capacitorPlugins); await removePluginsNativeFiles(config); const cordovaPlugins = plugins.filter((p) => getPluginType(p, platform) === PluginType.Cordova); - await patchOldCapacitorPlugins(config); if (cordovaPlugins.length > 0) { await copyPluginsNativeFiles(config, cordovaPlugins); } diff --git a/cli/src/tasks/migrate.ts b/cli/src/tasks/migrate.ts index 7c6608a42..78d88ac38 100644 --- a/cli/src/tasks/migrate.ts +++ b/cli/src/tasks/migrate.ts @@ -3,16 +3,13 @@ import { join } from 'path'; import { rimraf } from 'rimraf'; import { coerce, gte, lt } from 'semver'; -import { getAndroidPlugins } from '../android/common'; import c from '../colors'; import { getCoreVersion, runTask, checkJDKMajorVersion } from '../common'; import type { Config } from '../definitions'; import { fatal } from '../errors'; import { getMajoriOSVersion } from '../ios/common'; import { logger, logPrompt, logSuccess } from '../log'; -import { getPlugins } from '../plugin'; import { deleteFolderRecursive } from '../util/fs'; -import { resolveNode } from '../util/node'; import { checkPackageManager } from '../util/spm'; import { runCommand } from '../util/subprocess'; import { extractTemplate } from '../util/template'; @@ -298,14 +295,6 @@ export async function migrateCommand(config: Config, noprompt: boolean, packagem }); rimraf.sync(join(config.android.appDirAbs, 'build')); - - if (!installFailed) { - await runTask('Migrating package from Manifest to build.gradle in Capacitor plugins', () => { - return patchOldCapacitorPlugins(config); - }); - } else { - logger.warn('Skipped migrating package from Manifest to build.gradle in Capacitor plugins'); - } } // Write all breaking changes @@ -462,59 +451,6 @@ async function updateGradleWrapperFiles(platformDir: string) { ); } -async function movePackageFromManifestToBuildGradle(manifestFilename: string, buildGradleFilename: string) { - const manifestText = readFile(manifestFilename); - const buildGradleText = readFile(buildGradleFilename); - - if (!manifestText) { - logger.error(`Could not read ${manifestFilename}. Check its permissions and if it exists.`); - return; - } - - if (!buildGradleText) { - logger.error(`Could not read ${buildGradleFilename}. Check its permissions and if it exists.`); - return; - } - - const namespaceExists = new RegExp(/\s+namespace\s+/).test(buildGradleText); - if (namespaceExists) { - logger.error('Found namespace in build.gradle already, skipping migration'); - return; - } - - let packageName: string; - const manifestRegEx = new RegExp(/package="([^"]+)"/); - const manifestResults = manifestRegEx.exec(manifestText); - - if (manifestResults === null) { - logger.error(`Unable to update Android Manifest. Package not found.`); - return; - } else { - packageName = manifestResults[1]; - } - - let manifestReplaced = manifestText; - - manifestReplaced = manifestReplaced.replace(manifestRegEx, ''); - - if (manifestText == manifestReplaced) { - logger.error(`Unable to update Android Manifest: no changes were detected in Android Manifest file`); - return; - } - - let buildGradleReplaced = buildGradleText; - - buildGradleReplaced = setAllStringIn(buildGradleText, 'android {', '\n', `\n namespace "${packageName}"`); - - if (buildGradleText == buildGradleReplaced) { - logger.error(`Unable to update buildGradleText: no changes were detected in Android Manifest file`); - return; - } - - writeFileSync(manifestFilename, manifestReplaced, 'utf-8'); - writeFileSync(buildGradleFilename, buildGradleReplaced, 'utf-8'); -} - async function updateBuildGradle( filename: string, variablesAndClasspaths: { @@ -647,38 +583,3 @@ async function updateAndroidManifest(filename: string) { writeFileSync(filename, replaced, 'utf-8'); } - -export async function patchOldCapacitorPlugins(config: Config): Promise { - const allPlugins = await getPlugins(config, 'android'); - const androidPlugins = await getAndroidPlugins(allPlugins); - return await Promise.all( - androidPlugins.map(async (p) => { - if (p.manifest?.android?.src) { - const buildGradlePath = resolveNode(config.app.rootDir, p.id, p.manifest.android.src, 'build.gradle'); - const manifestPath = resolveNode( - config.app.rootDir, - p.id, - p.manifest.android.src, - 'src', - 'main', - 'AndroidManifest.xml', - ); - if (buildGradlePath && manifestPath) { - const gradleContent = readFile(buildGradlePath); - if (!gradleContent?.includes('namespace')) { - if (plugins.includes(p.id)) { - logger.warn( - `You are using an outdated version of ${p.id}, update the plugin to version ${pluginVersion}`, - ); - } else { - logger.warn( - `${p.id}@${p.version} doesn't officially support Capacitor ${coreVersion} yet, doing our best moving it's package to build.gradle so it builds`, - ); - } - movePackageFromManifestToBuildGradle(manifestPath, buildGradlePath); - } - } - } - }), - ); -} From 5961084045458f471722fe4fbc65555053101386 Mon Sep 17 00:00:00 2001 From: OS-pedrogustavobilro Date: Mon, 10 Nov 2025 16:08:08 +0000 Subject: [PATCH 12/15] chore(cli): Add additional plugins with breaking changes Some are updates to gradle dependencies, others to inform of changes in Android 16. --- cli/src/tasks/migrate.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/cli/src/tasks/migrate.ts b/cli/src/tasks/migrate.ts index 78d88ac38..e3fce5d50 100644 --- a/cli/src/tasks/migrate.ts +++ b/cli/src/tasks/migrate.ts @@ -365,7 +365,17 @@ async function installLatestLibs(dependencyManager: string, runInstall: boolean, } async function writeBreakingChanges() { - const breaking = ['@capacitor/status-bar']; + const breaking = [ + '@capacitor/action-sheet', + '@capacitor/barcode-scanner', + '@capacitor/browser', + '@capacitor/camera', + '@capacitor/google-maps', + '@capacitor/push-notifications', + '@capacitor/screen-orientation', + '@capacitor/splash-screen', + '@capacitor/status-bar', + ]; const broken = []; for (const lib of breaking) { if (allDependencies[lib]) { From 8ec0779b8ecf411401e215bbd7b803e7de7493e7 Mon Sep 17 00:00:00 2001 From: OS-pedrogustavobilro Date: Tue, 11 Nov 2025 17:32:21 +0000 Subject: [PATCH 13/15] chore(cli): Fail migrate if density cannot be added to Android Manifest --- cli/src/tasks/migrate.ts | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/cli/src/tasks/migrate.ts b/cli/src/tasks/migrate.ts index e3fce5d50..c46b6c568 100644 --- a/cli/src/tasks/migrate.ts +++ b/cli/src/tasks/migrate.ts @@ -583,13 +583,23 @@ async function updateAndroidManifest(filename: string) { return; } - if (txt.includes('|density')) { + if (txt.includes('|density') || txt.includes('density|')) { return; // Probably already updated } - const replaced = txt.replace( - 'android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode|navigation"', - 'android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode|navigation|density"', - ); + // Since navigation was an optional change in Capacitor 7, attempting to add density and/or navigation + const replaced = txt + .replace( + 'android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode|navigation"', + 'android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode|navigation|density"', + ) + .replace( + 'android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode"', + 'android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode|navigation|density"', + ); - writeFileSync(filename, replaced, 'utf-8'); + if (!replaced.includes('|density')) { + throw new Error(`Unable to add 'density' to 'android:configChanges' in ${filename}. Try adding it manually`); + } else { + writeFileSync(filename, replaced, 'utf-8'); + } } From 91fe0e2ec2b183f0cc3c3ffdf1a8020910f23df2 Mon Sep 17 00:00:00 2001 From: OS-pedrogustavobilro Date: Wed, 12 Nov 2025 13:18:23 +0000 Subject: [PATCH 14/15] chore(cli): Log error instead of failing command --- cli/src/tasks/migrate.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/src/tasks/migrate.ts b/cli/src/tasks/migrate.ts index c46b6c568..4e01b2452 100644 --- a/cli/src/tasks/migrate.ts +++ b/cli/src/tasks/migrate.ts @@ -598,7 +598,7 @@ async function updateAndroidManifest(filename: string) { ); if (!replaced.includes('|density')) { - throw new Error(`Unable to add 'density' to 'android:configChanges' in ${filename}. Try adding it manually`); + logger.error(`Unable to add 'density' to 'android:configChanges' in ${filename}. Try adding it manually`); } else { writeFileSync(filename, replaced, 'utf-8'); } From 9b4a66b7323d2889d415a63158a5f0891e21ceb0 Mon Sep 17 00:00:00 2001 From: OS-pedrogustavobilro Date: Wed, 12 Nov 2025 13:48:13 +0000 Subject: [PATCH 15/15] chore(cli): Replace mention of Ionic VS Code extension Ionic VC Code extension is no longer support, suggest manual migration instead. --- cli/src/tasks/migrate.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/src/tasks/migrate.ts b/cli/src/tasks/migrate.ts index 4e01b2452..e13cceacb 100644 --- a/cli/src/tasks/migrate.ts +++ b/cli/src/tasks/migrate.ts @@ -83,7 +83,7 @@ export async function migrateCommand(config: Config, noprompt: boolean, packagem }; const monorepoWarning = - 'Please note this tool is not intended for use in a mono-repo environment, please check out the Ionic vscode extension for this functionality.'; + 'Please note this tool is not intended for use in a mono-repo environment, you should migrate manually instead. Refer to https://capacitorjs.com/docs/next/updating/8-0'; logger.info(monorepoWarning);