Skip to content

Commit 1092188

Browse files
authored
feat: TopAppBar scroll behavior (#2397)
1 parent f348eba commit 1092188

18 files changed

+215
-31
lines changed

app/src/main/java/app/revanced/manager/ui/component/AppScaffold.kt

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,20 @@ import androidx.compose.foundation.layout.PaddingValues
44
import androidx.compose.foundation.layout.RowScope
55
import androidx.compose.material.icons.Icons
66
import androidx.compose.material.icons.automirrored.filled.ArrowBack
7-
import androidx.compose.material3.*
7+
import androidx.compose.material3.ExperimentalMaterial3Api
8+
import androidx.compose.material3.Icon
9+
import androidx.compose.material3.IconButton
10+
import androidx.compose.material3.MaterialTheme
11+
import androidx.compose.material3.Scaffold
12+
import androidx.compose.material3.Text
13+
import androidx.compose.material3.TopAppBar
14+
import androidx.compose.material3.TopAppBarDefaults
15+
import androidx.compose.material3.TopAppBarScrollBehavior
16+
import androidx.compose.material3.rememberTopAppBarState
17+
import androidx.compose.material3.surfaceColorAtElevation
818
import androidx.compose.runtime.Composable
919
import androidx.compose.ui.Modifier
20+
import androidx.compose.ui.graphics.Color
1021
import androidx.compose.ui.input.nestedscroll.nestedScroll
1122
import androidx.compose.ui.res.stringResource
1223
import androidx.compose.ui.unit.dp
@@ -44,9 +55,14 @@ fun AppTopBar(
4455
)
4556
},
4657
actions: @Composable (RowScope.() -> Unit) = {},
47-
scrollBehavior: TopAppBarScrollBehavior? = null
58+
scrollBehavior: TopAppBarScrollBehavior? = null,
59+
applyContainerColor: Boolean = false
4860
) {
49-
val containerColor = MaterialTheme.colorScheme.surfaceColorAtElevation(3.0.dp)
61+
val containerColor = if (applyContainerColor) {
62+
MaterialTheme.colorScheme.surfaceColorAtElevation(3.0.dp)
63+
} else {
64+
Color.Unspecified
65+
}
5066

5167
TopAppBar(
5268
title = { Text(title) },

app/src/main/java/app/revanced/manager/ui/screen/AppSelectorScreen.kt

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,26 @@ package app.revanced.manager.ui.screen
33
import androidx.activity.compose.rememberLauncherForActivityResult
44
import androidx.activity.result.contract.ActivityResultContracts
55
import androidx.compose.foundation.clickable
6-
import androidx.compose.foundation.layout.*
6+
import androidx.compose.foundation.layout.Arrangement
7+
import androidx.compose.foundation.layout.Box
8+
import androidx.compose.foundation.layout.Column
9+
import androidx.compose.foundation.layout.fillMaxSize
10+
import androidx.compose.foundation.layout.padding
11+
import androidx.compose.foundation.layout.size
712
import androidx.compose.foundation.lazy.items
813
import androidx.compose.material.icons.Icons
914
import androidx.compose.material.icons.filled.Storage
1015
import androidx.compose.material.icons.outlined.Search
11-
import androidx.compose.material3.*
16+
import androidx.compose.material3.ExperimentalMaterial3Api
17+
import androidx.compose.material3.HorizontalDivider
18+
import androidx.compose.material3.Icon
19+
import androidx.compose.material3.IconButton
20+
import androidx.compose.material3.ListItem
21+
import androidx.compose.material3.MaterialTheme
22+
import androidx.compose.material3.Scaffold
23+
import androidx.compose.material3.Text
24+
import androidx.compose.material3.TopAppBarDefaults
25+
import androidx.compose.material3.rememberTopAppBarState
1226
import androidx.compose.runtime.Composable
1327
import androidx.compose.runtime.getValue
1428
import androidx.compose.runtime.mutableStateOf
@@ -17,6 +31,7 @@ import androidx.compose.runtime.saveable.rememberSaveable
1731
import androidx.compose.runtime.setValue
1832
import androidx.compose.ui.Alignment
1933
import androidx.compose.ui.Modifier
34+
import androidx.compose.ui.input.nestedscroll.nestedScroll
2035
import androidx.compose.ui.res.pluralStringResource
2136
import androidx.compose.ui.res.stringResource
2237
import androidx.compose.ui.unit.dp
@@ -138,18 +153,22 @@ fun AppSelectorScreen(
138153
}
139154
}
140155

156+
val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState())
157+
141158
Scaffold(
142159
topBar = {
143160
AppTopBar(
144161
title = stringResource(R.string.select_app),
162+
scrollBehavior = scrollBehavior,
145163
onBackClick = onBackClick,
146164
actions = {
147165
IconButton(onClick = { search = true }) {
148166
Icon(Icons.Outlined.Search, stringResource(R.string.search))
149167
}
150168
}
151169
)
152-
}
170+
},
171+
modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
153172
) { paddingValues ->
154173
LazyColumnWithScrollbar(
155174
modifier = Modifier

app/src/main/java/app/revanced/manager/ui/screen/DashboardScreen.kt

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,46 @@ import android.provider.Settings
77
import androidx.activity.compose.BackHandler
88
import androidx.activity.compose.rememberLauncherForActivityResult
99
import androidx.compose.foundation.clickable
10-
import androidx.compose.foundation.layout.*
10+
import androidx.compose.foundation.layout.Arrangement
11+
import androidx.compose.foundation.layout.Column
12+
import androidx.compose.foundation.layout.fillMaxSize
13+
import androidx.compose.foundation.layout.padding
14+
import androidx.compose.foundation.layout.size
1115
import androidx.compose.foundation.pager.HorizontalPager
1216
import androidx.compose.foundation.pager.rememberPagerState
1317
import androidx.compose.material.icons.Icons
1418
import androidx.compose.material.icons.filled.Add
1519
import androidx.compose.material.icons.filled.BatteryAlert
1620
import androidx.compose.material.icons.filled.Close
17-
import androidx.compose.material.icons.outlined.*
18-
import androidx.compose.material3.*
19-
import androidx.compose.runtime.*
21+
import androidx.compose.material.icons.outlined.Apps
22+
import androidx.compose.material.icons.outlined.BugReport
23+
import androidx.compose.material.icons.outlined.DeleteOutline
24+
import androidx.compose.material.icons.outlined.Download
25+
import androidx.compose.material.icons.outlined.Refresh
26+
import androidx.compose.material.icons.outlined.Settings
27+
import androidx.compose.material.icons.outlined.Source
28+
import androidx.compose.material.icons.outlined.Update
29+
import androidx.compose.material.icons.outlined.WarningAmber
30+
import androidx.compose.material3.Badge
31+
import androidx.compose.material3.BadgedBox
32+
import androidx.compose.material3.ExperimentalMaterial3Api
33+
import androidx.compose.material3.Icon
34+
import androidx.compose.material3.IconButton
35+
import androidx.compose.material3.MaterialTheme
36+
import androidx.compose.material3.Scaffold
37+
import androidx.compose.material3.TabRow
38+
import androidx.compose.material3.Text
39+
import androidx.compose.material3.TextButton
40+
import androidx.compose.material3.surfaceColorAtElevation
41+
import androidx.compose.runtime.Composable
42+
import androidx.compose.runtime.LaunchedEffect
43+
import androidx.compose.runtime.derivedStateOf
44+
import androidx.compose.runtime.getValue
45+
import androidx.compose.runtime.mutableStateOf
46+
import androidx.compose.runtime.remember
47+
import androidx.compose.runtime.rememberCoroutineScope
2048
import androidx.compose.runtime.saveable.rememberSaveable
49+
import androidx.compose.runtime.setValue
2150
import androidx.compose.ui.Modifier
2251
import androidx.compose.ui.graphics.vector.ImageVector
2352
import androidx.compose.ui.platform.LocalContext
@@ -33,9 +62,9 @@ import app.revanced.manager.ui.component.AutoUpdatesDialog
3362
import app.revanced.manager.ui.component.AvailableUpdateDialog
3463
import app.revanced.manager.ui.component.NotificationCard
3564
import app.revanced.manager.ui.component.bundle.BundleTopBar
65+
import app.revanced.manager.ui.component.bundle.ImportPatchBundleDialog
3666
import app.revanced.manager.ui.component.haptics.HapticFloatingActionButton
3767
import app.revanced.manager.ui.component.haptics.HapticTab
38-
import app.revanced.manager.ui.component.bundle.ImportPatchBundleDialog
3968
import app.revanced.manager.ui.viewmodel.DashboardViewModel
4069
import app.revanced.manager.util.RequestInstallAppsContract
4170
import app.revanced.manager.util.toast
@@ -181,7 +210,8 @@ fun DashboardScreen(
181210
IconButton(onClick = onSettingsClick) {
182211
Icon(Icons.Outlined.Settings, stringResource(R.string.settings))
183212
}
184-
}
213+
},
214+
applyContainerColor = true
185215
)
186216
}
187217
},

