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.