[Android] Display the app settings when runtime permission previously denied

Nicolas Pomepuy git at videolan.org
Fri Dec 20 09:59:07 UTC 2024


vlc-android | branch: master | Nicolas Pomepuy <nicolas at videolabs.io> | Fri Dec 20 10:24:44 2024 +0100| [5821fab251c06b78241037788f1a3fc86aa8d985] | committer: Nicolas Pomepuy

Display the app settings when runtime permission previously denied

> https://code.videolan.org/videolan/vlc-android/commit/5821fab251c06b78241037788f1a3fc86aa8d985
---

 .../src/org/videolan/vlc/gui/BaseActivity.kt         | 15 +++++++++++++++
 .../videolan/vlc/gui/dialogs/PermissionListDialog.kt | 20 +++++++++++++-------
 .../src/org/videolan/vlc/util/Permissions.kt         |  1 +
 3 files changed, 29 insertions(+), 7 deletions(-)

diff --git a/application/vlc-android/src/org/videolan/vlc/gui/BaseActivity.kt b/application/vlc-android/src/org/videolan/vlc/gui/BaseActivity.kt
index 3f111fbb20..e170ff5c64 100644
--- a/application/vlc-android/src/org/videolan/vlc/gui/BaseActivity.kt
+++ b/application/vlc-android/src/org/videolan/vlc/gui/BaseActivity.kt
@@ -38,6 +38,7 @@ import org.videolan.vlc.gui.helpers.hf.PinCodeDelegate
 import org.videolan.vlc.gui.helpers.hf.checkPIN
 import org.videolan.vlc.media.MediaUtils
 import org.videolan.vlc.util.FileUtils
+import org.videolan.vlc.util.Permissions
 import org.videolan.vlc.util.RemoteAccessUtils
 
 
@@ -95,6 +96,20 @@ abstract class BaseActivity : AppCompatActivity() {
         }
     }
 
+    override fun onRequestPermissionsResult(
+        requestCode: Int,
+        permissions: Array<String?>,
+        grantResults: IntArray
+    ) {
+        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+        if (requestCode == Permissions.FINE_STORAGE_PERMISSION_REQUEST_CODE) {
+            if (System.currentTimeMillis() -  Permissions.timeAsked < 300) {
+                //Answered really quick (not human) -> forwarding to app settings
+                Permissions.showAppSettingsPage(this)
+            }
+        }
+    }
+
     override fun onPrepareOptionsMenu(menu: Menu?): Boolean {
         val relockItem = menu?.findItem(R.id.pin_relocked)
         if (relockItem != null) {
diff --git a/application/vlc-android/src/org/videolan/vlc/gui/dialogs/PermissionListDialog.kt b/application/vlc-android/src/org/videolan/vlc/gui/dialogs/PermissionListDialog.kt
index c2f3936ab2..abacebb1ab 100644
--- a/application/vlc-android/src/org/videolan/vlc/gui/dialogs/PermissionListDialog.kt
+++ b/application/vlc-android/src/org/videolan/vlc/gui/dialogs/PermissionListDialog.kt
@@ -124,11 +124,14 @@ class PermissionListDialog : VLCBottomSheetDialogFragment() {
         binding.notificationPermissionContainer.setOnClickListener {
             if (Permissions.canSendNotifications(requireActivity())) {
                 Permissions.showAppSettingsPage(requireActivity())
-            } else ActivityCompat.requestPermissions(
-                requireActivity(), arrayOf(
-                    Manifest.permission.POST_NOTIFICATIONS
-                ), Permissions.FINE_STORAGE_PERMISSION_REQUEST_CODE
-            )
+            } else {
+                ActivityCompat.requestPermissions(
+                    requireActivity(), arrayOf(
+                        Manifest.permission.POST_NOTIFICATIONS
+                    ), Permissions.FINE_STORAGE_PERMISSION_REQUEST_CODE
+                )
+                Permissions.timeAsked = System.currentTimeMillis()
+            }
         }
 
 
@@ -246,14 +249,15 @@ class PermissionListDialog : VLCBottomSheetDialogFragment() {
                 binding.manageAllPermsCheck.background  = ContextCompat.getDrawable(requireActivity(), R.drawable.rounded_corners_permissions_warning)
                 showWarning()
             } else
-                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU)
+                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
                     ActivityCompat.requestPermissions(
                         requireActivity(), arrayOf(
                             Manifest.permission.READ_MEDIA_VIDEO,
                             Manifest.permission.READ_MEDIA_AUDIO
                         ), Permissions.FINE_STORAGE_PERMISSION_REQUEST_CODE
                     )
-                else lifecycleScope.launch {
+                    Permissions.timeAsked = System.currentTimeMillis()
+                } else lifecycleScope.launch {
                     requireActivity().getStoragePermission(withDialog = false, onlyMedia = true)
                 }
         }
@@ -265,6 +269,7 @@ class PermissionListDialog : VLCBottomSheetDialogFragment() {
                         Manifest.permission.READ_MEDIA_AUDIO
                     ), Permissions.FINE_STORAGE_PERMISSION_REQUEST_CODE
                 )
+                Permissions.timeAsked = System.currentTimeMillis()
             }
         }
 
@@ -275,6 +280,7 @@ class PermissionListDialog : VLCBottomSheetDialogFragment() {
                         Manifest.permission.READ_MEDIA_VIDEO
                     ), Permissions.FINE_STORAGE_PERMISSION_REQUEST_CODE
                 )
+                Permissions.timeAsked = System.currentTimeMillis()
             }
         }
 
diff --git a/application/vlc-android/src/org/videolan/vlc/util/Permissions.kt b/application/vlc-android/src/org/videolan/vlc/util/Permissions.kt
index 6d43518bdc..8021100daf 100644
--- a/application/vlc-android/src/org/videolan/vlc/util/Permissions.kt
+++ b/application/vlc-android/src/org/videolan/vlc/util/Permissions.kt
@@ -59,6 +59,7 @@ import org.videolan.vlc.gui.helpers.hf.WriteExternalDelegate
 
 object Permissions {
 
+    var timeAsked: Long = -1L
     const val PERMISSION_STORAGE_TAG = 255
     const val PERMISSION_SETTINGS_TAG = 254
     const val PERMISSION_WRITE_STORAGE_TAG = 253



More information about the Android mailing list