mirror of
https://github.com/FossifyOrg/Gallery.git
synced 2024-11-22 12:38:00 +01:00
Disable partial media permissions
Partial media permissions don't make much sense for a Gallery app.
This commit is contained in:
parent
f89f81d7e6
commit
267fdaf69f
11 changed files with 167 additions and 95 deletions
|
@ -14,6 +14,7 @@
|
|||
<uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION" />
|
||||
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
|
||||
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
|
||||
<uses-permission android:name="android.permission.READ_MEDIA_VISUAL_USER_SELECTED" />
|
||||
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
||||
<uses-permission
|
||||
android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
|
||||
|
|
|
@ -158,27 +158,15 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
}
|
||||
|
||||
// just request the permission, tryLoadGallery will then trigger in onResume
|
||||
handleMediaPermissions { success ->
|
||||
if (!success) {
|
||||
toast(org.fossify.commons.R.string.no_storage_permissions)
|
||||
finish()
|
||||
}
|
||||
}
|
||||
handleMediaPermissions()
|
||||
}
|
||||
|
||||
private fun handleMediaPermissions(callback: (granted: Boolean) -> Unit) {
|
||||
handlePermission(getPermissionToRequest()) { granted ->
|
||||
callback(granted)
|
||||
if (granted && isRPlus()) {
|
||||
handlePermission(PERMISSION_MEDIA_LOCATION) {}
|
||||
if (isTiramisuPlus()) {
|
||||
handlePermission(PERMISSION_READ_MEDIA_VIDEO) {}
|
||||
}
|
||||
|
||||
if (!mWasMediaManagementPromptShown) {
|
||||
mWasMediaManagementPromptShown = true
|
||||
handleMediaManagementPrompt { }
|
||||
}
|
||||
private fun handleMediaPermissions(callback: (() -> Unit)? = null) {
|
||||
requestMediaPermissions(enableRationale = true) {
|
||||
callback?.invoke()
|
||||
if (isRPlus() && !mWasMediaManagementPromptShown) {
|
||||
mWasMediaManagementPromptShown = true
|
||||
handleMediaManagementPrompt { }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -497,32 +485,27 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
|
||||
private fun tryLoadGallery() {
|
||||
// avoid calling anything right after granting the permission, it will be called from onResume()
|
||||
val wasMissingPermission = config.appRunCount == 1 && !hasPermission(getPermissionToRequest())
|
||||
handleMediaPermissions { success ->
|
||||
if (success) {
|
||||
if (wasMissingPermission) {
|
||||
return@handleMediaPermissions
|
||||
}
|
||||
|
||||
if (!mWasDefaultFolderChecked) {
|
||||
openDefaultFolder()
|
||||
mWasDefaultFolderChecked = true
|
||||
}
|
||||
|
||||
checkOTGPath()
|
||||
checkDefaultSpamFolders()
|
||||
|
||||
if (config.showAll) {
|
||||
showAllMedia()
|
||||
} else {
|
||||
getDirectories()
|
||||
}
|
||||
|
||||
setupLayoutManager()
|
||||
} else {
|
||||
toast(org.fossify.commons.R.string.no_storage_permissions)
|
||||
finish()
|
||||
val wasMissingPermission = config.appRunCount == 1 && !hasAllPermissions(getPermissionsToRequest())
|
||||
handleMediaPermissions {
|
||||
if (wasMissingPermission) {
|
||||
return@handleMediaPermissions
|
||||
}
|
||||
|
||||
if (!mWasDefaultFolderChecked) {
|
||||
openDefaultFolder()
|
||||
mWasDefaultFolderChecked = true
|
||||
}
|
||||
|
||||
checkOTGPath()
|
||||
checkDefaultSpamFolders()
|
||||
|
||||
if (config.showAll) {
|
||||
showAllMedia()
|
||||
} else {
|
||||
getDirectories()
|
||||
}
|
||||
|
||||
setupLayoutManager()
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -15,7 +15,6 @@ import com.bumptech.glide.Glide
|
|||
import com.bumptech.glide.request.RequestOptions
|
||||
import com.bumptech.glide.request.target.SimpleTarget
|
||||
import com.bumptech.glide.request.transition.Transition
|
||||
import org.fossify.commons.dialogs.ConfirmationDialog
|
||||
import org.fossify.commons.dialogs.CreateNewFolderDialog
|
||||
import org.fossify.commons.dialogs.RadioGroupDialog
|
||||
import org.fossify.commons.extensions.*
|
||||
|
@ -370,35 +369,30 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
|
|||
}
|
||||
|
||||
private fun tryLoadGallery() {
|
||||
handlePermission(getPermissionToRequest()) {
|
||||
if (it) {
|
||||
val dirName = when {
|
||||
mPath == FAVORITES -> getString(org.fossify.commons.R.string.favorites)
|
||||
mPath == RECYCLE_BIN -> getString(org.fossify.commons.R.string.recycle_bin)
|
||||
mPath == config.OTGPath -> getString(org.fossify.commons.R.string.usb)
|
||||
else -> getHumanizedFilename(mPath)
|
||||
}
|
||||
|
||||
val searchHint = if (mShowAll) {
|
||||
getString(org.fossify.commons.R.string.search_files)
|
||||
} else {
|
||||
getString(org.fossify.commons.R.string.search_in_placeholder, dirName)
|
||||
}
|
||||
|
||||
binding.mediaMenu.updateHintText(searchHint)
|
||||
if (!mShowAll) {
|
||||
binding.mediaMenu.toggleForceArrowBackIcon(true)
|
||||
binding.mediaMenu.onNavigateBackClickListener = {
|
||||
onBackPressed()
|
||||
}
|
||||
}
|
||||
|
||||
getMedia()
|
||||
setupLayoutManager()
|
||||
} else {
|
||||
toast(org.fossify.commons.R.string.no_storage_permissions)
|
||||
finish()
|
||||
requestMediaPermissions {
|
||||
val dirName = when (mPath) {
|
||||
FAVORITES -> getString(org.fossify.commons.R.string.favorites)
|
||||
RECYCLE_BIN -> getString(org.fossify.commons.R.string.recycle_bin)
|
||||
config.OTGPath -> getString(org.fossify.commons.R.string.usb)
|
||||
else -> getHumanizedFilename(mPath)
|
||||
}
|
||||
|
||||
val searchHint = if (mShowAll) {
|
||||
getString(org.fossify.commons.R.string.search_files)
|
||||
} else {
|
||||
getString(org.fossify.commons.R.string.search_in_placeholder, dirName)
|
||||
}
|
||||
|
||||
binding.mediaMenu.updateHintText(searchHint)
|
||||
if (!mShowAll) {
|
||||
binding.mediaMenu.toggleForceArrowBackIcon(true)
|
||||
binding.mediaMenu.onNavigateBackClickListener = {
|
||||
onBackPressed()
|
||||
}
|
||||
}
|
||||
|
||||
getMedia()
|
||||
setupLayoutManager()
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -46,13 +46,8 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
|
|||
|
||||
setupOptionsMenu()
|
||||
refreshMenuItems()
|
||||
handlePermission(getPermissionToRequest()) {
|
||||
if (it) {
|
||||
checkIntent(savedInstanceState)
|
||||
} else {
|
||||
toast(org.fossify.commons.R.string.no_storage_permissions)
|
||||
finish()
|
||||
}
|
||||
requestMediaPermissions {
|
||||
checkIntent(savedInstanceState)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -5,20 +5,24 @@ import android.net.Uri
|
|||
import android.provider.MediaStore.Images
|
||||
import android.provider.MediaStore.Video
|
||||
import android.view.WindowManager
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import org.fossify.commons.activities.BaseSimpleActivity
|
||||
import org.fossify.commons.dialogs.FilePickerDialog
|
||||
import org.fossify.commons.extensions.getParentPath
|
||||
import org.fossify.commons.extensions.getRealPathFromURI
|
||||
import org.fossify.commons.extensions.scanPathRecursively
|
||||
import org.fossify.commons.extensions.*
|
||||
import org.fossify.commons.helpers.ensureBackgroundThread
|
||||
import org.fossify.commons.helpers.isPiePlus
|
||||
import org.fossify.gallery.R
|
||||
import org.fossify.gallery.dialogs.StoragePermissionRequiredDialog
|
||||
import org.fossify.gallery.extensions.addPathToDB
|
||||
import org.fossify.gallery.extensions.config
|
||||
import org.fossify.gallery.extensions.updateDirectoryPath
|
||||
import org.fossify.gallery.helpers.getPermissionsToRequest
|
||||
|
||||
open class SimpleActivity : BaseSimpleActivity() {
|
||||
val observer = object : ContentObserver(null) {
|
||||
|
||||
private var dialog: AlertDialog? = null
|
||||
|
||||
private val observer = object : ContentObserver(null) {
|
||||
override fun onChange(selfChange: Boolean, uri: Uri?) {
|
||||
super.onChange(selfChange, uri)
|
||||
if (uri != null) {
|
||||
|
@ -94,4 +98,44 @@ open class SimpleActivity : BaseSimpleActivity() {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected fun requestMediaPermissions(enableRationale: Boolean = false, onGranted: () -> Unit) {
|
||||
when {
|
||||
hasAllPermissions(getPermissionsToRequest()) -> onGranted()
|
||||
config.showPermissionRationale -> {
|
||||
if (enableRationale) {
|
||||
showPermissionRationale()
|
||||
} else {
|
||||
onPermissionDenied()
|
||||
}
|
||||
}
|
||||
|
||||
else -> {
|
||||
handlePartialMediaPermissions(getPermissionsToRequest(), force = true) { granted ->
|
||||
if (granted) {
|
||||
onGranted()
|
||||
} else {
|
||||
config.showPermissionRationale = true
|
||||
showPermissionRationale()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun showPermissionRationale() {
|
||||
dialog?.dismiss()
|
||||
StoragePermissionRequiredDialog(
|
||||
activity = this,
|
||||
onOkay = ::openDeviceSettings,
|
||||
onCancel = ::onPermissionDenied
|
||||
) { dialog ->
|
||||
this.dialog = dialog
|
||||
}
|
||||
}
|
||||
|
||||
private fun onPermissionDenied() {
|
||||
toast(org.fossify.commons.R.string.no_storage_permissions)
|
||||
finish()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -97,15 +97,10 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
|
|||
checkNotchSupport()
|
||||
(MediaActivity.mMedia.clone() as ArrayList<ThumbnailItem>).filterIsInstanceTo(mMediaFiles, Medium::class.java)
|
||||
|
||||
handlePermission(getPermissionToRequest()) {
|
||||
if (it) {
|
||||
initViewPager(
|
||||
savedPath = savedInstanceState?.getString(SAVED_PATH).orEmpty()
|
||||
)
|
||||
} else {
|
||||
toast(org.fossify.commons.R.string.no_storage_permissions)
|
||||
finish()
|
||||
}
|
||||
requestMediaPermissions {
|
||||
initViewPager(
|
||||
savedPath = savedInstanceState?.getString(SAVED_PATH).orEmpty()
|
||||
)
|
||||
}
|
||||
|
||||
initFavorites()
|
||||
|
|
|
@ -0,0 +1,36 @@
|
|||
package org.fossify.gallery.dialogs
|
||||
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import org.fossify.commons.extensions.getAlertDialogBuilder
|
||||
import org.fossify.commons.extensions.setupDialogStuff
|
||||
import org.fossify.gallery.activities.SimpleActivity
|
||||
import org.fossify.gallery.databinding.DialogStoragePermissionRequiredBinding
|
||||
|
||||
class StoragePermissionRequiredDialog(
|
||||
val activity: SimpleActivity,
|
||||
val onOkay: () -> Unit,
|
||||
val onCancel: () -> Unit,
|
||||
val callback: (dialog: AlertDialog) -> Unit
|
||||
) {
|
||||
|
||||
init {
|
||||
val binding = DialogStoragePermissionRequiredBinding.inflate(activity.layoutInflater)
|
||||
activity.getAlertDialogBuilder()
|
||||
.setPositiveButton(org.fossify.commons.R.string.go_to_settings) { dialog, _ ->
|
||||
dialog.dismiss()
|
||||
onOkay()
|
||||
}
|
||||
.setNegativeButton(org.fossify.commons.R.string.cancel) { dialog, _ ->
|
||||
dialog.dismiss()
|
||||
onCancel()
|
||||
}
|
||||
.apply {
|
||||
activity.setupDialogStuff(
|
||||
view = binding.root,
|
||||
dialog = this,
|
||||
cancelOnTouchOutside = false,
|
||||
callback = callback
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
|
@ -567,4 +567,8 @@ class Config(context: Context) : BaseConfig(context) {
|
|||
var lastExportedFavoritesFolder: String
|
||||
get() = prefs.getString(LAST_EXPORTED_FAVORITES_FOLDER, "")!!
|
||||
set(lastExportedFavoritesFolder) = prefs.edit().putString(LAST_EXPORTED_FAVORITES_FOLDER, lastExportedFavoritesFolder).apply()
|
||||
|
||||
var showPermissionRationale: Boolean
|
||||
get() = prefs.getBoolean(SHOW_PERMISSION_RATIONALE, false)
|
||||
set(showPermissionRationale) = prefs.edit().putBoolean(SHOW_PERMISSION_RATIONALE, showPermissionRationale).apply()
|
||||
}
|
||||
|
|
|
@ -98,6 +98,7 @@ const val CUSTOM_FOLDERS_ORDER = "custom_folders_order"
|
|||
const val AVOID_SHOWING_ALL_FILES_PROMPT = "avoid_showing_all_files_prompt"
|
||||
const val SEARCH_ALL_FILES_BY_DEFAULT = "search_all_files_by_default"
|
||||
const val LAST_EXPORTED_FAVORITES_FOLDER = "last_exported_favorites_folder"
|
||||
const val SHOW_PERMISSION_RATIONALE = "show_permission_rationale"
|
||||
|
||||
// slideshow
|
||||
const val SLIDESHOW_INTERVAL = "slideshow_interval"
|
||||
|
@ -250,8 +251,6 @@ const val THUMBNAIL_FADE_DURATION_MS = 150
|
|||
|
||||
fun getPermissionToRequest() = if (isTiramisuPlus()) PERMISSION_READ_MEDIA_IMAGES else PERMISSION_WRITE_STORAGE
|
||||
|
||||
fun getRequiredPermission() = if (isUpsideDownCakePlus()) PERMISSION_READ_MEDIA_VISUAL_USER_SELECTED else getPermissionToRequest()
|
||||
|
||||
fun getPermissionsToRequest(): Collection<Int> {
|
||||
val permissions = mutableListOf(getPermissionToRequest())
|
||||
if (isRPlus()) {
|
||||
|
|
|
@ -0,0 +1,20 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/message_scrollview"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<org.fossify.commons.views.MyTextView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/message"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:lineSpacingExtra="@dimen/small_margin"
|
||||
android:paddingLeft="@dimen/big_margin"
|
||||
android:paddingTop="@dimen/big_margin"
|
||||
android:paddingRight="@dimen/big_margin"
|
||||
android:paddingBottom="@dimen/activity_margin"
|
||||
android:text="@string/full_storage_permission_required"
|
||||
android:textAlignment="center"
|
||||
android:textSize="@dimen/bigger_text_size" />
|
||||
|
||||
</ScrollView>
|
|
@ -33,6 +33,7 @@
|
|||
<string name="reorder_by_dragging">Reorder folders by dragging</string>
|
||||
<string name="reorder_by_dragging_pro">Reorder folders by dragging (Pro)</string>
|
||||
<string name="restore_to_path">Restoring to \'%s\'</string>
|
||||
<string name="full_storage_permission_required">Fossify Gallery needs full access to display all your photos and videos. Go to Settings > Permissions > Photos and videos > Allow all.</string>
|
||||
|
||||
<!-- Filter -->
|
||||
<string name="filter_media">Filter media</string>
|
||||
|
|
Loading…
Reference in a new issue