Skip to content

Commit e70afa7

Browse files
committed
Add Confirm dialog before flash operation
1 parent ea0a6a1 commit e70afa7

File tree

3 files changed

+147
-33
lines changed

3 files changed

+147
-33
lines changed

app/src/main/java/com/github/capntrips/kernelflasher/MainActivity.kt

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -297,18 +297,22 @@ class MainActivity : ComponentActivity() {
297297
viewModel?.showSlotIntentDialog?.value = true
298298
} else {
299299
// Already have slot or not AB - flash directly
300-
navController.navigate("slot${slotSuffix}/flash/ak3") {
301-
popUpTo("slot${slotSuffix}")
302-
}
303300
if (viewModel?.isAb == true && slotSuffix == "_b")
304301
{
305-
viewModel?.slotB?.flashAk3(context, uri)
302+
viewModel?.slotB?.flashActionType = "flashAk3"
303+
viewModel?.slotB?.flashActionURI = uri
304+
viewModel?.slotB?.showConfirmDialog()
306305
}
307306
else
308307
{
309-
viewModel?.slotA?.flashAk3(context, uri)
308+
viewModel?.slotA?.flashActionType = "flashAk3"
309+
viewModel?.slotA?.flashActionURI = uri
310+
viewModel?.slotA?.showConfirmDialog()
311+
}
312+
navController.navigate("slot${slotSuffix}")
313+
navController.navigate("slot${slotSuffix}/flash") {
314+
popUpTo("slot${slotSuffix}")
310315
}
311-
312316
viewModel?.pendingFlashUri = null
313317
viewModel?.slotSuffixForFlash?.value = null
314318
}
@@ -646,18 +650,22 @@ class MainActivity : ComponentActivity() {
646650
val uri = viewModel!!.pendingFlashUri
647651

648652
if (uri != null && slotSuffix != null) {
649-
navController.navigate("slot${slotSuffix}/flash/ak3") {
650-
popUpTo("slot${slotSuffix}")
651-
}
652653
if (viewModel?.isAb == true && slotSuffix == "_b")
653654
{
654-
viewModel?.slotB?.flashAk3(context, uri)
655+
viewModel?.slotB?.flashActionType = "flashAk3"
656+
viewModel?.slotB?.flashActionURI = uri
657+
viewModel?.slotB?.showConfirmDialog()
655658
}
656659
else
657660
{
658-
viewModel?.slotA?.flashAk3(context, uri)
661+
viewModel?.slotA?.flashActionType = "flashAk3"
662+
viewModel?.slotA?.flashActionURI = uri
663+
viewModel?.slotA?.showConfirmDialog()
664+
}
665+
navController.navigate("slot${slotSuffix}")
666+
navController.navigate("slot${slotSuffix}/flash") {
667+
popUpTo("slot${slotSuffix}")
659668
}
660-
661669
viewModel!!.pendingFlashUri = null
662670
viewModel!!.slotSuffixForFlash.value = null
663671
}

app/src/main/java/com/github/capntrips/kernelflasher/ui/screens/slot/SlotFlashContent.kt

Lines changed: 112 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package com.github.capntrips.kernelflasher.ui.screens.slot
22

3+
import android.net.Uri
4+
import android.provider.OpenableColumns
5+
import android.util.Log
36
import androidx.activity.compose.BackHandler
47
import androidx.compose.animation.AnimatedVisibility
58
import androidx.compose.animation.ExperimentalAnimationApi
@@ -36,13 +39,15 @@ import androidx.compose.ui.unit.dp
3639
import androidx.compose.ui.text.font.FontWeight
3740
import androidx.navigation.NavController
3841
import com.github.capntrips.kernelflasher.R
42+
import com.github.capntrips.kernelflasher.SharedViewModels
3943
import com.github.capntrips.kernelflasher.common.PartitionUtil
4044
import com.github.capntrips.kernelflasher.ui.components.DataCard
4145
import com.github.capntrips.kernelflasher.ui.components.FlashButton
4246
import com.github.capntrips.kernelflasher.ui.components.FlashList
4347
import com.github.capntrips.kernelflasher.ui.components.SlotCard
4448
import com.github.capntrips.kernelflasher.ui.components.DialogButton
4549
import kotlinx.serialization.ExperimentalSerializationApi
50+
import java.io.File
4651

4752
@ExperimentalAnimationApi
4853
@ExperimentalMaterialApi
@@ -62,9 +67,7 @@ fun ColumnScope.SlotFlashContent(
6267

6368
BackHandler(enabled = ((currentRoute.endsWith("/flash/ak3") ||
6469
currentRoute.endsWith("/flash/image/flash") ||
65-
currentRoute.endsWith("/backup/backup")) && isRefreshing.value)) {
66-
67-
}
70+
currentRoute.endsWith("/backup/backup")) && isRefreshing.value)) { }
6871

