diff --git a/app/src/main/java/com/aurora/store/compose/navigation/Screen.kt b/app/src/main/java/com/aurora/store/compose/navigation/Screen.kt index 1e0ae1fdb..39f9cce33 100644 --- a/app/src/main/java/com/aurora/store/compose/navigation/Screen.kt +++ b/app/src/main/java/com/aurora/store/compose/navigation/Screen.kt @@ -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 = emptySet()) : Screen() } diff --git a/app/src/main/java/com/aurora/store/compose/ui/details/AppDetailsScreen.kt b/app/src/main/java/com/aurora/store/compose/ui/details/AppDetailsScreen.kt index 492f84d81..6bbac2010 100644 --- a/app/src/main/java/com/aurora/store/compose/ui/details/AppDetailsScreen.kt +++ b/app/src/main/java/com/aurora/store/compose/ui/details/AppDetailsScreen.kt @@ -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() } ) diff --git a/app/src/main/java/com/aurora/store/compose/ui/onboarding/PermissionsScreen.kt b/app/src/main/java/com/aurora/store/compose/ui/onboarding/PermissionsScreen.kt index fa453ffd0..cfcb75c48 100644 --- a/app/src/main/java/com/aurora/store/compose/ui/onboarding/PermissionsScreen.kt +++ b/app/src/main/java/com/aurora/store/compose/ui/onboarding/PermissionsScreen.kt @@ -55,6 +55,7 @@ private const val TAG = "PermissionsScreen" @Composable fun PermissionsScreen( isOnboarding: Boolean = false, + requiredPermissions: Set = 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() } } )