Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
897f063
Migrate `material:material-navigation` to multiplatform
terrakok Dec 19, 2025
8b395c0
Rewrite Modifier.combinedClickable() without SuspendingPointerInputMo…
louispf Jan 28, 2026
7d30120
Move SharedDrawScope and CanvasHolder into ComposeViewContext
Jan 15, 2026
a7a57fc
[SearchBar] Docked Expressive animations
paulfthomas Dec 30, 2025
760d2c9
Ink: Sync from internal state
sfreilich Feb 4, 2026
f033762
[Button] Make isTextButtonContentPaddingFixEnabled flag true by default.
leticiarossi Feb 5, 2026
5dae630
Update docs-public/build.gradle for media3 1.10.0-alpha01
kim-vde Feb 5, 2026
218bd45
Use `advanceUntilIdle` instead of `runCurrent` in `SnapshotFlowBenchm…
derekxu16 Feb 5, 2026
96e88b6
Remove ComposeUiFlags.isRectManagerOffsetUsageFromLayoutCoordinatesEn…
Jan 30, 2026
5ff98bc
[glance] Add component tests for Buttons
Feb 5, 2026
bbdb230
Relnote: Expose PdfDocument from PdfViewerFragment via onDocumentLoad…
Feb 4, 2026
82501ea
Use NDK lld linker for Android targets for 16KB alignment
omarismail94 Feb 6, 2026
fbc1a70
Enable ELF alignment verification in Android libs in KMP projects
omarismail94 Feb 6, 2026
4bc48b3
Translate AssetLoaderAjaxActivity to kotlin
Feb 3, 2026
5c6d54f
Merge "Translate AssetLoaderAjaxActivity to kotlin" into androidx-main
Feb 6, 2026
2c8d472
Update documentation for WearComposeFoundationFlags and isTransformin…
Feb 6, 2026
f8aecaa
Merge changes Ibba68b5d,I1a525524 into androidx-main
omarismail94 Feb 6, 2026
817a9e3
Merge "Update docs-public/build.gradle for media3 1.10.0-alpha01" int…
kim-vde Feb 6, 2026
c9ebf6f
Revert "Introduce internal `Monitor` class"
derekxu16 Feb 6, 2026
739898e
Merge "Relnote: Expose PdfDocument from PdfViewerFragment via onDocum…
Feb 6, 2026
d048ae9
fix: Race condition in PdfDocumentViewModelTest using UnconfinedTestD…
Feb 6, 2026
ab0b9ea
Add isAtTopState overload for AppBar scroll behaviors
Jan 26, 2026
2b512aa
Merge "fix: Race condition in PdfDocumentViewModelTest using Unconfin…
Feb 6, 2026
c349419
Merge "Use `advanceUntilIdle` instead of `runCurrent` in `SnapshotFlo…
Feb 6, 2026
949cf79
Merge "Revert "Introduce internal `Monitor` class"" into androidx-main
Feb 6, 2026
d841665
Merge "Ink: Sync from internal state" into androidx-main
Feb 6, 2026
99c2cc9
Merge "Add isAtTopState overload for AppBar scroll behaviors" into an…
Feb 6, 2026
75b6b49
Merge "Update documentation for WearComposeFoundationFlags and isTran…
Feb 6, 2026
014ecc9
Merge "[Button] Make isTextButtonContentPaddingFixEnabled flag true b…
leticiarossi Feb 6, 2026
12e0b84
Merge "Migrate `material:material-navigation` to multiplatform" into …
liutikas Feb 6, 2026
dacb10c
Updating docs-public/build.gradle
Feb 6, 2026
b6e7995
Merge "Move SharedDrawScope and CanvasHolder into ComposeViewContext"…
Feb 6, 2026
0fa52ee
Merge "Rewrite Modifier.combinedClickable() without SuspendingPointer…
louispf Feb 6, 2026
80afb37
Merge "Remove ComposeUiFlags.isRectManagerOffsetUsageFromLayoutCoordi…
Feb 6, 2026
91e3010
Remove obsolete TODO from ProviderImportCredentialsResponse.
Feb 6, 2026
28f2963
Edited instructions for connecting to studio profiler.
Feb 6, 2026
e913318
Merge "Updating docs-public/build.gradle" into androidx-main
Feb 6, 2026
a93fa23
Merge "[glance] Add component tests for Buttons" into androidx-main
Feb 6, 2026
0a40d09
Merge "[SearchBar] Docked Expressive animations" into androidx-main
paulfthomas Feb 6, 2026
83e1065
Merge "Remove obsolete TODO from ProviderImportCredentialsResponse." …
Feb 6, 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 @@ -715,6 +715,7 @@ abstract class AndroidXImplPlugin @Inject constructor() : Plugin<Project> {
)
project.configurePublicResourcesStub(variant)
project.configureMultiplatformSourcesForAndroid(androidXExtension.samplesProjects)
project.configureVerifyELFRegionAlignment(variant)
variant.aarMetadata.configureMinAgpVersion()
}

