diff --git a/app/build.gradle b/app/build.gradle index 22f89d970..5589b5a32 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -185,8 +185,8 @@ dependencies { implementation "com.google.accompanist:accompanist-navigation-animation:$accompanist" implementation "com.google.accompanist:accompanist-swiperefresh:$accompanist" - implementation platform("androidx.compose:compose-bom:$composeBom") - androidTestImplementation(platform("androidx.compose:compose-bom:$composeBom")) + implementation platform("dev.chrisbanes.compose:compose-bom:$composeBom") + androidTestImplementation(platform("dev.chrisbanes.compose:compose-bom:$composeBom")) // https://developer.android.com/jetpack/androidx/releases/compose-animation implementation "androidx.compose.animation:animation-graphics" diff --git a/app/src/main/java/me/ash/reader/ui/component/base/RYOutlineTextField.kt b/app/src/main/java/me/ash/reader/ui/component/base/RYOutlineTextField.kt index 06bff56d2..d21b3e89a 100644 --- a/app/src/main/java/me/ash/reader/ui/component/base/RYOutlineTextField.kt +++ b/app/src/main/java/me/ash/reader/ui/component/base/RYOutlineTextField.kt @@ -60,8 +60,9 @@ fun RYOutlineTextField( OutlinedTextField( modifier = Modifier.focusRequester(focusRequester), - colors = TextFieldDefaults.textFieldColors( - containerColor = Color.Transparent, + colors = TextFieldDefaults.colors( + focusedContainerColor = Color.Transparent, + unfocusedContainerColor = Color.Transparent, ), maxLines = if (singleLine) 1 else Int.MAX_VALUE, enabled = !readOnly, diff --git a/app/src/main/java/me/ash/reader/ui/component/base/RYScaffold.kt b/app/src/main/java/me/ash/reader/ui/component/base/RYScaffold.kt index 3997087ea..ae5f8eca2 100644 --- a/app/src/main/java/me/ash/reader/ui/component/base/RYScaffold.kt +++ b/app/src/main/java/me/ash/reader/ui/component/base/RYScaffold.kt @@ -44,7 +44,7 @@ fun RYScaffold( title = {}, navigationIcon = { navigationIcon?.invoke() }, actions = { actions?.invoke(this) }, - colors = TopAppBarDefaults.smallTopAppBarColors( + colors = TopAppBarDefaults.mediumTopAppBarColors( containerColor = MaterialTheme.colorScheme.surfaceColorAtElevation( topBarTonalElevation ), diff --git a/app/src/main/java/me/ash/reader/ui/component/base/RYTextField.kt b/app/src/main/java/me/ash/reader/ui/component/base/RYTextField.kt index 86824a201..3a59722b1 100644 --- a/app/src/main/java/me/ash/reader/ui/component/base/RYTextField.kt +++ b/app/src/main/java/me/ash/reader/ui/component/base/RYTextField.kt @@ -46,8 +46,9 @@ fun RYTextField( TextField( modifier = Modifier.focusRequester(focusRequester), - colors = TextFieldDefaults.textFieldColors( - containerColor = Color.Transparent, + colors = TextFieldDefaults.colors( + focusedContainerColor = Color.Transparent, + unfocusedTextColor = Color.Transparent, ), maxLines = if (singleLine) 1 else Int.MAX_VALUE, enabled = !readOnly, diff --git a/app/src/main/java/me/ash/reader/ui/page/home/feeds/drawer/feed/FeedOptionViewModel.kt b/app/src/main/java/me/ash/reader/ui/page/home/feeds/drawer/feed/FeedOptionViewModel.kt index 8952c605b..7cb44825a 100644 --- a/app/src/main/java/me/ash/reader/ui/page/home/feeds/drawer/feed/FeedOptionViewModel.kt +++ b/app/src/main/java/me/ash/reader/ui/page/home/feeds/drawer/feed/FeedOptionViewModel.kt @@ -3,6 +3,7 @@ package me.ash.reader.ui.page.home.feeds.drawer.feed import androidx.compose.material.ExperimentalMaterialApi import androidx.compose.material.ModalBottomSheetState import androidx.compose.material.ModalBottomSheetValue +import androidx.compose.ui.unit.Density import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel @@ -232,7 +233,10 @@ class FeedOptionViewModel @Inject constructor( @OptIn(ExperimentalMaterialApi::class) data class FeedOptionUiState( - var drawerState: ModalBottomSheetState = ModalBottomSheetState(ModalBottomSheetValue.Hidden), + var drawerState: ModalBottomSheetState = ModalBottomSheetState( + ModalBottomSheetValue.Hidden, + Density(0f, 1f) + ), val feed: Feed? = null, val selectedGroupId: String = "", val newGroupContent: String = "", diff --git a/app/src/main/java/me/ash/reader/ui/page/home/feeds/drawer/group/GroupOptionViewModel.kt b/app/src/main/java/me/ash/reader/ui/page/home/feeds/drawer/group/GroupOptionViewModel.kt index 1ada59dfb..01e050239 100644 --- a/app/src/main/java/me/ash/reader/ui/page/home/feeds/drawer/group/GroupOptionViewModel.kt +++ b/app/src/main/java/me/ash/reader/ui/page/home/feeds/drawer/group/GroupOptionViewModel.kt @@ -3,6 +3,7 @@ package me.ash.reader.ui.page.home.feeds.drawer.group import androidx.compose.material.ExperimentalMaterialApi import androidx.compose.material.ModalBottomSheetState import androidx.compose.material.ModalBottomSheetValue +import androidx.compose.ui.unit.Density import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel @@ -196,7 +197,10 @@ class GroupOptionViewModel @Inject constructor( @OptIn(ExperimentalMaterialApi::class) data class GroupOptionUiState( - var drawerState: ModalBottomSheetState = ModalBottomSheetState(ModalBottomSheetValue.Hidden), + var drawerState: ModalBottomSheetState = ModalBottomSheetState( + ModalBottomSheetValue.Hidden, + Density(0f, 1f) + ), val group: Group? = null, val targetGroup: Group? = null, val groups: List = emptyList(), diff --git a/app/src/main/java/me/ash/reader/ui/page/home/flow/ArticleItem.kt b/app/src/main/java/me/ash/reader/ui/page/home/flow/ArticleItem.kt index 0c9758deb..d6306bf51 100644 --- a/app/src/main/java/me/ash/reader/ui/page/home/flow/ArticleItem.kt +++ b/app/src/main/java/me/ash/reader/ui/page/home/flow/ArticleItem.kt @@ -3,7 +3,9 @@ package me.ash.reader.ui.page.home.flow import android.view.HapticFeedbackConstants import androidx.compose.animation.Animatable import androidx.compose.animation.core.AnimationSpec +import androidx.compose.animation.core.DecayAnimationSpec import androidx.compose.animation.core.Spring +import androidx.compose.animation.core.exponentialDecay import androidx.compose.animation.core.spring import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.background @@ -240,6 +242,7 @@ private const val SwipeActionDelay = 300L @OptIn(ExperimentalMaterial3Api::class, ExperimentalComposeUiApi::class) @Composable fun SwipeableArticleItem( + modifier: Modifier = Modifier, articleWithFeed: ArticleWithFeed, isFilterUnread: Boolean = false, articleListTonalElevation: Int = 0, @@ -289,11 +292,13 @@ fun SwipeableArticleItem( } val velocityThreshold: () -> Float = { Float.POSITIVE_INFINITY } val animationSpec: AnimationSpec = spring(stiffness = Spring.StiffnessMediumLow) + val decayAnimationSpec: DecayAnimationSpec = exponentialDecay() val swipeState = rememberSaveable( articleWithFeed.article, saver = SwipeToDismissBoxState.Saver( confirmValueChange = confirmValueChange, density = density, animationSpec = animationSpec, + decayAnimationSpec = decayAnimationSpec, velocityThreshold = velocityThreshold, positionalThreshold = positionalThreshold ) @@ -333,6 +338,7 @@ fun SwipeableArticleItem( var menuOffset by remember { mutableStateOf(Offset(0f, 0f)) } SwipeToDismissBox( + modifier = modifier, state = swipeState, enabled = !isSwipeEnabled(), /*** create dismiss alert background box */ diff --git a/app/src/main/java/me/ash/reader/ui/page/home/flow/ArticleList.kt b/app/src/main/java/me/ash/reader/ui/page/home/flow/ArticleList.kt index 1803649bf..b04ac5e1f 100644 --- a/app/src/main/java/me/ash/reader/ui/page/home/flow/ArticleList.kt +++ b/app/src/main/java/me/ash/reader/ui/page/home/flow/ArticleList.kt @@ -32,6 +32,7 @@ fun LazyListScope.ArticleList( is ArticleFlowItem.Article -> { item(key = item.articleWithFeed.article.id) { SwipeableArticleItem( + modifier = Modifier.animateItem(), articleWithFeed = item.articleWithFeed, isFilterUnread = isFilterUnread, articleListTonalElevation = articleListTonalElevation, @@ -51,11 +52,20 @@ fun LazyListScope.ArticleList( if (item.showSpacer) item { Spacer(modifier = Modifier.height(40.dp)) } if (isShowStickyHeader) { stickyHeader(key = item.date) { - StickyHeader(item.date, isShowFeedIcon, articleListTonalElevation) + StickyHeader( + dateString = item.date, + isShowFeedIcon = isShowFeedIcon, + articleListTonalElevation = articleListTonalElevation + ) } } else { item(key = item.date) { - StickyHeader(item.date, isShowFeedIcon, articleListTonalElevation) + StickyHeader( + modifier = Modifier.animateItem(), + dateString = item.date, + isShowFeedIcon = isShowFeedIcon, + articleListTonalElevation = articleListTonalElevation + ) } } } diff --git a/app/src/main/java/me/ash/reader/ui/page/home/flow/StickyHeader.kt b/app/src/main/java/me/ash/reader/ui/page/home/flow/StickyHeader.kt index 3f8518bb6..83ec57f25 100644 --- a/app/src/main/java/me/ash/reader/ui/page/home/flow/StickyHeader.kt +++ b/app/src/main/java/me/ash/reader/ui/page/home/flow/StickyHeader.kt @@ -15,12 +15,13 @@ import me.ash.reader.ui.theme.palette.onDark @Composable fun StickyHeader( + modifier: Modifier = Modifier, dateString: String, isShowFeedIcon: Boolean, articleListTonalElevation: Int, ) { Row( - modifier = Modifier + modifier = modifier .fillMaxWidth() .background( MaterialTheme.colorScheme.surfaceColorAtElevation(articleListTonalElevation.dp) diff --git a/app/src/main/java/me/ash/reader/ui/page/home/flow/SwipeToDismissBox.kt b/app/src/main/java/me/ash/reader/ui/page/home/flow/SwipeToDismissBox.kt index 4eb74e4d6..0b4810983 100644 --- a/app/src/main/java/me/ash/reader/ui/page/home/flow/SwipeToDismissBox.kt +++ b/app/src/main/java/me/ash/reader/ui/page/home/flow/SwipeToDismissBox.kt @@ -18,6 +18,8 @@ package me.ash.reader.ui.page.home.flow import androidx.annotation.FloatRange import androidx.compose.animation.core.AnimationSpec +import androidx.compose.animation.core.DecayAnimationSpec +import androidx.compose.animation.core.exponentialDecay import androidx.compose.animation.core.spring import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.gestures.AnchoredDraggableState @@ -88,13 +90,15 @@ class SwipeToDismissBoxState( initialValue: SwipeToDismissBoxValue, internal val density: Density, animationSpec: AnimationSpec = spring(), + decayAnimationSpec: DecayAnimationSpec = exponentialDecay(), confirmValueChange: (SwipeToDismissBoxValue) -> Boolean = { true }, velocityThreshold: () -> Float = { with(density) { DismissThreshold.toPx() } }, positionalThreshold: (totalDistance: Float) -> Float ) { internal val anchoredDraggableState = AnchoredDraggableState( initialValue = initialValue, - animationSpec = animationSpec, + snapAnimationSpec = animationSpec, + decayAnimationSpec = decayAnimationSpec, confirmValueChange = confirmValueChange, positionalThreshold = positionalThreshold, velocityThreshold = velocityThreshold @@ -200,6 +204,7 @@ class SwipeToDismissBoxState( positionalThreshold: (totalDistance: Float) -> Float, velocityThreshold: () -> Float, animationSpec: AnimationSpec, + decayAnimationSpec: DecayAnimationSpec, density: Density ) = Saver( save = { it.currentValue }, @@ -208,6 +213,7 @@ class SwipeToDismissBoxState( it, density, animationSpec, + decayAnimationSpec, confirmValueChange, velocityThreshold, positionalThreshold diff --git a/app/src/main/java/me/ash/reader/ui/page/home/reading/TopBar.kt b/app/src/main/java/me/ash/reader/ui/page/home/reading/TopBar.kt index 205ab715e..014edd5f9 100644 --- a/app/src/main/java/me/ash/reader/ui/page/home/reading/TopBar.kt +++ b/app/src/main/java/me/ash/reader/ui/page/home/reading/TopBar.kt @@ -81,7 +81,7 @@ fun TopBar( ) { sharedContent.share(context, title, link) } - }, colors = TopAppBarDefaults.smallTopAppBarColors( + }, colors = TopAppBarDefaults.mediumTopAppBarColors( containerColor = MaterialTheme.colorScheme.surfaceColorAtElevation(tonalElevation.value.dp), ) ) diff --git a/app/src/main/java/me/ash/reader/ui/page/settings/color/feeds/FeedsPagePreview.kt b/app/src/main/java/me/ash/reader/ui/page/settings/color/feeds/FeedsPagePreview.kt index 67533542b..8f8441df3 100644 --- a/app/src/main/java/me/ash/reader/ui/page/settings/color/feeds/FeedsPagePreview.kt +++ b/app/src/main/java/me/ash/reader/ui/page/settings/color/feeds/FeedsPagePreview.kt @@ -88,7 +88,7 @@ fun FeedsPagePreview( contentDescription = stringResource(R.string.subscribe), tint = MaterialTheme.colorScheme.onSurface, ) - }, colors = TopAppBarDefaults.smallTopAppBarColors( + }, colors = TopAppBarDefaults.mediumTopAppBarColors( containerColor = MaterialTheme.colorScheme.surfaceColorAtElevation( topBarTonalElevation.value.dp ), diff --git a/app/src/main/java/me/ash/reader/ui/page/settings/color/flow/FlowPagePreview.kt b/app/src/main/java/me/ash/reader/ui/page/settings/color/flow/FlowPagePreview.kt index e76da1ada..725355675 100644 --- a/app/src/main/java/me/ash/reader/ui/page/settings/color/flow/FlowPagePreview.kt +++ b/app/src/main/java/me/ash/reader/ui/page/settings/color/flow/FlowPagePreview.kt @@ -76,7 +76,7 @@ fun FlowPagePreview( contentDescription = stringResource(R.string.search), tint = MaterialTheme.colorScheme.onSurface, ) {} - }, colors = TopAppBarDefaults.smallTopAppBarColors( + }, colors = TopAppBarDefaults.mediumTopAppBarColors( containerColor = MaterialTheme.colorScheme.surfaceColorAtElevation(topBarTonalElevation.value.dp), ) ) diff --git a/build.gradle b/build.gradle index 1eb29a4b1..e702c4e16 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ buildscript { // https://developer.android.com/jetpack/androidx/releases/compose-ui // compose = '1.2.0-beta02' // https://developer.android.com/jetpack/compose/bom - composeBom = '2024.01.00' + composeBom = '2024.05.00-alpha01' // https://github.com/google/accompanist/releases accompanist = '0.34.0' // https://developer.android.com/jetpack/androidx/releases/compose-material3