Show gallery button on camera screen when camera permission is denied.

This commit is contained in:
Greyson Parrelli
2026-02-23 14:47:06 +00:00
parent 46681868d3
commit 772ad3b929

View File

@@ -39,6 +39,7 @@ import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel
import org.signal.camera.CameraScreen
@@ -46,6 +47,7 @@ import org.signal.camera.CameraScreenEvents
import org.signal.camera.CameraScreenViewModel
import org.signal.camera.VideoCaptureResult
import org.signal.camera.VideoOutput
import org.signal.camera.hud.GalleryThumbnailButton
import org.signal.camera.hud.StandardCameraHud
import org.signal.camera.hud.StandardCameraHudEvents
import org.signal.camera.hud.StringResources
@@ -141,6 +143,7 @@ class CameraXFragment : ComposeFragment(), CameraFragment {
onCheckPermissions = { checkPermissions(isVideoEnabled) },
hasCameraPermission = { hasCameraPermission() },
onRequestMicPermission = { requestMicPermission() },
onGalleryClicked = { controller?.onGalleryClicked() },
createVideoFileDescriptor = { createVideoFileDescriptor() },
getMaxVideoDurationInSeconds = { getMaxVideoDurationInSeconds() },
cameraDisplay = CameraDisplay.getDisplay(requireActivity())
@@ -300,6 +303,7 @@ private fun CameraXScreen(
onCheckPermissions: () -> Unit,
hasCameraPermission: () -> Boolean,
onRequestMicPermission: () -> Unit,
onGalleryClicked: () -> Unit,
createVideoFileDescriptor: () -> ParcelFileDescriptor?,
getMaxVideoDurationInSeconds: () -> Int,
cameraDisplay: CameraDisplay,
@@ -436,7 +440,9 @@ private fun CameraXScreen(
} else {
PermissionMissingContent(
isVideoEnabled = isVideoEnabled,
onRequestPermissions = onCheckPermissions
onRequestPermissions = onCheckPermissions,
onGalleryClicked = onGalleryClicked,
galleryButtonBottomPadding = hudBottomMargin + 16.dp
)
}
}
@@ -445,7 +451,9 @@ private fun CameraXScreen(
@Composable
private fun PermissionMissingContent(
isVideoEnabled: Boolean,
onRequestPermissions: () -> Unit
onRequestPermissions: () -> Unit,
onGalleryClicked: () -> Unit,
galleryButtonBottomPadding: Dp = 16.dp
) {
val context = LocalContext.current
val hasAudioPermission = remember { Permissions.hasAll(context, Manifest.permission.RECORD_AUDIO) }
@@ -476,6 +484,14 @@ private fun PermissionMissingContent(
Text(text = stringResource(R.string.CameraXFragment_allow_access))
}
}
Box(
modifier = Modifier
.align(Alignment.BottomEnd)
.padding(bottom = galleryButtonBottomPadding, end = 40.dp)
) {
GalleryThumbnailButton(onClick = onGalleryClicked)
}
}
}
@@ -600,6 +616,7 @@ private fun CameraXScreenPreview_20_9() {
onCheckPermissions = {},
hasCameraPermission = { true },
onRequestMicPermission = { },
onGalleryClicked = { },
createVideoFileDescriptor = { null },
getMaxVideoDurationInSeconds = { 60 },
cameraDisplay = CameraDisplay.DISPLAY_20_9,
@@ -626,6 +643,7 @@ private fun CameraXScreenPreview_19_9() {
onCheckPermissions = {},
hasCameraPermission = { true },
onRequestMicPermission = { },
onGalleryClicked = { },
createVideoFileDescriptor = { null },
getMaxVideoDurationInSeconds = { 60 },
cameraDisplay = CameraDisplay.DISPLAY_19_9,
@@ -652,6 +670,7 @@ private fun CameraXScreenPreview_18_9() {
onCheckPermissions = {},
hasCameraPermission = { true },
onRequestMicPermission = { },
onGalleryClicked = { },
createVideoFileDescriptor = { null },
getMaxVideoDurationInSeconds = { 60 },
cameraDisplay = CameraDisplay.DISPLAY_18_9,
@@ -678,6 +697,7 @@ private fun CameraXScreenPreview_16_9() {
onCheckPermissions = {},
hasCameraPermission = { true },
onRequestMicPermission = { },
onGalleryClicked = { },
createVideoFileDescriptor = { null },
getMaxVideoDurationInSeconds = { 60 },
cameraDisplay = CameraDisplay.DISPLAY_16_9,
@@ -704,6 +724,7 @@ private fun CameraXScreenPreview_6_5() {
onCheckPermissions = {},
hasCameraPermission = { true },
onRequestMicPermission = { },
onGalleryClicked = { },
createVideoFileDescriptor = { null },
getMaxVideoDurationInSeconds = { 60 },
cameraDisplay = CameraDisplay.DISPLAY_6_5,