Skip to content

Commit 9e19c75

Browse files
committed
Add immersive experience in focus mode of InAppGallery
1 parent fd89a34 commit 9e19c75

File tree

4 files changed

+40
-2
lines changed

4 files changed

+40
-2
lines changed

app/src/main/java/app/grapheneos/camera/ktx/Dp.kt

+3
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,8 @@ import androidx.compose.runtime.Composable
44
import androidx.compose.ui.platform.LocalDensity
55
import androidx.compose.ui.unit.Dp
66

7+
@Composable
8+
fun Int.pxToDp() = with(LocalDensity.current) { this@pxToDp.toDp() }
9+
710
@Composable
811
fun Dp.toPx() = with(LocalDensity.current) { this@toPx.toPx() }

app/src/main/java/app/grapheneos/camera/ui/composable/component/mediapreview/MediaPreview.kt

+16-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@ import androidx.compose.foundation.Image
44
import androidx.compose.foundation.background
55
import androidx.compose.foundation.border
66
import androidx.compose.foundation.layout.Box
7+
import androidx.compose.foundation.layout.ExperimentalLayoutApi
8+
import androidx.compose.foundation.layout.WindowInsets
79
import androidx.compose.foundation.layout.fillMaxSize
10+
import androidx.compose.foundation.layout.navigationBarsIgnoringVisibility
811
import androidx.compose.foundation.layout.padding
912
import androidx.compose.foundation.layout.requiredSize
1013
import androidx.compose.foundation.shape.CircleShape
@@ -17,6 +20,7 @@ import androidx.compose.ui.Modifier
1720
import androidx.compose.ui.graphics.Color
1821
import androidx.compose.ui.layout.ContentScale
1922
import androidx.compose.ui.platform.LocalContext
23+
import androidx.compose.ui.platform.LocalDensity
2024
import androidx.compose.ui.res.painterResource
2125
import androidx.compose.ui.res.stringResource
2226
import androidx.compose.ui.unit.dp
@@ -25,6 +29,7 @@ import androidx.lifecycle.compose.LifecycleResumeEffect
2529
import app.grapheneos.camera.CapturedItem
2630
import app.grapheneos.camera.ITEM_TYPE_VIDEO
2731
import app.grapheneos.camera.R
32+
import app.grapheneos.camera.ktx.pxToDp
2833

2934
import coil3.ImageLoader
3035

@@ -34,13 +39,16 @@ import coil3.video.VideoFrameDecoder
3439

3540
private const val TAG = "MediaPreview"
3641

42+
@OptIn(ExperimentalLayoutApi::class)
3743
@Composable
3844
fun MediaPreview(
3945
capturedItem: CapturedItem,
4046
modifier: Modifier = Modifier
4147
) {
4248
val context = LocalContext.current
4349

50+
val density = LocalDensity.current
51+
4452
val imageLoader = remember(context, capturedItem) {
4553
ImageLoader.Builder(context)
4654
.components {
@@ -76,10 +84,17 @@ fun MediaPreview(
7684
mediaPreviewErrorType = MediaPreviewErrorType.INFO_MESSAGE
7785
)
7886

87+
88+
density.density
89+
7990
Box(contentAlignment = Alignment.Center) {
8091
Image(
8192
painter = imagePainter,
82-
modifier = modifier.fillMaxSize(),
93+
modifier = modifier
94+
.fillMaxSize()
95+
.padding(
96+
bottom = WindowInsets.navigationBarsIgnoringVisibility.getBottom(density).pxToDp()
97+
),
8398
contentScale = ContentScale.Fit,
8499
contentDescription = stringResource(R.string.preview)
85100
)

app/src/main/java/app/grapheneos/camera/ui/composable/screen/ui/GalleryScreen.kt

+20-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package app.grapheneos.camera.ui.composable.screen.ui
22

3+
import android.app.Activity
34
import android.widget.Toast
45
import androidx.compose.animation.AnimatedVisibility
56
import androidx.compose.animation.animateColorAsState
@@ -37,11 +38,15 @@ import androidx.compose.ui.Modifier
3738
import androidx.compose.ui.graphics.Color
3839

3940
import androidx.compose.ui.platform.LocalContext
41+
import androidx.compose.ui.platform.LocalView
4042
import androidx.compose.ui.res.stringResource
4143
import androidx.compose.ui.text.style.TextAlign
4244
import androidx.compose.ui.unit.LayoutDirection
4345
import androidx.compose.ui.unit.dp
4446
import androidx.compose.ui.unit.sp
47+
import androidx.core.view.WindowCompat
48+
import androidx.core.view.WindowInsetsCompat
49+
import androidx.core.view.WindowInsetsControllerCompat
4550

4651
import androidx.lifecycle.viewmodel.compose.viewModel
4752
import app.grapheneos.camera.CapturedItem
@@ -74,6 +79,12 @@ fun GalleryScreen(
7479
) {
7580
val context = LocalContext.current
7681

82+
val window = (context as Activity).window
83+
84+
val insetsController = WindowCompat.getInsetsController(window, LocalView.current).apply {
85+
systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_DEFAULT
86+
}
87+
7788
val zoomableState = rememberZoomableState()
7889

7990
val coroutineScope = rememberCoroutineScope()
@@ -125,6 +136,14 @@ fun GalleryScreen(
125136
}
126137
}
127138

139+
LaunchedEffect(viewModel.inFocusMode) {
140+
if (viewModel.inFocusMode) {
141+
insetsController.hide(WindowInsetsCompat.Type.systemBars())
142+
} else {
143+
insetsController.show(WindowInsetsCompat.Type.systemBars())
144+
}
145+
}
146+
128147
// Displays media info dialog when displayedMediaItem is not null
129148
MediaInfoDialog(
130149
mediaItemDetails = viewModel.displayedMediaItem,
@@ -224,7 +243,7 @@ fun GalleryScreen(
224243
// material guidelines)
225244
0.dp,
226245
innerPadding.calculateEndPadding(LayoutDirection.Ltr),
227-
innerPadding.calculateBottomPadding(),
246+
0.dp,
228247
)
229248
.fillMaxSize()
230249
) { page ->

app/src/main/res/values/colors.xml

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<resources>
33
<color name="system_accent1_100">#cbe2ff</color>
4+
<color name="system_accent1_500">#1b69c5</color>
45

56
<color name="system_neutral1_100">#dde2e9</color>
67
<color name="system_neutral1_900">#181c1f</color>

0 commit comments

Comments
 (0)