Revert "Merge remote-tracking branch 'origin/development' into file-tree-browse-feature"
This reverts commit5301df42ee, reversing changes made tod08e9f72fa.
This commit is contained in:
parent
5301df42ee
commit
fcd54dc0b0
5 changed files with 106 additions and 102 deletions
|
|
@ -1,17 +1,16 @@
|
||||||
package ua.acclorite.book_story.presentation.components
|
package ua.acclorite.book_story.presentation.components
|
||||||
|
|
||||||
|
import androidx.compose.animation.animateColorAsState
|
||||||
import androidx.compose.animation.core.Spring
|
import androidx.compose.animation.core.Spring
|
||||||
import androidx.compose.animation.core.animateFloatAsState
|
|
||||||
import androidx.compose.animation.core.spring
|
import androidx.compose.animation.core.spring
|
||||||
import androidx.compose.animation.fadeIn
|
import androidx.compose.animation.fadeIn
|
||||||
import androidx.compose.animation.fadeOut
|
import androidx.compose.animation.fadeOut
|
||||||
import androidx.compose.foundation.background
|
import androidx.compose.foundation.background
|
||||||
import androidx.compose.foundation.layout.Box
|
import androidx.compose.foundation.layout.Box
|
||||||
import androidx.compose.foundation.layout.Column
|
|
||||||
import androidx.compose.foundation.layout.ColumnScope
|
|
||||||
import androidx.compose.foundation.layout.RowScope
|
import androidx.compose.foundation.layout.RowScope
|
||||||
import androidx.compose.foundation.layout.WindowInsets
|
import androidx.compose.foundation.layout.WindowInsets
|
||||||
import androidx.compose.foundation.layout.fillMaxWidth
|
import androidx.compose.foundation.layout.fillMaxWidth
|
||||||
|
import androidx.compose.foundation.layout.height
|
||||||
import androidx.compose.foundation.layout.statusBars
|
import androidx.compose.foundation.layout.statusBars
|
||||||
import androidx.compose.material3.ExperimentalMaterial3Api
|
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||||
import androidx.compose.material3.MaterialTheme
|
import androidx.compose.material3.MaterialTheme
|
||||||
|
|
@ -19,24 +18,23 @@ import androidx.compose.material3.TopAppBar
|
||||||
import androidx.compose.material3.TopAppBarDefaults
|
import androidx.compose.material3.TopAppBarDefaults
|
||||||
import androidx.compose.material3.TopAppBarScrollBehavior
|
import androidx.compose.material3.TopAppBarScrollBehavior
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.derivedStateOf
|
||||||
|
import androidx.compose.runtime.getValue
|
||||||
|
import androidx.compose.runtime.remember
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.graphics.Color
|
import androidx.compose.ui.graphics.Color
|
||||||
import androidx.compose.ui.graphics.lerp
|
import androidx.compose.ui.platform.LocalDensity
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
|
import androidx.compose.ui.unit.dp
|
||||||
import ua.acclorite.book_story.R
|
import ua.acclorite.book_story.R
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Animated top app bar.
|
* Animated top app bar. Has up to 3 different top bars inside it. Follow [TopAppBar] for more info.
|
||||||
* Has up to 3 different top bars inside it. Follow [TopAppBar] for more info.
|
|
||||||
*
|
*
|
||||||
* @param containerColor Container color of the TopBar.
|
|
||||||
* @param scrolledContainerColor Scrolled container color of the TopBar.
|
|
||||||
* @param scrollBehavior [TopAppBarScrollBehavior].
|
|
||||||
* @param isTopBarScrolled Whether isScrolled state should be forced or not.
|
* @param isTopBarScrolled Whether isScrolled state should be forced or not.
|
||||||
* @param content1Visibility Whether first top app bar should be shown.
|
* @param content1Visibility Whether first top app bar should be shown.
|
||||||
* @param content2Visibility Whether second top app bar should be shown.
|
* @param content2Visibility Whether second top app bar should be shown.
|
||||||
* @param content3Visibility Whether third top app bar should be shown.
|
* @param content3Visibility Whether third top app bar should be shown.
|
||||||
* @param customContent Custom content below [TopAppBar].
|
|
||||||
*/
|
*/
|
||||||
@OptIn(ExperimentalMaterial3Api::class)
|
@OptIn(ExperimentalMaterial3Api::class)
|
||||||
@Composable
|
@Composable
|
||||||
|
|
@ -60,28 +58,42 @@ fun AnimatedTopAppBar(
|
||||||
content3Visibility: Boolean? = null,
|
content3Visibility: Boolean? = null,
|
||||||
content3NavigationIcon: @Composable () -> Unit = {},
|
content3NavigationIcon: @Composable () -> Unit = {},
|
||||||
content3Title: @Composable () -> Unit = {},
|
content3Title: @Composable () -> Unit = {},
|
||||||
content3Actions: @Composable RowScope.() -> Unit = {},
|
content3Actions: @Composable RowScope.() -> Unit = {}
|
||||||
|
|
||||||
customContent: @Composable ColumnScope.() -> Unit = {}
|
|
||||||
) {
|
) {
|
||||||
val animatedContainerColor = lerp(
|
Box(modifier = Modifier.fillMaxWidth()) {
|
||||||
containerColor,
|
val density = LocalDensity.current
|
||||||
scrolledContainerColor,
|
val statusBarPadding = with(density) {
|
||||||
animateFloatAsState(
|
WindowInsets.statusBars.getTop(density).toDp()
|
||||||
if (isTopBarScrolled == true) 1f else 0f,
|
}
|
||||||
animationSpec = spring(
|
|
||||||
stiffness = Spring.StiffnessMediumLow
|
if (containerColor != Color.Transparent) {
|
||||||
),
|
Box(
|
||||||
|
modifier = Modifier
|
||||||
|
.fillMaxWidth()
|
||||||
|
.height(64.dp + statusBarPadding)
|
||||||
|
.background(
|
||||||
|
if (isTopBarScrolled == true) scrolledContainerColor
|
||||||
|
else containerColor
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
val scrollableContainerColor by remember(isTopBarScrolled) {
|
||||||
|
derivedStateOf {
|
||||||
|
if (isTopBarScrolled == true) {
|
||||||
|
scrolledContainerColor
|
||||||
|
} else {
|
||||||
|
containerColor
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val animatedContainerColor by animateColorAsState(
|
||||||
|
targetValue = scrollableContainerColor,
|
||||||
|
animationSpec = spring(stiffness = Spring.StiffnessMediumLow),
|
||||||
label = stringResource(id = R.string.top_app_bar_anim_content_desc)
|
label = stringResource(id = R.string.top_app_bar_anim_content_desc)
|
||||||
).value
|
|
||||||
)
|
)
|
||||||
|
|
||||||
Column(
|
|
||||||
Modifier
|
|
||||||
.fillMaxWidth()
|
|
||||||
.background(animatedContainerColor)
|
|
||||||
) {
|
|
||||||
Box(modifier = Modifier.fillMaxWidth()) {
|
|
||||||
CustomAnimatedVisibility(
|
CustomAnimatedVisibility(
|
||||||
visible = content1Visibility ?: true,
|
visible = content1Visibility ?: true,
|
||||||
enter = fadeIn(spring(stiffness = Spring.StiffnessMediumLow)),
|
enter = fadeIn(spring(stiffness = Spring.StiffnessMediumLow)),
|
||||||
|
|
@ -95,8 +107,7 @@ fun AnimatedTopAppBar(
|
||||||
scrollBehavior = scrollBehavior,
|
scrollBehavior = scrollBehavior,
|
||||||
modifier = Modifier.fillMaxWidth(),
|
modifier = Modifier.fillMaxWidth(),
|
||||||
colors = TopAppBarDefaults.topAppBarColors(
|
colors = TopAppBarDefaults.topAppBarColors(
|
||||||
containerColor = if (isTopBarScrolled != null) Color.Transparent
|
containerColor = animatedContainerColor,
|
||||||
else containerColor,
|
|
||||||
scrolledContainerColor = scrolledContainerColor
|
scrolledContainerColor = scrolledContainerColor
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
@ -116,8 +127,7 @@ fun AnimatedTopAppBar(
|
||||||
scrollBehavior = scrollBehavior,
|
scrollBehavior = scrollBehavior,
|
||||||
modifier = Modifier.fillMaxWidth(),
|
modifier = Modifier.fillMaxWidth(),
|
||||||
colors = TopAppBarDefaults.topAppBarColors(
|
colors = TopAppBarDefaults.topAppBarColors(
|
||||||
containerColor = if (isTopBarScrolled != null) Color.Transparent
|
containerColor = animatedContainerColor,
|
||||||
else containerColor,
|
|
||||||
scrolledContainerColor = scrolledContainerColor
|
scrolledContainerColor = scrolledContainerColor
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
@ -138,16 +148,13 @@ fun AnimatedTopAppBar(
|
||||||
scrollBehavior = scrollBehavior,
|
scrollBehavior = scrollBehavior,
|
||||||
modifier = Modifier.fillMaxWidth(),
|
modifier = Modifier.fillMaxWidth(),
|
||||||
colors = TopAppBarDefaults.topAppBarColors(
|
colors = TopAppBarDefaults.topAppBarColors(
|
||||||
containerColor = if (isTopBarScrolled != null) Color.Transparent
|
containerColor = animatedContainerColor,
|
||||||
else containerColor,
|
|
||||||
scrolledContainerColor = scrolledContainerColor
|
scrolledContainerColor = scrolledContainerColor
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
customContent()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,7 @@ import androidx.compose.material.icons.filled.PlayArrow
|
||||||
import androidx.compose.material.pullrefresh.PullRefreshIndicator
|
import androidx.compose.material.pullrefresh.PullRefreshIndicator
|
||||||
import androidx.compose.material.pullrefresh.pullRefresh
|
import androidx.compose.material.pullrefresh.pullRefresh
|
||||||
import androidx.compose.material.pullrefresh.rememberPullRefreshState
|
import androidx.compose.material.pullrefresh.rememberPullRefreshState
|
||||||
|
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||||
import androidx.compose.material3.FloatingActionButton
|
import androidx.compose.material3.FloatingActionButton
|
||||||
import androidx.compose.material3.FloatingActionButtonDefaults
|
import androidx.compose.material3.FloatingActionButtonDefaults
|
||||||
import androidx.compose.material3.Icon
|
import androidx.compose.material3.Icon
|
||||||
|
|
@ -34,6 +35,7 @@ import androidx.compose.material3.MaterialTheme
|
||||||
import androidx.compose.material3.Scaffold
|
import androidx.compose.material3.Scaffold
|
||||||
import androidx.compose.material3.SnackbarHostState
|
import androidx.compose.material3.SnackbarHostState
|
||||||
import androidx.compose.material3.Text
|
import androidx.compose.material3.Text
|
||||||
|
import androidx.compose.material3.TopAppBarDefaults
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.DisposableEffect
|
import androidx.compose.runtime.DisposableEffect
|
||||||
import androidx.compose.runtime.LaunchedEffect
|
import androidx.compose.runtime.LaunchedEffect
|
||||||
|
|
@ -42,6 +44,7 @@ import androidx.compose.runtime.collectAsState
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
import androidx.compose.ui.Alignment
|
import androidx.compose.ui.Alignment
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.input.nestedscroll.nestedScroll
|
||||||
import androidx.compose.ui.platform.LocalContext
|
import androidx.compose.ui.platform.LocalContext
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
|
|
@ -106,7 +109,7 @@ fun BookInfoScreenRoot(screen: Screen.BookInfo) {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@OptIn(ExperimentalMaterialApi::class)
|
@OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterialApi::class)
|
||||||
@Composable
|
@Composable
|
||||||
private fun BookInfoScreen(
|
private fun BookInfoScreen(
|
||||||
state: State<BookInfoState>,
|
state: State<BookInfoState>,
|
||||||
|
|
@ -117,6 +120,7 @@ private fun BookInfoScreen(
|
||||||
onHistoryEvent: (HistoryEvent) -> Unit
|
onHistoryEvent: (HistoryEvent) -> Unit
|
||||||
) {
|
) {
|
||||||
val context = LocalContext.current
|
val context = LocalContext.current
|
||||||
|
val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior()
|
||||||
val listState = rememberLazyListState()
|
val listState = rememberLazyListState()
|
||||||
val snackbarState = remember { SnackbarHostState() }
|
val snackbarState = remember { SnackbarHostState() }
|
||||||
val refreshState = rememberPullRefreshState(
|
val refreshState = rememberPullRefreshState(
|
||||||
|
|
@ -175,7 +179,8 @@ private fun BookInfoScreen(
|
||||||
.fillMaxSize()
|
.fillMaxSize()
|
||||||
.imePadding()
|
.imePadding()
|
||||||
.windowInsetsPadding(WindowInsets.navigationBars)
|
.windowInsetsPadding(WindowInsets.navigationBars)
|
||||||
.pullRefresh(refreshState),
|
.pullRefresh(refreshState)
|
||||||
|
.nestedScroll(scrollBehavior.nestedScrollConnection),
|
||||||
containerColor = MaterialTheme.colorScheme.surface,
|
containerColor = MaterialTheme.colorScheme.surface,
|
||||||
topBar = {
|
topBar = {
|
||||||
BookInfoTopBar(
|
BookInfoTopBar(
|
||||||
|
|
@ -184,6 +189,7 @@ private fun BookInfoScreen(
|
||||||
onLibraryEvent = onLibraryEvent,
|
onLibraryEvent = onLibraryEvent,
|
||||||
onHistoryEvent = onHistoryEvent,
|
onHistoryEvent = onHistoryEvent,
|
||||||
onNavigate = onNavigate,
|
onNavigate = onNavigate,
|
||||||
|
scrollBehavior = scrollBehavior,
|
||||||
listState = listState,
|
listState = listState,
|
||||||
snackbarState = snackbarState
|
snackbarState = snackbarState
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -12,11 +12,13 @@ import androidx.compose.material3.ExperimentalMaterial3Api
|
||||||
import androidx.compose.material3.MaterialTheme
|
import androidx.compose.material3.MaterialTheme
|
||||||
import androidx.compose.material3.SnackbarHostState
|
import androidx.compose.material3.SnackbarHostState
|
||||||
import androidx.compose.material3.Text
|
import androidx.compose.material3.Text
|
||||||
|
import androidx.compose.material3.TopAppBarScrollBehavior
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.State
|
import androidx.compose.runtime.State
|
||||||
import androidx.compose.runtime.derivedStateOf
|
import androidx.compose.runtime.derivedStateOf
|
||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
|
import androidx.compose.ui.graphics.Color
|
||||||
import androidx.compose.ui.platform.LocalContext
|
import androidx.compose.ui.platform.LocalContext
|
||||||
import androidx.compose.ui.text.style.TextOverflow
|
import androidx.compose.ui.text.style.TextOverflow
|
||||||
import ua.acclorite.book_story.R
|
import ua.acclorite.book_story.R
|
||||||
|
|
@ -40,6 +42,7 @@ import ua.acclorite.book_story.presentation.ui.Transitions
|
||||||
* @param onLibraryEvent [LibraryEvent] callback.
|
* @param onLibraryEvent [LibraryEvent] callback.
|
||||||
* @param onHistoryEvent [HistoryEvent] callback.
|
* @param onHistoryEvent [HistoryEvent] callback.
|
||||||
* @param onNavigate Navigator callback.
|
* @param onNavigate Navigator callback.
|
||||||
|
* @param scrollBehavior [TopAppBarScrollBehavior].
|
||||||
* @param listState [LazyListState].
|
* @param listState [LazyListState].
|
||||||
* @param snackbarState [SnackbarHostState].
|
* @param snackbarState [SnackbarHostState].
|
||||||
*/
|
*/
|
||||||
|
|
@ -51,6 +54,7 @@ fun BookInfoTopBar(
|
||||||
onLibraryEvent: (LibraryEvent) -> Unit,
|
onLibraryEvent: (LibraryEvent) -> Unit,
|
||||||
onHistoryEvent: (HistoryEvent) -> Unit,
|
onHistoryEvent: (HistoryEvent) -> Unit,
|
||||||
onNavigate: OnNavigate,
|
onNavigate: OnNavigate,
|
||||||
|
scrollBehavior: TopAppBarScrollBehavior,
|
||||||
listState: LazyListState,
|
listState: LazyListState,
|
||||||
snackbarState: SnackbarHostState
|
snackbarState: SnackbarHostState
|
||||||
) {
|
) {
|
||||||
|
|
@ -58,9 +62,9 @@ fun BookInfoTopBar(
|
||||||
val firstVisibleItemIndex by remember { derivedStateOf { listState.firstVisibleItemIndex } }
|
val firstVisibleItemIndex by remember { derivedStateOf { listState.firstVisibleItemIndex } }
|
||||||
|
|
||||||
AnimatedTopAppBar(
|
AnimatedTopAppBar(
|
||||||
containerColor = MaterialTheme.colorScheme.surface.copy(0f),
|
containerColor = Color.Transparent,
|
||||||
scrollBehavior = null,
|
scrollBehavior = scrollBehavior,
|
||||||
isTopBarScrolled = listState.canScrollBackward,
|
isTopBarScrolled = null,
|
||||||
|
|
||||||
content1NavigationIcon = {
|
content1NavigationIcon = {
|
||||||
if (
|
if (
|
||||||
|
|
|
||||||
|
|
@ -33,14 +33,12 @@ import ua.acclorite.book_story.presentation.screens.library.data.LibraryEvent
|
||||||
* Tab row, either scrollable or static, depends on screen width.
|
* Tab row, either scrollable or static, depends on screen width.
|
||||||
*
|
*
|
||||||
* @param onEvent Event used to Scroll to Page.
|
* @param onEvent Event used to Scroll to Page.
|
||||||
* @param itemCountBackgroundColor Item count background color.
|
|
||||||
* @param books The list of all books.
|
* @param books The list of all books.
|
||||||
* @param pagerState [PagerState].
|
* @param pagerState [PagerState].
|
||||||
*/
|
*/
|
||||||
@Composable
|
@Composable
|
||||||
fun LibraryTabRow(
|
fun LibraryTabRow(
|
||||||
onEvent: (LibraryEvent) -> Unit,
|
onEvent: (LibraryEvent) -> Unit,
|
||||||
itemCountBackgroundColor: Color,
|
|
||||||
books: List<CategorizedBooks>,
|
books: List<CategorizedBooks>,
|
||||||
pagerState: PagerState
|
pagerState: PagerState
|
||||||
) {
|
) {
|
||||||
|
|
@ -115,7 +113,7 @@ fun LibraryTabRow(
|
||||||
text = tabItem.second.toString(),
|
text = tabItem.second.toString(),
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.background(
|
.background(
|
||||||
itemCountBackgroundColor,
|
MaterialTheme.colorScheme.surfaceContainer,
|
||||||
MaterialTheme.shapes.medium
|
MaterialTheme.shapes.medium
|
||||||
)
|
)
|
||||||
.padding(horizontal = 8.dp, vertical = 4.dp),
|
.padding(horizontal = 8.dp, vertical = 4.dp),
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,5 @@
|
||||||
package ua.acclorite.book_story.presentation.screens.library.components
|
package ua.acclorite.book_story.presentation.screens.library.components
|
||||||
|
|
||||||
import androidx.compose.animation.animateColorAsState
|
|
||||||
import androidx.compose.animation.core.Spring
|
|
||||||
import androidx.compose.animation.core.spring
|
|
||||||
import androidx.compose.foundation.background
|
import androidx.compose.foundation.background
|
||||||
import androidx.compose.foundation.layout.Column
|
import androidx.compose.foundation.layout.Column
|
||||||
import androidx.compose.foundation.layout.Row
|
import androidx.compose.foundation.layout.Row
|
||||||
|
|
@ -171,20 +168,12 @@ fun LibraryTopBar(
|
||||||
},
|
},
|
||||||
content3Actions = {
|
content3Actions = {
|
||||||
MoreDropDown()
|
MoreDropDown()
|
||||||
},
|
}
|
||||||
customContent = {
|
)
|
||||||
LibraryTabRow(
|
LibraryTabRow(
|
||||||
onEvent = onEvent,
|
onEvent = onEvent,
|
||||||
books = state.value.categorizedBooks,
|
books = state.value.categorizedBooks,
|
||||||
itemCountBackgroundColor = animateColorAsState(
|
|
||||||
if (state.value.hasSelectedItems) MaterialTheme.colorScheme.surfaceContainerHighest
|
|
||||||
else MaterialTheme.colorScheme.surfaceContainer,
|
|
||||||
animationSpec = spring(stiffness = Spring.StiffnessMediumLow),
|
|
||||||
label = stringResource(id = R.string.top_app_bar_anim_content_desc)
|
|
||||||
).value,
|
|
||||||
pagerState = pagerState
|
pagerState = pagerState
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue