From 4aec53fb8bd3c5130422a92932cbc7c5638be855 Mon Sep 17 00:00:00 2001 From: Oguzhan Dogdu <73955284+oguzsout@users.noreply.github.com> Date: Wed, 25 Sep 2024 18:22:58 +0300 Subject: [PATCH] Date picker and time picker color by theme (#3558) * Fix legacy and m3 theme arrangement for pickers * Add new color for pickers with the theme * Fix condition of theme value * Fix theme wrapper * Fix issue of edge to edge * Fix scrolling down color line --- .../main/java/com/ivy/wallet/RootActivity.kt | 55 ++++++++++++------- .../ivy/design/system/IvyMaterial3Theme.kt | 3 +- .../ivy/ui/time/impl/AndroidDateTimePicker.kt | 47 +++++++++++----- .../java/com/ivy/design/l0_system/IvyTheme.kt | 3 +- 4 files changed, 71 insertions(+), 37 deletions(-) diff --git a/app/src/main/java/com/ivy/wallet/RootActivity.kt b/app/src/main/java/com/ivy/wallet/RootActivity.kt index 4399d48f3..e67d5f470 100644 --- a/app/src/main/java/com/ivy/wallet/RootActivity.kt +++ b/app/src/main/java/com/ivy/wallet/RootActivity.kt @@ -31,9 +31,12 @@ import com.google.android.material.timepicker.MaterialTimePicker import com.google.android.material.timepicker.TimeFormat import com.google.android.play.core.review.ReviewManagerFactory import com.ivy.IvyNavGraph +import com.ivy.base.legacy.Theme import com.ivy.base.time.TimeConverter import com.ivy.base.time.TimeProvider +import com.ivy.design.api.IvyDesign import com.ivy.design.api.IvyUI +import com.ivy.design.system.IvyMaterial3Theme import com.ivy.domain.RootScreen import com.ivy.home.customerjourney.CustomerJourneyCardsProvider import com.ivy.legacy.Constants @@ -88,26 +91,11 @@ class RootActivity : AppCompatActivity(), RootScreen { private val viewModel: RootViewModel by viewModels() - @OptIn( - ExperimentalAnimationApi::class, - ExperimentalFoundationApi::class - ) + @OptIn(ExperimentalFoundationApi::class, ExperimentalAnimationApi::class) override fun onCreate(savedInstanceState: Bundle?) { enableEdgeToEdge() super.onCreate(savedInstanceState) - - setupActivityForResultLaunchers() - - // Make the app drawing area fullscreen (draw behind status and nav bars) - WindowCompat.setDecorFitsSystemWindows(window, false) - - setupDatePicker() - setupTimePicker() - - AddTransactionWidget.updateBroadcast(this) - AddTransactionWidgetCompact.updateBroadcast(this) - WalletBalanceWidgetReceiver.updateBroadcast(this) - + setupApp() setContent { val viewModel: RootViewModel = viewModel() val isSystemInDarkTheme = isSystemInDarkTheme() @@ -118,10 +106,8 @@ class RootActivity : AppCompatActivity(), RootScreen { val appLocked by viewModel.appLocked.collectAsState() when (appLocked) { - null -> { - // display nothing + null -> { // display nothing } - true -> { IvyUI( design = appDesign(ivyContext), @@ -157,10 +143,28 @@ class RootActivity : AppCompatActivity(), RootScreen { } } - dateTimePicker.Content() + IvyMaterial3Theme( + dark = isDarkThemeEnabled( + ivyDesign = appDesign(ivyContext), + systemDarkTheme = isSystemInDarkTheme + ), + isTrueBlack = appDesign(ivyContext).context().theme == Theme.AMOLED_DARK + ) { + dateTimePicker.Content() + } } } + private fun setupApp() { + setupActivityForResultLaunchers() + WindowCompat.setDecorFitsSystemWindows(window, false) + setupDatePicker() + setupTimePicker() + AddTransactionWidget.updateBroadcast(this) + AddTransactionWidgetCompact.updateBroadcast(this) + WalletBalanceWidgetReceiver.updateBroadcast(this) + } + private companion object { private const val MILLISECONDS_IN_DAY = 24 * 60 * 60 * 1000 } @@ -227,6 +231,15 @@ class RootActivity : AppCompatActivity(), RootScreen { } } + private fun isDarkThemeEnabled(ivyDesign: IvyDesign, systemDarkTheme: Boolean): Boolean { + return when (ivyDesign.context().theme) { + Theme.LIGHT -> false + Theme.DARK -> true + Theme.AMOLED_DARK -> true + else -> systemDarkTheme + } + } + private fun setupActivityForResultLaunchers() { createFileLauncher() diff --git a/shared/ui/core/src/main/java/com/ivy/design/system/IvyMaterial3Theme.kt b/shared/ui/core/src/main/java/com/ivy/design/system/IvyMaterial3Theme.kt index 799b45657..f37a59b0e 100644 --- a/shared/ui/core/src/main/java/com/ivy/design/system/IvyMaterial3Theme.kt +++ b/shared/ui/core/src/main/java/com/ivy/design/system/IvyMaterial3Theme.kt @@ -1,5 +1,6 @@ package com.ivy.design.system +import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.material3.ColorScheme import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable @@ -7,8 +8,8 @@ import com.ivy.design.system.colors.IvyColors @Composable fun IvyMaterial3Theme( - dark: Boolean, isTrueBlack: Boolean, + dark: Boolean = isSystemInDarkTheme(), content: @Composable () -> Unit ) { MaterialTheme( diff --git a/shared/ui/core/src/main/java/com/ivy/ui/time/impl/AndroidDateTimePicker.kt b/shared/ui/core/src/main/java/com/ivy/ui/time/impl/AndroidDateTimePicker.kt index 126bf6bde..3f8a1589e 100644 --- a/shared/ui/core/src/main/java/com/ivy/ui/time/impl/AndroidDateTimePicker.kt +++ b/shared/ui/core/src/main/java/com/ivy/ui/time/impl/AndroidDateTimePicker.kt @@ -3,10 +3,13 @@ package com.ivy.ui.time.impl import androidx.compose.foundation.layout.padding import androidx.compose.material3.Button import androidx.compose.material3.DatePicker +import androidx.compose.material3.DatePickerDefaults import androidx.compose.material3.DatePickerDialog import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.TimePicker +import androidx.compose.material3.TimePickerDefaults import androidx.compose.material3.rememberDatePickerState import androidx.compose.material3.rememberTimePickerState import androidx.compose.runtime.Composable @@ -53,19 +56,28 @@ class AndroidDateTimePicker @Inject constructor( modifier = modifier, onDismissRequest = { datePickerViewState = null }, confirmButton = { - ConfirmButton( - onClick = { - datePickerViewState = null - pickerState.selectedDateMillis - ?.let(Instant::ofEpochMilli) - ?.let { - with(timeConverter) { it.toLocalDate() } - }?.let(viewState.onDatePicked) - } - ) - } + ConfirmButton(onClick = { + datePickerViewState = null + pickerState.selectedDateMillis?.let(Instant::ofEpochMilli) + ?.let { + with(timeConverter) { it.toLocalDate() } + }?.let(viewState.onDatePicked) + }) + }, + colors = DatePickerDefaults.colors( + containerColor = MaterialTheme.colorScheme.surfaceVariant, + ) ) { - DatePicker(state = pickerState) + DatePicker( + state = pickerState, + colors = DatePickerDefaults.colors( + titleContentColor = MaterialTheme.colorScheme.onBackground, + selectedDayContainerColor = MaterialTheme.colorScheme.primary, + todayContentColor = MaterialTheme.colorScheme.onBackground, + todayDateBorderColor = MaterialTheme.colorScheme.onBackground, + dayContentColor = MaterialTheme.colorScheme.onBackground + ) + ) } } @@ -92,11 +104,18 @@ class AndroidDateTimePicker @Inject constructor( ) } ) - } + }, + colors = DatePickerDefaults.colors( + containerColor = MaterialTheme.colorScheme.surfaceVariant, + ) ) { TimePicker( modifier = Modifier.padding(16.dp), - state = pickerState + state = pickerState, + colors = TimePickerDefaults.colors( + selectorColor = MaterialTheme.colorScheme.primary, + timeSelectorSelectedContainerColor = MaterialTheme.colorScheme.primary + ) ) } } diff --git a/temp/old-design/src/main/java/com/ivy/design/l0_system/IvyTheme.kt b/temp/old-design/src/main/java/com/ivy/design/l0_system/IvyTheme.kt index bd392652d..adea098df 100644 --- a/temp/old-design/src/main/java/com/ivy/design/l0_system/IvyTheme.kt +++ b/temp/old-design/src/main/java/com/ivy/design/l0_system/IvyTheme.kt @@ -47,9 +47,10 @@ object UI { fun IvyTheme( theme: Theme, design: IvyDesign, + isDarkTheme: Boolean = isSystemInDarkTheme(), content: @Composable () -> Unit ) { - val colors = design.colors(theme, isSystemInDarkTheme()) + val colors = design.colors(theme, isDarkTheme) val typography = design.typography() val shapes = design.shapes()