Switch to ActivityResultContracts for requesting permissions

QuickPermissions hasn't been updated since past few years hinting its
deprecated status

Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
This commit is contained in:
Aayush Gupta
2023-05-18 16:32:23 +05:30
parent f3b7ea6d58
commit 28a6758087
6 changed files with 87 additions and 65 deletions

View File

@@ -137,9 +137,6 @@ dependencies {
implementation "androidx.navigation:navigation-fragment-ktx:$nav_version" implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
implementation "androidx.navigation:navigation-ui-ktx:$nav_version" implementation "androidx.navigation:navigation-ui-ktx:$nav_version"
//Easy Permission
implementation "com.github.quickpermissions:quickpermissions-kotlin:0.4.1"
//Glide //Glide
def glide_version = '4.15.1' def glide_version = '4.15.1'
implementation "com.github.bumptech.glide:glide:$glide_version" implementation "com.github.bumptech.glide:glide:$glide_version"

View File

@@ -22,6 +22,7 @@ package com.aurora.store
import android.Manifest import android.Manifest
import android.content.Intent import android.content.Intent
import android.content.pm.PackageManager
import android.content.res.ColorStateList import android.content.res.ColorStateList
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
@@ -33,7 +34,9 @@ import android.widget.ImageView
import android.widget.TextView import android.widget.TextView
import android.widget.Toast import android.widget.Toast
import androidx.activity.addCallback import androidx.activity.addCallback
import androidx.activity.result.contract.ActivityResultContracts
import androidx.annotation.IdRes import androidx.annotation.IdRes
import androidx.core.content.ContextCompat
import androidx.core.graphics.ColorUtils import androidx.core.graphics.ColorUtils
import androidx.core.view.GravityCompat import androidx.core.view.GravityCompat
import androidx.navigation.NavController 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.aurora.store.view.ui.spoof.SpoofActivity
import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.load.resource.bitmap.RoundedCorners
import com.google.android.material.bottomnavigation.BottomNavigationView import com.google.android.material.bottomnavigation.BottomNavigationView
import com.livinglifetechway.quickpermissions_kotlin.runWithPermissions
import nl.komponents.kovenant.task import nl.komponents.kovenant.task
import nl.komponents.kovenant.ui.successUi import nl.komponents.kovenant.ui.successUi
@@ -76,6 +78,11 @@ class MainActivity : BaseActivity() {
private var lastBackPressed = 0L private var lastBackPressed = 0L
private val startForPermissions =
registerForActivityResult(ActivityResultContracts.RequestPermission()) {
if (!it) toast(R.string.permissions_denied)
}
override fun onConnected() { override fun onConnected() {
hideNetworkConnectivitySheet() hideNetworkConnectivitySheet()
} }
@@ -125,7 +132,13 @@ class MainActivity : BaseActivity() {
if (isRAndAbove()) { if (isRAndAbove()) {
checkExternalStorageManagerPermission() checkExternalStorageManagerPermission()
} else { } 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() 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() { private fun checkExternalStorageManagerPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
if (!Environment.isExternalStorageManager()) if (!Environment.isExternalStorageManager())

View File

@@ -25,6 +25,7 @@ import android.content.ActivityNotFoundException
import android.content.ComponentName import android.content.ComponentName
import android.content.Intent import android.content.Intent
import android.content.ServiceConnection import android.content.ServiceConnection
import android.content.pm.PackageManager
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.os.Environment import android.os.Environment
@@ -35,6 +36,8 @@ import android.view.MenuItem
import android.view.View import android.view.View
import android.widget.LinearLayout import android.widget.LinearLayout
import androidx.activity.addCallback import androidx.activity.addCallback
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.content.ContextCompat
import com.aurora.Constants import com.aurora.Constants
import com.aurora.extensions.* import com.aurora.extensions.*
import com.aurora.gplayapi.data.models.App 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.bumptech.glide.load.resource.bitmap.RoundedCorners
import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetBehavior.BottomSheetCallback import com.google.android.material.bottomsheet.BottomSheetBehavior.BottomSheetCallback
import com.livinglifetechway.quickpermissions_kotlin.runWithPermissions
import com.tonyodev.fetch2.* import com.tonyodev.fetch2.*
import com.tonyodev.fetch2core.DownloadBlock import com.tonyodev.fetch2core.DownloadBlock
import nl.komponents.kovenant.task import nl.komponents.kovenant.task
@@ -76,6 +78,11 @@ class AppDetailsActivity : BaseDetailsActivity() {
private lateinit var B: ActivityDetailsBinding private lateinit var B: ActivityDetailsBinding
private lateinit var bottomSheetBehavior: BottomSheetBehavior<LinearLayout> private lateinit var bottomSheetBehavior: BottomSheetBehavior<LinearLayout>
private val startForPermissions =
registerForActivityResult(ActivityResultContracts.RequestPermission()) {
if (it) updateApp(app) else toast(R.string.permissions_denied)
}
private lateinit var authData: AuthData private lateinit var authData: AuthData
private lateinit var app: App private lateinit var app: App
private var fetch: Fetch? = null private var fetch: Fetch? = null
@@ -496,11 +503,14 @@ class AppDetailsActivity : BaseDetailsActivity() {
updateApp(app) updateApp(app)
} }
} else { } else {
runWithPermissions( if (ContextCompat.checkSelfPermission(
Manifest.permission.READ_EXTERNAL_STORAGE, this,
Manifest.permission.WRITE_EXTERNAL_STORAGE Manifest.permission.WRITE_EXTERNAL_STORAGE
) == PackageManager.PERMISSION_GRANTED
) { ) {
updateApp(app) updateApp(app)
} else {
startForPermissions.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE)
} }
} }
} }

