mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-04-21 09:20:19 +01:00
Add selected photos access.
This commit is contained in:
committed by
mtang-signal
parent
4f001a0c95
commit
57adab858c
@@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
)
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user