├── .gitignore ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── example │ │ └── dynamicappicon │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── example │ │ │ └── dynamicappicon │ │ │ ├── MainActivity.kt │ │ │ └── ui │ │ │ └── theme │ │ │ ├── Color.kt │ │ │ ├── Theme.kt │ │ │ └── Type.kt │ ├── my_launch_icon_one-playstore.png │ ├── my_launch_icon_three-playstore.png │ ├── my_launch_icon_two-playstore.png │ └── res │ │ ├── drawable │ │ ├── ic_launcher_background.xml │ │ ├── ic_launcher_foreground.xml │ │ ├── my_launch_icon_one_background.xml │ │ ├── my_launch_icon_three_background.xml │ │ └── my_launch_icon_two_background.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── my_launch_icon_one.xml │ │ ├── my_launch_icon_one_round.xml │ │ ├── my_launch_icon_three.xml │ │ ├── my_launch_icon_three_round.xml │ │ ├── my_launch_icon_two.xml │ │ └── my_launch_icon_two_round.xml │ │ ├── mipmap-anydpi │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.webp │ │ ├── ic_launcher_round.webp │ │ ├── my_launch_icon_one.webp │ │ ├── my_launch_icon_one_foreground.webp │ │ ├── my_launch_icon_one_round.webp │ │ ├── my_launch_icon_three.webp │ │ ├── my_launch_icon_three_foreground.webp │ │ ├── my_launch_icon_three_round.webp │ │ ├── my_launch_icon_two.webp │ │ ├── my_launch_icon_two_foreground.webp │ │ └── my_launch_icon_two_round.webp │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.webp │ │ ├── ic_launcher_round.webp │ │ ├── my_launch_icon_one.webp │ │ ├── my_launch_icon_one_foreground.webp │ │ ├── my_launch_icon_one_round.webp │ │ ├── my_launch_icon_three.webp │ │ ├── my_launch_icon_three_foreground.webp │ │ ├── my_launch_icon_three_round.webp │ │ ├── my_launch_icon_two.webp │ │ ├── my_launch_icon_two_foreground.webp │ │ └── my_launch_icon_two_round.webp │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.webp │ │ ├── ic_launcher_round.webp │ │ ├── my_launch_icon_one.webp │ │ ├── my_launch_icon_one_foreground.webp │ │ ├── my_launch_icon_one_round.webp │ │ ├── my_launch_icon_three.webp │ │ ├── my_launch_icon_three_foreground.webp │ │ ├── my_launch_icon_three_round.webp │ │ ├── my_launch_icon_two.webp │ │ ├── my_launch_icon_two_foreground.webp │ │ └── my_launch_icon_two_round.webp │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.webp │ │ ├── ic_launcher_round.webp │ │ ├── my_launch_icon_one.webp │ │ ├── my_launch_icon_one_foreground.webp │ │ ├── my_launch_icon_one_round.webp │ │ ├── my_launch_icon_three.webp │ │ ├── my_launch_icon_three_foreground.webp │ │ ├── my_launch_icon_three_round.webp │ │ ├── my_launch_icon_two.webp │ │ ├── my_launch_icon_two_foreground.webp │ │ └── my_launch_icon_two_round.webp │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.webp │ │ ├── ic_launcher_round.webp │ │ ├── my_launch_icon_one.webp │ │ ├── my_launch_icon_one_foreground.webp │ │ ├── my_launch_icon_one_round.webp │ │ ├── my_launch_icon_three.webp │ │ ├── my_launch_icon_three_foreground.webp │ │ ├── my_launch_icon_three_round.webp │ │ ├── my_launch_icon_two.webp │ │ ├── my_launch_icon_two_foreground.webp │ │ └── my_launch_icon_two_round.webp │ │ ├── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── themes.xml │ │ └── xml │ │ ├── backup_rules.xml │ │ └── data_extraction_rules.xml │ └── test │ └── java │ └── com │ └── example │ └── dynamicappicon │ └── ExampleUnitTest.kt ├── build.gradle ├── gradle.properties ├── gradle ├── libs.versions.toml └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── screenshots └── demo.gif └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | /.idea/navEditor.xml 9 | /.idea/assetWizardSettings.xml 10 | .DS_Store 11 | /build 12 | /captures 13 | .externalNativeBuild 14 | .cxx 15 | local.properties 16 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

Dynamic App Launcher Icon Demo

2 | 3 |

