Skip to content
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

Cordova Android doesn't work with resource references #1727

Open
3 tasks done
geoidesic opened this issue Jul 31, 2024 · 1 comment
Open
3 tasks done

Cordova Android doesn't work with resource references #1727

geoidesic opened this issue Jul 31, 2024 · 1 comment

Comments

@geoidesic
Copy link

geoidesic commented Jul 31, 2024

Bug Report

Problem

The documentation is unclear. And I tried ChatGPT too. I have this config.xml in the cordova project root.

    <platform name="android">
        <allow-intent href="market:*" />
        <plugin name="@havesource/cordova-plugin-push" spec="3.0.0">
            <variable name="SENDER_ID" value="<redacted>" />
        </plugin>
        <preference name="AndroidInsecureFileModeEnabled" value="true" />
        <preference name="EnableWebViewDebugging" value="true" />
       
        <icon src="res/screen/android/logo.xml" density="anydpi" />

        <!-- New Splash Screen Preferences -->
        <preference name="AutoHideSplashScreen" value="true" />
        <preference name="AndroidWindowSplashScreenBackground" value="#000" />
        <preference name="AndroidWindowSplashScreenAnimatedIcon" value="ic_cdv_splashscreen.xml" />
        <preference name="SplashScreen" value="screen" />
        <preference name="ShowSplashScreenSpinner" value="false" />
        <preference name="SplashScreenDelay" value="0" />
        <preference name="FadeSplashScreenDuration" value="300" />
        <preference name="SplashMaintainAspectRatio" value="true" />

        <!-- Adaptive App Icons -->
        <!-- Copy colors.xml -->
        <resource-file src="res/values/colors.xml" target="app/src/main/res/values/colors.xml" />

        <!-- Copy foreground SVG -->
        <resource-file src="res/icon/android/ic_launcher_foreground.xml" target="app/src/main/res/drawable/ic_launcher_foreground.xml" />
        
        <!-- Copy monochrome SVG -->
        <resource-file src="res/icon/android/ic_launcher_monochrome.xml" target="app/src/main/res/drawable/ic_launcher_monochrome.xml" />

        <!-- Define adaptive icons -->
        <icon 
            foreground="@drawable/ic_launcher_foreground" 
            background="@color/background" 
            density="ldpi" 
            monochrome="@drawable/ic_launcher_monochrome" />
        <icon 
            foreground="@drawable/ic_launcher_foreground" 
            background="@color/background" 
            density="mdpi" 
            monochrome="@drawable/ic_launcher_monochrome" />
        <icon 
            foreground="@drawable/ic_launcher_foreground" 
            background="@color/background" 
            density="hdpi" 
            monochrome="@drawable/ic_launcher_monochrome" />
        <icon 
            foreground="@drawable/ic_launcher_foreground" 
            background="@color/background" 
            density="xhdpi" 
            monochrome="@drawable/ic_launcher_monochrome" />
        <icon 
            foreground="@drawable/ic_launcher_foreground" 
            background="@color/background" 
            density="xxhdpi" 
            monochrome="@drawable/ic_launcher_monochrome" />
        <icon 
            foreground="@drawable/ic_launcher_foreground" 
            background="@color/background" 
            density="xxxhdpi" 
            monochrome="@drawable/ic_launcher_monochrome" />

        <preference name="android-targetSdkVersion" value="34" />
        <resource-file src="google-services.json" target="/app/google-services.json" />
        <resource-file src="firebase-service-account-pvt-key.json" target="app/src/main/assets/firebase-service-account-pvt-key.json" />
    </platform>

In the project root I have the res folder:
Screenshot 2024-07-31 at 10 42 27

Which contains the assets that match the resource-file elements in the config.xml but they are not copied into the target folders.

What is expected to happen?

I want to define: colors.xml, splash.xml, foreground.xml and monochrome.xml in my project root res folder and then have those copied across into the android platform as appropriate.

What does actually happen?

causes an error:

Android project created with cordova-android@13.0.0
Source path does not exist: @drawable/ic_launcher_foreground

Information

Command or Code

cordova platform remove android; cordova platform add android;

Environment, Platform, Device

I'm running cordova on Mac OS X and trying to build it for Android API v13 for emulator.

Version information

Cordova: 12.0.0 (cordova-lib@12.0.1)
cordova-android@13.0.0
Mac OS X: 14.5 (23F79)
Android Studio Koala | 2024.1.1 Patch 1
Node: v20.15.1

Checklist

  • I searched for existing GitHub issues
  • I updated all Cordova tooling to most recent version
  • I included all the necessary information above
@breautek
Copy link
Contributor

breautek commented Aug 9, 2024

The <icon> foreground, background, and monochrome expects a file resource, not a resource reference, but will accept a color reference.

So it needs to point to a PNG file or an AVD on disk, or a @color/... value.

An example based on your provided config will look something like:

<!-- Cordova already defines colors.xml, so I'm using a new name despite the Cordova Docs guide -->
<resource-file src="res/values/colors.xml" target="app/src/main/res/values/myColors.xml" />
<icon
  foreground="res/icon/android/ic_launcher_foreground.xml" 
  background="@color/background" 
  density="mdpi" 
  monochrome="res/icon/android/ic_launcher_monochrome.xml" />

Don't create a <resource-file> for your foreground and monochrome, the Cordova CLI will do this behind the scenes.

Note that despite that vectors can be used on any DPI, the <icon> directive still requires the density declared. So you'll need to replicate the <icon> directive for each dpi, mdpi, hdpi, xhdpi, xxhdpi, and xxxhpdi. There is no device on market that Cordova supports that uses ldpi` so it can safely be omitted.

With that being said, I think expanding support to allow more (or all) resource references would be desirable so I'll keep this ticket open.

@breautek breautek changed the title Cordova Android doesn't work with adaptive icons. Cordova Android doesn't work with resource references Aug 9, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants