1
1
package com.github.capntrips.kernelflasher.ui.screens.slot
2
2
3
+ import android.net.Uri
4
+ import android.provider.OpenableColumns
5
+ import android.util.Log
3
6
import androidx.activity.compose.BackHandler
4
7
import androidx.compose.animation.AnimatedVisibility
5
8
import androidx.compose.animation.ExperimentalAnimationApi
@@ -36,13 +39,15 @@ import androidx.compose.ui.unit.dp
36
39
import androidx.compose.ui.text.font.FontWeight
37
40
import androidx.navigation.NavController
38
41
import com.github.capntrips.kernelflasher.R
42
+ import com.github.capntrips.kernelflasher.SharedViewModels
39
43
import com.github.capntrips.kernelflasher.common.PartitionUtil
40
44
import com.github.capntrips.kernelflasher.ui.components.DataCard
41
45
import com.github.capntrips.kernelflasher.ui.components.FlashButton
42
46
import com.github.capntrips.kernelflasher.ui.components.FlashList
43
47
import com.github.capntrips.kernelflasher.ui.components.SlotCard
44
48
import com.github.capntrips.kernelflasher.ui.components.DialogButton
45
49
import kotlinx.serialization.ExperimentalSerializationApi
50
+ import java.io.File
46
51
47
52
@ExperimentalAnimationApi
48
53
@ExperimentalMaterialApi
@@ -62,9 +67,7 @@ fun ColumnScope.SlotFlashContent(
62
67
63
68
BackHandler (enabled = ((currentRoute.endsWith(" /flash/ak3" ) ||
64
69
currentRoute.endsWith(" /flash/image/flash" ) ||
65
- currentRoute.endsWith(" /backup/backup" )) && isRefreshing.value)) {
66
-
67
- }
70
+ currentRoute.endsWith(" /backup/backup" )) && isRefreshing.value)) { }
68
71
69
72
if (! listOf (" /flash/ak3" , " /flash/image/flash" , " /backup/backup" ).any { navController.currentDestination!! .route!! .endsWith(it) }) {
70
73
SlotCard (
@@ -79,22 +82,19 @@ fun ColumnScope.SlotFlashContent(
79
82
DataCard (stringResource(R .string.flash))
80
83
Spacer (Modifier .height(5 .dp))
81
84
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()
86
88
})
87
89
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()
92
93
})
93
94
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()
98
98
})
99
99
OutlinedButton (
100
100
modifier = Modifier
@@ -111,10 +111,10 @@ fun ColumnScope.SlotFlashContent(
111
111
Spacer (Modifier .height(5 .dp))
112
112
for (partitionName in PartitionUtil .AvailablePartitions ) {
113
113
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( )
118
118
})
119
119
}
120
120
} else if (navController.currentDestination!! .route!! .endsWith(" /backup" )) {
@@ -163,7 +163,9 @@ fun ColumnScope.SlotFlashContent(
163
163
Text (" " )
164
164
FlashList (
165
165
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
167
169
) {
168
170
AnimatedVisibility (! viewModel.isRefreshing.value && viewModel.wasFlashSuccess.value != null ) {
169
171
Column {
@@ -256,4 +258,94 @@ fun ColumnScope.SlotFlashContent(
256
258
}
257
259
}
258
260
}
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
+ }
259
351
}
0 commit comments