4 | This project demonstrates how to implement dynamic app launcher icons in Android applications using Jetpack Compose. Popular apps like Swiggy, Zomato, and Twitter use this feature to dynamically change their app icons, enhancing user engagement and branding. 5 |

6 | 7 | --- 8 | 9 |

Update : 12/12/24

10 | 11 |

12 | Changed the implementation a little to make sure not to kill the app with every icon change. The app will still get killed once when changing 13 | from the default icon. Thank you Avinav Srivastava for suggesting this change. 14 |

15 | --- 16 | 17 |

📌 Features

18 | 19 | 24 | 25 | --- 26 | 27 |

🎥 Preview

28 |

29 | 30 |

31 | 32 | --- 33 | 34 |

📋 Table of Contents

35 | 36 |
    37 |
  1. Setup and Requirements
  2. 38 |
  3. Implementation Highlights
  4. 39 |
  5. Usage
  6. 40 |
  7. Blog Links Reated to this topic
  8. 41 |
  9. Contributing
  10. 42 |
43 | 44 | --- 45 | 46 |

⚙️ Setup and Requirements

47 | 48 |

Requirements

49 | 54 | 55 |

Setup

56 |
    57 |
  1. Clone the repository: 58 |
    git clone https://github.com/SamriddhaS/DynamicAppLauncherDemo.git
    59 |
  2. 60 |
  3. Open the project in Android Studio.
  4. 61 |
  5. Build and run the project on a physical device or emulator.
  6. 62 |
63 | 64 | --- 65 | 66 |

✨ Implementation Highlights

67 | 68 |

1. Manifest Configuration

69 |

We define ActivityAlias entries in the AndroidManifest.xml to manage multiple app icons. Each alias is mapped to the main activity but uses a different icon. We can add activity alias for each of the launcher icon that we want to configure.

70 | 71 |
 72 | <!-- This is enabled by default -->
 73 | <activity-alias
 74 |     android:name=".DefaultTheme"
 75 |     android:enabled="true"
 76 |     android:icon="@mipmap/ic_launcher"
 77 |     android:targetActivity=".MainActivity"
 78 |     android:exported="true">
 79 |     <intent-filter>
 80 |         <action android:name="android.intent.action.MAIN" />
 81 |         <category android:name="android.intent.category.LAUNCHER" />
 82 |     </intent-filter>
 83 | </activity-alias>
 84 | 
 85 | <!-- Icon one: disabled by default -->
 86 | <activity-alias
 87 |     android:name=".MyIconOne"
 88 |     android:enabled="false"
 89 |     android:icon="@mipmap/my_launch_icon_one"
 90 |     android:targetActivity=".MainActivity"
 91 |     android:exported="true">
 92 |     <intent-filter>
 93 |         <action android:name="android.intent.action.MAIN" />
 94 |         <category android:name="android.intent.category.LAUNCHER" />
 95 |     </intent-filter>
 96 | </activity-alias>
 97 | 
 98 | <!-- Icon two: disabled by default -->
 99 | <activity-alias
100 |     android:name=".MyIconTwo"
101 |     android:enabled="false"
102 |     android:icon="@mipmap/my_launch_icon_two"
103 |     android:targetActivity=".MainActivity"
104 |     android:exported="true">
105 |     <intent-filter>
106 |         <action android:name="android.intent.action.MAIN" />
107 |         <category android:name="android.intent.category.LAUNCHER" />
108 |     </intent-filter>
109 | </activity-alias>
110 | 
111 | 
112 | 113 |

2. Dynamic Icon Switching

114 |

The MainActivity uses the PackageManager API to enable or disable ActivityAlias entries dynamically.

115 | 116 |
117 | packageManager.setComponentEnabledSetting(
118 |     ComponentName(
119 |         this,
120 |         "$packageName${selectedIcon.themeName}"
121 |     ),
122 |     PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
123 |     PackageManager.DONT_KILL_APP
124 | )
125 | 
126 | packageManager.setComponentEnabledSetting(
127 |     ComponentName(
128 |         this,
129 |         "$packageName${currentIcon}"
130 |     ),
131 |     PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
132 |     PackageManager.DONT_KILL_APP
133 | )
134 | 
135 | 
136 | 137 |

3. Shared Preferences

138 |

We store the currently active icon in SharedPreferences to persist user preferences.

139 | 140 |
141 | sharedPref.edit {
142 |     putString(CURRENT_ICON_KEY, selectedIcon.themeName)
143 |     apply()
144 | }
145 | 
146 | 
147 | 148 |