Expand Down Expand Up @@ -875,17 +876,7 @@ abstract class AndroidXImplPlugin @Inject constructor() : Plugin<Project> {
taskProvider.configure { task -> task.dependsOn("compileReleaseJavaWithJavac") }
}
}
val verifyELFRegionAlignmentTaskProvider =
project.tasks.register(
variant.name + "VerifyELFRegionAlignment",
VerifyELFRegionAlignmentTask::class.java,
) { task ->
task.mergedNativeLibs.set(
variant.artifacts.get(SingleArtifact.MERGED_NATIVE_LIBS)
)
task.cacheEvenIfNoOutputs()
}
project.addToBuildOnServer(verifyELFRegionAlignmentTaskProvider)
project.configureVerifyELFRegionAlignment(variant)
variant.aarMetadata.configureMinAgpVersion()
}
project.buildOnServerDependsOnAssembleRelease()
Expand Down Expand Up @@ -1353,6 +1344,18 @@ abstract class AndroidXImplPlugin @Inject constructor() : Plugin<Project> {
}
}

private fun Project.configureVerifyELFRegionAlignment(variant: LibraryVariant) {
val verifyELFRegionAlignmentTaskProvider =
project.tasks.register(
variant.name + "VerifyELFRegionAlignment",
VerifyELFRegionAlignmentTask::class.java,
) { task ->
task.mergedNativeLibs.set(variant.artifacts.get(SingleArtifact.MERGED_NATIVE_LIBS))
task.cacheEvenIfNoOutputs()
}
project.addToBuildOnServer(verifyELFRegionAlignmentTaskProvider)
}

/**
* Tells whether this build contains the usual set of all projects (`./gradlew projects`)
* Sometimes developers request to include fewer projects because this may run more quickly
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,19 @@
package androidx.build.clang

import androidx.build.KonanPrebuiltsSetup
import androidx.build.OperatingSystem
import androidx.build.ProjectLayoutType
import androidx.build.clang.KonanBuildService.Companion.obtain
import androidx.build.getKonanPrebuiltsFolder
import androidx.build.getOperatingSystem
import androidx.build.getSdkPath
import java.io.ByteArrayOutputStream
import javax.inject.Inject
import org.gradle.api.GradleException
import org.gradle.api.Project
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.file.FileCollection
import org.gradle.api.file.RegularFileProperty
import org.gradle.api.provider.Property
import org.gradle.api.provider.Provider
import org.gradle.api.services.BuildService
Expand Down Expand Up @@ -133,7 +137,18 @@ abstract class KonanBuildService @Inject constructor(private val execOperations:
val linkerFlags =
parameters.linkerArgs.get() +
if (parameters.konanTarget.get().asKonanTarget.family == Family.ANDROID) {
listOf("-fuse-ld=lld", "-z", "max-page-size=16384")
val customLld = this@KonanBuildService.parameters.androidLldPath.orNull?.asFile
if (customLld != null) {
listOf(
"-fuse-ld=${customLld.absolutePath}",
"-z",
"max-page-size=16384",
"-z",
"common-page-size=16384",
)
} else {
listOf("-fuse-ld=lld", "-z", "max-page-size=16384")
}
} else {
emptyList()
}
Expand Down Expand Up @@ -235,6 +250,18 @@ abstract class KonanBuildService @Inject constructor(private val execOperations:
/** Location if konan prebuilts. Can be null if this is a playground project */
@get:Optional val prebuilts: DirectoryProperty

/**
* Use NDK lld linker in platform prebuilts for Android targets for 16KB alignment
*
* The default NDK linker used by Kotlin Native (LLD 8.0.7) is too old to support the `-z
* common-page-size` flag, which is required for proper 16KB page alignment without
* disabling RELRO (See b/476745201).
*
* The Android NDK support in Kotlin Native is not well maintained:
* https://kotlinlang.org/docs/native-target-support.html#tier-3
*/
@get:Optional val androidLldPath: RegularFileProperty

