├── .editorconfig ├── .github ├── pull_request_template.md └── workflows │ ├── android_build.yml │ ├── android_ui_tests.yml │ └── template_change_test.yml ├── .gitignore ├── Dangerfile ├── Gemfile ├── README.md ├── app ├── .gitignore ├── build.gradle.kts ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── template │ │ ├── MainActivity.kt │ │ └── theme │ │ ├── Color.kt │ │ ├── Shape.kt │ │ ├── Theme.kt │ │ └── Type.kt │ └── res │ ├── drawable-v24 │ └── ic_launcher_foreground.xml │ ├── drawable │ └── ic_launcher_background.xml │ ├── mipmap-anydpi-v26 │ ├── ic_launcher.xml │ └── ic_launcher_round.xml │ ├── mipmap-hdpi │ ├── ic_launcher.webp │ └── ic_launcher_round.webp │ ├── mipmap-mdpi │ ├── ic_launcher.webp │ └── ic_launcher_round.webp │ ├── mipmap-xhdpi │ ├── ic_launcher.webp │ └── ic_launcher_round.webp │ ├── mipmap-xxhdpi │ ├── ic_launcher.webp │ └── ic_launcher_round.webp │ ├── mipmap-xxxhdpi │ ├── ic_launcher.webp │ └── ic_launcher_round.webp │ ├── values-night │ └── themes.xml │ └── values │ ├── colors.xml │ ├── strings.xml │ └── themes.xml ├── build-logic ├── README.md ├── convention │ ├── build.gradle.kts │ └── src │ │ └── main │ │ └── kotlin │ │ ├── AndroidApplicationComposeConventionPlugin.kt │ │ ├── AndroidApplicationConventionPlugin.kt │ │ ├── AndroidApplicationJacocoConventionPlugin.kt │ │ ├── AndroidFeatureConventionPlugin.kt │ │ ├── AndroidHiltConventionPlugin.kt │ │ ├── AndroidLibraryComposeConventionPlugin.kt │ │ ├── AndroidLibraryConventionPlugin.kt │ │ ├── AndroidLibraryJacocoConventionPlugin.kt │ │ ├── AndroidRoomConventionPlugin.kt │ │ ├── AndroidTestConventionPlugin.kt │ │ ├── FirebasePerfConventionPlugin.kt │ │ ├── KotlinLinterPlugin.kt │ │ └── template │ │ ├── AndroidCompose.kt │ │ ├── Flavor.kt │ │ ├── Jacoco.kt │ │ ├── KotlinAndroid.kt │ │ ├── PrintTestApks.kt │ │ └── ProjectExtensions.kt ├── gradle.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties └── settings.gradle.kts ├── build.gradle.kts ├── buildscripts ├── githooks.gradle └── setup.gradle ├── config └── detekt │ └── detekt.yml ├── documentation ├── GitHooks.md ├── GitHubActions.md └── StaticAnalysis.md ├── git-hooks ├── pre-commit.sh └── pre-push.sh ├── gradle.properties ├── gradle ├── libs.versions.toml └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle.kts /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*.{kt,kts}] 4 | max_line_length = 140 5 | indent_size = 4 6 | insert_final_newline = true 7 | ij_kotlin_allow_trailing_comma = true 8 | ij_kotlin_allow_trailing_comma_on_call_site = true 9 | ktlint_disabled_rules = filename 10 | -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | ## Summary 2 | 3 | 4 | 5 | ## How It Was Tested 6 | 7 | 8 | 9 | ## Screenshot/Gif 10 | 11 | 12 | 13 |
14 | 15 | Screenshot Name 16 | 17 | 18 | 19 |
-------------------------------------------------------------------------------- /.github/workflows/android_build.yml: -------------------------------------------------------------------------------- 1 | name: Android Build 2 | 3 | on: 4 | push: 5 | branches: 6 | - develop 7 | - main 8 | pull_request: 9 | 10 | jobs: 11 | build: 12 | runs-on: ubuntu-latest 13 | steps: 14 | - uses: actions/checkout@v3 15 | 16 | - name: Set Up JDK 17 | uses: actions/setup-java@v3 18 | with: 19 | distribution: 'zulu' 20 | java-version: 17 21 | 22 | - name: Setup Gradle 23 | uses: gradle/gradle-build-action@v2 24 | with: 25 | # Only write to the cache for builds on the 'development' branch 26 | cache-read-only: ${{ github.ref != 'refs/heads/development' }} 27 | 28 | - name: Build Project 29 | run: ./gradlew assemble 30 | 31 | - name: Run Tests 32 | run: ./gradlew test 33 | 34 | - name: Lint Checks 35 | run: ./gradlew detektAll lintKotlin lint -------------------------------------------------------------------------------- /.github/workflows/android_ui_tests.yml: -------------------------------------------------------------------------------- 1 | name: Android UI Tests 2 | 3 | on: 4 | push: 5 | branches: 6 | - develop 7 | pull_request: 8 | 9 | jobs: 10 | android-test: 11 | runs-on: macos-latest 12 | steps: 13 | - name: Checkout 14 | uses: actions/checkout@v3 15 | 16 | - name: Set Up JDK 17 | uses: actions/setup-java@v3 18 | with: 19 | distribution: 'zulu' 20 | java-version: 17 21 | 22 | - name: Setup Gradle 23 | uses: gradle/gradle-build-action@v2 24 | with: 25 | # Only write to the cache for builds on the 'development' branch 26 | cache-read-only: ${{ github.ref != 'refs/heads/development' }} 27 | 28 | - name: Run Tests 29 | uses: reactivecircus/android-emulator-runner@v2 30 | with: 31 | api-level: 29 32 | script: ./gradlew app:connectedCheck -------------------------------------------------------------------------------- /.github/workflows/template_change_test.yml: -------------------------------------------------------------------------------- 1 | name: Rename Template 2 | 3 | on: pull_request 4 | 5 | jobs: 6 | rename-template: 7 | strategy: 8 | matrix: 9 | useHiltDependencies: [true, false] 10 | useRoomDependencies: [true, false] 11 | useRetrofitDependencies: [true, false] 12 | 13 | runs-on: ubuntu-latest 14 | steps: 15 | - uses: actions/checkout@v3 16 | 17 | - name: Set useHiltDependencies 18 | uses: jacobtomlinson/gha-find-replace@v3 19 | with: 20 | find: "useHiltDependencies[ ]+ : true" 21 | replace: "useHiltDependencies : ${{ matrix.useHiltDependencies }}" 22 | include: "**setup.gradle" 23 | 24 | - name: Set useRoomDependencies 25 | uses: jacobtomlinson/gha-find-replace@v3 26 | with: 27 | find: "useRoomDependencies[ ]+ : true" 28 | replace: "useRoomDependencies : ${{ matrix.useRoomDependencies }}" 29 | include: "**setup.gradle" 30 | 31 | - name: Set useRetrofitDependencies 32 | uses: jacobtomlinson/gha-find-replace@v3 33 | with: 34 | find: "useRetrofitDependencies[ ]+ : true" 35 | replace: "useRetrofitDependencies : ${{ matrix.useRetrofitDependencies }}" 36 | include: "**setup.gradle" 37 | 38 | - name: Set Up JDK 39 | uses: actions/setup-java@v3 40 | with: 41 | distribution: 'zulu' 42 | java-version: 17 43 | 44 | - name: Setup Gradle 45 | uses: gradle/gradle-build-action@v2 46 | 47 | - name: Rename 48 | run: ./gradlew renameTemplate 49 | 50 | - name: Build 51 | run: ./gradlew build -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/ 5 | .DS_Store 6 | /build 7 | /captures 8 | .externalNativeBuild 9 | .cxx 10 | local.properties 11 | build/ 12 | -------------------------------------------------------------------------------- /Dangerfile: -------------------------------------------------------------------------------- 1 | message "Thanks @#{github.pr_author}!" 2 | 3 | if github.pr_body.length == 0 4 | fail "Please provide a summary in the Pull Request description." 5 | end 6 | 7 | if git.lines_of_code > 500 8 | warn "Please consider breaking up this pull request." 9 | end 10 | 11 | if github.pr_labels.empty? 12 | warn "Please add labels to this PR." 13 | end 14 | 15 | if git.deletions > git.insertions 16 | message "🎉 Code Cleanup!" 17 | end 18 | 19 | # Notify of outdated dependencies 20 | dependencyUpdatesHeader = "The following dependencies have later milestone versions:" 21 | dependencyReportsFile = "build/dependencyUpdates/report.txt" 22 | 23 | # Due to the formatting of this output file, we first check if there are any dependencies 24 | # by looking for a `->` arrow, then we check for the relevant headers. We do this to handle a case 25 | # where there are no app dependencies but there are Gradle dependencies. 26 | hasDependencyUpdatesHeader = File.readlines(dependencyReportsFile).grep(/#{dependencyUpdatesHeader}/).any? 27 | 28 | if hasDependencyUpdatesHeader 29 | file = File.open(dependencyReportsFile, "rb").read 30 | index = file.index(dependencyUpdatesHeader) 31 | message file.slice(index..-1) 32 | end -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | 3 | git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } 4 | 5 | gem "danger" -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Android App Template 2 | 3 | This GitHub template repository serves as a starting point for developing Android applications. 4 | I've started this Android application template using [Adam](https://github.com/AdamMc331)'s template. 5 | Along with the existing tools, I've added some features that align with my specific needs. These enhancements aim to make the development process smoother and improve the app's functionality. However, I'm open to suggestions and improvements. If you think there are other important elements to include or have recommendations for modifying the current setup, please share your thoughts. Your input is highly appreciated. 6 | Note that, since Adam did a really good job with the documentation, I left it mostly unchanged. 7 | 8 | ## Why This Template? 9 | 10 | The purpose of this template is to avoid any opinions on writing code. The developers should have the freedom to choose their own architecture, third party dependencies, package structure, and more. 11 | 12 | This template _is_ opinionated about developer tooling. Dependency management is configured, git hooks are defined, code formatting and static analysis are all there, and it even has pull request templates. The purpose of this repo is to help you get started building your next project with confidence in your code, and not telling you how to write it. 13 | 14 | ## Walkthrough 15 | 16 | If you'd like a video walk through of this template and all it has to offer, you can find that on YouTube. 17 | 18 | https://youtu.be/E0iMUWJn76E 19 | 20 | ## Using This Template 21 | 22 | To use this template in your own project, click the "Use this template" button at the top right of the repository. Once you do, a repository will be created for your account that you can clone and use on your device. 23 | 24 | To setup this repository to your needs, open the [setup.gradle](buildscripts/setup.gradle) file 25 | and tweak the `renameConfig` block to your needs. After that, you can run the `renameTemplate` 26 | gradle task to have the app module's package name and relevant strings replaced. 27 | 28 | ## What's Included 29 | 30 | A number of third party dependencies are included in this template. They are also documented inside the [documentation folder](/documentation). The files inside this documentation folder are written in such a way that you can keep them in your real project, to let team members read up on why dependencies are included and how they work. 31 | 32 | The dependencies in the template include: 33 | 34 | * [Ktlint](/documentation/StaticAnalysis.md) for formatting. 35 | * [Detekt](/documentation/StaticAnalysis.md) for code smells. 36 | * [Git Hooks](/documentation/GitHooks.md) for automatically perform static analysis checks. 37 | * [GitHub Actions](/documentation/GitHubActions.md) for running continuous integration and ensuring code quality with every PR. 38 | * [LeakCanary](https://square.github.io/leakcanary/) for detecting memory leaks. 39 | * [Hilt](https://developer.android.com/training/dependency-injection/hilt-android) dependencies, which can be removed via setup.gradle if necessary. 40 | * [Room](https://developer.android.com/training/data-storage/room) dependencies, which can be removed via setup.gradle if necessary. 41 | 42 | ### Templates 43 | 44 | There are also templates within this template. This repo comes shipped with a [Pull Request Template](/.github/pull_request_template.md) that will help you and your team write organized and detailed pull request descriptions. 45 | 46 | ## Dependency Setup 47 | 48 | You may notice that dependencies are set up in a very specific way. Each of the tools has its own Gradle file in the [buildscripts folder](/buildscripts). This is by design so that if you chose to have a multi module project, these dependencies can easily be shared between them. This is already configured inside our root `build.gradle.kts` file, by applying to each sub project: 49 | 50 | ```groovy 51 | subprojects { 52 | apply from: "../buildscripts/versionsplugin.gradle" 53 | } 54 | ``` 55 | 56 | In addition, all of the app module dependencies are defined using a gradle version catalog, found in this [toml](gradle/libs.versions.toml) file. 57 | 58 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /app/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | alias(libs.plugins.convention.android.application) 3 | alias(libs.plugins.convention.android.application.compose) 4 | alias(libs.plugins.convention.android.room) 5 | alias(libs.plugins.convention.android.hilt) 6 | alias(libs.plugins.convention.kotlinter) 7 | } 8 | 9 | android { 10 | 11 | defaultConfig { 12 | applicationId = "template.app.id" 13 | versionCode = 1 14 | versionName = "1.0" 15 | 16 | testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" 17 | vectorDrawables { 18 | useSupportLibrary = true 19 | } 20 | } 21 | 22 | buildTypes { 23 | release { 24 | isMinifyEnabled = false 25 | proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") 26 | } 27 | } 28 | 29 | packaging { 30 | resources { 31 | excludes += "/META-INF/{AL2.0,LGPL2.1}" 32 | } 33 | } 34 | 35 | namespace = "template" 36 | } 37 | 38 | dependencies { 39 | 40 | implementation(libs.androidx.activity.compose) 41 | implementation(libs.androidx.appcompat) 42 | implementation(libs.androidx.core.ktx) 43 | implementation(libs.androidx.lifecycle.runtime.ktx) 44 | implementation(libs.android.material) 45 | implementation(libs.compose.ui) 46 | implementation(libs.compose.material) 47 | implementation(libs.compose.ui.tooling) 48 | implementation(libs.moshi.kotlin.core) 49 | implementation(libs.retrofit) 50 | implementation(libs.retrofit.converter.moshi) 51 | 52 | testImplementation(libs.junit4) 53 | 54 | androidTestImplementation(libs.androidx.test.junit) 55 | androidTestImplementation(libs.androidx.test.espresso.core) 56 | androidTestImplementation(libs.compose.ui.test.junit) 57 | androidTestImplementation(libs.hilt.android.testing) 58 | 59 | debugImplementation(libs.compose.ui.test.manifest) 60 | debugImplementation(libs.compose.ui.tooling) 61 | debugImplementation(libs.leakcanary) 62 | 63 | ksp(libs.moshi.kotlin.codegen) 64 | } 65 | -------------------------------------------------------------------------------- /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.kts. 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/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 13 | 14 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /app/src/main/java/template/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package template 2 | 3 | import android.os.Bundle 4 | import androidx.activity.ComponentActivity 5 | import androidx.activity.SystemBarStyle 6 | import androidx.activity.compose.setContent 7 | import androidx.activity.enableEdgeToEdge 8 | import androidx.compose.foundation.isSystemInDarkTheme 9 | import androidx.compose.foundation.layout.Column 10 | import androidx.compose.foundation.layout.WindowInsets 11 | import androidx.compose.foundation.layout.fillMaxSize 12 | import androidx.compose.foundation.layout.systemBars 13 | import androidx.compose.foundation.layout.windowInsetsPadding 14 | import androidx.compose.material3.Surface 15 | import androidx.compose.material3.Text 16 | import androidx.compose.runtime.Composable 17 | import androidx.compose.runtime.DisposableEffect 18 | import androidx.compose.ui.Modifier 19 | import template.theme.TemplateTheme 20 | 21 | class MainActivity : ComponentActivity() { 22 | override fun onCreate(savedInstanceState: Bundle?) { 23 | super.onCreate(savedInstanceState) 24 | 25 | enableEdgeToEdge() 26 | 27 | setContent { 28 | val darkTheme = isSystemInDarkTheme() 29 | 30 | SystemBarStyleEffect(darkTheme = darkTheme) 31 | 32 | TemplateTheme { 33 | Surface { 34 | Column( 35 | modifier = Modifier 36 | .fillMaxSize() 37 | .windowInsetsPadding(WindowInsets.systemBars), 38 | ) { 39 | Greeting("Android") 40 | } 41 | } 42 | } 43 | } 44 | } 45 | 46 | /** 47 | * Update the edge to edge configuration to match the theme 48 | * This is the same parameters as the default enableEdgeToEdge call, but we manually 49 | * resolve whether or not to show dark theme using uiState, since it can be different 50 | * than the configuration's dark theme value based on the user preference. 51 | */ 52 | @Composable 53 | private fun SystemBarStyleEffect(darkTheme: Boolean) { 54 | DisposableEffect(darkTheme) { 55 | enableEdgeToEdge( 56 | statusBarStyle = SystemBarStyle.auto( 57 | android.graphics.Color.TRANSPARENT, 58 | android.graphics.Color.TRANSPARENT, 59 | ) { darkTheme }, 60 | navigationBarStyle = SystemBarStyle.auto( 61 | lightScrim, 62 | darkScrim, 63 | ) { darkTheme }, 64 | ) 65 | onDispose {} 66 | } 67 | } 68 | } 69 | 70 | @Composable 71 | fun Greeting(name: String) { 72 | Text(text = "Hello $name!") 73 | } 74 | 75 | /** 76 | * The default light scrim, as defined by androidx and the platform: 77 | * https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:activity/activity/src/main/java/androidx/activity/EdgeToEdge.kt;l=35-38;drc=27e7d52e8604a080133e8b842db10c89b4482598 78 | */ 79 | @Suppress("MagicNumber") 80 | private val lightScrim = android.graphics.Color.argb(0xe6, 0xFF, 0xFF, 0xFF) 81 | 82 | /** 83 | * The default dark scrim, as defined by androidx and the platform: 84 | * https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:activity/activity/src/main/java/androidx/activity/EdgeToEdge.kt;l=40-44;drc=27e7d52e8604a080133e8b842db10c89b4482598 85 | */ 86 | @Suppress("MagicNumber") 87 | private val darkScrim = android.graphics.Color.argb(0x80, 0x1b, 0x1b, 0x1b) 88 | -------------------------------------------------------------------------------- /app/src/main/java/template/theme/Color.kt: -------------------------------------------------------------------------------- 1 | @file:Suppress("MagicNumber") 2 | 3 | package template.theme 4 | 5 | import androidx.compose.ui.graphics.Color 6 | 7 | val Purple200 = Color(0xFFBB86FC) 8 | val Purple500 = Color(0xFF6200EE) 9 | val Teal200 = Color(0xFF03DAC5) 10 | -------------------------------------------------------------------------------- /app/src/main/java/template/theme/Shape.kt: -------------------------------------------------------------------------------- 1 | package template.theme 2 | 3 | import androidx.compose.foundation.shape.RoundedCornerShape 4 | import androidx.compose.material3.Shapes 5 | import androidx.compose.ui.unit.dp 6 | 7 | val Shapes = Shapes( 8 | small = RoundedCornerShape(4.dp), 9 | medium = RoundedCornerShape(4.dp), 10 | large = RoundedCornerShape(0.dp), 11 | ) 12 | -------------------------------------------------------------------------------- /app/src/main/java/template/theme/Theme.kt: -------------------------------------------------------------------------------- 1 | package template.theme 2 | 3 | import android.annotation.TargetApi 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 = Purple200, 16 | secondary = Teal200, 17 | ) 18 | 19 | private val lightColorScheme = lightColorScheme( 20 | primary = Purple500, 21 | secondary = Teal200, 22 | ) 23 | 24 | @Composable 25 | @TargetApi(Build.VERSION_CODES.S) 26 | fun TemplateTheme( 27 | darkTheme: Boolean = isSystemInDarkTheme(), 28 | dynamicTheme: Boolean = Build.VERSION.SDK_INT >= Build.VERSION_CODES.S, 29 | content: @Composable () -> Unit, 30 | ) { 31 | val colorScheme = when { 32 | dynamicTheme && darkTheme -> dynamicDarkColorScheme(LocalContext.current) 33 | dynamicTheme && !darkTheme -> dynamicLightColorScheme(LocalContext.current) 34 | darkTheme -> darkColorScheme 35 | else -> lightColorScheme 36 | } 37 | 38 | MaterialTheme( 39 | colorScheme = colorScheme, 40 | typography = Typography, 41 | shapes = Shapes, 42 | content = content, 43 | ) 44 | } 45 | -------------------------------------------------------------------------------- /app/src/main/java/template/theme/Type.kt: -------------------------------------------------------------------------------- 1 | package template.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 | bodyMedium = TextStyle( 12 | fontFamily = FontFamily.Default, 13 | fontWeight = FontWeight.Normal, 14 | fontSize = 16.sp, 15 | ), 16 | ) 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 15 | 18 | 21 | 22 | 23 | 24 | 30 | -------------------------------------------------------------------------------- /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/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aslansari/android-app-template/5b914d05aed2854247669bc806d9c15adb0feff2/app/src/main/res/mipmap-hdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aslansari/android-app-template/5b914d05aed2854247669bc806d9c15adb0feff2/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aslansari/android-app-template/5b914d05aed2854247669bc806d9c15adb0feff2/app/src/main/res/mipmap-mdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aslansari/android-app-template/5b914d05aed2854247669bc806d9c15adb0feff2/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aslansari/android-app-template/5b914d05aed2854247669bc806d9c15adb0feff2/app/src/main/res/mipmap-xhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aslansari/android-app-template/5b914d05aed2854247669bc806d9c15adb0feff2/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aslansari/android-app-template/5b914d05aed2854247669bc806d9c15adb0feff2/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aslansari/android-app-template/5b914d05aed2854247669bc806d9c15adb0feff2/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aslansari/android-app-template/5b914d05aed2854247669bc806d9c15adb0feff2/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aslansari/android-app-template/5b914d05aed2854247669bc806d9c15adb0feff2/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/values-night/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /app/src/main/res/values/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16 | 17 | 21 | 22 |