Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
31bf9df
Implement toRadians function in commonMain and remove expect/actual
eymar Jan 6, 2026
88bdb75
Simplifying SubspaceLayout content lambda function
Jan 13, 2026
cda6fbc
Introduce Grid layout API surface
Dec 9, 2025
092e36a
Implement Grid sizing and explicit placement
Dec 10, 2025
e0455b4
Add support for gaps in Grid layout
Dec 10, 2025
4f7fad0
Implement Grid item alignment
Dec 10, 2025
2c259a3
Implement Grid content-based sizing
Dec 10, 2025
71e2e9a
Implement Grid auto-placement
Dec 10, 2025
e6b7e92
Annotate Grid layout with ExperimentalGridApi annotation
Jan 14, 2026
0f022da
Include emitInteraction calls in Surface#Press/Release benchmarks
tolgacanunal Jan 14, 2026
2f63731
Fix SafeArgs configuration caching issue
Jan 14, 2026
0811021
[TimeInput] Remove additional padding, now that it's not needed
ymarian Jan 13, 2026
875779a
[SearchBar] Fullscreen Expressive animations
paulfthomas Dec 12, 2025
e1512e5
Merge "Fix SafeArgs configuration caching issue" into androidx-main
Jan 14, 2026
2cc4321
Merge "[TimeInput] Remove additional padding, now that it's not neede…
Jan 14, 2026
6a8ff92
Merge "Include emitInteraction calls in Surface#Press/Release benchma…
tolgacanunal Jan 14, 2026
9b506ea
Merge "Simplifying SubspaceLayout content lambda function" into andro…
Jan 14, 2026
4db13ec
Add rtl awareness to offset subspace modifier
Jan 9, 2026
f111dac
Merge "[SearchBar] Fullscreen Expressive animations" into androidx-main
paulfthomas Jan 14, 2026
06c7c17
Making SpatialRow inline function
Dec 30, 2025
654945e
Adding merged baseline profiles for datastore
Jan 14, 2026
8648b3c
Disabling remaining tests that fail on API 36
liutikas Jan 14, 2026
58185ae
Merge "Implement toRadians function in commonMain and remove expect/a…
Jan 14, 2026
3f1b960
Merge "Making SpatialRow inline function" into androidx-main
Jan 14, 2026
3516e4b
Merge "Add rtl awareness to offset subspace modifier" into androidx-main
Jan 14, 2026
cf4b493
Merge "Disabling remaining tests that fail on API 36" into androidx-main
liutikas Jan 14, 2026
0ac206b
Merge "Adding merged baseline profiles for datastore" into androidx-main
Jan 14, 2026
0992b6a
Make JXR depend on new 0.0.11 version of Impress
Jan 14, 2026
c2b7276
Merge "Make JXR depend on new 0.0.11 version of Impress" into android…
Jan 15, 2026
f263260
Add JNI marshalling tests for ToggleGltfModelAnimation
Dec 23, 2025
39ab3cc
Merge "Add JNI marshalling tests for ToggleGltfModelAnimation" into a…
Jan 15, 2026
4156dd3
Merge changes from topic "compose-grid" into androidx-main
Jan 15, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
import androidx.test.filters.MediumTest
import androidx.test.filters.SdkSuppress
import androidx.test.platform.app.InstrumentationRegistry
import androidx.testutils.PollingCheck
import androidx.testutils.withActivity
Expand All @@ -51,7 +52,6 @@ import org.junit.Assert
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertNotNull
import org.junit.Assume.assumeFalse
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
Expand Down Expand Up @@ -144,14 +144,11 @@ abstract class BaseKeyEventsTestCase<A : BaseTestActivity>(private val activityC
}
}

