function updateProjectTheme()

in lib/prepare.js [379:508]


function updateProjectTheme (platformConfig, locations) {
    // res/values/themes.xml
    const themes = xmlHelpers.parseElementtreeSync(locations.themes);
    const splashScreenTheme = themes.find('style[@name="Theme.App.SplashScreen"]');

    // Update edge-to-edge settings in app theme.
    let hasE2E = false; // default case

    const preferenceE2E = platformConfig.getPreference('AndroidEdgeToEdge', this.platform);
    if (!preferenceE2E) {
        events.emit('verbose', 'The preference name "AndroidEdgeToEdge" was not set. Defaulting to "false".');
    } else {
        const hasInvalidPreferenceE2E = preferenceE2E !== 'true' && preferenceE2E !== 'false';
        if (hasInvalidPreferenceE2E) {
            events.emit('verbose', 'Preference name "AndroidEdgeToEdge" has an invalid value. Valid values are "true" or "false". Defaulting to "false"');
        }
        hasE2E = hasInvalidPreferenceE2E ? false : preferenceE2E === 'true';
    }

    const optOutE2EKey = 'android:windowOptOutEdgeToEdgeEnforcement';
    const optOutE2EItem = splashScreenTheme.find(`item[@name="${optOutE2EKey}"]`);
    const optOutE2EValue = !hasE2E ? 'true' : 'false';
    optOutE2EItem.text = optOutE2EValue;
    events.emit('verbose', `Updating theme item "${optOutE2EKey}" with value "${optOutE2EValue}"`);

    let splashBg = platformConfig.getPreference('AndroidWindowSplashScreenBackground', this.platform);
    if (!splashBg) {
        splashBg = platformConfig.getPreference('SplashScreenBackgroundColor', this.platform);
    }
    if (!splashBg) {
        splashBg = platformConfig.getPreference('BackgroundColor', this.platform);
    }

    // use the user defined value for "colors.xml"
    updateProjectSplashScreenBackgroundColor(splashBg, locations);

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

    [
        // Splash Screen
        'windowSplashScreenAnimatedIcon',
        'windowSplashScreenAnimationDuration',
        'android:windowSplashScreenBrandingImage',
        'windowSplashScreenIconBackgroundColor',
        'postSplashScreenTheme'
    ].forEach(themeKey => {
        const index = themeKey.indexOf(':') + 1;
        const cdvConfigPrefKey = 'Android' + themeKey.charAt(index).toUpperCase() + themeKey.slice(index + 1);
        const cdvConfigPrefValue = platformConfig.getPreference(cdvConfigPrefKey, this.platform);
        let themeTargetNode = splashScreenTheme.find(`item[@name="${themeKey}"]`);

        switch (themeKey) {
        case 'windowSplashScreenAnimatedIcon':
            // handle here the cases of "png" vs "xml" (drawable)
            // If "png":
            //  - Clear out default or previous set "drawable/ic_cdv_splashscreen.xml" if exisiting.
            //  - Copy png in correct mipmap dir with name "ic_cdv_splashscreen.png"
            // If "xml":
            //  - Clear out "{mipmap}/ic_cdv_splashscreen.png" if exisiting.
            //  - Copy xml into drawable dir with name "ic_cdv_splashscreen.xml"

            // updateProjectSplashScreenIcon()
            // value should change depending on case:
            // If "png": "@mipmap/ic_cdv_splashscreen"
            // If "xml": "@drawable/ic_cdv_splashscreen"
            updateProjectSplashScreenImage(locations, themeKey, cdvConfigPrefKey, cdvConfigPrefValue);
            break;

        case 'android:windowSplashScreenBrandingImage':
            // display warning only when set.
            if (cdvConfigPrefValue) {
                events.emit('warn', `"${themeKey}" is currently not supported by the splash screen compatibility library. https://issuetracker.google.com/issues/194301890`);
            }

            updateProjectSplashScreenImage(locations, themeKey, cdvConfigPrefKey, cdvConfigPrefValue);

            // force the themes value to `@color/cdv_splashscreen_icon_background`
            if (!cdvConfigPrefValue && themeTargetNode) {
                splashScreenTheme.remove(themeTargetNode);
                delete themes.getroot().attrib['xmlns:tools'];
            } else if (cdvConfigPrefValue) {
                // if there is no current node, create a new node.
                if (!themeTargetNode) {
                    themeTargetNode = themes.getroot().makeelement('item', { name: themeKey, 'tools:targetApi': '31' });
                    splashScreenTheme.append(themeTargetNode);
                    themes.getroot().attrib['xmlns:tools'] = 'http://schemas.android.com/tools';
                }
                // set the user defined color.
                themeTargetNode.text = '@drawable/ic_cdv_splashscreen_branding';
            }
            break;

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

            // force the themes value to `@color/cdv_splashscreen_icon_background`
            if (!cdvConfigPrefValue && themeTargetNode) {
                // currentItem.remove();
                splashScreenTheme.remove(themeTargetNode);
            } else if (cdvConfigPrefValue) {
                // if there is no current color, create a new node.
                if (!themeTargetNode) {
                    themeTargetNode = themes.getroot().makeelement('item', { name: themeKey });
                    splashScreenTheme.append(themeTargetNode);
                }

                // set the user defined color.
                themeTargetNode.text = '@color/cdv_splashscreen_icon_background';
            }
            break;

        case 'windowSplashScreenAnimationDuration':
            themeTargetNode.text = cdvConfigPrefValue || '200';
            break;

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

        default:
            events.emit('warn', `The theme property "${themeKey}" does not exist`);
        }
    });

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