Skip to content

Commit c6f7f82

Browse files
committed
Add Spatial layout for ResultsScreen
1 parent 9196009 commit c6f7f82

File tree

8 files changed

+595
-172
lines changed

8 files changed

+595
-172
lines changed

feature/results/src/main/java/com/android/developers/androidify/results/BotActionsButtonRow.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ import com.android.developers.androidify.theme.components.PrimaryButton
3030
@Composable
3131
fun BotActionsButtonRow(
3232
onCustomizeShareClicked: () -> Unit,
33+
layoutType: ResultsLayoutType,
3334
modifier: Modifier = Modifier,
34-
verboseLayout: Boolean = false,
3535
) {
3636
Row(modifier) {
3737
PrimaryButton(
@@ -48,7 +48,10 @@ fun BotActionsButtonRow(
4848
)
4949
}
5050
},
51-
buttonText = if (verboseLayout) stringResource(R.string.customize_and_share) else null,
51+
buttonText = when (layoutType) {
52+
ResultsLayoutType.Spatial, ResultsLayoutType.Verbose -> stringResource(R.string.customize_and_share)
53+
ResultsLayoutType.Constrained -> null
54+
},
5255
)
5356
}
5457
}

feature/results/src/main/java/com/android/developers/androidify/results/BotResultCard.kt

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,9 @@ import coil3.compose.AsyncImage
4949

5050
@Composable
5151
fun BotResultCard(
52-
resultImageUri: Uri,
53-
originalImageUrl: Uri?,
54-
promptText: String?,
5552
flippableState: FlippableState,
53+
front: @Composable () -> Unit,
54+
back: @Composable () -> Unit,
5655
modifier: Modifier = Modifier,
5756
onFlipStateChanged: ((FlippableState) -> Unit)? = null,
5857
) {
@@ -64,21 +63,13 @@ fun BotResultCard(
6463
.safeContentPadding(),
6564
flippableState = flippableState,
6665
onFlipStateChanged = onFlipStateChanged,
67-
front = {
68-
FrontCard(resultImageUri)
69-
},
70-
back = {
71-
if (originalImageUrl != null) {
72-
BackCard(originalImageUrl)
73-
} else {
74-
BackCardPrompt(promptText!!)
75-
}
76-
},
66+
front = front,
67+
back = back,
7768
)
7869
}
7970

8071
@Composable
81-
private fun FrontCard(resultImageUri: Uri) {
72+
fun FrontCardImage(resultImageUri: Uri) {
8273
AsyncImage(
8374
model = resultImageUri,
8475
contentDescription = stringResource(R.string.resultant_android_bot),
@@ -92,7 +83,7 @@ private fun FrontCard(resultImageUri: Uri) {
9283
}
9384

9485
@Composable
95-
private fun BackCard(originalImageUrl: Uri) {
86+
fun BackCard(originalImageUrl: Uri) {
9687
AsyncImage(
9788
model = originalImageUrl,
9889
contentDescription = stringResource(R.string.original_image),
@@ -106,7 +97,7 @@ private fun BackCard(originalImageUrl: Uri) {
10697
}
10798

10899
@Composable
109-
private fun BackCardPrompt(promptText: String) {
100+
fun BackCardPrompt(promptText: String) {
110101
val annotatedString = buildAnnotatedString {
111102
pushStyle(SpanStyle(fontWeight = Bold))
112103
append(stringResource(R.string.my_bot_is_wearing))

feature/results/src/main/java/com/android/developers/androidify/results/ResultOption.kt

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -18,40 +18,25 @@
1818
package com.android.developers.androidify.results
1919

2020
import androidx.compose.foundation.layout.Column
21-
import androidx.compose.foundation.layout.padding
2221
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
2322
import androidx.compose.runtime.Composable
2423
import androidx.compose.ui.Modifier
2524
import androidx.compose.ui.res.stringResource
2625
import androidx.compose.ui.tooling.preview.Preview
27-
import androidx.compose.ui.unit.dp
2826
import com.android.developers.androidify.theme.AndroidifyTheme
2927
import com.android.developers.androidify.theme.components.HorizontalToolbar
3028

31-
@Preview
32-
@Composable
33-
private fun ResultToolBarOptionPreview() {
34-
AndroidifyTheme {
35-
Column {
36-
ResultToolbarOption {
37-
}
38-
}
39-
}
40-
}
41-
4229
@Composable
4330
fun ResultToolbarOption(
4431
modifier: Modifier = Modifier,
4532
selectedOption: ResultOption = ResultOption.ResultImage,
4633
wasPromptUsed: Boolean = false,
4734
onResultOptionSelected: (ResultOption) -> Unit,
4835
) {
49-
HorizontalToolbar<ResultOption>(
50-
selectedOption,
51-
modifier = modifier.padding(start = 16.dp, end = 16.dp, top = 8.dp),
52-
label = {
53-
stringResource(it.displayText(wasPromptUsed))
54-
},
36+
HorizontalToolbar(
37+
selectedOption = selectedOption,
38+
modifier = modifier,
39+
label = { stringResource(it.displayText(wasPromptUsed)) },
5540
onOptionSelected = onResultOptionSelected,
5641
)
5742
}
@@ -76,3 +61,14 @@ enum class ResultOption(val displayName: Int) {
7661
}
7762
}
7863
}
64+
65+
@Preview
66+
@Composable
67+
private fun ResultToolBarOptionPreview() {
68+
AndroidifyTheme {
69+
Column {
70+
ResultToolbarOption {
71+
}
72+
}
73+
}
74+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/*
2+
* Copyright 2025 The Android Open Source Project
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package com.android.developers.androidify.results
17+
18+
import androidx.compose.runtime.Composable
19+
import com.android.developers.androidify.util.allowsFullContent
20+
import com.android.developers.androidify.xr.LocalSpatialCapabilities
21+
22+
enum class ResultsLayoutType {
23+
Verbose,
24+
Constrained,
25+
Spatial,
26+
}
27+
28+
@Composable
29+
internal fun getLayoutType(enableXr: Boolean): ResultsLayoutType {
30+
return when {
31+
LocalSpatialCapabilities.current.isSpatialUiEnabled && enableXr -> ResultsLayoutType.Spatial
32+
allowsFullContent() -> ResultsLayoutType.Verbose
33+
else -> ResultsLayoutType.Constrained
34+
}
35+
}

0 commit comments

Comments
 (0)