feat: Add onboarding permissions request for external storage

support save covers & using custom covers depends on the Android version
This commit is contained in:
Cuong-Tran 2024-07-29 14:07:28 +07:00
parent 6739ad8d06
commit c16ed41c2f
No known key found for this signature in database
GPG key ID: 733AA7624B9315C2
3 changed files with 77 additions and 3 deletions

View file

@ -8,9 +8,18 @@
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- Storage -->
<!-- Permission to save cover into Pictures. It isn't required from API 29 -->
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage" />
android:maxSdkVersion="28" />
<!-- For access custom cover on Android 12 & below (API 32) -->
<uses-permission
android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />
<!-- For access custom cover from Android 13+ (API 33) -->
<uses-permission
android:name="android.permission.READ_MEDIA_IMAGES"
tools:ignore="SelectedPhotoAccess" />
<!-- For background jobs -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
@ -265,7 +274,6 @@
<!-- EH -->
<activity
android:name="exh.ui.intercept.InterceptActivity"
android:label="@string/app_name"
android:theme="@style/Theme.Tachiyomi"
android:exported="true">
<!-- E-Hentai -->

View file

@ -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<PowerManager>()!!
.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 <--
}
}

View file

@ -58,13 +58,19 @@
<!-- Sync section -->
<string name="pref_show_restoring_progress_banner">Show restoring progress banner</string>
<string name="pref_show_syncing_progress_banner">Show syncing progress banner</string>
<!-- Advanced section -->
<!-- Advanced section -->
<string name="pref_clean_invalid_downloads">Clean invalid downloads</string>
<string name="pref_clean_invalid_downloads_summary">Find and remove all downloads, files, folders which are not saved in your library</string>
<string name="invalid_downloads_cleaned">Invalid downloads cleaned</string>
<string name="pref_private_installer_warning">Avoid using Private Installer because it\'s not stable yet, will lead to really slow start/resume App.</string>
<string name="saved_searches_feeds">Saved Searches &amp; Feeds</string>
<!-- Onboarding section -->
<string name="onboarding_permission_external_storage">Access media files permission</string>
<string name="onboarding_permission_external_storage_description">Allow using custom covers in entry's Edit Info</string>
<string name="onboarding_permission_writing_external_storage_description">Allow saving covers &amp; using custom covers in entry's Edit Info</string>
<!-- About section -->
<string name="whats_coming">What\'s coming (soon)</string>