app/src/main/java/app/revanced/manager/ui/screen/InstalledAppInfoScreen.kt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ import androidx.compose.material3.MaterialTheme
2121
import androidx.compose.material3.Scaffold
2222
import androidx.compose.material3.Text
2323
import androidx.compose.material3.TextButton
24+
import androidx.compose.material3.TopAppBarDefaults
25+
import androidx.compose.material3.rememberTopAppBarState
2426
import androidx.compose.runtime.Composable
2527
import androidx.compose.runtime.SideEffect
2628
import androidx.compose.runtime.getValue
@@ -29,6 +31,7 @@ import androidx.compose.runtime.saveable.rememberSaveable
2931
import androidx.compose.runtime.setValue
3032
import androidx.compose.ui.Modifier
3133
import androidx.compose.ui.draw.clip
34+
import androidx.compose.ui.input.nestedscroll.nestedScroll
3235
import androidx.compose.ui.platform.LocalContext
3336
import androidx.compose.ui.res.pluralStringResource
3437
import androidx.compose.ui.res.stringResource
@@ -64,13 +67,17 @@ fun InstalledAppInfoScreen(
6467
onConfirm = { viewModel.uninstall() }
6568
)
6669

70+
val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState())
71+
6772
Scaffold(
6873
topBar = {
6974
AppTopBar(
7075
title = stringResource(R.string.app_info),
76+
scrollBehavior = scrollBehavior,
7177
onBackClick = onBackClick
7278
)
73-
}
79+
},
80+
modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
7481
) { paddingValues ->
7582
ColumnWithScrollbar(
7683
modifier = Modifier

app/src/main/java/app/revanced/manager/ui/screen/PatcherScreen.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,9 +121,10 @@ fun PatcherScreen(
121121
}
122122

123123
AppScaffold(
124-
topBar = {
124+
topBar = { scrollBehavior ->
125125
AppTopBar(
126126
title = stringResource(R.string.patcher),
127+
scrollBehavior = scrollBehavior,
127128
onBackClick = ::leaveScreen
128129
)
129130
},

app/src/main/java/app/revanced/manager/ui/screen/PatchesSelectorScreen.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,8 @@ import app.revanced.manager.ui.component.haptics.HapticExtendedFloatingActionBut
7676
import app.revanced.manager.ui.component.haptics.HapticTab
7777
import app.revanced.manager.ui.component.patches.OptionItem
7878
import app.revanced.manager.ui.viewmodel.PatchesSelectorViewModel
79-
import app.revanced.manager.ui.viewmodel.PatchesSelectorViewModel.Companion.SHOW_UNSUPPORTED
8079
import app.revanced.manager.ui.viewmodel.PatchesSelectorViewModel.Companion.SHOW_UNIVERSAL
80+
import app.revanced.manager.ui.viewmodel.PatchesSelectorViewModel.Companion.SHOW_UNSUPPORTED
8181
import app.revanced.manager.util.Options
8282
import app.revanced.manager.util.PatchSelection
8383
import app.revanced.manager.util.isScrollingUp

app/src/main/java/app/revanced/manager/ui/screen/RequiredOptionsScreen.kt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,16 @@ import androidx.compose.material3.MaterialTheme
1515
import androidx.compose.material3.Scaffold
1616
import androidx.compose.material3.ScrollableTabRow
1717
import androidx.compose.material3.Text
18+
import androidx.compose.material3.TopAppBarDefaults
19+
import androidx.compose.material3.rememberTopAppBarState
1820
import androidx.compose.material3.surfaceColorAtElevation
1921
import androidx.compose.runtime.Composable
2022
import androidx.compose.runtime.derivedStateOf
2123
import androidx.compose.runtime.getValue
2224
import androidx.compose.runtime.remember
2325
import androidx.compose.runtime.rememberCoroutineScope
2426
import androidx.compose.ui.Modifier
27+
import androidx.compose.ui.input.nestedscroll.nestedScroll
2528
import androidx.compose.ui.res.stringResource
2629
import androidx.compose.ui.unit.dp
2730
import androidx.lifecycle.compose.collectAsStateWithLifecycle
@@ -66,10 +69,13 @@ fun RequiredOptionsScreen(
6669
}
6770
val composableScope = rememberCoroutineScope()
6871

72+
val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState())
73+
6974
Scaffold(
7075
topBar = {
7176
AppTopBar(
7277
title = stringResource(R.string.required_options_screen),
78+
scrollBehavior = scrollBehavior,
7379
onBackClick = onBackClick
7480
)
7581
},
@@ -90,7 +96,8 @@ fun RequiredOptionsScreen(
9096
onContinue(vm.getCustomSelection(), vm.getOptions())
9197
}
9298
)
93-
}
99+
},
100+
modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
94101
) { paddingValues ->
95102
Column(
96103
Modifier

app/src/main/java/app/revanced/manager/ui/screen/SelectedAppInfoScreen.kt

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,21 @@ import androidx.compose.foundation.lazy.items
1212
import androidx.compose.material.icons.Icons
1313
import androidx.compose.material.icons.automirrored.outlined.ArrowRight
1414
import androidx.compose.material.icons.filled.AutoFixHigh
15-
import androidx.compose.material3.*
15+
import androidx.compose.material3.ExperimentalMaterial3Api
16+
import androidx.compose.material3.Icon
17+
import androidx.compose.material3.ListItem
18+
import androidx.compose.material3.MaterialTheme
19+
import androidx.compose.material3.Scaffold
20+
import androidx.compose.material3.Text
21+
import androidx.compose.material3.TextButton
22+
import androidx.compose.material3.TopAppBarDefaults
23+
import androidx.compose.material3.rememberTopAppBarState
1624
import androidx.compose.runtime.Composable
1725
import androidx.compose.runtime.getValue
1826
import androidx.compose.runtime.remember
1927
import androidx.compose.runtime.rememberCoroutineScope
2028
import androidx.compose.ui.Modifier
29+
import androidx.compose.ui.input.nestedscroll.nestedScroll
2130
import androidx.compose.ui.platform.LocalContext
2231
import androidx.compose.ui.res.stringResource
2332
import androidx.compose.ui.unit.dp
@@ -75,10 +84,14 @@ fun SelectedAppInfoScreen(
7584
val composableScope = rememberCoroutineScope()
7685

7786
val error by vm.errorFlow.collectAsStateWithLifecycle(null)
87+
88+
val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState())
89+
7890
Scaffold(
7991
topBar = {
8092
AppTopBar(
8193
title = stringResource(R.string.app_info),
94+
scrollBehavior = scrollBehavior,
8295
onBackClick = onBackClick
8396
)
8497
},
@@ -114,7 +127,8 @@ fun SelectedAppInfoScreen(
114127
}
115128
}
116129
)
117-
}
130+
},
131+
modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
118132
) { paddingValues ->
119133
val plugins by vm.plugins.collectAsStateWithLifecycle(emptyList())
120134

app/src/main/java/app/revanced/manager/ui/screen/UpdateScreen.kt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,13 @@ import androidx.compose.material3.MaterialTheme
2424
import androidx.compose.material3.Scaffold
2525
import androidx.compose.material3.Text
2626
import androidx.compose.material3.TextButton
27+
import androidx.compose.material3.TopAppBarDefaults
28+
import androidx.compose.material3.rememberTopAppBarState
2729
import androidx.compose.runtime.Composable
2830
import androidx.compose.runtime.Stable
2931
import androidx.compose.ui.Alignment
3032
import androidx.compose.ui.Modifier
33+
import androidx.compose.ui.input.nestedscroll.nestedScroll
3134
import androidx.compose.ui.platform.LocalContext
3235
import androidx.compose.ui.res.stringResource
3336
import androidx.compose.ui.unit.dp
@@ -52,13 +55,17 @@ fun UpdateScreen(
5255
onBackClick: () -> Unit,
5356
vm: UpdateViewModel = koinViewModel()
5457
) {
58+
val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState())
59+
5560
Scaffold(
5661
topBar = {
5762
AppTopBar(
5863
title = stringResource(R.string.update),
64+
scrollBehavior = scrollBehavior,
5965
onBackClick = onBackClick
6066
)
61-
}
67+
},
68+
modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
6269
) { paddingValues ->
6370
AnimatedVisibility(visible = vm.showInternetCheckDialog) {
6471
MeteredDownloadConfirmationDialog(

app/src/main/java/app/revanced/manager/ui/screen/settings/AboutSettingsScreen.kt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,13 @@ import androidx.compose.material3.MaterialTheme
2424
import androidx.compose.material3.OutlinedCard
2525
import androidx.compose.material3.Scaffold
2626
import androidx.compose.material3.Text
27+
import androidx.compose.material3.TopAppBarDefaults
28+
import androidx.compose.material3.rememberTopAppBarState
2729
import androidx.compose.runtime.Composable
2830
import androidx.compose.runtime.remember
2931
import androidx.compose.ui.Alignment
3032
import androidx.compose.ui.Modifier
33+
import androidx.compose.ui.input.nestedscroll.nestedScroll
3134
import androidx.compose.ui.platform.LocalContext
3235
import androidx.compose.ui.res.stringResource
3336
import androidx.compose.ui.unit.dp
@@ -127,13 +130,17 @@ fun AboutSettingsScreen(
127130
)
128131
)
129132

133+
val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState())
134+
130135
Scaffold(
131136
topBar = {
132137
AppTopBar(
133138
title = stringResource(R.string.about),
139+
scrollBehavior = scrollBehavior,
134140
onBackClick = onBackClick
135141
)
136-
}
142+
},
143+
modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
137144
) { paddingValues ->
138145
ColumnWithScrollbar(
139146
modifier = Modifier

0 commit comments

Comments
 (0)