diff --git a/app/src/main/java/com/pixelized/biblib/ui/MainActivity.kt b/app/src/main/java/com/pixelized/biblib/ui/MainActivity.kt index c7eb9fa..7c1b17e 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/MainActivity.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/MainActivity.kt @@ -9,7 +9,6 @@ import androidx.compose.material.Surface import androidx.compose.runtime.Composable import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen import androidx.core.view.WindowCompat -import com.pixelized.biblib.ui.composable.SystemThemeColor import com.pixelized.biblib.ui.screen.launch.LauncherViewModel import com.pixelized.biblib.ui.theme.BibLibTheme import dagger.hilt.android.AndroidEntryPoint @@ -48,12 +47,10 @@ class MainActivity : ComponentActivity() { content: @Composable () -> Unit, ) { BibLibTheme { - SystemThemeColor { - Surface( - color = MaterialTheme.colors.surface, - content = content, - ) - } + Surface( + color = MaterialTheme.colors.surface, + content = content, + ) } } } \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/biblib/ui/composable/Handle.kt b/app/src/main/java/com/pixelized/biblib/ui/composable/Handle.kt new file mode 100644 index 0000000..a7046a4 --- /dev/null +++ b/app/src/main/java/com/pixelized/biblib/ui/composable/Handle.kt @@ -0,0 +1,29 @@ +package com.pixelized.biblib.ui.composable + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.Shape +import androidx.compose.ui.unit.Dp +import com.pixelized.biblib.utils.extention.bibLib + +@Composable +fun Handle( + modifier: Modifier = Modifier, + width: Dp = MaterialTheme.bibLib.dimen.handle.width, + thickness: Dp = MaterialTheme.bibLib.dimen.handle.thickness, + color: Color = MaterialTheme.bibLib.colors.handle, + shape: Shape = CircleShape +) = Box( + modifier = modifier + .size(width = width, height = thickness) + .background( + color = color, + shape = shape, + ) +) \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/biblib/ui/composable/SystemTheme.kt b/app/src/main/java/com/pixelized/biblib/ui/composable/SystemTheme.kt new file mode 100644 index 0000000..7cc9136 --- /dev/null +++ b/app/src/main/java/com/pixelized/biblib/ui/composable/SystemTheme.kt @@ -0,0 +1,139 @@ +package com.pixelized.biblib.ui.composable + +import android.annotation.SuppressLint +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.runtime.* +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.Dp +import com.google.accompanist.systemuicontroller.SystemUiController +import com.google.accompanist.systemuicontroller.rememberSystemUiController +import com.pixelized.biblib.utils.extention.navigationBarsHeight +import com.pixelized.biblib.utils.extention.statusBarsHeight + +val LocalStatusTheme = staticCompositionLocalOf { + error("LocalStatusTheme is not ready yet.") +} + +class StatusThemeController( + private val systemController: SystemUiController, + private val statusBackground: MutableState, + private var statusDarkIcons: Boolean, + private val navigationBackground: MutableState, + private var navigationDarkIcons: Boolean, +) { + init { + systemController.setStatusBarColor( + color = Color.Transparent, + darkIcons = statusDarkIcons, + ) + systemController.setNavigationBarColor( + color = Color.Transparent, + darkIcons = navigationDarkIcons, + navigationBarContrastEnforced = false, + ) + } + + fun updateStatusTheme( + statusBackground: Brush = this.statusBackground.value, + statusDarkIcons: Boolean = this.statusDarkIcons, + navigationBackground: Brush = this.navigationBackground.value, + navigationDarkIcons: Boolean = this.navigationDarkIcons, + ) { + if (this.statusDarkIcons != statusDarkIcons) { + this.statusDarkIcons = statusDarkIcons + systemController.setStatusBarColor( + color = Color.Transparent, + darkIcons = statusDarkIcons, + ) + } + if (this.statusBackground.value != statusBackground) { + this.statusBackground.value = statusBackground + } + if (navigationDarkIcons != this.navigationDarkIcons) { + this.navigationDarkIcons = navigationDarkIcons + systemController.setNavigationBarColor( + color = Color.Transparent, + darkIcons = navigationDarkIcons, + navigationBarContrastEnforced = false, + ) + } + if (this.navigationBackground.value != navigationBackground) { + this.statusBackground.value = navigationBackground + } + } +} + +@Composable +fun SystemTheme( + systemController: SystemUiController = rememberSystemUiController(), + statusBackground: Color, + statusDarkIcons: Boolean, + navigationBackground: Color, + navigationDarkIcons: Boolean, + content: @Composable () -> Unit, +) { + val statusBackgroundState = remember { + mutableStateOf( + Brush.verticalGradient( + colors = listOf(statusBackground, Color.Transparent) + ) + ) + } + val navigationBackgroundState = remember { + mutableStateOf( + Brush.verticalGradient( + colors = listOf(Color.Transparent, navigationBackground) + ) + ) + } + val statusController = remember(systemController) { + StatusThemeController( + systemController = systemController, + statusBackground = statusBackgroundState, + statusDarkIcons = statusDarkIcons, + navigationBackground = navigationBackgroundState, + navigationDarkIcons = navigationDarkIcons, + ) + } + CompositionLocalProvider( + LocalStatusTheme provides statusController, + ) { + Box( + modifier = Modifier.fillMaxSize(), + ) { + content() + + Overlay( + height = statusBarsHeight(), + brush = statusBackgroundState, + ) + + Overlay( + modifier = Modifier.align(Alignment.BottomStart), + height = navigationBarsHeight(), + brush = navigationBackgroundState, + ) + } + } +} + +@Composable +private fun Overlay( + modifier: Modifier = Modifier, + height: Dp, + brush: State, +) { + Box( + modifier = modifier + .height(height = height) + .fillMaxWidth() + .background(brush = brush.value) + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/biblib/ui/composable/SystemThemeColor.kt b/app/src/main/java/com/pixelized/biblib/ui/composable/SystemThemeColor.kt deleted file mode 100644 index 2bd59c7..0000000 --- a/app/src/main/java/com/pixelized/biblib/ui/composable/SystemThemeColor.kt +++ /dev/null @@ -1,36 +0,0 @@ -package com.pixelized.biblib.ui.composable - -import androidx.compose.runtime.Composable -import androidx.compose.runtime.CompositionLocalProvider -import androidx.compose.runtime.SideEffect -import androidx.compose.runtime.compositionLocalOf -import androidx.compose.ui.graphics.Color -import com.google.accompanist.systemuicontroller.SystemUiController -import com.google.accompanist.systemuicontroller.rememberSystemUiController -import com.pixelized.biblib.ui.theme.color.ShadowPalette - -val LocalSystemUiController = compositionLocalOf { error("") } - -@Composable -fun SystemThemeColor( - systemUiController: SystemUiController = rememberSystemUiController(), - color: Color = ShadowPalette.system, - statusDarkIcons: Boolean = false, - navigationDarkIcons: Boolean = false, - content: @Composable () -> Unit, -) { - CompositionLocalProvider(LocalSystemUiController provides systemUiController) { - SideEffect { - systemUiController.setStatusBarColor( - color = color, - darkIcons = statusDarkIcons, - ) - systemUiController.setNavigationBarColor( - color = color, - darkIcons = navigationDarkIcons, - navigationBarContrastEnforced = false, - ) - } - content() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/biblib/ui/composable/rememberColorElevation.kt b/app/src/main/java/com/pixelized/biblib/ui/composable/rememberColorElevation.kt new file mode 100644 index 0000000..0bdcc97 --- /dev/null +++ b/app/src/main/java/com/pixelized/biblib/ui/composable/rememberColorElevation.kt @@ -0,0 +1,18 @@ +package com.pixelized.biblib.ui.composable + +import androidx.compose.material.LocalAbsoluteElevation +import androidx.compose.material.LocalElevationOverlay +import androidx.compose.material.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.Dp + +@Composable +fun colorElevation( + base: Color = MaterialTheme.colors.surface, + elevation: Dp, +): Color { + val localElevation = LocalElevationOverlay.current + val absoluteElevation = LocalAbsoluteElevation.current + return localElevation?.apply(color = base, elevation = absoluteElevation + elevation) ?: base +} \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/biblib/ui/composable/scaffold/FilterBottomSheet.kt b/app/src/main/java/com/pixelized/biblib/ui/composable/scaffold/FilterBottomSheet.kt index c67f76e..0e156c2 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/composable/scaffold/FilterBottomSheet.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/composable/scaffold/FilterBottomSheet.kt @@ -2,18 +2,18 @@ package com.pixelized.biblib.ui.composable.scaffold import androidx.activity.compose.BackHandler import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.BoxWithConstraints +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height -import androidx.compose.material.ExperimentalMaterialApi -import androidx.compose.material.ModalBottomSheetLayout -import androidx.compose.material.ModalBottomSheetState +import androidx.compose.material.* import androidx.compose.material.ModalBottomSheetValue.Hidden -import androidx.compose.material.rememberModalBottomSheetState import androidx.compose.runtime.* import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusManager import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.Shape import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.platform.LocalSoftwareKeyboardController import androidx.compose.ui.unit.dp @@ -26,6 +26,8 @@ import com.pixelized.biblib.ui.screen.home.filter.viewModel.AuthorFilterViewMode import com.pixelized.biblib.ui.screen.home.filter.viewModel.GenreFilterViewModel import com.pixelized.biblib.ui.screen.home.filter.viewModel.LanguageFilterViewModel import com.pixelized.biblib.ui.screen.home.filter.viewModel.SeriesFilterViewModel +import com.pixelized.biblib.utils.extention.bibLib +import com.pixelized.biblib.utils.extention.statusBarsHeight import kotlinx.coroutines.CancellableContinuation import kotlinx.coroutines.suspendCancellableCoroutine import kotlinx.coroutines.sync.Mutex @@ -102,6 +104,7 @@ fun FilterBottomSheet( skipHalfExpanded = true, ), sheetState: FilterBottomSheetState = rememberFilterBottomSheetState(), + sheetShape: Shape = MaterialTheme.bibLib.shapes.filterSheet, content: @Composable () -> Unit, ) { CompositionLocalProvider( @@ -134,47 +137,53 @@ fun FilterBottomSheet( onBack = { currentBottomSheetData?.dismiss() }, ) - ModalBottomSheetLayout( - sheetState = bottomSheetState, - content = content, - scrimColor = Color.Transparent, - sheetContent = { - val viewModel: IFilterViewModel? = when (sheetState.type) { - FilterType.Author -> hiltViewModel() - FilterType.Series -> hiltViewModel() - FilterType.Genre -> hiltViewModel() - FilterType.Language -> hiltViewModel() - else -> null - } + BoxWithConstraints { + val statusBarHeight = statusBarsHeight() + val bottomSheetHeight = remember(statusBarHeight) { + maxHeight - statusBarHeight - 16.dp + } - if (viewModel != null) { - val focusRequester = remember { FocusRequester() } - - FilterPage( - viewModel = viewModel, - focusRequester = focusRequester, - onFilter = { - currentBottomSheetData?.performAction(filter = it) - }, - onClose = { - currentBottomSheetData?.dismiss() - }, - onIMEDone = { - currentBottomSheetData?.dismiss() - } - ) - - LaunchedEffect(key1 = "FilterPageFocusRequest-${sheetState.type}") { - if (currentBottomSheetData != null) { - focusRequester.requestFocus() - keyboard?.show() - } + ModalBottomSheetLayout( + sheetState = bottomSheetState, + sheetShape = sheetShape, + content = content, + scrimColor = Color.Transparent, + sheetContent = { + val viewModel: IFilterViewModel? = when (sheetState.type) { + FilterType.Author -> hiltViewModel() + FilterType.Series -> hiltViewModel() + FilterType.Genre -> hiltViewModel() + FilterType.Language -> hiltViewModel() + else -> null } - } else { - Box(modifier = Modifier.height(1.dp)) - } - }, - ) + if (viewModel != null) { + val focusRequester = remember { FocusRequester() } + + FilterPage( + modifier = Modifier + .fillMaxWidth() + .height(bottomSheetHeight), + viewModel = viewModel, + focusRequester = focusRequester, + onFilter = { + currentBottomSheetData?.performAction(filter = it) + }, + onIMEDone = { + currentBottomSheetData?.dismiss() + } + ) + LaunchedEffect(key1 = "FilterPageFocusRequest-${sheetState.type}") { + if (currentBottomSheetData != null) { + focusRequester.requestFocus() + keyboard?.show() + } + } + } else { + Box(modifier = Modifier.height(1.dp)) + } + }, + ) + } } } diff --git a/app/src/main/java/com/pixelized/biblib/ui/screen/home/HomeScreen.kt b/app/src/main/java/com/pixelized/biblib/ui/screen/home/HomeScreen.kt index 5dfbe7f..6a11cde 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/screen/home/HomeScreen.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/screen/home/HomeScreen.kt @@ -42,6 +42,7 @@ import com.pixelized.biblib.model.search.FilterType import com.pixelized.biblib.model.search.SortType import com.pixelized.biblib.model.search.SortValue import com.pixelized.biblib.ui.LocalSnackHostState +import com.pixelized.biblib.ui.composable.colorElevation import com.pixelized.biblib.ui.composable.scaffold.* import com.pixelized.biblib.ui.navigation.LocalScreenNavHostController import com.pixelized.biblib.ui.navigation.navigateToProfile @@ -444,14 +445,10 @@ private fun HomeToolbar( onAvatarTap: () -> Unit, ) { val direction = LocalLayoutDirection.current - val elevation = LocalElevationOverlay.current Surface( modifier = modifier, shape = CircleShape, - color = elevation?.apply( - MaterialTheme.colors.surface, - LocalAbsoluteElevation.current + 1.dp - ) ?: MaterialTheme.colors.surface, + color = colorElevation(elevation = 1.dp), ) { Row( modifier = Modifier.padding( diff --git a/app/src/main/java/com/pixelized/biblib/ui/screen/home/detail/DetailScreenContent.kt b/app/src/main/java/com/pixelized/biblib/ui/screen/home/detail/DetailScreenContent.kt index a9a5041..b664ff0 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/screen/home/detail/DetailScreenContent.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/screen/home/detail/DetailScreenContent.kt @@ -36,6 +36,7 @@ import com.bumptech.glide.load.engine.GlideException import com.bumptech.glide.request.RequestListener import com.bumptech.glide.request.target.Target import com.pixelized.biblib.R +import com.pixelized.biblib.ui.composable.Handle import com.pixelized.biblib.ui.composable.SpannedText import com.pixelized.biblib.ui.composable.animation.AnimatedDelayer import com.pixelized.biblib.ui.composable.animation.AnimatedOffset @@ -117,6 +118,7 @@ fun DetailScreenContent( .verticalScroll(rememberScrollState()) .padding(all = 16.dp) .systemBarsPadding(), + horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.spacedBy(16.dp) ) { Column( @@ -148,7 +150,6 @@ fun DetailScreenContent( AnimatedOffset { Column( - modifier = Modifier.fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally, ) { Text( @@ -161,7 +162,7 @@ fun DetailScreenContent( Text( modifier = Modifier.clickable(onClick = { onSeries(series) }), style = MaterialTheme.typography.body1, - color = MaterialTheme.colors.onSurface, + color = MaterialTheme.bibLib.colors.typography.emphasis, textAlign = TextAlign.Center, text = series.label, ) @@ -171,15 +172,14 @@ fun DetailScreenContent( AnimatedOffset { Column( - modifier = Modifier.fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally, ) { book.authors.forEach { author -> Text( modifier = Modifier.clickable(onClick = { onAuthor(author) }), - fontWeight = FontWeight.Bold, + fontWeight = FontWeight.Normal, style = MaterialTheme.typography.h6, - color = MaterialTheme.colors.onSurface, + color = MaterialTheme.bibLib.colors.typography.emphasis, textAlign = TextAlign.Center, text = author.name, ) diff --git a/app/src/main/java/com/pixelized/biblib/ui/screen/home/filter/FilterPage.kt b/app/src/main/java/com/pixelized/biblib/ui/screen/home/filter/FilterPage.kt index 442e66f..5e7bfc3 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/screen/home/filter/FilterPage.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/screen/home/filter/FilterPage.kt @@ -1,5 +1,10 @@ package com.pixelized.biblib.ui.screen.home.filter +import android.content.res.Configuration.UI_MODE_NIGHT_NO +import android.content.res.Configuration.UI_MODE_NIGHT_YES +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn @@ -8,24 +13,27 @@ import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material.* import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Close -import androidx.compose.runtime.Composable -import androidx.compose.runtime.Immutable -import androidx.compose.runtime.Stable -import androidx.compose.runtime.State +import androidx.compose.material.icons.filled.Clear +import androidx.compose.runtime.* +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.ImeAction +import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.max +import androidx.paging.PagingData import androidx.paging.compose.LazyPagingItems import androidx.paging.compose.collectAsLazyPagingItems import androidx.paging.compose.items -import com.pixelized.biblib.R import com.pixelized.biblib.model.search.FilterType +import com.pixelized.biblib.ui.composable.Handle +import com.pixelized.biblib.ui.theme.BibLibTheme import com.pixelized.biblib.utils.extention.bibLib +import com.pixelized.biblib.utils.extention.imeHeight +import com.pixelized.biblib.utils.extention.navigationBarsHeight +import kotlinx.coroutines.flow.emptyFlow @Stable @Immutable @@ -37,26 +45,23 @@ data class FilterItemUio( @Composable fun FilterPage( + modifier: Modifier, viewModel: IFilterViewModel, focusRequester: FocusRequester, onFilter: (FilterItemUio) -> Unit, - onClose: () -> Unit, onIMEDone: KeyboardActionScope.() -> Unit, ) { val filters = viewModel.paging.collectAsLazyPagingItems() FilterPageContent( - modifier = Modifier - .fillMaxSize() - .imePadding() - .systemBarsPadding(), + modifier = modifier, focusRequester = focusRequester, title = viewModel.title, search = viewModel.search, onSearchUpdate = { viewModel.updateSearch(it) }, + onClear = { viewModel.updateSearch("") }, filters = filters, onFilter = onFilter, - onClose = onClose, onIMEDone = onIMEDone, ) } @@ -68,56 +73,64 @@ private fun FilterPageContent( title: String, search: State, onSearchUpdate: (String) -> Unit, + onClear: () -> Unit, filters: LazyPagingItems, onFilter: (FilterItemUio) -> Unit, - onClose: () -> Unit, onIMEDone: KeyboardActionScope.() -> Unit, ) { + val navigationBarsHeight = navigationBarsHeight() + val imeHeight = imeHeight() + val paddingValues = remember(navigationBarsHeight, imeHeight) { + PaddingValues( + bottom = max(navigationBarsHeight, imeHeight) + ) + } + Column( modifier = modifier, ) { - TopAppBar( - backgroundColor = MaterialTheme.colors.surface, - elevation = 0.dp, - title = { - Text( - style = MaterialTheme.typography.h6, - color = MaterialTheme.colors.onSurface, - text = title, - ) - }, - navigationIcon = { - IconButton(onClick = onClose) { - Icon( - imageVector = Icons.Default.Close, - contentDescription = null, - ) - } - } + Handle( + modifier = Modifier + .align(alignment = Alignment.CenterHorizontally) + .padding(vertical = 16.dp), + ) + Text( + modifier = Modifier.padding(horizontal = 16.dp), + style = MaterialTheme.bibLib.typography.base.caption, + color = MaterialTheme.bibLib.colors.typography.light, + text = title, ) TextField( modifier = Modifier .focusRequester(focusRequester = focusRequester) .fillMaxWidth(), - label = { - Text( - color = MaterialTheme.colors.onSurface, - text = stringResource(id = R.string.search_filter_title) - ) + trailingIcon = { + AnimatedVisibility( + visible = search.value.isNotBlank(), + enter = fadeIn(), + exit = fadeOut(), + ) { + IconButton( + onClick = onClear, + ) { + Icon( + imageVector = Icons.Default.Clear, + tint = MaterialTheme.bibLib.colors.typography.emphasis, + contentDescription = null, + ) + } + } }, value = search.value, singleLine = true, - colors = TextFieldDefaults.outlinedTextFieldColors( - focusedBorderColor = Color.Transparent, - unfocusedBorderColor = Color.Transparent, - disabledBorderColor = Color.Transparent, - ), + colors = TextFieldDefaults.outlinedTextFieldColors(), keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done), keyboardActions = KeyboardActions(onDone = onIMEDone), onValueChange = onSearchUpdate ) LazyColumn( - modifier = Modifier.fillMaxSize() + modifier = Modifier.fillMaxSize(), + contentPadding = paddingValues, ) { items(items = filters, key = { it.filterId }) { Text( @@ -132,4 +145,22 @@ private fun FilterPageContent( } } } +} + +@Composable +@Preview(showBackground = true, uiMode = UI_MODE_NIGHT_NO) +@Preview(showBackground = true, uiMode = UI_MODE_NIGHT_YES) +private fun FilterPageContentPreview() { + BibLibTheme { + FilterPageContent( + focusRequester = remember { FocusRequester() }, + title = "Search by Author", + search = remember { mutableStateOf("") }, + onSearchUpdate = { }, + onClear = { }, + filters = remember { emptyFlow>() }.collectAsLazyPagingItems(), + onFilter = { }, + onIMEDone = { }, + ) + } } \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/biblib/ui/screen/home/filter/viewModel/AuthorFilterViewModel.kt b/app/src/main/java/com/pixelized/biblib/ui/screen/home/filter/viewModel/AuthorFilterViewModel.kt index eab0d1b..d069f09 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/screen/home/filter/viewModel/AuthorFilterViewModel.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/screen/home/filter/viewModel/AuthorFilterViewModel.kt @@ -26,7 +26,10 @@ class AuthorFilterViewModel @Inject constructor( private val searchRepository: ISearchRepository, ) : ViewModel(), IFilterViewModel { - override val title: String = application.getString(R.string.search_filter_author) + override val title: String = application.getString( + R.string.search_filter_title, + application.getString(R.string.search_filter_author), + ) private var source: AuthorSearchSource? = null override val paging: Flow> diff --git a/app/src/main/java/com/pixelized/biblib/ui/screen/home/filter/viewModel/GenreFilterViewModel.kt b/app/src/main/java/com/pixelized/biblib/ui/screen/home/filter/viewModel/GenreFilterViewModel.kt index 72c4cac..cf6c66c 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/screen/home/filter/viewModel/GenreFilterViewModel.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/screen/home/filter/viewModel/GenreFilterViewModel.kt @@ -26,7 +26,10 @@ class GenreFilterViewModel @Inject constructor( private val searchRepository: ISearchRepository, ) : ViewModel(), IFilterViewModel { - override val title: String = application.getString(R.string.search_filter_genre) + override val title: String = application.getString( + R.string.search_filter_title, + application.getString(R.string.search_filter_genre), + ) private var source: GenreSearchSource? = null override val paging: Flow> diff --git a/app/src/main/java/com/pixelized/biblib/ui/screen/home/filter/viewModel/LanguageFilterViewModel.kt b/app/src/main/java/com/pixelized/biblib/ui/screen/home/filter/viewModel/LanguageFilterViewModel.kt index 0a48358..f6bdb0c 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/screen/home/filter/viewModel/LanguageFilterViewModel.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/screen/home/filter/viewModel/LanguageFilterViewModel.kt @@ -26,7 +26,10 @@ class LanguageFilterViewModel @Inject constructor( private val searchRepository: ISearchRepository, ) : ViewModel(), IFilterViewModel { - override val title: String = application.getString(R.string.search_filter_language) + override val title: String = application.getString( + R.string.search_filter_title, + application.getString(R.string.search_filter_language), + ) private var source: LanguageSearchSource? = null override val paging: Flow> diff --git a/app/src/main/java/com/pixelized/biblib/ui/screen/home/filter/viewModel/SeriesFilterViewModel.kt b/app/src/main/java/com/pixelized/biblib/ui/screen/home/filter/viewModel/SeriesFilterViewModel.kt index 550b979..aead3bd 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/screen/home/filter/viewModel/SeriesFilterViewModel.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/screen/home/filter/viewModel/SeriesFilterViewModel.kt @@ -26,7 +26,10 @@ class SeriesFilterViewModel @Inject constructor( private val searchRepository: ISearchRepository, ) : ViewModel(), IFilterViewModel { - override val title: String = application.getString(R.string.search_filter_series) + override val title: String = application.getString( + R.string.search_filter_title, + application.getString(R.string.search_filter_series), + ) private var source: SeriesSearchSource? = null override val paging: Flow> diff --git a/app/src/main/java/com/pixelized/biblib/ui/theme/Theme.kt b/app/src/main/java/com/pixelized/biblib/ui/theme/Theme.kt index ec75872..9865218 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/theme/Theme.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/theme/Theme.kt @@ -4,11 +4,13 @@ import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.material.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider +import com.pixelized.biblib.ui.composable.SystemTheme import com.pixelized.biblib.ui.theme.color.bibLibDarkColors import com.pixelized.biblib.ui.theme.color.bibLibLightColors import com.pixelized.biblib.ui.theme.dimen.BibLibDimen import com.pixelized.biblib.ui.theme.shape.BibLibShape import com.pixelized.biblib.ui.theme.typography.BibLibTypography +import com.pixelized.biblib.utils.extention.bibLib @Composable fun BibLibTheme( @@ -26,7 +28,15 @@ fun BibLibTheme( colors = theme.colors.base, typography = theme.typography.base, shapes = theme.shapes.base, - content = content + content = { + SystemTheme( + statusBackground = MaterialTheme.bibLib.colors.system.status, + statusDarkIcons = darkTheme.not(), + navigationBackground = MaterialTheme.bibLib.colors.system.navigation, + navigationDarkIcons = darkTheme.not(), + content = content, + ) + } ) } } \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/biblib/ui/theme/color/BibLibColor.kt b/app/src/main/java/com/pixelized/biblib/ui/theme/color/BibLibColor.kt index ce49dd0..ab1fe18 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/theme/color/BibLibColor.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/theme/color/BibLibColor.kt @@ -1,10 +1,12 @@ package com.pixelized.biblib.ui.theme.color import androidx.compose.material.Colors +import androidx.compose.material.MaterialTheme import androidx.compose.material.darkColors import androidx.compose.material.lightColors import androidx.compose.runtime.Stable import androidx.compose.ui.graphics.Color +import com.pixelized.biblib.utils.extention.bibLib import javax.annotation.concurrent.Immutable @@ -12,9 +14,18 @@ import javax.annotation.concurrent.Immutable @Immutable data class BibLibColor( val base: Colors, + val system: System, + val handle: Color, val typography: Typography, val placeHolder: PlaceHolder, ) { + @Stable + @Immutable + data class System( + val status: Color, + val navigation: Color, + ) + @Stable @Immutable data class Typography( @@ -40,6 +51,11 @@ fun bibLibDarkColors( error = BibLibColorPalette.Red, onError = Color.White, ), + system: BibLibColor.System = BibLibColor.System( + status = base.surface.copy(alpha = 0.5f), + navigation = base.surface.copy(alpha = 0.5f), + ), + handle: Color = base.onSurface.copy(alpha = 0.2f), typography: BibLibColor.Typography = BibLibColor.Typography( light = base.onSurface.copy(alpha = 0.67f), medium = base.onSurface, @@ -51,6 +67,8 @@ fun bibLibDarkColors( ), ) = BibLibColor( base = base, + system = system, + handle = handle, typography = typography, placeHolder = placeHolder, ) @@ -68,6 +86,11 @@ fun bibLibLightColors( surface = Color.White, onSurface = BibLibColorPalette.VeryDarkGrey, ), + system: BibLibColor.System = BibLibColor.System( + status = base.surface.copy(alpha = 0.5f), + navigation = base.surface.copy(alpha = 0.5f), + ), + handle: Color = base.onSurface.copy(alpha = 0.1f), typography: BibLibColor.Typography = BibLibColor.Typography( light = base.onSurface.copy(alpha = 0.67f), medium = base.onSurface, @@ -79,6 +102,8 @@ fun bibLibLightColors( ), ) = BibLibColor( base = base, + system = system, + handle = handle, typography = typography, placeHolder = placeHolder, ) \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/biblib/ui/theme/dimen/BibLibDimen.kt b/app/src/main/java/com/pixelized/biblib/ui/theme/dimen/BibLibDimen.kt index 57ba712..64b1069 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/theme/dimen/BibLibDimen.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/theme/dimen/BibLibDimen.kt @@ -11,6 +11,7 @@ import androidx.compose.ui.unit.dp data class BibLibDimen( val avatar: Avatar = Avatar(), val progress: Progress = Progress(), + val handle: Handle = Handle(), val detail: BookDetail = BookDetail(), val thumbnail: BookThumbnail = BookThumbnail(), ) { @@ -26,6 +27,13 @@ data class BibLibDimen( val iconSize: Dp = 52.dp, ) + @Stable + @Immutable + data class Handle( + val width: Dp = 32.dp, + val thickness: Dp = 4.dp, + ) + @Stable @Immutable data class BookDetail( diff --git a/app/src/main/java/com/pixelized/biblib/ui/theme/shape/BibLibShape.kt b/app/src/main/java/com/pixelized/biblib/ui/theme/shape/BibLibShape.kt index 64adddc..1936c1e 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/theme/shape/BibLibShape.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/theme/shape/BibLibShape.kt @@ -17,4 +17,5 @@ data class BibLibShape( ), val bookThumbnailCoverSmall: Shape = RoundedCornerShape(4.dp), val bookThumbnailCoverLarge: Shape = RoundedCornerShape(4.dp), + val filterSheet: Shape = RoundedCornerShape(topEnd = 16.dp, topStart = 16.dp), ) \ No newline at end of file diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index bc47762..d2e68db 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -61,7 +61,7 @@ eBook envoyé avec succès Rechercher sur Biblib - Rechercher + Rechercher par %1$s %1$s : %2$s Nouveauté Auteur diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 58d0d21..5fbcf63 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -77,7 +77,7 @@ eBook sent with success Search on Biblib - Search + Search by %1$s %1$s: %2$s New Authors