From e226e3cfe9ddec893b890a221bbecdfa9abaf5f0 Mon Sep 17 00:00:00 2001 From: Diamond <33725716+DiamondMiner88@users.noreply.github.com> Date: Sat, 24 Sep 2022 19:56:34 -0700 Subject: [PATCH] fix: request file perms on android <= 10 (#24) --- app/src/main/AndroidManifest.xml | 1 + .../com/aliucord/manager/MainActivity.kt | 6 +-- ...eDialog.kt => StoragePermissionsDialog.kt} | 43 ++++++++++++++++--- app/src/main/res/values/strings.xml | 2 +- 4 files changed, 42 insertions(+), 10 deletions(-) rename app/src/main/kotlin/com/aliucord/manager/ui/dialog/{ManageStorageDialog.kt => StoragePermissionsDialog.kt} (58%) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f713b06..0c19329 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,6 +26,7 @@ android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" + android:requestLegacyExternalStorage="true" android:supportsRtl="true" tools:ignore="AllowBackup"> diff --git a/app/src/main/kotlin/com/aliucord/manager/MainActivity.kt b/app/src/main/kotlin/com/aliucord/manager/MainActivity.kt index 2bdff46..46bcfd5 100644 --- a/app/src/main/kotlin/com/aliucord/manager/MainActivity.kt +++ b/app/src/main/kotlin/com/aliucord/manager/MainActivity.kt @@ -15,7 +15,7 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.ui.Modifier import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen import com.aliucord.manager.domain.manager.PreferencesManager -import com.aliucord.manager.ui.dialog.ManageStorageDialog +import com.aliucord.manager.ui.dialog.StoragePermissionsDialog import com.aliucord.manager.ui.navigation.AppDestination import com.aliucord.manager.ui.screen.* import com.aliucord.manager.ui.theme.ManagerTheme @@ -46,9 +46,7 @@ class MainActivity : ComponentActivity() { if (!navigator.pop()) finish() } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - ManageStorageDialog() - } + StoragePermissionsDialog() Taxi( modifier = Modifier.fillMaxSize(), diff --git a/app/src/main/kotlin/com/aliucord/manager/ui/dialog/ManageStorageDialog.kt b/app/src/main/kotlin/com/aliucord/manager/ui/dialog/StoragePermissionsDialog.kt similarity index 58% rename from app/src/main/kotlin/com/aliucord/manager/ui/dialog/ManageStorageDialog.kt rename to app/src/main/kotlin/com/aliucord/manager/ui/dialog/StoragePermissionsDialog.kt index f2f4cc9..9949938 100644 --- a/app/src/main/kotlin/com/aliucord/manager/ui/dialog/ManageStorageDialog.kt +++ b/app/src/main/kotlin/com/aliucord/manager/ui/dialog/StoragePermissionsDialog.kt @@ -1,12 +1,12 @@ package com.aliucord.manager.ui.dialog +import android.Manifest import android.content.Intent import android.os.Build import android.os.Environment import android.provider.Settings import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts -import androidx.annotation.RequiresApi import androidx.compose.material3.* import androidx.compose.runtime.* import androidx.compose.ui.res.stringResource @@ -14,10 +14,19 @@ import androidx.compose.ui.window.DialogProperties import androidx.core.net.toUri import com.aliucord.manager.BuildConfig import com.aliucord.manager.R +import com.google.accompanist.permissions.* -@RequiresApi(Build.VERSION_CODES.R) @Composable -fun ManageStorageDialog() { +fun StoragePermissionsDialog() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + ManageStorageDialog() + } else { + ExternalStorageDialog() + } +} + +@Composable +private fun ManageStorageDialog() { var manageStorageGranted by remember { mutableStateOf(Environment.isExternalStorageManager()) } if (!manageStorageGranted) { @@ -25,8 +34,9 @@ fun ManageStorageDialog() { onDismissRequest = {}, confirmButton = { val launcher = rememberLauncherForActivityResult(ActivityResultContracts.StartActivityForResult()) { - if (Environment.isExternalStorageManager()) + if (Environment.isExternalStorageManager()) { manageStorageGranted = true + } } Button( @@ -34,7 +44,7 @@ fun ManageStorageDialog() { Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION) .setData("package:${BuildConfig.APPLICATION_ID}".toUri()) .let { launcher.launch(it) } - }, + } ) { Text(stringResource(R.string.open_settings)) } @@ -48,3 +58,26 @@ fun ManageStorageDialog() { ) } } + +@OptIn(ExperimentalPermissionsApi::class) +@Composable +private fun ExternalStorageDialog() { + val writeStorageState = rememberPermissionState(Manifest.permission.WRITE_EXTERNAL_STORAGE) + + if (!writeStorageState.status.isGranted) { + AlertDialog( + onDismissRequest = {}, + confirmButton = { + Button(onClick = writeStorageState::launchPermissionRequest) { + Text(stringResource(R.string.confirm)) + } + }, + title = { Text(stringResource(R.string.permissions_grant)) }, + text = { Text(stringResource(R.string.permissions_grant_body)) }, + properties = DialogProperties( + dismissOnBackPress = false, + dismissOnClickOutside = false + ) + ) + } +} diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ca623c3..570a0e5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -50,5 +50,5 @@ Appearance Advanced Grant Permissions - In order for Aliucord Manager to work properly, you need to grant file permissions. Since this device is above Android 10, MANAGE_EXTERNAL_STORAGE is required to access ~/Aliucord, where shared data is stored. + In order for Aliucord Manager to work properly, you need to grant file permissions. Since shared data in stored in ~/Aliucord, permissions are required in order for manager to function.