Skip to content

Commit 7ec02e5

Browse files
committed
refactoring & remove bitrot from updater
1 parent bca79b6 commit 7ec02e5

File tree

11 files changed

+128
-167
lines changed

11 files changed

+128
-167
lines changed

app/src/main/java/org/andbootmgr/app/BackupRestoreFlow.kt

Lines changed: 40 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import java.io.File
2424
import java.io.IOException
2525

2626
class BackupRestoreFlow(private val partitionId: Int): WizardFlow() {
27-
override fun get(vm: WizardActivityState): List<IWizardPage> {
27+
override fun get(vm: WizardState): List<IWizardPage> {
2828
val c = CreateBackupDataHolder(vm, partitionId)
2929
return listOf(WizardPage("start",
3030
NavButton(vm.activity.getString(R.string.cancel)) { it.finish() },
@@ -45,7 +45,7 @@ class BackupRestoreFlow(private val partitionId: Int): WizardFlow() {
4545
}
4646
}
4747

48-
private class CreateBackupDataHolder(val vm: WizardActivityState, val pi: Int) {
48+
private class CreateBackupDataHolder(val vm: WizardState, val pi: Int) {
4949
var action: Int = 0
5050
var path: Uri? = null
5151
var meta: SDUtils.SDPartitionMeta? = null
@@ -93,17 +93,22 @@ private fun SelectDroidBoot(c: CreateBackupDataHolder) {
9393
else -> ""
9494
}
9595
)
96-
val next = { it: Uri ->
97-
c.path = it
98-
nextButtonAvailable = true
99-
c.vm.nextText = c.vm.activity.getString(R.string.next)
100-
c.vm.onNext = { i -> i.navigate("go") }
101-
}
96+
val next =
10297
Button(onClick = {
10398
if (c.action != 1) {
104-
c.vm.activity.chooseFile("*/*", next)
99+
c.vm.activity.chooseFile("*/*") {
100+
c.vm.chosen["file"] = WizardState.DownloadedFile(it, null)
101+
nextButtonAvailable = true
102+
c.vm.nextText = c.vm.activity.getString(R.string.next)
103+
c.vm.onNext = { i -> i.navigate("go") }
104+
}
105105
} else {
106-
c.vm.activity.createFile("${c.meta!!.dumpKernelPartition(c.pi).name}.img", next)
106+
c.vm.activity.createFile("${c.meta!!.dumpKernelPartition(c.pi).name}.img") {
107+
c.path = it
108+
nextButtonAvailable = true
109+
c.vm.nextText = c.vm.activity.getString(R.string.next)
110+
c.vm.onNext = { i -> i.navigate("go") }
111+
}
107112
}
108113
}) {
109114
Text(stringResource(if (c.action != 1) R.string.choose_file else R.string.create_file))
@@ -117,40 +122,32 @@ private fun Flash(c: CreateBackupDataHolder) {
117122
Terminal(logFile = "flash_${System.currentTimeMillis()}.txt") { terminal ->
118123
c.vm.logic.extractToolkit(terminal)
119124
terminal.add(c.vm.activity.getString(R.string.term_starting))
120-
try {
121-
val p = c.meta!!.dumpKernelPartition(c.pi)
122-
if (!c.vm.logic.unmount(p).to(terminal).exec().isSuccess)
123-
throw IOException(c.vm.activity.getString(R.string.term_cant_umount))
124-
if (c.action == 1) {
125-
c.vm.copy(
126-
SuFileInputStream.open(File(p.path)),
127-
c.vm.activity.contentResolver.openOutputStream(c.path!!)!!
128-
)
129-
} else if (c.action == 2) {
130-
c.vm.copyPriv(
131-
c.vm.activity.contentResolver.openInputStream(c.path!!)!!,
132-
File(p.path)
133-
)
134-
} else if (c.action == 3) {
135-
val f = File(c.vm.logic.cacheDir, System.currentTimeMillis().toString())
136-
c.vm.copyUnpriv(c.vm.activity.contentResolver.openInputStream(c.path!!)!!, f)
137-
val result2 = Shell.cmd(
138-
File(
139-
c.vm.logic.toolkitDir,
140-
"simg2img"
141-
).absolutePath + " ${f.absolutePath} ${p.path}"
142-
).to(terminal).exec()
143-
if (!result2.isSuccess) {
144-
terminal.add(c.vm.activity.getString(R.string.term_failure))
145-
return@Terminal
146-
}
147-
} else {
148-
throw IOException(c.vm.activity.getString(R.string.term_invalid_action))
125+
val p = c.meta!!.dumpKernelPartition(c.pi)
126+
if (!c.vm.logic.unmount(p).to(terminal).exec().isSuccess)
127+
throw IOException(c.vm.activity.getString(R.string.term_cant_umount))
128+
if (c.action == 1) {
129+
c.vm.copy(
130+
SuFileInputStream.open(File(p.path)),
131+
c.vm.activity.contentResolver.openOutputStream(c.path!!)!!
132+
)
133+
} else if (c.action == 2) {
134+
c.vm.copyPriv(
135+
c.vm.chosen["file"]!!.openInputStream(c.vm),
136+
File(p.path)
137+
)
138+
} else if (c.action == 3) {
139+
val result2 = Shell.cmd(
140+
File(
141+
c.vm.logic.toolkitDir,
142+
"simg2img"
143+
).absolutePath + " ${c.vm.chosen["file"]!!.toFile(c.vm).absolutePath} ${p.path}"
144+
).to(terminal).exec()
145+
if (!result2.isSuccess) {
146+
terminal.add(c.vm.activity.getString(R.string.term_failure))
147+
return@Terminal
149148
}
150-
} catch (e: IOException) {
151-
terminal.add(c.vm.activity.getString(R.string.term_backup_restore_fail))
152-
terminal.add(if (e.message != null) e.message!! else "(null)")
153-
terminal.add(c.vm.activity.getString(R.string.term_contact_support))
149+
} else {
150+
throw IOException(c.vm.activity.getString(R.string.term_invalid_action))
154151
}
155152
terminal.add(c.vm.activity.getString(R.string.term_success))
156153
c.vm.nextText = c.vm.activity.getString(R.string.finish)

app/src/main/java/org/andbootmgr/app/CreatePartFlow.kt

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ import java.math.BigDecimal
6161
import java.net.URL
6262

6363
class CreatePartFlow(private val desiredStartSector: Long): WizardFlow() {
64-
override fun get(vm: WizardActivityState): List<IWizardPage> {
64+
override fun get(vm: WizardState): List<IWizardPage> {
6565
val c = CreatePartDataHolder(vm, desiredStartSector)
6666
return listOf(WizardPage("start",
6767
NavButton(vm.activity.getString(R.string.cancel)) { it.finish() },
@@ -92,7 +92,7 @@ class CreatePartFlow(private val desiredStartSector: Long): WizardFlow() {
9292
}
9393
}
9494

95-
private class CreatePartDataHolder(val vm: WizardActivityState, val desiredStartSector: Long) {
95+
private class CreatePartDataHolder(val vm: WizardState, val desiredStartSector: Long) {
9696
var meta by mutableStateOf<SDUtils.SDPartitionMeta?>(null)
9797
lateinit var p: SDUtils.Partition.FreeSpace
9898
var startSectorRelative = 0L
@@ -376,17 +376,17 @@ private fun Shop(c: CreatePartDataHolder) {
376376
while (i < inets.length()) {
377377
val l = inets.getJSONObject(i)
378378
vm.inetAvailable[l.getString("id")] =
379-
WizardActivityState.Downloadable(
379+
WizardState.Downloadable(
380380
l.getString("url"),
381-
l.optString("hash"),
381+
l.getStringOrNull("hash"),
382382
l.getString("desc")
383383
)
384384
i++
385385
}
386386
vm.idNeeded.add("_install.sh_")
387-
vm.inetAvailable["_install.sh_"] = WizardActivityState.Downloadable(
387+
vm.inetAvailable["_install.sh_"] = WizardState.Downloadable(
388388
o.getString("scriptname"),
389-
o.optString("scriptSha256"),
389+
o.getStringOrNull("scriptSha256"),
390390
vm.activity.getString(R.string.installer_sh)
391391
)
392392

@@ -655,7 +655,7 @@ private fun Flash(c: CreatePartDataHolder) {
655655
Terminal(logFile = "install_${System.currentTimeMillis()}.txt") { terminal ->
656656
c.vm.logic.extractToolkit(terminal)
657657
if (c.partitionName == null) { // OS install
658-
val createdParts = ArrayMap<Part, Int>() // order is important
658+
val createdParts = mutableListOf<Pair<Part, Int>>() // order is important
659659
val fn = c.romFolderName
660660
terminal.add(vm.activity.getString(R.string.term_f_name, fn))
661661
terminal.add(vm.activity.getString(R.string.term_g_name, c.romDisplayName))
@@ -683,7 +683,7 @@ private fun Flash(c: CreatePartDataHolder) {
683683
if (r.out.joinToString("\n").contains("kpartx")) {
684684
terminal.add(vm.activity.getString(R.string.term_reboot_asap))
685685
}
686-
createdParts[part] = c.meta!!.nid
686+
createdParts.add(Pair(part, c.meta!!.nid))
687687
c.meta = SDUtils.generateMeta(c.vm.deviceInfo)
688688
// do not assert there is leftover space if we just created the last partition we want to create
689689
if (index < c.parts.size - 1) {
@@ -715,7 +715,7 @@ private fun Flash(c: CreatePartDataHolder) {
715715
entry["dtbo"] = "$fn/dtbo.dtbo"
716716
entry["options"] = c.cmdline
717717
entry["xtype"] = c.rtype
718-
entry["xpart"] = createdParts.values.joinToString(":")
718+
entry["xpart"] = createdParts.map { it.second }.joinToString(":")
719719
if (c.dmaMeta.contains("updateJson") && c.dmaMeta["updateJson"] != null)
720720
entry["xupdate"] = c.dmaMeta["updateJson"]!!
721721
entry.exportToFile(File(vm.logic.abmEntries, "$fn.conf"))
@@ -729,23 +729,21 @@ private fun Flash(c: CreatePartDataHolder) {
729729
if (!c.vm.idNeeded.contains(part.id)) continue
730730
terminal.add(vm.activity.getString(R.string.term_flashing_s, part.id))
731731
val f = c.vm.chosen[part.id]!!
732-
val tp = File(meta.dumpKernelPartition(createdParts[part]!!).path)
732+
val tp = File(meta.dumpKernelPartition(createdParts.find { it.first == part }!!.second).path)
733733
if (part.sparse) {
734-
val f2 = f.toFile(c.vm)
735734
val result2 = Shell.cmd(
736735
File(
737736
c.vm.logic.toolkitDir,
738737
"simg2img"
739-
).absolutePath + " ${f2.absolutePath} ${tp.absolutePath}"
738+
).absolutePath + " ${f.toFile(c.vm).absolutePath} ${tp.absolutePath}"
740739
).to(terminal).exec()
741740
f.delete()
742741
if (!result2.isSuccess) {
743742
terminal.add(vm.activity.getString(R.string.term_failure))
744743
return@Terminal
745744
}
746745
} else {
747-
val f2 = f.openInputStream(c.vm)
748-
c.vm.copyPriv(f2, tp)
746+
c.vm.copyPriv(f.openInputStream(c.vm), tp)
749747
}
750748
terminal.add(vm.activity.getString(R.string.term_done))
751749
}
@@ -756,7 +754,7 @@ private fun Flash(c: CreatePartDataHolder) {
756754
cmd += " " + c.vm.chosen[i]!!.toFile(vm).absolutePath
757755
}
758756
for (i in c.parts) {
759-
cmd += " " + createdParts[i]
757+
cmd += " " + createdParts.find { it.first == i }!!.second
760758
}
761759
val result = vm.logic.runShFileWithArgs(cmd).to(terminal).exec()
762760
if (!result.isSuccess) {

app/src/main/java/org/andbootmgr/app/DroidBootFlow.kt

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ import java.io.IOException
3939
import java.net.URL
4040

4141
class DroidBootFlow : WizardFlow() {
42-
override fun get(vm: WizardActivityState): List<IWizardPage> {
42+
override fun get(vm: WizardState): List<IWizardPage> {
4343
val d = DroidBootFlowDataHolder(vm)
4444
return listOf(WizardPage("start",
4545
NavButton(vm.activity.getString(R.string.cancel)) { it.finish() },
@@ -65,12 +65,12 @@ class DroidBootFlow : WizardFlow() {
6565
}
6666
}
6767

68-
class DroidBootFlowDataHolder(val vm: WizardActivityState) {
68+
class DroidBootFlowDataHolder(val vm: WizardState) {
6969
var osName by mutableStateOf(vm.activity.getString(R.string.android))
7070
}
7171

7272
@Composable
73-
private fun Start(vm: WizardActivityState) {
73+
private fun Start(vm: WizardState) {
7474
Column(horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center,
7575
modifier = Modifier.fillMaxSize()
7676
) {
@@ -91,7 +91,7 @@ private fun Start(vm: WizardActivityState) {
9191

9292
// shared across DroidBootFlow, UpdateDroidBootFlow, FixDroidBootFlow
9393
@Composable
94-
fun LoadDroidBootJson(vm: WizardActivityState, content: @Composable () -> Unit) {
94+
fun LoadDroidBootJson(vm: WizardState, content: @Composable () -> Unit) {
9595
var loading by remember { mutableStateOf(!vm.deviceInfo.isBooted(vm.logic) || vm.deviceInfo.postInstallScript) }
9696
var error by remember { mutableStateOf(false) }
9797
LaunchedEffect(Unit) {
@@ -106,17 +106,17 @@ fun LoadDroidBootJson(vm: WizardActivityState, content: @Composable () -> Unit)
106106
if (!vm.deviceInfo.isBooted(vm.logic)) {
107107
val bl = json.getJSONObject("bootloader")
108108
val url = bl.getString("url")
109-
val sha = bl.optString("sha256")
110-
vm.inetAvailable["droidboot"] = WizardActivityState.Downloadable(
109+
val sha = bl.getStringOrNull("sha256")
110+
vm.inetAvailable["droidboot"] = WizardState.Downloadable(
111111
url, sha, vm.activity.getString(R.string.droidboot_online)
112112
)
113113
vm.idNeeded.add("droidboot")
114114
}
115115
if (vm.deviceInfo.postInstallScript) {
116116
val i = json.getJSONObject("installScript")
117117
val url = i.getString("url")
118-
val sha = i.optString("sha256")
119-
vm.inetAvailable["_install.sh_"] = WizardActivityState.Downloadable(
118+
val sha = i.getStringOrNull("sha256")
119+
vm.inetAvailable["_install.sh_"] = WizardState.Downloadable(
120120
url, sha, vm.activity.getString(R.string.installer_sh)
121121
)
122122
vm.idNeeded.add("_install.sh_")
@@ -269,10 +269,9 @@ private fun Flash(d: DroidBootFlowDataHolder) {
269269
}
270270
}
271271
val tmpFile = if (vm.deviceInfo.postInstallScript) {
272-
val tmpFile = createTempFileSu("abm", ".sh", vm.logic.rootTmpDir)
273-
vm.copyPriv(vm.chosen["_install.sh_"]!!.openInputStream(vm), tmpFile)
274-
tmpFile.setExecutable(true)
275-
tmpFile
272+
vm.chosen["_install.sh_"]!!.toFile(vm).also {
273+
it.setExecutable(true)
274+
}
276275
} else null
277276

278277
terminal.add(vm.activity.getString(R.string.term_building_cfg))

app/src/main/java/org/andbootmgr/app/FixDroidBootFlow.kt

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import java.io.File
1818
import java.io.IOException
1919

2020
class FixDroidBootFlow(): WizardFlow() {
21-
override fun get(vm: WizardActivityState): List<IWizardPage> {
21+
override fun get(vm: WizardState): List<IWizardPage> {
2222
return listOf(WizardPage("start",
2323
NavButton(vm.activity.getString(R.string.cancel)) { it.finish() },
2424
NavButton("") {})
@@ -39,7 +39,7 @@ class FixDroidBootFlow(): WizardFlow() {
3939
}
4040

4141
@Composable
42-
private fun Start(vm: WizardActivityState) {
42+
private fun Start(vm: WizardState) {
4343
LoadDroidBootJson(vm) {
4444
LaunchedEffect(Unit) {
4545
vm.nextText = vm.activity.getString(R.string.next)
@@ -57,14 +57,13 @@ private fun Start(vm: WizardActivityState) {
5757
}
5858

5959
@Composable
60-
private fun Flash(vm: WizardActivityState) {
60+
private fun Flash(vm: WizardState) {
6161
Terminal(logFile = "blfix_${System.currentTimeMillis()}.txt") { terminal ->
6262
vm.logic.extractToolkit(terminal)
6363
val tmpFile = if (vm.deviceInfo.postInstallScript) {
64-
val tmpFile = createTempFileSu("abm", ".sh", vm.logic.rootTmpDir)
65-
vm.copyPriv(vm.chosen["_install.sh_"]!!.openInputStream(vm), tmpFile)
66-
tmpFile.setExecutable(true)
67-
tmpFile
64+
vm.chosen["_install.sh_"]!!.toFile(vm).also {
65+
it.setExecutable(true)
66+
}
6867
} else null
6968
terminal.add(vm.activity.getString(R.string.term_flashing_droidboot))
7069
val backupLk = File(vm.logic.fileDir, "backup_lk.img")

app/src/main/java/org/andbootmgr/app/MainActivity.kt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,10 +86,8 @@ class MainActivityState(val activity: MainActivity?) {
8686
val cfg = withContext(Dispatchers.IO) {
8787
ConfigFile.importFromFile(logic!!.abmDbConf).toMap()
8888
}
89-
withContext(Dispatchers.Main) {
90-
defaultCfg.clear()
91-
defaultCfg.putAll(cfg)
92-
}
89+
defaultCfg.clear()
90+
defaultCfg.putAll(cfg)
9391
}
9492
}
9593

app/src/main/java/org/andbootmgr/app/Start.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -579,7 +579,7 @@ private fun PartTool(vm: MainActivityState) {
579579
var initrdT by remember { mutableStateOf(e["initrd"] ?: "") }
580580
val initrdE by remember { derivedStateOf { !initrdT.matches(asciiRegex) } }
581581
var dtbT by remember { mutableStateOf(e["dtb"] ?: "") }
582-
val dtbE by remember { derivedStateOf { dtbT.matches(asciiRegex) } }
582+
val dtbE by remember { derivedStateOf { !dtbT.matches(asciiRegex) } }
583583
var optionsT by remember { mutableStateOf(e["options"] ?: "") }
584584
val optionsE by remember { derivedStateOf { !optionsT.matches(asciiRegex) } }
585585
var xtypeT by remember { mutableStateOf(e["xtype"] ?: "") }

app/src/main/java/org/andbootmgr/app/UpdateDroidBootFlow.kt

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import java.io.File
1818
import java.io.IOException
1919

2020
class UpdateDroidBootFlow: WizardFlow() {
21-
override fun get(vm: WizardActivityState): List<IWizardPage> {
21+
override fun get(vm: WizardState): List<IWizardPage> {
2222
return listOf(WizardPage("start",
2323
NavButton(vm.activity.getString(R.string.cancel)) { it.finish() },
2424
NavButton("") {})
@@ -39,7 +39,7 @@ class UpdateDroidBootFlow: WizardFlow() {
3939
}
4040

4141
@Composable
42-
private fun Start(vm: WizardActivityState) {
42+
private fun Start(vm: WizardState) {
4343
LoadDroidBootJson(vm) {
4444
LaunchedEffect(Unit) {
4545
vm.nextText = vm.activity.getString(R.string.next)
@@ -57,14 +57,13 @@ private fun Start(vm: WizardActivityState) {
5757
}
5858

5959
@Composable
60-
private fun Flash(vm: WizardActivityState) {
60+
private fun Flash(vm: WizardState) {
6161
Terminal(logFile = "blup_${System.currentTimeMillis()}.txt") { terminal ->
6262
vm.logic.extractToolkit(terminal)
6363
val tmpFile = if (vm.deviceInfo.postInstallScript) {
64-
val tmpFile = createTempFileSu("abm", ".sh", vm.logic.rootTmpDir)
65-
vm.copyPriv(vm.chosen["_install.sh_"]!!.openInputStream(vm), tmpFile)
66-
tmpFile.setExecutable(true)
67-
tmpFile
64+
vm.chosen["_install.sh_"]!!.toFile(vm).also {
65+
it.setExecutable(true)
66+
}
6867
} else null
6968
terminal.add(vm.activity.getString(R.string.term_flashing_droidboot))
7069
val backupLk = File(vm.logic.fileDir, "backup2_lk.img")

0 commit comments

Comments
 (0)