Skip to content

Commit b2069c4

Browse files
committed
Update with the review comments.
1 parent 3e6de69 commit b2069c4

File tree

11 files changed

+123
-204
lines changed

11 files changed

+123
-204
lines changed

AdaptiveJetStream/jetstream/src/main/java/com/google/jetstream/MainActivity.kt

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
4242
import androidx.xr.compose.material3.EnableXrComponentOverrides
4343
import androidx.xr.compose.material3.ExperimentalMaterial3XrApi
4444
import com.google.jetstream.presentation.App
45-
import com.google.jetstream.presentation.components.feature.FormFactor
4645
import com.google.jetstream.presentation.components.feature.UiMode
4746
import com.google.jetstream.presentation.theme.JetStreamTheme
4847
import dagger.hilt.android.AndroidEntryPoint
@@ -55,7 +54,7 @@ class MainActivity : ComponentActivity() {
5554
installSplashScreen()
5655
super.onCreate(savedInstanceState)
5756

58-
tryEnableEdgeToEdge()
57+
enableEdgeToEdge()
5958
tryEnableCustomHeader()
6059
setContent {
6160
JetStreamTheme {
@@ -90,12 +89,6 @@ class MainActivity : ComponentActivity() {
9089
data?.addAll(keyboardShortcuts)
9190
}
9291

93-
private fun tryEnableEdgeToEdge() {
94-
if (toEnableEdgeToEdge()) {
95-
enableEdgeToEdge()
96-
}
97-
}
98-
9992
private fun tryEnableCustomHeader() {
10093
if (toEnableCustomHeader()) {
10194
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM) {
@@ -113,16 +106,6 @@ class MainActivity : ComponentActivity() {
113106
private val currentUiMode: UiMode
114107
get() = UiMode.from(resources.configuration)
115108

116-
private fun toEnableEdgeToEdge(
117-
uiMode: UiMode = currentUiMode
118-
): Boolean {
119-
return when (uiMode.formFactor) {
120-
FormFactor.Normal -> true
121-
FormFactor.Desk -> true
122-
else -> false
123-
}
124-
}
125-
126109
private fun toEnableCustomHeader(): Boolean {
127110
val reliedFeatures = listOf(
128111
PackageManager.FEATURE_FREEFORM_WINDOW_MANAGEMENT,

AdaptiveJetStream/jetstream/src/main/java/com/google/jetstream/presentation/App.kt

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ import com.google.jetstream.presentation.app.withNavigationSuiteScaffold.AppWith
3030
import com.google.jetstream.presentation.app.withNavigationSuiteScaffold.EnableProminentMovieListOverride
3131
import com.google.jetstream.presentation.app.withTopBarNavigation.AppWithTopBarNavigation
3232
import com.google.jetstream.presentation.components.KeyboardShortcut
33-
import com.google.jetstream.presentation.components.KeyboardShortcutHandleArea
3433
import com.google.jetstream.presentation.components.ModifierKey
34+
import com.google.jetstream.presentation.components.handleKeyboardShortcuts
3535
import com.google.jetstream.presentation.screens.Screens
3636

3737
@Composable
@@ -138,27 +138,24 @@ fun App(
138138
appState.updateNavigationComponentType(navigationComponentType)
139139
}
140140

141-
KeyboardShortcutHandleArea(keyboardShortcuts) {
142-
when (navigationComponentType) {
143-
NavigationComponentType.NavigationSuiteScaffold -> {
144-
EnableProminentMovieListOverride {
145-
AppWithNavigationSuiteScaffold(
146-
appState = appState,
147-
onActivityBackPressed = onActivityBackPressed,
148-
navController = navController,
149-
modifier = modifier,
150-
)
151-
}
152-
}
153-
154-
NavigationComponentType.Custom -> {
155-
AppWithTopBarNavigation(
141+
when (navigationComponentType) {
142+
NavigationComponentType.NavigationSuiteScaffold -> {
143+
EnableProminentMovieListOverride {
144+
AppWithNavigationSuiteScaffold(
156145
appState = appState,
157-
onActivityBackPressed = onActivityBackPressed,
158146
navController = navController,
159-
modifier = modifier,
147+
modifier = modifier.handleKeyboardShortcuts(keyboardShortcuts),
160148
)
161149
}
162150
}
151+
152+
NavigationComponentType.Custom -> {
153+
AppWithTopBarNavigation(
154+
appState = appState,
155+
onActivityBackPressed = onActivityBackPressed,
156+
navController = navController,
157+
modifier = modifier.handleKeyboardShortcuts(keyboardShortcuts),
158+
)
159+
}
163160
}
164161
}

AdaptiveJetStream/jetstream/src/main/java/com/google/jetstream/presentation/app/withNavigationSuiteScaffold/AppWithNavigationSuiteScaffold.kt

Lines changed: 28 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,12 @@ import androidx.xr.compose.platform.LocalSpatialConfiguration
4040
import com.google.jetstream.presentation.app.AppState
4141
import com.google.jetstream.presentation.app.NavigationTree
4242
import com.google.jetstream.presentation.app.updateTopBarVisibility
43-
import com.google.jetstream.presentation.components.BackPressHandledArea
4443
import com.google.jetstream.presentation.screens.Screens
4544

4645
@Composable
4746
fun AppWithNavigationSuiteScaffold(
4847
appState: AppState,
4948
navController: NavHostController,
50-
onActivityBackPressed: () -> Unit,
5149
modifier: Modifier = Modifier,
5250
) {
5351

@@ -99,42 +97,38 @@ fun AppWithNavigationSuiteScaffold(
9997
}
10098
}
10199
) {
102-
BackPressHandledArea(
103-
onBackPressed = onActivityBackPressed
104-
) {
105-
Scaffold(
106-
modifier = Modifier.fillMaxSize(),
107-
topBar = {
108-
AnimatedVisibility(
109-
visible = shouldShowTopBar,
110-
enter = slideInVertically(),
111-
exit = slideOutVertically()
112-
) {
113-
val horizontalPadding = remember(navigationType) {
114-
when (navigationType) {
115-
NavigationSuiteType.NavigationRail -> 32.dp
116-
else -> 8.dp
117-
}
100+
Scaffold(
101+
modifier = Modifier.fillMaxSize(),
102+
topBar = {
103+
AnimatedVisibility(
104+
visible = shouldShowTopBar,
105+
enter = slideInVertically(),
106+
exit = slideOutVertically()
107+
) {
108+
val horizontalPadding = remember(navigationType) {
109+
when (navigationType) {
110+
NavigationSuiteType.NavigationRail -> 32.dp
111+
else -> 8.dp
118112
}
119-
TopBar(
120-
appState = appState,
121-
navController = navController,
122-
modifier = Modifier.padding(
123-
start = horizontalPadding,
124-
end = horizontalPadding,
125-
top = paddingTop
126-
)
127-
)
128113
}
114+
TopBar(
115+
appState = appState,
116+
navController = navController,
117+
modifier = Modifier.padding(
118+
start = horizontalPadding,
119+
end = horizontalPadding,
120+
top = paddingTop
121+
)
122+
)
129123
}
130-
) { padding ->
131-
NavigationTree(
132-
navController = navController,
133-
isTopBarVisible = appState.isTopBarVisible,
134-
modifier = modifier.padding(padding),
135-
onScroll = { updateTopBarVisibility(appState, it) }
136-
)
137124
}
125+
) { padding ->
126+
NavigationTree(
127+
navController = navController,
128+
isTopBarVisible = appState.isTopBarVisible,
129+
modifier = modifier.padding(padding),
130+
onScroll = { updateTopBarVisibility(appState, it) }
131+
)
138132
}
139133
}
140134
}

AdaptiveJetStream/jetstream/src/main/java/com/google/jetstream/presentation/app/withTopBarNavigation/AppWithTopBarNavigation.kt

Lines changed: 29 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ import androidx.navigation.NavHostController
3030
import com.google.jetstream.presentation.app.AppState
3131
import com.google.jetstream.presentation.app.NavigationTree
3232
import com.google.jetstream.presentation.app.updateTopBarVisibility
33-
import com.google.jetstream.presentation.components.BackPressHandledArea
33+
import com.google.jetstream.presentation.components.onBackButtonPressed
3434
import com.google.jetstream.presentation.components.shim.tryRequestFocus
3535
import com.google.jetstream.presentation.screens.Screens
3636

@@ -44,8 +44,8 @@ fun AppWithTopBarNavigation(
4444
val items = remember { Screens.entries.filter { it.isTabItem } }
4545
val topBar = remember { FocusRequester() }
4646

47-
BackPressHandledArea(
48-
onBackPressed = {
47+
Column(
48+
modifier = modifier.onBackButtonPressed {
4949
when {
5050
!appState.isNavigationVisible -> {
5151
onActivityBackPressed()
@@ -70,35 +70,33 @@ fun AppWithTopBarNavigation(
7070
}
7171
}
7272
) {
73-
Column(modifier = modifier) {
74-
AnimatedVisibility(
75-
appState.isNavigationVisible &&
76-
appState.isTopBarVisible
77-
) {
78-
TopBar(
79-
items,
80-
appState.selectedScreen,
81-
{
82-
if (it != appState.selectedScreen) {
83-
navController.navigate(it())
84-
}
85-
},
86-
modifier = Modifier
87-
.padding(
88-
vertical = 16.dp,
89-
horizontal = 74.dp,
90-
)
91-
.focusRequester(topBar)
92-
.onFocusChanged {
93-
appState.updateTopBarFocusState(it.hasFocus)
94-
}
95-
)
96-
}
97-
NavigationTree(
98-
navController = navController,
99-
isTopBarVisible = appState.isTopBarVisible,
100-
onScroll = { updateTopBarVisibility(appState, it) }
73+
AnimatedVisibility(
74+
appState.isNavigationVisible &&
75+
appState.isTopBarVisible
76+
) {
77+
TopBar(
78+
items,
79+
appState.selectedScreen,
80+
{
81+
if (it != appState.selectedScreen) {
82+
navController.navigate(it())
83+
}
84+
},
85+
modifier = Modifier
86+
.padding(
87+
vertical = 16.dp,
88+
horizontal = 74.dp,
89+
)
90+
.focusRequester(topBar)
91+
.onFocusChanged {
92+
appState.updateTopBarFocusState(it.hasFocus)
93+
}
10194
)
10295
}
96+
NavigationTree(
97+
navController = navController,
98+
isTopBarVisible = appState.isTopBarVisible,
99+
onScroll = { updateTopBarVisibility(appState, it) }
100+
)
103101
}
104102
}

AdaptiveJetStream/jetstream/src/main/java/com/google/jetstream/presentation/app/withTopBarNavigation/TopBar.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ import androidx.compose.ui.focus.FocusDirection
4343
import androidx.compose.ui.focus.FocusRequester
4444
import androidx.compose.ui.focus.focusProperties
4545
import androidx.compose.ui.focus.focusRequester
46+
import androidx.compose.ui.focus.onFocusChanged
4647
import androidx.compose.ui.platform.LocalFocusManager
4748
import androidx.compose.ui.semantics.contentDescription
4849
import androidx.compose.ui.semantics.semantics
@@ -53,7 +54,6 @@ import com.google.jetstream.presentation.app.UserAvatar
5354
import com.google.jetstream.presentation.components.feature.FormFactor
5455
import com.google.jetstream.presentation.components.feature.rememberUiMode
5556
import com.google.jetstream.presentation.components.shim.tryRequestFocus
56-
import com.google.jetstream.presentation.components.shim.tvSelectTarget
5757
import com.google.jetstream.presentation.screens.Screens
5858

5959
@Composable
@@ -191,8 +191,10 @@ private fun TopBarTab(
191191
Tab(
192192
selected = selected,
193193
modifier = Modifier
194-
.tvSelectTarget {
195-
onSelect()
194+
.onFocusChanged {
195+
if (it.isFocused) {
196+
onSelect()
197+
}
196198
}
197199
.then(modifier),
198200
onClick = onClick,

AdaptiveJetStream/jetstream/src/main/java/com/google/jetstream/presentation/components/KeyboardShortcut.kt

Lines changed: 5 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,6 @@
1616

1717
package com.google.jetstream.presentation.components
1818

19-
import androidx.compose.foundation.layout.Box
20-
import androidx.compose.foundation.layout.BoxScope
21-
import androidx.compose.runtime.Composable
2219
import androidx.compose.ui.Modifier
2320
import androidx.compose.ui.input.key.Key
2421
import androidx.compose.ui.input.key.KeyEvent
@@ -32,26 +29,14 @@ import androidx.compose.ui.input.key.onPreviewKeyEvent
3229
import androidx.compose.ui.input.key.type
3330
import com.google.jetstream.data.convert.Into
3431

35-
@Composable
36-
fun KeyboardShortcutHandleArea(
37-
shortcuts: List<KeyboardShortcut>,
38-
modifier: Modifier = Modifier,
39-
content: @Composable BoxScope.() -> Unit
40-
) {
41-
Box(
42-
modifier = Modifier
43-
.handleKeyboardShortcuts(shortcuts)
44-
.then(modifier),
45-
content = content
46-
)
47-
}
48-
4932
fun Modifier.handleKeyboardShortcuts(
5033
shortcuts: List<KeyboardShortcut>,
5134
): Modifier {
52-
return onPreviewKeyEvent { keyEvent ->
53-
keyEvent.type == KeyEventType.KeyUp && shortcuts.any { it.callActionIfMatch(keyEvent) }
54-
}
35+
return Modifier
36+
.onPreviewKeyEvent { keyEvent ->
37+
keyEvent.type == KeyEventType.KeyUp && shortcuts.any { it.callActionIfMatch(keyEvent) }
38+
}
39+
.then(this)
5540
}
5641

5742
data class KeyboardShortcut(
Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -16,32 +16,24 @@
1616

1717
package com.google.jetstream.presentation.components
1818

19-
import androidx.compose.foundation.layout.Box
20-
import androidx.compose.foundation.layout.BoxScope
21-
import androidx.compose.runtime.Composable
2219
import androidx.compose.ui.Modifier
2320
import androidx.compose.ui.input.key.Key
2421
import androidx.compose.ui.input.key.KeyEventType
2522
import androidx.compose.ui.input.key.key
2623
import androidx.compose.ui.input.key.onPreviewKeyEvent
2724
import androidx.compose.ui.input.key.type
2825

29-
@Composable
30-
fun BackPressHandledArea(
26+
fun Modifier.onBackButtonPressed(
3127
onBackPressed: () -> Unit,
32-
modifier: Modifier = Modifier,
33-
content: @Composable BoxScope.() -> Unit,
34-
) =
35-
Box(
36-
modifier = Modifier
37-
.onPreviewKeyEvent {
38-
if (it.key == Key.Back && it.type == KeyEventType.KeyUp) {
39-
onBackPressed()
40-
true
41-
} else {
42-
false
43-
}
28+
): Modifier {
29+
return Modifier
30+
.onPreviewKeyEvent {
31+
if (it.key == Key.Back && it.type == KeyEventType.KeyUp) {
32+
onBackPressed()
33+
true
34+
} else {
35+
false
4436
}
45-
.then(modifier),
46-
content = content
47-
)
37+
}
38+
.then(this)
39+
}

AdaptiveJetStream/jetstream/src/main/java/com/google/jetstream/presentation/components/feature/ImmersiveModeAvailability.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ fun rememberImmersiveModeAvailability(): Boolean {
2626
when (uiMode.formFactor) {
2727
FormFactor.Normal -> true
2828
FormFactor.Desk -> true
29+
FormFactor.Car -> true
2930
else -> false
3031
}
3132
}

0 commit comments

Comments
 (0)