theme: fix OEM skin edgecases

This commit is contained in:
Rahul Patel
2026-05-07 16:05:17 +05:30
parent ec3427c785
commit 0d480f5d0d
7 changed files with 93 additions and 42 deletions

View File

@@ -5,6 +5,9 @@
package com.aurora.store.compose.theme package com.aurora.store.compose.theme
import android.app.Activity
import android.content.Context
import android.content.ContextWrapper
import android.os.Build import android.os.Build
import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.material3.MaterialExpressiveTheme import androidx.compose.material3.MaterialExpressiveTheme
@@ -14,8 +17,11 @@ import androidx.compose.material3.dynamicDarkColorScheme
import androidx.compose.material3.dynamicLightColorScheme import androidx.compose.material3.dynamicLightColorScheme
import androidx.compose.material3.lightColorScheme import androidx.compose.material3.lightColorScheme
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.SideEffect
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalView
import androidx.compose.ui.res.colorResource import androidx.compose.ui.res.colorResource
import androidx.core.view.WindowCompat
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.util.Preferences import com.aurora.store.util.Preferences
@@ -46,5 +52,41 @@ fun AuroraTheme(content: @Composable () -> Unit) {
else -> if (isSystemInDarkTheme()) darkScheme else lightScheme else -> if (isSystemInDarkTheme()) darkScheme else lightScheme
} }
val darkTheme = when (themeStyle) {
1 -> false
2 -> true
else -> isSystemInDarkTheme()
}
/**
* Side effect to update the system bars to be transparent and match the theme's light/dark mode.
* This is necessary on OEM devices that don't properly support dynamic theming and may have issues with light/dark status bar icons.
*/
val view = LocalView.current
if (!view.isInEditMode) {
SideEffect {
val activity = view.context.findActivity() ?: return@SideEffect
val window = activity.window
// Transparent system bars
window.statusBarColor = android.graphics.Color.TRANSPARENT
window.navigationBarColor = android.graphics.Color.TRANSPARENT
// Control icon colors explicitly
WindowCompat
.getInsetsController(window, view)
.apply {
isAppearanceLightStatusBars = !darkTheme
isAppearanceLightNavigationBars = !darkTheme
}
}
}
MaterialExpressiveTheme(colorScheme = colorScheme, content = content) MaterialExpressiveTheme(colorScheme = colorScheme, content = content)
} }
tailrec fun Context.findActivity(): Activity? = when (this) {
is Activity -> this
is ContextWrapper -> baseContext.findActivity()
else -> null
}

View File

@@ -38,6 +38,7 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.focus.focusRequester
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.res.dimensionResource
import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.painterResource
@@ -212,7 +213,10 @@ private fun ScreenContent(
) )
} }
}, },
actions = { if (!packages.isNullOrEmpty()) SetupMenu() } actions = { if (!packages.isNullOrEmpty()) SetupMenu() },
colors = SearchBarDefaults.appBarWithSearchColors(
appBarContainerColor = Color.Transparent
)
) )
} }

View File

@@ -533,7 +533,7 @@ private fun ScreenContentApp(
} }
ScrollHint( ScrollHint(
listState = listState, listState = listState,
bottomPadding = 5.dp, bottomPadding = 72.dp,
modifier = Modifier.align(Alignment.BottomCenter) modifier = Modifier.align(Alignment.BottomCenter)
) )
} }

View File

