Skip to content

Commit 4a761b6

Browse files
committed
refactor: Rewrite (composable) ExpandedAppBar
Much more optimized but still a bit sluggish, and still doesn't have SearchBar support
1 parent 7d0b028 commit 4a761b6

File tree

15 files changed

+924
-864
lines changed

15 files changed

+924
-864
lines changed

CHANGELOG.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ The format is simplified version of [Keep a Changelog](https://keepachangelog.co
5555
- Update dependency gradle to v8.12
5656
- Update user agent (@Hiirbaf)
5757
- Update serialization to v1.8.1
58-
- Update dependency io.github.fornewid:material-motion-compose-core to v1.2.1
58+
- Update dependency io.github.fornewid:material-motion-compose-core to v2.0.1
5959
- Update lifecycle to v2.9.0
6060
- Update dependency org.jsoup:jsoup to v1.21.2
6161
- Update dependency org.jetbrains.kotlinx:kotlinx-collections-immutable to v0.4.0
@@ -72,13 +72,13 @@ The format is simplified version of [Keep a Changelog](https://keepachangelog.co
7272
- Update dependency androidx.sqlite:sqlite to v2.5.1
7373
- Update dependency androidx.recyclerview:recyclerview to v1.4.0
7474
- Update dependency androidx.core:core-ktx to v1.16.0
75-
- Update dependency androidx.compose:compose-bom to v2025.05.01
75+
- Update dependency androidx.compose:compose-bom to v2025.11.00
7676
- Update aboutlibraries to v11.6.3
7777
- Update plugin kotlinter to v5.1.0
7878
- Update plugin gradle-versions to v0.52.0
7979
- Update okhttp monorepo to v5.0.0-alpha.16
80-
- Update moko to v0.24.5
81-
- Update kotlin monorepo to v2.1.21
80+
- Update moko to v0.25.1
81+
- Update kotlin monorepo to v2.2.21
8282
- Update dependency org.jetbrains.kotlinx:kotlinx-coroutines-bom to v1.10.2
8383
- Update dependency me.zhanghai.android.libarchive:library to v1.1.5
8484
- Update dependency io.insert-koin:koin-bom to v4.0.4
@@ -89,6 +89,7 @@ The format is simplified version of [Keep a Changelog](https://keepachangelog.co
8989
- Update null2264/actions digest to 363cb9c
9090
- Update dependency io.github.pdvrieze.xmlutil:core-android to v0.91.1
9191
- Improve X-Requested-With spoof to support newer WebView versions (@Hiirbaf)
92+
- Update agp to v8.10.1
9293

9394
## [1.9.7.3]
9495

app/src/main/java/yokai/presentation/Scaffold.kt

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,7 @@ import androidx.compose.material.icons.automirrored.filled.ArrowBack
99
import androidx.compose.material3.MaterialTheme
1010
import androidx.compose.material3.Scaffold
1111
import androidx.compose.material3.Text
12-
import androidx.compose.material3.TopAppBar
13-
import androidx.compose.material3.TopAppBarDefaults
1412
import androidx.compose.material3.TopAppBarDefaults.topAppBarColors
15-
import androidx.compose.material3.TopAppBarScrollBehavior
16-
import androidx.compose.material3.rememberTopAppBarState
1713
import androidx.compose.runtime.Composable
1814
import androidx.compose.runtime.SideEffect
1915
import androidx.compose.ui.Modifier
@@ -27,14 +23,17 @@ import androidx.core.view.WindowInsetsControllerCompat
2723
import dev.icerock.moko.resources.compose.stringResource
2824
import yokai.i18n.MR
2925
import yokai.presentation.component.ToolTipButton
30-
import yokai.presentation.core.ExpandedAppBar
26+
import yokai.presentation.core.JayAppBarScrollBehavior
27+
import yokai.presentation.core.JayExpandedTopAppBar
28+
import yokai.presentation.core.JayTopAppBar
29+
import yokai.presentation.core.enterAlwaysAppBarScrollBehavior
3130

3231
@Composable
3332
fun YokaiScaffold(
3433
onNavigationIconClicked: () -> Unit,
3534
modifier: Modifier = Modifier,
3635
title: String = "",
37-
scrollBehavior: TopAppBarScrollBehavior? = null,
36+
scrollBehavior: JayAppBarScrollBehavior? = null,
3837
fab: @Composable () -> Unit = {},
3938
navigationIcon: ImageVector = Icons.AutoMirrored.Filled.ArrowBack,
4039
navigationIconLabel: String = stringResource(MR.strings.back),
@@ -43,7 +42,7 @@ fun YokaiScaffold(
4342
snackbarHost: @Composable () -> Unit = {},
4443
content: @Composable (PaddingValues) -> Unit,
4544
) {
46-
val scrollBehaviorOrDefault = scrollBehavior ?: TopAppBarDefaults.enterAlwaysScrollBehavior(state = rememberTopAppBarState())
45+
val scrollBehaviorOrDefault = scrollBehavior ?: enterAlwaysAppBarScrollBehavior()
4746
val view = LocalView.current
4847
val useDarkIcons = MaterialTheme.colorScheme.surface.luminance() > .5
4948
val (color, scrolledColor) = getTopAppBarColor(title)
@@ -61,7 +60,7 @@ fun YokaiScaffold(
6160
floatingActionButton = fab,
6261
topBar = {
6362
when (appBarType) {
64-
AppBarType.SMALL -> TopAppBar(
63+
AppBarType.SMALL -> JayTopAppBar(
6564
title = {
6665
Text(text = title)
6766
},
@@ -80,7 +79,7 @@ fun YokaiScaffold(
8079
scrollBehavior = scrollBehaviorOrDefault,
8180
actions = actions,
8281
)
83-
AppBarType.LARGE -> ExpandedAppBar(
82+
AppBarType.LARGE -> JayExpandedTopAppBar(
8483
title = {
8584
Text(text = title)
8685
},

app/src/main/java/yokai/presentation/extension/repo/ExtensionRepoScreen.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ import yokai.presentation.AppBarType
4141
import yokai.presentation.YokaiScaffold
4242
import yokai.presentation.component.EmptyScreen
4343
import yokai.presentation.component.ToolTipButton
44+
import yokai.presentation.core.enterAlwaysCollapsedAppBarScrollBehavior
4445
import yokai.presentation.extension.repo.component.ExtensionRepoInput
4546
import yokai.presentation.extension.repo.component.ExtensionRepoItem
4647
import yokai.util.Screen
@@ -67,8 +68,7 @@ class ExtensionRepoScreen(
6768
onNavigationIconClicked = onBackPress,
6869
title = title,
6970
appBarType = AppBarType.SMALL,
70-
scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior(
71-
state = rememberTopAppBarState(),
71+
scrollBehavior = enterAlwaysCollapsedAppBarScrollBehavior(
7272
canScroll = { listState.firstVisibleItemIndex > 0 || listState.firstVisibleItemScrollOffset > 0 },
7373
),
7474
actions = {

app/src/main/java/yokai/presentation/settings/SettingsCommonWidget.kt

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ import androidx.compose.foundation.lazy.LazyColumn
77
import androidx.compose.foundation.lazy.LazyListState
88
import androidx.compose.foundation.lazy.items
99
import androidx.compose.foundation.lazy.rememberLazyListState
10-
import androidx.compose.material3.TopAppBarScrollBehavior
11-
import androidx.compose.material3.rememberTopAppBarState
1210
import androidx.compose.runtime.Composable
1311
import androidx.compose.runtime.LaunchedEffect
1412
import androidx.compose.runtime.getValue
@@ -29,15 +27,16 @@ import yokai.presentation.component.Gap
2927
import yokai.presentation.component.preference.Preference
3028
import yokai.presentation.component.preference.PreferenceItem
3129
import yokai.presentation.component.preference.widget.PreferenceGroupHeader
30+
import yokai.presentation.core.JayAppBarScrollBehavior
3231
import yokai.presentation.core.drawVerticalScrollbar
33-
import yokai.presentation.core.enterAlwaysCollapsedScrollBehavior
32+
import yokai.presentation.core.enterAlwaysCollapsedAppBarScrollBehavior
3433

3534
@Composable
3635
fun SettingsScaffold(
3736
title: String,
3837
appBarType: AppBarType? = null,
3938
appBarActions: @Composable RowScope.() -> Unit = {},
40-
appBarScrollBehavior: TopAppBarScrollBehavior? = null,
39+
appBarScrollBehavior: JayAppBarScrollBehavior? = null,
4140
snackbarHost: @Composable () -> Unit = {},
4241
content: @Composable (PaddingValues) -> Unit,
4342
) {
@@ -73,10 +72,8 @@ fun SettingsScaffold(
7372
title = title,
7473
appBarType = appBarType,
7574
appBarActions = appBarActions,
76-
appBarScrollBehavior = enterAlwaysCollapsedScrollBehavior(
77-
state = rememberTopAppBarState(),
75+
appBarScrollBehavior = enterAlwaysCollapsedAppBarScrollBehavior(
7876
canScroll = { listState.canScrollForward || listState.canScrollBackward },
79-
isAtTop = { listState.firstVisibleItemIndex == 0 && listState.firstVisibleItemScrollOffset == 0 },
8077
),
8178
) { innerPadding ->
8279
PreferenceScreen(

app/src/main/java/yokai/presentation/settings/screen/about/AboutLibraryLicenseScreen.kt

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@ import androidx.compose.foundation.rememberScrollState
66
import androidx.compose.foundation.verticalScroll
77
import androidx.compose.material.icons.Icons
88
import androidx.compose.material.icons.outlined.Public
9-
import androidx.compose.material3.TopAppBarDefaults
10-
import androidx.compose.material3.rememberTopAppBarState
119
import androidx.compose.runtime.Composable
1210
import androidx.compose.ui.Modifier
1311
import androidx.compose.ui.platform.LocalUriHandler
@@ -23,6 +21,7 @@ import yokai.i18n.MR
2321
import yokai.presentation.AppBarType
2422
import yokai.presentation.YokaiScaffold
2523
import yokai.presentation.component.ToolTipButton
24+
import yokai.presentation.core.enterAlwaysAppBarScrollBehavior
2625
import yokai.util.Screen
2726

2827
class AboutLibraryLicenseScreen(
@@ -45,9 +44,7 @@ class AboutLibraryLicenseScreen(
4544
},
4645
title = name,
4746
appBarType = AppBarType.SMALL,
48-
scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior(
49-
state = rememberTopAppBarState(),
50-
),
47+
scrollBehavior = enterAlwaysAppBarScrollBehavior(),
5148
actions = {
5249
if (website != null) {
5350
ToolTipButton(

app/src/main/java/yokai/presentation/settings/screen/about/AboutLicenseScreen.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package yokai.presentation.settings.screen.about
22

33
import androidx.compose.foundation.layout.fillMaxSize
4-
import androidx.compose.material3.TopAppBarDefaults
54
import androidx.compose.runtime.Composable
65
import androidx.compose.ui.Modifier
76
import cafe.adriel.voyager.navigator.LocalNavigator
@@ -13,6 +12,7 @@ import eu.kanade.tachiyomi.util.compose.currentOrThrow
1312
import yokai.i18n.MR
1413
import yokai.presentation.AppBarType
1514
import yokai.presentation.YokaiScaffold
15+
import yokai.presentation.core.pinnedAppBarScrollBehavior
1616
import yokai.util.Screen
1717

1818
class AboutLicenseScreen : Screen() {
@@ -25,7 +25,7 @@ class AboutLicenseScreen : Screen() {
2525
onNavigationIconClicked = backPress,
2626
title = stringResource(MR.strings.open_source_licenses),
2727
appBarType = AppBarType.SMALL,
28-
scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(),
28+
scrollBehavior = pinnedAppBarScrollBehavior(),
2929
) { innerPadding ->
3030
LibrariesContainer(
3131
modifier = Modifier.fillMaxSize(),

app/src/main/java/yokai/presentation/settings/screen/about/AboutScreen.kt

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import androidx.compose.material.icons.outlined.Public
1818
import androidx.compose.material3.HorizontalDivider
1919
import androidx.compose.material3.SnackbarHost
2020
import androidx.compose.material3.SnackbarHostState
21-
import androidx.compose.material3.rememberTopAppBarState
2221
import androidx.compose.runtime.Composable
2322
import androidx.compose.runtime.remember
2423
import androidx.compose.runtime.rememberCoroutineScope
@@ -62,7 +61,7 @@ import yokai.domain.DialogHostState
6261
import yokai.i18n.MR
6362
import yokai.presentation.component.preference.widget.TextPreferenceWidget
6463
import yokai.presentation.core.components.LinkIcon
65-
import yokai.presentation.core.enterAlwaysCollapsedScrollBehavior
64+
import yokai.presentation.core.enterAlwaysCollapsedAppBarScrollBehavior
6665
import yokai.presentation.core.icons.CustomIcons
6766
import yokai.presentation.core.icons.Discord
6867
import yokai.presentation.core.icons.GitHub
@@ -113,10 +112,8 @@ class AboutScreen : Screen() {
113112
snackbarHost = {
114113
SnackbarHost(hostState = snackbarHostState)
115114
},
116-
appBarScrollBehavior = enterAlwaysCollapsedScrollBehavior(
117-
state = rememberTopAppBarState(),
115+
appBarScrollBehavior = enterAlwaysCollapsedAppBarScrollBehavior(
118116
canScroll = { listState.canScrollForward || listState.canScrollBackward },
119-
isAtTop = { listState.firstVisibleItemIndex == 0 && listState.firstVisibleItemScrollOffset == 0 },
120117
),
121118
content = { contentPadding ->
122119
LazyColumn(

buildSrc/src/main/kotlin/yokai/build/ProjectExtensions.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.compose.compiler.gradle.ComposeCompilerGradlePluginE
1717
import org.jetbrains.kotlin.compose.compiler.gradle.ComposeFeatureFlag
1818
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
1919
import java.io.File
20+
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
2021

2122
val Project.androidx get() = the<LibrariesForAndroidx>()
2223
val Project.compose get() = the<LibrariesForCompose>()
@@ -41,8 +42,8 @@ internal fun Project.configureAndroid(commonExtension: CommonExtension<*, *, *,
4142
}
4243
}
4344
tasks.withType<KotlinCompile>().configureEach {
44-
kotlinOptions {
45-
jvmTarget = AndroidConfig.JavaVersion.toString()
45+
compilerOptions {
46+
jvmTarget.set(JvmTarget.fromTarget(AndroidConfig.JavaVersion.toString()))
4647
// freeCompilerArgs += "-opt-in=kotlin.RequiresOptIn"
4748
// freeCompilerArgs += "-Xcontext-receivers"
4849
// Treat all Kotlin warnings as errors (disabled by default)

gradle/androidx.versions.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[versions]
22
activity = "1.9.3"
3-
agp = "8.7.3"
3+
agp = "8.10.1"
44
lifecycle = "2.9.0"
55

66
[libraries]

gradle/compose.versions.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
[versions]
2-
compose = "2025.05.01"
2+
compose = "2025.11.00"
33

44
[libraries]
55
bom = { module = "androidx.compose:compose-bom", version.ref = "compose" }
66
animation = { module = "androidx.compose.animation:animation" }
77
foundation = { module = "androidx.compose.foundation:foundation" }
88
material3 = { module = "androidx.compose.material3:material3" }
9-
material-motion = { module = "io.github.fornewid:material-motion-compose-core", version = "1.2.1" }
9+
material-motion = { module = "io.github.fornewid:material-motion-compose-core", version = "2.0.1" }
1010
ui-tooling = { module = "androidx.compose.ui:ui-tooling" }
1111
ui-tooling-preview = { module = "androidx.compose.ui:ui-tooling-preview" }
1212
icons = { module = "androidx.compose.material:material-icons-extended" }

0 commit comments

Comments
 (0)