Glimpse: Unify permissions check code

* Also add it to albums fragment

Change-Id: I8ff91bffbd5c414964e4d34bb1bc80a9fae9103e
diff --git a/app/src/main/java/org/lineageos/glimpse/fragments/AlbumFragment.kt b/app/src/main/java/org/lineageos/glimpse/fragments/AlbumFragment.kt
index 530edce..5ae63ea 100644
--- a/app/src/main/java/org/lineageos/glimpse/fragments/AlbumFragment.kt
+++ b/app/src/main/java/org/lineageos/glimpse/fragments/AlbumFragment.kt
@@ -9,8 +9,6 @@
 import android.os.Bundle
 import android.view.View
 import android.view.ViewGroup
-import android.widget.Toast
-import androidx.activity.result.contract.ActivityResultContracts
 import androidx.core.os.bundleOf
 import androidx.core.view.ViewCompat
 import androidx.core.view.WindowInsetsCompat
@@ -36,7 +34,7 @@
 import org.lineageos.glimpse.models.Album
 import org.lineageos.glimpse.recyclerview.ThumbnailAdapter
 import org.lineageos.glimpse.recyclerview.ThumbnailLayoutManager
-import org.lineageos.glimpse.utils.PermissionsUtils
+import org.lineageos.glimpse.utils.PermissionsGatedCallback
 import org.lineageos.glimpse.viewmodels.MediaViewModel
 
 /**
@@ -54,24 +52,12 @@
     private val toolbar by getViewProperty<MaterialToolbar>(R.id.toolbar)
 
     // Permissions
-    private val permissionsUtils by lazy { PermissionsUtils(requireContext()) }
-    private val mainPermissionsRequestLauncher = registerForActivityResult(
-        ActivityResultContracts.RequestMultiplePermissions()
-    ) {
-        if (it.isNotEmpty()) {
-            if (!permissionsUtils.mainPermissionsGranted()) {
-                Toast.makeText(
-                    requireContext(), R.string.app_permissions_toast, Toast.LENGTH_SHORT
-                ).show()
-                requireActivity().finish()
-            } else {
-                viewLifecycleOwner.lifecycleScope.launch {
-                    viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.RESUMED) {
-                        mediaViewModel.setBucketId(album.id)
-                        mediaViewModel.mediaForAlbum.collectLatest { data ->
-                            thumbnailAdapter.data = data.toTypedArray()
-                        }
-                    }
+    private val permissionsGatedCallback = PermissionsGatedCallback(this) {
+        viewLifecycleOwner.lifecycleScope.launch {
+            viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.RESUMED) {
+                mediaViewModel.setBucketId(album.id)
+                mediaViewModel.mediaForAlbum.collectLatest { data ->
+                    thumbnailAdapter.data = data.toTypedArray()
                 }
             }
         }
@@ -122,18 +108,7 @@
             windowInsets
         }
 
-        if (!permissionsUtils.mainPermissionsGranted()) {
-            mainPermissionsRequestLauncher.launch(PermissionsUtils.mainPermissions)
-        } else {
-            mediaViewModel.setBucketId(album.id)
-            viewLifecycleOwner.lifecycleScope.launch {
-                viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.RESUMED) {
-                    mediaViewModel.mediaForAlbum.collectLatest { data ->
-                        thumbnailAdapter.data = data.toTypedArray()
-                    }
-                }
-            }
-        }
+        permissionsGatedCallback.runAfterPermissionsCheck()
     }
 
     override fun onConfigurationChanged(newConfig: Configuration) {
diff --git a/app/src/main/java/org/lineageos/glimpse/fragments/AlbumsFragment.kt b/app/src/main/java/org/lineageos/glimpse/fragments/AlbumsFragment.kt
index 82183e5..f234706 100644
--- a/app/src/main/java/org/lineageos/glimpse/fragments/AlbumsFragment.kt
+++ b/app/src/main/java/org/lineageos/glimpse/fragments/AlbumsFragment.kt
@@ -31,6 +31,7 @@
 import org.lineageos.glimpse.R
 import org.lineageos.glimpse.ext.getViewProperty
 import org.lineageos.glimpse.recyclerview.AlbumThumbnailAdapter
+import org.lineageos.glimpse.utils.PermissionsGatedCallback
 import org.lineageos.glimpse.viewmodels.MediaViewModel
 
 /**
@@ -52,6 +53,17 @@
         requireParentFragment().requireParentFragment().findNavController()
     }
 
+    // Permissions
+    private val permissionsGatedCallback = PermissionsGatedCallback(this) {
+        viewLifecycleOwner.lifecycleScope.launch {
+            viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.RESUMED) {
+                mediaViewModel.albums.collectLatest {
+                    albumThumbnailAdapter.data = it.toTypedArray()
+                }
+            }
+        }
+    }
+
     // MediaStore
     private val albumThumbnailAdapter by lazy { AlbumThumbnailAdapter(parentNavController) }
 
@@ -82,13 +94,7 @@
             windowInsets
         }
 
-        viewLifecycleOwner.lifecycleScope.launch {
-            viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.RESUMED) {
-                mediaViewModel.albums.collectLatest {
-                    albumThumbnailAdapter.data = it.toTypedArray()
-                }
-            }
-        }
+        permissionsGatedCallback.runAfterPermissionsCheck()
     }
 
     companion object {
diff --git a/app/src/main/java/org/lineageos/glimpse/fragments/MediaViewerFragment.kt b/app/src/main/java/org/lineageos/glimpse/fragments/MediaViewerFragment.kt
index 81c6d6a..2b1dcf8 100644
--- a/app/src/main/java/org/lineageos/glimpse/fragments/MediaViewerFragment.kt
+++ b/app/src/main/java/org/lineageos/glimpse/fragments/MediaViewerFragment.kt
@@ -14,7 +14,6 @@
 import android.widget.ImageButton
 import android.widget.LinearLayout
 import android.widget.TextView
-import android.widget.Toast
 import androidx.activity.result.contract.ActivityResultContracts
 import androidx.constraintlayout.widget.ConstraintLayout
 import androidx.core.os.bundleOf
@@ -43,7 +42,7 @@
 import org.lineageos.glimpse.models.MediaType
 import org.lineageos.glimpse.recyclerview.MediaViewerAdapter
 import org.lineageos.glimpse.ui.MediaInfoBottomSheetDialog
-import org.lineageos.glimpse.utils.PermissionsUtils
+import org.lineageos.glimpse.utils.PermissionsGatedCallback
 import org.lineageos.glimpse.viewmodels.MediaViewModel
 import java.text.SimpleDateFormat
 
@@ -72,23 +71,11 @@
     private var restoreLastTrashedMediaFromTrash: (() -> Unit)? = null
 
     // Permissions
-    private val permissionsUtils by lazy { PermissionsUtils(requireContext()) }
-    private val mainPermissionsRequestLauncher = registerForActivityResult(
-        ActivityResultContracts.RequestMultiplePermissions()
-    ) {
-        if (it.isNotEmpty()) {
-            if (!permissionsUtils.mainPermissionsGranted()) {
-                Toast.makeText(
-                    requireContext(), R.string.app_permissions_toast, Toast.LENGTH_SHORT
-                ).show()
-                requireActivity().finish()
-            } else {
-                viewLifecycleOwner.lifecycleScope.launch {
-                    viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.RESUMED) {
-                        mediaViewModel.setBucketId(album?.id)
-                        mediaViewModel.mediaForAlbum.collectLatest(::initData)
-                    }
-                }
+    private val permissionsGatedCallback = PermissionsGatedCallback(this) {
+        viewLifecycleOwner.lifecycleScope.launch {
+            viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.RESUMED) {
+                mediaViewModel.setBucketId(album?.id)
+                mediaViewModel.mediaForAlbum.collectLatest(::initData)
             }
         }
     }
@@ -321,16 +308,7 @@
             }
         }
 
-        if (!permissionsUtils.mainPermissionsGranted()) {
-            mainPermissionsRequestLauncher.launch(PermissionsUtils.mainPermissions)
-        } else {
-            viewLifecycleOwner.lifecycleScope.launch {
-                viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.RESUMED) {
-                    mediaViewModel.setBucketId(album?.id)
-                    mediaViewModel.mediaForAlbum.collectLatest(::initData)
-                }
-            }
-        }
+        permissionsGatedCallback.runAfterPermissionsCheck()
     }
 
     override fun onDestroyView() {
diff --git a/app/src/main/java/org/lineageos/glimpse/fragments/ReelsFragment.kt b/app/src/main/java/org/lineageos/glimpse/fragments/ReelsFragment.kt
index 6f2119b..1c78f52 100644
--- a/app/src/main/java/org/lineageos/glimpse/fragments/ReelsFragment.kt
+++ b/app/src/main/java/org/lineageos/glimpse/fragments/ReelsFragment.kt
@@ -9,8 +9,6 @@
 import android.os.Bundle
 import android.view.View
 import android.view.ViewGroup
-import android.widget.Toast
-import androidx.activity.result.contract.ActivityResultContracts
 import androidx.core.os.bundleOf
 import androidx.core.view.ViewCompat
 import androidx.core.view.WindowInsetsCompat
@@ -32,6 +30,7 @@
 import org.lineageos.glimpse.ext.getViewProperty
 import org.lineageos.glimpse.recyclerview.ThumbnailAdapter
 import org.lineageos.glimpse.recyclerview.ThumbnailLayoutManager
+import org.lineageos.glimpse.utils.PermissionsGatedCallback
 import org.lineageos.glimpse.utils.PermissionsUtils
 import org.lineageos.glimpse.viewmodels.MediaViewModel
 
@@ -56,26 +55,15 @@
 
     // Permissions
     private val permissionsUtils by lazy { PermissionsUtils(requireContext()) }
-    private val mainPermissionsRequestLauncher = registerForActivityResult(
-        ActivityResultContracts.RequestMultiplePermissions()
-    ) {
-        if (it.isNotEmpty()) {
-            if (!permissionsUtils.mainPermissionsGranted()) {
-                Toast.makeText(
-                    requireContext(), R.string.app_permissions_toast, Toast.LENGTH_SHORT
-                ).show()
-                requireActivity().finish()
-            } else {
-                viewLifecycleOwner.lifecycleScope.launch {
-                    viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.RESUMED) {
-                        mediaViewModel.media.collectLatest { data ->
-                            thumbnailAdapter.data = data.toTypedArray()
-                        }
-                    }
+    private val permissionsGatedCallback = PermissionsGatedCallback(this) {
+        viewLifecycleOwner.lifecycleScope.launch {
+            viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.RESUMED) {
+                mediaViewModel.media.collectLatest { data ->
+                    thumbnailAdapter.data = data.toTypedArray()
                 }
-                permissionsUtils.showManageMediaPermissionDialogIfNeeded()
             }
         }
+        permissionsUtils.showManageMediaPermissionDialogIfNeeded()
     }
 
     // MediaStore
@@ -114,18 +102,7 @@
             windowInsets
         }
 
-        if (!permissionsUtils.mainPermissionsGranted()) {
-            mainPermissionsRequestLauncher.launch(PermissionsUtils.mainPermissions)
-        } else {
-            viewLifecycleOwner.lifecycleScope.launch {
-                viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.RESUMED) {
-                    mediaViewModel.media.collectLatest { data ->
-                        thumbnailAdapter.data = data.toTypedArray()
-                    }
-                }
-            }
-            permissionsUtils.showManageMediaPermissionDialogIfNeeded()
-        }
+        permissionsGatedCallback.runAfterPermissionsCheck()
     }
 
     override fun onConfigurationChanged(newConfig: Configuration) {
diff --git a/app/src/main/java/org/lineageos/glimpse/utils/PermissionsGatedCallback.kt b/app/src/main/java/org/lineageos/glimpse/utils/PermissionsGatedCallback.kt
new file mode 100644
index 0000000..3558ab3
--- /dev/null
+++ b/app/src/main/java/org/lineageos/glimpse/utils/PermissionsGatedCallback.kt
@@ -0,0 +1,42 @@
+/*
+ * SPDX-FileCopyrightText: 2023 The LineageOS Project
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package org.lineageos.glimpse.utils
+
+import android.widget.Toast
+import androidx.activity.result.contract.ActivityResultContracts
+import androidx.fragment.app.Fragment
+import org.lineageos.glimpse.R
+
+/**
+ * A class that checks main app permissions before starting the callback.
+ */
+class PermissionsGatedCallback(
+    fragment: Fragment, private val callback: () -> Unit
+) {
+    private val permissionsUtils by lazy { PermissionsUtils(fragment.requireContext()) }
+    private val mainPermissionsRequestLauncher = fragment.registerForActivityResult(
+        ActivityResultContracts.RequestMultiplePermissions()
+    ) {
+        if (it.isNotEmpty()) {
+            if (!permissionsUtils.mainPermissionsGranted()) {
+                Toast.makeText(
+                    fragment.requireContext(), R.string.app_permissions_toast, Toast.LENGTH_SHORT
+                ).show()
+                fragment.requireActivity().finish()
+            } else {
+                callback()
+            }
+        }
+    }
+
+    fun runAfterPermissionsCheck() {
+        if (!permissionsUtils.mainPermissionsGranted()) {
+            mainPermissionsRequestLauncher.launch(PermissionsUtils.mainPermissions)
+        } else {
+            callback()
+        }
+    }
+}