From c16ed41c2fb9f2456e43cc58a7bcfa50df7351ba Mon Sep 17 00:00:00 2001 From: Cuong-Tran Date: Mon, 29 Jul 2024 14:07:28 +0700 Subject: [PATCH] feat: Add onboarding permissions request for external storage support save covers & using custom covers depends on the Android version --- app/src/main/AndroidManifest.xml | 12 +++- .../more/onboarding/PermissionStep.kt | 60 +++++++++++++++++++ .../moko-resources/base/strings.xml | 8 ++- 3 files changed, 77 insertions(+), 3 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d252d6436..1eb6155b9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,9 +8,18 @@ + + android:maxSdkVersion="28" /> + + + + @@ -265,7 +274,6 @@ diff --git a/app/src/main/java/eu/kanade/presentation/more/onboarding/PermissionStep.kt b/app/src/main/java/eu/kanade/presentation/more/onboarding/PermissionStep.kt index 8b3d9c07b..0fdbf70a5 100644 --- a/app/src/main/java/eu/kanade/presentation/more/onboarding/PermissionStep.kt +++ b/app/src/main/java/eu/kanade/presentation/more/onboarding/PermissionStep.kt @@ -36,6 +36,7 @@ import androidx.lifecycle.compose.LocalLifecycleOwner import eu.kanade.presentation.util.rememberRequestPackageInstallsPermissionState import eu.kanade.tachiyomi.util.system.launchRequestPackageInstallsPermission import tachiyomi.i18n.MR +import tachiyomi.i18n.kmk.KMR import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.secondaryItemAlpha @@ -44,6 +45,10 @@ internal class PermissionStep : OnboardingStep { private var notificationGranted by mutableStateOf(false) private var batteryGranted by mutableStateOf(false) + // KMK --> + private var externalStoragePermissionGranted by mutableStateOf(false) + // KMK <-- + override val isComplete: Boolean = true @Composable @@ -64,6 +69,18 @@ internal class PermissionStep : OnboardingStep { } batteryGranted = context.getSystemService()!! .isIgnoringBatteryOptimizations(context.packageName) + // KMK --> + externalStoragePermissionGranted = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + context.checkSelfPermission(Manifest.permission.READ_MEDIA_IMAGES) == + PackageManager.PERMISSION_GRANTED + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + context.checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == + PackageManager.PERMISSION_GRANTED + } else { + context.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == + PackageManager.PERMISSION_GRANTED + } + // KMK <-- } } lifecycleOwner.lifecycle.addObserver(observer) @@ -109,6 +126,49 @@ internal class PermissionStep : OnboardingStep { context.startActivity(intent) }, ) + + // KMK --> + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + val permissionRequester = rememberLauncherForActivityResult( + contract = ActivityResultContracts.RequestPermission(), + onResult = { + // no-op. resulting checks is being done on resume + }, + ) + PermissionItem( + title = stringResource(KMR.strings.onboarding_permission_external_storage), + subtitle = stringResource(KMR.strings.onboarding_permission_external_storage_description), + granted = externalStoragePermissionGranted, + onButtonClick = { permissionRequester.launch(Manifest.permission.READ_MEDIA_IMAGES) }, + ) + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + val permissionRequester = rememberLauncherForActivityResult( + contract = ActivityResultContracts.RequestPermission(), + onResult = { + // no-op. resulting checks is being done on resume + }, + ) + PermissionItem( + title = stringResource(KMR.strings.onboarding_permission_external_storage), + subtitle = stringResource(KMR.strings.onboarding_permission_external_storage_description), + granted = externalStoragePermissionGranted, + onButtonClick = { permissionRequester.launch(Manifest.permission.READ_EXTERNAL_STORAGE) }, + ) + } else { + val permissionRequester = rememberLauncherForActivityResult( + contract = ActivityResultContracts.RequestPermission(), + onResult = { + // no-op. resulting checks is being done on resume + }, + ) + PermissionItem( + title = stringResource(KMR.strings.onboarding_permission_external_storage), + subtitle = stringResource(KMR.strings.onboarding_permission_writing_external_storage_description), + granted = externalStoragePermissionGranted, + onButtonClick = { permissionRequester.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE) }, + ) + } + // KMK <-- } } diff --git a/i18n-kmk/src/commonMain/moko-resources/base/strings.xml b/i18n-kmk/src/commonMain/moko-resources/base/strings.xml index b61401ae7..907c34ca5 100644 --- a/i18n-kmk/src/commonMain/moko-resources/base/strings.xml +++ b/i18n-kmk/src/commonMain/moko-resources/base/strings.xml @@ -58,13 +58,19 @@ Show restoring progress banner Show syncing progress banner - + + Clean invalid downloads Find and remove all downloads, files, folders which are not saved in your library Invalid downloads cleaned Avoid using Private Installer because it\'s not stable yet, will lead to really slow start/resume App. Saved Searches & Feeds + + Access media files permission + Allow using custom covers in entry's Edit Info + Allow saving covers & using custom covers in entry's Edit Info + What\'s coming (soon)