Skip to content

Commit 167811a

Browse files
committed
Open file without context menu in Crypto view
1 parent 8ea28b1 commit 167811a

File tree

7 files changed

+164
-109
lines changed

7 files changed

+164
-109
lines changed

app/src/main/kotlin/ee/ria/DigiDoc/ui/component/crypto/EncryptNavigation.kt

Lines changed: 96 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ import ee.ria.DigiDoc.ui.component.shared.MessageDialog
8585
import ee.ria.DigiDoc.ui.component.shared.TabView
8686
import ee.ria.DigiDoc.ui.component.shared.TopBar
8787
import ee.ria.DigiDoc.ui.component.shared.dialog.SivaConfirmationDialog
88+
import ee.ria.DigiDoc.ui.component.shared.handler.containerFileOpeningHandler
8889
import ee.ria.DigiDoc.ui.theme.Dimensions.SPadding
8990
import ee.ria.DigiDoc.ui.theme.Dimensions.XLPadding
9091
import ee.ria.DigiDoc.ui.theme.Dimensions.XSPadding
@@ -250,7 +251,99 @@ fun EncryptNavigation(
250251
val showDataFileBottomSheet = remember { mutableStateOf(false) }
251252
val showRecipientBottomSheet = remember { mutableStateOf(false) }
252253

254+
val showSivaDialog = remember { mutableStateOf(false) }
255+
val nestedFile = rememberSaveable { mutableStateOf<File?>(null) }
256+
257+
val openNestedContainer: (nestedContainer: File, isSivaConfirmed: Boolean) -> Unit =
258+
{ nestedContainer, isSivaConfirmed ->
259+
scope.launch(IO) {
260+
try {
261+
val isSigningContainer = nestedContainer.isContainer(context)
262+
263+
if (isSigningContainer) {
264+
signingViewModel.openNestedContainer(
265+
context,
266+
nestedContainer,
267+
sharedContainerViewModel,
268+
isSivaConfirmed,
269+
)
270+
271+
withContext(Main) {
272+
sharedContainerViewModel.setIsSivaConfirmed(isSivaConfirmed)
273+
navController.navigate(Route.Signing.route)
274+
}
275+
} else {
276+
encryptViewModel.openNestedContainer(
277+
context,
278+
nestedContainer,
279+
sharedContainerViewModel,
280+
)
281+
}
282+
showLoadingScreen.value = false
283+
} catch (ex: Exception) {
284+
withContext(Main) {
285+
errorLog(
286+
this.javaClass.simpleName,
287+
"Unable to open nested container",
288+
ex,
289+
)
290+
showLoadingScreen.value = false
291+
Toast
292+
.makeText(
293+
context,
294+
ex.localizedMessage,
295+
Toast.LENGTH_LONG,
296+
).show()
297+
}
298+
}
299+
}
300+
}
301+
302+
val handleSivaCancel: () -> Unit = {
303+
showSivaDialog.value = false
304+
nestedFile.value?.let { file ->
305+
if (DDOC_MIMETYPE != file.mimeType(context)) {
306+
openNestedContainer(file, false)
307+
}
308+
}
309+
}
310+
311+
val handleSivaConfirmation: () -> Unit = {
312+
showSivaDialog.value = false
313+
nestedFile.value?.let { file ->
314+
openNestedContainer(file, true)
315+
}
316+
}
317+
318+
val handleResult: (Boolean) -> Unit = { isSivaConfirmed ->
319+
if (isSivaConfirmed) {
320+
handleSivaConfirmation()
321+
} else {
322+
handleSivaCancel()
323+
}
324+
}
325+
253326
val onDataFileClick: (File) -> Unit = { file ->
327+
showDataFileBottomSheet.value = false
328+
showLoadingScreen.value = true
329+
val result =
330+
sharedContainerViewModel.openCryptoContainerDataFile(
331+
cryptoContainer = cryptoContainer,
332+
dataFile = file,
333+
)
334+
containerFileOpeningHandler(
335+
result = result,
336+
nestedFile = nestedFile,
337+
showSivaDialog = showSivaDialog,
338+
showLoadingScreen = showLoadingScreen,
339+
context = context,
340+
signingViewModel = null,
341+
encryptViewModel = encryptViewModel,
342+
handleSivaConfirmation = handleSivaConfirmation,
343+
)
344+
}
345+
346+
val onDataFileMoreOptionsActionButtonClick: (File) -> Unit = { file ->
254347
showDataFileBottomSheet.value = true
255348
clickedFile.value = file
256349
}
@@ -581,78 +674,6 @@ fun EncryptNavigation(
581674
) {
582675
var actionRecipient by remember { mutableStateOf<Addressee?>(null) }
583676

584-
val showSivaDialog = remember { mutableStateOf(false) }
585-
val nestedFile = rememberSaveable { mutableStateOf<File?>(null) }
586-
587-
val openNestedContainer: (nestedContainer: File, isSivaConfirmed: Boolean) -> Unit =
588-
{ nestedContainer, isSivaConfirmed ->
589-
scope.launch(IO) {
590-
try {
591-
val isSigningContainer = nestedContainer.isContainer(context)
592-
593-
if (isSigningContainer) {
594-
signingViewModel.openNestedContainer(
595-
context,
596-
nestedContainer,
597-
sharedContainerViewModel,
598-
isSivaConfirmed,
599-
)
600-
601-
withContext(Main) {
602-
sharedContainerViewModel.setIsSivaConfirmed(isSivaConfirmed)
603-
navController.navigate(Route.Signing.route)
604-
}
605-
} else {
606-
encryptViewModel.openNestedContainer(
607-
context,
608-
nestedContainer,
609-
sharedContainerViewModel,
610-
)
611-
}
612-
showLoadingScreen.value = false
613-
} catch (ex: Exception) {
614-
withContext(Main) {
615-
errorLog(
616-
this.javaClass.simpleName,
617-
"Unable to open nested container",
618-
ex,
619-
)
620-
showLoadingScreen.value = false
621-
Toast
622-
.makeText(
623-
context,
624-
ex.localizedMessage,
625-
Toast.LENGTH_LONG,
626-
).show()
627-
}
628-
}
629-
}
630-
}
631-
632-
val handleSivaCancel: () -> Unit = {
633-
showSivaDialog.value = false
634-
nestedFile.value?.let { file ->
635-
if (DDOC_MIMETYPE != file.mimeType(context)) {
636-
openNestedContainer(file, false)
637-
}
638-
}
639-
}
640-
641-
val handleSivaConfirmation: () -> Unit = {
642-
showSivaDialog.value = false
643-
nestedFile.value?.let { file ->
644-
openNestedContainer(file, true)
645-
}
646-
}
647-
648-
val handleResult: (Boolean) -> Unit = { isSivaConfirmed ->
649-
if (isSivaConfirmed) {
650-
handleSivaConfirmation()
651-
} else {
652-
handleSivaCancel()
653-
}
654-
}
655-
656677
Column(
657678
modifier =
658679
modifier
@@ -810,6 +831,7 @@ fun EncryptNavigation(
810831
dataFiles = dataFiles,
811832
isMoreOptionsButtonShown = true,
812833
onClick = onDataFileClick,
834+
onDataFileMoreOptionsActionButtonClick = onDataFileMoreOptionsActionButtonClick,
813835
)
814836
}
815837
} else {
@@ -834,6 +856,8 @@ fun EncryptNavigation(
834856
cryptoContainer,
835857
),
836858
onClick = onDataFileClick,
859+
onDataFileMoreOptionsActionButtonClick =
860+
onDataFileMoreOptionsActionButtonClick,
837861
)
838862
} else {
839863
CryptoDataFilesLocked(modifier = modifier)

app/src/main/kotlin/ee/ria/DigiDoc/ui/component/crypto/bottomsheet/CryptoDataFileBottomSheet.kt

Lines changed: 17 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,10 @@ import androidx.compose.runtime.saveable.rememberSaveable
1212
import androidx.compose.ui.Modifier
1313
import androidx.compose.ui.res.stringResource
1414
import ee.ria.DigiDoc.R
15-
import ee.ria.DigiDoc.common.Constant.SEND_SIVA_CONTAINER_NOTIFICATION_MIMETYPES
1615
import ee.ria.DigiDoc.cryptolib.CryptoContainer
1716
import ee.ria.DigiDoc.domain.model.bottomSheet.BottomSheetButton
1817
import ee.ria.DigiDoc.ui.component.shared.BottomSheet
19-
import ee.ria.DigiDoc.utilsLib.extensions.isContainer
20-
import ee.ria.DigiDoc.utilsLib.extensions.isCryptoContainer
18+
import ee.ria.DigiDoc.ui.component.shared.handler.containerFileOpeningHandler
2119
import ee.ria.DigiDoc.utilsLib.extensions.mimeType
2220
import ee.ria.DigiDoc.utilsLib.logging.LoggingUtil.Companion.errorLog
2321
import ee.ria.DigiDoc.viewmodel.EncryptViewModel
@@ -63,36 +61,22 @@ fun CryptoDataFileBottomSheet(
6361
R.string.main_menu_open_file_accessibility,
6462
)} ${clickedDataFile.value?.name ?: ""} $buttonName",
6563
) {
66-
try {
67-
val dataFile = clickedDataFile.value
68-
if (dataFile != null) {
69-
val containerDataFile =
70-
sharedContainerViewModel.getCryptoContainerDataFile(
71-
cryptoContainer,
72-
dataFile,
73-
)
74-
showLoadingScreen.value = false
75-
containerDataFile?.let { file ->
76-
if (file.isContainer(context) || file.isCryptoContainer()) {
77-
nestedFile.value = file
78-
currentNestedFile.value = file
79-
val nestedFileMimetype = file.mimeType(context)
80-
if (SEND_SIVA_CONTAINER_NOTIFICATION_MIMETYPES.contains(nestedFileMimetype)) {
81-
showSivaDialog.value = true
82-
} else {
83-
showLoadingScreen.value = true
84-
handleSivaConfirmation()
85-
}
86-
} else {
87-
val viewIntent = encryptViewModel.getViewIntent(context, file)
88-
context.startActivity(viewIntent, null)
89-
}
90-
}
91-
}
92-
} catch (ex: Exception) {
93-
errorLog("SigningNavigation", "Unable to open container. Unable to get datafiles", ex)
94-
onBackButtonClick()
95-
}
64+
showLoadingScreen.value = true
65+
val result =
66+
sharedContainerViewModel.openCryptoContainerDataFile(
67+
cryptoContainer = cryptoContainer,
68+
dataFile = clickedDataFile.value,
69+
)
70+
containerFileOpeningHandler(
71+
result = result,
72+
nestedFile = nestedFile,
73+
showSivaDialog = showSivaDialog,
74+
showLoadingScreen = showLoadingScreen,
75+
context = context,
76+
signingViewModel = null,
77+
encryptViewModel = encryptViewModel,
78+
handleSivaConfirmation = handleSivaConfirmation,
79+
)
9680
},
9781
BottomSheetButton(
9882
icon = R.drawable.ic_m3_download_48dp_wght400,

app/src/main/kotlin/ee/ria/DigiDoc/ui/component/shared/CryptoDataFileItem.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ fun CryptoDataFileItem(
5555
dataFiles: List<File>,
5656
isMoreOptionsButtonShown: Boolean = true,
5757
onClick: (File) -> Unit,
58+
onDataFileMoreOptionsActionButtonClick: (File) -> Unit,
5859
) {
5960
val context = LocalContext.current
6061
val fileDescription = stringResource(R.string.file)
@@ -138,7 +139,7 @@ fun CryptoDataFileItem(
138139
)
139140
}
140141
if (isMoreOptionsButtonShown) {
141-
IconButton(onClick = { onClick(dataFile) }) {
142+
IconButton(onClick = { onDataFileMoreOptionsActionButtonClick(dataFile) }) {
142143
Icon(
143144
modifier =
144145
modifier
@@ -171,6 +172,7 @@ fun CryptoDataFileItemPreview() {
171172
CryptoDataFileItem(
172173
dataFiles = listOf(),
173174
onClick = {},
175+
onDataFileMoreOptionsActionButtonClick = {},
174176
)
175177
}
176178
}

app/src/main/kotlin/ee/ria/DigiDoc/ui/component/shared/handler/ContainerFileOpeningHandler.kt

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@
33
package ee.ria.DigiDoc.ui.component.shared.handler
44

55
import android.content.Context
6+
import android.content.Intent
67
import androidx.compose.runtime.MutableState
78
import ee.ria.DigiDoc.R
89
import ee.ria.DigiDoc.domain.model.ContainerFileOpeningResult
910
import ee.ria.DigiDoc.utils.snackbar.SnackBarManager.showMessage
11+
import ee.ria.DigiDoc.viewmodel.EncryptViewModel
1012
import ee.ria.DigiDoc.viewmodel.SigningViewModel
1113
import java.io.File
1214

@@ -16,7 +18,8 @@ fun containerFileOpeningHandler(
1618
showSivaDialog: MutableState<Boolean>,
1719
showLoadingScreen: MutableState<Boolean>,
1820
context: Context,
19-
signingViewModel: SigningViewModel,
21+
signingViewModel: SigningViewModel?,
22+
encryptViewModel: EncryptViewModel?,
2023
handleSivaConfirmation: () -> Unit,
2124
) {
2225
when (result) {
@@ -30,7 +33,12 @@ fun containerFileOpeningHandler(
3033
}
3134
}
3235
is ContainerFileOpeningResult.OpenWithFile -> {
33-
val intent = signingViewModel.getViewIntent(context, result.file)
36+
var intent: Intent? = null
37+
if (signingViewModel != null) {
38+
intent = signingViewModel.getViewIntent(context, result.file)
39+
} else if (encryptViewModel != null) {
40+
intent = encryptViewModel.getViewIntent(context, result.file)
41+
}
3442
context.startActivity(intent, null)
3543
}
3644
is ContainerFileOpeningResult.Error -> {

app/src/main/kotlin/ee/ria/DigiDoc/ui/component/signing/SigningNavigation.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,7 @@ fun SigningNavigation(
370370
showLoadingScreen = showLoadingScreen,
371371
context = context,
372372
signingViewModel = signingViewModel,
373+
encryptViewModel = null,
373374
handleSivaConfirmation = handleSivaConfirmation,
374375
)
375376
}

app/src/main/kotlin/ee/ria/DigiDoc/ui/component/signing/bottomsheet/DataFileBottomSheet.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ fun DataFileBottomSheet(
7272
showLoadingScreen = showLoadingScreen,
7373
context = context,
7474
signingViewModel = signingViewModel,
75+
encryptViewModel = null,
7576
handleSivaConfirmation = handleSivaConfirmation,
7677
)
7778
},

app/src/main/kotlin/ee/ria/DigiDoc/viewmodel/shared/SharedContainerViewModel.kt

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,42 @@ class SharedContainerViewModel
207207
ContainerFileOpeningResult.OpenWithFile(containerDataFile)
208208
}
209209
} catch (ex: Exception) {
210-
errorLog("SigningNavigation", "Unable to open container. Unable to get datafiles", ex)
210+
errorLog("SharedContainerViewModel", "Unable to open container. Unable to get datafiles", ex)
211+
ContainerFileOpeningResult.Error(ex)
212+
}
213+
}
214+
215+
fun openCryptoContainerDataFile(
216+
cryptoContainer: CryptoContainer?,
217+
dataFile: File?,
218+
): ContainerFileOpeningResult {
219+
return try {
220+
if (dataFile == null) {
221+
return ContainerFileOpeningResult.Error(IllegalArgumentException("Clicked data file is null"))
222+
}
223+
224+
val containerDataFile =
225+
getCryptoContainerDataFile(
226+
cryptoContainer,
227+
dataFile,
228+
)
229+
?: return ContainerFileOpeningResult.Error(IllegalStateException("Container data file is null"))
230+
231+
if (
232+
containerDataFile.isContainer(context) ||
233+
containerDataFile.isCryptoContainer() ||
234+
(containerDataFile.isSignedPDF(context))
235+
) {
236+
val mimetype = containerDataFile.mimeType(context)
237+
ContainerFileOpeningResult.OpenNestedFile(
238+
file = containerDataFile,
239+
needsSivaDialog = SEND_SIVA_CONTAINER_NOTIFICATION_MIMETYPES.contains(mimetype),
240+
)
241+
} else {
242+
ContainerFileOpeningResult.OpenWithFile(containerDataFile)
243+
}
244+
} catch (ex: Exception) {
245+
errorLog("SharedContainerViewModel", "Unable to open container. Unable to get datafiles", ex)
211246
ContainerFileOpeningResult.Error(ex)
212247
}
213248
}

0 commit comments

Comments
 (0)