Add selected photos access.

This commit is contained in:
Michelle Tang
2024-07-30 11:35:48 -04:00
committed by mtang-signal
parent 4f001a0c95
commit 57adab858c
19 changed files with 505 additions and 65 deletions

View File

@@ -15,7 +15,9 @@ import android.os.Build
object PermissionCompat {
@JvmStatic
fun forImages(): Array<String> {
return if (Build.VERSION.SDK_INT >= 33) {
return if (Build.VERSION.SDK_INT >= 34) {
arrayOf(Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VISUAL_USER_SELECTED)
} else if (Build.VERSION.SDK_INT == 33) {
arrayOf(Manifest.permission.READ_MEDIA_IMAGES)
} else {
arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE)
@@ -23,7 +25,9 @@ object PermissionCompat {
}
private fun forVideos(): Array<String> {
return if (Build.VERSION.SDK_INT >= 33) {
return if (Build.VERSION.SDK_INT >= 34) {
arrayOf(Manifest.permission.READ_MEDIA_VIDEO, Manifest.permission.READ_MEDIA_VISUAL_USER_SELECTED)
} else if (Build.VERSION.SDK_INT == 33) {
arrayOf(Manifest.permission.READ_MEDIA_VIDEO)
} else {
arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE)
@@ -34,4 +38,12 @@ object PermissionCompat {
fun forImagesAndVideos(): Array<String> {
return setOf(*(forImages() + forVideos())).toTypedArray()
}
fun getRequiredPermissionsForDenial(): Array<String> {
return if (Build.VERSION.SDK_INT >= 34) {
arrayOf(Manifest.permission.READ_MEDIA_VISUAL_USER_SELECTED)
} else {
forImagesAndVideos()
}
}
}

View File

@@ -39,16 +39,20 @@ private const val PLACEHOLDER = "__RADIO_BUTTON_PLACEHOLDER__"
*/
class PermissionDeniedBottomSheet private constructor() : ComposeBottomSheetDialogFragment() {
override val peekHeightPercentage: Float = 0.66f
companion object {
private const val ARG_TITLE = "argument.title_res"
private const val ARG_SUBTITLE = "argument.subtitle_res"
private const val ARG_USE_EXTENDED = "argument.use.extended"
@JvmStatic
fun showPermissionFragment(titleRes: Int, subtitleRes: Int): ComposeBottomSheetDialogFragment {
fun showPermissionFragment(titleRes: Int, subtitleRes: Int, useExtended: Boolean = false): ComposeBottomSheetDialogFragment {
return PermissionDeniedBottomSheet().apply {
arguments = bundleOf(
ARG_TITLE to titleRes,
ARG_SUBTITLE to subtitleRes
ARG_SUBTITLE to subtitleRes,
ARG_USE_EXTENDED to useExtended
)
}
}
@@ -59,6 +63,7 @@ class PermissionDeniedBottomSheet private constructor() : ComposeBottomSheetDial
PermissionDeniedSheetContent(
titleRes = remember { requireArguments().getInt(ARG_TITLE) },
subtitleRes = remember { requireArguments().getInt(ARG_SUBTITLE) },
useExtended = remember { requireArguments().getBoolean(ARG_USE_EXTENDED) },
onSettingsClicked = this::goToSettings
)
}
@@ -85,6 +90,7 @@ private fun PermissionDeniedSheetContentPreview() {
private fun PermissionDeniedSheetContent(
titleRes: Int,
subtitleRes: Int,
useExtended: Boolean = false,
onSettingsClicked: () -> Unit
) {
Column(
@@ -119,9 +125,18 @@ private fun PermissionDeniedSheetContent(
modifier = Modifier.padding(bottom = 24.dp)
)
val step2String = stringResource(id = R.string.PermissionDeniedBottomSheet__2_allow_permission, PLACEHOLDER)
val (step2Text, step2InlineContent) = remember(step2String) {
val parts = step2String.split(PLACEHOLDER)
if (useExtended) {
Text(
text = stringResource(R.string.PermissionDeniedBottomSheet__2_tap_permissions),
color = MaterialTheme.colorScheme.onSurface,
modifier = Modifier.padding(bottom = 24.dp)
)
}
val stringId = if (useExtended) R.string.PermissionDeniedBottomSheet__3_allow_permission else R.string.PermissionDeniedBottomSheet__2_allow_permission
val stepString = stringResource(id = stringId, PLACEHOLDER)
val (stepText, stepInlineContent) = remember(stepString) {
val parts = stepString.split(PLACEHOLDER)
val annotatedString = buildAnnotatedString {
append(parts[0])
appendInlineContent("radio")
@@ -142,8 +157,8 @@ private fun PermissionDeniedSheetContent(
}
Text(
text = step2Text,
inlineContent = step2InlineContent,
text = stepText,
inlineContent = stepInlineContent,
color = MaterialTheme.colorScheme.onSurface,
modifier = Modifier.padding(bottom = 32.dp)
)

View File

@@ -135,7 +135,11 @@ public class Permissions {
}
public PermissionsBuilder withPermanentDenialDialog(@NonNull String message, @Nullable Runnable onDialogDismissed, int titleRes, int detailsRes, @Nullable FragmentManager fragmentManager) {
return onAnyPermanentlyDenied(new SettingsDialogListener(permissionObject.getContext(), message, onDialogDismissed, titleRes, detailsRes, fragmentManager));
return withPermanentDenialDialog(message, onDialogDismissed, titleRes, detailsRes, false, fragmentManager);
}
public PermissionsBuilder withPermanentDenialDialog(@NonNull String message, @Nullable Runnable onDialogDismissed, int titleRes, int detailsRes, boolean useExtended, @Nullable FragmentManager fragmentManager) {
return onAnyPermanentlyDenied(new SettingsDialogListener(permissionObject.getContext(), message, onDialogDismissed, titleRes, detailsRes, useExtended, fragmentManager));
}
public PermissionsBuilder onAllGranted(Runnable allGrantedListener) {
@@ -402,14 +406,16 @@ public class Permissions {
private final int titleRes;
private final int detailsRes;
private final boolean useBottomSheet;
private final boolean useExtended;
SettingsDialogListener(Context context, String message, @Nullable Runnable onDialogDismissed, int titleRes, int detailsRes, @Nullable FragmentManager fragmentManager) {
SettingsDialogListener(Context context, String message, @Nullable Runnable onDialogDismissed, int titleRes, int detailsRes, boolean useExtended, @Nullable FragmentManager fragmentManager) {
this.message = message;
this.context = new WeakReference<>(context);
this.onDialogDismissed = onDialogDismissed;
this.fragmentManager = new WeakReference<>(fragmentManager);
this.titleRes = titleRes;
this.detailsRes = detailsRes;
this.useExtended = useExtended;
this.useBottomSheet = fragmentManager != null;
}
@@ -420,7 +426,7 @@ public class Permissions {
if (context != null) {
if (useBottomSheet && fragmentManager != null) {
PermissionDeniedBottomSheet.showPermissionFragment(titleRes, detailsRes).show(fragmentManager, BottomSheetUtil.STANDARD_BOTTOM_SHEET_FRAGMENT_TAG);
PermissionDeniedBottomSheet.showPermissionFragment(titleRes, detailsRes, useExtended).show(fragmentManager, BottomSheetUtil.STANDARD_BOTTOM_SHEET_FRAGMENT_TAG);
} else if (!useBottomSheet){
new MaterialAlertDialogBuilder(context)
.setTitle(R.string.Permissions_permission_required)