compose: details: Only request required permissions

Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
This commit is contained in:
Aayush Gupta
2025-09-10 21:09:21 +08:00
parent 88ba2f4718
commit 697c83c8cc
3 changed files with 26 additions and 6 deletions

View File

@@ -7,6 +7,7 @@ package com.aurora.store.compose.navigation
import android.os.Parcelable
import androidx.navigation3.runtime.NavKey
import com.aurora.store.data.model.PermissionType
import kotlinx.parcelize.Parcelize
import kotlinx.serialization.Serializable
@@ -34,5 +35,5 @@ sealed class Screen : NavKey, Parcelable {
data object Search : Screen()
@Serializable
data object Permissions : Screen()
data class Permissions(val requiredPermissions: Set<PermissionType> = emptySet()) : Screen()
}

View File

@@ -49,6 +49,7 @@ import com.aurora.Constants.SHARE_URL
import com.aurora.extensions.appInfo
import com.aurora.extensions.browse
import com.aurora.extensions.requiresGMS
import com.aurora.extensions.requiresObbDir
import com.aurora.extensions.share
import com.aurora.extensions.toast
import com.aurora.gplayapi.data.models.App
@@ -80,6 +81,7 @@ import com.aurora.store.compose.ui.dev.DevProfileScreen
import com.aurora.store.compose.ui.onboarding.PermissionsScreen
import com.aurora.store.data.installer.AppInstaller
import com.aurora.store.data.model.AppState
import com.aurora.store.data.model.PermissionType
import com.aurora.store.data.model.Report
import com.aurora.store.data.model.Scores
import com.aurora.store.data.providers.PermissionProvider.Companion.isPermittedToInstall
@@ -244,8 +246,12 @@ private fun ScreenContentApp(
onDownload()
onNavigateBack()
} else {
context.toast(R.string.permissions_denied)
showExtraPane(Screen.Permissions)
val requiredPermissions = setOfNotNull(
PermissionType.INSTALL_UNKNOWN_APPS,
if (app.fileList.requiresObbDir()) PermissionType.STORAGE_MANAGER else null,
if (app.fileList.requiresObbDir()) PermissionType.EXTERNAL_STORAGE else null
)
showExtraPane(Screen.Permissions(requiredPermissions = requiredPermissions))
}
}
@@ -490,6 +496,7 @@ private fun ScreenContentApp(
is Screen.Permissions -> PermissionsScreen(
onNavigateUp = ::onNavigateBack,
requiredPermissions = screen.requiredPermissions,
onPermissionCallback = { onInstall() }
)

View File

@@ -55,6 +55,7 @@ private const val TAG = "PermissionsScreen"
@Composable
fun PermissionsScreen(
isOnboarding: Boolean = false,
requiredPermissions: Set<PermissionType> = emptySet(),
onNavigateUp: () -> Unit,
onPermissionCallback: (type: PermissionType) -> Unit = {},
viewModel: PermissionsViewModel = hiltViewModel()
@@ -63,7 +64,11 @@ fun PermissionsScreen(
ScreenContent(
isOnboarding = isOnboarding,
permissions = permissions,
permissions = when {
requiredPermissions.isEmpty() -> permissions
else -> permissions.filter { it.type in requiredPermissions }
.map { permission -> permission.copy(optional = false) }
},
onNavigateUp = onNavigateUp,
onPermissionCallback = { type ->
viewModel.refreshPermissionsList()
@@ -97,9 +102,16 @@ private fun ScreenContent(
)
)
fun onResult() {
permissionRequested?.let {
if (!isGranted(context, it)) context.toast(R.string.permissions_denied)
onPermissionCallback(it)
}
}
val intentLauncher = rememberLauncherForActivityResult(
contract = ActivityResultContracts.StartActivityForResult(),
onResult = { permissionRequested?.let { onPermissionCallback(it) } }
onResult = { onResult() }
)
val permissionLauncher = rememberLauncherForActivityResult(
contract = ActivityResultContracts.RequestPermission(),
@@ -109,7 +121,7 @@ private fun ScreenContent(
intentLauncher.launch(intentMap[PermissionType.STORAGE_MANAGER]!!)
}
else -> permissionRequested?.let { onPermissionCallback(it) }
else -> onResult()
}
}
)