Skip to content

Commit b5c9148

Browse files
authored
Improve permission handle flow. (#332)
* fix(ci): remove unused status field in publish.yml * chore: bump patch version in gradle.properties * feat(permission): implement storage permission handling using ActivityResultLauncher * feat(permission): refactor storage permission handling methods and introduce new permission check functions * fix(gradle): update patch version to 3 # GENERATE BY https://aicommit.app
1 parent 3a9fa63 commit b5c9148

4 files changed

Lines changed: 69 additions & 65 deletions

File tree

app/src/main/java/me/rosuh/easywatermark/ui/MainActivity.kt

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@ import android.view.View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
2020
import android.widget.Button
2121
import android.widget.TextView
2222
import android.widget.Toast
23+
import androidx.activity.result.ActivityResultCallback
2324
import androidx.activity.result.ActivityResultLauncher
25+
import androidx.activity.result.contract.ActivityResultContracts
2426
import androidx.activity.viewModels
2527
import androidx.appcompat.app.AppCompatActivity
2628
import androidx.core.content.ContextCompat
@@ -65,6 +67,8 @@ class MainActivity : AppCompatActivity() {
6567
private val currentBgColor: Int
6668
get() = ((launchView.parent as? View?)?.background as? ColorDrawable)?.color ?: colorSurface
6769

70+
private lateinit var requestPermissionLauncher: ActivityResultLauncher<String>
71+
6872
private val contentFunList: List<FuncTitleModel> by lazy {
6973
listOf(
7074
FuncTitleModel(
@@ -227,6 +231,16 @@ class MainActivity : AppCompatActivity() {
227231
registerForActivityResult(PickImageContract()) { uri: Uri? ->
228232
handleActivityResult(REQ_PICK_ICON, listOf(uri))
229233
}
234+
requestPermissionLauncher = registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->
235+
if (isGranted) {
236+
return@registerForActivityResult
237+
}
238+
Toast.makeText(
239+
this,
240+
getString(R.string.request_permission_failed),
241+
Toast.LENGTH_SHORT
242+
).show()
243+
}
230244
}
231245

232246
override fun onNewIntent(intent: Intent?) {
@@ -427,7 +441,7 @@ class MainActivity : AppCompatActivity() {
427441
}
428442
// pick image button
429443
launchView.ivSelectedPhotoTips.setOnClickListener {
430-
preCheckStoragePermission {
444+
checkReadingPermission(requestPermissionLauncher) {
431445
performFileSearch(REQ_CODE_PICK_IMAGE)
432446
}
433447
}
@@ -581,7 +595,7 @@ class MainActivity : AppCompatActivity() {
581595
TextContentDisplayFragment.replaceShow(this, launchView.fcFunctionDetail.id)
582596
}
583597
FuncTitleModel.FuncType.Icon -> {
584-
preCheckStoragePermission {
598+
checkReadingPermission(requestPermissionLauncher) {
585599
performFileSearch(REQ_PICK_ICON)
586600
}
587601
}
@@ -650,7 +664,7 @@ class MainActivity : AppCompatActivity() {
650664
}
651665

652666
R.id.action_pick -> {
653-
preCheckStoragePermission {
667+
checkReadingPermission(requestPermissionLauncher) {
654668
performFileSearch(REQ_CODE_PICK_IMAGE)
655669
}
656670
true
@@ -698,25 +712,6 @@ class MainActivity : AppCompatActivity() {
698712
}
699713
}
700714

701-
override fun onRequestPermissionsResult(
702-
requestCode: Int,
703-
permissions: Array<out String>,
704-
grantResults: IntArray
705-
) {
706-
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
707-
when (requestCode) {
708-
REQ_CODE_REQ_WRITE_PERMISSION -> {
709-
if (grantResults.isEmpty() || grantResults[0] != PackageManager.PERMISSION_GRANTED) {
710-
Toast.makeText(
711-
this,
712-
getString(R.string.request_permission_failed),
713-
Toast.LENGTH_SHORT
714-
).show()
715-
}
716-
}
717-
}
718-
}
719-
720715
private fun dealWithImage(uri: List<Uri>) {
721716
if (FileUtils.isImage(this.contentResolver, uri.first())) {
722717
viewModel.updateImageList(uri)
@@ -827,6 +822,10 @@ class MainActivity : AppCompatActivity() {
827822
return ViewInfo.from(launchView.ivPhoto)
828823
}
829824

825+
fun requestPermission(block: () -> Unit) {
826+
checkWritingPermission(requestPermissionLauncher, grant = block)
827+
}
828+
830829
companion object {
831830
private const val REQ_CODE_PICK_IMAGE: Int = 42
832831
const val REQ_CODE_REQ_WRITE_PERMISSION: Int = 43

app/src/main/java/me/rosuh/easywatermark/ui/dialog/SaveImageBSDialogFragment.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import android.view.View
88
import android.view.ViewGroup
99
import android.widget.ArrayAdapter
1010
import android.widget.Toast
11+
import androidx.activity.result.contract.ActivityResultContracts
1112
import androidx.core.view.isInvisible
1213
import androidx.core.view.isVisible
1314
import androidx.fragment.app.FragmentManager
@@ -48,7 +49,7 @@ class SaveImageBSDialogFragment : BaseBindBSDFragment<DialogSaveFileBinding>() {
4849
openShare()
4950
} else {
5051
// saving jobs
51-
requireActivity().preCheckStoragePermission {
52+
(activity as? MainActivity)?.requestPermission {
5253
shareViewModel.saveImage(
5354
requireActivity().contentResolver,
5455
(requireContext() as MainActivity).getImageViewInfo(),

app/src/main/java/me/rosuh/easywatermark/utils/ktx/ContextExtension.kt

Lines changed: 45 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,10 @@ import android.content.pm.PackageManager
77
import android.content.res.Configuration
88
import android.os.Build
99
import android.util.TypedValue
10+
import android.widget.Toast
11+
import androidx.activity.result.ActivityResultLauncher
1012
import androidx.annotation.AttrRes
1113
import androidx.annotation.ColorInt
12-
import androidx.core.app.ActivityCompat
1314
import androidx.core.content.ContextCompat
1415
import androidx.lifecycle.ViewModel
1516
import androidx.lifecycle.viewModelScope
@@ -18,54 +19,57 @@ import kotlinx.coroutines.Job
1819
import kotlinx.coroutines.launch
1920
import me.rosuh.cmonet.CMonet
2021
import me.rosuh.easywatermark.R
21-
import me.rosuh.easywatermark.ui.MainActivity
22-
23-
fun Activity.isStoragePermissionGrated(): Boolean {
24-
val readGranted = ContextCompat.checkSelfPermission(
25-
this,
26-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
27-
Manifest.permission.READ_MEDIA_IMAGES
28-
} else {
29-
Manifest.permission.READ_EXTERNAL_STORAGE
30-
}
31-
) == PackageManager.PERMISSION_GRANTED
32-
33-
val writeGranted =
34-
Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q || ContextCompat.checkSelfPermission(
35-
this,
36-
Manifest.permission.WRITE_EXTERNAL_STORAGE
37-
) == PackageManager.PERMISSION_GRANTED
3822

39-
return readGranted && writeGranted
23+
fun Activity.isStoragePermissionGrated(permission: String): Boolean {
24+
return ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED
4025
}
4126

42-
fun Activity.preCheckStoragePermission(block: () -> Unit) {
43-
if (isStoragePermissionGrated()) {
44-
block.invoke()
27+
fun Activity.checkReadingPermission(
28+
activityResultLauncher: ActivityResultLauncher<String>,
29+
failed: (msg: String) -> Unit = {
30+
Toast.makeText(this, it, Toast.LENGTH_SHORT).show()
31+
},
32+
grant: () -> Unit,
33+
) {
34+
val permissions = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
35+
Manifest.permission.READ_MEDIA_IMAGES
4536
} else {
46-
requestPermission()
37+
Manifest.permission.READ_EXTERNAL_STORAGE
4738
}
39+
preCheckStoragePermission(activityResultLauncher, permissions, failed, grant)
4840
}
4941

50-
/**
51-
* 申请权限
52-
*/
53-
fun Activity.requestPermission() {
54-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
55-
ActivityCompat.requestPermissions(
56-
this,
57-
arrayOf(
58-
Manifest.permission.READ_MEDIA_IMAGES,
59-
Manifest.permission.WRITE_EXTERNAL_STORAGE
60-
),
61-
MainActivity.REQ_CODE_REQ_WRITE_PERMISSION
62-
)
42+
fun Activity.checkWritingPermission(
43+
activityResultLauncher: ActivityResultLauncher<String>,
44+
failed: (msg: String) -> Unit = {
45+
Toast.makeText(this, it, Toast.LENGTH_SHORT).show()
46+
},
47+
grant: () -> Unit,
48+
) {
49+
val permissions = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
50+
Manifest.permission.READ_MEDIA_IMAGES
6351
} else {
64-
ActivityCompat.requestPermissions(
65-
this,
66-
arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE),
67-
MainActivity.REQ_CODE_REQ_WRITE_PERMISSION
68-
)
52+
Manifest.permission.WRITE_EXTERNAL_STORAGE
53+
}
54+
preCheckStoragePermission(activityResultLauncher, permissions, failed, grant)
55+
}
56+
57+
fun Activity.preCheckStoragePermission(
58+
activityResultLauncher: ActivityResultLauncher<String>,
59+
permission: String,
60+
failed: (msg: String) -> Unit = {
61+
Toast.makeText(this, it, Toast.LENGTH_SHORT).show()
62+
},
63+
grant: () -> Unit,
64+
) {
65+
if (isStoragePermissionGrated(permission)) {
66+
grant.invoke()
67+
return
68+
}
69+
kotlin.runCatching {
70+
activityResultLauncher.launch(permission)
71+
}.getOrElse {
72+
failed.invoke(it.message ?: "Unknown error")
6973
}
7074
}
7175

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,4 @@ android.nonFinalResIds=false
3131

3232
majorVersion=2
3333
minorVersion=9
34-
patchVersion=2
34+
patchVersion=3

0 commit comments

Comments
 (0)