fix: request file perms on android <= 10 (#24)

This commit is contained in:
Diamond 2022-09-24 19:56:34 -07:00 • committed by GitHub
parent 1b607f5897
commit e226e3cfe9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 42 additions and 10 deletions

View file

@ -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">
<service android:name=".installer.service.InstallService" />

View file

@ -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(),

View file

@ -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
)
)
}
}

View file

@ -50,5 +50,5 @@
<string name="appearance">Appearance</string>
<string name="advanced">Advanced</string>
<string name="permissions_grant">Grant Permissions</string>
<string name="permissions_grant_body">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.</string>
<string name="permissions_grant_body">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.</string>
</resources>