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.