Skip to content

Commit 403e70c

Browse files
committed
feat: Add progress tracking to update download
1 parent d9b6916 commit 403e70c

File tree

4 files changed

+33
-17
lines changed

4 files changed

+33
-17
lines changed

app/src/main/java/app/revenge/manager/domain/manager/DownloadManager.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@ class DownloadManager(
2929
onProgressUpdate
3030
)
3131

32-
suspend fun downloadUpdate(url: String, out: File) {
33-
download(url, out) {
34-
/* TODO: Update a progress bar in the update dialog */
32+
suspend fun downloadUpdate(url: String, out: File, onProgressUpdate: (Float?) -> Unit) {
33+
download(url, out) { progress ->
34+
onProgressUpdate(progress)
3535
}
3636
}
3737

app/src/main/java/app/revenge/manager/ui/screen/home/HomeScreen.kt

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package app.revenge.manager.ui.screen.home
22

33
import androidx.compose.animation.AnimatedVisibility
4-
import androidx.compose.foundation.ExperimentalFoundationApi
54
import androidx.compose.foundation.basicMarquee
65
import androidx.compose.foundation.layout.Arrangement
76
import androidx.compose.foundation.layout.Column
@@ -28,7 +27,10 @@ import androidx.compose.material3.Scaffold
2827
import androidx.compose.material3.Text
2928
import androidx.compose.material3.TopAppBar
3029
import androidx.compose.runtime.Composable
30+
import androidx.compose.runtime.getValue
31+
import androidx.compose.runtime.mutableStateOf
3132
import androidx.compose.runtime.remember
33+
import androidx.compose.runtime.setValue
3234
import androidx.compose.ui.Alignment
3335
import androidx.compose.ui.Modifier
3436
import androidx.compose.ui.draw.clip
@@ -37,10 +39,6 @@ import androidx.compose.ui.text.style.TextAlign
3739
import androidx.compose.ui.unit.dp
3840
import androidx.paging.compose.collectAsLazyPagingItems
3941
import app.revenge.manager.BuildConfig
40-
import cafe.adriel.voyager.core.screen.Screen
41-
import cafe.adriel.voyager.koin.getScreenModel
42-
import cafe.adriel.voyager.navigator.LocalNavigator
43-
import cafe.adriel.voyager.navigator.currentOrThrow
4442
import app.revenge.manager.R
4543
import app.revenge.manager.domain.manager.PreferenceManager
4644
import app.revenge.manager.ui.components.SegmentedButton
@@ -54,6 +52,10 @@ import app.revenge.manager.ui.widgets.updater.UpdateDialog
5452
import app.revenge.manager.utils.Constants
5553
import app.revenge.manager.utils.DiscordVersion
5654
import app.revenge.manager.utils.navigate
55+
import cafe.adriel.voyager.core.screen.Screen
56+
import cafe.adriel.voyager.koin.getScreenModel
57+
import cafe.adriel.voyager.navigator.LocalNavigator
58+
import cafe.adriel.voyager.navigator.currentOrThrow
5759
import org.koin.androidx.compose.get
5860

5961
class HomeScreen : Screen {
@@ -86,12 +88,15 @@ class HomeScreen : Screen {
8688
viewModel.release != null &&
8789
!BuildConfig.DEBUG
8890
) {
91+
var progress by remember { mutableStateOf<Float?>(null) }
92+
8993
UpdateDialog(
9094
release = viewModel.release!!,
9195
isUpdating = viewModel.isUpdating,
96+
progress = progress,
9297
onDismiss = { viewModel.showUpdateDialog = false },
9398
onConfirm = {
94-
viewModel.downloadAndInstallUpdate()
99+
viewModel.downloadAndInstallUpdate { newProgress -> progress = newProgress }
95100
}
96101
)
97102
}

app/src/main/java/app/revenge/manager/ui/viewmodel/home/HomeViewModel.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,12 +128,12 @@ class HomeViewModel(
128128
}
129129
}
130130

131-
fun downloadAndInstallUpdate() {
131+
fun downloadAndInstallUpdate(onProgressUpdate: (Float?) -> Unit) {
132132
screenModelScope.launch {
133133
val update = File(cacheDir, "update.apk")
134134
if (update.exists()) update.delete()
135135
isUpdating = true
136-
downloadManager.downloadUpdate(updateDownloadUrl!!, update)
136+
downloadManager.downloadUpdate(updateDownloadUrl!!, update, onProgressUpdate)
137137
isUpdating = false
138138

139139
val installMethod = if (prefs.installMethod == InstallMethod.SHIZUKU && !ShizukuPermissions.waitShizukuPermissions()) {

app/src/main/java/app/revenge/manager/ui/widgets/updater/UpdateDialog.kt

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import app.revenge.manager.network.dto.Release
2525
fun UpdateDialog(
2626
release: Release,
2727
isUpdating: Boolean,
28+
progress: Float?,
2829
onDismiss: () -> Unit,
2930
onConfirm: () -> Unit
3031
) {
@@ -47,12 +48,22 @@ fun UpdateDialog(
4748
color = if (isUpdating) Color.Transparent else LocalContentColor.current
4849
)
4950
if (isUpdating) {
50-
CircularProgressIndicator(
51-
strokeWidth = 3.dp,
52-
modifier = Modifier
53-
.size(24.dp)
54-
.align(Alignment.Center)
55-
)
51+
if (progress != null) {
52+
CircularProgressIndicator(
53+
progress = { progress },
54+
modifier = Modifier
55+
.size(24.dp)
56+
.align(Alignment.Center),
57+
strokeWidth = 3.dp
58+
)
59+
} else {
60+
CircularProgressIndicator(
61+
modifier = Modifier
62+
.size(24.dp)
63+
.align(Alignment.Center),
64+
strokeWidth = 3.dp
65+
)
66+
}
5667
}
5768
}
5869

0 commit comments

Comments
 (0)