Feat: Improved updater

This commit is contained in:
wingio 2023-03-21 18:19:45 -04:00
parent 0865784c1c
commit f11ee11b5f
14 changed files with 67 additions and 97 deletions

1
.gitignore vendored
View File

@ -38,6 +38,7 @@ captures/
# IntelliJ # IntelliJ
*.iml *.iml
.idea
.idea/workspace.xml .idea/workspace.xml
.idea/tasks.xml .idea/tasks.xml
.idea/gradle.xml .idea/gradle.xml

View File

@ -1 +0,0 @@
Vendetta Manager

View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="me.schlaubi.intellij_gradle_version_checker.settings.ProjectPersistentGradleVersionSettings">
<option name="ignoreOutdatedVersion" value="true" />
</component>
</project>

View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="17" />
</component>
</project>

View File

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DiscordProjectSettings">
<option name="show" value="PROJECT_FILES" />
<option name="description" value="" />
</component>
</project>

View File

@ -1,35 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RemoteRepositoriesConfiguration">
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Maven Central repository" />
<option name="url" value="https://repo1.maven.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="jboss.community" />
<option name="name" value="JBoss Community repository" />
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
</remote-repository>
<remote-repository>
<option name="id" value="MavenRepo" />
<option name="name" value="MavenRepo" />
<option name="url" value="https://repo.maven.apache.org/maven2/" />
</remote-repository>
<remote-repository>
<option name="id" value="maven" />
<option name="name" value="maven" />
<option name="url" value="https://maven.aliucord.com/snapshots" />
</remote-repository>
<remote-repository>
<option name="id" value="Google" />
<option name="name" value="Google" />
<option name="url" value="https://dl.google.com/dl/android/maven2/" />
</remote-repository>
<remote-repository>
<option name="id" value="maven2" />
<option name="name" value="maven2" />
<option name="url" value="https://jitpack.io" />
</remote-repository>
</component>
</project>

View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="KotlinJpsPluginSettings">
<option name="version" value="1.7.20" />
</component>
</project>

View File

@ -1,5 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" project-jdk-name="jbr-17" project-jdk-type="JavaSDK" />
</project>

3
app/.gitignore vendored
View File

@ -1 +1,2 @@
/build /build
/release

View File

