@nativescript-use/change-icon
TypeScript icon, indicating that this package has built-in type declarations

0.0.4 • Public • Published

@nativescript-use/change-icon

Programmatically change the application icon.

Install

npm install @nativescript-use/change-icon

Configuration

Android

To begin, we must define our icons in App_Resources/Android/src/main/res, we recommend the page https://icon.kitchen/ to generate the icons for our application. This document will create 3 icons for the sample:

  • Default Icon.
  • Dark icon.
  • Cafe icon.
  1. Generate the icons and add them to App_Resources/Android/src/main/res/mipmap.
  • ic_launcher_foreground_[default|dark|cafe].png (Icon)
  • ic_launcher_background__[default|dark|cafe].png (Icon Background)
  1. Add the adaptive-icon to your mipmap-anydpi-v26 folder inside App_Resources/Android/src/main/res/.
  • mipmap-anydpi-v26/ic_launcher_default.xml
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
    <background android:drawable="@mipmap/ic_launcher_background_default"/>
    <foreground android:drawable="@mipmap/ic_launcher_foreground_default"/>
</adaptive-icon>
  • mipmap-anydpi-v26/ic_launcher_dark.xml
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
    <background android:drawable="@mipmap/ic_launcher_background_dark"/>
    <foreground android:drawable="@mipmap/ic_launcher_foreground_dark"/>
</adaptive-icon>
  • mipmap-anydpi-v26/ic_launcher_cafe.xml
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
    <background android:drawable="@mipmap/ic_launcher_background_cafe"/>
    <foreground android:drawable="@mipmap/ic_launcher_foreground_cafe"/>
</adaptive-icon>
  1. Add activity-alias to our AndroidManifest.xml. To change the icon in android we need to specify an activity-alias in AndroidManifest.xml plus one for the default icon, so for this example we will have 3 activity-aliases in our manifest:
 <application
        android:name="com.tns.NativeScriptApplication"
        android:allowBackup="true"
        android:hardwareAccelerated="true"
        android:label="@string/app_name"
        android:icon="@mipmap/ic_launcher_default"
        android:roundIcon="@mipmap/ic_launcher_default"
        android:theme="@style/AppTheme">

        <activity
            android:name="com.tns.NativeScriptActivity"
            android:configChanges="keyboard|keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout|locale|uiMode"
            android:exported="true"
            android:hardwareAccelerated="true"
            android:label="@string/title_activity_kimera"
            android:launchMode="singleTask"
            android:theme="@style/AppTheme">
            
            <meta-data android:name="SET_THEME_ON_LAUNCH" android:resource="@style/AppTheme" />
            <intent-filter>
                <!-- Note that here we have removed <category android:name="android.intent.category.LAUNCHER" /> -->
                <action android:name="android.intent.action.MAIN" />
            </intent-filter>
        </activity>

        <activity-alias
            android:name=".MainActivityDefault"
            android:enabled="true"
            android:exported="true"
            android:icon="@mipmap/ic_launcher_default"
            android:label="@string/title_activity_kimera"
            android:targetActivity="com.tns.NativeScriptActivity">
            <meta-data
                android:name="SET_THEME_ON_LAUNCH"
                android:resource="@style/AppTheme" />
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity-alias>
        <activity-alias
            android:name=".MainActivityDark"
            android:enabled="false"
            android:exported="true"
            android:icon="@mipmap/ic_launcher_dark"
            android:label="@string/title_activity_kimera"
            android:targetActivity="com.tns.NativeScriptActivity">
            <meta-data
                android:name="SET_THEME_ON_LAUNCH"
                android:resource="@style/AppTheme" />
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity-alias>
         <activity-alias
            android:name=".MainActivityCafe"
            android:enabled="false"
            android:exported="true"
            android:icon="@mipmap/ic_launcher_cafe"
            android:label="@string/title_activity_kimera"
            android:targetActivity="com.tns.NativeScriptActivity">
            <meta-data
                android:name="SET_THEME_ON_LAUNCH"
                android:resource="@style/AppTheme" />
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity-alias>
        <activity android:name="com.tns.ErrorReportActivity" />
    </application>

Note here the important things from the previous code:

  • Removed <category android:name="android.intent.category.LAUNCHER" /> from the main activity activity.
  • We have 3 activity-alias, for Default, Dark and Cafe.
  • Activity alias of activity-alias of MainActivityDefault has android:enabled="true" by default.
  • All other activity-aliases have android:enabled="false"
  • android:name of the activity-alias tags must always have the format .MainActivity[The name we will use to change], in this case: MainActivityDefault, MainActivityDark, MainActivityCafe.
  • android:icon and android:roundIcon have the icon we added earlier.
  • android:targetActivity has the value of the main activity, default for NativeScript: com.tns.NativeScriptActivity.

iOS

To begin, we must define our icons in App_Resources/iOS, we recommend the page https://icon.kitchen/ to generate the icons for our application. This document will create 3 icons for the sample:

  • Default Icon.
  • Dark icon.
  • Cafe icon.
  1. Have the Default icon in the App_Resources/iOS/Assets.xcassets/AppIcon.appiconset folder
  2. Generate the icons and add them to App_Resources/iOS.
  • [Dark|Cafe]@x2.png (120x120 Dimensions)
  • [Dark|Cafe]@x3.png (180x180 Dimensions)
  1. Add in Info.plist (App_Resources/iOS/Info.plist) the following code to indicate which is the default and which are the alternatives:
<key>CFBundleIcons</key>
<dict>
    <key>CFBundlePrimaryIcon</key>
    <dict>
        <key>CFBundleIconFiles</key>
        <array>
            <string>Default</string>
        </array>
        <key>UIPrerenderedIcon</key>
        <false/>
    </dict>
    <key>CFBundleAlternateIcons</key>
    <dict>
        <key>Dark</key>
        <dict>
            <key>CFBundleIconFiles</key>
            <array>
                <string>Dark</string>
            </array>
            <key>UIPrerenderedIcon</key>
            <false/>
        </dict>
        <key>Cafe</key>
        <dict>
            <key>CFBundleIconFiles</key>
            <array>
                <string>Cafe</string>
            </array>
            <key>UIPrerenderedIcon</key>
            <false/>
        </dict>
    </dict>
</dict>

Usage

You just have to import the library and use the available methods

  • getCurrent()
  • reset()
  • change("NameOfIcon")
import { changeIcon } from "@nativescript-use/change-icon"

function changeIconToDark(){
    changeIcon.change("Dark");
}

function changeIconToCafe(){
    changeIcon.change("Cafe");
}

function changeIconToDefault(){
    changeIcon.reset();
}

function getCurrentIcon(){
    return changeIcon.getCurrent(); // "Default" | "Dark" | "Cafe"
}

License

Apache License Version 2.0

Package Sidebar

Install

npm i @nativescript-use/change-icon

Weekly Downloads

0

Version

0.0.4

License

Apache-2.0

Unpacked Size

25.8 kB

Total Files

10

Last publish

Collaborators

  • vallemar89