@@ -22,12 +22,14 @@ import androidx.compose.material3.Surface
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TextButton import androidx.compose.material3.TextButton
import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.material3.adaptive.WindowAdaptiveInfo import androidx.compose.material3.adaptive.WindowAdaptiveInfo
import androidx.compose.material3.adaptive.currentWindowAdaptiveInfo import androidx.compose.material3.adaptive.currentWindowAdaptiveInfo
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.res.dimensionResource
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
@@ -82,7 +84,11 @@ private fun ScreenContent(
modifier = Modifier.height(64.dp), modifier = Modifier.height(64.dp),
title = { title = {
PageIndicator(totalPages = pages.size, currentPage = pagerState.currentPage) PageIndicator(totalPages = pages.size, currentPage = pagerState.currentPage)
} },
colors = TopAppBarDefaults.topAppBarColors(
containerColor = Color.Transparent,
scrolledContainerColor = Color.Transparent
)
) )
}, },
bottomBar = { bottomBar = {

View File

@@ -6,10 +6,8 @@
package com.aurora.store.compose.ui.onboarding package com.aurora.store.compose.ui.onboarding
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
@@ -50,23 +48,21 @@ private fun PageContent(
permissions = permissions, permissions = permissions,
onPermissionCallback = onPermissionCallback, onPermissionCallback = onPermissionCallback,
header = { header = {
Surface(modifier = Modifier.fillMaxWidth()) { Column(
Column( modifier = Modifier.padding(dimensionResource(R.dimen.padding_medium))
modifier = Modifier.padding(dimensionResource(R.dimen.padding_medium)) ) {
) { Text(
Text( text = stringResource(R.string.onboarding_title_permissions),
text = stringResource(R.string.onboarding_title_permissions), style = MaterialTheme.typography.headlineLargeEmphasized,
style = MaterialTheme.typography.headlineLargeEmphasized, maxLines = 1,
maxLines = 1, overflow = TextOverflow.Ellipsis
overflow = TextOverflow.Ellipsis )
) Text(
Text( text = stringResource(R.string.onboarding_permission_select),
text = stringResource(R.string.onboarding_permission_select), style = MaterialTheme.typography.titleMedium,
style = MaterialTheme.typography.titleMedium, maxLines = 2,
maxLines = 2, overflow = TextOverflow.Ellipsis
overflow = TextOverflow.Ellipsis )
)
}
} }
} }
) )

View File

@@ -9,12 +9,10 @@ import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.items
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
@@ -101,23 +99,21 @@ private fun PageContent(onAboutAurora: () -> Unit = {}) {
verticalArrangement = Arrangement.spacedBy(dimensionResource(R.dimen.margin_xxsmall)) verticalArrangement = Arrangement.spacedBy(dimensionResource(R.dimen.margin_xxsmall))
) { ) {
stickyHeader { stickyHeader {
Surface(modifier = Modifier.fillMaxWidth()) { Column(
Column( modifier = Modifier.padding(dimensionResource(R.dimen.padding_medium))
modifier = Modifier.padding(dimensionResource(R.dimen.padding_medium)) ) {
) { Text(
Text( text = stringResource(R.string.onboarding_title_welcome),
text = stringResource(R.string.onboarding_title_welcome), style = MaterialTheme.typography.headlineLargeEmphasized,
style = MaterialTheme.typography.headlineLargeEmphasized, maxLines = 1,
maxLines = 1, overflow = TextOverflow.Ellipsis
overflow = TextOverflow.Ellipsis )
) Text(
Text( text = stringResource(R.string.onboarding_welcome_select),
text = stringResource(R.string.onboarding_welcome_select), style = MaterialTheme.typography.titleMedium,
style = MaterialTheme.typography.titleMedium, maxLines = 1,
maxLines = 1, overflow = TextOverflow.Ellipsis
overflow = TextOverflow.Ellipsis )
)
}
} }
} }

View File

@@ -51,6 +51,7 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.focus.focusRequester
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.platform.LocalSoftwareKeyboardController import androidx.compose.ui.platform.LocalSoftwareKeyboardController
import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.res.dimensionResource
@@ -210,7 +211,13 @@ private fun ScreenContent(
) )
} }
AppBarWithSearch(state = searchBarState, inputField = inputField) AppBarWithSearch(
state = searchBarState,
inputField = inputField,
colors = SearchBarDefaults.appBarWithSearchColors(
appBarContainerColor = Color.Transparent
)
)
ExpandedDockedSearchBar(state = searchBarState, inputField = inputField) { ExpandedDockedSearchBar(state = searchBarState, inputField = inputField) {
suggestions.forEach { suggestion -> suggestions.forEach { suggestion ->
SearchSuggestionListItem( SearchSuggestionListItem(