Skip to content

Commit

Permalink
chore(android): handle permissions correctly
Browse files Browse the repository at this point in the history
  • Loading branch information
abhaysood committed Feb 3, 2025
1 parent 987e5a2 commit 7eb721b
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ internal object ImageLoader {
imageView.setImageBitmap(it)
onLoadedListener()
}
}
},
)
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package sh.measure.android.bugreport

import android.Manifest.permission.READ_EXTERNAL_STORAGE
import android.Manifest.permission.READ_MEDIA_IMAGES
import android.Manifest.permission.READ_MEDIA_VISUAL_USER_SELECTED
import android.app.Activity
import android.content.Context
import android.content.Intent
Expand All @@ -8,6 +11,7 @@ import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.text.InputFilter
import android.view.View
import android.widget.EditText
import android.widget.HorizontalScrollView
import android.widget.ImageButton
Expand All @@ -27,6 +31,7 @@ import sh.measure.android.bugreport.BugReportCollector.Companion.MAX_ATTACHMENTS
import sh.measure.android.bugreport.BugReportCollector.Companion.MAX_DESCRIPTION_LENGTH
import sh.measure.android.bugreport.BugReportCollector.Companion.PICK_IMAGES_REQUEST
import sh.measure.android.bugreport.BugReportCollector.Companion.READ_IMAGES_PERMISSION_REQUEST
import sh.measure.android.utils.isPermissionDeclared

internal class MsrBugReportActivity : Activity() {
private lateinit var etDescription: EditText
Expand Down Expand Up @@ -79,8 +84,7 @@ internal class MsrBugReportActivity : Activity() {
super.onActivityResult(requestCode, resultCode, data)
when (requestCode) {
PICK_IMAGES_REQUEST -> {
val selectedUris =
bugReportCollector.onImagePickedResult(this, resultCode, data)
val selectedUris = bugReportCollector.onImagePickedResult(this, resultCode, data)
handleSelectedUris(selectedUris)
}
}
Expand All @@ -99,7 +103,7 @@ internal class MsrBugReportActivity : Activity() {
} else {
Toast.makeText(
this,
"Unable to open image picker, permission denied",
"Photos access needed to attach screenshots",
Toast.LENGTH_LONG,
).show()
}
Expand All @@ -110,6 +114,7 @@ internal class MsrBugReportActivity : Activity() {
private fun setupInitialState(savedInstanceState: Bundle?) {
bugReportCollector = Measure.getBugReportCollector()
maxAttachments = intent.getIntExtra(MAX_ATTACHMENTS_EXTRA, 1)
tvChooseImage.visibility = if (canAccessGalleryImages()) View.VISIBLE else View.GONE
if (savedInstanceState == null) {
showInitialScreenshot()
} else {
Expand Down Expand Up @@ -188,7 +193,7 @@ internal class MsrBugReportActivity : Activity() {
return IntentCompat.getParcelableExtra(
intent,
INITIAL_SCREENSHOT_EXTRA,
ParcelableAttachment::class.java
ParcelableAttachment::class.java,
)
}

Expand Down Expand Up @@ -292,4 +297,15 @@ internal class MsrBugReportActivity : Activity() {
uris.toList(),
)
}

private fun canAccessGalleryImages(): Boolean {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
isPermissionDeclared(this, READ_MEDIA_VISUAL_USER_SELECTED) ||
isPermissionDeclared(this, READ_MEDIA_IMAGES)
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
isPermissionDeclared(this, READ_MEDIA_IMAGES)
} else {
isPermissionDeclared(this, READ_EXTERNAL_STORAGE)
}
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package sh.measure.android.utils

import android.content.Context
import android.content.pm.PackageManager
import androidx.core.content.PermissionChecker

internal fun hasPermission(context: Context, permission: String): Boolean {
Expand All @@ -9,3 +10,18 @@ internal fun hasPermission(context: Context, permission: String): Boolean {
permission,
) == PermissionChecker.PERMISSION_GRANTED
}

/**
* Checks if the [permission] is declared in the manifest.
*/
internal fun isPermissionDeclared(context: Context, permission: String): Boolean {
return try {
val packageInfo = context.packageManager.getPackageInfo(
context.packageName,
PackageManager.GET_PERMISSIONS,
)
packageInfo.requestedPermissions?.contains(permission) ?: false
} catch (e: PackageManager.NameNotFoundException) {
false
}
}
2 changes: 2 additions & 0 deletions android/sample/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_BASIC_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_MEDIA_VISUAL_USER_SELECTED" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />

<application
android:name=".SampleApp"
Expand Down

0 comments on commit 7eb721b

Please sign in to comment.