@@ -23,7 +23,6 @@ import android.content.Intent
2323import android.content.pm.PackageManager
2424import android.net.Uri
2525import android.os.Build
26- import android.os.Environment
2726import android.provider.Settings
2827import androidx.activity.result.ActivityResultLauncher
2928import androidx.annotation.RequiresApi
@@ -35,22 +34,20 @@ import androidx.fragment.app.FragmentActivity
3534import androidx.fragment.app.FragmentManager
3635import com.ichi2.anki.PermissionSet
3736import com.ichi2.anki.R
37+ import com.ichi2.anki.common.permissions.MANAGE_EXTERNAL_STORAGE
38+ import com.ichi2.anki.common.permissions.hasPermission
3839import com.ichi2.anki.common.utils.android.isRobolectric
3940import com.ichi2.anki.common.utils.android.showThemedToast
4041import com.ichi2.anki.compat.CompatHelper.Companion.getPackageInfoCompat
4142import com.ichi2.anki.compat.GET_PERMISSIONS_L
4243import com.ichi2.anki.compat.PackageInfoFlagsCompat
4344import com.ichi2.anki.settings.Prefs
4445import com.ichi2.anki.ui.windows.permissions.PermissionsBottomSheet
45- import com.ichi2.utils.Permissions.MANAGE_EXTERNAL_STORAGE
4646import com.ichi2.utils.Permissions.arePermissionsDefinedInManifest
47- import com.ichi2.utils.Permissions.isExternalStorageManager
4847import timber.log.Timber
4948import kotlin.reflect.KMutableProperty
5049
5150object Permissions {
52- const val MANAGE_EXTERNAL_STORAGE = " android.permission.MANAGE_EXTERNAL_STORAGE"
53-
5451 @RequiresApi(Build .VERSION_CODES .TIRAMISU )
5552 val tiramisuPhotosAndVideosPermissions =
5653 listOf (
@@ -192,85 +189,6 @@ object Permissions {
192189
193190 fun canRecordAudio (context : Context ): Boolean = hasPermission(context, RECORD_AUDIO_PERMISSION )
194191
195- /* *
196- * Whether the app is granted [permission]
197- *
198- * Same as [androidx.core.content.ContextCompat.checkSelfPermission] except it corrects a bug related to [MANAGE_EXTERNAL_STORAGE].
199- */
200- fun hasPermission (
201- context : Context ,
202- permission : String ,
203- ): Boolean {
204- if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .R && permission == MANAGE_EXTERNAL_STORAGE ) {
205- // checkSelfPermission doesn't return PERMISSION_GRANTED, even if it's granted.
206- return isExternalStorageManager()
207- }
208-
209- return ContextCompat .checkSelfPermission(context, permission) == PackageManager .PERMISSION_GRANTED
210- }
211-
212- /* *
213- * Whether the app is granted all permission of [permissions]
214- */
215- fun hasAllPermissions (
216- context : Context ,
217- permissions : Collection <String >,
218- ): Boolean = permissions.all { hasPermission(context, it) }
219-
220- @RequiresApi(Build .VERSION_CODES .R )
221- fun isExternalStorageManager (): Boolean {
222- // BUG: Environment.isExternalStorageManager() crashes under robolectric
223- // https://github.com/robolectric/robolectric/issues/7300
224- if (isRobolectric) {
225- return false // TODO: handle tests with both 'true' and 'false'
226- }
227- return Environment .isExternalStorageManager()
228- }
229-
230- /* *
231- * On < Android 11, returns false.
232- * On >= Android 11, returns [isExternalStorageManager]
233- */
234- fun isExternalStorageManagerCompat (): Boolean {
235- return if (Build .VERSION .SDK_INT < Build .VERSION_CODES .R ) {
236- return false
237- } else {
238- isExternalStorageManager()
239- }
240- }
241-
242- /* *
243- * Check if we have write access permission to the external storage
244- * @param context
245- * @return
246- */
247- @JvmStatic // unit tests were flaky - maybe remove later
248- private fun hasStorageWriteAccessPermission (
249- context : Context ,
250- ): Boolean = hasPermission(context, Manifest .permission.WRITE_EXTERNAL_STORAGE )
251-
252- /* *
253- * Check if we have read access permission to the external storage
254- * @param context
255- * @return
256- */
257- @JvmStatic // unit tests were flaky - maybe remove later
258- private fun hasStorageReadAccessPermission (
259- context : Context ,
260- ): Boolean = hasPermission(context, Manifest .permission.READ_EXTERNAL_STORAGE )
261-
262- /* *
263- * Check if we have read and write access permission to the external storage
264- * Note: This can return true >= R on a debug build or if storage is preserved
265- *
266- * @see IntentHandler.grantedStoragePermissions
267- *
268- * @param context
269- */
270- @JvmStatic // unit tests were flaky - maybe remove later
271- fun hasLegacyStorageAccessPermission (context : Context ): Boolean =
272- hasStorageReadAccessPermission(context) && hasStorageWriteAccessPermission(context)
273-
274192 /* *
275193 * Detects if permissions are defined via <uses-permission> in the Manifest.
276194 * This does **not** mean the permission has been granted.
0 commit comments