6972
if (!listOf("/flash/ak3", "/flash/image/flash", "/backup/backup").any { navController.currentDestination!!.route!!.endsWith(it) }) {
7073
SlotCard(
@@ -79,22 +82,19 @@ fun ColumnScope.SlotFlashContent(
7982
DataCard (stringResource(R.string.flash))
8083
Spacer(Modifier.height(5.dp))
8184
FlashButton(stringResource(R.string.flash_ak3_zip), "zip" ,callback = { uri ->
82-
navController.navigate("slot$slotSuffix/flash/ak3") {
83-
popUpTo("slot$slotSuffix")
84-
}
85-
viewModel.flashAk3(context, uri)
85+
viewModel.flashActionType = "flashAk3"
86+
viewModel.flashActionURI = uri
87+
viewModel.showConfirmDialog()
8688
})
8789
FlashButton(stringResource(R.string.flash_ak3_zip_mkbootfs), "zip" ,callback = { uri ->
88-
navController.navigate("slot$slotSuffix/flash/ak3") {
89-
popUpTo("slot$slotSuffix")
90-
}
91-
viewModel.flashAk3_mkbootfs(context, uri)
90+
viewModel.flashActionType = "flashAk3_mkbootfs"
91+
viewModel.flashActionURI = uri
92+
viewModel.showConfirmDialog()
9293
})
9394
FlashButton(stringResource(R.string.flash_ksu_lkm), "ko" ,callback = { uri ->
94-
navController.navigate("slot$slotSuffix/flash/image/flash") {
95-
popUpTo("slot$slotSuffix")
96-
}
97-
viewModel.flashKsuDriver(context, uri)
95+
viewModel.flashActionType = "flashKsuDriver"
96+
viewModel.flashActionURI = uri
97+
viewModel.showConfirmDialog()
9898
})
9999
OutlinedButton(
100100
modifier = Modifier
@@ -111,10 +111,10 @@ fun ColumnScope.SlotFlashContent(
111111
Spacer(Modifier.height(5.dp))
112112
for (partitionName in PartitionUtil.AvailablePartitions) {
113113
FlashButton(partitionName, "img" ,callback = { uri ->
114-
navController.navigate("slot$slotSuffix/flash/image/flash") {
115-
popUpTo("slot$slotSuffix")
116-
}
117-
viewModel.flashImage(context, uri, partitionName)
114+
viewModel.flashActionType = "flashImage"
115+
viewModel.flashActionURI = uri
116+
viewModel.flashActionPartName = partitionName
117+
viewModel.showConfirmDialog()
118118
})
119119
}
120120
} else if (navController.currentDestination!!.route!!.endsWith("/backup")) {
@@ -163,7 +163,9 @@ fun ColumnScope.SlotFlashContent(
163163
Text("")
164164
FlashList(
165165
stringResource(if (navController.currentDestination!!.route!!.endsWith("/backup/backup")) R.string.backup else R.string.flash),
166-
if (navController.currentDestination!!.route!!.contains("ak3")) viewModel.uiPrintedOutput else viewModel.flashOutput
166+
if (navController.currentDestination!!.route!!.contains("ak3"))
167+
viewModel.uiPrintedOutput
168+
else viewModel.flashOutput
167169
) {
168170
AnimatedVisibility(!viewModel.isRefreshing.value && viewModel.wasFlashSuccess.value != null) {
169171
Column {
@@ -256,4 +258,94 @@ fun ColumnScope.SlotFlashContent(
256258
}
257259
}
258260
}
261+
if(viewModel.showConfirmDialog == true)
262+
{
263+
var filename = when {
264+
viewModel.flashActionURI?.scheme == "file" -> {
265+
File(viewModel.flashActionURI?.path ?: "").name
266+
}
267+
viewModel.flashActionURI != null -> {
268+
context.contentResolver.query(viewModel.flashActionURI!!, null, null, null, null)?.use { cursor ->
269+
val nameIndex = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)
270+
if (cursor.moveToFirst() && nameIndex != -1) {
271+
cursor.getString(nameIndex)
272+
} else null
273+
} ?: "Unable to determine filename!"
274+
}
275+
else -> "Unable to determine filename!"
276+
}
277+
278+
AlertDialog(
279+
onDismissRequest = { viewModel.hideConfirmDialog() },
280+
title = { Text("CAUTION!", style = MaterialTheme.typography.titleLarge, fontWeight = FontWeight.Bold) },
281+
text = {
282+
Column(verticalArrangement = Arrangement.spacedBy(8.dp)) {
283+
Text("Are you Sure you want to flash this file?", fontWeight = FontWeight.Bold)
284+
Text("", fontWeight = FontWeight.Bold)
285+
Text("$filename", fontWeight = FontWeight.Bold)
286+
}
287+
},
288+
confirmButton = {
289+
DialogButton(
290+
"Flash",
291+
{
292+
viewModel.hideConfirmDialog()
293+
val isOtherFlash = viewModel.flashActionType != "flashImage" && viewModel.flashActionURI != null
294+
val isPartitionFlash = viewModel.flashActionType == "flashImage" && viewModel.flashActionPartName != null && viewModel.flashActionURI != null
295+
296+
if (isOtherFlash || isPartitionFlash) {
297+
val uri = viewModel.flashActionURI!!
298+
val partitionName: String? = viewModel.flashActionPartName
299+
300+
when (viewModel.flashActionType) {
301+
"flashAk3" -> {
302+
navController.navigate("slot$slotSuffix/flash/ak3") {
303+
popUpTo("slot$slotSuffix")
304+
}
305+
viewModel.flashAk3(context, uri)
306+
}
307+
308+
"flashAk3_mkbootfs" -> {
309+
navController.navigate("slot$slotSuffix/flash/ak3") {
310+
popUpTo("slot$slotSuffix")
311+
}
312+
viewModel.flashAk3_mkbootfs(context, uri)
313+
}
314+
315+
"flashKsuDriver" -> {
316+
navController.navigate("slot$slotSuffix/flash/image/flash") {
317+
popUpTo("slot$slotSuffix")
318+
}
319+
viewModel.flashKsuDriver(context, uri)
320+
}
321+
322+
"flashImage" -> {
323+
navController.navigate("slot$slotSuffix/flash/image/flash") {
324+
popUpTo("slot$slotSuffix")
325+
}
326+
viewModel.flashImage(
327+
context,
328+
uri,
329+
partitionName!!
330+
)
331+
}
332+
}
333+
viewModel.flashActionType = ""
334+
viewModel.flashActionURI = null
335+
viewModel.flashActionPartName = null
336+
}
337+
}
338+
)
339+
},
340+
dismissButton = {
341+
DialogButton(
342+
"CANCEL",
343+
{
344+
viewModel.hideConfirmDialog()
345+
}
346+
)
347+
},
348+
modifier = Modifier.padding(16.dp)
349+
)
350+
}
259351
}

app/src/main/java/com/github/capntrips/kernelflasher/ui/screens/slot/SlotViewModel.kt

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,10 @@ class SlotViewModel(
9494
private var inInit = true
9595
private var _error: String? = null
9696
private val _showCautionDialog: MutableState<Boolean> = mutableStateOf(false)
97+
private val _showConfirmDialog: MutableState<Boolean> = mutableStateOf(false)
98+
var flashActionType: String = ""
99+
var flashActionURI: Uri? = null
100+
var flashActionPartName: String? = null
97101

98102
val sha1: String?
99103
get() = _sha1
@@ -113,6 +117,8 @@ class SlotViewModel(
113117
get() = _error
114118
val showCautionDialog: Boolean
115119
get() = _showCautionDialog.value
120+
val showConfirmDialog: Boolean
121+
get() = _showConfirmDialog.value
116122
val slotInfo: SlotInfo
117123
get() = _slotInfo.value
118124

@@ -257,6 +263,14 @@ class SlotViewModel(
257263
_showCautionDialog.value = false
258264
}
259265

266+
fun showConfirmDialog() {
267+
_showConfirmDialog.value = true
268+
}
269+
270+
fun hideConfirmDialog() {
271+
_showConfirmDialog.value = false
272+
}
273+
260274
// TODO: use base class for common functions
261275
@Suppress("SameParameterValue")
262276
private fun log(context: Context, message: String, shouldThrow: Boolean = false) {
@@ -649,7 +663,7 @@ class SlotViewModel(
649663
uiPrint("")
650664
if (wasSlotReset) {
651665
resetSlot()
652-
viewModelScope.launch(Dispatchers.Main) {
666+
viewModelScope.launch(Dispatchers.Main) {
653667
showCautionDialog() // Show dialog instead of uiPrint
654668
}
655669
}

0 commit comments

Comments
 (0)