From d20ef2a164f40ab756372ecdc93cfa5583625b93 Mon Sep 17 00:00:00 2001 From: MrSluffy Date: Sat, 17 Aug 2024 09:47:37 +0800 Subject: [PATCH] Allow handle READ_MEDIA_IMAGES permission --- .../lawnchair/backup/ui/CreateBackupScreen.kt | 7 ++- .../components/WallpaperPreview.kt | 2 + .../util/PackagePermissionManager.kt | 57 +++++++++++++++---- 3 files changed, 53 insertions(+), 13 deletions(-) diff --git a/lawnchair/src/app/lawnchair/backup/ui/CreateBackupScreen.kt b/lawnchair/src/app/lawnchair/backup/ui/CreateBackupScreen.kt index 5682d0bfb2..8492d6a82b 100644 --- a/lawnchair/src/app/lawnchair/backup/ui/CreateBackupScreen.kt +++ b/lawnchair/src/app/lawnchair/backup/ui/CreateBackupScreen.kt @@ -1,6 +1,5 @@ package app.lawnchair.backup.ui -import android.Manifest import android.app.Activity import android.app.WallpaperManager import android.content.Intent @@ -74,9 +73,11 @@ fun CreateBackupScreen( val hasLiveWallpaper = remember { WallpaperManager.getInstance(context).wallpaperInfo != null } val permissionState = rememberPermissionState( if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - Manifest.permission.MANAGE_EXTERNAL_STORAGE + android.Manifest.permission.READ_MEDIA_IMAGES + } else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU && Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + android.Manifest.permission.MANAGE_EXTERNAL_STORAGE } else { - Manifest.permission.READ_EXTERNAL_STORAGE + android.Manifest.permission.READ_EXTERNAL_STORAGE }, ) val hasStoragePermission = permissionState.status.isGranted || filesAndStorageGranted(context) diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/WallpaperPreview.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/WallpaperPreview.kt index 67a8ce2391..61e422fcd9 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/components/WallpaperPreview.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/components/WallpaperPreview.kt @@ -49,6 +49,8 @@ fun wallpaperDrawable(): Drawable? { val wallpaperInfo = wallpaperManager.wallpaperInfo val permissionState = rememberPermissionState( if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + android.Manifest.permission.READ_MEDIA_IMAGES + } else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU && Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { android.Manifest.permission.MANAGE_EXTERNAL_STORAGE } else { android.Manifest.permission.READ_EXTERNAL_STORAGE diff --git a/lawnchair/src/app/lawnchair/util/PackagePermissionManager.kt b/lawnchair/src/app/lawnchair/util/PackagePermissionManager.kt index d8f7d7298c..21db3674cc 100644 --- a/lawnchair/src/app/lawnchair/util/PackagePermissionManager.kt +++ b/lawnchair/src/app/lawnchair/util/PackagePermissionManager.kt @@ -43,23 +43,43 @@ fun contactPermissionGranted(context: Context): Boolean { } fun checkAndRequestFilesPermission(context: Context, prefs: PreferenceManager): Boolean { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - if (!Environment.isExternalStorageManager()) { - requestManageAllFilesAccessPermission(context) - prefs.searchResultFiles.set(false) - return false + when { + Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU -> { + if (!Environment.isExternalStorageManager() || !hasReadMediaImagesPermission(context)) { + if (!Environment.isExternalStorageManager()) { + requestManageAllFilesAccessPermission(context) + } + if (!hasReadMediaImagesPermission(context)) { + requestReadMediaImagesPermission(context) + } + prefs.searchResultFiles.set(false) + return false + } } - } else { - if (!hasReadExternalStoragePermission(context)) { - requestReadExternalStoragePermission(context) - return false + Build.VERSION.SDK_INT >= Build.VERSION_CODES.R -> { + if (!Environment.isExternalStorageManager()) { + requestManageAllFilesAccessPermission(context) + prefs.searchResultFiles.set(false) + return false + } + } + else -> { + if (!hasReadExternalStoragePermission(context)) { + requestReadExternalStoragePermission(context) + return false + } } } return true } fun filesAndStorageGranted(context: Context): Boolean { - return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) Environment.isExternalStorageManager() else hasReadExternalStoragePermission(context) + return when { + Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU -> + Environment.isExternalStorageManager() && hasReadMediaImagesPermission(context) + Build.VERSION.SDK_INT >= Build.VERSION_CODES.R -> Environment.isExternalStorageManager() + else -> hasReadExternalStoragePermission(context) + } } @RequiresApi(Build.VERSION_CODES.R) @@ -83,3 +103,20 @@ private fun requestReadExternalStoragePermission(context: Context) { 123, ) } + +@RequiresApi(Build.VERSION_CODES.TIRAMISU) +private fun hasReadMediaImagesPermission(context: Context): Boolean { + return ContextCompat.checkSelfPermission( + context, + Manifest.permission.READ_MEDIA_IMAGES + ) == PackageManager.PERMISSION_GRANTED +} + +@RequiresApi(Build.VERSION_CODES.TIRAMISU) +private fun requestReadMediaImagesPermission(context: Context) { + ActivityCompat.requestPermissions( + context as Activity, + arrayOf(Manifest.permission.READ_MEDIA_IMAGES), + 124 + ) +}