compose: details: Only request required permissions
Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
This commit is contained in:
@@ -7,6 +7,7 @@ package com.aurora.store.compose.navigation
|
|||||||
|
|
||||||
import android.os.Parcelable
|
import android.os.Parcelable
|
||||||
import androidx.navigation3.runtime.NavKey
|
import androidx.navigation3.runtime.NavKey
|
||||||
|
import com.aurora.store.data.model.PermissionType
|
||||||
import kotlinx.parcelize.Parcelize
|
import kotlinx.parcelize.Parcelize
|
||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
@@ -34,5 +35,5 @@ sealed class Screen : NavKey, Parcelable {
|
|||||||
data object Search : Screen()
|
data object Search : Screen()
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
data object Permissions : Screen()
|
data class Permissions(val requiredPermissions: Set<PermissionType> = emptySet()) : Screen()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ import com.aurora.Constants.SHARE_URL
|
|||||||
import com.aurora.extensions.appInfo
|
import com.aurora.extensions.appInfo
|
||||||
import com.aurora.extensions.browse
|
import com.aurora.extensions.browse
|
||||||
import com.aurora.extensions.requiresGMS
|
import com.aurora.extensions.requiresGMS
|
||||||
|
import com.aurora.extensions.requiresObbDir
|
||||||
import com.aurora.extensions.share
|
import com.aurora.extensions.share
|
||||||
import com.aurora.extensions.toast
|
import com.aurora.extensions.toast
|
||||||
import com.aurora.gplayapi.data.models.App
|
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.compose.ui.onboarding.PermissionsScreen
|
||||||
import com.aurora.store.data.installer.AppInstaller
|
import com.aurora.store.data.installer.AppInstaller
|
||||||
import com.aurora.store.data.model.AppState
|
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.Report
|
||||||
import com.aurora.store.data.model.Scores
|
import com.aurora.store.data.model.Scores
|
||||||
import com.aurora.store.data.providers.PermissionProvider.Companion.isPermittedToInstall
|
import com.aurora.store.data.providers.PermissionProvider.Companion.isPermittedToInstall
|
||||||
@@ -244,8 +246,12 @@ private fun ScreenContentApp(
|
|||||||
onDownload()
|
onDownload()
|
||||||
onNavigateBack()
|
onNavigateBack()
|
||||||
} else {
|
} else {
|
||||||
context.toast(R.string.permissions_denied)
|
val requiredPermissions = setOfNotNull(
|
||||||
showExtraPane(Screen.Permissions)
|
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(
|
is Screen.Permissions -> PermissionsScreen(
|
||||||
onNavigateUp = ::onNavigateBack,
|
onNavigateUp = ::onNavigateBack,
|
||||||
|
requiredPermissions = screen.requiredPermissions,
|
||||||
onPermissionCallback = { onInstall() }
|
onPermissionCallback = { onInstall() }
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ private const val TAG = "PermissionsScreen"
|
|||||||
@Composable
|
@Composable
|
||||||
fun PermissionsScreen(
|
fun PermissionsScreen(
|
||||||
isOnboarding: Boolean = false,
|
isOnboarding: Boolean = false,
|
||||||
|
requiredPermissions: Set<PermissionType> = emptySet(),
|
||||||
onNavigateUp: () -> Unit,
|
onNavigateUp: () -> Unit,
|
||||||
onPermissionCallback: (type: PermissionType) -> Unit = {},
|
onPermissionCallback: (type: PermissionType) -> Unit = {},
|
||||||
viewModel: PermissionsViewModel = hiltViewModel()
|
viewModel: PermissionsViewModel = hiltViewModel()
|
||||||
@@ -63,7 +64,11 @@ fun PermissionsScreen(
|
|||||||
|
|
||||||
ScreenContent(
|
ScreenContent(
|
||||||
isOnboarding = isOnboarding,
|
isOnboarding = isOnboarding,
|
||||||
permissions = permissions,
|
permissions = when {
|
||||||
|
requiredPermissions.isEmpty() -> permissions
|
||||||
|
else -> permissions.filter { it.type in requiredPermissions }
|
||||||
|
.map { permission -> permission.copy(optional = false) }
|
||||||
|
},
|
||||||
onNavigateUp = onNavigateUp,
|
onNavigateUp = onNavigateUp,
|
||||||
onPermissionCallback = { type ->
|
onPermissionCallback = { type ->
|
||||||
viewModel.refreshPermissionsList()
|
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(
|
val intentLauncher = rememberLauncherForActivityResult(
|
||||||
contract = ActivityResultContracts.StartActivityForResult(),
|
contract = ActivityResultContracts.StartActivityForResult(),
|
||||||
onResult = { permissionRequested?.let { onPermissionCallback(it) } }
|
onResult = { onResult() }
|
||||||
)
|
)
|
||||||
val permissionLauncher = rememberLauncherForActivityResult(
|
val permissionLauncher = rememberLauncherForActivityResult(
|
||||||
contract = ActivityResultContracts.RequestPermission(),
|
contract = ActivityResultContracts.RequestPermission(),
|
||||||
@@ -109,7 +121,7 @@ private fun ScreenContent(
|
|||||||
intentLauncher.launch(intentMap[PermissionType.STORAGE_MANAGER]!!)
|
intentLauncher.launch(intentMap[PermissionType.STORAGE_MANAGER]!!)
|
||||||
}
|
}
|
||||||
|
|
||||||
else -> permissionRequested?.let { onPermissionCallback(it) }
|
else -> onResult()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user