@SdkSuppress(maxSdkVersion = 35) // b/460511639
@Test
@LargeTest
@Throws(InterruptedException::class)
fun testBackCollapsesActionView() {
assumeFalse(
"Test fails on cuttlefish b/460511639",
Build.MODEL.contains("Cuttlefish", ignoreCase = true),
)
with(ActivityScenario.launch(activityClass)) {
// Click on the Search menu item
onView(withId(R.id.action_search)).perform(click())
Expand Down Expand Up @@ -208,11 +205,8 @@ abstract class BaseKeyEventsTestCase<A : BaseTestActivity>(private val activityC

@Test
@MediumTest
@SdkSuppress(maxSdkVersion = 35) // b/460511639
fun testBackPressWithEmptyMenuHandledByActivity() {
assumeFalse(
"Test fails on cuttlefish b/460511639",
Build.MODEL.contains("Cuttlefish", ignoreCase = true),
)
with(ActivityScenario.launch(activityClass)) {
// Pressing the menu key with an empty menu does nothing.
val scenario = (this as? ActivityScenario<BaseTestActivity>)!!
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
package androidx.appcompat.app

import android.content.Context
import android.os.Build
import android.view.KeyEvent
import android.view.View
import android.view.ViewGroup
Expand All @@ -27,23 +26,20 @@ import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.action.ViewActions.pressKey
import androidx.test.espresso.matcher.ViewMatchers.isRoot
import androidx.test.filters.LargeTest
import androidx.test.filters.SdkSuppress
import androidx.testutils.PollingCheck
import androidx.testutils.withActivity
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.junit.Assume.assumeFalse
import org.junit.Test

class KeyEventsTestCaseWithWindowDecor :
BaseKeyEventsTestCase<WindowDecorAppCompatActivity>(WindowDecorAppCompatActivity::class.java) {
@SdkSuppress(maxSdkVersion = 35) // b/460511639
@Test
@LargeTest
@Throws(Throwable::class)
fun testUnhandledKeys() {
assumeFalse(
"Test fails on cuttlefish b/460511639",
Build.MODEL.contains("Cuttlefish", ignoreCase = true),
)
with(ActivityScenario.launch(WindowDecorAppCompatActivity::class.java)) {
val listener = MockUnhandledKeyListener()
val mockView1: View = withActivity { HandlerView(this) }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,10 @@ private const val HalfPi = (PI * 0.5).toFloat()

private val OurPercentCache: FloatArray = FloatArray(91)

internal expect inline fun toRadians(value: Double): Double
@Suppress("NOTHING_TO_INLINE")
internal inline fun toRadians(value: Double): Double {
// No Kotlin multiplatform function out of a box, but it's a trivial calculation
return value * (PI / 180.0)
}

internal expect inline fun binarySearch(array: FloatArray, position: Float): Int
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,6 @@

package androidx.compose.animation.core

@Suppress("NOTHING_TO_INLINE")
internal actual inline fun toRadians(value: Double): Double {
return Math.toRadians(value)
}

@Suppress("NOTHING_TO_INLINE")
internal actual inline fun binarySearch(array: FloatArray, position: Float): Int {
return array.binarySearch(position)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,6 @@

package androidx.compose.animation.core

@Suppress("NOTHING_TO_INLINE")
internal actual inline fun toRadians(value: Double): Double = implementedInJetBrainsFork()

@Suppress("NOTHING_TO_INLINE")
internal actual inline fun binarySearch(array: FloatArray, position: Float): Int =
implementedInJetBrainsFork()
107 changes: 107 additions & 0 deletions compose/foundation/foundation-layout/api/current.txt
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,9 @@ package androidx.compose.foundation.layout {
property @Deprecated public abstract androidx.compose.ui.unit.Dp maxWidthInLine;
}

@SuppressCompatibility @kotlin.RequiresOptIn(message="This foundation layout API is experimental and is likely to change or be removed in the future.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public @interface ExperimentalGridApi {
}

@SuppressCompatibility @kotlin.RequiresOptIn(message="The API of this layout is experimental and is likely to change in the future.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public @interface ExperimentalLayoutApi {
}

Expand Down Expand Up @@ -275,6 +278,110 @@ package androidx.compose.foundation.layout {
method @BytecodeOnly @SuppressCompatibility @androidx.compose.foundation.layout.ExperimentalLayoutApi public static androidx.compose.ui.Modifier! fillMaxRowHeight$default(androidx.compose.foundation.layout.FlowRowScope!, androidx.compose.ui.Modifier!, float, int, Object!);
}

@SuppressCompatibility @androidx.compose.foundation.layout.ExperimentalGridApi @kotlin.jvm.JvmInline public final value class Fr {
ctor @KotlinOnly public Fr(float value);
method @BytecodeOnly public static androidx.compose.foundation.layout.Fr! box-impl(float);
method @BytecodeOnly public static float constructor-impl(float);
method @InaccessibleFromKotlin public float getValue();
method @BytecodeOnly public float unbox-impl();
property public float value;
}

@SuppressCompatibility @androidx.compose.foundation.layout.ExperimentalGridApi @androidx.compose.foundation.layout.LayoutScopeMarker public interface GridConfigurationScope extends androidx.compose.ui.unit.Density {
method @KotlinOnly public void column(androidx.compose.foundation.layout.Fr weight);
method @KotlinOnly public void column(androidx.compose.foundation.layout.GridTrackSize size);
method @KotlinOnly public void column(androidx.compose.ui.unit.Dp size);
method public void column(float percentage);
method @BytecodeOnly public void column-0680j_4(float);
method @BytecodeOnly public void column-118E5d0(long);
method @BytecodeOnly public void column-XZblgos(float);
method @KotlinOnly public void columnGap(androidx.compose.ui.unit.Dp gap);
method @BytecodeOnly public void columnGap-0680j_4(float);
method @KotlinOnly public void gap(androidx.compose.ui.unit.Dp all);
method @KotlinOnly public void gap(androidx.compose.ui.unit.Dp row, androidx.compose.ui.unit.Dp column);
method @BytecodeOnly public void gap-0680j_4(float);
method @BytecodeOnly public void gap-YgX7TsA(float, float);
method @BytecodeOnly public int getFlow-ITJdzs4();
method @BytecodeOnly public default float getFr-9P9H2UQ(double);
method @BytecodeOnly public default float getFr-9P9H2UQ(float);
method @BytecodeOnly public default float getFr-9P9H2UQ(int);
method @KotlinOnly public void row(androidx.compose.foundation.layout.Fr weight);
method @KotlinOnly public void row(androidx.compose.foundation.layout.GridTrackSize size);
method @KotlinOnly public void row(androidx.compose.ui.unit.Dp size);
method public void row(float percentage);
method @BytecodeOnly public void row-0680j_4(float);
method @BytecodeOnly public void row-118E5d0(long);
method @BytecodeOnly public void row-XZblgos(float);
method @KotlinOnly public void rowGap(androidx.compose.ui.unit.Dp gap);
method @BytecodeOnly public void rowGap-0680j_4(float);
method @BytecodeOnly public void setFlow-4t4_IgM(int);
property public abstract androidx.compose.foundation.layout.GridFlow flow;
property @SuppressCompatibility @androidx.compose.foundation.layout.ExperimentalGridApi @androidx.compose.runtime.Stable public default androidx.compose.foundation.layout.Fr int.fr;
property @SuppressCompatibility @androidx.compose.foundation.layout.ExperimentalGridApi @androidx.compose.runtime.Stable public default androidx.compose.foundation.layout.Fr float.fr;
property @SuppressCompatibility @androidx.compose.foundation.layout.ExperimentalGridApi @androidx.compose.runtime.Stable public default androidx.compose.foundation.layout.Fr double.fr;
}

@SuppressCompatibility @androidx.compose.foundation.layout.ExperimentalGridApi @kotlin.jvm.JvmInline public final value class GridFlow {
method @BytecodeOnly public static androidx.compose.foundation.layout.GridFlow! box-impl(int);
method @BytecodeOnly public int unbox-impl();
field public static final androidx.compose.foundation.layout.GridFlow.Companion Companion;
}

@SuppressCompatibility @androidx.compose.foundation.layout.ExperimentalGridApi public static final class GridFlow.Companion {
method @BytecodeOnly @SuppressCompatibility @androidx.compose.foundation.layout.ExperimentalGridApi public int getColumn-ITJdzs4();
method @BytecodeOnly @SuppressCompatibility @androidx.compose.foundation.layout.ExperimentalGridApi public int getRow-ITJdzs4();
property @SuppressCompatibility @androidx.compose.foundation.layout.ExperimentalGridApi public inline androidx.compose.foundation.layout.GridFlow Column;
property @SuppressCompatibility @androidx.compose.foundation.layout.ExperimentalGridApi public inline androidx.compose.foundation.layout.GridFlow Row;
}

@SuppressCompatibility public final class GridKt {
method @BytecodeOnly @SuppressCompatibility @androidx.compose.foundation.layout.ExperimentalGridApi @androidx.compose.runtime.Composable public static void Grid(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.GridConfigurationScope!,kotlin.Unit!>, androidx.compose.ui.Modifier?, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.layout.GridScope!,? super androidx.compose.runtime.Composer!,? super java.lang.Integer!,kotlin.Unit!>, androidx.compose.runtime.Composer?, int, int);
method @KotlinOnly @SuppressCompatibility @androidx.compose.foundation.layout.ExperimentalGridApi @androidx.compose.runtime.Composable public static inline void Grid(kotlin.jvm.functions.Function1<androidx.compose.foundation.layout.GridConfigurationScope,kotlin.Unit> config, optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function1<androidx.compose.foundation.layout.GridScope,kotlin.Unit> content);
method @SuppressCompatibility @androidx.compose.foundation.layout.ExperimentalGridApi public static void columns(androidx.compose.foundation.layout.GridConfigurationScope, androidx.compose.foundation.layout.GridTrackSpec... specs);
method @SuppressCompatibility @androidx.compose.foundation.layout.ExperimentalGridApi public static void rows(androidx.compose.foundation.layout.GridConfigurationScope, androidx.compose.foundation.layout.GridTrackSpec... specs);
}

@SuppressCompatibility @androidx.compose.foundation.layout.ExperimentalGridApi @androidx.compose.foundation.layout.LayoutScopeMarker @androidx.compose.runtime.Immutable @kotlin.jvm.JvmDefaultWithCompatibility public interface GridScope {
method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier gridItem(androidx.compose.ui.Modifier, optional int row, optional int column, optional int rowSpan, optional int columnSpan, optional androidx.compose.ui.Alignment alignment);
method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier gridItem(androidx.compose.ui.Modifier, kotlin.ranges.IntRange rows, kotlin.ranges.IntRange columns, optional androidx.compose.ui.Alignment alignment);
method @BytecodeOnly @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier! gridItem$default(androidx.compose.foundation.layout.GridScope!, androidx.compose.ui.Modifier!, int, int, int, int, androidx.compose.ui.Alignment!, int, Object!);
method @BytecodeOnly @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier! gridItem$default(androidx.compose.foundation.layout.GridScope!, androidx.compose.ui.Modifier!, kotlin.ranges.IntRange!, kotlin.ranges.IntRange!, androidx.compose.ui.Alignment!, int, Object!);
field public static final androidx.compose.foundation.layout.GridScope.Companion Companion;
field @SuppressCompatibility @androidx.compose.foundation.layout.ExperimentalGridApi public static final int GridIndexUnspecified = 0; // 0x0
field @SuppressCompatibility @androidx.compose.foundation.layout.ExperimentalGridApi public static final int MaxGridIndex = 1000; // 0x3e8
}

@SuppressCompatibility @androidx.compose.foundation.layout.ExperimentalGridApi public static final class GridScope.Companion {
property @SuppressCompatibility @androidx.compose.foundation.layout.ExperimentalGridApi public static int GridIndexUnspecified;
property @SuppressCompatibility @androidx.compose.foundation.layout.ExperimentalGridApi public static int MaxGridIndex;
field public static final int GridIndexUnspecified = 0; // 0x0
field public static final int MaxGridIndex = 1000; // 0x3e8
}

@SuppressCompatibility @androidx.compose.foundation.layout.ExperimentalGridApi @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class GridTrackSize implements androidx.compose.foundation.layout.GridTrackSpec {
method @BytecodeOnly public static androidx.compose.foundation.layout.GridTrackSize! box-impl(long);
method @BytecodeOnly public long unbox-impl();
field public static final androidx.compose.foundation.layout.GridTrackSize.Companion Companion;
}

@SuppressCompatibility @androidx.compose.foundation.layout.ExperimentalGridApi public static final class GridTrackSize.Companion {
method @KotlinOnly @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.GridTrackSize Fixed(androidx.compose.ui.unit.Dp size);
method @BytecodeOnly @androidx.compose.runtime.Stable public long Fixed-psSkOvk(float);
method @KotlinOnly @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.GridTrackSize Flex(@FloatRange(from=0.0) androidx.compose.foundation.layout.Fr weight);
method @BytecodeOnly @androidx.compose.runtime.Stable public long Flex-KGB9zo8(@FloatRange(from=0.0) float);
method @KotlinOnly @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.GridTrackSize Percentage(@FloatRange(from=0.0) float value);
method @BytecodeOnly @androidx.compose.runtime.Stable public long Percentage-9Tp3RV8(@FloatRange(from=0.0) float);
method @BytecodeOnly public long getAuto-eyNpfc4();
method @BytecodeOnly public long getMaxContent-eyNpfc4();
method @BytecodeOnly public long getMinContent-eyNpfc4();
property @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.GridTrackSize Auto;
property @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.GridTrackSize MaxContent;
property @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.GridTrackSize MinContent;
}

@SuppressCompatibility @androidx.compose.foundation.layout.ExperimentalGridApi public sealed exhaustive interface GridTrackSpec {
}

public final class IntrinsicKt {
method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier height(androidx.compose.ui.Modifier, androidx.compose.foundation.layout.IntrinsicSize intrinsicSize);
method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredHeight(androidx.compose.ui.Modifier, androidx.compose.foundation.layout.IntrinsicSize intrinsicSize);
Expand Down
Loading
Loading