@ -14,8 +14,8 @@ android {
applicationId = "dev.beefers.vendetta.manager" applicationId = "dev.beefers.vendetta.manager"
minSdk = 24 minSdk = 24
targetSdk = 33 targetSdk = 33
versionCode = 1030 versionCode = 1040
versionName = "1.0.3" versionName = "1.0.4"
buildConfigField("String", "GIT_BRANCH", "\"${getCurrentBranch()}\"") buildConfigField("String", "GIT_BRANCH", "\"${getCurrentBranch()}\"")
buildConfigField("String", "GIT_COMMIT", "\"${getLatestCommit()}\"") buildConfigField("String", "GIT_COMMIT", "\"${getLatestCommit()}\"")

View File

@ -1,20 +0,0 @@
{
"version": 3,
"artifactType": {
"type": "APK",
"kind": "Directory"
},
"applicationId": "dev.beefers.vendetta.manager",
"variantName": "release",
"elements": [
{
"type": "SINGLE",
"filters": [],
"attributes": [],
"versionCode": 1030,
"versionName": "1.0.3",
"outputFile": "app-release.apk"
}
],
"elementType": "File"
}

View File

@ -42,12 +42,15 @@ class MainScreen : Screen {
topBar = { TitleBar() }, topBar = { TitleBar() },
modifier = Modifier.fillMaxSize() modifier = Modifier.fillMaxSize()
) { pv -> ) { pv ->
viewModel.release?.let { if (viewModel.showUpdateDialog && viewModel.release != null) {
if (it.tagName.toInt() > BuildConfig.VERSION_CODE) { UpdateDialog(
UpdateDialog(release = it) { release = viewModel.release!!,
isUpdating = viewModel.isUpdating,
onDismiss = { viewModel.showUpdateDialog = false },
onConfirm = {
viewModel.downloadAndInstallUpdate() viewModel.downloadAndInstallUpdate()
} }
} )
} }
HorizontalPager( HorizontalPager(

View File

@ -6,6 +6,7 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import cafe.adriel.voyager.core.model.ScreenModel import cafe.adriel.voyager.core.model.ScreenModel
import cafe.adriel.voyager.core.model.coroutineScope import cafe.adriel.voyager.core.model.coroutineScope
import dev.beefers.vendetta.manager.BuildConfig
import dev.beefers.vendetta.manager.domain.manager.DownloadManager import dev.beefers.vendetta.manager.domain.manager.DownloadManager
import dev.beefers.vendetta.manager.domain.manager.PreferenceManager import dev.beefers.vendetta.manager.domain.manager.PreferenceManager
import dev.beefers.vendetta.manager.domain.repository.RestRepository import dev.beefers.vendetta.manager.domain.repository.RestRepository
@ -26,6 +27,10 @@ class MainViewModel(
var release by mutableStateOf<Release?>(null) var release by mutableStateOf<Release?>(null)
private set private set
var showUpdateDialog by mutableStateOf(false)
var isUpdating by mutableStateOf(false)
init { init {
checkForUpdate() checkForUpdate()
} }
@ -33,6 +38,9 @@ class MainViewModel(
private fun checkForUpdate() { private fun checkForUpdate() {
coroutineScope.launch { coroutineScope.launch {
release = repo.getLatestRelease("VendettaManager").dataOrNull release = repo.getLatestRelease("VendettaManager").dataOrNull
release?.let {
showUpdateDialog = it.tagName.toInt() > BuildConfig.VERSION_CODE
}
repo.getLatestRelease("VendettaXposed").ifSuccessful { repo.getLatestRelease("VendettaXposed").ifSuccessful {
if (preferenceManager.moduleVersion != it.tagName) { if (preferenceManager.moduleVersion != it.tagName) {
preferenceManager.moduleVersion = it.tagName preferenceManager.moduleVersion = it.tagName
@ -46,7 +54,10 @@ class MainViewModel(
fun downloadAndInstallUpdate() { fun downloadAndInstallUpdate() {
coroutineScope.launch { coroutineScope.launch {
val update = File(cacheDir, "update.apk") val update = File(cacheDir, "update.apk")
if(update.exists()) update.delete()
isUpdating = true
downloadManager.downloadUpdate(update) downloadManager.downloadUpdate(update)
isUpdating = false
context.installApks(false, update) context.installApks(false, update)
} }
} }

View File

@ -1,33 +1,73 @@
package dev.beefers.vendetta.manager.ui.widgets.updater package dev.beefers.vendetta.manager.ui.widgets.updater
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.size
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.SystemUpdate import androidx.compose.material.icons.filled.SystemUpdate
import androidx.compose.material3.AlertDialog import androidx.compose.material3.AlertDialog
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.FilledTonalButton import androidx.compose.material3.FilledTonalButton
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
import androidx.compose.material3.LocalContentColor
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.DialogProperties
import dev.beefers.vendetta.manager.R import dev.beefers.vendetta.manager.R
import dev.beefers.vendetta.manager.network.dto.Release import dev.beefers.vendetta.manager.network.dto.Release
@Composable @Composable
fun UpdateDialog( fun UpdateDialog(
release: Release, release: Release,
isUpdating: Boolean,
onDismiss: () -> Unit,
onConfirm: () -> Unit onConfirm: () -> Unit
) { ) {
AlertDialog( AlertDialog(
onDismissRequest = {}, properties = DialogProperties(
dismissOnBackPress = true,
dismissOnClickOutside = true
),
onDismissRequest = {
onDismiss()
},
confirmButton = { confirmButton = {
FilledTonalButton(onClick = onConfirm) { FilledTonalButton(
Text(stringResource(R.string.action_start_update)) onClick = onConfirm,
enabled = !isUpdating
) {
Box {
Text(
text = stringResource(R.string.action_start_update),
color = if(isUpdating) Color.Transparent else LocalContentColor.current
)
if(isUpdating) {
CircularProgressIndicator(
strokeWidth = 3.dp,
modifier = Modifier
.size(24.dp)
.align(Alignment.Center)
)
}
}
} }
}, },
title = { title = {
Text(stringResource(R.string.title_update)) Text(stringResource(R.string.title_update))
}, },
text = { text = {
Text(stringResource(R.string.update_description, release.versionName)) Text(
text = stringResource(R.string.update_description, release.versionName),
textAlign = TextAlign.Center
)
}, },
icon = { icon = {
Icon( Icon(