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()
+ }
+ }
+}