@@ -5,19 +5,17 @@ import androidx.compose.animation.core.spring
5
5
import androidx.compose.foundation.layout.Arrangement
6
6
import androidx.compose.foundation.layout.Column
7
7
import androidx.compose.foundation.layout.ColumnScope
8
- import androidx.compose.foundation.layout.Row
9
- import androidx.compose.foundation.layout.Spacer
10
8
import androidx.compose.foundation.layout.fillMaxSize
11
9
import androidx.compose.foundation.layout.fillMaxWidth
12
10
import androidx.compose.foundation.layout.padding
13
11
import androidx.compose.foundation.rememberScrollState
14
12
import androidx.compose.foundation.verticalScroll
15
13
import androidx.compose.material.icons.Icons
14
+ import androidx.compose.material.icons.outlined.Cancel
15
+ import androidx.compose.material.icons.outlined.InstallMobile
16
16
import androidx.compose.material.icons.outlined.Update
17
17
import androidx.compose.material3.AlertDialog
18
- import androidx.compose.material3.Button
19
18
import androidx.compose.material3.ExperimentalMaterial3Api
20
- import androidx.compose.material3.HorizontalDivider
21
19
import androidx.compose.material3.Icon
22
20
import androidx.compose.material3.LinearProgressIndicator
23
21
import androidx.compose.material3.MaterialTheme
@@ -28,16 +26,15 @@ import androidx.compose.material3.TopAppBarDefaults
28
26
import androidx.compose.material3.rememberTopAppBarState
29
27
import androidx.compose.runtime.Composable
30
28
import androidx.compose.runtime.Stable
31
- import androidx.compose.ui.Alignment
32
29
import androidx.compose.ui.Modifier
33
30
import androidx.compose.ui.input.nestedscroll.nestedScroll
34
31
import androidx.compose.ui.platform.LocalContext
35
32
import androidx.compose.ui.res.stringResource
36
33
import androidx.compose.ui.unit.dp
37
- import app.revanced.manager.BuildConfig
38
34
import app.revanced.manager.R
39
35
import app.revanced.manager.network.dto.ReVancedAsset
40
36
import app.revanced.manager.ui.component.AppTopBar
37
+ import app.revanced.manager.ui.component.haptics.HapticExtendedFloatingActionButton
41
38
import app.revanced.manager.ui.component.settings.Changelog
42
39
import app.revanced.manager.ui.viewmodel.UpdateViewModel
43
40
import app.revanced.manager.ui.viewmodel.UpdateViewModel.State
@@ -60,37 +57,81 @@ fun UpdateScreen(
60
57
Scaffold (
61
58
topBar = {
62
59
AppTopBar (
63
- title = stringResource(R .string.update),
60
+ title = {
61
+ Column {
62
+ Text (stringResource(vm.state.title))
63
+
64
+ if (vm.state == State .DOWNLOADING ) {
65
+ Text (
66
+ text = " ${vm.downloadedSize.div(1000000 )} MB / ${
67
+ vm.totalSize.div(1000000 )
68
+ } MB (${vm.downloadProgress.times(100 ).toInt()} %)" ,
69
+ style = MaterialTheme .typography.bodySmall,
70
+ color = MaterialTheme .colorScheme.outline
71
+ )
72
+ }
73
+ }
74
+ },
64
75
scrollBehavior = scrollBehavior,
65
76
onBackClick = onBackClick
66
77
)
67
78
},
79
+ floatingActionButton = {
80
+ val buttonConfig = when (vm.state) {
81
+ State .CAN_DOWNLOAD -> Triple (
82
+ { vm.downloadUpdate() },
83
+ R .string.download,
84
+ Icons .Outlined .InstallMobile
85
+ )
86
+
87
+ State .DOWNLOADING -> Triple (onBackClick, R .string.cancel, Icons .Outlined .Cancel )
88
+ State .CAN_INSTALL -> Triple (
89
+ { vm.installUpdate() },
90
+ R .string.install_app,
91
+ Icons .Outlined .InstallMobile
92
+ )
93
+
94
+ else -> null
95
+ }
96
+
97
+ buttonConfig?.let { (onClick, textRes, icon) ->
98
+ HapticExtendedFloatingActionButton (
99
+ onClick = onClick::invoke,
100
+ icon = { Icon (icon, null ) },
101
+ text = { Text (stringResource(textRes)) }
102
+ )
103
+ }
104
+
105
+ },
68
106
modifier = Modifier .nestedScroll(scrollBehavior.nestedScrollConnection),
69
107
) { paddingValues ->
70
- AnimatedVisibility (visible = vm.showInternetCheckDialog) {
71
- MeteredDownloadConfirmationDialog (
72
- onDismiss = { vm.showInternetCheckDialog = false },
73
- onDownloadAnyways = { vm.downloadUpdate(true ) }
74
- )
75
- }
76
108
Column (
77
109
modifier = Modifier
78
- .fillMaxSize()
79
- .padding(paddingValues)
80
- .padding(vertical = 16 .dp, horizontal = 24 .dp)
81
- .verticalScroll(rememberScrollState()),
82
- verticalArrangement = Arrangement .spacedBy(32 .dp)
110
+ .padding(paddingValues),
83
111
) {
84
- Header (
85
- vm.state,
86
- vm.releaseInfo,
87
- DownloadData (vm.downloadProgress, vm.downloadedSize, vm.totalSize)
88
- )
89
- vm.releaseInfo?.let { changelog ->
90
- HorizontalDivider ()
91
- Changelog (changelog)
92
- } ? : Spacer (modifier = Modifier .weight(1f ))
93
- Buttons (vm.state, vm::downloadUpdate, vm::installUpdate, onBackClick)
112
+ if (vm.state == State .DOWNLOADING )
113
+ LinearProgressIndicator (
114
+ progress = { vm.downloadProgress },
115
+ modifier = Modifier .fillMaxWidth(),
116
+ )
117
+
118
+ AnimatedVisibility (visible = vm.showInternetCheckDialog) {
119
+ MeteredDownloadConfirmationDialog (
120
+ onDismiss = { vm.showInternetCheckDialog = false },
121
+ onDownloadAnyways = { vm.downloadUpdate(true ) }
122
+ )
123
+ }
124
+ Column (
125
+ modifier = Modifier
126
+ .fillMaxSize()
127
+ .padding(16 .dp)
128
+ .verticalScroll(rememberScrollState()),
129
+ verticalArrangement = Arrangement .spacedBy(32 .dp)
130
+ ) {
131
+ vm.releaseInfo?.let { changelog ->
132
+ Changelog (changelog)
133
+ }
134
+ }
94
135
}
95
136
}
96
137
}
@@ -123,58 +164,6 @@ private fun MeteredDownloadConfirmationDialog(
123
164
)
124
165
}
125
166
126
- @Composable
127
- private fun Header (state : State , releaseInfo : ReVancedAsset ? , downloadData : DownloadData ) {
128
- Column (verticalArrangement = Arrangement .spacedBy(16 .dp)) {
129
- Text (
130
- text = stringResource(state.title),
131
- style = MaterialTheme .typography.headlineMedium
132
- )
133
- if (state == State .CAN_DOWNLOAD ) {
134
- Column {
135
- Text (
136
- text = stringResource(
137
- id = R .string.current_version,
138
- BuildConfig .VERSION_NAME
139
- ),
140
- style = MaterialTheme .typography.bodyMedium,
141
- color = MaterialTheme .colorScheme.onSurfaceVariant
142
- )
143
- releaseInfo?.version?.let {
144
- Text (
145
- text = stringResource(
146
- R .string.new_version,
147
- it.replace(" v" , " " )
148
- ),
149
- style = MaterialTheme .typography.bodyMedium,
150
- color = MaterialTheme .colorScheme.onSurfaceVariant
151
- )
152
- }
153
- }
154
- } else if (state == State .DOWNLOADING ) {
155
- LinearProgressIndicator (
156
- progress = { downloadData.downloadProgress },
157
- modifier = Modifier .fillMaxWidth(),
158
- )
159
- Text (
160
- text =
161
- " ${downloadData.downloadedSize.div(1000000 )} MB / ${
162
- downloadData.totalSize.div(
163
- 1000000
164
- )
165
- } MB (${
166
- downloadData.downloadProgress.times(
167
- 100
168
- ).toInt()
169
- } %)" ,
170
- style = MaterialTheme .typography.bodyMedium,
171
- color = MaterialTheme .colorScheme.outline,
172
- modifier = Modifier .align(Alignment .CenterHorizontally )
173
- )
174
- }
175
- }
176
- }
177
-
178
167
@Composable
179
168
private fun ColumnScope.Changelog (releaseInfo : ReVancedAsset ) {
180
169
val scrollState = rememberScrollState()
@@ -205,40 +194,4 @@ private fun ColumnScope.Changelog(releaseInfo: ReVancedAsset) {
205
194
publishDate = releaseInfo.createdAt.relativeTime(LocalContext .current)
206
195
)
207
196
}
208
- }
209
-
210
- @Composable
211
- private fun Buttons (
212
- state : State ,
213
- onDownloadClick : () -> Unit ,
214
- onInstallClick : () -> Unit ,
215
- onBackClick : () -> Unit
216
- ) {
217
- Row (modifier = Modifier .fillMaxWidth()) {
218
- if (state.showCancel) {
219
- TextButton (
220
- onClick = onBackClick,
221
- ) {
222
- Text (text = stringResource(R .string.cancel))
223
- }
224
- }
225
- Spacer (modifier = Modifier .weight(1f ))
226
- if (state == State .CAN_DOWNLOAD ) {
227
- Button (onClick = onDownloadClick) {
228
- Text (text = stringResource(R .string.update))
229
- }
230
- } else if (state == State .CAN_INSTALL ) {
231
- Button (
232
- onClick = onInstallClick
233
- ) {
234
- Text (text = stringResource(R .string.install_app))
235
- }
236
- }
237
- }
238
- }
239
-
240
- data class DownloadData (
241
- val downloadProgress : Float ,
242
- val downloadedSize : Long ,
243
- val totalSize : Long
244
- )
197
+ }
0 commit comments