From 1e20d3db84bae0950206eec7f8c833d51cf73605 Mon Sep 17 00:00:00 2001 From: michaelbel Date: Fri, 25 Nov 2022 16:12:21 +0300 Subject: [PATCH 01/36] Update workflow --- .github/workflows/release.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 96541c345..e4c041d51 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -17,4 +17,5 @@ jobs: - uses: actions/checkout@v2 - uses: ncipollo/release-action@v1 with: - artifacts: "release.tar.gz,foo/*.txt" \ No newline at end of file + artifacts: "release.tar.gz,foo/*.txt" + generateReleaseNotes: true \ No newline at end of file From 4bf5c08a95be7b1bd2ab765b5546dc92a66aca3d Mon Sep 17 00:00:00 2001 From: michaelbel Date: Fri, 25 Nov 2022 16:19:30 +0300 Subject: [PATCH 02/36] Update workflow --- .github/workflows/release.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e4c041d51..161b06a99 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -18,4 +18,5 @@ jobs: - uses: ncipollo/release-action@v1 with: artifacts: "release.tar.gz,foo/*.txt" + artifactErrorsFailBuild: false generateReleaseNotes: true \ No newline at end of file From cd342fc4316751ed3781c0463024ab2e2ee0abcf Mon Sep 17 00:00:00 2001 From: michaelbel Date: Fri, 25 Nov 2022 16:21:58 +0300 Subject: [PATCH 03/36] Update project --- readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.md b/readme.md index 3a8e44d7a..0b9019978 100644 --- a/readme.md +++ b/readme.md @@ -80,6 +80,7 @@ TMDB_API_KEY=your_own_tmdb_api_key - [x] [App Shortcuts](https://d.android.com/develop/ui/views/launch/shortcuts) - [x] [Dependabot](https://github.com/dependabot) - [x] Github Actions CI/CD +- [x] Github Releases - [x] [Lint](https://d.android.com/studio/write/lint) - [x] [Detekt](https://github.com/detekt/detekt) 1.22.0 - [x] [Spotless](https://github.com/diffplug/spotless) 6.11.0 @@ -102,7 +103,6 @@ TMDB_API_KEY=your_own_tmdb_api_key - [ ] Tablet and large screen support - [ ] Support RTL (in progress) - [ ] [Support Display Cutouts](https://d.android.com/develop/ui/views/layout/display-cutout) -- [ ] Create Github Releases (in progress) - [ ] Upload Bundle to Google Play Console - [ ] Baseline Profiles - [ ] ExoPlayer From 5609b32e6031817c7aa0adcb2263b7ed584dafde Mon Sep 17 00:00:00 2001 From: michaelbel Date: Fri, 25 Nov 2022 16:41:34 +0300 Subject: [PATCH 04/36] Update project --- .../main/kotlin/org/michaelbel/movies/MainViewModel.kt | 4 +--- .../movies/domain/interactor/SettingsInteractor.kt | 3 ++- .../domain/interactor/impl/SettingsInteractorImpl.kt | 3 ++- .../movies/domain/repository/SettingsRepository.kt | 3 ++- .../domain/repository/impl/SettingsRepositoryImpl.kt | 10 ++++++---- .../movies/settings/ui/SettingsScreenContent.kt | 5 +++-- 6 files changed, 16 insertions(+), 12 deletions(-) diff --git a/app/src/main/kotlin/org/michaelbel/movies/MainViewModel.kt b/app/src/main/kotlin/org/michaelbel/movies/MainViewModel.kt index 4025d12d6..c68765f2d 100644 --- a/app/src/main/kotlin/org/michaelbel/movies/MainViewModel.kt +++ b/app/src/main/kotlin/org/michaelbel/movies/MainViewModel.kt @@ -9,7 +9,6 @@ import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch import org.michaelbel.movies.analytics.MoviesAnalytics @@ -36,8 +35,7 @@ internal class MainViewModel @Inject constructor( initialValue = false ) - val layoutDirection: StateFlow = settingsInteractor.rtlEnabled - .map { enabled -> if (enabled) LayoutDirection.Rtl else LayoutDirection.Ltr } + val layoutDirection: StateFlow = settingsInteractor.layoutDirection .stateIn( scope = viewModelScope, started = SharingStarted.Lazily, diff --git a/core/domain/src/main/kotlin/org/michaelbel/movies/domain/interactor/SettingsInteractor.kt b/core/domain/src/main/kotlin/org/michaelbel/movies/domain/interactor/SettingsInteractor.kt index 6d425af58..7cf6f4289 100644 --- a/core/domain/src/main/kotlin/org/michaelbel/movies/domain/interactor/SettingsInteractor.kt +++ b/core/domain/src/main/kotlin/org/michaelbel/movies/domain/interactor/SettingsInteractor.kt @@ -1,5 +1,6 @@ package org.michaelbel.movies.domain.interactor +import androidx.compose.ui.unit.LayoutDirection import kotlinx.coroutines.flow.Flow import org.michaelbel.movies.ui.theme.model.AppTheme @@ -9,7 +10,7 @@ interface SettingsInteractor { val dynamicColors: Flow - val rtlEnabled: Flow + val layoutDirection: Flow val areNotificationsEnabled: Boolean diff --git a/core/domain/src/main/kotlin/org/michaelbel/movies/domain/interactor/impl/SettingsInteractorImpl.kt b/core/domain/src/main/kotlin/org/michaelbel/movies/domain/interactor/impl/SettingsInteractorImpl.kt index 61c719d1e..016dee17e 100644 --- a/core/domain/src/main/kotlin/org/michaelbel/movies/domain/interactor/impl/SettingsInteractorImpl.kt +++ b/core/domain/src/main/kotlin/org/michaelbel/movies/domain/interactor/impl/SettingsInteractorImpl.kt @@ -2,6 +2,7 @@ package org.michaelbel.movies.domain.interactor.impl import android.app.NotificationManager import android.os.Build +import androidx.compose.ui.unit.LayoutDirection import com.google.firebase.remoteconfig.FirebaseRemoteConfig import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher @@ -34,7 +35,7 @@ internal class SettingsInteractorImpl @Inject constructor( override val dynamicColors: Flow = settingsRepository.dynamicColors - override val rtlEnabled: Flow = settingsRepository.rtlEnabled + override val layoutDirection: Flow = settingsRepository.layoutDirection override val areNotificationsEnabled: Boolean = if (Build.VERSION.SDK_INT >= 24) { notificationManager.areNotificationsEnabled() diff --git a/core/domain/src/main/kotlin/org/michaelbel/movies/domain/repository/SettingsRepository.kt b/core/domain/src/main/kotlin/org/michaelbel/movies/domain/repository/SettingsRepository.kt index 54a69460b..a72853124 100644 --- a/core/domain/src/main/kotlin/org/michaelbel/movies/domain/repository/SettingsRepository.kt +++ b/core/domain/src/main/kotlin/org/michaelbel/movies/domain/repository/SettingsRepository.kt @@ -1,5 +1,6 @@ package org.michaelbel.movies.domain.repository +import androidx.compose.ui.unit.LayoutDirection import kotlinx.coroutines.flow.Flow import org.michaelbel.movies.ui.theme.model.AppTheme @@ -9,7 +10,7 @@ interface SettingsRepository { val dynamicColors: Flow - val rtlEnabled: Flow + val layoutDirection: Flow suspend fun selectTheme(theme: AppTheme) diff --git a/core/domain/src/main/kotlin/org/michaelbel/movies/domain/repository/impl/SettingsRepositoryImpl.kt b/core/domain/src/main/kotlin/org/michaelbel/movies/domain/repository/impl/SettingsRepositoryImpl.kt index 8fa933003..de84422ba 100644 --- a/core/domain/src/main/kotlin/org/michaelbel/movies/domain/repository/impl/SettingsRepositoryImpl.kt +++ b/core/domain/src/main/kotlin/org/michaelbel/movies/domain/repository/impl/SettingsRepositoryImpl.kt @@ -1,5 +1,6 @@ package org.michaelbel.movies.domain.repository.impl +import androidx.compose.ui.unit.LayoutDirection import androidx.datastore.core.DataStore import androidx.datastore.preferences.core.Preferences import androidx.datastore.preferences.core.edit @@ -19,16 +20,17 @@ internal class SettingsRepositoryImpl @Inject constructor( private val dataStore: DataStore ): SettingsRepository { - override val currentTheme: Flow = dataStore.data.map { preferences: Preferences -> + override val currentTheme: Flow = dataStore.data.map { preferences -> return@map AppTheme.transform(preferences[PREFERENCE_THEME_KEY].orDefaultTheme()) } - override val dynamicColors: Flow = dataStore.data.map { preferences: Preferences -> + override val dynamicColors: Flow = dataStore.data.map { preferences -> return@map preferences[PREFERENCE_DYNAMIC_COLORS_KEY].orDefaultDynamicColorsEnabled() } - override val rtlEnabled: Flow = dataStore.data.map { preferences: Preferences -> - return@map preferences[PREFERENCE_RTL_ENABLED_KEY].orDefaultRtlEnabled() + override val layoutDirection: Flow = dataStore.data.map { preferences -> + val isRtl: Boolean = preferences[PREFERENCE_RTL_ENABLED_KEY].orDefaultRtlEnabled() + return@map if (isRtl) LayoutDirection.Rtl else LayoutDirection.Ltr } override suspend fun selectTheme(theme: AppTheme) { diff --git a/feature/settings/src/main/kotlin/org/michaelbel/movies/settings/ui/SettingsScreenContent.kt b/feature/settings/src/main/kotlin/org/michaelbel/movies/settings/ui/SettingsScreenContent.kt index b78d2284f..e62df6796 100644 --- a/feature/settings/src/main/kotlin/org/michaelbel/movies/settings/ui/SettingsScreenContent.kt +++ b/feature/settings/src/main/kotlin/org/michaelbel/movies/settings/ui/SettingsScreenContent.kt @@ -34,6 +34,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalLifecycleOwner import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.LayoutDirection import androidx.compose.ui.unit.dp import androidx.core.net.toUri import androidx.hilt.navigation.compose.hiltViewModel @@ -62,7 +63,7 @@ internal fun SettingsRoute( val currentLanguage: AppLanguage = AppLanguage.transform(stringResource(UiR.string.language_code)) val currentTheme: AppTheme by viewModel.currentTheme.collectAsStateWithLifecycle() val dynamicColors: Boolean by viewModel.dynamicColors.collectAsStateWithLifecycle() - val rtlEnabled: Boolean by viewModel.rtlEnabled.collectAsStateWithLifecycle() + val layoutDirection: LayoutDirection by viewModel.layoutDirection.collectAsStateWithLifecycle() val isPlayServicesAvailable: Boolean by viewModel.isPlayServicesAvailable.collectAsStateWithLifecycle() val isAppFromGooglePlay: Boolean by viewModel.isAppFromGooglePlay.collectAsStateWithLifecycle() val areNotificationsEnabled: Boolean by viewModel.areNotificationsEnabled.collectAsStateWithLifecycle() @@ -82,7 +83,7 @@ internal fun SettingsRoute( isDynamicColorsFeatureEnabled = viewModel.isDynamicColorsFeatureEnabled, dynamicColors = dynamicColors, onSetDynamicColors = viewModel::setDynamicColors, - isRtlEnabled = rtlEnabled, + isRtlEnabled = layoutDirection == LayoutDirection.Rtl, onEnableRtlChanged = viewModel::setRtlEnabled, isPostNotificationsFeatureEnabled = viewModel.isPostNotificationsFeatureEnabled, areNotificationsEnabled = areNotificationsEnabled, From 9525b674b3e0a38876b1d106f399214f9b9a352e Mon Sep 17 00:00:00 2001 From: michaelbel Date: Fri, 25 Nov 2022 16:43:16 +0300 Subject: [PATCH 05/36] Update project --- .../org/michaelbel/movies/settings/SettingsViewModel.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/feature/settings/src/main/kotlin/org/michaelbel/movies/settings/SettingsViewModel.kt b/feature/settings/src/main/kotlin/org/michaelbel/movies/settings/SettingsViewModel.kt index 74e07d1ad..e8b66eded 100644 --- a/feature/settings/src/main/kotlin/org/michaelbel/movies/settings/SettingsViewModel.kt +++ b/feature/settings/src/main/kotlin/org/michaelbel/movies/settings/SettingsViewModel.kt @@ -1,6 +1,7 @@ package org.michaelbel.movies.settings import android.os.Build +import androidx.compose.ui.unit.LayoutDirection import androidx.lifecycle.DefaultLifecycleObserver import androidx.lifecycle.LifecycleOwner import dagger.hilt.android.lifecycle.HiltViewModel @@ -54,11 +55,11 @@ internal class SettingsViewModel @Inject constructor( initialValue = false ) - val rtlEnabled: StateFlow = settingsInteractor.rtlEnabled + val layoutDirection: StateFlow = settingsInteractor.layoutDirection .stateIn( scope = this, started = SharingStarted.Lazily, - initialValue = false + initialValue = LayoutDirection.Ltr ) val isPlayServicesAvailable: StateFlow = settingsInteractor.isPlayServicesAvailable From 1afc73b48a900beef23745ba4b2b6cac236ff669 Mon Sep 17 00:00:00 2001 From: michaelbel Date: Fri, 25 Nov 2022 20:14:36 +0300 Subject: [PATCH 06/36] Update workflow --- .github/workflows/check_pr.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.github/workflows/check_pr.yml b/.github/workflows/check_pr.yml index 6f329a54a..c7776b783 100644 --- a/.github/workflows/check_pr.yml +++ b/.github/workflows/check_pr.yml @@ -1,9 +1,20 @@ name: Check PR on: + push: + branches: + '**' + paths-ignore: + - '**.md' + - '.idea/**' + - '.github/**' pull_request: branches: '**' + paths-ignore: + - '**.md' + - '.idea/**' + - '.github/**' workflow_dispatch: concurrency: From 210db92e103564e8f669a4ce4eede301767ac1d4 Mon Sep 17 00:00:00 2001 From: michaelbel Date: Fri, 25 Nov 2022 20:28:10 +0300 Subject: [PATCH 07/36] Update project --- app/build.gradle.kts | 16 ++++++---------- buildSrc/src/main/kotlin/App.kt | 14 -------------- buildSrc/src/main/kotlin/ktx/Project.kt | 8 ++++---- .../AndroidApplicationConventionPlugin.kt | 8 +++++--- .../plugins/AndroidLibraryConventionPlugin.kt | 7 +++++-- gradle/libs.versions.toml | 4 ++++ 6 files changed, 24 insertions(+), 33 deletions(-) delete mode 100644 buildSrc/src/main/kotlin/App.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 82204aa80..a9bb29614 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -2,10 +2,6 @@ import com.android.build.gradle.internal.cxx.configure.gradleLocalProperties import java.io.FileInputStream import org.apache.commons.io.output.ByteArrayOutputStream import org.jetbrains.kotlin.konan.properties.Properties -import org.michaelbel.moviemade.App -import org.michaelbel.moviemade.App.ApplicationId -import org.michaelbel.moviemade.App.BuildTools -import org.michaelbel.moviemade.App.VersionName plugins { id("movies-android-application") @@ -17,7 +13,7 @@ plugins { id("com.google.firebase.crashlytics") } -val gitVersion: Int by lazy { +val gitCommitsCount: Int by lazy { val stdout = ByteArrayOutputStream() rootProject.exec { commandLine("git", "rev-list", "--count", "HEAD") @@ -54,13 +50,13 @@ afterEvaluate { android { namespace = "org.michaelbel.moviemade" - buildToolsVersion = BuildTools + buildToolsVersion = libs.versions.build.tools.get() defaultConfig { - applicationId = ApplicationId - versionCode = gitVersion - versionName = VersionName - testInstrumentationRunner = App.TestInstrumentationRunner + applicationId = "org.michaelbel.moviemade" + versionCode = gitCommitsCount + versionName = "1.4.1" + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true resourceConfigurations.addAll(listOf("en", "ru")) diff --git a/buildSrc/src/main/kotlin/App.kt b/buildSrc/src/main/kotlin/App.kt deleted file mode 100644 index 38df499b7..000000000 --- a/buildSrc/src/main/kotlin/App.kt +++ /dev/null @@ -1,14 +0,0 @@ -package org.michaelbel.moviemade - -object App { - const val VersionName = "1.4.1" - - internal const val MinSdk = 21 - internal const val TargetSdk = 33 - internal const val CompileSdk = 33 - const val BuildTools = "33.0.0" - - const val ApplicationId = "org.michaelbel.moviemade" - - const val TestInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" -} \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/ktx/Project.kt b/buildSrc/src/main/kotlin/ktx/Project.kt index c3dcde0da..bd47dd65d 100644 --- a/buildSrc/src/main/kotlin/ktx/Project.kt +++ b/buildSrc/src/main/kotlin/ktx/Project.kt @@ -10,8 +10,6 @@ import org.gradle.api.plugins.ExtensionAware import org.gradle.kotlin.dsl.getByType import org.gradle.kotlin.dsl.provideDelegate import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptions -import org.michaelbel.moviemade.App.CompileSdk -import org.michaelbel.moviemade.App.MinSdk /** Configure Compose-specific options. */ internal fun Project.configureAndroidCompose( @@ -38,11 +36,13 @@ internal fun Project.configureAndroidCompose( internal fun Project.configureKotlinAndroid( commonExtension: CommonExtension<*, *, *, *> ) { + val libs: VersionCatalog = extensions.getByType().named("libs") + commonExtension.apply { - compileSdk = CompileSdk + compileSdk = libs.findVersion("compile-sdk").get().requiredVersion.toInt() defaultConfig { - minSdk = MinSdk + minSdk = libs.findVersion("min-sdk").get().requiredVersion.toInt() } compileOptions { diff --git a/buildSrc/src/main/kotlin/plugins/AndroidApplicationConventionPlugin.kt b/buildSrc/src/main/kotlin/plugins/AndroidApplicationConventionPlugin.kt index 5a8af9686..0daa60de3 100644 --- a/buildSrc/src/main/kotlin/plugins/AndroidApplicationConventionPlugin.kt +++ b/buildSrc/src/main/kotlin/plugins/AndroidApplicationConventionPlugin.kt @@ -3,8 +3,10 @@ package org.michaelbel.moviemade.plugins import com.android.build.api.dsl.ApplicationExtension import org.gradle.api.Plugin import org.gradle.api.Project +import org.gradle.api.artifacts.VersionCatalog +import org.gradle.api.artifacts.VersionCatalogsExtension import org.gradle.kotlin.dsl.configure -import org.michaelbel.moviemade.App.TargetSdk +import org.gradle.kotlin.dsl.getByType import org.michaelbel.moviemade.ktx.configureKotlinAndroid import org.michaelbel.moviemade.ktx.configureLintCheck @@ -16,9 +18,9 @@ internal class AndroidApplicationConventionPlugin: Plugin { apply("com.android.application") apply("org.jetbrains.kotlin.android") } - + val libs: VersionCatalog = extensions.getByType().named("libs") extensions.configure { - defaultConfig.targetSdk = TargetSdk + defaultConfig.targetSdk = libs.findVersion("target-sdk").get().requiredVersion.toInt() configureKotlinAndroid(this) configureLintCheck(this) } diff --git a/buildSrc/src/main/kotlin/plugins/AndroidLibraryConventionPlugin.kt b/buildSrc/src/main/kotlin/plugins/AndroidLibraryConventionPlugin.kt index 69009a03d..ea8090591 100644 --- a/buildSrc/src/main/kotlin/plugins/AndroidLibraryConventionPlugin.kt +++ b/buildSrc/src/main/kotlin/plugins/AndroidLibraryConventionPlugin.kt @@ -3,8 +3,10 @@ package org.michaelbel.moviemade.plugins import com.android.build.gradle.LibraryExtension import org.gradle.api.Plugin import org.gradle.api.Project +import org.gradle.api.artifacts.VersionCatalog +import org.gradle.api.artifacts.VersionCatalogsExtension import org.gradle.kotlin.dsl.configure -import org.michaelbel.moviemade.App.TargetSdk +import org.gradle.kotlin.dsl.getByType import org.michaelbel.moviemade.ktx.configureKotlinAndroid import org.michaelbel.moviemade.ktx.configureLintCheck @@ -16,8 +18,9 @@ internal class AndroidLibraryConventionPlugin: Plugin { apply("com.android.library") apply("org.jetbrains.kotlin.android") } + val libs: VersionCatalog = extensions.getByType().named("libs") extensions.configure { - defaultConfig.targetSdk = TargetSdk + defaultConfig.targetSdk = libs.findVersion("target-sdk").get().requiredVersion.toInt() configureKotlinAndroid(this) configureLintCheck(this) } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index ac86c03e1..f365f33ac 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,6 +2,10 @@ # https://d.android.com/jetpack/androidx/releases/compose-kotlin [versions] +min-sdk = "21" +compile-sdk = "33" +target-sdk = "33" +build-tools = "33.0.0" gradle = "7.3.1" kotlin = "1.7.21" kotlin-coroutines = "1.6.4" From a1cf232cd5d184fc5c9ccff685a645079b834d33 Mon Sep 17 00:00:00 2001 From: michaelbel Date: Sun, 27 Nov 2022 10:45:36 +0300 Subject: [PATCH 08/36] SplashScreen API --- .../org/michaelbel/movies/MainActivity.kt | 3 ++ app/src/main/res/values-night-v23/themes.xml | 2 +- app/src/main/res/values-night-v31/themes.xml | 4 +- app/src/main/res/values-night/themes.xml | 7 +-- app/src/main/res/values-v31/themes.xml | 4 +- app/src/main/res/values/themes.xml | 5 +- .../res/drawable/ic_launcher_monochrome.xml | 0 .../ic_splash_screen_animated_icon.xml | 47 +++++++++++++++++++ .../ic_splash_screen_branding_image.xml | 10 ++++ readme.md | 2 +- 10 files changed, 73 insertions(+), 11 deletions(-) rename {app => core/ui}/src/main/res/drawable/ic_launcher_monochrome.xml (100%) create mode 100644 core/ui/src/main/res/drawable/ic_splash_screen_animated_icon.xml create mode 100644 core/ui/src/main/res/drawable/ic_splash_screen_branding_image.xml diff --git a/app/src/main/kotlin/org/michaelbel/movies/MainActivity.kt b/app/src/main/kotlin/org/michaelbel/movies/MainActivity.kt index 5a33765c5..e9afd7526 100644 --- a/app/src/main/kotlin/org/michaelbel/movies/MainActivity.kt +++ b/app/src/main/kotlin/org/michaelbel/movies/MainActivity.kt @@ -29,7 +29,10 @@ internal class MainActivity: AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { installSplashScreen() super.onCreate(savedInstanceState) + + /** Configure edge-to-edge display. */ WindowCompat.setDecorFitsSystemWindows(window, false) + installShortcuts() setContent { val currentTheme: AppTheme by viewModel.currentTheme.collectAsStateWithLifecycle() diff --git a/app/src/main/res/values-night-v23/themes.xml b/app/src/main/res/values-night-v23/themes.xml index 74c2a54b6..eb97cc903 100644 --- a/app/src/main/res/values-night-v23/themes.xml +++ b/app/src/main/res/values-night-v23/themes.xml @@ -18,6 +18,6 @@ false - - - -