feat: ask permission for files on API <29

This commit is contained in:
rebelonion 2024-02-06 21:40:38 -06:00
parent c4630f9243
commit 9bb4c702f3
3 changed files with 33 additions and 3 deletions

View file

@ -11,10 +11,12 @@ import android.content.ClipboardManager
import android.content.Context import android.content.Context
import android.content.DialogInterface import android.content.DialogInterface
import android.content.Intent import android.content.Intent
import android.content.pm.PackageManager
import android.content.res.Configuration import android.content.res.Configuration
import android.content.res.Resources.getSystem import android.content.res.Resources.getSystem
import android.graphics.Bitmap import android.graphics.Bitmap
import android.graphics.Color import android.graphics.Color
import android.Manifest
import android.media.MediaScannerConnection import android.media.MediaScannerConnection
import android.net.ConnectivityManager import android.net.ConnectivityManager
import android.net.NetworkCapabilities.* import android.net.NetworkCapabilities.*
@ -30,8 +32,11 @@ import android.view.*
import android.view.ViewGroup.LayoutParams.WRAP_CONTENT import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
import android.view.animation.* import android.view.animation.*
import android.widget.* import android.widget.*
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.app.AppCompatDelegate import androidx.appcompat.app.AppCompatDelegate
import androidx.core.app.ActivityCompat
import androidx.core.app.NotificationCompat import androidx.core.app.NotificationCompat
import androidx.core.content.ContextCompat
import androidx.core.content.ContextCompat.getSystemService import androidx.core.content.ContextCompat.getSystemService
import androidx.core.content.FileProvider import androidx.core.content.FileProvider
import androidx.core.math.MathUtils.clamp import androidx.core.math.MathUtils.clamp
@ -580,7 +585,7 @@ fun openLinkInBrowser(link: String?) {
} }
} }
fun saveImageToDownloads(title: String, bitmap: Bitmap, context: Context) { fun saveImageToDownloads(title: String, bitmap: Bitmap, context: Activity) {
FileProvider.getUriForFile( FileProvider.getUriForFile(
context, context,
"$APPLICATION_ID.provider", "$APPLICATION_ID.provider",
@ -595,7 +600,7 @@ fun saveImageToDownloads(title: String, bitmap: Bitmap, context: Context) {
fun savePrefsToDownloads( fun savePrefsToDownloads(
title: String, title: String,
serialized: String, serialized: String,
context: Context, context: Activity,
password: CharArray? = null password: CharArray? = null
) { ) {
FileProvider.getUriForFile( FileProvider.getUriForFile(
@ -671,6 +676,26 @@ fun savePrefs(
} }
} }
fun downloadsPermission(activity: AppCompatActivity): Boolean {
val permissions = arrayOf(
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE
)
val requiredPermissions = permissions.filter {
ContextCompat.checkSelfPermission(activity, it) != PackageManager.PERMISSION_GRANTED
}.toTypedArray()
return if (requiredPermissions.isNotEmpty()) {
ActivityCompat.requestPermissions(activity, requiredPermissions, DOWNLOADS_PERMISSION_REQUEST_CODE)
false
} else {
true
}
}
private const val DOWNLOADS_PERMISSION_REQUEST_CODE = 100
fun shareImage(title: String, bitmap: Bitmap, context: Context) { fun shareImage(title: String, bitmap: Bitmap, context: Context) {
val contentUri = FileProvider.getUriForFile( val contentUri = FileProvider.getUriForFile(

View file

@ -5,12 +5,14 @@ import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import ani.dantotsu.BottomSheetDialogFragment import ani.dantotsu.BottomSheetDialogFragment
import ani.dantotsu.FileUrl import ani.dantotsu.FileUrl
import ani.dantotsu.R import ani.dantotsu.R
import ani.dantotsu.databinding.BottomSheetImageBinding import ani.dantotsu.databinding.BottomSheetImageBinding
import ani.dantotsu.downloadsPermission
import ani.dantotsu.media.manga.mangareader.BaseImageAdapter.Companion.loadBitmap import ani.dantotsu.media.manga.mangareader.BaseImageAdapter.Companion.loadBitmap
import ani.dantotsu.media.manga.mangareader.BaseImageAdapter.Companion.loadBitmap_old import ani.dantotsu.media.manga.mangareader.BaseImageAdapter.Companion.loadBitmap_old
import ani.dantotsu.media.manga.mangareader.BaseImageAdapter.Companion.mergeBitmap import ani.dantotsu.media.manga.mangareader.BaseImageAdapter.Companion.mergeBitmap
@ -98,7 +100,8 @@ class ImageViewDialog : BottomSheetDialogFragment() {
binding.bottomImageShare.isEnabled = true binding.bottomImageShare.isEnabled = true
binding.bottomImageSave.isEnabled = true binding.bottomImageSave.isEnabled = true
binding.bottomImageSave.setOnClickListener { binding.bottomImageSave.setOnClickListener {
saveImageToDownloads(title, bitmap, requireActivity()) if (downloadsPermission(context as AppCompatActivity))
saveImageToDownloads(title, bitmap, requireActivity())
} }
binding.bottomImageShare.setOnClickListener { binding.bottomImageShare.setOnClickListener {
shareImage(title, bitmap, requireContext()) shareImage(title, bitmap, requireContext())

View file

@ -39,6 +39,7 @@ import ani.dantotsu.databinding.ActivitySettingsBinding
import ani.dantotsu.download.DownloadedType import ani.dantotsu.download.DownloadedType
import ani.dantotsu.download.DownloadsManager import ani.dantotsu.download.DownloadsManager
import ani.dantotsu.download.video.ExoplayerDownloadService import ani.dantotsu.download.video.ExoplayerDownloadService
import ani.dantotsu.downloadsPermission
import ani.dantotsu.initActivity import ani.dantotsu.initActivity
import ani.dantotsu.loadImage import ani.dantotsu.loadImage
import ani.dantotsu.logger import ani.dantotsu.logger
@ -253,6 +254,7 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene
} }
binding.importExportSettings.setOnClickListener { binding.importExportSettings.setOnClickListener {
downloadsPermission(this)
val selectedArray = mutableListOf(false) val selectedArray = mutableListOf(false)
val filteredLocations = Location.entries.filter { it.exportable } val filteredLocations = Location.entries.filter { it.exportable }
selectedArray.addAll(List(filteredLocations.size - 1) { false }) selectedArray.addAll(List(filteredLocations.size - 1) { false })