4. Jetpack Compose UI

149 |

A Compose-based UI allows users to select and preview the app icons dynamically.

150 | 151 |
152 | @Composable
153 | fun ImageSelector(
154 |     onImageClick: (AppLauncherIcons) -> Unit,
155 |     modifier: Modifier
156 | ) {
157 |     val imageList = listOf(
158 |         AppLauncherIcons.Default_Theme,
159 |         AppLauncherIcons.Theme_One,
160 |         AppLauncherIcons.Theme_Two,
161 |         AppLauncherIcons.Theme_Three,
162 |     )
163 |     
164 |     LazyColumn(
165 |         modifier = Modifier.fillMaxWidth(),
166 |         verticalArrangement = Arrangement.Center,
167 |         horizontalAlignment = Alignment.CenterHorizontally
168 |     ) {
169 |         items(imageList.size) { index ->
170 |             val imageRes = imageList[index]
171 |             GlideImage(
172 |                 model = imageRes.imageRes,
173 |                 contentDescription = "Image $index",
174 |                 contentScale = ContentScale.Crop,
175 |                 modifier = Modifier
176 |                     .size(100.dp)
177 |                     .clickable { onImageClick(imageRes) }
178 |                     .padding(4.dp)
179 |             )
180 |         }
181 |     }
182 | }
183 | 
184 | 
185 | 186 | --- 187 | 188 |

🚀 Usage

189 | 190 |
    191 |
  1. Launch the app.
  2. 192 |
  3. Browse through the available launcher icons using the provided UI.
  4. 193 |
  5. Select an icon to apply it as the app launcher icon.
  6. 194 |
  7. Confirm the selection in the modal bottom sheet.
  8. 195 |
196 | 197 | --- 198 | 199 | 200 | 201 |

Here are some helpful blogs that inspired and guided the implementation of this feature:

202 | 203 | 207 | 208 | --- 209 | 210 | 211 |

🤝 Contributing

212 | 213 |

Contributions are welcome! Please fork the repository, make your changes, and submit a pull request.

214 | 215 | --- 216 | 217 |

Enjoy experimenting with dynamic app icons! 🚀

