feat: improve flow for getting MANAGE_EXTERNAL_STORAGE (#20)

This commit is contained in:
Diamond 2022-09-22 18:13:07 -07:00 • committed by GitHub
parent 9abc2db184
commit d5a785190e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 58 additions and 82 deletions

View file

@ -5,9 +5,8 @@
package com.aliucord.manager
import android.content.Intent
import android.os.*
import android.provider.Settings
import android.os.Bundle
import android.os.Environment
import androidx.activity.ComponentActivity
import androidx.activity.compose.BackHandler
import androidx.activity.compose.setContent
@ -15,9 +14,9 @@ import androidx.compose.animation.*
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.ui.Modifier
import androidx.core.net.toUri
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.navigation.AppDestination
import com.aliucord.manager.ui.screen.*
import com.aliucord.manager.ui.theme.ManagerTheme
@ -37,13 +36,6 @@ class MainActivity : ComponentActivity() {
super.onCreate(savedInstanceState)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && !Environment.isExternalStorageManager()) {
val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION)
.setData("package:com.aliucord.manager".toUri())
startActivity(intent)
}
setContent {
ManagerTheme(
isDarkTheme = preferences.theme == Theme.DARK || preferences.theme == Theme.SYSTEM && isSystemInDarkTheme(),
@ -55,6 +47,8 @@ class MainActivity : ComponentActivity() {
if (!navigator.pop()) finish()
}
ManageStorageDialog()
Taxi(
modifier = Modifier.fillMaxSize(),
navigator = navigator,

View file

@ -1,66 +0,0 @@
/*
* Copyright (c) 2022 Juby210 & zt
* Licensed under the Open Software License version 3.0
*/
package com.aliucord.manager.ui.component
import android.content.Intent
import android.net.Uri
import android.provider.Settings
import androidx.compose.foundation.layout.*
import androidx.compose.material3.*
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import com.aliucord.manager.BuildConfig
import com.aliucord.manager.R
import com.google.accompanist.permissions.ExperimentalPermissionsApi
import com.google.accompanist.permissions.PermissionState
@OptIn(ExperimentalPermissionsApi::class)
@Composable
fun GrantPermission(permissionState: PermissionState) {
Surface {
Column(
modifier = Modifier.fillMaxSize(),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
Text(
text = stringResource(R.string.permission_required),
style = MaterialTheme.typography.headlineMedium,
textAlign = TextAlign.Center
)
Spacer(Modifier.height(8.dp))
Row {
val context = LocalContext.current
Button(onClick = permissionState::launchPermissionRequest) {
Text(stringResource(R.string.permission_grant))
}
Spacer(Modifier.width(8.dp))
Button(
onClick = {
context.startActivity(
Intent(
/* action = */ Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
/* uri = */ Uri.fromParts("package", BuildConfig.APPLICATION_ID, null)
)
)
}
) {
Text(stringResource(R.string.open_settings))
}
}
}
}
}

View file

@ -3,7 +3,7 @@
* Licensed under the Open Software License version 3.0
*/
package com.aliucord.manager.ui.component
package com.aliucord.manager.ui.dialog
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*

View file

@ -0,0 +1,47 @@
package com.aliucord.manager.ui.dialog
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.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.window.DialogProperties
import androidx.core.net.toUri
import com.aliucord.manager.R
@Composable
fun ManageStorageDialog() {
var manageStorageGranted by remember { mutableStateOf(Environment.isExternalStorageManager()) }
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && !manageStorageGranted) {
AlertDialog(
onDismissRequest = {},
confirmButton = {
val launcher = rememberLauncherForActivityResult(ActivityResultContracts.StartActivityForResult()) {
if (Environment.isExternalStorageManager())
manageStorageGranted = true
}
Button(
onClick = {
Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION)
.setData("package:com.aliucord.manager".toUri())
.let { launcher.launch(it) }
},
) {
Text(stringResource(R.string.open_settings))
}
},
title = { Text(stringResource(R.string.permissions_grant)) },
text = { Text(stringResource(R.string.permissions_grant_body)) },
properties = DialogProperties(
dismissOnBackPress = false,
dismissOnClickOutside = false
)
)
}
}

View file

@ -26,7 +26,8 @@ import androidx.paging.LoadState
import androidx.paging.compose.collectAsLazyPagingItems
import androidx.paging.compose.items
import com.aliucord.manager.R
import com.aliucord.manager.ui.component.*
import com.aliucord.manager.ui.dialog.DownloadMethod
import com.aliucord.manager.ui.dialog.InstallerDialog
import com.aliucord.manager.ui.viewmodel.HomeViewModel
import org.koin.androidx.compose.getViewModel

View file

@ -18,7 +18,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import com.aliucord.manager.R
import com.aliucord.manager.ui.component.DownloadMethod
import com.aliucord.manager.ui.dialog.DownloadMethod
import com.aliucord.manager.ui.viewmodel.InstallViewModel
import kotlinx.parcelize.Parcelize
import org.koin.androidx.compose.getViewModel

View file

@ -4,8 +4,6 @@
<string name="commits">Commits</string>
<string name="dex_location">Dex location</string>
<string name="open_settings">Open settings</string>
<string name="permission_required">You need to grant storage permission to use this app</string>
<string name="permission_grant">Grant permission</string>
<string name="replace_bg">Replace app icon with Aliucord variant</string>
<string name="settings">Settings</string>
<string name="show_menu">Show menu</string>
@ -51,4 +49,6 @@
<string name="dynamic_color">Dynamic color</string>
<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>
</resources>