View File

@@ -24,13 +24,13 @@ import android.Manifest
import android.content.Intent import android.content.Intent
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.net.Uri import android.net.Uri
import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.os.Environment import android.os.Environment
import android.provider.Settings import android.provider.Settings
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.activity.result.contract.ActivityResultContracts
import androidx.core.app.ActivityCompat import androidx.core.app.ActivityCompat
import com.aurora.extensions.isOAndAbove import com.aurora.extensions.isOAndAbove
import com.aurora.extensions.isRAndAbove 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.databinding.FragmentOnboardingPermissionsBinding
import com.aurora.store.view.epoxy.views.preference.PermissionViewModel_ import com.aurora.store.view.epoxy.views.preference.PermissionViewModel_
import com.aurora.store.view.ui.commons.BaseFragment import com.aurora.store.view.ui.commons.BaseFragment
import com.livinglifetechway.quickpermissions_kotlin.runWithPermissions
class PermissionsFragment : BaseFragment() { class PermissionsFragment : BaseFragment() {
private lateinit var B: FragmentOnboardingPermissionsBinding 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( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,
container: ViewGroup?, container: ViewGroup?,
@@ -137,8 +160,8 @@ class PermissionsFragment : BaseFragment() {
.click { _ -> .click { _ ->
when (it.id) { when (it.id) {
0 -> checkStorageAccessPermission() 0 -> checkStorageAccessPermission()
1 -> checkStorageManagerPermission() 1 -> requestStorageManagerPermission()
2 -> checkUnknownResourceInstallation() 2 -> requestPackageManagerPermission()
3 -> checkPostNotificationsPermission() 3 -> checkPostNotificationsPermission()
} }
} }
@@ -147,59 +170,32 @@ class PermissionsFragment : BaseFragment() {
} }
} }
private fun checkStorageAccessPermission() = runWithPermissions( private fun checkStorageAccessPermission() {
Manifest.permission.WRITE_EXTERNAL_STORAGE, startForPermissions.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE)
Manifest.permission.READ_EXTERNAL_STORAGE
) {
toast(R.string.toast_permission_granted)
B.epoxyRecycler.requestModelBuild()
} }
private fun checkPostNotificationsPermission() { private fun checkPostNotificationsPermission() {
if (isTAndAbove()) { if (isTAndAbove()) {
runWithPermissions( startForPermissions.launch(Manifest.permission.POST_NOTIFICATIONS)
Manifest.permission.POST_NOTIFICATIONS
) {
toast(R.string.toast_permission_granted)
B.epoxyRecycler.requestModelBuild()
}
} }
} }
private fun checkStorageManagerPermission() { private fun requestStorageManagerPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { if (isRAndAbove()) {
if (Environment.isExternalStorageManager()) { startForStorageManagerResult.launch(
toast("Permission granted") Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION)
} else { )
startActivityForResult(
Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION),
99
)
}
} }
} }
private fun checkUnknownResourceInstallation() { private fun requestPackageManagerPermission() {
if (isOAndAbove()) { if (isOAndAbove()) {
startActivityForResult( startForPackageManagerResult.launch(
Intent( Intent(
Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES,
Uri.parse("package:${BuildConfig.APPLICATION_ID}") 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()
}
} }
} }

View File

@@ -22,6 +22,7 @@ package com.aurora.store.view.ui.sheets
import android.Manifest import android.Manifest
import android.content.Intent import android.content.Intent
import android.content.pm.PackageManager
import android.os.Bundle import android.os.Bundle
import android.os.Environment import android.os.Environment
import android.provider.Settings import android.provider.Settings
@@ -29,6 +30,8 @@ import android.view.LayoutInflater
import android.view.MenuItem import android.view.MenuItem
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.content.ContextCompat
import com.aurora.Constants import com.aurora.Constants
import com.aurora.extensions.isRAndAbove import com.aurora.extensions.isRAndAbove
import com.aurora.gplayapi.data.models.App 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.store.util.PackageUtil
import com.aurora.extensions.openInfo import com.aurora.extensions.openInfo
import com.aurora.extensions.toast import com.aurora.extensions.toast
import com.livinglifetechway.quickpermissions_kotlin.runWithPermissions
import nl.komponents.kovenant.task import nl.komponents.kovenant.task
import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.EventBus
@@ -50,6 +52,15 @@ class AppMenuSheet : BaseBottomSheet() {
private lateinit var B: SheetAppMenuBinding private lateinit var B: SheetAppMenuBinding
private lateinit var app: App 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( override fun onCreateContentView(
inflater: LayoutInflater, inflater: LayoutInflater,
container: ViewGroup, container: ViewGroup,
@@ -138,13 +149,14 @@ class AppMenuSheet : BaseBottomSheet() {
} }
} }
} else { } else {
runWithPermissions( if (ContextCompat.checkSelfPermission(
Manifest.permission.READ_EXTERNAL_STORAGE, requireContext(),
Manifest.permission.WRITE_EXTERNAL_STORAGE Manifest.permission.WRITE_EXTERNAL_STORAGE
) == PackageManager.PERMISSION_GRANTED
) { ) {
task { task { ApkCopier(requireContext(), app.packageName).copy() }
ApkCopier(requireContext(), app.packageName).copy() } else {
} startForPermissions.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE)
} }
} }
} }

View File

@@ -411,4 +411,5 @@
<string name="expand">Expand</string> <string name="expand">Expand</string>
<string name="open_in_aurora">Open in Aurora Store</string> <string name="open_in_aurora">Open in Aurora Store</string>
<string name="spoof_property"><xliff:g id="manufacturer">%1$s</xliff:g> • API <xliff:g id="api">%2$s</xliff:g></string> <string name="spoof_property"><xliff:g id="manufacturer">%1$s</xliff:g> • API <xliff:g id="api">%2$s</xliff:g></string>
<string name="permissions_denied">Required permissions were denied. Please grant them in order to continue the action</string>
</resources> </resources>