Browse Source

PermissionUtil: remember permission requested when requesting media storage permissions

For devices under SDK 30, permission was asked on every startup, which is not desired, and is different from the
behaviour above SDK 30. This fixes that.

Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>
Álvaro Brey 2 years ago
parent
commit
38a5283f98
1 changed files with 27 additions and 17 deletions
  1. 27 17
      app/src/main/java/com/owncloud/android/utils/PermissionUtil.kt

+ 27 - 17
app/src/main/java/com/owncloud/android/utils/PermissionUtil.kt

@@ -131,6 +131,7 @@ object PermissionUtil {
                         requestStoragePermission(
                             activity,
                             Manifest.permission.READ_EXTERNAL_STORAGE,
+                            permissionRequired,
                             viewThemeUtils
                         )
                     }
@@ -138,6 +139,7 @@ object PermissionUtil {
                 else -> requestStoragePermission(
                     activity,
                     Manifest.permission.WRITE_EXTERNAL_STORAGE,
+                    permissionRequired,
                     viewThemeUtils
                 )
             }
@@ -151,33 +153,40 @@ object PermissionUtil {
     private fun requestStoragePermission(
         activity: Activity,
         permission: String,
+        permissionRequired: Boolean,
         viewThemeUtils: ViewThemeUtils
     ) {
+        val preferences: AppPreferences = AppPreferencesImpl.fromContext(activity)
+        val shouldRequestPermission = !preferences.isStoragePermissionRequested || permissionRequired
+
         fun doRequest() {
             ActivityCompat.requestPermissions(
                 activity,
                 arrayOf(permission),
                 PERMISSIONS_EXTERNAL_STORAGE
             )
+            preferences.isStoragePermissionRequested = true
         }
 
-        // Check if we should show an explanation
-        if (shouldShowRequestPermissionRationale(activity, permission)) {
-            // Show explanation to the user and then request permission
-            Snackbar
-                .make(
-                    activity.findViewById(android.R.id.content),
-                    R.string.permission_storage_access,
-                    Snackbar.LENGTH_INDEFINITE
-                )
-                .setAction(R.string.common_ok) {
-                    doRequest()
-                }
-                .also { viewThemeUtils.material.themeSnackbar(it) }
-                .show()
-        } else {
-            // No explanation needed, request the permission.
-            doRequest()
+        if (shouldRequestPermission) {
+            // Check if we should show an explanation
+            if (shouldShowRequestPermissionRationale(activity, permission)) {
+                // Show explanation to the user and then request permission
+                Snackbar
+                    .make(
+                        activity.findViewById(android.R.id.content),
+                        R.string.permission_storage_access,
+                        Snackbar.LENGTH_INDEFINITE
+                    )
+                    .setAction(R.string.common_ok) {
+                        doRequest()
+                    }
+                    .also { viewThemeUtils.material.themeSnackbar(it) }
+                    .show()
+            } else {
+                // No explanation needed, request the permission.
+                doRequest()
+            }
         }
     }
 
@@ -228,6 +237,7 @@ object PermissionUtil {
                             requestStoragePermission(
                                 activity,
                                 Manifest.permission.READ_EXTERNAL_STORAGE,
+                                permissionRequired,
                                 viewThemeUtils
                             )
                         }