Skip to content

Commit f3f38d4

Browse files
committed
Merge branch 'refs/heads/main' into latest
# Conflicts: # compose/snippets/build.gradle.kts # compose/snippets/src/main/java/com/example/compose/snippets/adaptivelayouts/SampleListDetailPaneScaffold.kt # compose/snippets/src/main/java/com/example/compose/snippets/pictureinpicture/PictureInPictureSnippets.kt # gradle/libs.versions.toml
2 parents 960f6de + 0280de8 commit f3f38d4

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+2618
-182
lines changed

.github/workflows/apply_spotless.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,3 +47,6 @@ jobs:
4747
uses: stefanzweifel/git-auto-commit-action@v4
4848
with:
4949
commit_message: Apply Spotless
50+
51+
- name: Run spotlessApply for Wear
52+
run: ./gradlew :wear:spotlessApply --init-script gradle/init.gradle.kts --no-configuration-cache --stacktrace

.github/workflows/build.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,5 @@ jobs:
4343
run: ./gradlew :compose:recomposehighlighter:build
4444
- name: Build kotlin snippets
4545
run: ./gradlew :kotlin:build
46+
- name: Build Wear snippets
47+
run: ./gradlew :wear:build

build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ plugins {
77
alias(libs.plugins.kotlin.android) apply false
88
alias(libs.plugins.kapt) apply false
99
alias(libs.plugins.hilt) apply false
10+
alias(libs.plugins.kotlin.parcelize) apply false
1011
}
1112

1213
apply("${project.rootDir}/buildscripts/toml-updater-config.gradle")

compose/snippets/build.gradle.kts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ plugins {
1919
alias(libs.plugins.kotlin.android)
2020
alias(libs.plugins.kapt)
2121
alias(libs.plugins.hilt)
22+
alias(libs.plugins.kotlin.parcelize)
2223
}
2324

