From 704d5c02024a113edc7ea3bb0bdd12a4df02af5f Mon Sep 17 00:00:00 2001 From: wingio Date: Fri, 30 Jun 2023 15:06:20 -0400 Subject: [PATCH] Add confirm dialog to download asset --- .../gloom/di/modules/ManagerModule.kt | 2 + .../gloom/domain/manager/DialogManager.kt | 16 ++++ .../ui/viewmodels/release/ReleaseViewModel.kt | 2 + .../gloom/ui/widgets/release/ReleaseAsset.kt | 35 ++++++- .../dialog/ReleaseAssetDownloadDialog.kt | 92 +++++++++++++++++++ .../java/com/materiiapps/gloom/utils/Utils.kt | 4 + 6 files changed, 149 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/com/materiiapps/gloom/domain/manager/DialogManager.kt create mode 100644 app/src/main/java/com/materiiapps/gloom/ui/widgets/release/dialog/ReleaseAssetDownloadDialog.kt diff --git a/app/src/main/java/com/materiiapps/gloom/di/modules/ManagerModule.kt b/app/src/main/java/com/materiiapps/gloom/di/modules/ManagerModule.kt index 6eba24b..5e8ced9 100644 --- a/app/src/main/java/com/materiiapps/gloom/di/modules/ManagerModule.kt +++ b/app/src/main/java/com/materiiapps/gloom/di/modules/ManagerModule.kt @@ -1,6 +1,7 @@ package com.materiiapps.gloom.di.modules import com.materiiapps.gloom.domain.manager.AuthManager +import com.materiiapps.gloom.domain.manager.DialogManager import com.materiiapps.gloom.domain.manager.DownloadManager import com.materiiapps.gloom.domain.manager.PreferenceManager import org.koin.core.module.dsl.singleOf @@ -11,5 +12,6 @@ fun managerModule() = module { singleOf(::PreferenceManager) singleOf(::AuthManager) singleOf(::DownloadManager) + singleOf(::DialogManager) } \ No newline at end of file diff --git a/app/src/main/java/com/materiiapps/gloom/domain/manager/DialogManager.kt b/app/src/main/java/com/materiiapps/gloom/domain/manager/DialogManager.kt new file mode 100644 index 0000000..35a895b --- /dev/null +++ b/app/src/main/java/com/materiiapps/gloom/domain/manager/DialogManager.kt @@ -0,0 +1,16 @@ +package com.materiiapps.gloom.domain.manager + +import android.content.Context +import com.materiiapps.gloom.domain.manager.base.BasePreferenceManager + +class DialogManager(context: Context): BasePreferenceManager(context.getSharedPreferences("dialogs", Context.MODE_PRIVATE)) { + + var downloadAsset by enumPreference("release_asset_download", DialogState.UNKNOWN) + +} + +enum class DialogState { + UNKNOWN, + CONFIRMED, + DENIED +} \ No newline at end of file diff --git a/app/src/main/java/com/materiiapps/gloom/ui/viewmodels/release/ReleaseViewModel.kt b/app/src/main/java/com/materiiapps/gloom/ui/viewmodels/release/ReleaseViewModel.kt index 2b4f3ad..d1ac1e9 100644 --- a/app/src/main/java/com/materiiapps/gloom/ui/viewmodels/release/ReleaseViewModel.kt +++ b/app/src/main/java/com/materiiapps/gloom/ui/viewmodels/release/ReleaseViewModel.kt @@ -6,6 +6,8 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.core.net.toUri import cafe.adriel.voyager.core.model.coroutineScope +import com.materiiapps.gloom.domain.manager.DialogManager +import com.materiiapps.gloom.domain.manager.DialogState import com.materiiapps.gloom.domain.manager.DownloadManager import com.materiiapps.gloom.domain.repository.GraphQLRepository import com.materiiapps.gloom.gql.ReleaseDetailsQuery diff --git a/app/src/main/java/com/materiiapps/gloom/ui/widgets/release/ReleaseAsset.kt b/app/src/main/java/com/materiiapps/gloom/ui/widgets/release/ReleaseAsset.kt index 1e6ebbb..bf2c297 100644 --- a/app/src/main/java/com/materiiapps/gloom/ui/widgets/release/ReleaseAsset.kt +++ b/app/src/main/java/com/materiiapps/gloom/ui/widgets/release/ReleaseAsset.kt @@ -20,6 +20,10 @@ import androidx.compose.material3.LocalContentColor import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip @@ -27,7 +31,11 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import com.materiiapps.gloom.domain.manager.DialogManager +import com.materiiapps.gloom.domain.manager.DialogState +import com.materiiapps.gloom.ui.widgets.release.dialog.ReleaseAssetDownloadDialog import com.materiiapps.gloom.utils.getFileSizeString +import org.koin.androidx.compose.get @Composable fun ReleaseAsset( @@ -35,6 +43,10 @@ fun ReleaseAsset( size: Int, onDownloadClick: () -> Unit ) { + val dialogManager: DialogManager = get() + var showConfirmDialog by remember { + mutableStateOf(false) + } val icon = when (name.split(".").lastOrNull()?.lowercase()) { "apks", "apkx", @@ -90,7 +102,7 @@ fun ReleaseAsset( ) Text( - text = getFileSizeString(size, LocalContext.current), + text = getFileSizeString(size), style = MaterialTheme.typography.labelMedium, maxLines = 1, overflow = TextOverflow.Ellipsis, @@ -98,8 +110,27 @@ fun ReleaseAsset( ) } + if(showConfirmDialog) { + ReleaseAssetDownloadDialog( + fileName = name, + fileSize = size, + onClose = { showConfirmDialog = false }, + onConfirm = { dontShowAgain -> + if(dontShowAgain) dialogManager.downloadAsset = DialogState.CONFIRMED + showConfirmDialog = false + onDownloadClick() + } + ) + } - IconButton(onClick = onDownloadClick) { + IconButton( + onClick = { + if (dialogManager.downloadAsset == DialogState.UNKNOWN) + showConfirmDialog = true + else + onDownloadClick() + } + ) { Icon( imageVector = Icons.Filled.Download, contentDescription = null diff --git a/app/src/main/java/com/materiiapps/gloom/ui/widgets/release/dialog/ReleaseAssetDownloadDialog.kt b/app/src/main/java/com/materiiapps/gloom/ui/widgets/release/dialog/ReleaseAssetDownloadDialog.kt new file mode 100644 index 0000000..3fc38fa --- /dev/null +++ b/app/src/main/java/com/materiiapps/gloom/ui/widgets/release/dialog/ReleaseAssetDownloadDialog.kt @@ -0,0 +1,92 @@ +package com.materiiapps.gloom.ui.widgets.release.dialog + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.size +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Download +import androidx.compose.material.icons.outlined.Download +import androidx.compose.material.icons.rounded.Download +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.Checkbox +import androidx.compose.material3.FilledTonalButton +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.semantics.Role +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import com.materiiapps.gloom.R +import com.materiiapps.gloom.utils.getFileSizeString + +@Composable +fun ReleaseAssetDownloadDialog( + fileName: String, + fileSize: Int, + onClose: () -> Unit, + onConfirm: (dontShowAgain: Boolean) -> Unit +) { + var checked by remember { + mutableStateOf(false) + } + + AlertDialog( + onDismissRequest = onClose, + confirmButton = { + FilledTonalButton(onClick = { onConfirm(checked) }) { + Text("Download") + } + }, + dismissButton = { + TextButton(onClick = onClose) { + Text("Cancel") + } + }, + icon = { + Icon( + imageVector = Icons.Rounded.Download, + contentDescription = null, + modifier = Modifier.size(30.dp) + ) + }, + title = { + Text( + text = "Confirm download", + textAlign = TextAlign.Center, + modifier = Modifier.fillMaxWidth() + ) + }, + text = { + Column( + verticalArrangement = Arrangement.spacedBy(16.dp), + ) { + Text( + text = "You are about to download $fileName (${getFileSizeString(fileSize)}), are you sure you want to do that?", + textAlign = TextAlign.Center, + modifier = Modifier.fillMaxWidth() + ) + + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier + .clickable(role = Role.Checkbox) { checked = !checked } + .fillMaxWidth() + ) { + Checkbox(checked = checked, onCheckedChange = { checked = it }) + Text("Don't show this again") + } + } + } + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/materiiapps/gloom/utils/Utils.kt b/app/src/main/java/com/materiiapps/gloom/utils/Utils.kt index 1ce0d5d..73de43c 100644 --- a/app/src/main/java/com/materiiapps/gloom/utils/Utils.kt +++ b/app/src/main/java/com/materiiapps/gloom/utils/Utils.kt @@ -7,6 +7,7 @@ import android.widget.Toast import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalContext import com.materiiapps.gloom.R import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -74,6 +75,9 @@ fun Context.shareText(text: String) = Intent(Intent.ACTION_SEND).apply { fun String?.ifNullOrBlank(block: () -> String) = if (isNullOrBlank()) block() else this +@Composable +fun getFileSizeString(size: Int) = getFileSizeString(size, LocalContext.current) + fun getFileSizeString(size: Int, context: Context): String { return when { size < Constants.FILE_SIZES.KILO -> context.getString(R.string.file_size_bytes, size)