Skip to content

feat!: add partial night & day theme support #1818

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jul 7, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions lib/Api.js
Original file line number Diff line number Diff line change
Expand Up @@ -72,9 +72,9 @@ class Api {
platformWww: path.join(this.root, 'platform_www'),
configXml: path.join(appRes, 'xml', 'config.xml'),
defaultConfigXml: path.join(this.root, 'cordova', 'defaults.xml'),
strings: path.join(appRes, 'values', 'strings.xml'),
themes: path.join(appRes, 'values', 'themes.xml'),
colors: path.join(appRes, 'values', 'colors.xml'),
strings: path.join(appRes, 'values', 'cdv_strings.xml'),
themes: path.join(appRes, 'values', 'cdv_themes.xml'),
colors: path.join(appRes, 'values', 'cdv_colors.xml'),
manifest: path.join(appMain, 'AndroidManifest.xml'),
build: path.join(this.root, 'build'),
javaSrc: path.join(appMain, 'java')
Expand Down
2 changes: 1 addition & 1 deletion lib/create.js
Original file line number Diff line number Diff line change
Expand Up @@ -264,7 +264,7 @@ exports.create = function (project_path, config, options, events) {
fs.mkdirSync(activity_dir, { recursive: true });
fs.cpSync(path.join(project_template_dir, 'Activity.java'), activity_path);
utils.replaceFileContents(activity_path, /__ACTIVITY__/, safe_activity_name);
utils.replaceFileContents(path.join(app_path, 'res', 'values', 'strings.xml'), /__NAME__/, utils.escape(project_name));
utils.replaceFileContents(path.join(app_path, 'res', 'values', 'cdv_strings.xml'), /__NAME__/, utils.escape(project_name));
utils.replaceFileContents(activity_path, /__ID__/, package_name);

const manifest = new AndroidManifest(path.join(project_template_dir, 'AndroidManifest.xml'));
Expand Down
40 changes: 14 additions & 26 deletions lib/prepare.js
Original file line number Diff line number Diff line change
Expand Up @@ -346,7 +346,7 @@ function updateProjectAccordingTo (platformConfig, locations) {
* @param {Object} locations A map of locations for this platform
*/
function updateProjectStrings (platformConfig, locations) {
// Update app name by editing res/values/strings.xml
// Update app name by editing res/values/cdv_strings.xml
const strings = xmlHelpers.parseElementtreeSync(locations.strings);

const name = platformConfig.name();
Expand Down Expand Up @@ -377,7 +377,7 @@ function warnForDeprecatedSplashScreen (cordovaProject) {
* @param {Object} locations A map of locations for this platform
*/
function updateProjectTheme (platformConfig, locations) {
// res/values/themes.xml
// res/values/cdv_themes.xml
const themes = xmlHelpers.parseElementtreeSync(locations.themes);
const splashScreenTheme = themes.find('style[@name="Theme.App.SplashScreen"]');

Expand Down Expand Up @@ -408,13 +408,17 @@ function updateProjectTheme (platformConfig, locations) {
if (!splashBg) {
splashBg = platformConfig.getPreference('BackgroundColor', this.platform);
}
if (!splashBg) {
splashBg = '@color/cdv_splashscreen_background';
}

// use the user defined value for "colors.xml"
updateProjectSplashScreenBackgroundColor(splashBg, locations);
events.emit('verbose', 'The Android Splash Screen background color was set to: ' +
(splashBg === '@color/cdv_splashscreen_background' ? 'Default' : splashBg)
);

// force the themes value to `@color/cdv_splashscreen_background`
const splashBgNode = splashScreenTheme.find('item[@name="windowSplashScreenBackground"]');
splashBgNode.text = '@color/cdv_splashscreen_background';
splashBgNode.text = splashBg;

[
// Splash Screen
Expand Down Expand Up @@ -471,7 +475,7 @@ function updateProjectTheme (platformConfig, locations) {
break;

case 'windowSplashScreenIconBackgroundColor':
// use the user defined value for "colors.xml"
// use the user defined value for "cdv_colors.xml"
updateProjectSplashScreenIconBackgroundColor(cdvConfigPrefValue, locations);

// force the themes value to `@color/cdv_splashscreen_icon_background`
Expand All @@ -495,7 +499,7 @@ function updateProjectTheme (platformConfig, locations) {
break;

case 'postSplashScreenTheme':
themeTargetNode.text = cdvConfigPrefValue || '@style/Theme.AppCompat.NoActionBar';
themeTargetNode.text = cdvConfigPrefValue || '@style/Theme.Cordova.App.DayNight';
break;

default:
Expand All @@ -507,29 +511,13 @@ function updateProjectTheme (platformConfig, locations) {
events.emit('verbose', 'Wrote out Android application themes to ' + locations.themes);
}

/**
* @param {String} splashBackgroundColor SplashScreen Background Color Hex Code
* be used to update project
* @param {Object} locations A map of locations for this platform
*/
function updateProjectSplashScreenBackgroundColor (splashBackgroundColor, locations) {
if (!splashBackgroundColor) { splashBackgroundColor = '#FFFFFF'; }

// res/values/colors.xml
const colors = xmlHelpers.parseElementtreeSync(locations.colors);
colors.find('color[@name="cdv_splashscreen_background"]').text = splashBackgroundColor.replace(/'/g, '\\\'');

fs.writeFileSync(locations.colors, colors.write({ indent: 4 }), 'utf-8');
events.emit('verbose', 'Wrote out Android application SplashScreen Color to ' + locations.colors);
}

/**
* @param {String} splashIconBackgroundColor SplashScreen Icon Background Color Hex Code
* be used to update project
* @param {Object} locations A map of locations for this platform
*/
function updateProjectSplashScreenIconBackgroundColor (splashIconBackgroundColor, locations) {
// res/values/colors.xml
// res/values/cdv_colors.xml
const colors = xmlHelpers.parseElementtreeSync(locations.colors);
// node name
const name = 'cdv_splashscreen_icon_background';
Expand Down Expand Up @@ -627,12 +615,12 @@ function updateProjectSplashScreenImage (locations, themeKey, cdvConfigPrefKey,

// copy the png to correct mipmap folder with name of ic_cdv_splashscreen.png
// delete ic_cdv_splashscreen.xml from drawable folder
// update themes.xml windowSplashScreenAnimatedIcon value to @mipmap/ic_cdv_splashscreen
// update cdv_themes.xml windowSplashScreenAnimatedIcon value to @mipmap/ic_cdv_splashscreen
cleanupAndSetProjectSplashScreenImage(cdvConfigPrefValue, destFilePath, possiblePreviousDestFilePath);
} else if (iconExtension === '.xml') {
// copy the xml to drawable folder with name of ic_cdv_splashscreen.xml
// delete ic_cdv_splashscreen.png from mipmap folder
// update themes.xml windowSplashScreenAnimatedIcon value to @drawable/ic_cdv_splashscreen
// update cdv_themes.xml windowSplashScreenAnimatedIcon value to @drawable/ic_cdv_splashscreen
cleanupAndSetProjectSplashScreenImage(cdvConfigPrefValue, destFilePath, possiblePreviousDestFilePath);
} else {
// use the default destFilePath & possiblePreviousDestFilePath, no update require.
Expand Down
8 changes: 4 additions & 4 deletions spec/unit/create.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -276,17 +276,17 @@ describe('create', function () {
});
});

it('should interpolate the project name into strings.xml', () => {
it('should interpolate the project name into cdv_strings.xml', () => {
config_mock.name.and.returnValue('IncredibleApp');
return create.create(project_path, config_mock, {}, events_mock).then(() => {
expect(utils.replaceFileContents).toHaveBeenCalledWith(path.join(app_path, 'res', 'values', 'strings.xml'), /__NAME__/, 'IncredibleApp');
expect(utils.replaceFileContents).toHaveBeenCalledWith(path.join(app_path, 'res', 'values', 'cdv_strings.xml'), /__NAME__/, 'IncredibleApp');
});
});

it('should interpolate the escaped project name into strings.xml', () => {
it('should interpolate the escaped project name into cdv_strings.xml', () => {
config_mock.name.and.returnValue('<Incredible&App>');
return create.create(project_path, config_mock, {}, events_mock).then(() => {
expect(utils.replaceFileContents).toHaveBeenCalledWith(path.join(app_path, 'res', 'values', 'strings.xml'), /__NAME__/, '&lt;Incredible&amp;App&gt;');
expect(utils.replaceFileContents).toHaveBeenCalledWith(path.join(app_path, 'res', 'values', 'cdv_strings.xml'), /__NAME__/, '&lt;Incredible&amp;App&gt;');
});
});

Expand Down
2 changes: 1 addition & 1 deletion spec/unit/prepare.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -930,7 +930,7 @@ describe('prepare', () => {
locations: {
plugins: '/mock/plugins',
www: '/mock/www',
strings: '/mock/res/values/strings.xml'
strings: '/mock/res/values/cdv_strings.xml'
}
};

Expand Down
23 changes: 23 additions & 0 deletions templates/project/res/values-night-v34/cdv_colors.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<resources>
<color name="cdv_background_color">@android:color/system_background_dark</color>
<color name="cdv_splashscreen_background">@color/cdv_background_color</color>
</resources>
23 changes: 23 additions & 0 deletions templates/project/res/values-night/cdv_colors.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<resources>
<color name="cdv_background_color">#121318</color>
<color name="cdv_splashscreen_background">@color/cdv_background_color</color>
</resources>
23 changes: 23 additions & 0 deletions templates/project/res/values-v34/cdv_colors.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<resources>
<color name="cdv_background_color">@android:color/system_background_light</color>
<color name="cdv_splashscreen_background">@color/cdv_background_color</color>
</resources>
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,6 @@
under the License.
-->
<resources xmlns:tools="http://schemas.android.com/tools">
<color name="cdv_splashscreen_background">#FFFFFFFF</color>
<color name="cdv_background_color">#FAF8FF</color>
<color name="cdv_splashscreen_background">@color/cdv_background_color</color>
</resources>
Original file line number Diff line number Diff line change
Expand Up @@ -19,19 +19,23 @@
-->
<resources xmlns:tools="http://schemas.android.com/tools">
<style name="Theme.App.SplashScreen" parent="Theme.SplashScreen.IconBackground">
<!-- Optional: Set the splash screen background. (Default: #FFFFFF) -->
<item name="windowSplashScreenBackground">@color/cdv_splashscreen_background</item>
<!-- Optional: Set the splash screen background. (Default: @color/cdv_splashscreen_background) -->
<item name="windowSplashScreenBackground">@color/cdv_splashscreen_background</item>

<!-- Required: Add either a drawable or an animated drawable -->
<item name="windowSplashScreenAnimatedIcon">@drawable/ic_cdv_splashscreen</item>
<!-- Required: Add either a drawable or an animated drawable -->
<item name="windowSplashScreenAnimatedIcon">@drawable/ic_cdv_splashscreen</item>

<!-- Required: For animated icons -->
<item name="windowSplashScreenAnimationDuration">200</item>
<!-- Required: For animated icons -->
<item name="windowSplashScreenAnimationDuration">200</item>

<!-- Required: Set the theme of the Activity that directly follows your splash screen. -->
<item name="postSplashScreenTheme">@style/Theme.AppCompat.NoActionBar</item>
<!-- Required: Set the theme of the Activity that directly follows your splash screen. -->
<item name="postSplashScreenTheme">@style/Theme.Cordova.App.DayNight</item>

<!-- Disable Edge-to-Edge for SDK 35 -->
<item name="android:windowOptOutEdgeToEdgeEnforcement" tools:targetApi="35">true</item>
<!-- Disable Edge-to-Edge for SDK 35 -->
<item name="android:windowOptOutEdgeToEdgeEnforcement" tools:targetApi="35">true</item>
</style>

<style name="Theme.Cordova.App.DayNight" parent="Theme.AppCompat.DayNight.NoActionBar">
<item name="android:colorBackground">@color/cdv_background_color</item>
</style>
</resources>
1 change: 0 additions & 1 deletion templates/project/res/xml/config.xml
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,6 @@

<preference name="loglevel" value="DEBUG" />
<!--
<preference name="backgroundColor" value="0xFFF" />
<preference name="loadUrlTimeoutValue" value="20000" />
<preference name="InAppBrowserStorageEnabled" value="true" />
<preference name="disallowOverscroll" value="true" />
Expand Down