diff --git a/app/src/main/kotlin/com/aliucord/manager/MainActivity.kt b/app/src/main/kotlin/com/aliucord/manager/MainActivity.kt
index 3a8f985..67bbf22 100644
--- a/app/src/main/kotlin/com/aliucord/manager/MainActivity.kt
+++ b/app/src/main/kotlin/com/aliucord/manager/MainActivity.kt
@@ -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,
diff --git a/app/src/main/kotlin/com/aliucord/manager/ui/component/GrantPermission.kt b/app/src/main/kotlin/com/aliucord/manager/ui/component/GrantPermission.kt
deleted file mode 100644
index 98fccc9..0000000
--- a/app/src/main/kotlin/com/aliucord/manager/ui/component/GrantPermission.kt
+++ /dev/null
@@ -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))
- }
- }
- }
- }
-}
diff --git a/app/src/main/kotlin/com/aliucord/manager/ui/component/InstallerDialog.kt b/app/src/main/kotlin/com/aliucord/manager/ui/dialog/InstallerDialog.kt
similarity index 98%
rename from app/src/main/kotlin/com/aliucord/manager/ui/component/InstallerDialog.kt
rename to app/src/main/kotlin/com/aliucord/manager/ui/dialog/InstallerDialog.kt
index 3194c71..7ec7fff 100644
--- a/app/src/main/kotlin/com/aliucord/manager/ui/component/InstallerDialog.kt
+++ b/app/src/main/kotlin/com/aliucord/manager/ui/dialog/InstallerDialog.kt
@@ -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.*
diff --git a/app/src/main/kotlin/com/aliucord/manager/ui/dialog/ManageStorageDialog.kt b/app/src/main/kotlin/com/aliucord/manager/ui/dialog/ManageStorageDialog.kt
new file mode 100644
index 0000000..e4b511f
--- /dev/null
+++ b/app/src/main/kotlin/com/aliucord/manager/ui/dialog/ManageStorageDialog.kt
@@ -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
+ )
+ )
+ }
+}
diff --git a/app/src/main/kotlin/com/aliucord/manager/ui/screen/HomeScreen.kt b/app/src/main/kotlin/com/aliucord/manager/ui/screen/HomeScreen.kt
index 06c67da..79bd680 100644
--- a/app/src/main/kotlin/com/aliucord/manager/ui/screen/HomeScreen.kt
+++ b/app/src/main/kotlin/com/aliucord/manager/ui/screen/HomeScreen.kt
@@ -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
diff --git a/app/src/main/kotlin/com/aliucord/manager/ui/screen/InstallScreen.kt b/app/src/main/kotlin/com/aliucord/manager/ui/screen/InstallScreen.kt
index e3606e1..677f949 100644
--- a/app/src/main/kotlin/com/aliucord/manager/ui/screen/InstallScreen.kt
+++ b/app/src/main/kotlin/com/aliucord/manager/ui/screen/InstallScreen.kt
@@ -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
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 8a1d627..ca623c3 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -4,8 +4,6 @@
Commits
Dex location
Open settings
- You need to grant storage permission to use this app
- Grant permission
Replace app icon with Aliucord variant
Settings
Show menu
@@ -51,4 +49,6 @@
Dynamic color
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.