├── .gitignore ├── README.md ├── build.gradle.kts ├── darktheme ├── README.md ├── app │ ├── build.gradle.kts │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── com │ │ │ └── kfaraj │ │ │ └── samples │ │ │ └── darktheme │ │ │ ├── MainActivity.kt │ │ │ ├── MainApplication.kt │ │ │ ├── SettingsActivity.kt │ │ │ ├── data │ │ │ ├── Settings.kt │ │ │ └── SettingsRepository.kt │ │ │ ├── domain │ │ │ └── GetNightModeUseCase.kt │ │ │ ├── ui │ │ │ ├── MainFragment.kt │ │ │ └── SettingsFragment.kt │ │ │ └── util │ │ │ └── EdgeToEdge.kt │ │ └── res │ │ ├── drawable │ │ ├── ic_add_black_24dp.xml │ │ ├── ic_arrow_back_24dp.xml │ │ ├── ic_launcher_background.xml │ │ ├── ic_launcher_foreground.xml │ │ ├── ic_launcher_monochrome.xml │ │ └── ic_settings_24dp.xml │ │ ├── layout │ │ ├── activity_main.xml │ │ ├── activity_settings.xml │ │ └── fragment_main.xml │ │ ├── menu │ │ └── activity_main.xml │ │ ├── mipmap │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── values-night │ │ └── themes.xml │ │ ├── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── themes.xml │ │ └── xml │ │ └── preferences.xml └── screenshots │ └── darktheme.webp ├── gradle.properties ├── gradle ├── libs.versions.toml └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── pokedex ├── README.md ├── app │ ├── build.gradle.kts │ ├── proguard-rules.pro │ ├── schemas │ │ └── com.kfaraj.samples.pokedex.data.local.ApplicationDatabase │ │ │ └── 1.json │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── kfaraj │ │ │ └── samples │ │ │ └── pokedex │ │ │ └── MainActivityTest.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── kfaraj │ │ │ │ └── samples │ │ │ │ └── pokedex │ │ │ │ ├── MainActivity.kt │ │ │ │ ├── MainApplication.kt │ │ │ │ ├── data │ │ │ │ ├── Pokemon.kt │ │ │ │ ├── PokemonsRemoteMediator.kt │ │ │ │ ├── PokemonsRepository.kt │ │ │ │ ├── local │ │ │ │ │ ├── ApplicationDatabase.kt │ │ │ │ │ ├── PokemonDao.kt │ │ │ │ │ ├── PokemonEntity.kt │ │ │ │ │ └── PokemonsLocalDataSource.kt │ │ │ │ └── remote │ │ │ │ │ ├── DefaultPokeApiService.kt │ │ │ │ │ ├── NamedApiResource.kt │ │ │ │ │ ├── NamedApiResourceList.kt │ │ │ │ │ ├── PokeApiService.kt │ │ │ │ │ └── PokemonsRemoteDataSource.kt │ │ │ │ ├── di │ │ │ │ ├── CoroutinesModule.kt │ │ │ │ ├── DatabaseModule.kt │ │ │ │ └── NetworkModule.kt │ │ │ │ ├── domain │ │ │ │ ├── FormatIdUseCase.kt │ │ │ │ ├── FormatNameUseCase.kt │ │ │ │ └── GetSpriteUseCase.kt │ │ │ │ ├── ui │ │ │ │ ├── PokedexFragment.kt │ │ │ │ ├── PokedexItemAdapter.kt │ │ │ │ ├── PokedexItemCallback.kt │ │ │ │ ├── PokedexItemUiState.kt │ │ │ │ ├── PokedexItemViewHolder.kt │ │ │ │ ├── PokedexNavigation.kt │ │ │ │ ├── PokedexViewModel.kt │ │ │ │ ├── PokemonFragment.kt │ │ │ │ ├── PokemonNavigation.kt │ │ │ │ ├── PokemonUiState.kt │ │ │ │ └── PokemonViewModel.kt │ │ │ │ └── util │ │ │ │ └── EdgeToEdge.kt │ │ └── res │ │ │ ├── drawable │ │ │ ├── ic_launcher_background.xml │ │ │ ├── ic_launcher_foreground.xml │ │ │ └── ic_launcher_monochrome.xml │ │ │ ├── layout │ │ │ ├── activity_main.xml │ │ │ ├── fragment_pokedex.xml │ │ │ ├── fragment_pokemon.xml │ │ │ └── item_card.xml │ │ │ ├── mipmap │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ │ ├── values-night │ │ │ └── themes.xml │ │ │ └── values │ │ │ ├── colors.xml │ │ │ ├── dimens.xml │ │ │ ├── strings.xml │ │ │ └── themes.xml │ │ └── test │ │ └── java │ │ └── com │ │ └── kfaraj │ │ └── samples │ │ └── pokedex │ │ ├── MainActivityTest.kt │ │ ├── data │ │ ├── PokemonsRemoteMediatorTest.kt │ │ ├── PokemonsRepositoryTest.kt │ │ ├── local │ │ │ └── PokemonsLocalDataSourceTest.kt │ │ └── remote │ │ │ └── PokemonsRemoteDataSourceTest.kt │ │ ├── domain │ │ ├── FormatIdUseCaseTest.kt │ │ ├── FormatNameUseCaseTest.kt │ │ └── GetSpriteUseCaseTest.kt │ │ ├── testutils │ │ └── MainDispatcherRule.kt │ │ └── ui │ │ ├── PokedexViewModelTest.kt │ │ └── PokemonViewModelTest.kt └── screenshots │ └── pokedex.webp └── settings.gradle.kts /.gitignore: -------------------------------------------------------------------------------- 1 | # macOS 2 | .DS_Store 3 | 4 | # Windows NT 5 | Thumbs.db 6 | 7 | # Android Studio 8 | *.iml 9 | .gradle/ 10 | .idea/ 11 | .kotlin/ 12 | build/ 13 | local.properties 14 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Samples 2 | 3 | This project is a collection of samples for Android. 4 | 5 | ## [Dark theme](darktheme) 6 | 7 | This sample demonstrates how to implement a 8 | [dark theme](https://developer.android.com/guide/topics/ui/look-and-feel/darktheme). 9 | 10 | ## [Pokédex](pokedex) 11 | 12 | This sample demonstrates best practices for 13 | [Modern Android Development](https://developer.android.com/modern-android-development). 14 | -------------------------------------------------------------------------------- /build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | alias(libs.plugins.com.android.application) apply false 3 | alias(libs.plugins.org.jetbrains.kotlin.android) apply false 4 | alias(libs.plugins.org.jetbrains.kotlin.plugin.serialization) apply false 5 | alias(libs.plugins.com.google.devtools.ksp) apply false 6 | alias(libs.plugins.com.google.dagger.hilt.android) apply false 7 | } 8 | -------------------------------------------------------------------------------- /darktheme/README.md: -------------------------------------------------------------------------------- 1 | # Dark theme 2 | 3 | This sample demonstrates how to implement a 4 | [dark theme](https://developer.android.com/guide/topics/ui/look-and-feel/darktheme). 5 | 6 | ## Screenshots 7 | 8 | ![Dark theme sample](screenshots/darktheme.webp) 9 | -------------------------------------------------------------------------------- /darktheme/app/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | alias(libs.plugins.com.android.application) 3 | alias(libs.plugins.org.jetbrains.kotlin.android) 4 | } 5 | 6 | android { 7 | namespace = "com.kfaraj.samples.darktheme" 8 | compileSdk = 35 9 | defaultConfig { 10 | applicationId = "com.kfaraj.samples.darktheme" 11 | minSdk = 26 12 | targetSdk = 35 13 | versionCode = 1 14 | versionName = "0.1.0" 15 | vectorDrawables { 16 | useSupportLibrary = true 17 | } 18 | } 19 | signingConfigs { 20 | register("release") { 21 | val storePath = properties["signingStorePath"] as String? 22 | storeFile = if (storePath != null) file(storePath) else null 23 | storePassword = properties["signingStorePassword"] as String? 24 | keyAlias = properties["signingKeyAlias"] as String? 25 | keyPassword = properties["signingKeyPassword"] as String? 26 | } 27 | } 28 | buildTypes { 29 | named("release") { 30 | isMinifyEnabled = true 31 | isShrinkResources = true 32 | proguardFiles( 33 | getDefaultProguardFile("proguard-android-optimize.txt"), 34 | "proguard-rules.pro" 35 | ) 36 | signingConfig = signingConfigs.getByName("release") 37 | } 38 | } 39 | } 40 | 41 | kotlin { 42 | jvmToolchain(21) 43 | } 44 | 45 | dependencies { 46 | implementation(libs.androidx.activity) 47 | implementation(libs.androidx.appcompat) 48 | implementation(libs.androidx.coordinatorlayout) 49 | implementation(libs.androidx.core.ktx) 50 | implementation(libs.androidx.fragment.ktx) 51 | implementation(libs.androidx.preference.ktx) 52 | implementation(libs.com.google.android.material) 53 | } 54 | -------------------------------------------------------------------------------- /darktheme/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | -keepattributes SourceFile,LineNumberTable 2 | -renamesourcefileattribute SourceFile 3 | -------------------------------------------------------------------------------- /darktheme/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 15 | 16 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /darktheme/app/src/main/java/com/kfaraj/samples/darktheme/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.kfaraj.samples.darktheme 2 | 3 | import android.content.Intent 4 | import android.os.Bundle 5 | import android.view.MenuItem 6 | import android.view.View 7 | import android.view.View.OnClickListener 8 | import androidx.activity.enableEdgeToEdge 9 | import androidx.appcompat.app.AppCompatActivity 10 | import androidx.appcompat.widget.Toolbar.OnMenuItemClickListener 11 | import androidx.core.app.ActivityCompat 12 | import androidx.core.view.WindowInsetsCompat 13 | import com.google.android.material.appbar.AppBarLayout 14 | import com.google.android.material.appbar.MaterialToolbar 15 | import com.google.android.material.floatingactionbutton.FloatingActionButton 16 | import com.google.android.material.snackbar.Snackbar 17 | import com.kfaraj.samples.darktheme.util.applyWindowInsetsPadding 18 | 19 | /** 20 | * Demonstrates how to implement a dark theme. 21 | */ 22 | class MainActivity : AppCompatActivity(R.layout.activity_main), 23 | OnMenuItemClickListener, 24 | OnClickListener { 25 | 26 | override fun onCreate(savedInstanceState: Bundle?) { 27 | enableEdgeToEdge() 28 | super.onCreate(savedInstanceState) 29 | val toolbar = ActivityCompat.requireViewById(this, R.id.toolbar) 30 | val fab = ActivityCompat.requireViewById(this, R.id.fab) 31 | toolbar.setOnMenuItemClickListener(this) 32 | (toolbar.parent as AppBarLayout).applyWindowInsetsPadding( 33 | WindowInsetsCompat.Type.systemBars() or 34 | WindowInsetsCompat.Type.displayCutout(), 35 | applyLeft = true, 36 | applyTop = true, 37 | applyRight = true 38 | ) 39 | fab.setOnClickListener(this) 40 | } 41 | 42 | override fun onMenuItemClick(item: MenuItem): Boolean { 43 | return if (item.itemId == R.id.settings) { 44 | val intent = Intent(this, SettingsActivity::class.java) 45 | startActivity(intent) 46 | true 47 | } else { 48 | false 49 | } 50 | } 51 | 52 | override fun onClick(v: View) { 53 | Snackbar.make(v, R.string.lorem_ipsum, Snackbar.LENGTH_SHORT) 54 | .setAnchorView(R.id.fab) 55 | .show() 56 | } 57 | 58 | } 59 | -------------------------------------------------------------------------------- /darktheme/app/src/main/java/com/kfaraj/samples/darktheme/MainApplication.kt: -------------------------------------------------------------------------------- 1 | package com.kfaraj.samples.darktheme 2 | 3 | import android.app.Application 4 | import androidx.appcompat.app.AppCompatDelegate 5 | import com.kfaraj.samples.darktheme.data.SettingsRepository 6 | import com.kfaraj.samples.darktheme.domain.GetNightModeUseCase 7 | 8 | /** 9 | * Demonstrates how to implement a dark theme. 10 | */ 11 | class MainApplication : Application() { 12 | 13 | private lateinit var getNightModeUseCase: GetNightModeUseCase 14 | 15 | override fun onCreate() { 16 | super.onCreate() 17 | val settingsRepository = SettingsRepository.getInstance(this) 18 | getNightModeUseCase = GetNightModeUseCase(settingsRepository) 19 | val nightMode = getNightModeUseCase() 20 | AppCompatDelegate.setDefaultNightMode(nightMode) 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /darktheme/app/src/main/java/com/kfaraj/samples/darktheme/SettingsActivity.kt: -------------------------------------------------------------------------------- 1 | package com.kfaraj.samples.darktheme 2 | 3 | import android.os.Bundle 4 | import android.view.View 5 | import android.view.View.OnClickListener 6 | import androidx.activity.enableEdgeToEdge 7 | import androidx.appcompat.app.AppCompatActivity 8 | import androidx.core.app.ActivityCompat 9 | import androidx.core.view.WindowInsetsCompat 10 | import com.google.android.material.appbar.AppBarLayout 11 | import com.google.android.material.appbar.MaterialToolbar 12 | import com.kfaraj.samples.darktheme.util.applyWindowInsetsPadding 13 | 14 | /** 15 | * Contains settings. 16 | */ 17 | class SettingsActivity : AppCompatActivity(R.layout.activity_settings), 18 | OnClickListener { 19 | 20 | override fun onCreate(savedInstanceState: Bundle?) { 21 | enableEdgeToEdge() 22 | super.onCreate(savedInstanceState) 23 | val toolbar = ActivityCompat.requireViewById(this, R.id.toolbar) 24 | toolbar.setNavigationOnClickListener(this) 25 | (toolbar.parent as AppBarLayout).applyWindowInsetsPadding( 26 | WindowInsetsCompat.Type.systemBars() or 27 | WindowInsetsCompat.Type.displayCutout(), 28 | applyLeft = true, 29 | applyTop = true, 30 | applyRight = true 31 | ) 32 | } 33 | 34 | override fun onClick(v: View) { 35 | onNavigateUp() 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /darktheme/app/src/main/java/com/kfaraj/samples/darktheme/data/Settings.kt: -------------------------------------------------------------------------------- 1 | package com.kfaraj.samples.darktheme.data 2 | 3 | /** 4 | * Contains settings. 5 | */ 6 | object Settings { 7 | 8 | /** 9 | * The theme. 10 | */ 11 | const val THEME = "theme" 12 | 13 | /** 14 | * The theme is light. 15 | */ 16 | const val THEME_LIGHT = "light" 17 | 18 | /** 19 | * The theme is dark. 20 | */ 21 | const val THEME_DARK = "dark" 22 | 23 | /** 24 | * The theme is system default. 25 | */ 26 | const val THEME_SYSTEM_DEFAULT = "system_default" 27 | 28 | } 29 | -------------------------------------------------------------------------------- /darktheme/app/src/main/java/com/kfaraj/samples/darktheme/data/SettingsRepository.kt: -------------------------------------------------------------------------------- 1 | package com.kfaraj.samples.darktheme.data 2 | 3 | import android.content.Context 4 | import androidx.preference.PreferenceManager 5 | import com.kfaraj.samples.darktheme.R 6 | 7 | /** 8 | * Exposes settings data. 9 | */ 10 | class SettingsRepository private constructor( 11 | context: Context 12 | ) { 13 | 14 | private val prefs = PreferenceManager.getDefaultSharedPreferences(context) 15 | 16 | init { 17 | PreferenceManager.setDefaultValues(context, R.xml.preferences, true) 18 | } 19 | 20 | /** 21 | * Returns the theme. 22 | */ 23 | fun getTheme(defValue: String?): String? { 24 | return prefs.getString(Settings.THEME, defValue) 25 | } 26 | 27 | companion object { 28 | 29 | private var instance: SettingsRepository? = null 30 | 31 | /** 32 | * Returns the [SettingsRepository] instance. 33 | */ 34 | fun getInstance( 35 | context: Context 36 | ): SettingsRepository { 37 | return instance ?: SettingsRepository(context).also { instance = it } 38 | } 39 | 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /darktheme/app/src/main/java/com/kfaraj/samples/darktheme/domain/GetNightModeUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.kfaraj.samples.darktheme.domain 2 | 3 | import androidx.appcompat.app.AppCompatDelegate 4 | import com.kfaraj.samples.darktheme.data.Settings 5 | import com.kfaraj.samples.darktheme.data.SettingsRepository 6 | 7 | /** 8 | * Returns the night mode. 9 | */ 10 | class GetNightModeUseCase( 11 | private val settingsRepository: SettingsRepository 12 | ) { 13 | 14 | operator fun invoke(): Int { 15 | val theme = settingsRepository.getTheme( 16 | Settings.THEME_SYSTEM_DEFAULT 17 | ) 18 | return when (theme) { 19 | Settings.THEME_LIGHT -> AppCompatDelegate.MODE_NIGHT_NO 20 | Settings.THEME_DARK -> AppCompatDelegate.MODE_NIGHT_YES 21 | else -> AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM 22 | } 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /darktheme/app/src/main/java/com/kfaraj/samples/darktheme/ui/MainFragment.kt: -------------------------------------------------------------------------------- 1 | package com.kfaraj.samples.darktheme.ui 2 | 3 | import android.os.Bundle 4 | import android.view.View 5 | import androidx.core.view.WindowInsetsCompat 6 | import androidx.fragment.app.Fragment 7 | import com.kfaraj.samples.darktheme.R 8 | import com.kfaraj.samples.darktheme.util.applyWindowInsetsPadding 9 | 10 | /** 11 | * Demonstrates how to implement a dark theme. 12 | */ 13 | class MainFragment : Fragment(R.layout.fragment_main) { 14 | 15 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 16 | super.onViewCreated(view, savedInstanceState) 17 | view.applyWindowInsetsPadding( 18 | WindowInsetsCompat.Type.systemBars(), 19 | applyBottom = true 20 | ) 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /darktheme/app/src/main/java/com/kfaraj/samples/darktheme/ui/SettingsFragment.kt: -------------------------------------------------------------------------------- 1 | package com.kfaraj.samples.darktheme.ui 2 | 3 | import android.content.SharedPreferences 4 | import android.content.SharedPreferences.OnSharedPreferenceChangeListener 5 | import android.os.Bundle 6 | import android.view.View 7 | import androidx.appcompat.app.AppCompatDelegate 8 | import androidx.core.view.WindowInsetsCompat 9 | import androidx.preference.PreferenceFragmentCompat 10 | import com.kfaraj.samples.darktheme.R 11 | import com.kfaraj.samples.darktheme.data.SettingsRepository 12 | import com.kfaraj.samples.darktheme.domain.GetNightModeUseCase 13 | import com.kfaraj.samples.darktheme.util.applyWindowInsetsPadding 14 | 15 | /** 16 | * Contains settings. 17 | */ 18 | class SettingsFragment : PreferenceFragmentCompat(), 19 | OnSharedPreferenceChangeListener { 20 | 21 | private lateinit var getNightModeUseCase: GetNightModeUseCase 22 | 23 | override fun onCreate(savedInstanceState: Bundle?) { 24 | super.onCreate(savedInstanceState) 25 | val context = requireContext() 26 | val settingsRepository = SettingsRepository.getInstance(context) 27 | getNightModeUseCase = GetNightModeUseCase(settingsRepository) 28 | } 29 | 30 | override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { 31 | setPreferencesFromResource(R.xml.preferences, rootKey) 32 | } 33 | 34 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 35 | super.onViewCreated(view, savedInstanceState) 36 | listView.applyWindowInsetsPadding( 37 | WindowInsetsCompat.Type.systemBars(), 38 | applyBottom = true 39 | ) 40 | } 41 | 42 | override fun onStart() { 43 | super.onStart() 44 | preferenceManager.sharedPreferences?.registerOnSharedPreferenceChangeListener(this) 45 | } 46 | 47 | override fun onStop() { 48 | super.onStop() 49 | preferenceManager.sharedPreferences?.unregisterOnSharedPreferenceChangeListener(this) 50 | } 51 | 52 | override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String?) { 53 | val nightMode = getNightModeUseCase() 54 | AppCompatDelegate.setDefaultNightMode(nightMode) 55 | } 56 | 57 | } 58 | -------------------------------------------------------------------------------- /darktheme/app/src/main/java/com/kfaraj/samples/darktheme/util/EdgeToEdge.kt: -------------------------------------------------------------------------------- 1 | package com.kfaraj.samples.darktheme.util 2 | 3 | import android.view.View 4 | import androidx.core.view.ViewCompat 5 | import androidx.core.view.updatePadding 6 | 7 | /** 8 | * Increases padding to avoid visual overlap caused by edge-to-edge. 9 | */ 10 | fun View.applyWindowInsetsPadding( 11 | typeMask: Int, 12 | applyLeft: Boolean = false, 13 | applyTop: Boolean = false, 14 | applyRight: Boolean = false, 15 | applyBottom: Boolean = false 16 | ) { 17 | val paddingLeft = paddingLeft 18 | val paddingTop = paddingTop 19 | val paddingRight = paddingRight 20 | val paddingBottom = paddingBottom 21 | ViewCompat.setOnApplyWindowInsetsListener(this) { v, insets -> 22 | val typeInsets = insets.getInsets(typeMask) 23 | v.updatePadding( 24 | left = paddingLeft + if (applyLeft) typeInsets.left else 0, 25 | top = paddingTop + if (applyTop) typeInsets.top else 0, 26 | right = paddingRight + if (applyRight) typeInsets.right else 0, 27 | bottom = paddingBottom + if (applyBottom) typeInsets.bottom else 0 28 | ) 29 | insets 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /darktheme/app/src/main/res/drawable/ic_add_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /darktheme/app/src/main/res/drawable/ic_arrow_back_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /darktheme/app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /darktheme/app/src/main/res/drawable/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 12 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /darktheme/app/src/main/res/drawable/ic_launcher_monochrome.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 12 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /darktheme/app/src/main/res/drawable/ic_settings_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 11 | 12 | -------------------------------------------------------------------------------- /darktheme/app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 12 | 13 | 20 | 21 | 22 | 23 | 29 | 30 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /darktheme/app/src/main/res/layout/activity_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 12 | 13 | 21 | 22 | 23 | 24 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /darktheme/app/src/main/res/layout/fragment_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 13 | 14 | 18 | 19 | 24 | 25 | 30 | 31 | 32 | 33 | 34 | 35 | 40 | 41 | 46 | 47 | 52 | 53 | 54 | 55 | 56 | 57 | 62 | 63 | 68 | 69 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | -------------------------------------------------------------------------------- /darktheme/app/src/main/res/menu/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | 10 | -------------------------------------------------------------------------------- /darktheme/app/src/main/res/mipmap/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /darktheme/app/src/main/res/mipmap/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /darktheme/app/src/main/res/values-night/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 47 | 91 | 47 | 91 |