Merge "Clarify test for rememberSaveable" into androidx-main
diff --git a/compose/material3/adaptive/adaptive-layout/api/current.txt b/compose/material3/adaptive/adaptive-layout/api/current.txt
index 2336343..b4cd5c9 100644
--- a/compose/material3/adaptive/adaptive-layout/api/current.txt
+++ b/compose/material3/adaptive/adaptive-layout/api/current.txt
@@ -110,12 +110,28 @@
property @androidx.compose.runtime.Composable public abstract String description;
}
- public static final class PaneExpansionAnchor.Offset extends androidx.compose.material3.adaptive.layout.PaneExpansionAnchor {
- ctor public PaneExpansionAnchor.Offset(float offset);
- method @androidx.compose.runtime.Composable public String getDescription();
- method public float getOffset();
- property @androidx.compose.runtime.Composable public String description;
+ public abstract static class PaneExpansionAnchor.Offset extends androidx.compose.material3.adaptive.layout.PaneExpansionAnchor {
+ method public final int getDirection();
+ method public final float getOffset();
+ property public final int direction;
property public final float offset;
+ field public static final androidx.compose.material3.adaptive.layout.PaneExpansionAnchor.Offset.Companion Companion;
+ }
+
+ public static final class PaneExpansionAnchor.Offset.Companion {
+ method public androidx.compose.material3.adaptive.layout.PaneExpansionAnchor.Offset fromEnd(float offset);
+ method public androidx.compose.material3.adaptive.layout.PaneExpansionAnchor.Offset fromStart(float offset);
+ }
+
+ @kotlin.jvm.JvmInline public static final value class PaneExpansionAnchor.Offset.Direction {
+ field public static final androidx.compose.material3.adaptive.layout.PaneExpansionAnchor.Offset.Direction.Companion Companion;
+ }
+
+ public static final class PaneExpansionAnchor.Offset.Direction.Companion {
+ method public int getFromEnd();
+ method public int getFromStart();
+ property public final int FromEnd;
+ property public final int FromStart;
}
public static final class PaneExpansionAnchor.Proportion extends androidx.compose.material3.adaptive.layout.PaneExpansionAnchor {
diff --git a/compose/material3/adaptive/adaptive-layout/api/restricted_current.txt b/compose/material3/adaptive/adaptive-layout/api/restricted_current.txt
index 2336343..b4cd5c9 100644
--- a/compose/material3/adaptive/adaptive-layout/api/restricted_current.txt
+++ b/compose/material3/adaptive/adaptive-layout/api/restricted_current.txt
@@ -110,12 +110,28 @@
property @androidx.compose.runtime.Composable public abstract String description;
}
- public static final class PaneExpansionAnchor.Offset extends androidx.compose.material3.adaptive.layout.PaneExpansionAnchor {
- ctor public PaneExpansionAnchor.Offset(float offset);
- method @androidx.compose.runtime.Composable public String getDescription();
- method public float getOffset();
- property @androidx.compose.runtime.Composable public String description;
+ public abstract static class PaneExpansionAnchor.Offset extends androidx.compose.material3.adaptive.layout.PaneExpansionAnchor {
+ method public final int getDirection();
+ method public final float getOffset();
+ property public final int direction;
property public final float offset;
+ field public static final androidx.compose.material3.adaptive.layout.PaneExpansionAnchor.Offset.Companion Companion;
+ }
+
+ public static final class PaneExpansionAnchor.Offset.Companion {
+ method public androidx.compose.material3.adaptive.layout.PaneExpansionAnchor.Offset fromEnd(float offset);
+ method public androidx.compose.material3.adaptive.layout.PaneExpansionAnchor.Offset fromStart(float offset);
+ }
+
+ @kotlin.jvm.JvmInline public static final value class PaneExpansionAnchor.Offset.Direction {
+ field public static final androidx.compose.material3.adaptive.layout.PaneExpansionAnchor.Offset.Direction.Companion Companion;
+ }
+
+ public static final class PaneExpansionAnchor.Offset.Direction.Companion {
+ method public int getFromEnd();
+ method public int getFromStart();
+ property public final int FromEnd;
+ property public final int FromStart;
}
public static final class PaneExpansionAnchor.Proportion extends androidx.compose.material3.adaptive.layout.PaneExpansionAnchor {
diff --git a/compose/material3/adaptive/adaptive-layout/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/layout/PaneExpansionStateTest.kt b/compose/material3/adaptive/adaptive-layout/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/layout/PaneExpansionStateTest.kt
index 681cae4..344c0f6 100644
--- a/compose/material3/adaptive/adaptive-layout/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/layout/PaneExpansionStateTest.kt
+++ b/compose/material3/adaptive/adaptive-layout/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/layout/PaneExpansionStateTest.kt
@@ -233,7 +233,7 @@
ThreePaneScaffoldRole.Secondary,
ThreePaneScaffoldRole.Tertiary
),
- PaneExpansionStateData(7, 0.8F, 9, PaneExpansionAnchor.Offset(200.dp))
+ PaneExpansionStateData(7, 0.8F, 9, PaneExpansionAnchor.Offset.fromStart(200.dp))
),
Pair(
TwoPaneExpansionStateKeyImpl(
@@ -271,12 +271,12 @@
@OptIn(ExperimentalMaterial3AdaptiveApi::class)
private val MockAnchor0 = PaneExpansionAnchor.Proportion(0f)
@OptIn(ExperimentalMaterial3AdaptiveApi::class)
-private val MockAnchor1 = PaneExpansionAnchor.Offset(200.dp)
+private val MockAnchor1 = PaneExpansionAnchor.Offset.fromStart(200.dp)
@OptIn(ExperimentalMaterial3AdaptiveApi::class)
private val MockAnchor2 = PaneExpansionAnchor.Proportion(0.5f)
@OptIn(ExperimentalMaterial3AdaptiveApi::class)
-private val MockAnchor3 = PaneExpansionAnchor.Offset((-200).dp)
+private val MockAnchor3 = PaneExpansionAnchor.Offset.fromEnd(200.dp)
@OptIn(ExperimentalMaterial3AdaptiveApi::class)
private val MockAnchor4 = PaneExpansionAnchor.Proportion(1f)
@OptIn(ExperimentalMaterial3AdaptiveApi::class)
-private val MockAnchor5 = PaneExpansionAnchor.Offset(500.dp)
+private val MockAnchor5 = PaneExpansionAnchor.Offset.fromStart(500.dp)
diff --git a/compose/material3/adaptive/adaptive-layout/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/layout/ThreePaneScaffoldTest.kt b/compose/material3/adaptive/adaptive-layout/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/layout/ThreePaneScaffoldTest.kt
index a7fd150..3677863 100644
--- a/compose/material3/adaptive/adaptive-layout/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/layout/ThreePaneScaffoldTest.kt
+++ b/compose/material3/adaptive/adaptive-layout/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/layout/ThreePaneScaffoldTest.kt
@@ -303,7 +303,7 @@
anchors =
listOf(
PaneExpansionAnchor.Proportion(0f),
- PaneExpansionAnchor.Offset(MockPaneExpansionMiddleAnchor)
+ PaneExpansionAnchor.Offset.fromStart(MockPaneExpansionMiddleAnchor)
)
)
mockDraggingPx = with(LocalDensity.current) { 200.dp.toPx() }
@@ -340,7 +340,7 @@
rule.runOnIdle {
scope.launch {
mockPaneExpansionState.animateTo(
- PaneExpansionAnchor.Offset(MockPaneExpansionMiddleAnchor)
+ PaneExpansionAnchor.Offset.fromStart(MockPaneExpansionMiddleAnchor)
)
}
}
@@ -368,7 +368,7 @@
rule.runOnIdle {
scope.launch {
mockPaneExpansionState.animateTo(
- PaneExpansionAnchor.Offset(MockPaneExpansionMiddleAnchor),
+ PaneExpansionAnchor.Offset.fromStart(MockPaneExpansionMiddleAnchor),
200F
)
}
@@ -394,7 +394,7 @@
rule.runOnIdle {
scope.launch {
assertFailsWith<IllegalArgumentException> {
- mockPaneExpansionState.animateTo(PaneExpansionAnchor.Offset(10.dp))
+ mockPaneExpansionState.animateTo(PaneExpansionAnchor.Offset.fromStart(10.dp))
}
}
}
@@ -411,7 +411,7 @@
private val MockPaneExpansionAnchors =
listOf(
PaneExpansionAnchor.Proportion(0f),
- PaneExpansionAnchor.Offset(MockPaneExpansionMiddleAnchor),
+ PaneExpansionAnchor.Offset.fromStart(MockPaneExpansionMiddleAnchor),
PaneExpansionAnchor.Proportion(1f),
)
diff --git a/compose/material3/adaptive/adaptive-layout/src/androidMain/kotlin/androidx/compose/material3/adaptive/layout/Strings.android.kt b/compose/material3/adaptive/adaptive-layout/src/androidMain/kotlin/androidx/compose/material3/adaptive/layout/Strings.android.kt
index a563fe9..5bab1c8 100644
--- a/compose/material3/adaptive/adaptive-layout/src/androidMain/kotlin/androidx/compose/material3/adaptive/layout/Strings.android.kt
+++ b/compose/material3/adaptive/adaptive-layout/src/androidMain/kotlin/androidx/compose/material3/adaptive/layout/Strings.android.kt
@@ -59,7 +59,12 @@
get() =
Strings(R.string.m3_adaptive_default_pane_expansion_proportion_anchor_description)
- actual inline val defaultPaneExpansionOffsetAnchorDescription
- get() = Strings(R.string.m3_adaptive_default_pane_expansion_offset_anchor_description)
+ actual inline val defaultPaneExpansionStartOffsetAnchorDescription
+ get() =
+ Strings(R.string.m3_adaptive_default_pane_expansion_start_offset_anchor_description)
+
+ actual inline val defaultPaneExpansionEndOffsetAnchorDescription
+ get() =
+ Strings(R.string.m3_adaptive_default_pane_expansion_end_offset_anchor_description)
}
}
diff --git a/compose/material3/adaptive/adaptive-layout/src/androidMain/res/values-as/strings.xml b/compose/material3/adaptive/adaptive-layout/src/androidMain/res/values-as/strings.xml
index d550f15..120b08a 100644
--- a/compose/material3/adaptive/adaptive-layout/src/androidMain/res/values-as/strings.xml
+++ b/compose/material3/adaptive/adaptive-layout/src/androidMain/res/values-as/strings.xml
@@ -20,5 +20,4 @@
<string name="m3_adaptive_default_pane_expansion_drag_handle_content_description" msgid="9058489142432490820">"পে’ন সম্প্ৰসাৰণ কৰিবলৈ টনা হেণ্ডেল"</string>
<string name="m3_adaptive_default_pane_expansion_drag_handle_action_description" msgid="9031621431415014327">"পে’নৰ বিভাজন %sলৈ সলনি কৰক"</string>
<string name="m3_adaptive_default_pane_expansion_proportion_anchor_description" msgid="1205294531112795522">"%d শতাংশ"</string>
- <string name="m3_adaptive_default_pane_expansion_offset_anchor_description" msgid="8189074525698747223">"%d DPs"</string>
</resources>
diff --git a/compose/material3/adaptive/adaptive-layout/src/androidMain/res/values-en-rCA/strings.xml b/compose/material3/adaptive/adaptive-layout/src/androidMain/res/values-en-rCA/strings.xml
index 33e0970..c1e08b3 100644
--- a/compose/material3/adaptive/adaptive-layout/src/androidMain/res/values-en-rCA/strings.xml
+++ b/compose/material3/adaptive/adaptive-layout/src/androidMain/res/values-en-rCA/strings.xml
@@ -20,5 +20,4 @@
<string name="m3_adaptive_default_pane_expansion_drag_handle_content_description" msgid="9058489142432490820">"Pane expansion drag handle"</string>
<string name="m3_adaptive_default_pane_expansion_drag_handle_action_description" msgid="9031621431415014327">"Change pane split to %s"</string>
<string name="m3_adaptive_default_pane_expansion_proportion_anchor_description" msgid="1205294531112795522">"%d percent"</string>
- <string name="m3_adaptive_default_pane_expansion_offset_anchor_description" msgid="8189074525698747223">"%d DPs"</string>
</resources>
diff --git a/compose/material3/adaptive/adaptive-layout/src/androidMain/res/values-hi/strings.xml b/compose/material3/adaptive/adaptive-layout/src/androidMain/res/values-hi/strings.xml
index d25df6b..f333cf2 100644
--- a/compose/material3/adaptive/adaptive-layout/src/androidMain/res/values-hi/strings.xml
+++ b/compose/material3/adaptive/adaptive-layout/src/androidMain/res/values-hi/strings.xml
@@ -20,5 +20,4 @@
<string name="m3_adaptive_default_pane_expansion_drag_handle_content_description" msgid="9058489142432490820">"पैनल को बड़ा करने के लिए, खींचकर छोड़ने वाला हैंडल"</string>
<string name="m3_adaptive_default_pane_expansion_drag_handle_action_description" msgid="9031621431415014327">"पैनल स्प्लिट को %s में बदलें"</string>
<string name="m3_adaptive_default_pane_expansion_proportion_anchor_description" msgid="1205294531112795522">"%d प्रतिशत"</string>
- <string name="m3_adaptive_default_pane_expansion_offset_anchor_description" msgid="8189074525698747223">"%d डीपी"</string>
</resources>
diff --git a/compose/material3/adaptive/adaptive-layout/src/androidMain/res/values-ja/strings.xml b/compose/material3/adaptive/adaptive-layout/src/androidMain/res/values-ja/strings.xml
index c287ba9..bfbceb0 100644
--- a/compose/material3/adaptive/adaptive-layout/src/androidMain/res/values-ja/strings.xml
+++ b/compose/material3/adaptive/adaptive-layout/src/androidMain/res/values-ja/strings.xml
@@ -20,5 +20,4 @@
<string name="m3_adaptive_default_pane_expansion_drag_handle_content_description" msgid="9058489142432490820">"ペインの展開のドラッグ ハンドル"</string>
<string name="m3_adaptive_default_pane_expansion_drag_handle_action_description" msgid="9031621431415014327">"ペインの分割を %s に変更"</string>
<string name="m3_adaptive_default_pane_expansion_proportion_anchor_description" msgid="1205294531112795522">"%d パーセント"</string>
- <string name="m3_adaptive_default_pane_expansion_offset_anchor_description" msgid="8189074525698747223">"%d DP"</string>
</resources>
diff --git a/compose/material3/adaptive/adaptive-layout/src/androidMain/res/values-ka/strings.xml b/compose/material3/adaptive/adaptive-layout/src/androidMain/res/values-ka/strings.xml
index d5cbb1b..f9f4e65 100644
--- a/compose/material3/adaptive/adaptive-layout/src/androidMain/res/values-ka/strings.xml
+++ b/compose/material3/adaptive/adaptive-layout/src/androidMain/res/values-ka/strings.xml
@@ -20,5 +20,4 @@
<string name="m3_adaptive_default_pane_expansion_drag_handle_content_description" msgid="9058489142432490820">"არეს გაფართოების სახელური ჩავლებისთვის"</string>
<string name="m3_adaptive_default_pane_expansion_drag_handle_action_description" msgid="9031621431415014327">"არეს გაყოფის შეცვლა %s-ით"</string>
<string name="m3_adaptive_default_pane_expansion_proportion_anchor_description" msgid="1205294531112795522">"%d პროცენტი"</string>
- <string name="m3_adaptive_default_pane_expansion_offset_anchor_description" msgid="8189074525698747223">"%d DPs"</string>
</resources>
diff --git a/compose/material3/adaptive/adaptive-layout/src/androidMain/res/values-ml/strings.xml b/compose/material3/adaptive/adaptive-layout/src/androidMain/res/values-ml/strings.xml
index 0747fcb..2b63179c 100644
--- a/compose/material3/adaptive/adaptive-layout/src/androidMain/res/values-ml/strings.xml
+++ b/compose/material3/adaptive/adaptive-layout/src/androidMain/res/values-ml/strings.xml
@@ -20,5 +20,4 @@
<string name="m3_adaptive_default_pane_expansion_drag_handle_content_description" msgid="9058489142432490820">"പെയിൻ വികസിപ്പിക്കാനായി വലിച്ചിടുന്നതിനുള്ള ഹാൻഡിൽ"</string>
<string name="m3_adaptive_default_pane_expansion_drag_handle_action_description" msgid="9031621431415014327">"പെയിൻ വിഭജനം %s ആയി മാറ്റുക"</string>
<string name="m3_adaptive_default_pane_expansion_proportion_anchor_description" msgid="1205294531112795522">"%d ശതമാനം"</string>
- <string name="m3_adaptive_default_pane_expansion_offset_anchor_description" msgid="8189074525698747223">"%d DP-കൾ"</string>
</resources>
diff --git a/compose/material3/adaptive/adaptive-layout/src/androidMain/res/values-ms/strings.xml b/compose/material3/adaptive/adaptive-layout/src/androidMain/res/values-ms/strings.xml
index 81f4fb8..889db66e 100644
--- a/compose/material3/adaptive/adaptive-layout/src/androidMain/res/values-ms/strings.xml
+++ b/compose/material3/adaptive/adaptive-layout/src/androidMain/res/values-ms/strings.xml
@@ -20,5 +20,4 @@
<string name="m3_adaptive_default_pane_expansion_drag_handle_content_description" msgid="9058489142432490820">"Pemegang seret pengembangan anak tetingkap"</string>
<string name="m3_adaptive_default_pane_expansion_drag_handle_action_description" msgid="9031621431415014327">"Tukar anak tetingkap terpisah kepada %s"</string>
<string name="m3_adaptive_default_pane_expansion_proportion_anchor_description" msgid="1205294531112795522">"%d peratus"</string>
- <string name="m3_adaptive_default_pane_expansion_offset_anchor_description" msgid="8189074525698747223">"%d DP"</string>
</resources>
diff --git a/compose/material3/adaptive/adaptive-layout/src/androidMain/res/values-pl/strings.xml b/compose/material3/adaptive/adaptive-layout/src/androidMain/res/values-pl/strings.xml
index 19a0cd0..ec85843 100644
--- a/compose/material3/adaptive/adaptive-layout/src/androidMain/res/values-pl/strings.xml
+++ b/compose/material3/adaptive/adaptive-layout/src/androidMain/res/values-pl/strings.xml
@@ -20,5 +20,4 @@
<string name="m3_adaptive_default_pane_expansion_drag_handle_content_description" msgid="9058489142432490820">"Uchwyt do przeciągania panelu"</string>
<string name="m3_adaptive_default_pane_expansion_drag_handle_action_description" msgid="9031621431415014327">"Zmień podział panelu na %s"</string>
<string name="m3_adaptive_default_pane_expansion_proportion_anchor_description" msgid="1205294531112795522">"%d procent"</string>
- <string name="m3_adaptive_default_pane_expansion_offset_anchor_description" msgid="8189074525698747223">"%d DP"</string>
</resources>
diff --git a/compose/material3/adaptive/adaptive-layout/src/androidMain/res/values-pt-rPT/strings.xml b/compose/material3/adaptive/adaptive-layout/src/androidMain/res/values-pt-rPT/strings.xml
index 2dae797..115f3c0 100644
--- a/compose/material3/adaptive/adaptive-layout/src/androidMain/res/values-pt-rPT/strings.xml
+++ b/compose/material3/adaptive/adaptive-layout/src/androidMain/res/values-pt-rPT/strings.xml
@@ -20,5 +20,4 @@
<string name="m3_adaptive_default_pane_expansion_drag_handle_content_description" msgid="9058489142432490820">"Indicador para arrastar de expansão do painel"</string>
<string name="m3_adaptive_default_pane_expansion_drag_handle_action_description" msgid="9031621431415014327">"Altere a divisão do painel para %s"</string>
<string name="m3_adaptive_default_pane_expansion_proportion_anchor_description" msgid="1205294531112795522">"%d por cento"</string>
- <string name="m3_adaptive_default_pane_expansion_offset_anchor_description" msgid="8189074525698747223">"%d DPs"</string>
</resources>
diff --git a/compose/material3/adaptive/adaptive-layout/src/androidMain/res/values/strings.xml b/compose/material3/adaptive/adaptive-layout/src/androidMain/res/values/strings.xml
index 38b807f..94e3ffa 100644
--- a/compose/material3/adaptive/adaptive-layout/src/androidMain/res/values/strings.xml
+++ b/compose/material3/adaptive/adaptive-layout/src/androidMain/res/values/strings.xml
@@ -28,7 +28,14 @@
<string name="m3_adaptive_default_pane_expansion_proportion_anchor_description">
%d percent
</string>
- <!-- Spoken description of a pane expansion anchor point based on offset in DPs a user can
- anchor the pane expansion to. -->
- <string name="m3_adaptive_default_pane_expansion_offset_anchor_description">%d DPs</string>
+ <!-- Spoken description of a pane expansion anchor point based on offset from start in DPs a
+ user can anchor the pane expansion to. -->
+ <string name="m3_adaptive_default_pane_expansion_start_offset_anchor_description">
+ %d DPs from start
+ </string>
+ <!-- Spoken description of a pane expansion anchor point based on offset from end in DPs a user
+ can anchor the pane expansion to. -->
+ <string name="m3_adaptive_default_pane_expansion_end_offset_anchor_description">
+ %d DPs from end
+ </string>
</resources>
diff --git a/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/PaneExpansionState.kt b/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/PaneExpansionState.kt
index 226fc29..733dc1f 100644
--- a/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/PaneExpansionState.kt
+++ b/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/PaneExpansionState.kt
@@ -370,13 +370,10 @@
* @param initialVelocity the initial velocity of the animation
*/
suspend fun animateTo(anchor: PaneExpansionAnchor, initialVelocity: Float = 0F) {
- require(Snapshot.withoutReadObservation { anchors.contains(anchor) }) {
- "The provided $anchor is not in the anchor list!"
- }
+ require(anchors.contains(anchor)) { "The provided $anchor is not in the anchor list!" }
currentAnchor = anchor
measuredDensity?.apply {
- val position =
- Snapshot.withoutReadObservation { anchor.positionIn(maxExpansionWidth, this) }
+ val position = anchor.positionIn(maxExpansionWidth, this)
animateToInternal(position, initialVelocity)
}
}
@@ -405,11 +402,11 @@
anchors.toPositions(
// When maxExpansionWidth is updated, the anchor positions will be
// recalculated.
- Snapshot.withoutReadObservation { maxExpansionWidth },
+ maxExpansionWidth,
it
)
}
- if (!anchors.contains(Snapshot.withoutReadObservation { currentAnchor })) {
+ if (!anchors.contains(currentAnchor)) {
currentAnchor = null
}
this.anchoringAnimationSpec = anchoringAnimationSpec
@@ -591,7 +588,10 @@
* [PaneExpansionAnchor] implementation that specifies the anchor position in the proportion of
* the total size of the layout at the start side of the anchor.
*
- * @property proportion the proportion of the layout at the start side of the anchor. layout.
+ * @param proportion the proportion of the layout at the start side of the anchor. For example,
+ * if the current layout from the start to the end is list-detail, when the proportion value
+ * is 0.3 and this anchor is used, the list pane will occupy 30% of the layout and the detail
+ * pane will occupy 70% of it.
*/
class Proportion(@FloatRange(0.0, 1.0) val proportion: Float) : PaneExpansionAnchor() {
override val type = ProportionType
@@ -619,40 +619,107 @@
}
/**
- * [PaneExpansionAnchor] implementation that specifies the anchor position in the offset in
- * [Dp]. If a positive value is provided, the offset will be treated as a start offset, on the
- * other hand, if a negative value is provided, the absolute value of the provided offset will
- * be used as an end offset. For example, if -150.dp is provided, the resulted anchor will be at
- * the position that is 150dp away from the end side of the associated layout.
+ * [PaneExpansionAnchor] implementation that specifies the anchor position based on the offset
+ * in [Dp].
*
* @property offset the offset of the anchor in [Dp].
*/
- class Offset(val offset: Dp) : PaneExpansionAnchor() {
- override val type = OffsetType
-
- override val description
- @Composable
- get() =
- getString(Strings.defaultPaneExpansionOffsetAnchorDescription, offset.value.toInt())
-
- override fun positionIn(totalSizePx: Int, density: Density) =
- with(density) { offset.roundToPx() }.let { if (it < 0) totalSizePx + it else it }
+ abstract class Offset internal constructor(val offset: Dp, override internal val type: Int) :
+ PaneExpansionAnchor() {
+ /**
+ * Indicates the direction of the offset.
+ *
+ * @see Direction.FromStart
+ * @see Direction.FromEnd
+ */
+ val direction: Direction = Direction(type)
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (other !is Offset) return false
- return offset == other.offset
+ return offset == other.offset && direction == other.direction
}
override fun hashCode(): Int {
- return offset.hashCode()
+ return offset.hashCode() * 31 + direction.hashCode()
+ }
+
+ /** Represents the direction from where the offset will be calculated. */
+ @JvmInline
+ value class Direction internal constructor(internal val value: Int) {
+ companion object {
+ /**
+ * Indicates the offset will be calculated from the start. For example, if the
+ * offset is 150.dp, the resulted anchor will be at the position that is 150dp away
+ * from the start side of the associated layout.
+ */
+ val FromStart = Direction(OffsetFromStartType)
+
+ /**
+ * Indicates the offset will be calculated from the end. For example, if the offset
+ * is 150.dp, the resulted anchor will be at the position that is 150dp away from
+ * the end side of the associated layout.
+ */
+ val FromEnd = Direction(OffsetFromEndType)
+ }
+ }
+
+ private class StartOffset(offset: Dp) : Offset(offset, OffsetFromStartType) {
+ override val description
+ @Composable
+ get() =
+ getString(
+ Strings.defaultPaneExpansionStartOffsetAnchorDescription,
+ offset.value.toInt()
+ )
+
+ override fun positionIn(totalSizePx: Int, density: Density) =
+ with(density) { offset.roundToPx() }
+ }
+
+ private class EndOffset(offset: Dp) : Offset(offset, OffsetFromEndType) {
+ override val description
+ @Composable
+ get() =
+ getString(
+ Strings.defaultPaneExpansionEndOffsetAnchorDescription,
+ offset.value.toInt()
+ )
+
+ override fun positionIn(totalSizePx: Int, density: Density) =
+ totalSizePx - with(density) { offset.roundToPx() }
+ }
+
+ companion object {
+ /**
+ * Create an [androidx.compose.material3.adaptive.layout.PaneExpansionAnchor.Offset]
+ * anchor from the start side of the layout.
+ *
+ * @param offset offset to be used in [Dp].
+ */
+ fun fromStart(offset: Dp): Offset {
+ require(offset >= 0.dp) { "Offset must larger than or equal to 0 dp." }
+ return StartOffset(offset)
+ }
+
+ /**
+ * Create an [androidx.compose.material3.adaptive.layout.PaneExpansionAnchor.Offset]
+ * anchor from the end side of the layout.
+ *
+ * @param offset offset to be used in [Dp].
+ */
+ fun fromEnd(offset: Dp): Offset {
+ require(offset >= 0.dp) { "Offset must larger than or equal to 0 dp." }
+ return EndOffset(offset)
+ }
}
}
internal companion object {
internal const val UnspecifiedType = 0
internal const val ProportionType = 1
- internal const val OffsetType = 2
+ internal const val OffsetFromStartType = 2
+ internal const val OffsetFromEndType = 3
}
}
@@ -728,8 +795,10 @@
when (currentAnchorType) {
PaneExpansionAnchor.ProportionType ->
PaneExpansionAnchor.Proportion(it[6] as Float)
- PaneExpansionAnchor.OffsetType ->
- PaneExpansionAnchor.Offset((it[6] as Float).dp)
+ PaneExpansionAnchor.OffsetFromStartType ->
+ PaneExpansionAnchor.Offset.fromStart((it[6] as Float).dp)
+ PaneExpansionAnchor.OffsetFromEndType ->
+ PaneExpansionAnchor.Offset.fromEnd((it[6] as Float).dp)
else -> null
}
object : Map.Entry<PaneExpansionStateKey, PaneExpansionStateData> {
diff --git a/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/Strings.kt b/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/Strings.kt
index 4ff2966..e11af66 100644
--- a/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/Strings.kt
+++ b/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/Strings.kt
@@ -27,7 +27,8 @@
val defaultPaneExpansionDragHandleContentDescription: Strings
val defaultPaneExpansionDragHandleActionDescription: Strings
val defaultPaneExpansionProportionAnchorDescription: Strings
- val defaultPaneExpansionOffsetAnchorDescription: Strings
+ val defaultPaneExpansionStartOffsetAnchorDescription: Strings
+ val defaultPaneExpansionEndOffsetAnchorDescription: Strings
}
}
diff --git a/compose/material3/adaptive/adaptive-layout/src/jvmStubsMain/kotlin/androidx/compose/material3/adaptive/layout/Strings.jvmStubs.kt b/compose/material3/adaptive/adaptive-layout/src/jvmStubsMain/kotlin/androidx/compose/material3/adaptive/layout/Strings.jvmStubs.kt
index a419136..11184b6 100644
--- a/compose/material3/adaptive/adaptive-layout/src/jvmStubsMain/kotlin/androidx/compose/material3/adaptive/layout/Strings.jvmStubs.kt
+++ b/compose/material3/adaptive/adaptive-layout/src/jvmStubsMain/kotlin/androidx/compose/material3/adaptive/layout/Strings.jvmStubs.kt
@@ -39,7 +39,9 @@
implementedInJetBrainsFork()
actual val defaultPaneExpansionProportionAnchorDescription: Strings =
implementedInJetBrainsFork()
- actual val defaultPaneExpansionOffsetAnchorDescription: Strings =
+ actual val defaultPaneExpansionStartOffsetAnchorDescription: Strings =
+ implementedInJetBrainsFork()
+ actual val defaultPaneExpansionEndOffsetAnchorDescription: Strings =
implementedInJetBrainsFork()
}
}
diff --git a/compose/material3/adaptive/samples/src/main/java/androidx/compose/material3/adaptive/samples/ThreePaneScaffoldSample.kt b/compose/material3/adaptive/samples/src/main/java/androidx/compose/material3/adaptive/samples/ThreePaneScaffoldSample.kt
index 798e57e..5181bf1 100644
--- a/compose/material3/adaptive/samples/src/main/java/androidx/compose/material3/adaptive/samples/ThreePaneScaffoldSample.kt
+++ b/compose/material3/adaptive/samples/src/main/java/androidx/compose/material3/adaptive/samples/ThreePaneScaffoldSample.kt
@@ -438,8 +438,8 @@
private val PaneExpansionAnchors =
listOf(
PaneExpansionAnchor.Proportion(0f),
- PaneExpansionAnchor.Proportion(0.25f),
+ PaneExpansionAnchor.Offset.fromStart(360.dp),
PaneExpansionAnchor.Proportion(0.5f),
- PaneExpansionAnchor.Proportion(0.75f),
+ PaneExpansionAnchor.Offset.fromEnd(360.dp),
PaneExpansionAnchor.Proportion(1f),
)
diff --git a/lifecycle/lifecycle-viewmodel-navigation3/api/current.txt b/lifecycle/lifecycle-viewmodel-navigation3/api/current.txt
index b6bdb70..cdddc41 100644
--- a/lifecycle/lifecycle-viewmodel-navigation3/api/current.txt
+++ b/lifecycle/lifecycle-viewmodel-navigation3/api/current.txt
@@ -1,10 +1,10 @@
// Signature format: 4.0
package androidx.lifecycle.viewmodel.navigation3 {
- public final class ViewModelStoreNavContentWrapper implements androidx.navigation3.NavContentWrapper {
- method @androidx.compose.runtime.Composable public void WrapBackStack(java.util.List<?> backStack);
- method @androidx.compose.runtime.Composable public <T> void WrapContent(androidx.navigation3.NavRecord<T> record);
- field public static final androidx.lifecycle.viewmodel.navigation3.ViewModelStoreNavContentWrapper INSTANCE;
+ public final class ViewModelStoreNavLocalProvider implements androidx.navigation3.NavLocalProvider {
+ method @androidx.compose.runtime.Composable public void ProvideToBackStack(java.util.List<?> backStack);
+ method @androidx.compose.runtime.Composable public <T> void ProvideToRecord(androidx.navigation3.NavRecord<T> record);
+ field public static final androidx.lifecycle.viewmodel.navigation3.ViewModelStoreNavLocalProvider INSTANCE;
}
}
diff --git a/lifecycle/lifecycle-viewmodel-navigation3/api/restricted_current.txt b/lifecycle/lifecycle-viewmodel-navigation3/api/restricted_current.txt
index b6bdb70..cdddc41 100644
--- a/lifecycle/lifecycle-viewmodel-navigation3/api/restricted_current.txt
+++ b/lifecycle/lifecycle-viewmodel-navigation3/api/restricted_current.txt
@@ -1,10 +1,10 @@
// Signature format: 4.0
package androidx.lifecycle.viewmodel.navigation3 {
- public final class ViewModelStoreNavContentWrapper implements androidx.navigation3.NavContentWrapper {
- method @androidx.compose.runtime.Composable public void WrapBackStack(java.util.List<?> backStack);
- method @androidx.compose.runtime.Composable public <T> void WrapContent(androidx.navigation3.NavRecord<T> record);
- field public static final androidx.lifecycle.viewmodel.navigation3.ViewModelStoreNavContentWrapper INSTANCE;
+ public final class ViewModelStoreNavLocalProvider implements androidx.navigation3.NavLocalProvider {
+ method @androidx.compose.runtime.Composable public void ProvideToBackStack(java.util.List<?> backStack);
+ method @androidx.compose.runtime.Composable public <T> void ProvideToRecord(androidx.navigation3.NavRecord<T> record);
+ field public static final androidx.lifecycle.viewmodel.navigation3.ViewModelStoreNavLocalProvider INSTANCE;
}
}
diff --git a/lifecycle/lifecycle-viewmodel-navigation3/src/androidInstrumentedTest/kotlin/androidx/lifecycle/viewmodel/navigation3/ViewModelStoreNavContentWrapperTest.kt b/lifecycle/lifecycle-viewmodel-navigation3/src/androidInstrumentedTest/kotlin/androidx/lifecycle/viewmodel/navigation3/ViewModelStoreNavContentWrapperTest.kt
index f0efd6c..702fd5e 100644
--- a/lifecycle/lifecycle-viewmodel-navigation3/src/androidInstrumentedTest/kotlin/androidx/lifecycle/viewmodel/navigation3/ViewModelStoreNavContentWrapperTest.kt
+++ b/lifecycle/lifecycle-viewmodel-navigation3/src/androidInstrumentedTest/kotlin/androidx/lifecycle/viewmodel/navigation3/ViewModelStoreNavContentWrapperTest.kt
@@ -27,8 +27,7 @@
import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation3.NavDisplay
import androidx.navigation3.NavRecord
-import androidx.navigation3.SavedStateNavContentWrapper
-import androidx.navigation3.rememberNavWrapperManager
+import androidx.navigation3.SavedStateNavLocalProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
import kotlin.test.Test
@@ -37,13 +36,13 @@
@LargeTest
@RunWith(AndroidJUnit4::class)
-class ViewModelStoreNavContentWrapperTest {
+class ViewModelStoreNavLocalProviderTest {
@get:Rule val composeTestRule = createComposeRule()
@Test
fun testViewModelProvided() {
- val savedStateWrapper = SavedStateNavContentWrapper
- val viewModelWrapper = ViewModelStoreNavContentWrapper
+ val savedStateWrapper = SavedStateNavLocalProvider
+ val viewModelWrapper = ViewModelStoreNavLocalProvider
lateinit var viewModel1: MyViewModel
lateinit var viewModel2: MyViewModel
val record1Arg = "record1 Arg"
@@ -59,11 +58,11 @@
viewModel2.myArg = record2Arg
}
composeTestRule.setContent {
- savedStateWrapper.WrapContent(
- NavRecord(record1.key) { viewModelWrapper.WrapContent(record1) }
+ savedStateWrapper.ProvideToRecord(
+ NavRecord(record1.key) { viewModelWrapper.ProvideToRecord(record1) }
)
- savedStateWrapper.WrapContent(
- NavRecord(record2.key) { viewModelWrapper.WrapContent(record2) }
+ savedStateWrapper.ProvideToRecord(
+ NavRecord(record2.key) { viewModelWrapper.ProvideToRecord(record2) }
)
}
@@ -78,8 +77,8 @@
}
@Test
- fun testViewModelNoSavedStateNavContentWrapper() {
- val viewModelWrapper = ViewModelStoreNavContentWrapper
+ fun testViewModelNoSavedStateNavLocalProvider() {
+ val viewModelWrapper = ViewModelStoreNavLocalProvider
lateinit var viewModel1: MyViewModel
val record1Arg = "record1 Arg"
val record1 =
@@ -88,14 +87,14 @@
viewModel1.myArg = record1Arg
}
try {
- composeTestRule.setContent { viewModelWrapper.WrapContent(record1) }
+ composeTestRule.setContent { viewModelWrapper.ProvideToRecord(record1) }
} catch (e: Exception) {
assertThat(e)
.hasMessageThat()
.isEqualTo(
"The Lifecycle state is already beyond INITIALIZED. The " +
- "ViewModelStoreNavContentWrapper requires adding the " +
- "SavedStateNavContentWrapper to ensure support for " +
+ "ViewModelStoreNavLocalProvider requires adding the " +
+ "SavedStateNavLocalProvider to ensure support for " +
"SavedStateHandles."
)
}
@@ -106,13 +105,9 @@
lateinit var backStack: MutableList<Any>
composeTestRule.setContent {
backStack = remember { mutableStateListOf("Home") }
- val manager =
- rememberNavWrapperManager(
- listOf(SavedStateNavContentWrapper, ViewModelStoreNavContentWrapper)
- )
NavDisplay(
backstack = backStack,
- wrapperManager = manager,
+ localProviders = listOf(SavedStateNavLocalProvider, ViewModelStoreNavLocalProvider),
onBack = { backStack.removeAt(backStack.lastIndex) },
) { key ->
when (key) {
@@ -160,13 +155,9 @@
lateinit var viewModel: SavedStateViewModel
composeTestRule.setContent {
backStack = remember { mutableStateListOf("Home") }
- val manager =
- rememberNavWrapperManager(
- listOf(SavedStateNavContentWrapper, ViewModelStoreNavContentWrapper)
- )
NavDisplay(
backstack = backStack,
- wrapperManager = manager,
+ localProviders = listOf(SavedStateNavLocalProvider, ViewModelStoreNavLocalProvider),
onBack = { backStack.removeAt(backStack.lastIndex) },
) { key ->
when (key) {
diff --git a/lifecycle/lifecycle-viewmodel-navigation3/src/androidMain/kotlin/androidx/lifecycle/viewmodel/navigation3/ViewModelStoreNavContentWrapper.android.kt b/lifecycle/lifecycle-viewmodel-navigation3/src/androidMain/kotlin/androidx/lifecycle/viewmodel/navigation3/ViewModelStoreNavContentWrapper.android.kt
index 79402711..95d9e3d 100644
--- a/lifecycle/lifecycle-viewmodel-navigation3/src/androidMain/kotlin/androidx/lifecycle/viewmodel/navigation3/ViewModelStoreNavContentWrapper.android.kt
+++ b/lifecycle/lifecycle-viewmodel-navigation3/src/androidMain/kotlin/androidx/lifecycle/viewmodel/navigation3/ViewModelStoreNavContentWrapper.android.kt
@@ -35,7 +35,7 @@
import androidx.lifecycle.viewmodel.MutableCreationExtras
import androidx.lifecycle.viewmodel.compose.LocalViewModelStoreOwner
import androidx.lifecycle.viewmodel.compose.viewModel
-import androidx.navigation3.NavContentWrapper
+import androidx.navigation3.NavLocalProvider
import androidx.navigation3.NavRecord
import androidx.savedstate.SavedStateRegistryOwner
import androidx.savedstate.compose.LocalSavedStateRegistryOwner
@@ -44,20 +44,20 @@
* Provides the content of a [NavRecord] with a [ViewModelStoreOwner] and provides that
* [ViewModelStoreOwner] as a [LocalViewModelStoreOwner] so that it is available within the content.
*
- * This requires that usage of the [SavedStateNavContentWrapper] to ensure that the [NavRecord]
+ * This requires that usage of the [SavedStateNavLocalProvider] to ensure that the [NavRecord]
* scoped [ViewModel]s can properly provide access to [SavedStateHandle]s
*/
-public object ViewModelStoreNavContentWrapper : NavContentWrapper {
+public object ViewModelStoreNavLocalProvider : NavLocalProvider {
@Composable
- override fun WrapBackStack(backStack: List<Any>) {
+ override fun ProvideToBackStack(backStack: List<Any>) {
val recordViewModelStoreProvider = viewModel { RecordViewModel() }
recordViewModelStoreProvider.ownerInBackStack.clear()
recordViewModelStoreProvider.ownerInBackStack.addAll(backStack)
}
@Composable
- override fun <T : Any> WrapContent(record: NavRecord<T>) {
+ override fun <T : Any> ProvideToRecord(record: NavRecord<T>) {
val key = record.key
val recordViewModelStoreProvider = viewModel { RecordViewModel() }
val viewModelStore = recordViewModelStoreProvider.viewModelStoreForKey(key)
@@ -110,8 +110,8 @@
init {
require(this.lifecycle.currentState == Lifecycle.State.INITIALIZED) {
"The Lifecycle state is already beyond INITIALIZED. The " +
- "ViewModelStoreNavContentWrapper requires adding the " +
- "SavedStateNavContentWrapper to ensure support for " +
+ "ViewModelStoreNavLocalProvider requires adding the " +
+ "SavedStateNavLocalProvider to ensure support for " +
"SavedStateHandles."
}
enableSavedStateHandles()
diff --git a/navigation3/navigation3/api/current.txt b/navigation3/navigation3/api/current.txt
index ec7e433..1c23099 100644
--- a/navigation3/navigation3/api/current.txt
+++ b/navigation3/navigation3/api/current.txt
@@ -1,11 +1,6 @@
// Signature format: 4.0
package androidx.navigation3 {
- public interface NavContentWrapper {
- method @androidx.compose.runtime.Composable public default void WrapBackStack(java.util.List<?> backStack);
- method @androidx.compose.runtime.Composable public <T> void WrapContent(androidx.navigation3.NavRecord<T> record);
- }
-
public final class NavDisplay {
method public java.util.Map<java.lang.String,java.lang.Object> isDialog(boolean boolean);
method public java.util.Map<java.lang.String,java.lang.Object> transition(androidx.compose.animation.EnterTransition? enter, androidx.compose.animation.ExitTransition? exit);
@@ -13,7 +8,12 @@
}
public final class NavDisplay_androidKt {
- method @androidx.compose.runtime.Composable public static <T> void NavDisplay(java.util.List<? extends T> backstack, optional androidx.compose.ui.Modifier modifier, optional androidx.navigation3.NavWrapperManager wrapperManager, optional androidx.compose.ui.Alignment contentAlignment, optional androidx.compose.animation.SizeTransform? sizeTransform, optional androidx.compose.animation.EnterTransition enterTransition, optional androidx.compose.animation.ExitTransition exitTransition, optional kotlin.jvm.functions.Function0<kotlin.Unit> onBack, kotlin.jvm.functions.Function1<? super T,? extends androidx.navigation3.NavRecord<? extends T>> recordProvider);
+ method @androidx.compose.runtime.Composable public static <T> void NavDisplay(java.util.List<? extends T> backstack, optional androidx.compose.ui.Modifier modifier, optional java.util.List<? extends androidx.navigation3.NavLocalProvider> localProviders, optional androidx.compose.ui.Alignment contentAlignment, optional androidx.compose.animation.SizeTransform? sizeTransform, optional androidx.compose.animation.EnterTransition enterTransition, optional androidx.compose.animation.ExitTransition exitTransition, optional kotlin.jvm.functions.Function0<kotlin.Unit> onBack, kotlin.jvm.functions.Function1<? super T,? extends androidx.navigation3.NavRecord<? extends T>> recordProvider);
+ }
+
+ public interface NavLocalProvider {
+ method @androidx.compose.runtime.Composable public default void ProvideToBackStack(java.util.List<?> backStack);
+ method @androidx.compose.runtime.Composable public <T> void ProvideToRecord(androidx.navigation3.NavRecord<T> record);
}
public final class NavRecord<T> {
@@ -28,13 +28,13 @@
public final class NavWrapperManager {
ctor public NavWrapperManager();
- ctor public NavWrapperManager(optional java.util.List<? extends androidx.navigation3.NavContentWrapper> navContentWrappers);
+ ctor public NavWrapperManager(optional java.util.List<? extends androidx.navigation3.NavLocalProvider> navLocalProviders);
method @androidx.compose.runtime.Composable public <T> void ContentForRecord(androidx.navigation3.NavRecord<T> record);
method @androidx.compose.runtime.Composable public void PrepareBackStack(java.util.List<?> backStack);
}
public final class NavWrapperManagerKt {
- method @androidx.compose.runtime.Composable public static androidx.navigation3.NavWrapperManager rememberNavWrapperManager(java.util.List<? extends androidx.navigation3.NavContentWrapper> navContentWrappers);
+ method @androidx.compose.runtime.Composable public static androidx.navigation3.NavWrapperManager rememberNavWrapperManager(java.util.List<? extends androidx.navigation3.NavLocalProvider> navLocalProviders);
}
public final class RecordClassProvider<T> {
@@ -81,14 +81,14 @@
method public static inline kotlin.jvm.functions.Function1<java.lang.Object,androidx.navigation3.NavRecord<? extends java.lang.Object?>> recordProvider(optional kotlin.jvm.functions.Function1<java.lang.Object,? extends androidx.navigation3.NavRecord<? extends java.lang.Object?>> fallback, kotlin.jvm.functions.Function1<? super androidx.navigation3.RecordProviderBuilder,kotlin.Unit> builder);
}
- public final class SaveableStateNavContentWrapper implements androidx.navigation3.NavContentWrapper {
- ctor public SaveableStateNavContentWrapper();
- method @androidx.compose.runtime.Composable public <T> void WrapContent(androidx.navigation3.NavRecord<T> record);
+ public final class SaveableStateNavLocalProvider implements androidx.navigation3.NavLocalProvider {
+ ctor public SaveableStateNavLocalProvider();
+ method @androidx.compose.runtime.Composable public <T> void ProvideToRecord(androidx.navigation3.NavRecord<T> record);
}
- public final class SavedStateNavContentWrapper implements androidx.navigation3.NavContentWrapper {
- method @androidx.compose.runtime.Composable public <T> void WrapContent(androidx.navigation3.NavRecord<T> record);
- field public static final androidx.navigation3.SavedStateNavContentWrapper INSTANCE;
+ public final class SavedStateNavLocalProvider implements androidx.navigation3.NavLocalProvider {
+ method @androidx.compose.runtime.Composable public <T> void ProvideToRecord(androidx.navigation3.NavRecord<T> record);
+ field public static final androidx.navigation3.SavedStateNavLocalProvider INSTANCE;
}
}
diff --git a/navigation3/navigation3/api/restricted_current.txt b/navigation3/navigation3/api/restricted_current.txt
index ec7e433..1c23099 100644
--- a/navigation3/navigation3/api/restricted_current.txt
+++ b/navigation3/navigation3/api/restricted_current.txt
@@ -1,11 +1,6 @@
// Signature format: 4.0
package androidx.navigation3 {
- public interface NavContentWrapper {
- method @androidx.compose.runtime.Composable public default void WrapBackStack(java.util.List<?> backStack);
- method @androidx.compose.runtime.Composable public <T> void WrapContent(androidx.navigation3.NavRecord<T> record);
- }
-
public final class NavDisplay {
method public java.util.Map<java.lang.String,java.lang.Object> isDialog(boolean boolean);
method public java.util.Map<java.lang.String,java.lang.Object> transition(androidx.compose.animation.EnterTransition? enter, androidx.compose.animation.ExitTransition? exit);
@@ -13,7 +8,12 @@
}
public final class NavDisplay_androidKt {
- method @androidx.compose.runtime.Composable public static <T> void NavDisplay(java.util.List<? extends T> backstack, optional androidx.compose.ui.Modifier modifier, optional androidx.navigation3.NavWrapperManager wrapperManager, optional androidx.compose.ui.Alignment contentAlignment, optional androidx.compose.animation.SizeTransform? sizeTransform, optional androidx.compose.animation.EnterTransition enterTransition, optional androidx.compose.animation.ExitTransition exitTransition, optional kotlin.jvm.functions.Function0<kotlin.Unit> onBack, kotlin.jvm.functions.Function1<? super T,? extends androidx.navigation3.NavRecord<? extends T>> recordProvider);
+ method @androidx.compose.runtime.Composable public static <T> void NavDisplay(java.util.List<? extends T> backstack, optional androidx.compose.ui.Modifier modifier, optional java.util.List<? extends androidx.navigation3.NavLocalProvider> localProviders, optional androidx.compose.ui.Alignment contentAlignment, optional androidx.compose.animation.SizeTransform? sizeTransform, optional androidx.compose.animation.EnterTransition enterTransition, optional androidx.compose.animation.ExitTransition exitTransition, optional kotlin.jvm.functions.Function0<kotlin.Unit> onBack, kotlin.jvm.functions.Function1<? super T,? extends androidx.navigation3.NavRecord<? extends T>> recordProvider);
+ }
+
+ public interface NavLocalProvider {
+ method @androidx.compose.runtime.Composable public default void ProvideToBackStack(java.util.List<?> backStack);
+ method @androidx.compose.runtime.Composable public <T> void ProvideToRecord(androidx.navigation3.NavRecord<T> record);
}
public final class NavRecord<T> {
@@ -28,13 +28,13 @@
public final class NavWrapperManager {
ctor public NavWrapperManager();
- ctor public NavWrapperManager(optional java.util.List<? extends androidx.navigation3.NavContentWrapper> navContentWrappers);
+ ctor public NavWrapperManager(optional java.util.List<? extends androidx.navigation3.NavLocalProvider> navLocalProviders);
method @androidx.compose.runtime.Composable public <T> void ContentForRecord(androidx.navigation3.NavRecord<T> record);
method @androidx.compose.runtime.Composable public void PrepareBackStack(java.util.List<?> backStack);
}
public final class NavWrapperManagerKt {
- method @androidx.compose.runtime.Composable public static androidx.navigation3.NavWrapperManager rememberNavWrapperManager(java.util.List<? extends androidx.navigation3.NavContentWrapper> navContentWrappers);
+ method @androidx.compose.runtime.Composable public static androidx.navigation3.NavWrapperManager rememberNavWrapperManager(java.util.List<? extends androidx.navigation3.NavLocalProvider> navLocalProviders);
}
public final class RecordClassProvider<T> {
@@ -81,14 +81,14 @@
method public static inline kotlin.jvm.functions.Function1<java.lang.Object,androidx.navigation3.NavRecord<? extends java.lang.Object?>> recordProvider(optional kotlin.jvm.functions.Function1<java.lang.Object,? extends androidx.navigation3.NavRecord<? extends java.lang.Object?>> fallback, kotlin.jvm.functions.Function1<? super androidx.navigation3.RecordProviderBuilder,kotlin.Unit> builder);
}
- public final class SaveableStateNavContentWrapper implements androidx.navigation3.NavContentWrapper {
- ctor public SaveableStateNavContentWrapper();
- method @androidx.compose.runtime.Composable public <T> void WrapContent(androidx.navigation3.NavRecord<T> record);
+ public final class SaveableStateNavLocalProvider implements androidx.navigation3.NavLocalProvider {
+ ctor public SaveableStateNavLocalProvider();
+ method @androidx.compose.runtime.Composable public <T> void ProvideToRecord(androidx.navigation3.NavRecord<T> record);
}
- public final class SavedStateNavContentWrapper implements androidx.navigation3.NavContentWrapper {
- method @androidx.compose.runtime.Composable public <T> void WrapContent(androidx.navigation3.NavRecord<T> record);
- field public static final androidx.navigation3.SavedStateNavContentWrapper INSTANCE;
+ public final class SavedStateNavLocalProvider implements androidx.navigation3.NavLocalProvider {
+ method @androidx.compose.runtime.Composable public <T> void ProvideToRecord(androidx.navigation3.NavRecord<T> record);
+ field public static final androidx.navigation3.SavedStateNavLocalProvider INSTANCE;
}
}
diff --git a/navigation3/navigation3/samples/src/main/kotlin/androidx/navigation3/samples/NavDisplaySamples.kt b/navigation3/navigation3/samples/src/main/kotlin/androidx/navigation3/samples/NavDisplaySamples.kt
index fa6ff47..3ed2eae 100644
--- a/navigation3/navigation3/samples/src/main/kotlin/androidx/navigation3/samples/NavDisplaySamples.kt
+++ b/navigation3/navigation3/samples/src/main/kotlin/androidx/navigation3/samples/NavDisplaySamples.kt
@@ -23,13 +23,12 @@
import androidx.compose.runtime.Composable
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewmodel.compose.viewModel
-import androidx.lifecycle.viewmodel.navigation3.ViewModelStoreNavContentWrapper
+import androidx.lifecycle.viewmodel.navigation3.ViewModelStoreNavLocalProvider
import androidx.navigation3.NavDisplay
import androidx.navigation3.NavRecord
-import androidx.navigation3.SavedStateNavContentWrapper
+import androidx.navigation3.SavedStateNavLocalProvider
import androidx.navigation3.record
import androidx.navigation3.recordProvider
-import androidx.navigation3.rememberNavWrapperManager
class ProfileViewModel : ViewModel() {
val name = "no user"
@@ -39,13 +38,9 @@
@Composable
fun BaseNav() {
val backStack = rememberMutableStateListOf(Profile)
- val manager =
- rememberNavWrapperManager(
- listOf(SavedStateNavContentWrapper, ViewModelStoreNavContentWrapper)
- )
NavDisplay(
backstack = backStack,
- wrapperManager = manager,
+ localProviders = listOf(SavedStateNavLocalProvider, ViewModelStoreNavLocalProvider),
onBack = { backStack.removeLast() },
recordProvider =
recordProvider({ NavRecord(Unit) { Text(text = "Invalid Key") } }) {
diff --git a/navigation3/navigation3/src/androidInstrumentedTest/kotlin/androidx/navigation3/NavDisplayTest.kt b/navigation3/navigation3/src/androidInstrumentedTest/kotlin/androidx/navigation3/NavDisplayTest.kt
index 5f25005..ef2c495 100644
--- a/navigation3/navigation3/src/androidInstrumentedTest/kotlin/androidx/navigation3/NavDisplayTest.kt
+++ b/navigation3/navigation3/src/androidInstrumentedTest/kotlin/androidx/navigation3/NavDisplayTest.kt
@@ -163,8 +163,7 @@
composeTestRule.setContent {
mainRegistry = LocalSavedStateRegistryOwner.current.savedStateRegistry
backstack = remember { mutableStateListOf(first) }
- val manager = rememberNavWrapperManager(listOf(SavedStateNavContentWrapper))
- NavDisplay(backstack = backstack, wrapperManager = manager) {
+ NavDisplay(backstack = backstack, localProviders = listOf(SavedStateNavLocalProvider)) {
when (it) {
first ->
NavRecord(first) {
diff --git a/navigation3/navigation3/src/androidInstrumentedTest/kotlin/androidx/navigation3/NavWrapperManagerTest.kt b/navigation3/navigation3/src/androidInstrumentedTest/kotlin/androidx/navigation3/NavWrapperManagerTest.kt
index be41543..4481373 100644
--- a/navigation3/navigation3/src/androidInstrumentedTest/kotlin/androidx/navigation3/NavWrapperManagerTest.kt
+++ b/navigation3/navigation3/src/androidInstrumentedTest/kotlin/androidx/navigation3/NavWrapperManagerTest.kt
@@ -35,14 +35,14 @@
var calledWrapBackStack = false
var calledWrapContent = false
val wrapper =
- object : NavContentWrapper {
+ object : NavLocalProvider {
@Composable
- override fun WrapBackStack(backStack: List<Any>) {
+ override fun ProvideToBackStack(backStack: List<Any>) {
calledWrapBackStack = true
}
@Composable
- override fun <T : Any> WrapContent(record: NavRecord<T>) {
+ override fun <T : Any> ProvideToRecord(record: NavRecord<T>) {
calledWrapContent = true
}
}
@@ -63,14 +63,14 @@
var calledWrapBackStackCount = 0
var calledWrapContentCount = 0
val wrapper =
- object : NavContentWrapper {
+ object : NavLocalProvider {
@Composable
- override fun WrapBackStack(backStack: List<Any>) {
+ override fun ProvideToBackStack(backStack: List<Any>) {
calledWrapBackStackCount++
}
@Composable
- override fun <T : Any> WrapContent(record: NavRecord<T>) {
+ override fun <T : Any> ProvideToRecord(record: NavRecord<T>) {
calledWrapContentCount++
}
}
diff --git a/navigation3/navigation3/src/androidMain/kotlin/androidx/navigation3/NavDisplay.android.kt b/navigation3/navigation3/src/androidMain/kotlin/androidx/navigation3/NavDisplay.android.kt
index 37179b2..eb3c91f 100644
--- a/navigation3/navigation3/src/androidMain/kotlin/androidx/navigation3/NavDisplay.android.kt
+++ b/navigation3/navigation3/src/androidMain/kotlin/androidx/navigation3/NavDisplay.android.kt
@@ -64,16 +64,15 @@
* the second to last key is a displayed in the background.
*
* @param backstack the collection of keys that represents the state that needs to be handled
- * @param wrapperManager the manager that combines all of the [NavContentWrapper]s
+ * @param localProviders list of [NavLocalProvider] to add information to the provided records
* @param modifier the modifier to be applied to the layout.
* @param contentAlignment The [Alignment] of the [AnimatedContent]
- * * @param enterTransition Default [EnterTransition] for all [NavRecord]s. Can be overridden
- * * individually for each [NavRecord] by passing in the record's transitions through
- * * [NavRecord.featureMap].
- * * @param exitTransition Default [ExitTransition] for all [NavRecord]s. Can be overridden
- * * individually for each [NavRecord] by passing in the record's transitions through
- * * [NavRecord.featureMap].
- *
+ * @param enterTransition Default [EnterTransition] for all [NavRecord]s. Can be overridden
+ * individually for each [NavRecord] by passing in the record's transitions through
+ * [NavRecord.featureMap].
+ * @param exitTransition Default [ExitTransition] for all [NavRecord]s. Can be overridden
+ * individually for each [NavRecord] by passing in the record's transitions through
+ * [NavRecord.featureMap].
* @param onBack a callback for handling system back presses
* @param recordProvider lambda used to construct each possible [NavRecord]
* @sample androidx.navigation3.samples.BaseNav
@@ -82,7 +81,7 @@
public fun <T : Any> NavDisplay(
backstack: List<T>,
modifier: Modifier = Modifier,
- wrapperManager: NavWrapperManager = rememberNavWrapperManager(emptyList()),
+ localProviders: List<NavLocalProvider> = emptyList(),
contentAlignment: Alignment = Alignment.TopStart,
sizeTransform: SizeTransform? = null,
enterTransition: EnterTransition =
@@ -104,6 +103,7 @@
) {
require(backstack.isNotEmpty()) { "NavDisplay backstack cannot be empty" }
+ val wrapperManager: NavWrapperManager = rememberNavWrapperManager(localProviders)
BackHandler(backstack.size > 1, onBack)
wrapperManager.PrepareBackStack(backStack = backstack)
val key = backstack.last()
diff --git a/navigation3/navigation3/src/commonMain/kotlin/androidx/navigation3/NavContentWrapper.kt b/navigation3/navigation3/src/commonMain/kotlin/androidx/navigation3/NavLocalProvider.kt
similarity index 73%
rename from navigation3/navigation3/src/commonMain/kotlin/androidx/navigation3/NavContentWrapper.kt
rename to navigation3/navigation3/src/commonMain/kotlin/androidx/navigation3/NavLocalProvider.kt
index 42d1652..f8456cd 100644
--- a/navigation3/navigation3/src/commonMain/kotlin/androidx/navigation3/NavContentWrapper.kt
+++ b/navigation3/navigation3/src/commonMain/kotlin/androidx/navigation3/NavLocalProvider.kt
@@ -22,23 +22,23 @@
* Interface that offers the ability to provide information to some Composable content that is
* integrated with a [NavDisplay](reference/androidx/navigation/NavDisplay).
*
- * Information can be provided to the entire back stack via [NavContentWrapper.WrapBackStack] or to
- * a single record via [NavContentWrapper.WrapContent].
+ * Information can be provided to the entire back stack via [NavLocalProvider.ProvideToBackStack] or
+ * to a single record via [NavLocalProvider.ProvideToRecord].
*/
-public interface NavContentWrapper {
+public interface NavLocalProvider {
/**
- * Allows a [NavContentWrapper] to execute on the entire backstack.
+ * Allows a [NavLocalProvider] to provide to the entire backstack.
*
* This function is called by the [NavWrapperManager] and should not be called directly.
*/
- @Composable public fun WrapBackStack(backStack: List<Any>): Unit = Unit
+ @Composable public fun ProvideToBackStack(backStack: List<Any>): Unit = Unit
/**
- * Allows a [NavContentWrapper] to provide information to the content of a single record.
+ * Allows a [NavLocalProvider] to provide information to a single record.
*
* This function is called by the [NavDisplay](reference/androidx/navigation/NavDisplay) and
* should not be called directly.
*/
- @Composable public fun <T : Any> WrapContent(record: NavRecord<T>)
+ @Composable public fun <T : Any> ProvideToRecord(record: NavRecord<T>)
}
diff --git a/navigation3/navigation3/src/commonMain/kotlin/androidx/navigation3/NavWrapperManager.kt b/navigation3/navigation3/src/commonMain/kotlin/androidx/navigation3/NavWrapperManager.kt
index 4a137df..38eb9f8 100644
--- a/navigation3/navigation3/src/commonMain/kotlin/androidx/navigation3/NavWrapperManager.kt
+++ b/navigation3/navigation3/src/commonMain/kotlin/androidx/navigation3/NavWrapperManager.kt
@@ -19,45 +19,43 @@
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
-/** Creates a [NavContentWrapper]. */
+/** Creates a [NavLocalProvider]. */
@Composable
-public fun rememberNavWrapperManager(
- navContentWrappers: List<NavContentWrapper>
-): NavWrapperManager {
- return remember { NavWrapperManager(navContentWrappers) }
+public fun rememberNavWrapperManager(navLocalProviders: List<NavLocalProvider>): NavWrapperManager {
+ return remember { NavWrapperManager(navLocalProviders) }
}
/**
- * Class that manages all of the provided [NavContentWrapper]. It is responsible for executing the
- * functions provided by each [NavContentWrapper] appropriately.
+ * Class that manages all of the provided [NavLocalProvider]. It is responsible for executing the
+ * functions provided by each [NavLocalProvider] appropriately.
*
- * Note: the order in which the [NavContentWrapper]s are added to the list determines their scope,
- * i.e. a [NavContentWrapper] added earlier in a list has its data available to those added later.
+ * Note: the order in which the [NavLocalProvider]s are added to the list determines their scope,
+ * i.e. a [NavLocalProvider] added earlier in a list has its data available to those added later.
*
- * @param navContentWrappers the [NavContentWrapper]s that are providing data to the content
+ * @param navLocalProviders the [NavLocalProvider]s that are providing data to the content
*/
-public class NavWrapperManager(navContentWrappers: List<NavContentWrapper> = emptyList()) {
+public class NavWrapperManager(navLocalProviders: List<NavLocalProvider> = emptyList()) {
/**
- * Final list of wrappers. This always adds a [SaveableStateNavContentWrapper] by default, as it
+ * Final list of wrappers. This always adds a [SaveableStateNavLocalProvider] by default, as it
* is required. It then filters out any duplicates to ensure there is always one instance of any
* wrapper at a given time.
*/
private val finalWrappers =
- (navContentWrappers + listOf(SaveableStateNavContentWrapper())).distinct()
+ (navLocalProviders + listOf(SaveableStateNavLocalProvider())).distinct()
/**
- * Calls the [NavContentWrapper.WrapBackStack] functions on each wrapper
+ * Calls the [NavLocalProvider.ProvideToBackStack] functions on each wrapper
*
* This function is called by the [NavDisplay](reference/androidx/navigation/NavDisplay) and
* should not be called directly.
*/
@Composable
public fun PrepareBackStack(backStack: List<Any>) {
- finalWrappers.distinct().forEach { it.WrapBackStack(backStack = backStack) }
+ finalWrappers.distinct().forEach { it.ProvideToBackStack(backStack = backStack) }
}
/**
- * Calls the [NavContentWrapper.WrapContent] functions on each wrapper.
+ * Calls the [NavLocalProvider.ProvideToRecord] functions on each wrapper.
*
* This function is called by the [NavDisplay](reference/androidx/navigation/NavDisplay) and
* should not be called directly.
@@ -68,7 +66,11 @@
finalWrappers
.distinct()
.foldRight(record.content) { wrapper, contentLambda ->
- { wrapper.WrapContent(NavRecord(key, record.featureMap, content = contentLambda)) }
+ {
+ wrapper.ProvideToRecord(
+ NavRecord(key, record.featureMap, content = contentLambda)
+ )
+ }
}
.invoke(key)
}
diff --git a/navigation3/navigation3/src/commonMain/kotlin/androidx/navigation3/SaveableStateNavContentWrapper.kt b/navigation3/navigation3/src/commonMain/kotlin/androidx/navigation3/SaveableStateNavLocalProvider.kt
similarity index 90%
rename from navigation3/navigation3/src/commonMain/kotlin/androidx/navigation3/SaveableStateNavContentWrapper.kt
rename to navigation3/navigation3/src/commonMain/kotlin/androidx/navigation3/SaveableStateNavLocalProvider.kt
index 9c6443f..ce143cd 100644
--- a/navigation3/navigation3/src/commonMain/kotlin/androidx/navigation3/SaveableStateNavContentWrapper.kt
+++ b/navigation3/navigation3/src/commonMain/kotlin/androidx/navigation3/SaveableStateNavLocalProvider.kt
@@ -27,16 +27,16 @@
* Wraps the content of a [NavRecord] with a [SaveableStateHolder.SaveableStateProvider] to ensure
* that calls to [rememberSaveable] within the content work properly and that state can be saved.
*
- * This [NavContentWrapper] is the only one that is **required** as saving state is considered a
+ * This [NavLocalProvider] is the only one that is **required** as saving state is considered a
* non-optional feature.
*/
-public class SaveableStateNavContentWrapper : NavContentWrapper {
+public class SaveableStateNavLocalProvider : NavLocalProvider {
private var savedStateHolder: SaveableStateHolder? = null
private val refCount: MutableObjectIntMap<Any> = MutableObjectIntMap()
private var backstackSize = 0
@Composable
- override fun WrapBackStack(backStack: List<Any>) {
+ override fun ProvideToBackStack(backStack: List<Any>) {
DisposableEffect(key1 = backStack) {
refCount.clear()
onDispose {}
@@ -56,7 +56,7 @@
.getOrElse(key) {
error(
"Attempting to incorrectly dispose of backstack state in " +
- "SaveableStateNavContentWrapper"
+ "SaveableStateNavLocalProvider"
)
}
.minus(1)
@@ -67,7 +67,7 @@
}
@Composable
- public override fun <T : Any> WrapContent(record: NavRecord<T>) {
+ public override fun <T : Any> ProvideToRecord(record: NavRecord<T>) {
val key = record.key
DisposableEffect(key1 = key) {
refCount[key] = refCount.getOrDefault(key, 0).plus(1)
@@ -85,7 +85,7 @@
.getOrElse(key) {
error(
"Attempting to incorrectly dispose of state associated with " +
- "key $key in SaveableStateNavContentWrapper"
+ "key $key in SaveableStateNavLocalProvider"
)
}
.minus(1)
diff --git a/navigation3/navigation3/src/commonMain/kotlin/androidx/navigation3/SavedStateNavContentWrapper.kt b/navigation3/navigation3/src/commonMain/kotlin/androidx/navigation3/SavedStateNavLocalProvider.kt
similarity index 95%
rename from navigation3/navigation3/src/commonMain/kotlin/androidx/navigation3/SavedStateNavContentWrapper.kt
rename to navigation3/navigation3/src/commonMain/kotlin/androidx/navigation3/SavedStateNavLocalProvider.kt
index c651c3d..4676d82 100644
--- a/navigation3/navigation3/src/commonMain/kotlin/androidx/navigation3/SavedStateNavContentWrapper.kt
+++ b/navigation3/navigation3/src/commonMain/kotlin/androidx/navigation3/SavedStateNavLocalProvider.kt
@@ -37,10 +37,10 @@
* [SavedStateRegistryOwner] as a [LocalSavedStateRegistryOwner] so that it is available within the
* content.
*/
-public object SavedStateNavContentWrapper : NavContentWrapper {
+public object SavedStateNavLocalProvider : NavLocalProvider {
@Composable
- override fun <T : Any> WrapContent(record: NavRecord<T>) {
+ override fun <T : Any> ProvideToRecord(record: NavRecord<T>) {
val key = record.key
val childRegistry by
rememberSaveable(