2425
android {
@@ -94,12 +95,13 @@ dependencies {
9495

9596
implementation(libs.androidx.compose.material3)
9697
implementation(libs.androidx.compose.material3.adaptive)
98+
implementation(libs.androidx.compose.material3.adaptive.layout)
99+
implementation(libs.androidx.compose.material3.adaptive.navigation)
97100
implementation(libs.androidx.compose.material3.adaptive.navigation.suite)
98101
implementation(libs.androidx.compose.material)
99102

100103
implementation(libs.androidx.compose.runtime)
101104
implementation(libs.androidx.compose.runtime.livedata)
102-
implementation(libs.androidx.compose.materialWindow)
103105
implementation(libs.androidx.compose.material.iconsExtended)
104106
implementation(libs.androidx.compose.material.ripple)
105107
implementation(libs.androidx.constraintlayout.compose)
@@ -115,6 +117,8 @@ dependencies {
115117
implementation(libs.androidx.glance.appwidget)
116118
implementation(libs.androidx.glance.material3)
117119

120+
implementation(libs.androidx.window.core)
121+
118122
implementation(libs.accompanist.theme.adapter.appcompat)
119123
implementation(libs.accompanist.theme.adapter.material3)
120124
implementation(libs.accompanist.theme.adapter.material)

compose/snippets/src/main/java/com/example/compose/snippets/SnippetsActivity.kt

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,20 @@ import androidx.navigation.compose.rememberNavController
3030
import com.example.compose.snippets.animations.AnimationExamplesScreen
3131
import com.example.compose.snippets.animations.sharedelement.PlaceholderSizeAnimated_Demo
3232
import com.example.compose.snippets.components.AppBarExamples
33+
import com.example.compose.snippets.components.BadgeExamples
3334
import com.example.compose.snippets.components.ButtonExamples
35+
import com.example.compose.snippets.components.CheckboxExamples
3436
import com.example.compose.snippets.components.ChipExamples
3537
import com.example.compose.snippets.components.ComponentsScreen
3638
import com.example.compose.snippets.components.DialogExamples
39+
import com.example.compose.snippets.components.DividerExamples
3740
import com.example.compose.snippets.components.FloatingActionButtonExamples
41+
import com.example.compose.snippets.components.PartialBottomSheet
3842
import com.example.compose.snippets.components.ProgressIndicatorExamples
3943
import com.example.compose.snippets.components.ScaffoldExample
4044
import com.example.compose.snippets.components.SliderExamples
4145
import com.example.compose.snippets.components.SwitchExamples
46+
import com.example.compose.snippets.components.TimePickerExamples
4247
import com.example.compose.snippets.graphics.ApplyPolygonAsClipImage
4348
import com.example.compose.snippets.graphics.BitmapFromComposableFullSnippet
4449
import com.example.compose.snippets.graphics.BrushExamplesScreen
@@ -65,7 +70,7 @@ class SnippetsActivity : ComponentActivity() {
6570
composable("LandingScreen") {
6671
LandingScreen { navController.navigate(it.route) }
6772
}
68-
Destination.values().forEach { destination ->
73+
Destination.entries.forEach { destination ->
6974
composable(destination.route) {
7075
when (destination) {
7176
Destination.BrushExamples -> BrushExamplesScreen()
@@ -82,7 +87,7 @@ class SnippetsActivity : ComponentActivity() {
8287
}
8388
}
8489
}
85-
TopComponentsDestination.values().forEach { destination ->
90+
TopComponentsDestination.entries.forEach { destination ->
8691
composable(destination.route) {
8792
when (destination) {
8893
TopComponentsDestination.CardExamples -> CardExamples()
@@ -94,7 +99,14 @@ class SnippetsActivity : ComponentActivity() {
9499
TopComponentsDestination.ButtonExamples -> ButtonExamples()
95100
TopComponentsDestination.ProgressIndicatorExamples -> ProgressIndicatorExamples()
96101
TopComponentsDestination.ScaffoldExample -> ScaffoldExample()
97-
TopComponentsDestination.AppBarExamples -> AppBarExamples()
102+
TopComponentsDestination.AppBarExamples -> AppBarExamples {
103+
navController.popBackStack()
104+
}
105+
TopComponentsDestination.CheckboxExamples -> CheckboxExamples()
106+
TopComponentsDestination.DividerExamples -> DividerExamples()
107+
TopComponentsDestination.BadgeExamples -> BadgeExamples()
108+
TopComponentsDestination.PartialBottomSheet -> PartialBottomSheet()
109+
TopComponentsDestination.TimePickerExamples -> TimePickerExamples()
98110
}
99111
}
100112
}

compose/snippets/src/main/java/com/example/compose/snippets/adaptivelayouts/SampleListDetailPaneScaffold.kt

Lines changed: 39 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package com.example.compose.snippets.adaptivelayouts
1818

19+
import android.os.Parcelable
20+
import androidx.activity.compose.BackHandler
1921
import androidx.compose.foundation.background
2022
import androidx.compose.foundation.clickable
2123
import androidx.compose.foundation.layout.Column
@@ -27,39 +29,36 @@ import androidx.compose.foundation.lazy.LazyColumn
2729
import androidx.compose.material3.Card
2830
import androidx.compose.material3.ListItem
2931
import androidx.compose.material3.Text
30-
import androidx.compose.material3.adaptive.AnimatedPane
3132
import androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi
32-
import androidx.compose.material3.adaptive.ListDetailPaneScaffold
33-
import androidx.compose.material3.adaptive.ListDetailPaneScaffoldRole
34-
import androidx.compose.material3.adaptive.rememberListDetailPaneScaffoldNavigator
33+
import androidx.compose.material3.adaptive.layout.AnimatedPane
34+
import androidx.compose.material3.adaptive.layout.ListDetailPaneScaffold
35+
import androidx.compose.material3.adaptive.layout.ListDetailPaneScaffoldRole
36+
import androidx.compose.material3.adaptive.navigation.rememberListDetailPaneScaffoldNavigator
3537
import androidx.compose.runtime.Composable
3638
import androidx.compose.runtime.getValue
37-
import androidx.compose.runtime.mutableStateOf
38-
import androidx.compose.runtime.saveable.Saver
39-
import androidx.compose.runtime.saveable.rememberSaveable
4039
import androidx.compose.runtime.setValue
4140
import androidx.compose.ui.Modifier
4241
import androidx.compose.ui.graphics.Color
4342
import androidx.compose.ui.tooling.preview.Preview
4443
import androidx.compose.ui.unit.dp
4544
import androidx.compose.ui.unit.sp
45+
import kotlinx.parcelize.Parcelize
4646

4747
@OptIn(ExperimentalMaterial3AdaptiveApi::class)
4848
@Composable
4949
fun SampleListDetailPaneScaffoldParts() {
5050
// [START android_compose_adaptivelayouts_sample_list_detail_pane_scaffold_part02]
51-
val navigator = rememberListDetailPaneScaffoldNavigator()
52-
// [END android_compose_adaptivelayouts_sample_list_detail_pane_scaffold_part02]
51+
val navigator = rememberListDetailPaneScaffoldNavigator<MyItem>()
5352

54-
// [START android_compose_adaptivelayouts_sample_list_detail_pane_scaffold_part01]
55-
var selectedItem: MyItem? by rememberSaveable(stateSaver = MyItem.Saver) {
56-
mutableStateOf(null)
53+
BackHandler(navigator.canNavigateBack()) {
54+
navigator.navigateBack()
5755
}
58-
// [END android_compose_adaptivelayouts_sample_list_detail_pane_scaffold_part01]
56+
// [END android_compose_adaptivelayouts_sample_list_detail_pane_scaffold_part02]
5957

6058
// [START android_compose_adaptivelayouts_sample_list_detail_pane_scaffold_part03]
6159
ListDetailPaneScaffold(
62-
scaffoldState = navigator.scaffoldState,
60+
directive = navigator.scaffoldDirective,
61+
value = navigator.scaffoldValue,
6362
// [START_EXCLUDE]
6463
listPane = {},
6564
detailPane = {},
@@ -69,15 +68,14 @@ fun SampleListDetailPaneScaffoldParts() {
6968

7069
// [START android_compose_adaptivelayouts_sample_list_detail_pane_scaffold_part04]
7170
ListDetailPaneScaffold(
72-
scaffoldState = navigator.scaffoldState,
71+
directive = navigator.scaffoldDirective,
72+
value = navigator.scaffoldValue,
7373
listPane = {
74-
AnimatedPane(Modifier) {
74+
AnimatedPane {
7575
MyList(
76-
onItemClick = { id ->
77-
// Set current item
78-
selectedItem = id
79-
// Switch focus to detail pane
80-
navigator.navigateTo(ListDetailPaneScaffoldRole.Detail)
76+
onItemClick = { item ->
77+
// Navigate to the detail pane with the passed item
78+
navigator.navigateTo(ListDetailPaneScaffoldRole.Detail, item)
8179
}
8280
)
8381
}
@@ -90,15 +88,16 @@ fun SampleListDetailPaneScaffoldParts() {
9088

9189
// [START android_compose_adaptivelayouts_sample_list_detail_pane_scaffold_part05]
9290
ListDetailPaneScaffold(
93-
scaffoldState = navigator.scaffoldState,
91+
directive = navigator.scaffoldDirective,
92+
value = navigator.scaffoldValue,
9493
listPane =
9594
// [START_EXCLUDE]
9695
{},
9796
// [END_EXCLUDE]
9897
detailPane = {
99-
AnimatedPane(Modifier) {
100-
selectedItem?.let { item ->
101-
MyDetails(item)
98+
AnimatedPane {
99+
navigator.currentDestination?.content?.let {
100+
MyDetails(it)
102101
}
103102
}
104103
},
@@ -111,33 +110,30 @@ fun SampleListDetailPaneScaffoldParts() {
111110
@Composable
112111
fun SampleListDetailPaneScaffoldFull() {
113112
// [START android_compose_adaptivelayouts_sample_list_detail_pane_scaffold_full]
114-
// Currently selected item
115-
var selectedItem: MyItem? by rememberSaveable(stateSaver = MyItem.Saver) {
116-
mutableStateOf(null)
117-
}
113+
val navigator = rememberListDetailPaneScaffoldNavigator<MyItem>()
118114

119-
// Create the ListDetailPaneScaffoldState
120-
val navigator = rememberListDetailPaneScaffoldNavigator()
115+
BackHandler(navigator.canNavigateBack()) {
116+
navigator.navigateBack()
117+
}
121118

122119
ListDetailPaneScaffold(
123-
scaffoldState = navigator.scaffoldState,
120+
directive = navigator.scaffoldDirective,
121+
value = navigator.scaffoldValue,
124122
listPane = {
125-
AnimatedPane(Modifier) {
123+
AnimatedPane {
126124
MyList(
127-
onItemClick = { id ->
128-
// Set current item
129-
selectedItem = id
130-
// Display the detail pane
131-
navigator.navigateTo(ListDetailPaneScaffoldRole.Detail)
125+
onItemClick = { item ->
126+
// Navigate to the detail pane with the passed item
127+
navigator.navigateTo(ListDetailPaneScaffoldRole.Detail, item)
132128
},
133129
)
134130
}
135131
},
136132
detailPane = {
137-
AnimatedPane(Modifier) {
133+
AnimatedPane {
138134
// Show the detail pane content if selected item is available
139-
selectedItem?.let { item ->
140-
MyDetails(item)
135+
navigator.currentDestination?.content?.let {
136+
MyDetails(it)
141137
}
142138
}
143139
},
@@ -193,19 +189,11 @@ fun MyDetails(item: MyItem) {
193189
}
194190

195191
// [START android_compose_adaptivelayouts_sample_list_detail_pane_scaffold_myitem]
196-
class MyItem(val id: Int) {
197-
companion object {
198-
val Saver: Saver<MyItem?, Int> = Saver(
199-
{ it?.id },
200-
::MyItem,
201-
)
202-
}
203-
}
192+
@Parcelize
193+
class MyItem(val id: Int) : Parcelable
204194
// [END android_compose_adaptivelayouts_sample_list_detail_pane_scaffold_myitem]
205195

206196
val shortStrings = listOf(
207-
"Android",
208-
"Petit four",
209197
"Cupcake",
210198
"Donut",
211199
"Eclair",

0 commit comments

Comments
 (0)