Skip to content

Commit 7156f08

Browse files
feat: improve install screen UI (#69)
1 parent 6e16368 commit 7156f08

20 files changed

+417
-186
lines changed

app/src/main/AndroidManifest.xml

+3-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,9 @@
4545
android:name=".MainActivity"
4646
android:exported="true"
4747
android:launchMode="singleTask"
48-
android:theme="@style/Theme.AliucordManager.SplashScreen">
48+
android:screenOrientation="portrait"
49+
android:theme="@style/Theme.AliucordManager.SplashScreen"
50+
tools:ignore="DiscouragedApi,LockedOrientationActivity">
4951
<intent-filter>
5052
<action android:name="android.intent.action.MAIN" />
5153

app/src/main/kotlin/com/aliucord/manager/installer/steps/KotlinInstallRunner.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ class KotlinInstallRunner(options: InstallOptions) : StepRunner() {
2222
DownloadInjectorStep(),
2323
DownloadAliuhookStep(),
2424
DownloadKotlinStep(),
25+
CopyDependenciesStep(),
2526

2627
// Patch
27-
CopyDependenciesStep(),
2828
ReplaceIconStep(options),
2929
PatchManifestStep(options),
3030
AddInjectorStep(),

app/src/main/kotlin/com/aliucord/manager/installer/steps/patch/CopyDependenciesStep.kt app/src/main/kotlin/com/aliucord/manager/installer/steps/download/CopyDependenciesStep.kt

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1-
package com.aliucord.manager.installer.steps.patch
1+
package com.aliucord.manager.installer.steps.download
22

33
import com.aliucord.manager.R
44
import com.aliucord.manager.installer.steps.StepGroup
55
import com.aliucord.manager.installer.steps.StepRunner
66
import com.aliucord.manager.installer.steps.base.Step
7-
import com.aliucord.manager.installer.steps.download.DownloadDiscordStep
87
import com.aliucord.manager.manager.PathManager
98
import org.koin.core.component.KoinComponent
109
import org.koin.core.component.inject
@@ -22,7 +21,7 @@ class CopyDependenciesStep : Step(), KoinComponent {
2221
val patchedApk: File = paths.patchingWorkingDir()
2322
.resolve("patched.apk")
2423

25-
override val group = StepGroup.Patch
24+
override val group = StepGroup.Download
2625
override val localizedName = R.string.install_step_copy
2726

2827
override suspend fun execute(container: StepRunner) {

app/src/main/kotlin/com/aliucord/manager/installer/steps/install/AlignmentStep.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import com.aliucord.manager.installer.steps.StepGroup
66
import com.aliucord.manager.installer.steps.StepRunner
77
import com.aliucord.manager.installer.steps.base.Step
88
import com.aliucord.manager.installer.steps.base.StepState
9-
import com.aliucord.manager.installer.steps.patch.CopyDependenciesStep
9+
import com.aliucord.manager.installer.steps.download.CopyDependenciesStep
1010
import com.github.diamondminer88.zip.*
1111
import org.koin.core.component.KoinComponent
1212

app/src/main/kotlin/com/aliucord/manager/installer/steps/install/InstallStep.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import com.aliucord.manager.installer.steps.StepGroup
77
import com.aliucord.manager.installer.steps.StepRunner
88
import com.aliucord.manager.installer.steps.base.Step
99
import com.aliucord.manager.installer.steps.base.StepState
10-
import com.aliucord.manager.installer.steps.patch.CopyDependenciesStep
10+
import com.aliucord.manager.installer.steps.download.CopyDependenciesStep
1111
import com.aliucord.manager.installers.InstallerResult
1212
import com.aliucord.manager.manager.InstallerManager
1313
import com.aliucord.manager.manager.PreferencesManager

app/src/main/kotlin/com/aliucord/manager/installer/steps/install/SigningStep.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import com.aliucord.manager.R
44
import com.aliucord.manager.installer.steps.StepGroup
55
import com.aliucord.manager.installer.steps.StepRunner
66
import com.aliucord.manager.installer.steps.base.Step
7-
import com.aliucord.manager.installer.steps.patch.CopyDependenciesStep
7+
import com.aliucord.manager.installer.steps.download.CopyDependenciesStep
88
import com.aliucord.manager.installer.util.Signer
99
import org.koin.core.component.KoinComponent
1010

app/src/main/kotlin/com/aliucord/manager/installer/steps/patch/AddAliuhookStep.kt

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import com.aliucord.manager.R
55
import com.aliucord.manager.installer.steps.StepGroup
66
import com.aliucord.manager.installer.steps.StepRunner
77
import com.aliucord.manager.installer.steps.base.Step
8+
import com.aliucord.manager.installer.steps.download.CopyDependenciesStep
89
import com.aliucord.manager.installer.steps.download.DownloadAliuhookStep
910
import com.github.diamondminer88.zip.ZipReader
1011
import com.github.diamondminer88.zip.ZipWriter

app/src/main/kotlin/com/aliucord/manager/installer/steps/patch/AddInjectorStep.kt

+1-2
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@ import com.aliucord.manager.R
44
import com.aliucord.manager.installer.steps.StepGroup
55
import com.aliucord.manager.installer.steps.StepRunner
66
import com.aliucord.manager.installer.steps.base.Step
7-
import com.aliucord.manager.installer.steps.download.DownloadInjectorStep
8-
import com.aliucord.manager.installer.steps.download.DownloadKotlinStep
7+
import com.aliucord.manager.installer.steps.download.*
98
import com.github.diamondminer88.zip.ZipReader
109
import com.github.diamondminer88.zip.ZipWriter
1110
import org.koin.core.component.KoinComponent

app/src/main/kotlin/com/aliucord/manager/installer/steps/patch/PatchManifestStep.kt

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import com.aliucord.manager.R
44
import com.aliucord.manager.installer.steps.StepGroup
55
import com.aliucord.manager.installer.steps.StepRunner
66
import com.aliucord.manager.installer.steps.base.Step
7+
import com.aliucord.manager.installer.steps.download.CopyDependenciesStep
78
import com.aliucord.manager.installer.util.ManifestPatcher
89
import com.aliucord.manager.ui.screens.installopts.InstallOptions
910
import com.github.diamondminer88.zip.ZipReader

app/src/main/kotlin/com/aliucord/manager/installer/steps/patch/ReplaceIconStep.kt

+1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import com.aliucord.manager.installer.steps.StepGroup
88
import com.aliucord.manager.installer.steps.StepRunner
99
import com.aliucord.manager.installer.steps.base.Step
1010
import com.aliucord.manager.installer.steps.base.StepState
11+
import com.aliucord.manager.installer.steps.download.CopyDependenciesStep
1112
import com.aliucord.manager.installer.util.ArscUtil
1213
import com.aliucord.manager.installer.util.ArscUtil.addColorResource
1314
import com.aliucord.manager.installer.util.ArscUtil.addResource

app/src/main/kotlin/com/aliucord/manager/installer/util/ManifestPatcher.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ object ManifestPatcher {
9393
override fun attr(ns: String?, name: String, resourceId: Int, type: Int, value: Any?) {
9494
if (name == NETWORK_SECURITY_CONFIG) return
9595
super.attr(ns, name, resourceId, type, value)
96-
if (name == REQUEST_LEGACY_EXTERNAL_STORAGE) addLegacyStorage = false;
96+
if (name == REQUEST_LEGACY_EXTERNAL_STORAGE) addLegacyStorage = false
9797
if (name == DEBUGGABLE) addDebuggable = false
9898
if (name == USES_CLEARTEXT_TRAFFIC) addUseClearTextTraffic = false
9999
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package com.aliucord.manager.ui
2+
3+
import androidx.compose.foundation.*
4+
import androidx.compose.foundation.layout.*
5+
import androidx.compose.material3.*
6+
import androidx.compose.runtime.Composable
7+
import androidx.compose.ui.Alignment
8+
import androidx.compose.ui.Modifier
9+
import androidx.compose.ui.draw.clip
10+
import androidx.compose.ui.graphics.Color
11+
import androidx.compose.ui.graphics.painter.Painter
12+
import androidx.compose.ui.unit.dp
13+
import com.aliucord.manager.ui.util.thenIf
14+
15+
@Composable
16+
fun TextBanner(
17+
text: String,
18+
icon: Painter,
19+
iconColor: Color,
20+
outlineColor: Color?,
21+
containerColor: Color,
22+
onClick: (() -> Unit)? = null,
23+
modifier: Modifier = Modifier,
24+
) {
25+
Box(
26+
contentAlignment = Alignment.Center,
27+
modifier = modifier
28+
.thenIf(outlineColor) { color ->
29+
border(
30+
width = 2.dp,
31+
color = color,
32+
shape = MaterialTheme.shapes.medium,
33+
)
34+
}
35+
.clip(MaterialTheme.shapes.medium)
36+
.background(containerColor)
37+
.thenIf(onClick) { clickable(onClick = it) }
38+
) {
39+
Row(
40+
horizontalArrangement = Arrangement.spacedBy(12.dp),
41+
verticalAlignment = Alignment.CenterVertically,
42+
modifier = Modifier
43+
.padding(horizontal = 20.dp, vertical = 14.dp)
44+
) {
45+
Icon(
46+
painter = icon,
47+
tint = iconColor,
48+
contentDescription = null,
49+
modifier = Modifier.size(28.dp),
50+
)
51+
52+
Text(
53+
text = text,
54+
style = MaterialTheme.typography.labelMedium,
55+
)
56+
}
57+
}
58+
}

app/src/main/kotlin/com/aliucord/manager/ui/screens/install/InstallModel.kt

+45-18
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@ package com.aliucord.manager.ui.screens.install
44

55
import android.annotation.SuppressLint
66
import android.app.Application
7+
import android.content.Intent
78
import android.os.Build
89
import android.util.Log
10+
import androidx.annotation.StringRes
911
import androidx.compose.runtime.*
1012
import cafe.adriel.voyager.core.model.StateScreenModel
1113
import cafe.adriel.voyager.core.model.screenModelScope
@@ -25,6 +27,7 @@ import kotlinx.coroutines.*
2527
import kotlinx.coroutines.flow.*
2628
import java.text.SimpleDateFormat
2729
import java.util.Date
30+
import kotlin.time.Duration.Companion.seconds
2831

2932
class InstallModel(
3033
private val application: Application,
@@ -35,16 +38,35 @@ class InstallModel(
3538
private var installJob: Job? = null
3639
private var stepRunner: StepRunner? = null
3740

38-
private var autocloseCancelled: Boolean = false
39-
4041
var installSteps by mutableStateOf<ImmutableMap<StepGroup, ImmutableList<Step>>?>(null)
4142
private set
4243

4344
var showGppWarning by mutableStateOf(false)
4445
private set
4546

47+
@get:StringRes
48+
var funFact by mutableIntStateOf(0)
49+
private set
50+
4651
init {
4752
restart()
53+
54+
// Rotate fun facts every 20s
55+
screenModelScope.launch {
56+
while (true) {
57+
funFact = FUN_FACTS.random()
58+
delay(20.seconds)
59+
}
60+
}
61+
}
62+
63+
fun launchApp() {
64+
if (state.value !is InstallScreenState.Success)
65+
return
66+
67+
Intent(options.packageName)
68+
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
69+
.also(application::startActivity)
4870
}
4971

5072
fun copyDebugToClipboard() {
@@ -68,17 +90,10 @@ class InstallModel(
6890
}
6991

7092
fun clearCache() {
71-
paths.clearCache()
93+
screenModelScope.launch { paths.clearCache() }
7294
application.showToast(R.string.action_cleared_cache)
7395
}
7496

75-
/**
76-
* Cancel the screen auto-close once installation was completed
77-
*/
78-
fun cancelAutoclose() {
79-
autocloseCancelled = true
80-
}
81-
8297
/**
8398
* Hide the 'Google Play Protect is enabled on your device' warning dialog
8499
*/
@@ -130,13 +145,6 @@ class InstallModel(
130145
// At this point, the installation has successfully completed
131146
else {
132147
mutableState.value = InstallScreenState.Success
133-
autocloseCancelled = false
134-
135-
// Wait 5s before returning to Home if screen hasn't been clicked
136-
delay(5000)
137-
if (!autocloseCancelled) {
138-
mutableState.value = InstallScreenState.CloseScreen
139-
}
140148
}
141149
}
142150

@@ -188,6 +196,25 @@ class InstallModel(
188196
SOC: $soc
189197
""".trimIndent()
190198

191-
return header + "\n\n" + Log.getStackTraceString(stacktrace)
199+
return header + "\n\n" + Log.getStackTraceString(stacktrace).trimEnd()
200+
}
201+
202+
private companion object {
203+
/**
204+
* Random fun facts to show on the installation screen.
205+
*/
206+
val FUN_FACTS = arrayOf(
207+
R.string.fun_fact_1,
208+
R.string.fun_fact_2,
209+
R.string.fun_fact_3,
210+
R.string.fun_fact_4,
211+
R.string.fun_fact_5,
212+
R.string.fun_fact_6,
213+
R.string.fun_fact_7,
214+
R.string.fun_fact_8,
215+
R.string.fun_fact_9,
216+
R.string.fun_fact_10,
217+
R.string.fun_fact_11,
218+
)
192219
}
193220
}

0 commit comments

Comments
 (0)