218 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | alias(libs.plugins.android.application) 3 | alias(libs.plugins.kotlin.android) 4 | } 5 | 6 | android { 7 | namespace 'com.example.dynamicappicon' 8 | compileSdk 35 9 | 10 | defaultConfig { 11 | applicationId "com.example.dynamicappicon" 12 | minSdk 26 13 | targetSdk 35 14 | versionCode 1 15 | versionName "1.0" 16 | 17 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 18 | vectorDrawables { 19 | useSupportLibrary true 20 | } 21 | } 22 | 23 | buildTypes { 24 | release { 25 | minifyEnabled false 26 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 27 | } 28 | } 29 | compileOptions { 30 | sourceCompatibility JavaVersion.VERSION_1_8 31 | targetCompatibility JavaVersion.VERSION_1_8 32 | } 33 | kotlinOptions { 34 | jvmTarget = '1.8' 35 | } 36 | buildFeatures { 37 | compose true 38 | } 39 | composeOptions { 40 | kotlinCompilerExtensionVersion '1.5.1' 41 | } 42 | packaging { 43 | resources { 44 | excludes += '/META-INF/{AL2.0,LGPL2.1}' 45 | } 46 | } 47 | } 48 | 49 | dependencies { 50 | 51 | implementation libs.androidx.core.ktx 52 | implementation libs.androidx.lifecycle.runtime.ktx 53 | implementation libs.androidx.activity.compose 54 | implementation platform(libs.androidx.compose.bom) 55 | implementation libs.androidx.ui 56 | implementation libs.androidx.ui.graphics 57 | implementation libs.androidx.ui.tooling.preview 58 | implementation libs.androidx.material3 59 | testImplementation libs.junit 60 | androidTestImplementation libs.androidx.junit 61 | androidTestImplementation libs.androidx.espresso.core 62 | androidTestImplementation platform(libs.androidx.compose.bom) 63 | androidTestImplementation libs.androidx.ui.test.junit4 64 | debugImplementation libs.androidx.ui.tooling 65 | debugImplementation libs.androidx.ui.test.manifest 66 | implementation "com.github.bumptech.glide:compose:1.0.0-beta01" 67 | } -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /app/src/androidTest/java/com/example/dynamicappicon/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package com.example.dynamicappicon 2 | 3 | import androidx.test.platform.app.InstrumentationRegistry 4 | import androidx.test.ext.junit.runners.AndroidJUnit4 5 | 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | import org.junit.Assert.* 10 | 11 | /** 12 | * Instrumented test, which will execute on an Android device. 13 | * 14 | * See [testing documentation](http://d.android.com/tools/testing). 15 | */ 16 | @RunWith(AndroidJUnit4::class) 17 | class ExampleInstrumentedTest { 18 | @Test 19 | fun useAppContext() { 20 | // Context of the app under test. 21 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 22 | assertEquals("com.example.dynamicappicon", appContext.packageName) 23 | } 24 | } -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 15 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/dynamicappicon/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.example.dynamicappicon 2 | 3 | import android.content.ComponentName 4 | import android.content.Context 5 | import android.content.SharedPreferences 6 | import android.content.pm.PackageManager 7 | import android.os.Bundle 8 | import android.util.Log 9 | import androidx.activity.ComponentActivity 10 | import androidx.activity.compose.setContent 11 | import androidx.activity.enableEdgeToEdge 12 | import androidx.compose.foundation.clickable 13 | import androidx.compose.foundation.layout.Arrangement 14 | import androidx.compose.foundation.layout.Column 15 | import androidx.compose.foundation.layout.fillMaxSize 16 | import androidx.compose.foundation.layout.fillMaxWidth 17 | import androidx.compose.foundation.layout.padding 18 | import androidx.compose.foundation.layout.size 19 | import androidx.compose.foundation.lazy.LazyColumn 20 | import androidx.compose.foundation.shape.RoundedCornerShape 21 | import androidx.compose.material3.Button 22 | import androidx.compose.material3.ExperimentalMaterial3Api 23 | import androidx.compose.material3.ModalBottomSheet 24 | import androidx.compose.material3.Scaffold 25 | import androidx.compose.material3.Text 26 | import androidx.compose.material3.rememberModalBottomSheetState 27 | import androidx.compose.runtime.Composable 28 | import androidx.compose.runtime.getValue 29 | import androidx.compose.runtime.mutableStateOf 30 | import androidx.compose.runtime.remember 31 | import androidx.compose.runtime.rememberCoroutineScope 32 | import androidx.compose.runtime.saveable.rememberSaveable 33 | import androidx.compose.runtime.setValue 34 | import androidx.compose.ui.Alignment 35 | import androidx.compose.ui.Modifier 36 | import androidx.compose.ui.graphics.Color 37 | import androidx.compose.ui.layout.ContentScale 38 | import androidx.compose.ui.text.style.TextAlign 39 | import androidx.compose.ui.tooling.preview.Preview 40 | import androidx.compose.ui.unit.dp 41 | import androidx.compose.ui.unit.sp 42 | import androidx.core.content.edit 43 | import com.bumptech.glide.integration.compose.ExperimentalGlideComposeApi 44 | import com.bumptech.glide.integration.compose.GlideImage 45 | import com.example.dynamicappicon.ui.theme.DynamicAppIconTheme 46 | import kotlinx.coroutines.launch 47 | 48 | /** 49 | * Data For the app launcher icons available for the app. 50 | * */ 51 | enum class AppLauncherIcons(val themeName:String,val imageRes:Int){ 52 | Default_Theme(themeName = ".DefaultTheme", imageRes = R.mipmap.ic_launcher), 53 | Theme_One(themeName = ".MyIconOne", imageRes = R.mipmap.my_launch_icon_one), 54 | Theme_Two(themeName = ".MyIconTwo", imageRes = R.mipmap.my_launch_icon_two), 55 | Theme_Three(themeName = ".MyIconThree", imageRes = R.mipmap.my_launch_icon_three), 56 | } 57 | 58 | const val CURRENT_ICON_KEY = "CURRENT_ICON_KEY" 59 | const val PREFERENCE_NAME = "MY_APP_SHARED_PREF" 60 | 61 | class MainActivity : ComponentActivity() { 62 | 63 | private val sharedPref by lazy { 64 | applicationContext.getSharedPreferences(PREFERENCE_NAME,Context.MODE_PRIVATE) 65 | } 66 | 67 | override fun onCreate(savedInstanceState: Bundle?) { 68 | super.onCreate(savedInstanceState) 69 | enableEdgeToEdge() 70 | setContent { 71 | DynamicAppIconTheme { 72 | MyApp( 73 | onChangeAppIcon = { icon -> 74 | val currentIcon = sharedPref.getString(CURRENT_ICON_KEY,AppLauncherIcons.Default_Theme.themeName) 75 | // If the selected icon is same as the current one that is already set we do nothing. 76 | if (currentIcon==icon.themeName) return@MyApp 77 | changeIcon(icon,currentIcon!!) 78 | }, 79 | ) 80 | } 81 | } 82 | } 83 | 84 | /** 85 | * This function updates the current app icon to the selected icon that 86 | * user has choosen. 87 | * @param selectedIcon = this param takes the new icon that the user trying to apply. 88 | * We will check what is the current icon set for the app. if the choosen icon is same 89 | * as current one then we do nothing. Otherwise we apply the new icon and update the 90 | * current icon data in our shared preference. 91 | * */ 92 | private fun changeIcon(selectedIcon: AppLauncherIcons,currentIcon:String) { 93 | 94 | // New selected icon will be set as new launcher icon. 95 | packageManager.setComponentEnabledSetting( 96 | ComponentName( 97 | this, 98 | "$packageName${selectedIcon.themeName}" 99 | ), 100 | PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 101 | PackageManager.DONT_KILL_APP 102 | ) 103 | 104 | // Check if we need to disable / set default 105 | val disableOrSetDefault = needToDisableOrSetDefault(currentIcon) 106 | 107 | // Disabling old launcher icon after new one is set. 108 | packageManager.setComponentEnabledSetting( 109 | ComponentName( 110 | this, 111 | "$packageName${currentIcon}" 112 | ), 113 | disableOrSetDefault, 114 | PackageManager.DONT_KILL_APP 115 | ) 116 | 117 | // Save the updated icon. 118 | sharedPref.edit { 119 | putString(CURRENT_ICON_KEY,selectedIcon.themeName) 120 | apply() 121 | } 122 | } 123 | 124 | /** 125 | * If the current alias is the default one( the activity-alias which is having this property -> android:enabled="true" ) 126 | * we need to use COMPONENT_ENABLED_STATE_DISABLED to disable it, it will cause the app to kill. 127 | * If the current alias default enabled property is "false" ( activity-alias with android:enabled="false") we can use 128 | * COMPONENT_ENABLED_STATE_DEFAULT to reset that alias's enabled property set to false (as we have given it enabled="false" in manifest). 129 | * This will make sure the launcher icon change doesn't cause app kill when changing between two activity-alias 130 | * whose default enabled property is false (android:enabled="false"). 131 | * */ 132 | private fun needToDisableOrSetDefault(currentIcon:String):Int{ 133 | return if (currentIcon==AppLauncherIcons.Default_Theme.themeName) 134 | PackageManager.COMPONENT_ENABLED_STATE_DISABLED 135 | else 136 | PackageManager.COMPONENT_ENABLED_STATE_DEFAULT 137 | } 138 | } 139 | 140 | @OptIn(ExperimentalMaterial3Api::class) 141 | @Composable 142 | fun MyApp( 143 | onChangeAppIcon:(AppLauncherIcons)->Unit 144 | ) { 145 | 146 | Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding -> 147 | val modifier = Modifier.padding(innerPadding) 148 | 149 | val bottomSheetState = rememberModalBottomSheetState() 150 | val coroutineScope = rememberCoroutineScope() 151 | var selectedImage by remember { mutableStateOf(null) } 152 | var showBottomSheet by remember { mutableStateOf(false) } 153 | 154 | ImageSelector( 155 | modifier = modifier, 156 | onImageClick = { imageRes -> 157 | selectedImage = imageRes 158 | coroutineScope.launch { 159 | showBottomSheet = true 160 | } 161 | } 162 | ) 163 | 164 | if (showBottomSheet) { 165 | ModalBottomSheet( 166 | onDismissRequest = { 167 | showBottomSheet = false 168 | }, 169 | sheetState = bottomSheetState, 170 | ) { 171 | selectedImage?.let { 172 | BottomSheetContent( 173 | imageRes = it, 174 | onButtonClick = { 175 | onChangeAppIcon(it) 176 | showBottomSheet = false 177 | } 178 | ) 179 | } 180 | } 181 | } 182 | } 183 | } 184 | 185 | @OptIn(ExperimentalGlideComposeApi::class) 186 | @Composable 187 | fun ImageSelector( 188 | onImageClick: (AppLauncherIcons) -> Unit, 189 | modifier: Modifier 190 | ) { 191 | val imageList = listOf( 192 | AppLauncherIcons.Default_Theme, 193 | AppLauncherIcons.Theme_One, 194 | AppLauncherIcons.Theme_Two, 195 | AppLauncherIcons.Theme_Three, 196 | ) 197 | 198 | var selectedImage by rememberSaveable { mutableStateOf(imageList.first()) } 199 | 200 | Column( 201 | modifier = modifier 202 | .fillMaxSize() 203 | .padding(16.dp), 204 | verticalArrangement = Arrangement.spacedBy(16.dp) 205 | ) { 206 | LazyColumn( 207 | modifier = Modifier.fillMaxWidth(), 208 | verticalArrangement = Arrangement.Center, 209 | horizontalAlignment = Alignment.CenterHorizontally 210 | ) { 211 | items(imageList.size) { index -> 212 | val imageRes = imageList[index] 213 | GlideImage( 214 | model = imageRes.imageRes, 215 | contentDescription = "Image $index", 216 | contentScale = ContentScale.Crop, 217 | modifier = Modifier 218 | .size(100.dp) 219 | .clickable { onImageClick(imageRes) } 220 | .padding(4.dp) 221 | ) 222 | } 223 | } 224 | 225 | Button( 226 | onClick = { 227 | // Handle the "Apply as App Icon" logic here 228 | println("Selected Image: $selectedImage") 229 | }, 230 | shape = RoundedCornerShape(8.dp), 231 | modifier = Modifier.fillMaxWidth() 232 | ) { 233 | Text( 234 | text = "Tap on a icon to apply as app icon.", 235 | fontSize = 16.sp, 236 | color = Color.White 237 | ) 238 | } 239 | } 240 | } 241 | 242 | @OptIn(ExperimentalGlideComposeApi::class) 243 | @Composable 244 | fun BottomSheetContent(imageRes: AppLauncherIcons, onButtonClick: () -> Unit) { 245 | Column( 246 | modifier = Modifier 247 | .fillMaxWidth() 248 | .padding(horizontal = 16.dp) 249 | .padding(top = 16.dp, bottom = 36.dp) 250 | , 251 | horizontalAlignment = Alignment.CenterHorizontally, 252 | verticalArrangement = Arrangement.spacedBy(16.dp) 253 | ) { 254 | Text( 255 | text = "Apply this as app icon.", 256 | fontSize = 24.sp, 257 | textAlign = TextAlign.Center, 258 | modifier = Modifier.fillMaxWidth() 259 | ) 260 | GlideImage( 261 | model = imageRes.imageRes, 262 | contentDescription = "Selected Image", 263 | contentScale = ContentScale.Crop, 264 | modifier = Modifier.size(150.dp) 265 | ) 266 | Button( 267 | onClick = onButtonClick, 268 | shape = RoundedCornerShape(8.dp), 269 | modifier = Modifier.fillMaxWidth() 270 | ) { 271 | Text( 272 | text = "Confirm", 273 | fontSize = 16.sp, 274 | color = Color.White 275 | ) 276 | } 277 | } 278 | } 279 | 280 | @Preview(showBackground = true) 281 | @Composable 282 | fun GreetingPreview() { 283 | DynamicAppIconTheme { 284 | MyApp( 285 | onChangeAppIcon = { 286 | 287 | } 288 | ) 289 | } 290 | 291 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/dynamicappicon/ui/theme/Color.kt: -------------------------------------------------------------------------------- 1 | package com.example.dynamicappicon.ui.theme 2 | 3 | import androidx.compose.ui.graphics.Color 4 | 5 | val Purple80 = Color(0xFFD0BCFF) 6 | val PurpleGrey80 = Color(0xFFCCC2DC) 7 | val Pink80 = Color(0xFFEFB8C8) 8 | 9 | val Purple40 = Color(0xFF6650a4) 10 | val PurpleGrey40 = Color(0xFF625b71) 11 | val Pink40 = Color(0xFF7D5260) -------------------------------------------------------------------------------- /app/src/main/java/com/example/dynamicappicon/ui/theme/Theme.kt: -------------------------------------------------------------------------------- 1 | package com.example.dynamicappicon.ui.theme 2 | 3 | import android.app.Activity 4 | import android.os.Build 5 | import androidx.compose.foundation.isSystemInDarkTheme 6 | import androidx.compose.material3.MaterialTheme 7 | import androidx.compose.material3.darkColorScheme 8 | import androidx.compose.material3.dynamicDarkColorScheme 9 | import androidx.compose.material3.dynamicLightColorScheme 10 | import androidx.compose.material3.lightColorScheme 11 | import androidx.compose.runtime.Composable 12 | import androidx.compose.ui.platform.LocalContext 13 | 14 | private val DarkColorScheme = darkColorScheme( 15 | primary = Purple80, 16 | secondary = PurpleGrey80, 17 | tertiary = Pink80 18 | ) 19 | 20 | private val LightColorScheme = lightColorScheme( 21 | primary = Purple40, 22 | secondary = PurpleGrey40, 23 | tertiary = Pink40 24 | 25 | /* Other default colors to override 26 | background = Color(0xFFFFFBFE), 27 | surface = Color(0xFFFFFBFE), 28 | onPrimary = Color.White, 29 | onSecondary = Color.White, 30 | onTertiary = Color.White, 31 | onBackground = Color(0xFF1C1B1F), 32 | onSurface = Color(0xFF1C1B1F), 33 | */ 34 | ) 35 | 36 | @Composable 37 | fun DynamicAppIconTheme( 38 | darkTheme: Boolean = isSystemInDarkTheme(), 39 | // Dynamic color is available on Android 12+ 40 | dynamicColor: Boolean = true, 41 | content: @Composable () -> Unit 42 | ) { 43 | val colorScheme = when { 44 | dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> { 45 | val context = LocalContext.current 46 | if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) 47 | } 48 | 49 | darkTheme -> DarkColorScheme 50 | else -> LightColorScheme 51 | } 52 | 53 | MaterialTheme( 54 | colorScheme = colorScheme, 55 | typography = Typography, 56 | content = content 57 | ) 58 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/dynamicappicon/ui/theme/Type.kt: -------------------------------------------------------------------------------- 1 | package com.example.dynamicappicon.ui.theme 2 | 3 | import androidx.compose.material3.Typography 4 | import androidx.compose.ui.text.TextStyle 5 | import androidx.compose.ui.text.font.FontFamily 6 | import androidx.compose.ui.text.font.FontWeight 7 | import androidx.compose.ui.unit.sp 8 | 9 | // Set of Material typography styles to start with 10 | val Typography = Typography( 11 | bodyLarge = TextStyle( 12 | fontFamily = FontFamily.Default, 13 | fontWeight = FontWeight.Normal, 14 | fontSize = 16.sp, 15 | lineHeight = 24.sp, 16 | letterSpacing = 0.5.sp 17 | ) 18 | /* Other default text styles to override 19 | titleLarge = TextStyle( 20 | fontFamily = FontFamily.Default, 21 | fontWeight = FontWeight.Normal, 22 | fontSize = 22.sp, 23 | lineHeight = 28.sp, 24 | letterSpacing = 0.sp 25 | ), 26 | labelSmall = TextStyle( 27 | fontFamily = FontFamily.Default, 28 | fontWeight = FontWeight.Medium, 29 | fontSize = 11.sp, 30 | lineHeight = 16.sp, 31 | letterSpacing = 0.5.sp 32 | ) 33 | */ 34 | ) -------------------------------------------------------------------------------- /app/src/main/my_launch_icon_one-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/my_launch_icon_one-playstore.png -------------------------------------------------------------------------------- /app/src/main/my_launch_icon_three-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/my_launch_icon_three-playstore.png -------------------------------------------------------------------------------- /app/src/main/my_launch_icon_two-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/my_launch_icon_two-playstore.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 15 | 18 | 21 | 22 | 23 | 24 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/my_launch_icon_one_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 10 | 12 | 14 | 16 | 18 | 20 | 22 | 24 | 26 | 28 | 30 | 32 | 34 | 36 | 38 | 40 | 42 | 44 | 46 | 48 | 50 | 52 | 54 | 56 | 58 | 60 | 62 | 64 | 66 | 68 | 70 | 72 | 74 | 75 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/my_launch_icon_three_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 10 | 12 | 14 | 16 | 18 | 20 | 22 | 24 | 26 | 28 | 30 | 32 | 34 | 36 | 38 | 40 | 42 | 44 | 46 | 48 | 50 | 52 | 54 | 56 | 58 | 60 | 62 | 64 | 66 | 68 | 70 | 72 | 74 | 75 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/my_launch_icon_two_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 10 | 12 | 14 | 16 | 18 | 20 | 22 | 24 | 26 | 28 | 30 | 32 | 34 | 36 | 38 | 40 | 42 | 44 | 46 | 48 | 50 | 52 | 54 | 56 | 58 | 60 | 62 | 64 | 66 | 68 | 70 | 72 | 74 | 75 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/my_launch_icon_one.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/my_launch_icon_one_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/my_launch_icon_three.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/my_launch_icon_three_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/my_launch_icon_two.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/my_launch_icon_two_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-hdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/my_launch_icon_one.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-hdpi/my_launch_icon_one.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/my_launch_icon_one_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-hdpi/my_launch_icon_one_foreground.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/my_launch_icon_one_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-hdpi/my_launch_icon_one_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/my_launch_icon_three.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-hdpi/my_launch_icon_three.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/my_launch_icon_three_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-hdpi/my_launch_icon_three_foreground.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/my_launch_icon_three_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-hdpi/my_launch_icon_three_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/my_launch_icon_two.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-hdpi/my_launch_icon_two.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/my_launch_icon_two_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-hdpi/my_launch_icon_two_foreground.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/my_launch_icon_two_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-hdpi/my_launch_icon_two_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-mdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/my_launch_icon_one.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-mdpi/my_launch_icon_one.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/my_launch_icon_one_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-mdpi/my_launch_icon_one_foreground.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/my_launch_icon_one_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-mdpi/my_launch_icon_one_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/my_launch_icon_three.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-mdpi/my_launch_icon_three.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/my_launch_icon_three_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-mdpi/my_launch_icon_three_foreground.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/my_launch_icon_three_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-mdpi/my_launch_icon_three_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/my_launch_icon_two.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-mdpi/my_launch_icon_two.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/my_launch_icon_two_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-mdpi/my_launch_icon_two_foreground.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/my_launch_icon_two_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-mdpi/my_launch_icon_two_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-xhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/my_launch_icon_one.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-xhdpi/my_launch_icon_one.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/my_launch_icon_one_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-xhdpi/my_launch_icon_one_foreground.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/my_launch_icon_one_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-xhdpi/my_launch_icon_one_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/my_launch_icon_three.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-xhdpi/my_launch_icon_three.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/my_launch_icon_three_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-xhdpi/my_launch_icon_three_foreground.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/my_launch_icon_three_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-xhdpi/my_launch_icon_three_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/my_launch_icon_two.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-xhdpi/my_launch_icon_two.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/my_launch_icon_two_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-xhdpi/my_launch_icon_two_foreground.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/my_launch_icon_two_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-xhdpi/my_launch_icon_two_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/my_launch_icon_one.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-xxhdpi/my_launch_icon_one.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/my_launch_icon_one_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-xxhdpi/my_launch_icon_one_foreground.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/my_launch_icon_one_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-xxhdpi/my_launch_icon_one_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/my_launch_icon_three.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-xxhdpi/my_launch_icon_three.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/my_launch_icon_three_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-xxhdpi/my_launch_icon_three_foreground.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/my_launch_icon_three_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-xxhdpi/my_launch_icon_three_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/my_launch_icon_two.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-xxhdpi/my_launch_icon_two.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/my_launch_icon_two_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-xxhdpi/my_launch_icon_two_foreground.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/my_launch_icon_two_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-xxhdpi/my_launch_icon_two_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/my_launch_icon_one.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-xxxhdpi/my_launch_icon_one.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/my_launch_icon_one_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-xxxhdpi/my_launch_icon_one_foreground.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/my_launch_icon_one_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-xxxhdpi/my_launch_icon_one_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/my_launch_icon_three.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-xxxhdpi/my_launch_icon_three.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/my_launch_icon_three_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-xxxhdpi/my_launch_icon_three_foreground.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/my_launch_icon_three_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-xxxhdpi/my_launch_icon_three_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/my_launch_icon_two.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-xxxhdpi/my_launch_icon_two.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/my_launch_icon_two_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-xxxhdpi/my_launch_icon_two_foreground.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/my_launch_icon_two_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SamriddhaS/DynamicAppLauncherDemo/40b2c63b9e428a01227681f3e7f1bc596421770e/app/src/main/res/mipmap-xxxhdpi/my_launch_icon_two_round.webp -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FFBB86FC 4 | #FF6200EE 5 | #FF3700B3 6 | #FF03DAC5 7 | #FF018786 8 | #FF000000 9 | #FFFFFFFF 10 | -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | DynamicAppIcon 3 | -------------------------------------------------------------------------------- /app/src/main/res/values/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |