From 28a675808732e6b4d0e8fcc93b393422f0594fe3 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Thu, 18 May 2023 16:32:23 +0530 Subject: [PATCH] Switch to ActivityResultContracts for requesting permissions QuickPermissions hasn't been updated since past few years hinting its deprecated status Signed-off-by: Aayush Gupta --- app/build.gradle | 3 - .../java/com/aurora/store/MainActivity.kt | 24 +++--- .../view/ui/details/AppDetailsActivity.kt | 18 ++++- .../view/ui/onboarding/PermissionsFragment.kt | 80 +++++++++---------- .../store/view/ui/sheets/AppMenuSheet.kt | 26 ++++-- app/src/main/res/values/strings.xml | 1 + 6 files changed, 87 insertions(+), 65 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index d69f6236f..98cbef721 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -137,9 +137,6 @@ dependencies { implementation "androidx.navigation:navigation-fragment-ktx:$nav_version" implementation "androidx.navigation:navigation-ui-ktx:$nav_version" - //Easy Permission - implementation "com.github.quickpermissions:quickpermissions-kotlin:0.4.1" - //Glide def glide_version = '4.15.1' implementation "com.github.bumptech.glide:glide:$glide_version" diff --git a/app/src/main/java/com/aurora/store/MainActivity.kt b/app/src/main/java/com/aurora/store/MainActivity.kt index e9cfe495a..38891bc38 100644 --- a/app/src/main/java/com/aurora/store/MainActivity.kt +++ b/app/src/main/java/com/aurora/store/MainActivity.kt @@ -22,6 +22,7 @@ package com.aurora.store import android.Manifest import android.content.Intent +import android.content.pm.PackageManager import android.content.res.ColorStateList import android.os.Build import android.os.Bundle @@ -33,7 +34,9 @@ import android.widget.ImageView import android.widget.TextView import android.widget.Toast import androidx.activity.addCallback +import androidx.activity.result.contract.ActivityResultContracts import androidx.annotation.IdRes +import androidx.core.content.ContextCompat import androidx.core.graphics.ColorUtils import androidx.core.view.GravityCompat import androidx.navigation.NavController @@ -63,7 +66,6 @@ import com.aurora.store.view.ui.sheets.SelfUpdateSheet import com.aurora.store.view.ui.spoof.SpoofActivity import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.google.android.material.bottomnavigation.BottomNavigationView -import com.livinglifetechway.quickpermissions_kotlin.runWithPermissions import nl.komponents.kovenant.task import nl.komponents.kovenant.ui.successUi @@ -76,6 +78,11 @@ class MainActivity : BaseActivity() { private var lastBackPressed = 0L + private val startForPermissions = + registerForActivityResult(ActivityResultContracts.RequestPermission()) { + if (!it) toast(R.string.permissions_denied) + } + override fun onConnected() { hideNetworkConnectivitySheet() } @@ -125,7 +132,13 @@ class MainActivity : BaseActivity() { if (isRAndAbove()) { checkExternalStorageManagerPermission() } else { - checkExternalStorageAccessPermission() + if (ContextCompat.checkSelfPermission( + this, + Manifest.permission.WRITE_EXTERNAL_STORAGE + ) == PackageManager.PERMISSION_GRANTED + ) { + startForPermissions.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE) + } } } @@ -238,13 +251,6 @@ class MainActivity : BaseActivity() { return navController.navigateUp() } - private fun checkExternalStorageAccessPermission() = runWithPermissions( - Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.WRITE_EXTERNAL_STORAGE - ) { - Log.i("Required permissions available") - } - private fun checkExternalStorageManagerPermission() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { if (!Environment.isExternalStorageManager()) diff --git a/app/src/main/java/com/aurora/store/view/ui/details/AppDetailsActivity.kt b/app/src/main/java/com/aurora/store/view/ui/details/AppDetailsActivity.kt index ea41fe86e..3a1ca5996 100644 --- a/app/src/main/java/com/aurora/store/view/ui/details/AppDetailsActivity.kt +++ b/app/src/main/java/com/aurora/store/view/ui/details/AppDetailsActivity.kt @@ -25,6 +25,7 @@ import android.content.ActivityNotFoundException import android.content.ComponentName import android.content.Intent import android.content.ServiceConnection +import android.content.pm.PackageManager import android.os.Build import android.os.Bundle import android.os.Environment @@ -35,6 +36,8 @@ import android.view.MenuItem import android.view.View import android.widget.LinearLayout import androidx.activity.addCallback +import androidx.activity.result.contract.ActivityResultContracts +import androidx.core.content.ContextCompat import com.aurora.Constants import com.aurora.extensions.* import com.aurora.gplayapi.data.models.App @@ -60,7 +63,6 @@ import com.aurora.store.view.ui.sheets.ManualDownloadSheet import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetBehavior.BottomSheetCallback -import com.livinglifetechway.quickpermissions_kotlin.runWithPermissions import com.tonyodev.fetch2.* import com.tonyodev.fetch2core.DownloadBlock import nl.komponents.kovenant.task @@ -76,6 +78,11 @@ class AppDetailsActivity : BaseDetailsActivity() { private lateinit var B: ActivityDetailsBinding private lateinit var bottomSheetBehavior: BottomSheetBehavior + private val startForPermissions = + registerForActivityResult(ActivityResultContracts.RequestPermission()) { + if (it) updateApp(app) else toast(R.string.permissions_denied) + } + private lateinit var authData: AuthData private lateinit var app: App private var fetch: Fetch? = null @@ -496,11 +503,14 @@ class AppDetailsActivity : BaseDetailsActivity() { updateApp(app) } } else { - runWithPermissions( - Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.WRITE_EXTERNAL_STORAGE + if (ContextCompat.checkSelfPermission( + this, + Manifest.permission.WRITE_EXTERNAL_STORAGE + ) == PackageManager.PERMISSION_GRANTED ) { updateApp(app) + } else { + startForPermissions.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE) } } } diff --git a/app/src/main/java/com/aurora/store/view/ui/onboarding/PermissionsFragment.kt b/app/src/main/java/com/aurora/store/view/ui/onboarding/PermissionsFragment.kt index aa80410dc..6951361e2 100644 --- a/app/src/main/java/com/aurora/store/view/ui/onboarding/PermissionsFragment.kt +++ b/app/src/main/java/com/aurora/store/view/ui/onboarding/PermissionsFragment.kt @@ -24,13 +24,13 @@ import android.Manifest import android.content.Intent import android.content.pm.PackageManager import android.net.Uri -import android.os.Build import android.os.Bundle import android.os.Environment import android.provider.Settings import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.activity.result.contract.ActivityResultContracts import androidx.core.app.ActivityCompat import com.aurora.extensions.isOAndAbove import com.aurora.extensions.isRAndAbove @@ -42,13 +42,36 @@ import com.aurora.store.data.model.Permission import com.aurora.store.databinding.FragmentOnboardingPermissionsBinding import com.aurora.store.view.epoxy.views.preference.PermissionViewModel_ import com.aurora.store.view.ui.commons.BaseFragment -import com.livinglifetechway.quickpermissions_kotlin.runWithPermissions class PermissionsFragment : BaseFragment() { private lateinit var B: FragmentOnboardingPermissionsBinding + private val startForPackageManagerResult = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { + if (isOAndAbove() && requireContext().packageManager.canRequestPackageInstalls()) { + toast(R.string.toast_permission_granted) + B.epoxyRecycler.requestModelBuild() + } + } + private val startForStorageManagerResult = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { + if (isRAndAbove() && Environment.isExternalStorageManager()) { + toast(R.string.toast_permission_granted) + B.epoxyRecycler.requestModelBuild() + } + } + private val startForPermissions = + registerForActivityResult(ActivityResultContracts.RequestPermission()) { + if (it) { + toast(R.string.toast_permission_granted) + B.epoxyRecycler.requestModelBuild() + } else { + toast(R.string.permissions_denied) + } + } + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -137,8 +160,8 @@ class PermissionsFragment : BaseFragment() { .click { _ -> when (it.id) { 0 -> checkStorageAccessPermission() - 1 -> checkStorageManagerPermission() - 2 -> checkUnknownResourceInstallation() + 1 -> requestStorageManagerPermission() + 2 -> requestPackageManagerPermission() 3 -> checkPostNotificationsPermission() } } @@ -147,59 +170,32 @@ class PermissionsFragment : BaseFragment() { } } - private fun checkStorageAccessPermission() = runWithPermissions( - Manifest.permission.WRITE_EXTERNAL_STORAGE, - Manifest.permission.READ_EXTERNAL_STORAGE - ) { - toast(R.string.toast_permission_granted) - B.epoxyRecycler.requestModelBuild() + private fun checkStorageAccessPermission() { + startForPermissions.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE) } private fun checkPostNotificationsPermission() { if (isTAndAbove()) { - runWithPermissions( - Manifest.permission.POST_NOTIFICATIONS - ) { - toast(R.string.toast_permission_granted) - B.epoxyRecycler.requestModelBuild() - } + startForPermissions.launch(Manifest.permission.POST_NOTIFICATIONS) } } - private fun checkStorageManagerPermission() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - if (Environment.isExternalStorageManager()) { - toast("Permission granted") - } else { - startActivityForResult( - Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION), - 99 - ) - } + private fun requestStorageManagerPermission() { + if (isRAndAbove()) { + startForStorageManagerResult.launch( + Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION) + ) } } - private fun checkUnknownResourceInstallation() { + private fun requestPackageManagerPermission() { if (isOAndAbove()) { - startActivityForResult( + startForPackageManagerResult.launch( Intent( Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, Uri.parse("package:${BuildConfig.APPLICATION_ID}") - ), - 999 + ) ) - } else { - toast("Permission granted") - } - } - - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - when (requestCode) { - 99, 999 -> { - toast(R.string.toast_permission_granted) - B.epoxyRecycler.requestModelBuild() - } } } diff --git a/app/src/main/java/com/aurora/store/view/ui/sheets/AppMenuSheet.kt b/app/src/main/java/com/aurora/store/view/ui/sheets/AppMenuSheet.kt index 963507f07..531224b4a 100644 --- a/app/src/main/java/com/aurora/store/view/ui/sheets/AppMenuSheet.kt +++ b/app/src/main/java/com/aurora/store/view/ui/sheets/AppMenuSheet.kt @@ -22,6 +22,7 @@ package com.aurora.store.view.ui.sheets import android.Manifest import android.content.Intent +import android.content.pm.PackageManager import android.os.Bundle import android.os.Environment import android.provider.Settings @@ -29,6 +30,8 @@ import android.view.LayoutInflater import android.view.MenuItem import android.view.View import android.view.ViewGroup +import androidx.activity.result.contract.ActivityResultContracts +import androidx.core.content.ContextCompat import com.aurora.Constants import com.aurora.extensions.isRAndAbove import com.aurora.gplayapi.data.models.App @@ -41,7 +44,6 @@ import com.aurora.store.util.ApkCopier import com.aurora.store.util.PackageUtil import com.aurora.extensions.openInfo import com.aurora.extensions.toast -import com.livinglifetechway.quickpermissions_kotlin.runWithPermissions import nl.komponents.kovenant.task import org.greenrobot.eventbus.EventBus @@ -50,6 +52,15 @@ class AppMenuSheet : BaseBottomSheet() { private lateinit var B: SheetAppMenuBinding private lateinit var app: App + private val startForPermissions = + registerForActivityResult(ActivityResultContracts.RequestPermission()) { + if (it) { + task { ApkCopier(requireContext(), app.packageName).copy() } + } else { + toast(R.string.permissions_denied) + } + } + override fun onCreateContentView( inflater: LayoutInflater, container: ViewGroup, @@ -138,13 +149,14 @@ class AppMenuSheet : BaseBottomSheet() { } } } else { - runWithPermissions( - Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.WRITE_EXTERNAL_STORAGE + if (ContextCompat.checkSelfPermission( + requireContext(), + Manifest.permission.WRITE_EXTERNAL_STORAGE + ) == PackageManager.PERMISSION_GRANTED ) { - task { - ApkCopier(requireContext(), app.packageName).copy() - } + task { ApkCopier(requireContext(), app.packageName).copy() } + } else { + startForPermissions.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE) } } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c3d716baf..3e522fb72 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -411,4 +411,5 @@ Expand Open in Aurora Store %1$s • API %2$s + Required permissions were denied. Please grant them in order to continue the action