Skip to content

Commit

Permalink
Add Material You setting switch
Browse files Browse the repository at this point in the history
  • Loading branch information
David Ly committed Feb 16, 2023
1 parent 316913b commit 8710558
Show file tree
Hide file tree
Showing 6 changed files with 58 additions and 6 deletions.
6 changes: 4 additions & 2 deletions app/src/main/java/ly/david/mbjc/ui/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@ import ly.david.data.navigation.getTopLevelRoute
import ly.david.mbjc.ui.navigation.NavigationDrawer
import ly.david.mbjc.ui.navigation.NavigationGraph
import ly.david.mbjc.ui.settings.AppPreferences
import ly.david.mbjc.ui.settings.shouldUseDarkColors
import ly.david.mbjc.ui.settings.useDarkTheme
import ly.david.mbjc.ui.settings.useMaterialYou
import ly.david.mbjc.ui.theme.BaseTheme

@AndroidEntryPoint
Expand All @@ -39,7 +40,8 @@ internal class MainActivity : ComponentActivity() {

BaseTheme(
context = this,
darkTheme = appPreferences.shouldUseDarkColors()
darkTheme = appPreferences.useDarkTheme(),
materialYou = appPreferences.useMaterialYou()
) {
MainApp(navController)
}
Expand Down
22 changes: 22 additions & 0 deletions app/src/main/java/ly/david/mbjc/ui/settings/AppPreferences.kt
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,20 @@ interface AppPreferences {
val theme: Flow<Theme>
fun setTheme(theme: Theme)

val useMaterialYou: Flow<Boolean>
fun setUseMaterialYou(use: Boolean)

val showMoreInfoInReleaseListItem: Flow<Boolean>
fun setShowMoreInfoInReleaseListItem(show: Boolean)

}

private const val THEME_KEY = "theme"
private val THEME_PREFERENCE = stringPreferencesKey(THEME_KEY)

private const val USE_MATERIAL_YOU_KEY = "useMaterialYou"
private val USE_MATERIAL_YOU_PREFERENCE = booleanPreferencesKey(USE_MATERIAL_YOU_KEY)

private const val SHOW_MORE_INFO_IN_RELEASE_LIST_ITEM_KEY = "showMoreInfoInReleaseListItem"
private val SHOW_MORE_INFO_IN_RELEASE_LIST_ITEM_PREFERENCE =
booleanPreferencesKey(SHOW_MORE_INFO_IN_RELEASE_LIST_ITEM_KEY)
Expand All @@ -57,6 +64,21 @@ class AppPreferencesImpl @Inject constructor(
}
}

override val useMaterialYou: Flow<Boolean>
get() = preferencesDataStore.data
.map {
it[USE_MATERIAL_YOU_PREFERENCE] ?: true
}
.distinctUntilChanged()

override fun setUseMaterialYou(use: Boolean) {
coroutineScope.launch {
preferencesDataStore.edit {
it[USE_MATERIAL_YOU_PREFERENCE] = use
}
}
}

override val showMoreInfoInReleaseListItem: Flow<Boolean>
get() = preferencesDataStore.data
.map {
Expand Down
12 changes: 12 additions & 0 deletions app/src/main/java/ly/david/mbjc/ui/settings/SettingsScaffold.kt
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ fun SettingsScaffold(
) { innerPadding ->

val theme by viewModel.appPreferences.theme.collectAsState(initial = AppPreferences.Theme.SYSTEM)
val useMaterialYou by viewModel.appPreferences.useMaterialYou.collectAsState(initial = true)
val showMoreInfoInReleaseListItem by viewModel.appPreferences.showMoreInfoInReleaseListItem.collectAsState(
initial = true
)
Expand All @@ -45,6 +46,8 @@ fun SettingsScaffold(
modifier = Modifier.padding(innerPadding),
theme = theme,
onThemeChange = { viewModel.appPreferences.setTheme(it) },
useMaterialYou = useMaterialYou,
onUseMaterialYouChange = { viewModel.appPreferences.setUseMaterialYou(it) },
showMoreInfoInReleaseListItem = showMoreInfoInReleaseListItem,
onShowMoreInfoInReleaseListItemChange = { viewModel.appPreferences.setShowMoreInfoInReleaseListItem(it) }
)
Expand All @@ -56,6 +59,8 @@ fun SettingsScreen(
modifier: Modifier = Modifier,
theme: AppPreferences.Theme,
onThemeChange: (AppPreferences.Theme) -> Unit = {},
useMaterialYou: Boolean,
onUseMaterialYouChange: (Boolean) -> Unit = {},
showMoreInfoInReleaseListItem: Boolean,
onShowMoreInfoInReleaseListItemChange: (Boolean) -> Unit = {}
) {
Expand All @@ -69,6 +74,12 @@ fun SettingsScreen(
onSelectChoiceIndex = { onThemeChange(AppPreferences.Theme.values()[it]) },
)

SettingSwitch(
header = "Use Material You",
checked = useMaterialYou,
onCheckedChange = onUseMaterialYouChange
)

SettingSwitch(
header = "Show more info in release list items",
checked = showMoreInfoInReleaseListItem,
Expand Down Expand Up @@ -99,6 +110,7 @@ private fun Preview() {
Surface {
SettingsScreen(
theme = AppPreferences.Theme.SYSTEM,
useMaterialYou = true,
showMoreInfoInReleaseListItem = true
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState

@Composable
fun AppPreferences.shouldUseDarkColors(): Boolean {
fun AppPreferences.useDarkTheme(): Boolean {
val themePreference = theme.collectAsState(initial = AppPreferences.Theme.SYSTEM)
return when (themePreference.value) {
AppPreferences.Theme.LIGHT -> false
Expand Down
10 changes: 10 additions & 0 deletions app/src/main/java/ly/david/mbjc/ui/settings/UseMaterialYou.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package ly.david.mbjc.ui.settings

import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState

@Composable
fun AppPreferences.useMaterialYou(): Boolean {
val useMaterialYou = useMaterialYou.collectAsState(initial = true)
return useMaterialYou.value
}
12 changes: 9 additions & 3 deletions app/src/main/java/ly/david/mbjc/ui/theme/Theme.kt
Original file line number Diff line number Diff line change
Expand Up @@ -39,11 +39,17 @@ private val LightColorScheme = lightColorScheme(
* Fallback to default color scheme for devices before Android 12.
*/
@Composable
internal fun BaseTheme(context: Context, darkTheme: Boolean = isSystemInDarkTheme(), content: @Composable () -> Unit) {
internal fun BaseTheme(
context: Context,
darkTheme: Boolean = isSystemInDarkTheme(),
materialYou: Boolean = true,
content: @Composable () -> Unit
) {
val isAndroid12 = Build.VERSION.SDK_INT >= Build.VERSION_CODES.S
val useMaterialYou = materialYou && isAndroid12
val colorSchemes = when {
isAndroid12 && darkTheme -> dynamicDarkColorScheme(context)
isAndroid12 -> dynamicLightColorScheme(context)
useMaterialYou && darkTheme -> dynamicDarkColorScheme(context)
useMaterialYou -> dynamicLightColorScheme(context)
darkTheme -> DarkColorScheme
else -> LightColorScheme
}
Expand Down

0 comments on commit 8710558

Please sign in to comment.