From 9bb4c702f38ef980526accbceede98d944c28153 Mon Sep 17 00:00:00 2001 From: rebelonion <87634197+rebelonion@users.noreply.github.com> Date: Tue, 6 Feb 2024 21:40:38 -0600 Subject: [PATCH] feat: ask permission for files on API <29 --- app/src/main/java/ani/dantotsu/Functions.kt | 29 +++++++++++++++++-- .../ani/dantotsu/others/ImageViewDialog.kt | 5 +++- .../ani/dantotsu/settings/SettingsActivity.kt | 2 ++ 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/ani/dantotsu/Functions.kt b/app/src/main/java/ani/dantotsu/Functions.kt index 05d872ad..29d683f1 100644 --- a/app/src/main/java/ani/dantotsu/Functions.kt +++ b/app/src/main/java/ani/dantotsu/Functions.kt @@ -11,10 +11,12 @@ import android.content.ClipboardManager import android.content.Context import android.content.DialogInterface import android.content.Intent +import android.content.pm.PackageManager import android.content.res.Configuration import android.content.res.Resources.getSystem import android.graphics.Bitmap import android.graphics.Color +import android.Manifest import android.media.MediaScannerConnection import android.net.ConnectivityManager import android.net.NetworkCapabilities.* @@ -30,8 +32,11 @@ import android.view.* import android.view.ViewGroup.LayoutParams.WRAP_CONTENT import android.view.animation.* import android.widget.* +import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatDelegate +import androidx.core.app.ActivityCompat import androidx.core.app.NotificationCompat +import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat.getSystemService import androidx.core.content.FileProvider 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( context, "$APPLICATION_ID.provider", @@ -595,7 +600,7 @@ fun saveImageToDownloads(title: String, bitmap: Bitmap, context: Context) { fun savePrefsToDownloads( title: String, serialized: String, - context: Context, + context: Activity, password: CharArray? = null ) { 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) { val contentUri = FileProvider.getUriForFile( diff --git a/app/src/main/java/ani/dantotsu/others/ImageViewDialog.kt b/app/src/main/java/ani/dantotsu/others/ImageViewDialog.kt index aa792d9f..e11715c7 100644 --- a/app/src/main/java/ani/dantotsu/others/ImageViewDialog.kt +++ b/app/src/main/java/ani/dantotsu/others/ImageViewDialog.kt @@ -5,12 +5,14 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.FragmentActivity import androidx.lifecycle.lifecycleScope import ani.dantotsu.BottomSheetDialogFragment import ani.dantotsu.FileUrl import ani.dantotsu.R 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_old import ani.dantotsu.media.manga.mangareader.BaseImageAdapter.Companion.mergeBitmap @@ -98,7 +100,8 @@ class ImageViewDialog : BottomSheetDialogFragment() { binding.bottomImageShare.isEnabled = true binding.bottomImageSave.isEnabled = true binding.bottomImageSave.setOnClickListener { - saveImageToDownloads(title, bitmap, requireActivity()) + if (downloadsPermission(context as AppCompatActivity)) + saveImageToDownloads(title, bitmap, requireActivity()) } binding.bottomImageShare.setOnClickListener { shareImage(title, bitmap, requireContext()) diff --git a/app/src/main/java/ani/dantotsu/settings/SettingsActivity.kt b/app/src/main/java/ani/dantotsu/settings/SettingsActivity.kt index 16c91861..44c8ac67 100644 --- a/app/src/main/java/ani/dantotsu/settings/SettingsActivity.kt +++ b/app/src/main/java/ani/dantotsu/settings/SettingsActivity.kt @@ -39,6 +39,7 @@ import ani.dantotsu.databinding.ActivitySettingsBinding import ani.dantotsu.download.DownloadedType import ani.dantotsu.download.DownloadsManager import ani.dantotsu.download.video.ExoplayerDownloadService +import ani.dantotsu.downloadsPermission import ani.dantotsu.initActivity import ani.dantotsu.loadImage import ani.dantotsu.logger @@ -253,6 +254,7 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene } binding.importExportSettings.setOnClickListener { + downloadsPermission(this) val selectedArray = mutableListOf(false) val filteredLocations = Location.entries.filter { it.exportable } selectedArray.addAll(List(filteredLocations.size - 1) { false })