/**
* The type of the project (Playground vs AOSP main). This value is used to ensure we
* initialize Konan distribution properly.
Expand Down Expand Up @@ -263,6 +290,20 @@ abstract class KonanBuildService @Inject constructor(private val execOperations:
it.parameters.projectLayoutType.set(ProjectLayoutType.from(project))
if (!ProjectLayoutType.isPlayground(project)) {
it.parameters.prebuilts.set(project.getKonanPrebuiltsFolder())

val os = getOperatingSystem()
if (os == OperatingSystem.MAC || os == OperatingSystem.LINUX) {
val platform = if (os == OperatingSystem.MAC) "darwin" else "linux"
val lldPath =
project
.getSdkPath()
.resolve(
"ndk-bundle/toolchains/llvm/prebuilt/${platform}-x86_64/bin/ld.lld"
)
if (lldPath.exists()) {
it.parameters.androidLldPath.set(lldPath)
}
}
}
}
}
Expand Down
2 changes: 2 additions & 0 deletions compose/foundation/foundation/api/current.txt
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,7 @@ package androidx.compose.foundation {
property public boolean isDelayPressesUsingGestureConsumptionEnabled;
property public boolean isNestedDraggablesTouchConflictFixEnabled;
property public boolean isNewContextMenuEnabled;
property public boolean isNonSuspendingPointerInputInCombinedClickableEnabled;
property public boolean isPausableCompositionInPrefetchEnabled;
property public boolean isSmartSelectionEnabled;
property public boolean isTrackpadGestureHandlingEnabled;
Expand All @@ -167,6 +168,7 @@ package androidx.compose.foundation {
field public static boolean isDelayPressesUsingGestureConsumptionEnabled;
field public static boolean isNestedDraggablesTouchConflictFixEnabled;
field public static boolean isNewContextMenuEnabled;
field public static boolean isNonSuspendingPointerInputInCombinedClickableEnabled;
field public static boolean isPausableCompositionInPrefetchEnabled;
field public static boolean isSmartSelectionEnabled;
field public static boolean isTrackpadGestureHandlingEnabled;
Expand Down
2 changes: 2 additions & 0 deletions compose/foundation/foundation/api/restricted_current.txt
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,7 @@ package androidx.compose.foundation {
property public boolean isDelayPressesUsingGestureConsumptionEnabled;
property public boolean isNestedDraggablesTouchConflictFixEnabled;
property public boolean isNewContextMenuEnabled;
property public boolean isNonSuspendingPointerInputInCombinedClickableEnabled;
property public boolean isPausableCompositionInPrefetchEnabled;
property public boolean isSmartSelectionEnabled;
property public boolean isTrackpadGestureHandlingEnabled;
Expand All @@ -167,6 +168,7 @@ package androidx.compose.foundation {
field public static boolean isDelayPressesUsingGestureConsumptionEnabled;
field public static boolean isNestedDraggablesTouchConflictFixEnabled;
field public static boolean isNewContextMenuEnabled;
field public static boolean isNonSuspendingPointerInputInCombinedClickableEnabled;
field public static boolean isPausableCompositionInPrefetchEnabled;
field public static boolean isSmartSelectionEnabled;
field public static boolean isTrackpadGestureHandlingEnabled;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,41 +82,52 @@ private class ClickablePerformClickTestCase : ComposeTestCase {
var isPressed = false
private set

private val indication = EmptyIndication()
private val indication = EmptyIndication { isPressed = it }

@Composable
override fun Content() {
CompositionLocalProvider(LocalIndication provides indication) {
Box(Modifier.fillMaxSize().clickable(onClick = { clickCount++ }))
}
}
}

internal class EmptyIndication(private val setIsPressed: (Boolean) -> Unit) :
IndicationNodeFactory {

private inner class EmptyIndication : IndicationNodeFactory {
override fun create(interactionSource: InteractionSource): DelegatableNode =
EmptyIndicationInstance(interactionSource, setIsPressed)

override fun create(interactionSource: InteractionSource): DelegatableNode =
EmptyIndicationInstance(interactionSource)
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (other !is EmptyIndication) return false

override fun hashCode(): Int = -1
if (setIsPressed !== other.setIsPressed) return false

override fun equals(other: Any?) = other === this
return true
}

private inner class EmptyIndicationInstance(
private val interactionSource: InteractionSource
) : Modifier.Node() {
override fun hashCode(): Int {
return setIsPressed.hashCode()
}

// it is a simplified version of what is happening in the real indications like ripple.
// as delivering interactions updates is a crucial part of what is happening during
// click, we should have it as part of this benchmark.
override fun onAttach() {
coroutineScope.launch {
var pressCount = 0
interactionSource.interactions.collect { interaction ->
when (interaction) {
is PressInteraction.Press -> pressCount++
is PressInteraction.Release -> pressCount--
}
isPressed = pressCount > 0
private class EmptyIndicationInstance(
private val interactionSource: InteractionSource,
private val setIsPressed: (Boolean) -> Unit,
) : Modifier.Node() {

// it is a simplified version of what is happening in the real indications like ripple.
// as delivering interactions updates is a crucial part of what is happening during
// click, we should have it as part of this benchmark.
override fun onAttach() {
coroutineScope.launch {
var pressCount = 0
interactionSource.interactions.collect { interaction ->
when (interaction) {
is PressInteraction.Press -> pressCount++
is PressInteraction.Release -> pressCount--
}
setIsPressed(pressCount > 0)
}
}
}
Expand Down
Loading