From b11899c728889b570888fe194d49903e3d8a7529 Mon Sep 17 00:00:00 2001 From: Kumar Ankit Date: Wed, 7 Jan 2026 12:15:37 +0530 Subject: [PATCH 01/14] Address feedback for FormWidgetInfo model class - Update boolean variable names to follow API guidelines. - Add factory methods for different types of form widgets. - Doc: go/form-filling-processing-layer - Making constructor private and fixing tests will be taken up in follow up CL. Bug: 471094578 Test: FormWidgetInfoTest Change-Id: I55484ffe9453fb0dcacea84be1abbf85d4c7e172 --- .../kotlin/androidx/pdf/PdfFormFillingTest.kt | 24 +- .../androidx/pdf/SandboxedPdfDocumentTest.kt | 2 +- .../androidx/pdf/FakeEditablePdfDocument.kt | 4 +- .../fragment/PdfDocumentViewModelTest.kt | 6 +- .../androidx/pdf/view/FakePdfDocument.kt | 4 +- .../pdf/view/PdfViewFormFillingTest.kt | 4 +- .../FormWidgetContentDescriptionFactory.kt | 4 +- .../androidx/pdf/models/FormWidgetInfo.kt | 280 +++++++++++++----- .../pdf/view/FormFillingTextInputFactory.kt | 4 +- .../pdf/view/FormWidgetInteractionHandler.kt | 4 +- .../src/main/kotlin/androidx/pdf/view/Page.kt | 2 +- .../main/kotlin/androidx/pdf/view/PdfView.kt | 2 +- .../pdf/view/PdfViewAccessibilityManager.kt | 4 +- .../kotlin/androidx/pdf/FakePdfDocument.kt | 4 +- .../view/FormWidgetInteractionHandlerTest.kt | 8 +- 15 files changed, 251 insertions(+), 105 deletions(-) diff --git a/pdf/pdf-document-service/src/androidTest/kotlin/androidx/pdf/PdfFormFillingTest.kt b/pdf/pdf-document-service/src/androidTest/kotlin/androidx/pdf/PdfFormFillingTest.kt index 68c2b21a601f2..f399f20c0c526 100644 --- a/pdf/pdf-document-service/src/androidTest/kotlin/androidx/pdf/PdfFormFillingTest.kt +++ b/pdf/pdf-document-service/src/androidTest/kotlin/androidx/pdf/PdfFormFillingTest.kt @@ -192,7 +192,7 @@ class PdfFormFillingTest { widgetRect = Rect(135, 30, 155, 50), textValue = "true", accessibilityLabel = "readOnlyCheckbox", - readOnly = true, + isReadOnly = true, ) val checkBox = @@ -202,7 +202,7 @@ class PdfFormFillingTest { widgetRect = Rect(135, 70, 155, 90), textValue = "false", accessibilityLabel = "checkbox", - readOnly = false, + isReadOnly = false, ) verifyFormWidgetInfos( @@ -223,7 +223,7 @@ class PdfFormFillingTest { widgetRect = widgetArea, textValue = "false", accessibilityLabel = "checkbox", - readOnly = false, + isReadOnly = false, ) val clickPoint = PdfPoint(pageNum = 0, x = 145f, y = 80f) @@ -236,7 +236,7 @@ class PdfFormFillingTest { widgetRect = widgetArea, textValue = "true", accessibilityLabel = "checkbox", - readOnly = false, + isReadOnly = false, ) val expectedDirtyArea: List = listOf(widgetArea) @@ -996,8 +996,8 @@ class PdfFormFillingTest { widgetRect = widgetRect, textValue = textValue, accessibilityLabel = accessibilityLabel, - readOnly = readOnly, - editableText = editableText, + isReadOnly = readOnly, + isEditableText = editableText, fontSize = fontSize.takeIf { it > 0 }, listItems = listItems, ) @@ -1016,7 +1016,7 @@ class PdfFormFillingTest { widgetRect = widgetRect, textValue = textValue, accessibilityLabel = accessibilityLabel, - readOnly = readOnly, + isReadOnly = readOnly, ) } @@ -1035,8 +1035,8 @@ class PdfFormFillingTest { widgetRect = widgetRect, textValue = textValue, accessibilityLabel = accessibilityLabel, - readOnly = readOnly, - multiSelect = multiSelect, + isReadOnly = readOnly, + isMultiSelect = multiSelect, listItems = listItems, ) } @@ -1058,9 +1058,9 @@ class PdfFormFillingTest { widgetRect = widgetRect, textValue = textValue, accessibilityLabel = accessibilityLabel, - readOnly = readOnly, - editableText = editableText, - multiLineText = multiLineText, + isReadOnly = readOnly, + isEditableText = editableText, + isMultiLineText = multiLineText, maxLength = maxLength.takeIf { it >= 0 }, // Only include if > 0 fontSize = fontSize.takeIf { it > 0 }, // Only include if > 0 ) diff --git a/pdf/pdf-document-service/src/androidTest/kotlin/androidx/pdf/SandboxedPdfDocumentTest.kt b/pdf/pdf-document-service/src/androidTest/kotlin/androidx/pdf/SandboxedPdfDocumentTest.kt index e717fe23b35af..1b45948e1aaa8 100644 --- a/pdf/pdf-document-service/src/androidTest/kotlin/androidx/pdf/SandboxedPdfDocumentTest.kt +++ b/pdf/pdf-document-service/src/androidTest/kotlin/androidx/pdf/SandboxedPdfDocumentTest.kt @@ -343,7 +343,7 @@ class SandboxedPdfDocumentTest { val pageNum = 0 val editableFormWidget = document.getFormWidgetInfos(pageNum).find { - !it.readOnly && it.widgetType == FormWidgetInfo.WIDGET_TYPE_CHECKBOX + !it.isReadOnly && it.widgetType == FormWidgetInfo.WIDGET_TYPE_CHECKBOX } requireNotNull(editableFormWidget) diff --git a/pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/FakeEditablePdfDocument.kt b/pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/FakeEditablePdfDocument.kt index a94d1a795be50..c4cbe26386427 100644 --- a/pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/FakeEditablePdfDocument.kt +++ b/pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/FakeEditablePdfDocument.kt @@ -357,8 +357,8 @@ internal open class FakeEditablePdfDocument( accessibilityLabel = "ListBox", listItems = listOf(ListItem("Apple", false), ListItem("Banana", false)), - multiSelect = true, - readOnly = true, + isMultiSelect = true, + isReadOnly = true, ) ), ), diff --git a/pdf/pdf-viewer-fragment/src/androidTest/kotlin/androidx/pdf/viewer/fragment/PdfDocumentViewModelTest.kt b/pdf/pdf-viewer-fragment/src/androidTest/kotlin/androidx/pdf/viewer/fragment/PdfDocumentViewModelTest.kt index 1495b0f971f94..9c3a1dd2833ed 100644 --- a/pdf/pdf-viewer-fragment/src/androidTest/kotlin/androidx/pdf/viewer/fragment/PdfDocumentViewModelTest.kt +++ b/pdf/pdf-viewer-fragment/src/androidTest/kotlin/androidx/pdf/viewer/fragment/PdfDocumentViewModelTest.kt @@ -370,7 +370,7 @@ class PdfDocumentViewModelTest { widgetRect = Rect(135, 70, 155, 90), textValue = "true", accessibilityLabel = "checkbox", - readOnly = false, + isReadOnly = false, ) val expectedFormWidgetInfoIndex5 = FormWidgetInfo( @@ -379,7 +379,7 @@ class PdfDocumentViewModelTest { widgetRect = Rect(85, 230, 105, 250), textValue = "true", accessibilityLabel = "", - readOnly = false, + isReadOnly = false, ) val expectedFormWidgetInfoIndex7 = FormWidgetInfo( @@ -388,7 +388,7 @@ class PdfDocumentViewModelTest { widgetRect = Rect(185, 230, 205, 250), textValue = "false", accessibilityLabel = "", - readOnly = false, + isReadOnly = false, ) for (widget: FormWidgetInfo in formWidgetInfos) { diff --git a/pdf/pdf-viewer/src/androidTest/kotlin/androidx/pdf/view/FakePdfDocument.kt b/pdf/pdf-viewer/src/androidTest/kotlin/androidx/pdf/view/FakePdfDocument.kt index 24fc245072927..26ba88e37a482 100644 --- a/pdf/pdf-viewer/src/androidTest/kotlin/androidx/pdf/view/FakePdfDocument.kt +++ b/pdf/pdf-viewer/src/androidTest/kotlin/androidx/pdf/view/FakePdfDocument.kt @@ -355,8 +355,8 @@ internal open class FakePdfDocument( accessibilityLabel = "ListBox", listItems = listOf(ListItem("Apple", false), ListItem("Banana", false)), - multiSelect = true, - readOnly = true, + isMultiSelect = true, + isReadOnly = true, ) ), ), diff --git a/pdf/pdf-viewer/src/androidTest/kotlin/androidx/pdf/view/PdfViewFormFillingTest.kt b/pdf/pdf-viewer/src/androidTest/kotlin/androidx/pdf/view/PdfViewFormFillingTest.kt index 14011c05bfee7..0f74cfdc5a929 100644 --- a/pdf/pdf-viewer/src/androidTest/kotlin/androidx/pdf/view/PdfViewFormFillingTest.kt +++ b/pdf/pdf-viewer/src/androidTest/kotlin/androidx/pdf/view/PdfViewFormFillingTest.kt @@ -247,7 +247,7 @@ class PdfViewFormFillingTest { widgetRect = Rect(10, 10, 200, 200), textValue = "Hello", accessibilityLabel = "Hello", - multiLineText = false, + isMultiLineText = false, fontSize = 10.0f, ) ) @@ -352,7 +352,7 @@ class PdfViewFormFillingTest { textValue = "Banana", accessibilityLabel = "ListBox", listItems = choices, - multiSelect = multiselect, + isMultiSelect = multiselect, ) ) } diff --git a/pdf/pdf-viewer/src/main/java/androidx/pdf/util/FormWidgetContentDescriptionFactory.kt b/pdf/pdf-viewer/src/main/java/androidx/pdf/util/FormWidgetContentDescriptionFactory.kt index 1b584e2fcf51a..e788fe32208a7 100644 --- a/pdf/pdf-viewer/src/main/java/androidx/pdf/util/FormWidgetContentDescriptionFactory.kt +++ b/pdf/pdf-viewer/src/main/java/androidx/pdf/util/FormWidgetContentDescriptionFactory.kt @@ -32,7 +32,7 @@ internal class FormWidgetContentDescriptionFactory { val typeName = getWidgetNameFromWidgetType(formWidgetInfo.widgetType, context) val typeString = - if (formWidgetInfo.multiSelect) { + if (formWidgetInfo.isMultiSelect) { context.getString(R.string.form_multiselect_type, typeName) } else { context.getString(R.string.form_type, typeName) @@ -49,7 +49,7 @@ internal class FormWidgetContentDescriptionFactory { builder.append(context.getString(R.string.form_title, accessibilityLabel)) builder.append(SPACE) - if (formWidgetInfo.readOnly) { + if (formWidgetInfo.isReadOnly) { builder.append(context.getString(R.string.form_value, getTextValue(formWidgetInfo))) builder.append(SPACE) builder.append(context.getString(R.string.form_read_only)) diff --git a/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/models/FormWidgetInfo.kt b/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/models/FormWidgetInfo.kt index a93e4d67979fe..d652d27328d1d 100644 --- a/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/models/FormWidgetInfo.kt +++ b/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/models/FormWidgetInfo.kt @@ -21,6 +21,7 @@ import android.graphics.Rect import android.os.Parcel import android.os.Parcelable import androidx.annotation.IntDef +import androidx.annotation.IntRange import androidx.annotation.RestrictTo import androidx.core.os.ParcelCompat import java.util.Objects @@ -35,62 +36,64 @@ import java.util.Objects @SuppressLint("BanParcelableUsage") @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) public class FormWidgetInfo( + /** The [WidgetType] of this widget */ @WidgetType public val widgetType: Int, + /** The index of this widget among all form widgets on the page */ public val widgetIndex: Int, + /** The bounds of this widget in PDF coordinates */ public val widgetRect: Rect, + /** + * The text value of this widget, if present. Comes from the "V" value in the annotation + * dictionary. + * + * See PDF spec 1.7 Table 8.69 + */ public val textValue: String?, + /** + * The accessibility label for this widget, if present. Comes from the "TU" or "T" value in the + * annotation dictionary. + * + * See PDF spec 1.7 Table 8.69 + */ public val accessibilityLabel: String?, - public val readOnly: Boolean = false, - public val editableText: Boolean = false, - public val multiSelect: Boolean = false, - public val multiLineText: Boolean = false, - maxLength: Int? = null, - fontSize: Float? = null, - listItems: List? = null, + /** True if this widget is read-only and accepts changes */ + public val isReadOnly: Boolean = false, + /** + * True if this widget has editable text. Only applicable to [WIDGET_TYPE_COMBOBOX] or + * [WIDGET_TYPE_TEXTFIELD]. Defaults to 'false' for other widget types. + */ + public val isEditableText: Boolean = false, + /** + * True if this widget supports selecting multiple [ListItem]s. Only applicable to + * [WIDGET_TYPE_LISTBOX]. Defaults to 'false' for other widget types. + */ + public val isMultiSelect: Boolean = false, + /** + * True if this widget supports multi-line text input. Only applicable to + * [WIDGET_TYPE_TEXTFIELD]. Defaults to 'false' for other widget types. + */ + public val isMultiLineText: Boolean = false, + /** + * The configured maximum text length for a form widget of type [WIDGET_TYPE_TEXTFIELD]), or -1 + * for widgets this does not apply to. + */ + public val maxLength: Int = -1, + /** + * The configured font size for a form widget that accepts text input ([WIDGET_TYPE_COMBOBOX] or + * [WIDGET_TYPE_TEXTFIELD]), or 0 for widgets this does not apply to. + */ + public val fontSize: Float = 0.0f, + /** + * The set of choice options in a form widget of type [WIDGET_TYPE_COMBOBOX] or + * [WIDGET_TYPE_LISTBOX], or an empty list for other widget types. + */ + public val listItems: List = emptyList(), ) : Parcelable { - init { - if (editableText) { - require(widgetType == WIDGET_TYPE_COMBOBOX || widgetType == WIDGET_TYPE_TEXTFIELD) { - "Editable text is only supported on combo-boxes and text fields" - } - } - if (multiSelect) { - require(widgetType == WIDGET_TYPE_LISTBOX) { - "Multi-select is only supported on text fields" - } - } - - if (multiLineText) { - require(widgetType == WIDGET_TYPE_TEXTFIELD) { - "Multiline text is only supported on text fields" - } - } + init { + require(widgetIndex >= 0) { "widgetIndex must be non-negative" } } - public val maxLength: Int = - maxLength?.also { - require(it > 0) { "Invalid max Length" } - require(widgetType == WIDGET_TYPE_TEXTFIELD) { - "Max length is only supported on text fields" - } - } ?: Int.MIN_VALUE - - public val fontSize: Float = - fontSize?.also { - require(it > 0) { "Invalid font size" } - require(widgetType == WIDGET_TYPE_COMBOBOX || widgetType == WIDGET_TYPE_TEXTFIELD) { - "Font size is only supported on combo-boxes and text fields" - } - } ?: Float.MIN_VALUE - - public val listItems: List = - listItems?.also { - require(widgetType == WIDGET_TYPE_COMBOBOX || widgetType == WIDGET_TYPE_LISTBOX) { - "Choice options are only supported on combo-boxes and list boxes" - } - } ?: emptyList() - private constructor( parcel: Parcel ) : this( @@ -100,14 +103,13 @@ public class FormWidgetInfo( ParcelCompat.readParcelable(parcel, Rect::class.java.classLoader, Rect::class.java)!!, textValue = parcel.readString(), accessibilityLabel = parcel.readString(), - readOnly = parcel.readBoolean(), - editableText = parcel.readBoolean(), - multiSelect = parcel.readBoolean(), - multiLineText = parcel.readBoolean(), - maxLength = parcel.readInt().takeIf { it != Int.MIN_VALUE }, - fontSize = parcel.readFloat().takeIf { it != Float.MIN_VALUE }, - listItems = - parcel.createTypedArrayList(ListItem.CREATOR).takeIf { it?.isNotEmpty() == true }, + isReadOnly = parcel.readBoolean(), + isEditableText = parcel.readBoolean(), + isMultiSelect = parcel.readBoolean(), + isMultiLineText = parcel.readBoolean(), + maxLength = parcel.readInt(), + fontSize = parcel.readFloat(), + listItems = parcel.createTypedArrayList(ListItem.CREATOR)?.toList() ?: emptyList(), ) override fun describeContents(): Int = 0 @@ -118,10 +120,10 @@ public class FormWidgetInfo( dest.writeParcelable(widgetRect, flags) dest.writeString(textValue) dest.writeString(accessibilityLabel) - dest.writeBoolean(readOnly) - dest.writeBoolean(editableText) - dest.writeBoolean(multiSelect) - dest.writeBoolean(multiLineText) + dest.writeBoolean(isReadOnly) + dest.writeBoolean(isEditableText) + dest.writeBoolean(isMultiSelect) + dest.writeBoolean(isMultiLineText) dest.writeInt(maxLength) dest.writeFloat(fontSize) dest.writeTypedList(listItems) @@ -132,12 +134,12 @@ public class FormWidgetInfo( widgetType, widgetIndex, widgetRect, - readOnly, + isReadOnly, textValue, accessibilityLabel, - editableText, - multiSelect, - multiLineText, + isEditableText, + isMultiSelect, + isMultiLineText, maxLength, fontSize, listItems, @@ -151,18 +153,19 @@ public class FormWidgetInfo( return widgetType == other.widgetType && widgetIndex == other.widgetIndex && Objects.equals(widgetRect, other.widgetRect) && - readOnly == other.readOnly && + isReadOnly == other.isReadOnly && Objects.equals(textValue, other.textValue) && Objects.equals(accessibilityLabel, other.accessibilityLabel) && - editableText == other.editableText && - multiSelect == other.multiSelect && - multiLineText == other.multiLineText && + isEditableText == other.isEditableText && + isMultiSelect == other.isMultiSelect && + isMultiLineText == other.isMultiLineText && maxLength == other.maxLength && fontSize == other.fontSize && listItems == other.listItems } /** Represents the type of a form widget */ + @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) @Retention(AnnotationRetention.SOURCE) @IntDef( WIDGET_TYPE_UNKNOWN, @@ -194,6 +197,149 @@ public class FormWidgetInfo( /** Represents a signature type form widget */ public const val WIDGET_TYPE_SIGNATURE: Int = 7 + /** Factory method for creating form widget of type [WIDGET_TYPE_PUSHBUTTON]. */ + @JvmStatic + public fun createPushButton( + @IntRange(from = 0) widgetIndex: Int, + widgetRect: Rect, + textValue: String?, + accessibilityLabel: String?, + isReadOnly: Boolean, + ): FormWidgetInfo = + FormWidgetInfo( + WIDGET_TYPE_PUSHBUTTON, + widgetIndex, + widgetRect, + textValue, + accessibilityLabel, + isReadOnly, + ) + + /** Factory method for creating form widget of type [WIDGET_TYPE_CHECKBOX]. */ + @JvmStatic + public fun createCheckbox( + @IntRange(from = 0) widgetIndex: Int, + widgetRect: Rect, + textValue: String?, + accessibilityLabel: String?, + isReadOnly: Boolean, + ): FormWidgetInfo = + FormWidgetInfo( + WIDGET_TYPE_CHECKBOX, + widgetIndex, + widgetRect, + textValue, + accessibilityLabel, + isReadOnly, + ) + + /** Factory method for creating form widget of type [WIDGET_TYPE_RADIOBUTTON]. */ + @JvmStatic + public fun createRadioButton( + @IntRange(from = 0) widgetIndex: Int, + widgetRect: Rect, + textValue: String?, + accessibilityLabel: String?, + isReadOnly: Boolean, + ): FormWidgetInfo = + FormWidgetInfo( + WIDGET_TYPE_RADIOBUTTON, + widgetIndex, + widgetRect, + textValue, + accessibilityLabel, + isReadOnly, + ) + + /** Factory method for creating form widget of type [WIDGET_TYPE_SIGNATURE]. */ + @JvmStatic + public fun createSignature( + @IntRange(from = 0) widgetIndex: Int, + widgetRect: Rect, + textValue: String?, + accessibilityLabel: String?, + isReadOnly: Boolean, + ): FormWidgetInfo = + FormWidgetInfo( + WIDGET_TYPE_SIGNATURE, + widgetIndex, + widgetRect, + textValue, + accessibilityLabel, + isReadOnly, + ) + + /** Factory method for creating form widget of type [WIDGET_TYPE_COMBOBOX]. */ + @JvmStatic + public fun createComboBox( + @IntRange(from = 0) widgetIndex: Int, + widgetRect: Rect, + textValue: String?, + accessibilityLabel: String?, + isReadOnly: Boolean, + isEditableText: Boolean, + fontSize: Float, + listItems: List, + ): FormWidgetInfo = + FormWidgetInfo( + WIDGET_TYPE_COMBOBOX, + widgetIndex, + widgetRect, + textValue, + accessibilityLabel, + isReadOnly, + isEditableText, + fontSize = fontSize, + listItems = listItems, + ) + + /** Factory method for creating form widget of type [WIDGET_TYPE_TEXTFIELD]. */ + @JvmStatic + public fun createTextField( + @IntRange(from = 0) widgetIndex: Int, + widgetRect: Rect, + textValue: String?, + accessibilityLabel: String?, + isReadOnly: Boolean, + isEditableText: Boolean, + isMultiLineText: Boolean, + maxLength: Int, + fontSize: Float, + ): FormWidgetInfo = + FormWidgetInfo( + WIDGET_TYPE_TEXTFIELD, + widgetIndex, + widgetRect, + textValue, + accessibilityLabel, + isReadOnly, + isEditableText = isEditableText, + isMultiLineText = isMultiLineText, + maxLength = maxLength, + fontSize = fontSize, + ) + + @JvmStatic + public fun createListBox( + @IntRange(from = 0) widgetIndex: Int, + widgetRect: Rect, + textValue: String?, + accessibilityLabel: String?, + isReadOnly: Boolean, + isMultiSelect: Boolean, + listItems: List, + ): FormWidgetInfo = + FormWidgetInfo( + WIDGET_TYPE_LISTBOX, + widgetIndex, + widgetRect, + textValue, + accessibilityLabel, + isReadOnly, + isMultiSelect = isMultiSelect, + listItems = listItems, + ) + @JvmField public val CREATOR: Parcelable.Creator = object : Parcelable.Creator { diff --git a/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/view/FormFillingTextInputFactory.kt b/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/view/FormFillingTextInputFactory.kt index 3a45bd407609c..95c803b8a2064 100644 --- a/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/view/FormFillingTextInputFactory.kt +++ b/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/view/FormFillingTextInputFactory.kt @@ -66,7 +66,7 @@ internal class FormFillingTextInputFactory(private val context: Context) { ) this.applyLengthFilter(formWidget) gravity = Gravity.CENTER_VERTICAL - inputType = configureInputType(formWidget.multiLineText) + inputType = configureInputType(formWidget.isMultiLineText) configureText(startingText, formWidget, this) imeOptions = DEFAULT_IME_OPTIONS return FormFillingEditText(this, textSize, pageNum, formWidget) @@ -92,7 +92,7 @@ internal class FormFillingTextInputFactory(private val context: Context) { max(MINIMUM_GENERAL_TEXT_FONT_SIZE_PX, formWidget.widgetRect.height().toFloat()) val fontSize = if (abs(formWidget.fontSize) < AUTO_SIZE_THRESHOLD) { - autoFontResize(maxFontSize, formWidget.multiLineText) + autoFontResize(maxFontSize, formWidget.isMultiLineText) } else { min(formWidget.fontSize, maxFontSize) } diff --git a/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/view/FormWidgetInteractionHandler.kt b/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/view/FormWidgetInteractionHandler.kt index 8bfd8bd372bfd..7260224fcebf9 100644 --- a/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/view/FormWidgetInteractionHandler.kt +++ b/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/view/FormWidgetInteractionHandler.kt @@ -49,7 +49,7 @@ internal class FormWidgetInteractionHandler( /** Entry point to handle interaction with the formWidget. */ fun handleInteraction(touchPoint: PdfPoint, formWidgetInfo: FormWidgetInfo) { - if (formWidgetInfo.readOnly) return + if (formWidgetInfo.isReadOnly) return val pageNum = touchPoint.pageNum // switch case to delegate to the appropriate handler @@ -136,7 +136,7 @@ internal class FormWidgetInteractionHandler( pageNum: Int, formWidgetInfo: FormWidgetInfo, ) { - if (formWidgetInfo.multiSelect) { + if (formWidgetInfo.isMultiSelect) { showMultiChoiceSelectMenu(pageNum, formWidgetInfo) } else { showSingleChoiceSelectMenu(pageNum, formWidgetInfo) diff --git a/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/view/Page.kt b/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/view/Page.kt index 901491ded7054..d4f56ade05bed 100644 --- a/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/view/Page.kt +++ b/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/view/Page.kt @@ -260,7 +260,7 @@ internal class Page( if (pdfFormFillingConfig.isFormFillingEnabled()) { formWidgetInfos - ?.filter { !it.readOnly } + ?.filter { !it.isReadOnly } ?.forEach { formWidgetHighlightRect.set(it.widgetRect) formWidgetHighlightRect.offset(locationInView.left, locationInView.top) diff --git a/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/view/PdfView.kt b/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/view/PdfView.kt index 94d6ffebd68ed..8e7d3c6c5da7f 100644 --- a/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/view/PdfView.kt +++ b/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/view/PdfView.kt @@ -2225,7 +2225,7 @@ constructor(context: Context, attrs: AttributeSet? = null, defStyle: Int = 0) : visiblePageAreas.keyIterator().forEach { pageNum -> val editableFormWidgetsInPage = - pageManager?.pages[pageNum]?.formWidgetInfos?.filter { !it.readOnly } + pageManager?.pages[pageNum]?.formWidgetInfos?.filter { !it.isReadOnly } editableFormWidgetsInPage?.forEach { widget -> if (visiblePageAreas.get(pageNum).contains(widget.widgetRect.toRectF())) { diff --git a/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/view/PdfViewAccessibilityManager.kt b/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/view/PdfViewAccessibilityManager.kt index 464a3180168a2..eda708987bde8 100644 --- a/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/view/PdfViewAccessibilityManager.kt +++ b/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/view/PdfViewAccessibilityManager.kt @@ -231,7 +231,7 @@ internal class PdfViewAccessibilityManager( val formWidgetIndex = pair.second pageManager.pages[pageNum].formWidgetIndexToInfoMap?.get(formWidgetIndex)?.let { formWidgetInfo -> - if (formWidgetInfo.readOnly) return true + if (formWidgetInfo.isReadOnly) return true val pdfTouchPoint = PdfPoint( @@ -322,7 +322,7 @@ internal class PdfViewAccessibilityManager( setBoundsInScreenFromBoundsInParent(node, bounds) isFocusable = true } - if (!formWidgetInfo.readOnly) { + if (!formWidgetInfo.isReadOnly) { node.addAction(AccessibilityNodeInfoCompat.ACTION_CLICK) } } diff --git a/pdf/pdf-viewer/src/test/kotlin/androidx/pdf/FakePdfDocument.kt b/pdf/pdf-viewer/src/test/kotlin/androidx/pdf/FakePdfDocument.kt index e0c0e92784f0b..9bf7d96057572 100644 --- a/pdf/pdf-viewer/src/test/kotlin/androidx/pdf/FakePdfDocument.kt +++ b/pdf/pdf-viewer/src/test/kotlin/androidx/pdf/FakePdfDocument.kt @@ -333,8 +333,8 @@ internal open class FakePdfDocument( accessibilityLabel = "ListBox", listItems = listOf(ListItem("Apple", false), ListItem("Banana", false)), - multiSelect = true, - readOnly = true, + isMultiSelect = true, + isReadOnly = true, ) ), ), diff --git a/pdf/pdf-viewer/src/test/kotlin/androidx/pdf/view/FormWidgetInteractionHandlerTest.kt b/pdf/pdf-viewer/src/test/kotlin/androidx/pdf/view/FormWidgetInteractionHandlerTest.kt index 17c993c890a23..aba856737b553 100644 --- a/pdf/pdf-viewer/src/test/kotlin/androidx/pdf/view/FormWidgetInteractionHandlerTest.kt +++ b/pdf/pdf-viewer/src/test/kotlin/androidx/pdf/view/FormWidgetInteractionHandlerTest.kt @@ -76,7 +76,7 @@ class FormWidgetInteractionHandlerTest { widgetRect = Rect(10, 10, 20, 20), textValue = "Hello", accessibilityLabel = "accessible", - readOnly = false, + isReadOnly = false, ) val expectedEditRecord = @@ -107,7 +107,7 @@ class FormWidgetInteractionHandlerTest { widgetRect = Rect(10, 10, 20, 20), textValue = "Radio", accessibilityLabel = "accessible", - readOnly = false, + isReadOnly = false, ) val expectedEditRecord = FormEditInfo.createClick( @@ -136,7 +136,7 @@ class FormWidgetInteractionHandlerTest { widgetRect = Rect(10, 10, 20, 20), textValue = "Push", accessibilityLabel = "accessible", - readOnly = false, + isReadOnly = false, ) val expectedEditRecord = FormEditInfo.createClick( @@ -165,7 +165,7 @@ class FormWidgetInteractionHandlerTest { widgetRect = Rect(10, 10, 20, 20), textValue = "Push", accessibilityLabel = "accessible", - readOnly = false, + isReadOnly = false, ) handler.handleInteraction(touchPoint, formWidgetInfo) assertThat(formEditTextPlaced).isTrue() From 829b9184cae85941536fc53db31f6d944b423c79 Mon Sep 17 00:00:00 2001 From: Kumar Ankit Date: Wed, 7 Jan 2026 16:56:03 +0530 Subject: [PATCH 02/14] Make FormWidgetInfo constructor private and update tests. - Update contentExtensions to utilise the factory methods - Update tests to utilise factory methods - Add some sanitation checks in the factory methods Bug: 471094578 Test: FormWidgetInfoTest Change-Id: I1f07fff8e91ac2fa9b1afa1df3b48ec87d2d4d69 --- .../kotlin/androidx/pdf/PdfFormFillingTest.kt | 30 +- .../androidx/pdf/utils/contentExtensions.kt | 89 +++- .../androidx/pdf/FakeEditablePdfDocument.kt | 7 +- .../fragment/PdfDocumentViewModelTest.kt | 9 +- .../androidx/pdf/view/FakePdfDocument.kt | 7 +- .../pdf/view/PdfViewFormFillingTest.kt | 22 +- .../androidx/pdf/models/FormWidgetInfo.kt | 19 +- .../kotlin/androidx/pdf/FakePdfDocument.kt | 7 +- .../androidx/pdf/models/FormWidgetInfoTest.kt | 426 +++++++----------- .../view/FormWidgetInteractionHandlerTest.kt | 16 +- .../test/kotlin/androidx/pdf/view/PageTest.kt | 16 +- .../pdf/view/PdfFormFillingStateTest.kt | 20 +- .../pdf/view/layout/PageLayoutManagerTest.kt | 4 +- 13 files changed, 315 insertions(+), 357 deletions(-) diff --git a/pdf/pdf-document-service/src/androidTest/kotlin/androidx/pdf/PdfFormFillingTest.kt b/pdf/pdf-document-service/src/androidTest/kotlin/androidx/pdf/PdfFormFillingTest.kt index f399f20c0c526..7e260d2f0e923 100644 --- a/pdf/pdf-document-service/src/androidTest/kotlin/androidx/pdf/PdfFormFillingTest.kt +++ b/pdf/pdf-document-service/src/androidTest/kotlin/androidx/pdf/PdfFormFillingTest.kt @@ -186,8 +186,7 @@ class PdfFormFillingTest { @Test fun getFormWidgetInfosOfType_checkbox_inClickForm() = runTest { val readOnlyCheckBox = - FormWidgetInfo( - widgetType = FormWidgetInfo.WIDGET_TYPE_CHECKBOX, + FormWidgetInfo.createCheckbox( widgetIndex = 0, widgetRect = Rect(135, 30, 155, 50), textValue = "true", @@ -196,8 +195,7 @@ class PdfFormFillingTest { ) val checkBox = - FormWidgetInfo( - widgetType = FormWidgetInfo.WIDGET_TYPE_CHECKBOX, + FormWidgetInfo.createCheckbox( widgetIndex = 1, widgetRect = Rect(135, 70, 155, 90), textValue = "false", @@ -217,8 +215,7 @@ class PdfFormFillingTest { fun applyEdit_clickOnCheckBox() = runTest { val widgetArea = Rect(135, 70, 155, 90) val before = - FormWidgetInfo( - widgetType = FormWidgetInfo.WIDGET_TYPE_CHECKBOX, + FormWidgetInfo.createCheckbox( widgetIndex = 1, widgetRect = widgetArea, textValue = "false", @@ -230,8 +227,7 @@ class PdfFormFillingTest { val editRec = FormEditInfo.createClick(before.widgetIndex, clickPoint = clickPoint) val after = - FormWidgetInfo( - widgetType = FormWidgetInfo.WIDGET_TYPE_CHECKBOX, + FormWidgetInfo.createCheckbox( widgetIndex = 1, widgetRect = widgetArea, textValue = "true", @@ -990,15 +986,14 @@ class PdfFormFillingTest { fontSize: Float, listItems: List, ): FormWidgetInfo { - return FormWidgetInfo( - widgetType = FormWidgetInfo.WIDGET_TYPE_COMBOBOX, + return FormWidgetInfo.createComboBox( widgetIndex = widgetIndex, widgetRect = widgetRect, textValue = textValue, accessibilityLabel = accessibilityLabel, isReadOnly = readOnly, isEditableText = editableText, - fontSize = fontSize.takeIf { it > 0 }, + fontSize = fontSize.takeIf { it > 0 } ?: 0f, listItems = listItems, ) } @@ -1010,8 +1005,7 @@ class PdfFormFillingTest { textValue: String, accessibilityLabel: String, ): FormWidgetInfo { - return FormWidgetInfo( - widgetType = FormWidgetInfo.WIDGET_TYPE_RADIOBUTTON, + return FormWidgetInfo.createRadioButton( widgetIndex = widgetIndex, widgetRect = widgetRect, textValue = textValue, @@ -1029,8 +1023,7 @@ class PdfFormFillingTest { multiSelect: Boolean, listItems: List, ): FormWidgetInfo { - return FormWidgetInfo( - widgetType = FormWidgetInfo.WIDGET_TYPE_LISTBOX, + return FormWidgetInfo.createListBox( widgetIndex = widgetIndex, widgetRect = widgetRect, textValue = textValue, @@ -1052,8 +1045,7 @@ class PdfFormFillingTest { maxLength: Int, fontSize: Float, ): FormWidgetInfo { - return FormWidgetInfo( - widgetType = FormWidgetInfo.WIDGET_TYPE_TEXTFIELD, + return FormWidgetInfo.createTextField( widgetIndex = widgetIndex, widgetRect = widgetRect, textValue = textValue, @@ -1061,8 +1053,8 @@ class PdfFormFillingTest { isReadOnly = readOnly, isEditableText = editableText, isMultiLineText = multiLineText, - maxLength = maxLength.takeIf { it >= 0 }, // Only include if > 0 - fontSize = fontSize.takeIf { it > 0 }, // Only include if > 0 + maxLength = maxLength.takeIf { it >= 0 } ?: 0, // Only include if > 0 + fontSize = fontSize.takeIf { it > 0 } ?: 0f, // Only include if > 0 ) } } diff --git a/pdf/pdf-document-service/src/main/kotlin/androidx/pdf/utils/contentExtensions.kt b/pdf/pdf-document-service/src/main/kotlin/androidx/pdf/utils/contentExtensions.kt index c269d54f1e607..44a41f8ca6ff2 100644 --- a/pdf/pdf-document-service/src/main/kotlin/androidx/pdf/utils/contentExtensions.kt +++ b/pdf/pdf-document-service/src/main/kotlin/androidx/pdf/utils/contentExtensions.kt @@ -105,20 +105,81 @@ public fun android.graphics.pdf.content.PdfPageLinkContent.toContentClass(): Pdf @SuppressLint("WrongConstant") public fun android.graphics.pdf.models.FormWidgetInfo.toContentClass(): FormWidgetInfo = requireSdkExtensionVersion { - FormWidgetInfo( - widgetType, - widgetIndex, - widgetRect, - textValue, - accessibilityLabel, - isReadOnly, - isEditableText, - isMultiSelect, - isMultiLineText, - maxLength = maxLength.takeIf { it != -1 }, - fontSize = fontSize.takeIf { it.toDouble() != 0.0 }, - listItems.map { item -> item.toContentClass() }.takeIf { it.isNotEmpty() }, - ) + return when (widgetType) { + FormWidgetInfo.WIDGET_TYPE_CHECKBOX -> + FormWidgetInfo.createCheckbox( + widgetIndex, + widgetRect, + textValue, + accessibilityLabel, + isReadOnly, + ) + + FormWidgetInfo.WIDGET_TYPE_PUSHBUTTON -> + FormWidgetInfo.createPushButton( + widgetIndex, + widgetRect, + textValue, + accessibilityLabel, + isReadOnly, + ) + + FormWidgetInfo.WIDGET_TYPE_RADIOBUTTON -> + FormWidgetInfo.createRadioButton( + widgetIndex, + widgetRect, + textValue, + accessibilityLabel, + isReadOnly, + ) + + FormWidgetInfo.WIDGET_TYPE_SIGNATURE -> + FormWidgetInfo.createSignature( + widgetIndex, + widgetRect, + textValue, + accessibilityLabel, + isReadOnly, + ) + + FormWidgetInfo.WIDGET_TYPE_COMBOBOX -> + FormWidgetInfo.createComboBox( + widgetIndex, + widgetRect, + textValue, + accessibilityLabel, + isReadOnly, + isEditableText, + fontSize, + listItems.map { item -> item.toContentClass() }, + ) + + FormWidgetInfo.WIDGET_TYPE_TEXTFIELD -> + FormWidgetInfo.createTextField( + widgetIndex, + widgetRect, + textValue, + accessibilityLabel, + isReadOnly, + isEditableText, + isMultiLineText, + maxLength.takeIf { it != -1 } ?: 0, + fontSize, + ) + + FormWidgetInfo.WIDGET_TYPE_LISTBOX -> + FormWidgetInfo.createListBox( + widgetIndex, + widgetRect, + textValue, + accessibilityLabel, + isReadOnly, + isMultiSelect, + listItems.map { item -> item.toContentClass() }, + ) + + else -> throw IllegalArgumentException("Unknown widget type") + } } @RestrictTo(RestrictTo.Scope.LIBRARY) diff --git a/pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/FakeEditablePdfDocument.kt b/pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/FakeEditablePdfDocument.kt index c4cbe26386427..205aa143e6b0f 100644 --- a/pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/FakeEditablePdfDocument.kt +++ b/pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/FakeEditablePdfDocument.kt @@ -339,18 +339,17 @@ internal open class FakeEditablePdfDocument( mapOf( 0 to listOf( - FormWidgetInfo( - widgetType = FormWidgetInfo.Companion.WIDGET_TYPE_RADIOBUTTON, + FormWidgetInfo.createRadioButton( widgetIndex = 0, widgetRect = Rect(50, 500, 100, 600), textValue = "false", accessibilityLabel = "Radio", + isReadOnly = false, ) ), 1 to listOf( - FormWidgetInfo( - widgetType = FormWidgetInfo.Companion.WIDGET_TYPE_LISTBOX, + FormWidgetInfo.createListBox( widgetIndex = 0, widgetRect = Rect(50, 400, 100, 550), textValue = "Banana", diff --git a/pdf/pdf-viewer-fragment/src/androidTest/kotlin/androidx/pdf/viewer/fragment/PdfDocumentViewModelTest.kt b/pdf/pdf-viewer-fragment/src/androidTest/kotlin/androidx/pdf/viewer/fragment/PdfDocumentViewModelTest.kt index 9c3a1dd2833ed..2c64496894f8f 100644 --- a/pdf/pdf-viewer-fragment/src/androidTest/kotlin/androidx/pdf/viewer/fragment/PdfDocumentViewModelTest.kt +++ b/pdf/pdf-viewer-fragment/src/androidTest/kotlin/androidx/pdf/viewer/fragment/PdfDocumentViewModelTest.kt @@ -364,8 +364,7 @@ class PdfDocumentViewModelTest { val document = (loadedState as PdfFragmentUiState.DocumentLoaded).pdfDocument val formWidgetInfos = document.getFormWidgetInfos(0) val expectedFormWidgetInfoIndex1 = - FormWidgetInfo( - widgetType = FormWidgetInfo.WIDGET_TYPE_CHECKBOX, + FormWidgetInfo.createCheckbox( widgetIndex = 1, widgetRect = Rect(135, 70, 155, 90), textValue = "true", @@ -373,8 +372,7 @@ class PdfDocumentViewModelTest { isReadOnly = false, ) val expectedFormWidgetInfoIndex5 = - FormWidgetInfo( - widgetType = FormWidgetInfo.WIDGET_TYPE_RADIOBUTTON, + FormWidgetInfo.createRadioButton( widgetIndex = 5, widgetRect = Rect(85, 230, 105, 250), textValue = "true", @@ -382,8 +380,7 @@ class PdfDocumentViewModelTest { isReadOnly = false, ) val expectedFormWidgetInfoIndex7 = - FormWidgetInfo( - widgetType = FormWidgetInfo.WIDGET_TYPE_RADIOBUTTON, + FormWidgetInfo.createRadioButton( widgetIndex = 7, widgetRect = Rect(185, 230, 205, 250), textValue = "false", diff --git a/pdf/pdf-viewer/src/androidTest/kotlin/androidx/pdf/view/FakePdfDocument.kt b/pdf/pdf-viewer/src/androidTest/kotlin/androidx/pdf/view/FakePdfDocument.kt index 26ba88e37a482..5e8dd9c8d4d55 100644 --- a/pdf/pdf-viewer/src/androidTest/kotlin/androidx/pdf/view/FakePdfDocument.kt +++ b/pdf/pdf-viewer/src/androidTest/kotlin/androidx/pdf/view/FakePdfDocument.kt @@ -337,18 +337,17 @@ internal open class FakePdfDocument( mapOf( 0 to listOf( - FormWidgetInfo( - widgetType = FormWidgetInfo.WIDGET_TYPE_RADIOBUTTON, + FormWidgetInfo.createRadioButton( widgetIndex = 0, widgetRect = Rect(50, 500, 100, 600), textValue = "false", accessibilityLabel = "Radio", + isReadOnly = false, ) ), 1 to listOf( - FormWidgetInfo( - widgetType = FormWidgetInfo.WIDGET_TYPE_LISTBOX, + FormWidgetInfo.createListBox( widgetIndex = 0, widgetRect = Rect(50, 400, 100, 550), textValue = "Banana", diff --git a/pdf/pdf-viewer/src/androidTest/kotlin/androidx/pdf/view/PdfViewFormFillingTest.kt b/pdf/pdf-viewer/src/androidTest/kotlin/androidx/pdf/view/PdfViewFormFillingTest.kt index 0f74cfdc5a929..44db29371f9b3 100644 --- a/pdf/pdf-viewer/src/androidTest/kotlin/androidx/pdf/view/PdfViewFormFillingTest.kt +++ b/pdf/pdf-viewer/src/androidTest/kotlin/androidx/pdf/view/PdfViewFormFillingTest.kt @@ -108,12 +108,12 @@ class PdfViewFormFillingTest { mapOf( 0 to listOf( - FormWidgetInfo( - widgetType = FormWidgetInfo.WIDGET_TYPE_RADIOBUTTON, + FormWidgetInfo.createRadioButton( widgetIndex = 0, widgetRect = Rect(10, 10, 100, 100), textValue = "TextField", accessibilityLabel = "TextField", + isReadOnly = false, ) ) ), @@ -241,14 +241,16 @@ class PdfViewFormFillingTest { mapOf( 0 to listOf( - FormWidgetInfo( - widgetType = FormWidgetInfo.WIDGET_TYPE_TEXTFIELD, + FormWidgetInfo.createTextField( widgetIndex = 0, widgetRect = Rect(10, 10, 200, 200), textValue = "Hello", accessibilityLabel = "Hello", + isReadOnly = false, isMultiLineText = false, fontSize = 10.0f, + isEditableText = true, + maxLength = 100, ) ) ), @@ -295,22 +297,22 @@ class PdfViewFormFillingTest { mapOf( 0 to listOf( - FormWidgetInfo( - widgetType = FormWidgetInfo.WIDGET_TYPE_RADIOBUTTON, + FormWidgetInfo.createRadioButton( widgetIndex = 0, widgetRect = Rect(10, 10, 100, 100), textValue = "TextField", accessibilityLabel = "TextField", + isReadOnly = false, ) ), 1 to listOf( - FormWidgetInfo( - widgetType = FormWidgetInfo.WIDGET_TYPE_RADIOBUTTON, + FormWidgetInfo.createRadioButton( widgetIndex = 0, widgetRect = Rect(10, 10, 100, 100), textValue = "true", accessibilityLabel = "Radio", + isReadOnly = false, ) ), ), @@ -345,12 +347,12 @@ class PdfViewFormFillingTest { val choices = listOf(ListItem("Apple", false), ListItem("Banana", true), ListItem("Cherry", false)) return listOf( - FormWidgetInfo( - widgetType = FormWidgetInfo.WIDGET_TYPE_LISTBOX, + FormWidgetInfo.createListBox( widgetIndex = 0, widgetRect = Rect(10, 10, 100, 100), textValue = "Banana", accessibilityLabel = "ListBox", + isReadOnly = false, listItems = choices, isMultiSelect = multiselect, ) diff --git a/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/models/FormWidgetInfo.kt b/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/models/FormWidgetInfo.kt index d652d27328d1d..02ee4478b3035 100644 --- a/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/models/FormWidgetInfo.kt +++ b/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/models/FormWidgetInfo.kt @@ -20,6 +20,7 @@ import android.annotation.SuppressLint import android.graphics.Rect import android.os.Parcel import android.os.Parcelable +import androidx.annotation.FloatRange import androidx.annotation.IntDef import androidx.annotation.IntRange import androidx.annotation.RestrictTo @@ -35,7 +36,8 @@ import java.util.Objects */ @SuppressLint("BanParcelableUsage") @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) -public class FormWidgetInfo( +public class FormWidgetInfo +private constructor( /** The [WidgetType] of this widget */ @WidgetType public val widgetType: Int, /** The index of this widget among all form widgets on the page */ @@ -92,6 +94,7 @@ public class FormWidgetInfo( init { require(widgetIndex >= 0) { "widgetIndex must be non-negative" } + require(fontSize >= 0f) { "fontSize must be non-negative" } } private constructor( @@ -278,7 +281,7 @@ public class FormWidgetInfo( accessibilityLabel: String?, isReadOnly: Boolean, isEditableText: Boolean, - fontSize: Float, + @FloatRange(from = 0.0) fontSize: Float, listItems: List, ): FormWidgetInfo = FormWidgetInfo( @@ -303,10 +306,13 @@ public class FormWidgetInfo( isReadOnly: Boolean, isEditableText: Boolean, isMultiLineText: Boolean, - maxLength: Int, - fontSize: Float, - ): FormWidgetInfo = - FormWidgetInfo( + @IntRange(from = 0) maxLength: Int, + @FloatRange(from = 0.0) fontSize: Float, + ): FormWidgetInfo { + require(maxLength >= 0) + require(fontSize >= 0) + + return FormWidgetInfo( WIDGET_TYPE_TEXTFIELD, widgetIndex, widgetRect, @@ -318,6 +324,7 @@ public class FormWidgetInfo( maxLength = maxLength, fontSize = fontSize, ) + } @JvmStatic public fun createListBox( diff --git a/pdf/pdf-viewer/src/test/kotlin/androidx/pdf/FakePdfDocument.kt b/pdf/pdf-viewer/src/test/kotlin/androidx/pdf/FakePdfDocument.kt index 9bf7d96057572..172ee6b65bc90 100644 --- a/pdf/pdf-viewer/src/test/kotlin/androidx/pdf/FakePdfDocument.kt +++ b/pdf/pdf-viewer/src/test/kotlin/androidx/pdf/FakePdfDocument.kt @@ -315,18 +315,17 @@ internal open class FakePdfDocument( mapOf( 0 to listOf( - FormWidgetInfo( - widgetType = FormWidgetInfo.WIDGET_TYPE_RADIOBUTTON, + FormWidgetInfo.createRadioButton( widgetIndex = 0, widgetRect = Rect(50, 500, 100, 600), textValue = "false", accessibilityLabel = "Radio", + false, ) ), 1 to listOf( - FormWidgetInfo( - widgetType = FormWidgetInfo.WIDGET_TYPE_LISTBOX, + FormWidgetInfo.createListBox( widgetIndex = 0, widgetRect = Rect(50, 400, 100, 550), textValue = "Banana", diff --git a/pdf/pdf-viewer/src/test/kotlin/androidx/pdf/models/FormWidgetInfoTest.kt b/pdf/pdf-viewer/src/test/kotlin/androidx/pdf/models/FormWidgetInfoTest.kt index 2d808896d6796..8850b944cbf89 100644 --- a/pdf/pdf-viewer/src/test/kotlin/androidx/pdf/models/FormWidgetInfoTest.kt +++ b/pdf/pdf-viewer/src/test/kotlin/androidx/pdf/models/FormWidgetInfoTest.kt @@ -47,15 +47,14 @@ class FormWidgetInfoTest { val fontSize = 12.0f val widgetInfo = - FormWidgetInfo( - widgetType, + FormWidgetInfo.createTextField( widgetIndex, widgetRect, textValue, accessibilityLabel, readOnly, editableText, - multiLineText = multiLineText, + isMultiLineText = multiLineText, maxLength = maxLength, fontSize = fontSize, ) @@ -65,10 +64,10 @@ class FormWidgetInfoTest { assertEquals(widgetRect, widgetInfo.widgetRect) assertEquals(textValue, widgetInfo.textValue) assertEquals(accessibilityLabel, widgetInfo.accessibilityLabel) - assertEquals(readOnly, widgetInfo.readOnly) - assertEquals(editableText, widgetInfo.editableText) - assertFalse(widgetInfo.multiSelect) - assertEquals(multiLineText, widgetInfo.multiLineText) + assertEquals(readOnly, widgetInfo.isReadOnly) + assertEquals(editableText, widgetInfo.isEditableText) + assertFalse(widgetInfo.isMultiSelect) + assertEquals(multiLineText, widgetInfo.isMultiLineText) assertEquals(maxLength, widgetInfo.maxLength) assertEquals(fontSize, widgetInfo.fontSize, 0.0f) assertEquals(0, widgetInfo.listItems.size) @@ -84,12 +83,13 @@ class FormWidgetInfoTest { val listItems = listOf(ListItem("Option 1", true), ListItem("Option 2", false)) val widgetInfo = - FormWidgetInfo( - widgetType, + FormWidgetInfo.createListBox( widgetIndex, widgetRect, textValue, accessibilityLabel, + false, + isMultiSelect = false, listItems = listItems, ) assertEquals(widgetType, widgetInfo.widgetType) @@ -99,25 +99,25 @@ class FormWidgetInfoTest { @Test fun formWidgetInfo_textField_writeToParcelAndCreateFromParcel_equals() { - val widgetType = FormWidgetInfo.WIDGET_TYPE_TEXTFIELD val widgetIndex = 1 val widgetRect = Rect(10, 10, 110, 60) val textValue = "Initial Text" val accessibilityLabel = "Combo Box Label" val readOnly = true val editableText = true + val multiLineText = false val maxLength = 20 val fontSize = 14.0f val originalWidgetInfo = - FormWidgetInfo( - widgetType, + FormWidgetInfo.createTextField( widgetIndex, widgetRect, textValue, accessibilityLabel, readOnly, editableText, + multiLineText, maxLength = maxLength, fontSize = fontSize, ) @@ -134,14 +134,28 @@ class FormWidgetInfoTest { @Test fun formWidgetInfo_radioButton_writeToParcelAndCreateFromParcel_equals() { - val widgetType = FormWidgetInfo.WIDGET_TYPE_TEXTFIELD val widgetIndex = 1 val widgetRect = Rect(10, 10, 110, 60) val textValue = "Initial Text" val accessibilityLabel = "TextField Label" + val readOnly = true + val editableText = true + val multiLineText = false + val maxLength = 20 + val fontSize = 14.0f val originalWidgetInfo = - FormWidgetInfo(widgetType, widgetIndex, widgetRect, textValue, accessibilityLabel) + FormWidgetInfo.createTextField( + widgetIndex, + widgetRect, + textValue, + accessibilityLabel, + readOnly, + editableText, + multiLineText, + maxLength, + fontSize, + ) val parcel = Parcel.obtain() originalWidgetInfo.writeToParcel(parcel, 0) @@ -155,20 +169,24 @@ class FormWidgetInfoTest { @Test fun formWidgetInfo_combobox_writeToParcelAndCreateFromParcel_equals() { - val widgetType = FormWidgetInfo.WIDGET_TYPE_COMBOBOX val widgetIndex = 1 val widgetRect = Rect(10, 10, 110, 60) val textValue = "Initial Text" val accessibilityLabel = "TextField Label" val listItems = listOf(ListItem("Option 1", true), ListItem("Option 2", false)) + val readOnly = false + val isEditableText = true + val fontSize = 10f val originalWidgetInfo = - FormWidgetInfo( - widgetType, + FormWidgetInfo.createComboBox( widgetIndex, widgetRect, textValue, accessibilityLabel, + readOnly, + isEditableText, + fontSize, listItems = listItems, ) @@ -184,34 +202,53 @@ class FormWidgetInfoTest { @Test fun formWidgetInfo_equals_sameObject_returnsTrue() { + val widgetIndex = 0 + val widgetRect = Rect(0, 0, 100, 50) + val textValue = "Test Text" + val accessibilityLabel = "Test Label" + val listItems = listOf(ListItem("Option 1", true), ListItem("Option 2", false)) + val widgetInfo = - FormWidgetInfo( - FormWidgetInfo.WIDGET_TYPE_CHECKBOX, - 0, - Rect(0, 0, 100, 50), - "Text", - "Label", + FormWidgetInfo.createListBox( + widgetIndex, + widgetRect, + textValue, + accessibilityLabel, + false, + isMultiSelect = false, + listItems = listItems, ) + assertEquals(widgetInfo, widgetInfo) } @Test fun formWidgetInfo_equals_sameValues_returnsTrue() { + val widgetIndex = 0 + val widgetRect = Rect(0, 0, 100, 50) + val textValue = "Test Text" + val accessibilityLabel = "Test Label" + val listItems = listOf(ListItem("Option 1", true), ListItem("Option 2", false)) + val widgetInfo1 = - FormWidgetInfo( - FormWidgetInfo.WIDGET_TYPE_PUSHBUTTON, - 0, - Rect(0, 0, 100, 50), - "Text", - "Label", + FormWidgetInfo.createListBox( + widgetIndex, + widgetRect, + textValue, + accessibilityLabel, + false, + isMultiSelect = false, + listItems = listItems, ) val widgetInfo2 = - FormWidgetInfo( - FormWidgetInfo.WIDGET_TYPE_PUSHBUTTON, - 0, - Rect(0, 0, 100, 50), - "Text", - "Label", + FormWidgetInfo.createListBox( + widgetIndex, + widgetRect, + textValue, + accessibilityLabel, + false, + isMultiSelect = false, + listItems = listItems, ) assertEquals(widgetInfo1, widgetInfo2) } @@ -219,85 +256,47 @@ class FormWidgetInfoTest { @Test fun formWidgetInfo_equals_differentWidgetType_returnsFalse() { val widgetInfo1 = - FormWidgetInfo( - FormWidgetInfo.WIDGET_TYPE_CHECKBOX, - 0, - Rect(0, 0, 100, 50), - "Text", - "Label", - ) + FormWidgetInfo.createCheckbox(0, Rect(0, 0, 100, 50), "Text", "Label", false) val widgetInfo2 = - FormWidgetInfo( - FormWidgetInfo.WIDGET_TYPE_RADIOBUTTON, - 0, - Rect(0, 0, 100, 50), - "Text", - "Label", - ) + FormWidgetInfo.createRadioButton(0, Rect(0, 0, 100, 50), "Text", "Label", false) assertNotEquals(widgetInfo1, widgetInfo2) } @Test fun formWidgetInfo_equals_differentWidgetIndex_returnsFalse() { val widgetInfo1 = - FormWidgetInfo( - FormWidgetInfo.WIDGET_TYPE_CHECKBOX, - 0, - Rect(0, 0, 100, 50), - "Text", - "Label", - ) + FormWidgetInfo.createCheckbox(0, Rect(0, 0, 100, 50), "Text", "Label", false) val widgetInfo2 = - FormWidgetInfo( - FormWidgetInfo.WIDGET_TYPE_CHECKBOX, - 1, - Rect(0, 0, 100, 50), - "Text", - "Label", - ) + FormWidgetInfo.createCheckbox(1, Rect(0, 0, 100, 50), "Text", "Label", false) assertNotEquals(widgetInfo1, widgetInfo2) } @Test fun formWidgetInfo_equals_differentWidgetRect_returnsFalse() { val widgetInfo1 = - FormWidgetInfo( - FormWidgetInfo.WIDGET_TYPE_CHECKBOX, - 0, - Rect(0, 0, 100, 50), - "Text", - "Label", - ) + FormWidgetInfo.createCheckbox(0, Rect(0, 0, 100, 50), "Text", "Label", false) val widgetInfo2 = - FormWidgetInfo( - FormWidgetInfo.WIDGET_TYPE_CHECKBOX, - 0, - Rect(10, 10, 110, 60), - "Text", - "Label", - ) + FormWidgetInfo.createCheckbox(0, Rect(10, 10, 110, 60), "Text", "Label", false) assertNotEquals(widgetInfo1, widgetInfo2) } @Test fun formWidgetInfo_equals_differentReadOnly_returnsFalse() { val widgetInfo1 = - FormWidgetInfo( - FormWidgetInfo.WIDGET_TYPE_CHECKBOX, + FormWidgetInfo.createCheckbox( 0, Rect(0, 0, 100, 50), "Text", "Label", - readOnly = false, + isReadOnly = false, ) val widgetInfo2 = - FormWidgetInfo( - FormWidgetInfo.WIDGET_TYPE_CHECKBOX, + FormWidgetInfo.createCheckbox( 0, Rect(0, 0, 100, 50), "Text", "Label", - readOnly = true, + isReadOnly = true, ) assertNotEquals(widgetInfo1, widgetInfo2) } @@ -305,64 +304,44 @@ class FormWidgetInfoTest { @Test fun formWidgetInfo_equals_differentTextValue_returnsFalse() { val widgetInfo1 = - FormWidgetInfo( - FormWidgetInfo.WIDGET_TYPE_CHECKBOX, - 0, - Rect(0, 0, 100, 50), - "Text1", - "Label", - ) + FormWidgetInfo.createCheckbox(0, Rect(0, 0, 100, 50), "Text1", "Label", false) val widgetInfo2 = - FormWidgetInfo( - FormWidgetInfo.WIDGET_TYPE_CHECKBOX, - 0, - Rect(0, 0, 100, 50), - "Text2", - "Label", - ) + FormWidgetInfo.createCheckbox(0, Rect(0, 0, 100, 50), "Text2", "Label", false) assertNotEquals(widgetInfo1, widgetInfo2) } @Test fun formWidgetInfo_equals_differentAccessibilityLabel_returnsFalse() { val widgetInfo1 = - FormWidgetInfo( - FormWidgetInfo.WIDGET_TYPE_CHECKBOX, - 0, - Rect(0, 0, 100, 50), - "Text", - "Label1", - ) + FormWidgetInfo.createCheckbox(0, Rect(0, 0, 100, 50), "Text", "Label1", false) val widgetInfo2 = - FormWidgetInfo( - FormWidgetInfo.WIDGET_TYPE_CHECKBOX, - 0, - Rect(0, 0, 100, 50), - "Text", - "Label2", - ) + FormWidgetInfo.createCheckbox(0, Rect(0, 0, 100, 50), "Text", "Label2", false) assertNotEquals(widgetInfo1, widgetInfo2) } @Test fun formWidgetInfo_equals_differentEditableText_returnsFalse() { val widgetInfo1 = - FormWidgetInfo( - FormWidgetInfo.WIDGET_TYPE_COMBOBOX, + FormWidgetInfo.createComboBox( 0, Rect(0, 0, 100, 50), "Text", "Label", - editableText = false, + isReadOnly = false, + isEditableText = false, + fontSize = 10f, + listItems = emptyList(), ) val widgetInfo2 = - FormWidgetInfo( - FormWidgetInfo.WIDGET_TYPE_COMBOBOX, + FormWidgetInfo.createComboBox( 0, Rect(0, 0, 100, 50), "Text", "Label", - editableText = true, + false, + isEditableText = true, + fontSize = 10f, + listItems = emptyList(), ) assertNotEquals(widgetInfo1, widgetInfo2) } @@ -370,22 +349,24 @@ class FormWidgetInfoTest { @Test fun formWidgetInfo_equals_differentMultiSelect_returnsFalse() { val widgetInfo1 = - FormWidgetInfo( - FormWidgetInfo.WIDGET_TYPE_LISTBOX, + FormWidgetInfo.createListBox( 0, Rect(0, 0, 100, 50), "Text", "Label", - multiSelect = false, + isReadOnly = false, + isMultiSelect = false, + listItems = listOf(ListItem("Apple", false)), ) val widgetInfo2 = - FormWidgetInfo( - FormWidgetInfo.WIDGET_TYPE_LISTBOX, + FormWidgetInfo.createListBox( 0, Rect(0, 0, 100, 50), "Text", "Label", - multiSelect = true, + isReadOnly = false, + isMultiSelect = true, + listItems = listOf(ListItem("Apple", false)), ) assertNotEquals(widgetInfo1, widgetInfo2) } @@ -393,22 +374,28 @@ class FormWidgetInfoTest { @Test fun formWidgetInfo_equals_differentMultiLineText_returnsFalse() { val widgetInfo1 = - FormWidgetInfo( - FormWidgetInfo.WIDGET_TYPE_TEXTFIELD, + FormWidgetInfo.createTextField( 0, Rect(0, 0, 100, 50), "Text", "Label", - multiLineText = false, + isReadOnly = false, + isEditableText = true, + isMultiLineText = false, + maxLength = 10, + fontSize = 12.0f, ) val widgetInfo2 = - FormWidgetInfo( - FormWidgetInfo.WIDGET_TYPE_TEXTFIELD, + FormWidgetInfo.createTextField( 0, Rect(0, 0, 100, 50), "Text", "Label", - multiLineText = true, + isReadOnly = false, + isEditableText = true, + isMultiLineText = true, + maxLength = 10, + fontSize = 12.0f, ) assertNotEquals(widgetInfo1, widgetInfo2) } @@ -416,22 +403,28 @@ class FormWidgetInfoTest { @Test fun formWidgetInfo_equals_differentMaxLength_returnsFalse() { val widgetInfo1 = - FormWidgetInfo( - FormWidgetInfo.WIDGET_TYPE_TEXTFIELD, + FormWidgetInfo.createTextField( 0, Rect(0, 0, 100, 50), "Text", "Label", + isReadOnly = false, + isEditableText = false, + isMultiLineText = false, maxLength = 10, + fontSize = 12.0f, ) val widgetInfo2 = - FormWidgetInfo( - FormWidgetInfo.WIDGET_TYPE_TEXTFIELD, + FormWidgetInfo.createTextField( 0, Rect(0, 0, 100, 50), "Text", "Label", + isReadOnly = false, + isEditableText = false, + isMultiLineText = false, maxLength = 20, + fontSize = 12.0f, ) assertNotEquals(widgetInfo1, widgetInfo2) } @@ -439,21 +432,27 @@ class FormWidgetInfoTest { @Test fun formWidgetInfo_equals_differentFontSize_returnsFalse() { val widgetInfo1 = - FormWidgetInfo( - FormWidgetInfo.WIDGET_TYPE_TEXTFIELD, + FormWidgetInfo.createTextField( 0, Rect(0, 0, 100, 50), "Text", "Label", + isReadOnly = false, + isEditableText = false, + isMultiLineText = false, + maxLength = 10, fontSize = 12.0f, ) val widgetInfo2 = - FormWidgetInfo( - FormWidgetInfo.WIDGET_TYPE_TEXTFIELD, + FormWidgetInfo.createTextField( 0, Rect(0, 0, 100, 50), "Text", "Label", + isReadOnly = false, + isEditableText = false, + isMultiLineText = false, + maxLength = 10, fontSize = 14.0f, ) assertNotEquals(widgetInfo1, widgetInfo2) @@ -462,22 +461,24 @@ class FormWidgetInfoTest { @Test fun formWidgetInfo_equals_differentListItems_returnsFalse() { val widgetInfo1 = - FormWidgetInfo( - FormWidgetInfo.WIDGET_TYPE_COMBOBOX, + FormWidgetInfo.createComboBox( 0, Rect(0, 0, 100, 50), "Text", "Label", + isReadOnly = false, + isEditableText = false, fontSize = 10.5f, listItems = listOf(ListItem("Option 1", true)), ) val widgetInfo2 = - FormWidgetInfo( - FormWidgetInfo.WIDGET_TYPE_COMBOBOX, + FormWidgetInfo.createComboBox( 0, Rect(0, 0, 100, 50), "Text", "Label", + isReadOnly = false, + isEditableText = false, fontSize = 10.5f, listItems = listOf(ListItem("Option 2", false)), ) @@ -487,13 +488,7 @@ class FormWidgetInfoTest { @Test fun formWidgetInfo_equals_differentClass_returnsFalse() { val widgetInfo = - FormWidgetInfo( - FormWidgetInfo.WIDGET_TYPE_CHECKBOX, - 0, - Rect(0, 0, 100, 50), - "Text", - "Label", - ) + FormWidgetInfo.createCheckbox(0, Rect(0, 0, 100, 50), "Text", "Label", false) val other = "Not a FormWidgetInfo" assertNotEquals(widgetInfo, other) } @@ -501,55 +496,30 @@ class FormWidgetInfoTest { @Test fun formWidgetInfo_equals_null_returnsFalse() { val widgetInfo = - FormWidgetInfo( - FormWidgetInfo.WIDGET_TYPE_CHECKBOX, - 0, - Rect(0, 0, 100, 50), - "Text", - "Label", - ) + FormWidgetInfo.createCheckbox(0, Rect(0, 0, 100, 50), "Text", "Label", false) assertNotEquals(widgetInfo, null) } @Test fun formWidgetInfo_hashCode_equalObjects_equalHashCodes() { val widgetInfo1 = - FormWidgetInfo( - FormWidgetInfo.WIDGET_TYPE_CHECKBOX, - 0, - Rect(0, 0, 100, 50), - "Text", - "Label", - ) + FormWidgetInfo.createCheckbox(0, Rect(0, 0, 100, 50), "Text", "Label", false) val widgetInfo2 = - FormWidgetInfo( - FormWidgetInfo.WIDGET_TYPE_CHECKBOX, - 0, - Rect(0, 0, 100, 50), - "Text", - "Label", - ) + FormWidgetInfo.createCheckbox(0, Rect(0, 0, 100, 50), "Text", "Label", false) assertEquals(widgetInfo1.hashCode(), widgetInfo2.hashCode()) } @Test fun formWidgetInfo_hashCode_differentObjects_differentHashCodes() { val widgetInfo1 = - FormWidgetInfo( - FormWidgetInfo.WIDGET_TYPE_CHECKBOX, - 0, - Rect(0, 0, 100, 50), - "Text", - "Label", - ) + FormWidgetInfo.createCheckbox(0, Rect(0, 0, 100, 50), "Text", "Label", false) val widgetInfo2 = - FormWidgetInfo( - FormWidgetInfo.WIDGET_TYPE_RADIOBUTTON, + FormWidgetInfo.createRadioButton( 1, Rect(10, 10, 110, 60), "Other Text", "Other Label", - readOnly = true, + isReadOnly = true, ) assertNotEquals(widgetInfo1.hashCode(), widgetInfo2.hashCode()) } @@ -557,13 +527,7 @@ class FormWidgetInfoTest { @Test fun formWidgetInfo_describeContents_returnsZero() { val widgetInfo = - FormWidgetInfo( - FormWidgetInfo.WIDGET_TYPE_CHECKBOX, - 0, - Rect(0, 0, 100, 50), - "Text", - "Label", - ) + FormWidgetInfo.createCheckbox(0, Rect(0, 0, 100, 50), "Text", "Label", false) assertEquals(0, widgetInfo.describeContents()) } @@ -574,99 +538,33 @@ class FormWidgetInfoTest { assertEquals(size, array.size) } - @Test(expected = IllegalArgumentException::class) - fun formWidgetInfo_editableTextNotComboboxOrTextField_throwsException() { - FormWidgetInfo( - FormWidgetInfo.WIDGET_TYPE_RADIOBUTTON, - 0, - Rect(0, 0, 100, 50), - "Text", - "Label", - editableText = true, - ) - } - - @Test(expected = IllegalArgumentException::class) - fun formWidgetInfo_multiSelectNotListbox_throwsException() { - FormWidgetInfo( - FormWidgetInfo.WIDGET_TYPE_RADIOBUTTON, - 0, - Rect(0, 0, 100, 50), - "Text", - "Label", - multiSelect = true, - ) - } - - @Test(expected = IllegalArgumentException::class) - fun formWidgetInfo_multiLineTextNotTextField_throwsException() { - FormWidgetInfo( - FormWidgetInfo.WIDGET_TYPE_RADIOBUTTON, - 0, - Rect(0, 0, 100, 50), - "Text", - "Label", - multiLineText = true, - ) - } - - @Test(expected = IllegalArgumentException::class) - fun formWidgetInfo_maxLengthNotTextField_throwsException() { - FormWidgetInfo( - FormWidgetInfo.WIDGET_TYPE_RADIOBUTTON, - 0, - Rect(0, 0, 100, 50), - "Text", - "Label", - maxLength = 10, - ) - } - - @Test(expected = IllegalArgumentException::class) - fun formWidgetInfo_fontSizeNotComboboxOrTextField_throwsException() { - FormWidgetInfo( - FormWidgetInfo.WIDGET_TYPE_RADIOBUTTON, - 0, - Rect(0, 0, 100, 50), - "Text", - "Label", - fontSize = 10f, - ) - } - - @Test(expected = IllegalArgumentException::class) - fun formWidgetInfo_listItemsNotComboboxOrListbox_throwsException() { - FormWidgetInfo( - FormWidgetInfo.WIDGET_TYPE_RADIOBUTTON, - 0, - Rect(0, 0, 100, 50), - "Text", - "Label", - listItems = listOf(ListItem("Option 1", true)), - ) - } - @Test(expected = IllegalArgumentException::class) fun formWidgetInfo_invalidMaxLength_throwsException() { - FormWidgetInfo( - FormWidgetInfo.WIDGET_TYPE_TEXTFIELD, + FormWidgetInfo.createTextField( 0, Rect(0, 0, 100, 50), "Text", "Label", - maxLength = 0, + isReadOnly = false, + isEditableText = false, + isMultiLineText = false, + maxLength = -10, + fontSize = 1f, ) } @Test(expected = IllegalArgumentException::class) fun formWidgetInfo_invalidFontSize_throwsException() { - FormWidgetInfo( - FormWidgetInfo.WIDGET_TYPE_TEXTFIELD, + FormWidgetInfo.createTextField( 0, Rect(0, 0, 100, 50), "Text", "Label", - fontSize = 0f, + isReadOnly = false, + isEditableText = false, + isMultiLineText = false, + maxLength = 10, + fontSize = -1f, ) } } diff --git a/pdf/pdf-viewer/src/test/kotlin/androidx/pdf/view/FormWidgetInteractionHandlerTest.kt b/pdf/pdf-viewer/src/test/kotlin/androidx/pdf/view/FormWidgetInteractionHandlerTest.kt index aba856737b553..426d671955f79 100644 --- a/pdf/pdf-viewer/src/test/kotlin/androidx/pdf/view/FormWidgetInteractionHandlerTest.kt +++ b/pdf/pdf-viewer/src/test/kotlin/androidx/pdf/view/FormWidgetInteractionHandlerTest.kt @@ -70,8 +70,7 @@ class FormWidgetInteractionHandlerTest { val touchPoint = PdfPoint(pageNum, pdfCoordinates) val widgetIndex = 0 val formWidgetInfo = - FormWidgetInfo( - widgetType = FormWidgetInfo.WIDGET_TYPE_CHECKBOX, + FormWidgetInfo.createCheckbox( widgetIndex = widgetIndex, widgetRect = Rect(10, 10, 20, 20), textValue = "Hello", @@ -101,8 +100,7 @@ class FormWidgetInteractionHandlerTest { val widgetIndex = 0 val formWidgetInfo = - FormWidgetInfo( - widgetType = FormWidgetInfo.WIDGET_TYPE_RADIOBUTTON, + FormWidgetInfo.createRadioButton( widgetIndex = widgetIndex, widgetRect = Rect(10, 10, 20, 20), textValue = "Radio", @@ -130,8 +128,7 @@ class FormWidgetInteractionHandlerTest { val touchPoint = PdfPoint(pageNum, pdfCoordinates) val widgetIndex = 0 val formWidgetInfo = - FormWidgetInfo( - widgetType = FormWidgetInfo.WIDGET_TYPE_PUSHBUTTON, + FormWidgetInfo.createPushButton( widgetIndex = widgetIndex, widgetRect = Rect(10, 10, 20, 20), textValue = "Push", @@ -159,13 +156,16 @@ class FormWidgetInteractionHandlerTest { val touchPoint = PdfPoint(pageNum, pdfCoordinates) val widgetIndex = 0 val formWidgetInfo = - FormWidgetInfo( - widgetType = FormWidgetInfo.WIDGET_TYPE_TEXTFIELD, + FormWidgetInfo.createTextField( widgetIndex = widgetIndex, widgetRect = Rect(10, 10, 20, 20), textValue = "Push", accessibilityLabel = "accessible", isReadOnly = false, + isEditableText = true, + isMultiLineText = false, + maxLength = 10, + fontSize = 10f, ) handler.handleInteraction(touchPoint, formWidgetInfo) assertThat(formEditTextPlaced).isTrue() diff --git a/pdf/pdf-viewer/src/test/kotlin/androidx/pdf/view/PageTest.kt b/pdf/pdf-viewer/src/test/kotlin/androidx/pdf/view/PageTest.kt index 8fbcbc5626d79..e20ec17d255d9 100644 --- a/pdf/pdf-viewer/src/test/kotlin/androidx/pdf/view/PageTest.kt +++ b/pdf/pdf-viewer/src/test/kotlin/androidx/pdf/view/PageTest.kt @@ -91,19 +91,19 @@ class PageTest { isAccessibilityEnabled = true, formWidgetInfos = listOf( - FormWidgetInfo( + FormWidgetInfo.createRadioButton( widgetIndex = 0, - widgetType = FormWidgetInfo.WIDGET_TYPE_RADIOBUTTON, widgetRect = Rect(10, 10, 20, 20), textValue = "true", accessibilityLabel = "radio", + isReadOnly = false, ), - FormWidgetInfo( + FormWidgetInfo.createRadioButton( widgetIndex = 0, - widgetType = FormWidgetInfo.WIDGET_TYPE_RADIOBUTTON, widgetRect = Rect(10, 10, 20, 20), textValue = "false", accessibilityLabel = "radio", + isReadOnly = false, ), ), pdfFormFillingConfig = PdfFormFillingConfig({ false }, Color.CYAN), @@ -247,18 +247,18 @@ val FULL_PAGE_RECT = RectF(0f, 0f, PAGE_SIZE.x.toFloat(), PAGE_SIZE.y.toFloat()) val MAX_BITMAP_SIZE = Point(500, 500) val UPDATED_PAGE_WIDGET_INFOS = listOf( - FormWidgetInfo( + FormWidgetInfo.createRadioButton( widgetIndex = 0, - widgetType = FormWidgetInfo.WIDGET_TYPE_RADIOBUTTON, widgetRect = Rect(10, 10, 20, 20), textValue = "false", accessibilityLabel = "radio", + isReadOnly = false, ), - FormWidgetInfo( + FormWidgetInfo.createRadioButton( widgetIndex = 0, - widgetType = FormWidgetInfo.WIDGET_TYPE_RADIOBUTTON, widgetRect = Rect(10, 10, 20, 20), textValue = "true", accessibilityLabel = "radio", + isReadOnly = false, ), ) diff --git a/pdf/pdf-viewer/src/test/kotlin/androidx/pdf/view/PdfFormFillingStateTest.kt b/pdf/pdf-viewer/src/test/kotlin/androidx/pdf/view/PdfFormFillingStateTest.kt index 143286e459ac7..075c3cf34559e 100644 --- a/pdf/pdf-viewer/src/test/kotlin/androidx/pdf/view/PdfFormFillingStateTest.kt +++ b/pdf/pdf-viewer/src/test/kotlin/androidx/pdf/view/PdfFormFillingStateTest.kt @@ -42,38 +42,42 @@ class PdfFormFillingStateTest { mPdfFormFillingState.addPageFormWidgetInfos( 0, listOf( - FormWidgetInfo( - widgetType = FormWidgetInfo.WIDGET_TYPE_RADIOBUTTON, + FormWidgetInfo.createRadioButton( widgetIndex = 0, widgetRect = Rect(50, 500, 100, 600), textValue = "false", accessibilityLabel = "Radio", + isReadOnly = false, ), - FormWidgetInfo( - widgetType = FormWidgetInfo.WIDGET_TYPE_RADIOBUTTON, + FormWidgetInfo.createRadioButton( widgetIndex = 1, widgetRect = Rect(50, 500, 100, 600), textValue = "false", accessibilityLabel = "Radio", + isReadOnly = false, ), ), ) mPdfFormFillingState.addPageFormWidgetInfos( 1, listOf( - FormWidgetInfo( - widgetType = FormWidgetInfo.WIDGET_TYPE_TEXTFIELD, + FormWidgetInfo.createTextField( widgetIndex = 0, widgetRect = Rect(50, 500, 100, 600), textValue = "false", accessibilityLabel = "Radio", + isReadOnly = false, + isEditableText = true, + isMultiLineText = false, + maxLength = 10, + fontSize = 10f, ), - FormWidgetInfo( - widgetType = FormWidgetInfo.WIDGET_TYPE_CHECKBOX, + FormWidgetInfo.createCheckbox( widgetIndex = 1, widgetRect = Rect(50, 500, 100, 600), textValue = "false", accessibilityLabel = "Radio", + isReadOnly = false, ), ), ) diff --git a/pdf/pdf-viewer/src/test/kotlin/androidx/pdf/view/layout/PageLayoutManagerTest.kt b/pdf/pdf-viewer/src/test/kotlin/androidx/pdf/view/layout/PageLayoutManagerTest.kt index 67e7055a0352e..8636f6ed33640 100644 --- a/pdf/pdf-viewer/src/test/kotlin/androidx/pdf/view/layout/PageLayoutManagerTest.kt +++ b/pdf/pdf-viewer/src/test/kotlin/androidx/pdf/view/layout/PageLayoutManagerTest.kt @@ -543,11 +543,11 @@ private const val PAGE_HEIGHT = 200 private val FORM_WIDGET_INFOS = listOf( - FormWidgetInfo( - FormWidgetInfo.WIDGET_TYPE_TEXTFIELD, + FormWidgetInfo.createCheckbox( widgetIndex = 0, widgetRect = Rect(10, 10, 20, 20), textValue = "Hello", accessibilityLabel = "Hello", + isReadOnly = false, ) ) From b827163fac86ab665219e3b2537a13d84e27d3ce Mon Sep 17 00:00:00 2001 From: yingmak Date: Mon, 12 Jan 2026 13:28:35 +0000 Subject: [PATCH 03/14] Reset paint of RemoteIcon after drawing BUG: 474687917 Test: N/A Change-Id: I65929ee024b072b6a0f522d2dafa7013c2547896 --- .../androidx/wear/compose/remote/material3/RemoteIcon.kt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/wear/compose/remote/remote-material3/src/main/java/androidx/wear/compose/remote/material3/RemoteIcon.kt b/wear/compose/remote/remote-material3/src/main/java/androidx/wear/compose/remote/material3/RemoteIcon.kt index bb41ea5b017b8..0246890074b73 100644 --- a/wear/compose/remote/remote-material3/src/main/java/androidx/wear/compose/remote/material3/RemoteIcon.kt +++ b/wear/compose/remote/remote-material3/src/main/java/androidx/wear/compose/remote/material3/RemoteIcon.kt @@ -33,6 +33,7 @@ import androidx.compose.remote.creation.compose.state.rdp import androidx.compose.remote.creation.compose.vector.painterRemoteVector import androidx.compose.runtime.Composable import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.Paint import androidx.compose.ui.graphics.vector.ImageVector /** @@ -58,7 +59,11 @@ public fun RemoteIcon( ) { RemoteBox(modifier.semantics { this.contentDescription = contentDescription }) { val painter = painterRemoteVector(imageVector, tint) - RemoteCanvas(modifier = RemoteModifier.fillMaxSize()) { with(painter) { onDraw() } } + RemoteCanvas(modifier = RemoteModifier.fillMaxSize()) { + with(painter) { onDraw() } + // TODO(b/474687917): Temporary fix to reset tinted paint + remoteCanvas.internalCanvas.usePaint(Paint().asFrameworkPaint()) + } } } From e565df15a88f67e5bb59bc2651b99180c22ac2a1 Mon Sep 17 00:00:00 2001 From: Yuri Schimke Date: Mon, 12 Jan 2026 16:32:49 +0000 Subject: [PATCH 04/14] Allow override in RemoteColorScheme Also add associated tests within the Wear Compose Material3 remote library. Test: RemoteMaterialThemeTest Bug: 475210339 Change-Id: I008ef65beb331c35c80b6edfb2276905432adb04 --- .../remote/material3/RemoteMaterialThemeTest.kt | 16 ++++++++++++++++ .../remote/material3/RemoteColorScheme.kt | 5 +++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/wear/compose/remote/remote-material3/src/androidTest/java/androidx/wear/compose/remote/material3/RemoteMaterialThemeTest.kt b/wear/compose/remote/remote-material3/src/androidTest/java/androidx/wear/compose/remote/material3/RemoteMaterialThemeTest.kt index 94e4e95842705..fb7792177d549 100644 --- a/wear/compose/remote/remote-material3/src/androidTest/java/androidx/wear/compose/remote/material3/RemoteMaterialThemeTest.kt +++ b/wear/compose/remote/remote-material3/src/androidTest/java/androidx/wear/compose/remote/material3/RemoteMaterialThemeTest.kt @@ -76,4 +76,20 @@ class RemoteMaterialThemeTest { remoteComposeTestRule.assertRootNodeContainsColor(expectedTint) } + + @Test + fun custom_color_scheme_propagates_colors() { + val customColorScheme = ColorScheme(primary = Color.Magenta, onSurface = Color.Cyan) + val remoteColorScheme = RemoteColorScheme(customColorScheme) + val expectedTint = Color.Cyan + + remoteComposeTestRule.runTest { + RemoteMaterialTheme(colorScheme = remoteColorScheme) { + val iconTint = RemoteMaterialTheme.colorScheme.onSurface + RemoteIcon(TestImageVectors.VolumeUp, contentDescription = null, tint = iconTint) + } + } + + remoteComposeTestRule.assertRootNodeContainsColor(expectedTint) + } } diff --git a/wear/compose/remote/remote-material3/src/main/java/androidx/wear/compose/remote/material3/RemoteColorScheme.kt b/wear/compose/remote/remote-material3/src/main/java/androidx/wear/compose/remote/material3/RemoteColorScheme.kt index 7c39f765369bc..ae3cbc492cbcf 100644 --- a/wear/compose/remote/remote-material3/src/main/java/androidx/wear/compose/remote/material3/RemoteColorScheme.kt +++ b/wear/compose/remote/remote-material3/src/main/java/androidx/wear/compose/remote/material3/RemoteColorScheme.kt @@ -33,11 +33,12 @@ import androidx.wear.compose.material3.ColorScheme * * The colors are retrieved from the local `ColorScheme` and wrapped in `rememberRemoteColor` to * ensure they are correctly managed and updated in the remote UI. + * + * @param colorScheme The local `ColorScheme` to retrieve colors from. */ @Suppress("RestrictedApiAndroidX") @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) -public open class RemoteColorScheme() { - private val colorScheme: ColorScheme = ColorScheme() +public open class RemoteColorScheme(internal val colorScheme: ColorScheme = ColorScheme()) { private companion object { private const val PRIMARY = "WearM3.primary" From 5a3e84db859a8c7c433ecca0852a9df9d3b10011 Mon Sep 17 00:00:00 2001 From: Rahul Kanojia Date: Mon, 12 Jan 2026 19:12:00 -0800 Subject: [PATCH 05/14] Revert "Revert "feat(view): Implement robust drag-and-drop touch..." Revert submission 3912621-revert-3907980-drag-and-drop-FPUDSWLHLS Reason for revert: Relanding with fix for b/475234286. The aosp cuttlefish emulator contains a bottom nav bar, which obstructs views present at bottom after API 35 enabled edge-to-edge by default. The fix adjusts container to be drawn below status bar and above nav bars. Reverted changes: /q/submissionid:3912621-revert-3907980-drag-and-drop-FPUDSWLHLS Bug: b/472376731 Change-Id: If47c6dbb5eadda3f6b64527bb46213f910ad9f94 --- pdf/pdf-ink/build.gradle | 2 + .../pdf/ink/view/AnnotationToolbar.kt | 10 ++ .../AnnotationToolbarTouchHandler.kt | 122 +++++++++++++++ .../ink/view/draganddrop/ToolbarDockState.kt | 59 ++++++++ .../view/draganddrop/ToolbarDragListener.kt | 50 +++++++ .../pdf/ink/view/ViewExtensionsTest.kt | 94 ++++++++++++ .../AnnotationToolbarTouchHandlerTest.kt | 140 ++++++++++++++++++ 7 files changed, 477 insertions(+) create mode 100644 pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/draganddrop/AnnotationToolbarTouchHandler.kt create mode 100644 pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/draganddrop/ToolbarDockState.kt create mode 100644 pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/draganddrop/ToolbarDragListener.kt create mode 100644 pdf/pdf-ink/src/test/kotlin/androidx/pdf/ink/view/ViewExtensionsTest.kt create mode 100644 pdf/pdf-ink/src/test/kotlin/androidx/pdf/ink/view/draganddrop/AnnotationToolbarTouchHandlerTest.kt diff --git a/pdf/pdf-ink/build.gradle b/pdf/pdf-ink/build.gradle index 5705ce05ddd03..dd4a53a08a940 100644 --- a/pdf/pdf-ink/build.gradle +++ b/pdf/pdf-ink/build.gradle @@ -59,6 +59,8 @@ dependencies { testImplementation(libs.testCoreKtx) testImplementation(libs.testExtJunitKtx) testImplementation(libs.kotlinCoroutinesTest) + testImplementation(libs.mockitoCore) + testImplementation(libs.mockitoKotlin4) androidTestImplementation(libs.junit) androidTestImplementation(libs.testRunner) diff --git a/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/AnnotationToolbar.kt b/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/AnnotationToolbar.kt index f967f2d4722c3..6d5eb8005eb36 100644 --- a/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/AnnotationToolbar.kt +++ b/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/AnnotationToolbar.kt @@ -17,12 +17,15 @@ package androidx.pdf.ink.view import android.content.Context +import android.graphics.Rect import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.Drawable import android.graphics.drawable.LayerDrawable import android.os.Parcelable import android.util.AttributeSet import android.view.LayoutInflater +import android.view.MotionEvent +import android.view.View import android.view.animation.DecelerateInterpolator import android.widget.LinearLayout import android.widget.LinearLayout.HORIZONTAL @@ -503,3 +506,10 @@ constructor(context: Context, attrs: AttributeSet? = null, defStyle: Int = 0) : private const val AUTO_TRANSITION_DURATION = 250L } } + +/** Helper function to check if a touch event is within the bounds of a given view. */ +internal fun View.isTouchInView(event: MotionEvent): Boolean { + val viewRect = Rect() + getHitRect(viewRect) + return viewRect.contains(event.x.toInt(), event.y.toInt()) +} diff --git a/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/draganddrop/AnnotationToolbarTouchHandler.kt b/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/draganddrop/AnnotationToolbarTouchHandler.kt new file mode 100644 index 0000000000000..ff0c391dc85ee --- /dev/null +++ b/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/draganddrop/AnnotationToolbarTouchHandler.kt @@ -0,0 +1,122 @@ +/* + * Copyright 2026 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package androidx.pdf.ink.view.draganddrop + +import android.view.GestureDetector +import android.view.HapticFeedbackConstants +import android.view.MotionEvent +import android.view.View +import android.view.ViewConfiguration +import kotlin.math.abs + +/** + * A delegate class that encapsulates all touch handling logic for the + * [androidx.pdf.ink.view.AnnotationToolbar]. + * + * This handler is responsible for: + * 1. **Detecting a long-press** on the contents of the toolbar to initiate a drag operation. + * 2. **Notifying an external [ToolbarDragListener]** about the start, move, and end of a drag + * gesture, without handling the view movement itself. + * + * @param toolbarView The [androidx.pdf.ink.view.AnnotationToolbar] instance whose touches are being + * handled. + * @param isTouchOnInteractiveChild A lambda to verify if long press is registered on long press + * interactive child(for e.g. brush size selector). + */ +internal class AnnotationToolbarTouchHandler( + private val toolbarView: View, + private val isTouchOnInteractiveChild: (MotionEvent) -> Boolean, +) { + private var isDragging = false + private val touchSlop = ViewConfiguration.get(toolbarView.context).scaledTouchSlop + + private var dragListener: ToolbarDragListener? = null + + fun setOnDragListener(listener: ToolbarDragListener) { + dragListener = listener + } + + private val gestureDetector: GestureDetector = + GestureDetector( + toolbarView.context, + object : GestureDetector.SimpleOnGestureListener() { + override fun onLongPress(event: MotionEvent) { + isDragging = true + // Critical: Stop children (buttons) from handling this touch any further + toolbarView.parent.requestDisallowInterceptTouchEvent(true) + toolbarView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS) + dragListener?.onDragStart(event) + } + + override fun onScroll( + e1: MotionEvent?, + e2: MotionEvent, + distanceX: Float, + distanceY: Float, + ): Boolean { + val dx = abs(e2.x - (e1?.x ?: 0f)) + val dy = abs(e2.y - (e1?.y ?: 0f)) + + // Only make a decision once the user has moved past the touch slop threshold + if (dx > touchSlop || dy > touchSlop) { + gestureDetector.setIsLongpressEnabled(false) + } + + // We return false here because we don't want onScroll to consume the event. + // We only use it to detect the start of a scroll and disable long press. + return false + } + + override fun onDown(e: MotionEvent): Boolean { + // Re-enable long press detection at the start of every new gesture. + gestureDetector.setIsLongpressEnabled(true) + // Necessary to continue tracking the gesture + return true + } + }, + ) + + fun onInterceptTouchEvent(event: MotionEvent): Boolean { + if (isTouchOnInteractiveChild(event)) return false + + gestureDetector.onTouchEvent(event) + + // If dragging is in progress, "steal" the event stream from child views (buttons) + return isDragging + } + + fun onTouchEvent(event: MotionEvent): Boolean { + if (isTouchOnInteractiveChild(event)) return false + + gestureDetector.onTouchEvent(event) + + when (event.actionMasked) { + MotionEvent.ACTION_MOVE -> { + if (isDragging) dragListener?.onDragMove(event) + } + MotionEvent.ACTION_UP, + MotionEvent.ACTION_CANCEL -> { + if (isDragging) dragListener?.onDragEnd() + + isDragging = false + toolbarView.parent.requestDisallowInterceptTouchEvent(false) + } + } + + return isDragging + } +} diff --git a/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/draganddrop/ToolbarDockState.kt b/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/draganddrop/ToolbarDockState.kt new file mode 100644 index 0000000000000..c8f70cc8a2b95 --- /dev/null +++ b/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/draganddrop/ToolbarDockState.kt @@ -0,0 +1,59 @@ +/* + * Copyright 2026 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package androidx.pdf.ink.view.draganddrop + +import androidx.annotation.IntDef +import androidx.annotation.RestrictTo + +/** + * Interface defining a contract for UI components that can be docked to specific edges of a + * container, such as the start, end, or bottom. + */ +@RestrictTo(RestrictTo.Scope.LIBRARY) +public interface ToolbarDockState { + + /** + * An annotation that defines the set of integer constants representing the valid docking states + * for a component. + */ + @Retention(AnnotationRetention.SOURCE) + @IntDef(DOCK_STATE_START, DOCK_STATE_BOTTOM, DOCK_STATE_END) + public annotation class DockState + + /** + * The current docking state of the component. + * + * Implementations should update their layout and orientation according to the value of this + * property. + */ + @DockState public var dockState: Int + + public companion object { + /** + * Represents a state where the component is docked to the start (left, in LTR mode) edge. + */ + public const val DOCK_STATE_START: Int = 0 + + /** Represents a state where the component is docked to the bottom edge. */ + public const val DOCK_STATE_BOTTOM: Int = 1 + + /** + * Represents a state where the component is docked to the end (right, in LTR mode) edge. + */ + public const val DOCK_STATE_END: Int = 2 + } +} diff --git a/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/draganddrop/ToolbarDragListener.kt b/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/draganddrop/ToolbarDragListener.kt new file mode 100644 index 0000000000000..ef7205acf32d7 --- /dev/null +++ b/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/draganddrop/ToolbarDragListener.kt @@ -0,0 +1,50 @@ +/* + * Copyright 2026 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package androidx.pdf.ink.view.draganddrop + +import android.view.MotionEvent +import androidx.annotation.RestrictTo +import androidx.pdf.ink.view.AnnotationToolbar + +/** + * Interface definition for callbacks to be invoked when a drag gesture is performed on the + * [AnnotationToolbar]. + */ +@RestrictTo(RestrictTo.Scope.LIBRARY) +public interface ToolbarDragListener { + /** + * Called when a long-press gesture is detected and a drag operation is initiated. + * + * @param event The raw [MotionEvent] containing the current pointer coordinates, which can be + * used to calculate initial touch offset. + */ + public fun onDragStart(event: MotionEvent) + + /** + * Called for each movement of the user's finger across the screen during a drag. + * + * @param event The raw [MotionEvent] containing the current pointer coordinates, which can be + * used to update the toolbar's position. + */ + public fun onDragMove(event: MotionEvent) + + /** + * Called when the user lifts their finger, completing the drag operation. This is typically + * used to snap the toolbar to a final docked position. + */ + public fun onDragEnd() +} diff --git a/pdf/pdf-ink/src/test/kotlin/androidx/pdf/ink/view/ViewExtensionsTest.kt b/pdf/pdf-ink/src/test/kotlin/androidx/pdf/ink/view/ViewExtensionsTest.kt new file mode 100644 index 0000000000000..56fdfcbea1b65 --- /dev/null +++ b/pdf/pdf-ink/src/test/kotlin/androidx/pdf/ink/view/ViewExtensionsTest.kt @@ -0,0 +1,94 @@ +/* + * Copyright 2026 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package androidx.pdf.ink.view + +import android.content.Context +import android.view.MotionEvent +import android.view.View +import androidx.test.core.app.ApplicationProvider +import com.google.common.truth.Truth.assertThat +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner +import org.robolectric.annotation.Config + +@RunWith(RobolectricTestRunner::class) +@Config(sdk = [Config.TARGET_SDK]) +class ViewExtensionsTest { + + private lateinit var context: Context + private lateinit var view: View + + @Before + fun setUp() { + context = ApplicationProvider.getApplicationContext() + view = View(context) + // Define the view's bounds for testing. Let's assume it's at (100, 100) + // with a size of 200x100. So its rect is (100, 100, 300, 200). + view.layout(100, 100, 300, 200) + } + + @Test + fun isTouchInView_whenTouchIsInside_returnsTrue() { + // Create a touch event in the middle of the view. + val touchEvent = MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 150f, 150f, 0) + + assertThat(view.isTouchInView(touchEvent)).isTrue() + } + + @Test + fun isTouchInView_whenTouchIsOutside_returnsFalse() { + // Create a touch event far outside the view's bounds. + val touchEvent = MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 500f, 500f, 0) + + assertThat(view.isTouchInView(touchEvent)).isFalse() + } + + @Test + fun isTouchInView_whenTouchIsOnLeftEdge_returnsTrue() { + // Create a touch event exactly on the left edge. + val touchEvent = MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 100f, 150f, 0) + + assertThat(view.isTouchInView(touchEvent)).isTrue() + } + + @Test + fun isTouchInView_whenTouchIsJustOutsideRightEdge_returnsFalse() { + // The rect's right is 300, so a touch at 300.0f is outside because + // Rect.contains checks for left <= x < right. + val touchEvent = MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 300f, 150f, 0) + + assertThat(view.isTouchInView(touchEvent)).isFalse() + } + + @Test + fun isTouchInView_whenTouchIsOnTopEdge_returnsTrue() { + // Create a touch event exactly on the top edge. + val touchEvent = MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 150f, 100f, 0) + + assertThat(view.isTouchInView(touchEvent)).isTrue() + } + + @Test + fun isTouchInView_whenTouchIsJustOutsideBottomEdge_returnsFalse() { + // The rect's bottom is 200, so a touch at 200.0f is outside. + val touchEvent = MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 150f, 200f, 0) + + assertThat(view.isTouchInView(touchEvent)).isFalse() + } +} diff --git a/pdf/pdf-ink/src/test/kotlin/androidx/pdf/ink/view/draganddrop/AnnotationToolbarTouchHandlerTest.kt b/pdf/pdf-ink/src/test/kotlin/androidx/pdf/ink/view/draganddrop/AnnotationToolbarTouchHandlerTest.kt new file mode 100644 index 0000000000000..03b1455066a26 --- /dev/null +++ b/pdf/pdf-ink/src/test/kotlin/androidx/pdf/ink/view/draganddrop/AnnotationToolbarTouchHandlerTest.kt @@ -0,0 +1,140 @@ +/* + * Copyright 2026 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package androidx.pdf.ink.view.draganddrop + +import android.content.Context +import android.os.SystemClock +import android.view.MotionEvent +import android.view.View +import android.view.ViewConfiguration +import android.widget.FrameLayout +import androidx.test.core.app.ApplicationProvider +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.Mockito.never +import org.mockito.MockitoAnnotations +import org.mockito.kotlin.any +import org.mockito.kotlin.spy +import org.mockito.kotlin.verify +import org.robolectric.RobolectricTestRunner +import org.robolectric.Shadows.shadowOf +import org.robolectric.shadows.ShadowLooper + +@RunWith(RobolectricTestRunner::class) +@org.robolectric.annotation.Config(sdk = [org.robolectric.annotation.Config.TARGET_SDK]) +class AnnotationToolbarTouchHandlerTest { + + private val context = ApplicationProvider.getApplicationContext() + + private lateinit var dummyToolbar: View + private lateinit var parentContainer: FrameLayout // Acts as the parent + + @Mock private lateinit var dragListener: ToolbarDragListener + + private val touchSlop = ViewConfiguration.get(context).scaledTouchSlop + + @Before + fun setup() { + // Initialize @Mock annotations + MockitoAnnotations.openMocks(this) + + parentContainer = spy(FrameLayout(context)) + + dummyToolbar = View(context, null) + + parentContainer.addView(dummyToolbar) + } + + @Test + fun test_onTouchEvent_onInteractiveChild_ignoresDrag() { + val handler = AnnotationToolbarTouchHandler(dummyToolbar) { true } + handler.setOnDragListener(dragListener) + val event = obtainEvent(MotionEvent.ACTION_DOWN, 0f, 0f) + + val result = handler.onTouchEvent(event) + + assertFalse(result) + verify(dragListener, never()).onDragStart(any()) + } + + @Test + fun test_touchHandler_longPress_startDrag() { + val handler = AnnotationToolbarTouchHandler(dummyToolbar) { false } + handler.setOnDragListener(dragListener) + val event = obtainEvent(MotionEvent.ACTION_DOWN, 0f, 0f) + + handler.onTouchEvent(event) + + // fast-forward time + ShadowLooper.runUiThreadTasksIncludingDelayedTasks() + + val shadowParent = shadowOf(parentContainer) + // Check the actual state of the view + assertTrue(shadowParent.disallowInterceptTouchEvent) + + verify(dragListener).onDragStart(any()) + } + + @Test + fun test_touchHandler_continuous_actionMove_doesNotStartDrag() { + val handler = AnnotationToolbarTouchHandler(dummyToolbar) { false } + handler.setOnDragListener(dragListener) + + val downEvent = obtainEvent(MotionEvent.ACTION_DOWN, 0f, 0f) + val moveEvent = obtainEvent(MotionEvent.ACTION_MOVE, 0f, (touchSlop + 10).toFloat()) + + handler.onTouchEvent(downEvent) + handler.onTouchEvent(moveEvent) + + ShadowLooper.runUiThreadTasksIncludingDelayedTasks() + + verify(dragListener, never()).onDragStart(any()) + } + + @Test + fun test_touchHandler_actionUp_endsDrag() { + val handler = AnnotationToolbarTouchHandler(dummyToolbar) { false } + handler.setOnDragListener(dragListener) + val downEvent = obtainEvent(MotionEvent.ACTION_DOWN, 0f, 0f) + val upEvent = obtainEvent(MotionEvent.ACTION_UP, 0f, 0f) + + handler.onTouchEvent(downEvent) + ShadowLooper.runUiThreadTasksIncludingDelayedTasks() // Trigger Drag + handler.onTouchEvent(upEvent) + + verify(dragListener).onDragEnd() + + val shadowParent = shadowOf(parentContainer) + // Assert parent's disallowInterceptTouchEvent state + assertFalse(shadowParent.disallowInterceptTouchEvent) + } + + private fun obtainEvent(action: Int, x: Float, y: Float): MotionEvent { + return MotionEvent.obtain( + SystemClock.uptimeMillis(), + SystemClock.uptimeMillis(), + action, + x, + y, + 0, + ) + } +} From 286fe48e2f522334d7321521602c4f32ef2467ec Mon Sep 17 00:00:00 2001 From: Rahul Kanojia Date: Mon, 12 Jan 2026 19:12:00 -0800 Subject: [PATCH 06/14] Revert "Revert "feat(view): Make AnnotationToolbar draggable and..." Revert submission 3912621-revert-3907980-drag-and-drop-FPUDSWLHLS Reason for revert: Relanding with fix for b/475234286. The aosp cuttlefish emulator contains a bottom nav bar, which obstructs views present at bottom after API 35 enabled edge-to-edge by default. The fix adjusts container to be drawn below status bar and above nav bars. Reverted changes: /q/submissionid:3912621-revert-3907980-drag-and-drop-FPUDSWLHLS Bug: b/472376731 Change-Id: I804833aa405d0fcf0059e5fc64e3af207ca408f5 --- .../src/androidTest/kotlin/ScubaConstants.kt | 8 + .../pdf/ink/view/AnnotationToolbarTest.kt | 60 ++++ .../pdf/ink/view/AnnotationToolbarUiTest.kt | 58 ++++ .../ink/view/state/ToolbarInitializerTest.kt | 3 +- .../pdf/ink/view/AnnotationToolbar.kt | 101 +++++- .../ink/view/AnnotationToolbarViewModel.kt | 2 + .../layout/AnnotationToolbarConstraintSet.kt | 288 ++++++++++++++++++ .../ink/view/state/AnnotationToolbarState.kt | 6 + .../pdf/ink/view/state/ToolbarInitializer.kt | 22 ++ .../ink/view/state/ToolbarIntentAndEffects.kt | 3 + .../main/res/layout/annotation_toolbar.xml | 24 +- pdf/pdf-ink/src/main/res/values/dimens.xml | 4 + .../state/AnnotationToolbarViewModelTest.kt | 15 + 13 files changed, 575 insertions(+), 19 deletions(-) create mode 100644 pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/layout/AnnotationToolbarConstraintSet.kt diff --git a/pdf/pdf-ink/src/androidTest/kotlin/ScubaConstants.kt b/pdf/pdf-ink/src/androidTest/kotlin/ScubaConstants.kt index 02f69c38a200f..099a82474850d 100644 --- a/pdf/pdf-ink/src/androidTest/kotlin/ScubaConstants.kt +++ b/pdf/pdf-ink/src/androidTest/kotlin/ScubaConstants.kt @@ -34,6 +34,14 @@ internal const val ANNOTATION_TOOLBAR_IN_DARK_MODE = "annotation_toolbar_in_dark internal const val ANNOTATION_TOOLBAR_IN_LIGHT_MODE = "annotation_toolbar_in_light_mode" internal const val ANNOTATION_TOOLBAR_COLLAPSED = "annotation_toolbar_collapsed" +internal const val ANNOTATION_TOOLBAR_DOCKED_START_WITH_BRUSH_SIZE = + "annotation_toolbar_docked_start_with_brush_size" +internal const val ANNOTATION_TOOLBAR_DOCKED_START_WITH_COLOR_PALETTE = + "annotation_toolbar_docked_start_with_color_palette" +internal const val ANNOTATION_TOOLBAR_DOCKED_END_WITH_BRUSH_SIZE = + "annotation_toolbar_docked_end_with_brush_size" +internal const val ANNOTATION_TOOLBAR_DOCKED_END_WITH_COLOR_PALETTE = + "annotation_toolbar_docked_end_with_color_palette" internal const val BRUSH_SIZE_SELECTED_ON_STEP_0 = "brush_size_selector_on_step_0" internal const val BRUSH_SIZE_SELECTED_ON_STEP_4 = "brush_size_selector_on_step_4" internal const val BRUSH_SIZE_IN_VERTICAL_ORIENTATION = "brush_size_in_vertical_orientation" diff --git a/pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/ink/view/AnnotationToolbarTest.kt b/pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/ink/view/AnnotationToolbarTest.kt index 780b60e22658e..34b0a1e461e5f 100644 --- a/pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/ink/view/AnnotationToolbarTest.kt +++ b/pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/ink/view/AnnotationToolbarTest.kt @@ -18,10 +18,14 @@ package androidx.pdf.ink.view import android.content.Context import android.view.ViewGroup.LayoutParams +import android.widget.LinearLayout import androidx.pdf.PdfTestActivity import androidx.pdf.ink.R import androidx.pdf.ink.util.setSliderValue import androidx.pdf.ink.util.withSliderValue +import androidx.pdf.ink.view.draganddrop.ToolbarDockState.Companion.DOCK_STATE_BOTTOM +import androidx.pdf.ink.view.draganddrop.ToolbarDockState.Companion.DOCK_STATE_END +import androidx.pdf.ink.view.draganddrop.ToolbarDockState.Companion.DOCK_STATE_START import androidx.pdf.ink.view.tool.AnnotationToolView import androidx.test.core.app.ActivityScenario import androidx.test.espresso.Espresso.onIdle @@ -38,6 +42,7 @@ import androidx.test.ext.junit.rules.ActivityScenarioRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.MediumTest import com.google.android.material.slider.Slider +import com.google.common.truth.Truth.assertThat import junit.framework.TestCase.assertFalse import junit.framework.TestCase.assertTrue import kotlin.test.assertNotNull @@ -304,6 +309,61 @@ class AnnotationToolbarTest { assertFalse(annotationToolbar.isConfigPopupVisible) } + @Test + fun testSetDockState_updatesOrientationAndConstraints() { + var toolbar: AnnotationToolbar? = null + setupAnnotationToolbar { toolbar = it } + + assertNotNull(toolbar) + + // Change dock state to START (Vertical) + activityRule.scenario.onActivity { toolbar.dockState = DOCK_STATE_START } + onIdle() + + // Verify tool tray orientation updated to Vertical + val toolTray = toolbar.findViewById(R.id.tool_tray) + assertThat(toolTray.orientation).isEqualTo(LinearLayout.VERTICAL) + + // Change dock state back to BOTTOM (Horizontal) + activityRule.scenario.onActivity { toolbar.dockState = DOCK_STATE_BOTTOM } + onIdle() + + // Verify tool tray orientation reverted to Horizontal + assertThat(toolTray?.orientation).isEqualTo(LinearLayout.HORIZONTAL) + } + + @Test + fun testDockState_restoresOnConfigChange() { + // Prepare activity with a toolbar + PdfTestActivity.onCreateCallback = { activity -> + activity.container.addView( + createToolbar(activity), + LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT), + ) + } + + with(ActivityScenario.launch(PdfTestActivity::class.java)) { + // Set dock state to END + onActivity { activity -> + val toolbar = activity.findViewById(ANNOTATION_TOOLBAR_VIEW_ID) + toolbar.dockState = DOCK_STATE_END + } + onIdle() + + // Recreate activity + recreate() + + // Assert dock state is restored + onActivity { activity -> + val toolbar = activity.findViewById(ANNOTATION_TOOLBAR_VIEW_ID) + assertThat(toolbar.dockState).isEqualTo(DOCK_STATE_END) + + val toolTray = toolbar.findViewById(R.id.tool_tray) + assertThat(toolTray.orientation).isEqualTo(LinearLayout.VERTICAL) + } + } + } + private fun assertColorPaletteChecks() { onView(withId(R.id.color_palette_button)).check(matches(isEnabled())) // assert initially color palette is not visible diff --git a/pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/ink/view/AnnotationToolbarUiTest.kt b/pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/ink/view/AnnotationToolbarUiTest.kt index b0eec8c5bc9f5..6a9f20ea0171c 100644 --- a/pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/ink/view/AnnotationToolbarUiTest.kt +++ b/pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/ink/view/AnnotationToolbarUiTest.kt @@ -18,6 +18,10 @@ package androidx.pdf.ink.view import ANNOTATION_TOOLBAR import ANNOTATION_TOOLBAR_COLLAPSED +import ANNOTATION_TOOLBAR_DOCKED_END_WITH_BRUSH_SIZE +import ANNOTATION_TOOLBAR_DOCKED_END_WITH_COLOR_PALETTE +import ANNOTATION_TOOLBAR_DOCKED_START_WITH_BRUSH_SIZE +import ANNOTATION_TOOLBAR_DOCKED_START_WITH_COLOR_PALETTE import ANNOTATION_TOOLBAR_IN_DARK_MODE import ANNOTATION_TOOLBAR_IN_LIGHT_MODE import ANNOTATION_TOOLBAR_WITH_COLOR_PALETTE_VISIBLE @@ -34,6 +38,8 @@ import androidx.pdf.ink.R import androidx.pdf.ink.util.clickItemAt import androidx.pdf.ink.util.setSliderValue import androidx.pdf.ink.view.colorpalette.ColorPaletteAdapter +import androidx.pdf.ink.view.draganddrop.ToolbarDockState.Companion.DOCK_STATE_END +import androidx.pdf.ink.view.draganddrop.ToolbarDockState.Companion.DOCK_STATE_START import androidx.pdf.ink.view.tool.AnnotationToolView import androidx.test.espresso.Espresso.onIdle import androidx.test.espresso.Espresso.onView @@ -159,6 +165,58 @@ class AnnotationToolbarUiTest { assertScreenshot(ANNOTATION_TOOLBAR_VIEW_ID, screenshotRule, ANNOTATION_TOOLBAR_COLLAPSED) } + @Test + fun test_annotationToolbar_dockedStart_withBrushSlider() { + setupAnnotationToolbar { it.dockState = DOCK_STATE_START } + // Open brush slider + onView(withId(R.id.pen_button)).perform(click()) + + assertScreenshot( + ANNOTATION_TOOLBAR_VIEW_ID, + screenshotRule, + ANNOTATION_TOOLBAR_DOCKED_START_WITH_BRUSH_SIZE, + ) + } + + @Test + fun test_annotationToolbar_dockedStart_withColorPalette() { + setupAnnotationToolbar { it.dockState = DOCK_STATE_START } + // Open color palette + onView(withId(R.id.color_palette_button)).perform(click()) + + assertScreenshot( + ANNOTATION_TOOLBAR_VIEW_ID, + screenshotRule, + ANNOTATION_TOOLBAR_DOCKED_START_WITH_COLOR_PALETTE, + ) + } + + @Test + fun test_annotationToolbar_dockedEnd_withBrushSlider() { + setupAnnotationToolbar { it.dockState = DOCK_STATE_END } + // Open brush slider + onView(withId(R.id.pen_button)).perform(click()) + + assertScreenshot( + ANNOTATION_TOOLBAR_VIEW_ID, + screenshotRule, + ANNOTATION_TOOLBAR_DOCKED_END_WITH_BRUSH_SIZE, + ) + } + + @Test + fun test_annotationToolbar_dockedEnd_withColorPalette() { + setupAnnotationToolbar { it.dockState = DOCK_STATE_END } + // Open color palette + onView(withId(R.id.color_palette_button)).perform(click()) + + assertScreenshot( + ANNOTATION_TOOLBAR_VIEW_ID, + screenshotRule, + ANNOTATION_TOOLBAR_DOCKED_END_WITH_COLOR_PALETTE, + ) + } + private fun setupAnnotationToolbar( isDarkMode: Boolean = false, callback: (AnnotationToolbar) -> Unit = {}, diff --git a/pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/ink/view/state/ToolbarInitializerTest.kt b/pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/ink/view/state/ToolbarInitializerTest.kt index ff60101e9d5ca..b32e0f77681f1 100644 --- a/pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/ink/view/state/ToolbarInitializerTest.kt +++ b/pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/ink/view/state/ToolbarInitializerTest.kt @@ -19,6 +19,7 @@ package androidx.pdf.ink.view.state import android.content.Context import androidx.pdf.ink.view.colorpalette.model.getHighlightPaletteItems import androidx.pdf.ink.view.colorpalette.model.getPenPaletteItems +import androidx.pdf.ink.view.draganddrop.ToolbarDockState import androidx.pdf.ink.view.tool.model.AnnotationToolsKey import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 @@ -66,7 +67,7 @@ class ToolbarInitializerTest { .isEqualTo(defaultHighlighterColorIndex) assertThat(initialState.highlighterState.paletteItem) .isEqualTo(highlightPaletteItems[defaultHighlighterColorIndex]) - + assertThat(initialState.dockedState).isEqualTo(ToolbarDockState.DOCK_STATE_BOTTOM) assertThat(initialState.isExpanded).isTrue() } } diff --git a/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/AnnotationToolbar.kt b/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/AnnotationToolbar.kt index 6d5eb8005eb36..4abe678e446ef 100644 --- a/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/AnnotationToolbar.kt +++ b/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/AnnotationToolbar.kt @@ -26,9 +26,11 @@ import android.util.AttributeSet import android.view.LayoutInflater import android.view.MotionEvent import android.view.View +import android.view.ViewGroup import android.view.animation.DecelerateInterpolator import android.widget.LinearLayout import android.widget.LinearLayout.HORIZONTAL +import android.widget.LinearLayout.VERTICAL import androidx.annotation.RestrictTo import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.content.ContextCompat @@ -46,6 +48,13 @@ import androidx.pdf.ink.view.colorpalette.model.Emoji import androidx.pdf.ink.view.colorpalette.model.PaletteItem import androidx.pdf.ink.view.colorpalette.model.getHighlightPaletteItems import androidx.pdf.ink.view.colorpalette.model.getPenPaletteItems +import androidx.pdf.ink.view.draganddrop.AnnotationToolbarTouchHandler +import androidx.pdf.ink.view.draganddrop.ToolbarDockState +import androidx.pdf.ink.view.draganddrop.ToolbarDockState.Companion.DOCK_STATE_BOTTOM +import androidx.pdf.ink.view.draganddrop.ToolbarDockState.Companion.DOCK_STATE_END +import androidx.pdf.ink.view.draganddrop.ToolbarDockState.Companion.DOCK_STATE_START +import androidx.pdf.ink.view.draganddrop.ToolbarDragListener +import androidx.pdf.ink.view.layout.AnnotationToolbarConstraintSet import androidx.pdf.ink.view.state.AnnotationToolbarState import androidx.pdf.ink.view.state.ToolbarEffect import androidx.pdf.ink.view.state.ToolbarInitializer @@ -64,20 +73,22 @@ import kotlinx.coroutines.CoroutineStart import kotlinx.coroutines.Job import kotlinx.coroutines.android.asCoroutineDispatcher import kotlinx.coroutines.coroutineScope +import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch import org.jetbrains.annotations.VisibleForTesting /** * A toolbar that hosts a set of annotation tools for interacting with a PDF document. * - * This custom [android.view.ViewGroup] contains a predefined set of [AnnotaonToolView] buttons such - * as pen, highlighter, eraser, etc. aligned based on the [LinearLayout.orientation] set. + * This custom [android.view.ViewGroup] contains a predefined set of [AnnotationToolView] buttons + * such as pen, highlighter, eraser, etc. aligned based on the [dockState] set. */ @RestrictTo(RestrictTo.Scope.LIBRARY) public class AnnotationToolbar @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyle: Int = 0) : - ConstraintLayout(context, attrs, defStyle) { + ConstraintLayout(context, attrs, defStyle), ToolbarDockState { private val viewModel = AnnotationToolbarViewModel(ToolbarInitializer.createInitialState(context)) @@ -85,9 +96,9 @@ constructor(context: Context, attrs: AttributeSet? = null, defStyle: Int = 0) : /** * A [android.view.ViewGroup] containing all the annotation tools button. * - * Custom tools can be dynamically added to this container using [LinearLayout.addView]. + * Custom tools can be dynamically added to this container using [ViewGroup.addView]. */ - public val toolTray: LinearLayout + public val toolTray: ViewGroup /** * Controls the enabled state of the undo button. @@ -142,6 +153,25 @@ constructor(context: Context, attrs: AttributeSet? = null, defStyle: Int = 0) : viewModel.updateState(ToolbarInitializer.createInitialState(context = context)) } + override var dockState: Int + get() = viewModel.state.value.dockedState + set(value) { + if (viewModel.state.value.dockedState == value) return + + viewModel.onAction(ToolbarIntent.DockStateChanged(value)) + } + + /** + * Sets a listener to receive drag events when the toolbar is being moved and docked. + * + * @param dragListener The [ToolbarDragListener] to be notified of drag lifecycle events. + */ + public fun setOnToolbarDragListener(dragListener: ToolbarDragListener) { + toolbarTouchHandler.setOnDragListener(dragListener) + } + + private val constraintSet = AnnotationToolbarConstraintSet(this.context) + private val pen: AnnotationToolView private val highlighter: AnnotationToolView private val eraser: AnnotationToolView @@ -168,6 +198,14 @@ constructor(context: Context, attrs: AttributeSet? = null, defStyle: Int = 0) : ContextCompat.getDrawable(context, R.drawable.color_palette_icon_stroke)?.mutate() } + private val toolbarTouchHandler: AnnotationToolbarTouchHandler by lazy { + AnnotationToolbarTouchHandler(this) { event -> + // Intercepting a long press during a slide on the brush size selector is unintended. + // Ignore long press detection when the touch target is the brush size selector. + (brushSizeSelectorView.isVisible && brushSizeSelectorView.isTouchInView(event)) + } + } + // Required to disable any animation while performing screenshot tests @VisibleForTesting internal var areAnimationsEnabled: Boolean = true @@ -216,9 +254,6 @@ constructor(context: Context, attrs: AttributeSet? = null, defStyle: Int = 0) : } private fun setupToolTray() { - // default orientation - toolTray.orientation = HORIZONTAL - // Set click listeners for all tool views pen.setOnClickListener { viewModel.onAction(ToolbarIntent.PenToolClicked) } highlighter.setOnClickListener { viewModel.onAction(ToolbarIntent.HighlighterToolClicked) } @@ -260,6 +295,17 @@ constructor(context: Context, attrs: AttributeSet? = null, defStyle: Int = 0) : } private suspend fun collectUiStates() = coroutineScope { + /** + * Collects any expensive UI updates (such as the toolbar's `dockedState`) only when they + * are distinct from the previous state. + */ + launch { + viewModel.state + .map { it.dockedState } + .distinctUntilChanged() + .collect { dockedState -> updateDockState(dockedState) } + } + launch { viewModel.state.collect { state -> updateExpandedState(state) @@ -460,6 +506,16 @@ constructor(context: Context, attrs: AttributeSet? = null, defStyle: Int = 0) : } } + override fun onInterceptTouchEvent(event: MotionEvent): Boolean { + return toolbarTouchHandler.onInterceptTouchEvent(event) + } + + override fun onTouchEvent(event: MotionEvent?): Boolean { + if (event == null) return super.onTouchEvent(event) + + return toolbarTouchHandler.onTouchEvent(event) || super.onTouchEvent(event) + } + private fun updateExpandedState(state: AnnotationToolbarState) { if (areAnimationsEnabled) { val transition = AutoTransition().apply { duration = AUTO_TRANSITION_DURATION } @@ -470,6 +526,31 @@ constructor(context: Context, attrs: AttributeSet? = null, defStyle: Int = 0) : collapsedIcon.isVisible = !state.isExpanded } + private fun updateDockState(dockedState: Int) { + when (dockedState) { + DOCK_STATE_START -> { + if (toolTray is LinearLayout) toolTray.orientation = VERTICAL + undoRedoContainer.orientation = VERTICAL + brushSizeSelectorView.orientation = VERTICAL + constraintSet.dockStateStart.applyTo(this) + } + + DOCK_STATE_BOTTOM -> { + if (toolTray is LinearLayout) toolTray.orientation = HORIZONTAL + undoRedoContainer.orientation = HORIZONTAL + brushSizeSelectorView.orientation = HORIZONTAL + constraintSet.dockStateBottom.applyTo(this) + } + + DOCK_STATE_END -> { + if (toolTray is LinearLayout) toolTray.orientation = VERTICAL + undoRedoContainer.orientation = VERTICAL + brushSizeSelectorView.orientation = VERTICAL + constraintSet.dockStateEnd.applyTo(this) + } + } + } + /** * Interface definition for a callback to be invoked when interaction occurs with the * [AnnotationToolbar]. @@ -484,10 +565,10 @@ constructor(context: Context, attrs: AttributeSet? = null, defStyle: Int = 0) : */ public fun onToolChanged(toolInfo: AnnotationToolInfo) - /** Called when a undo button is clicked if [canUndo] is set to enabled. */ + /** Called when an undo button is clicked if [canUndo] is set to enable. */ public fun onUndo() - /** Called when a redo button is clicked if [canRedo] is set to enabled. */ + /** Called when a redo button is clicked if [canRedo] is set to enable. */ public fun onRedo() /** diff --git a/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/AnnotationToolbarViewModel.kt b/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/AnnotationToolbarViewModel.kt index 882c29e56309b..2927efe5e6f74 100644 --- a/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/AnnotationToolbarViewModel.kt +++ b/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/AnnotationToolbarViewModel.kt @@ -93,6 +93,8 @@ internal class AnnotationToolbarViewModel(initialState: AnnotationToolbarState) is ToolbarIntent.BrushSizeChanged -> onBrushSizeChanged(intent) is ToolbarIntent.ColorSelected -> onColorSelected(intent) is ToolbarIntent.DismissPopups -> hideAnyPopup() + is ToolbarIntent.DockStateChanged -> + _state.value = _state.value.copy(dockedState = intent.dockedState) is ToolbarIntent.ExpandToolbar -> expandOrCollapseToolbar(isExpanded = true) is ToolbarIntent.CollapseToolbar -> expandOrCollapseToolbar(isExpanded = false) } diff --git a/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/layout/AnnotationToolbarConstraintSet.kt b/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/layout/AnnotationToolbarConstraintSet.kt new file mode 100644 index 0000000000000..6f50009964f9f --- /dev/null +++ b/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/layout/AnnotationToolbarConstraintSet.kt @@ -0,0 +1,288 @@ +/* + * Copyright 2026 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package androidx.pdf.ink.view.layout + +import android.content.Context +import androidx.constraintlayout.widget.ConstraintSet +import androidx.pdf.ink.R +import androidx.pdf.ink.view.draganddrop.ToolbarDockState +import androidx.pdf.ink.view.draganddrop.ToolbarDockState.Companion.DOCK_STATE_BOTTOM +import androidx.pdf.ink.view.draganddrop.ToolbarDockState.Companion.DOCK_STATE_END +import androidx.pdf.ink.view.draganddrop.ToolbarDockState.Companion.DOCK_STATE_START + +internal class AnnotationToolbarConstraintSet(context: Context) { + + private val margin16dp = context.resources.getDimensionPixelSize(R.dimen.margin_16dp) + private val colorPaletteMaxWidth = + context.resources.getDimensionPixelSize(R.dimen.color_palette_max_width) + + val dockStateStart: ConstraintSet = createConstraintSetFor(DOCK_STATE_START) + val dockStateEnd: ConstraintSet = createConstraintSetFor(DOCK_STATE_END) + val dockStateBottom: ConstraintSet = createConstraintSetFor(DOCK_STATE_BOTTOM) + + /** + * Creates a new [ConstraintSet] configured for the given [ToolbarDockState.DockState]. This is + * the main factory method that delegates to helper functions. + */ + private fun createConstraintSetFor(@ToolbarDockState.DockState dockState: Int): ConstraintSet { + return ConstraintSet().apply { + applyToolTrayConstraints(dockState) + applyColorPaletteConstraints(dockState) + applyBrushSliderConstraints(dockState) + } + } + + /** Applies the constraints for the main `scrollable_tool_tray_container`. */ + private fun ConstraintSet.applyToolTrayConstraints(@ToolbarDockState.DockState dockState: Int) { + clear(R.id.scrollable_tool_tray_container, ConstraintSet.TOP) + clear(R.id.scrollable_tool_tray_container, ConstraintSet.BOTTOM) + clear(R.id.scrollable_tool_tray_container, ConstraintSet.START) + clear(R.id.scrollable_tool_tray_container, ConstraintSet.END) + + constrainWidth(R.id.scrollable_tool_tray_container, ConstraintSet.WRAP_CONTENT) + constrainHeight(R.id.scrollable_tool_tray_container, ConstraintSet.WRAP_CONTENT) + + when (dockState) { + DOCK_STATE_START -> { + connect( + R.id.scrollable_tool_tray_container, + ConstraintSet.TOP, + ConstraintSet.PARENT_ID, + ConstraintSet.TOP, + ) + connect( + R.id.scrollable_tool_tray_container, + ConstraintSet.BOTTOM, + ConstraintSet.PARENT_ID, + ConstraintSet.BOTTOM, + ) + connect( + R.id.scrollable_tool_tray_container, + ConstraintSet.START, + ConstraintSet.PARENT_ID, + ConstraintSet.START, + ) + } + DOCK_STATE_END -> { + connect( + R.id.scrollable_tool_tray_container, + ConstraintSet.TOP, + ConstraintSet.PARENT_ID, + ConstraintSet.TOP, + ) + connect( + R.id.scrollable_tool_tray_container, + ConstraintSet.BOTTOM, + ConstraintSet.PARENT_ID, + ConstraintSet.BOTTOM, + ) + connect( + R.id.scrollable_tool_tray_container, + ConstraintSet.END, + ConstraintSet.PARENT_ID, + ConstraintSet.END, + ) + } + DOCK_STATE_BOTTOM -> { + connect( + R.id.scrollable_tool_tray_container, + ConstraintSet.START, + ConstraintSet.PARENT_ID, + ConstraintSet.START, + ) + connect( + R.id.scrollable_tool_tray_container, + ConstraintSet.END, + ConstraintSet.PARENT_ID, + ConstraintSet.END, + ) + connect( + R.id.scrollable_tool_tray_container, + ConstraintSet.BOTTOM, + ConstraintSet.PARENT_ID, + ConstraintSet.BOTTOM, + ) + } + } + } + + /** Applies the constraints for the `color_palette` view. */ + private fun ConstraintSet.applyColorPaletteConstraints( + @ToolbarDockState.DockState dockState: Int + ) { + clear(R.id.color_palette, ConstraintSet.TOP) + clear(R.id.color_palette, ConstraintSet.BOTTOM) + clear(R.id.color_palette, ConstraintSet.START) + clear(R.id.color_palette, ConstraintSet.END) + setVisibility(R.id.color_palette, ConstraintSet.GONE) + + when (dockState) { + DOCK_STATE_START -> { + constrainWidth(R.id.color_palette, colorPaletteMaxWidth) + constrainHeight(R.id.color_palette, ConstraintSet.MATCH_CONSTRAINT) + connect( + R.id.color_palette, + ConstraintSet.TOP, + R.id.scrollable_tool_tray_container, + ConstraintSet.TOP, + ) + connect( + R.id.color_palette, + ConstraintSet.BOTTOM, + R.id.scrollable_tool_tray_container, + ConstraintSet.BOTTOM, + ) + connect( + R.id.color_palette, + ConstraintSet.START, + R.id.scrollable_tool_tray_container, + ConstraintSet.END, + ) + setMargin(R.id.color_palette, ConstraintSet.START, margin16dp) + } + DOCK_STATE_END -> { + constrainWidth(R.id.color_palette, colorPaletteMaxWidth) + constrainHeight(R.id.color_palette, ConstraintSet.MATCH_CONSTRAINT) + connect( + R.id.color_palette, + ConstraintSet.TOP, + R.id.scrollable_tool_tray_container, + ConstraintSet.TOP, + ) + connect( + R.id.color_palette, + ConstraintSet.BOTTOM, + R.id.scrollable_tool_tray_container, + ConstraintSet.BOTTOM, + ) + connect( + R.id.color_palette, + ConstraintSet.END, + R.id.scrollable_tool_tray_container, + ConstraintSet.START, + ) + setMargin(R.id.color_palette, ConstraintSet.END, margin16dp) + } + DOCK_STATE_BOTTOM -> { + constrainWidth(R.id.color_palette, ConstraintSet.MATCH_CONSTRAINT) + constrainHeight(R.id.color_palette, ConstraintSet.WRAP_CONTENT) + connect( + R.id.color_palette, + ConstraintSet.START, + R.id.scrollable_tool_tray_container, + ConstraintSet.START, + ) + connect( + R.id.color_palette, + ConstraintSet.END, + R.id.scrollable_tool_tray_container, + ConstraintSet.END, + ) + connect( + R.id.color_palette, + ConstraintSet.BOTTOM, + R.id.scrollable_tool_tray_container, + ConstraintSet.TOP, + ) + setMargin(R.id.color_palette, ConstraintSet.BOTTOM, margin16dp) + } + } + } + + /** Applies the constraints for the `brush_size_selector` view. */ + private fun ConstraintSet.applyBrushSliderConstraints( + @ToolbarDockState.DockState dockState: Int + ) { + clear(R.id.brush_size_selector, ConstraintSet.TOP) + clear(R.id.brush_size_selector, ConstraintSet.BOTTOM) + clear(R.id.brush_size_selector, ConstraintSet.START) + clear(R.id.brush_size_selector, ConstraintSet.END) + setVisibility(R.id.brush_size_selector, ConstraintSet.GONE) + + when (dockState) { + DOCK_STATE_START -> { + constrainWidth(R.id.brush_size_selector, ConstraintSet.WRAP_CONTENT) + constrainHeight(R.id.brush_size_selector, ConstraintSet.MATCH_CONSTRAINT) + connect( + R.id.brush_size_selector, + ConstraintSet.TOP, + R.id.scrollable_tool_tray_container, + ConstraintSet.TOP, + ) + connect( + R.id.brush_size_selector, + ConstraintSet.BOTTOM, + R.id.scrollable_tool_tray_container, + ConstraintSet.BOTTOM, + ) + connect( + R.id.brush_size_selector, + ConstraintSet.START, + R.id.scrollable_tool_tray_container, + ConstraintSet.END, + ) + setMargin(R.id.brush_size_selector, ConstraintSet.START, margin16dp) + } + DOCK_STATE_END -> { + constrainWidth(R.id.brush_size_selector, ConstraintSet.WRAP_CONTENT) + constrainHeight(R.id.brush_size_selector, ConstraintSet.MATCH_CONSTRAINT) + connect( + R.id.brush_size_selector, + ConstraintSet.TOP, + R.id.scrollable_tool_tray_container, + ConstraintSet.TOP, + ) + connect( + R.id.brush_size_selector, + ConstraintSet.BOTTOM, + R.id.scrollable_tool_tray_container, + ConstraintSet.BOTTOM, + ) + connect( + R.id.brush_size_selector, + ConstraintSet.END, + R.id.scrollable_tool_tray_container, + ConstraintSet.START, + ) + setMargin(R.id.brush_size_selector, ConstraintSet.END, margin16dp) + } + DOCK_STATE_BOTTOM -> { + constrainWidth(R.id.brush_size_selector, ConstraintSet.MATCH_CONSTRAINT) + constrainHeight(R.id.brush_size_selector, ConstraintSet.WRAP_CONTENT) + connect( + R.id.brush_size_selector, + ConstraintSet.START, + R.id.scrollable_tool_tray_container, + ConstraintSet.START, + ) + connect( + R.id.brush_size_selector, + ConstraintSet.END, + R.id.scrollable_tool_tray_container, + ConstraintSet.END, + ) + connect( + R.id.brush_size_selector, + ConstraintSet.BOTTOM, + R.id.scrollable_tool_tray_container, + ConstraintSet.TOP, + ) + setMargin(R.id.brush_size_selector, ConstraintSet.BOTTOM, margin16dp) + } + } + } +} diff --git a/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/state/AnnotationToolbarState.kt b/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/state/AnnotationToolbarState.kt index 166b5cd309e57..a836d971ffaf7 100644 --- a/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/state/AnnotationToolbarState.kt +++ b/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/state/AnnotationToolbarState.kt @@ -23,6 +23,7 @@ import androidx.core.os.ParcelCompat import androidx.pdf.ink.view.brush.BrushSizeSelectorView import androidx.pdf.ink.view.colorpalette.ColorPaletteView import androidx.pdf.ink.view.colorpalette.model.PaletteItem +import androidx.pdf.ink.view.draganddrop.ToolbarDockState import androidx.pdf.ink.view.tool.model.AnnotationToolsKey.HIGHLIGHTER import androidx.pdf.ink.view.tool.model.AnnotationToolsKey.PEN @@ -116,6 +117,9 @@ internal data class AnnotationToolbarState( */ val highlighterState: ToolAttributes, + /** The current docking state of the toolbar. */ + @get:ToolbarDockState.DockState @param:ToolbarDockState.DockState val dockedState: Int, + /** Whether the toolbar is currently expanded. */ val isExpanded: Boolean, ) : Parcelable { @@ -147,6 +151,7 @@ internal data class AnnotationToolbarState( ToolAttributes::class.java, ) ), + dockedState = parcel.readInt(), isExpanded = parcel.readByte() != 0.toByte(), ) @@ -160,6 +165,7 @@ internal data class AnnotationToolbarState( parcel.writeByte(if (isColorPaletteVisible) 1 else 0) parcel.writeParcelable(penState, flags) parcel.writeParcelable(highlighterState, flags) + parcel.writeInt(dockedState) parcel.writeByte(if (isExpanded) 1 else 0) } diff --git a/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/state/ToolbarInitializer.kt b/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/state/ToolbarInitializer.kt index 04ac89f88304f..02642d1a38e40 100644 --- a/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/state/ToolbarInitializer.kt +++ b/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/state/ToolbarInitializer.kt @@ -19,11 +19,17 @@ package androidx.pdf.ink.view.state import android.content.Context import androidx.pdf.ink.view.colorpalette.model.getHighlightPaletteItems import androidx.pdf.ink.view.colorpalette.model.getPenPaletteItems +import androidx.pdf.ink.view.draganddrop.ToolbarDockState.Companion.DOCK_STATE_BOTTOM +import androidx.pdf.ink.view.draganddrop.ToolbarDockState.Companion.DOCK_STATE_END import androidx.pdf.ink.view.tool.model.AnnotationToolsKey.PEN /** Responsible for creating the fully-formed initial state for the annotation toolbar */ internal object ToolbarInitializer { + // The smallest screen width threshold in density-independent pixels (dp) used to differentiate + // between phone and tablet form factors. + private const val TABLET_SMALLEST_SCREEN_WIDTH_DP = 600 + /** * Creates the default initial `AnnotationToolbarState`. * @@ -57,7 +63,23 @@ internal object ToolbarInitializer { selectedColorIndex = defaultHighlighterColorIndex, paletteItem = highlightPaletteItems[defaultHighlighterColorIndex], ), + dockedState = getDefaultDockState(context), isExpanded = true, ) } + + /** + * Determines the default dock state for the toolbar based on the device's screen size. + * - On tablets (smallest width >= 600dp), it returns [DOCK_STATE_END] to place the toolbar + * vertically on the side. + * - On phones, it returns [DOCK_STATE_BOTTOM] to place the toolbar horizontally at the bottom. + * + * @param context The context used to access screen configuration. + * @return The calculated default dock state. + */ + private fun getDefaultDockState(context: Context): Int { + val screenWidthDp = context.resources.configuration.smallestScreenWidthDp + return if (screenWidthDp >= TABLET_SMALLEST_SCREEN_WIDTH_DP) DOCK_STATE_END + else DOCK_STATE_BOTTOM + } } diff --git a/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/state/ToolbarIntentAndEffects.kt b/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/state/ToolbarIntentAndEffects.kt index ab33f093ed837..d5054af05d52f 100644 --- a/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/state/ToolbarIntentAndEffects.kt +++ b/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/state/ToolbarIntentAndEffects.kt @@ -71,6 +71,9 @@ internal sealed interface ToolbarIntent { /** Intent to dismiss any popups(brush slider, color palette) shown. */ object DismissPopups : ToolbarIntent + /** Intent to update the docked state of the toolbar. */ + data class DockStateChanged(val dockedState: Int) : ToolbarIntent + /** Intent to expand the toolbar. */ object ExpandToolbar : ToolbarIntent diff --git a/pdf/pdf-ink/src/main/res/layout/annotation_toolbar.xml b/pdf/pdf-ink/src/main/res/layout/annotation_toolbar.xml index 9e9216d383f96..7a097226249c9 100644 --- a/pdf/pdf-ink/src/main/res/layout/annotation_toolbar.xml +++ b/pdf/pdf-ink/src/main/res/layout/annotation_toolbar.xml @@ -21,21 +21,29 @@ android:animateLayoutChanges="true" android:padding="@dimen/padding_8dp"> - - - + + + + + + + - 12dp 16dp 8dp + 176dp 48dp @@ -40,5 +41,8 @@ 40dp 1dp 28dp + + 388dp + 72dp \ No newline at end of file diff --git a/pdf/pdf-ink/src/test/kotlin/androidx/pdf/ink/view/state/AnnotationToolbarViewModelTest.kt b/pdf/pdf-ink/src/test/kotlin/androidx/pdf/ink/view/state/AnnotationToolbarViewModelTest.kt index 24725af20f27b..37a6966f7f280 100644 --- a/pdf/pdf-ink/src/test/kotlin/androidx/pdf/ink/view/state/AnnotationToolbarViewModelTest.kt +++ b/pdf/pdf-ink/src/test/kotlin/androidx/pdf/ink/view/state/AnnotationToolbarViewModelTest.kt @@ -19,6 +19,7 @@ package androidx.pdf.ink.view.state import androidx.pdf.ink.view.AnnotationToolbarViewModel import androidx.pdf.ink.view.brush.model.BrushSizes import androidx.pdf.ink.view.colorpalette.model.Color +import androidx.pdf.ink.view.draganddrop.ToolbarDockState.Companion.DOCK_STATE_BOTTOM import androidx.pdf.ink.view.tool.Eraser import androidx.pdf.ink.view.tool.Highlighter import androidx.pdf.ink.view.tool.Pen @@ -50,6 +51,7 @@ class AnnotationToolbarViewModelTest { canRedo = false, highlighterState = ToolAttributes(1, 2, Color(123, 4, 5, "blue color")), penState = ToolAttributes(2, 3, Color(123, 4, 5, "red color")), + dockedState = DOCK_STATE_BOTTOM, isExpanded = true, ) @@ -325,6 +327,7 @@ class AnnotationToolbarViewModelTest { canRedo = false, highlighterState = ToolAttributes(1, 2, Color(123, 4, 5, "blue color")), penState = ToolAttributes(2, 3, Color(123, 4, 5, "red color")), + dockedState = DOCK_STATE_BOTTOM, isExpanded = true, ) val collectedEffects = mutableListOf() @@ -370,6 +373,18 @@ class AnnotationToolbarViewModelTest { assertThat(viewmodel.state.value.isBrushSizeSliderVisible).isFalse() } + @Test + fun onAction_DockedStateChanged_updatesState() { + val viewmodel = createViewModel() + // Assuming the initial state is DOCK_STATE_BOTTOM, change it to DOCK_STATE_END + val newDockState = + androidx.pdf.ink.view.draganddrop.ToolbarDockState.Companion.DOCK_STATE_END + + viewmodel.onAction(ToolbarIntent.DockStateChanged(newDockState)) + + assertThat(viewmodel.state.value.dockedState).isEqualTo(newDockState) + } + private fun CoroutineScope.collectInto(flow: Flow, destination: MutableList): Job { // We launch on the receiver CoroutineScope. Dispatchers.Unconfined is good for eager tests. return launch(Dispatchers.Unconfined) { flow.collect { destination.add(it) } } From ed5b2895cd3712e74b18a4b11a14800de93dbd08 Mon Sep 17 00:00:00 2001 From: Rahul Kanojia Date: Mon, 12 Jan 2026 19:12:00 -0800 Subject: [PATCH 07/14] Revert "Revert "feat(view): Add ToolbarCoordinator for drag-and-..." Revert submission 3912621-revert-3907980-drag-and-drop-FPUDSWLHLS Reason for revert: Relanding with fix for b/475234286. The aosp cuttlefish emulator contains a bottom nav bar, which obstructs views present at bottom after API 35 enabled edge-to-edge by default. The fix adjusts container to be drawn below status bar and above nav bars. Reverted changes: /q/submissionid:3912621-revert-3907980-drag-and-drop-FPUDSWLHLS Bug: b/472376731 Change-Id: I0f8efd1a92113dc37147d76845e84ea91295be35 --- .../draganddrop/ToolbarCoordinatorTest.kt | 142 +++++++++++ .../androidx/pdf/util/ToolbarViewActions.kt | 80 +++++++ .../pdf/ink/view/draganddrop/AnchorManager.kt | 94 ++++++++ .../view/draganddrop/ToolbarCoordinator.kt | 221 ++++++++++++++++++ .../main/res/drawable/anchor_background.xml | 26 +++ .../res/layout/annotation_toolbar_layout.xml | 4 +- .../main/res/layout/toolbar_coordinator.xml | 49 ++++ pdf/pdf-ink/src/main/res/values/ids.xml | 1 + .../ink/view/draganddrop/AnchorManagerTest.kt | 122 ++++++++++ 9 files changed, 736 insertions(+), 3 deletions(-) create mode 100644 pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/ink/view/draganddrop/ToolbarCoordinatorTest.kt create mode 100644 pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/util/ToolbarViewActions.kt create mode 100644 pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/draganddrop/AnchorManager.kt create mode 100644 pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/draganddrop/ToolbarCoordinator.kt create mode 100644 pdf/pdf-ink/src/main/res/drawable/anchor_background.xml create mode 100644 pdf/pdf-ink/src/main/res/layout/toolbar_coordinator.xml create mode 100644 pdf/pdf-ink/src/test/kotlin/androidx/pdf/ink/view/draganddrop/AnchorManagerTest.kt diff --git a/pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/ink/view/draganddrop/ToolbarCoordinatorTest.kt b/pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/ink/view/draganddrop/ToolbarCoordinatorTest.kt new file mode 100644 index 0000000000000..88ef751068469 --- /dev/null +++ b/pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/ink/view/draganddrop/ToolbarCoordinatorTest.kt @@ -0,0 +1,142 @@ +/* + * Copyright 2026 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package androidx.pdf.ink.view.draganddrop + +import android.view.Gravity +import android.view.ViewGroup +import android.widget.FrameLayout +import androidx.pdf.PdfTestActivity +import androidx.pdf.ink.view.AnnotationToolbar +import androidx.pdf.ink.view.draganddrop.ToolbarDockState.Companion.DOCK_STATE_BOTTOM +import androidx.pdf.ink.view.draganddrop.ToolbarDockState.Companion.DOCK_STATE_END +import androidx.pdf.ink.view.draganddrop.ToolbarDockState.Companion.DOCK_STATE_START +import androidx.pdf.util.ToolbarViewActions +import androidx.pdf.util.ToolbarViewActions.performDragAndDrop +import androidx.test.espresso.Espresso.onIdle +import androidx.test.espresso.Espresso.onView +import androidx.test.espresso.action.ViewActions.longClick +import androidx.test.espresso.matcher.ViewMatchers.withId +import androidx.test.ext.junit.rules.ActivityScenarioRule +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.platform.app.InstrumentationRegistry +import com.google.common.truth.Truth.assertThat +import org.junit.After +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +class ToolbarCoordinatorTest { + + @get:Rule val activityRule = ActivityScenarioRule(PdfTestActivity::class.java) + + private val instrumentation = InstrumentationRegistry.getInstrumentation() + private lateinit var coordinator: ToolbarCoordinator + private lateinit var toolbar: AnnotationToolbar + + @Before + fun setUp() { + activityRule.scenario.onActivity { activity -> + coordinator = + ToolbarCoordinator(activity).apply { + id = COORDINATOR_VIEW_ID + areAnimationsEnabled = false + } + toolbar = + AnnotationToolbar(activity).apply { + id = TOOLBAR_VIEW_ID + areAnimationsEnabled = false + } + // Use FrameLayout.LayoutParams since coordinator is added to a FrameLayout container + activity.container.addView( + coordinator, + FrameLayout.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT, + ), + ) + coordinator.attachToolbar(toolbar) + } + instrumentation.waitForIdleSync() + } + + @After + fun tearDown() { + activityRule.scenario.onActivity { activity -> activity.container.removeAllViews() } + PdfTestActivity.onCreateCallback = {} + } + + @Test + fun attachToolbar_setsInitialStateToBottom() { + onIdle() + assertThat(toolbar.dockState).isEqualTo(DOCK_STATE_BOTTOM) + + val params = toolbar.layoutParams as FrameLayout.LayoutParams + assertThat(params.gravity).isEqualTo(Gravity.BOTTOM or Gravity.CENTER_HORIZONTAL) + } + + @Test + fun dragAndDrop_toLeftSide_snapsToStart() { + onView(withId(TOOLBAR_VIEW_ID)).perform(longClick()) + onIdle() + + performDragAndDrop(toolbarId = TOOLBAR_VIEW_ID, to = ToolbarViewActions.DragTarget.LEFT) + onIdle() + + // Verify dock state updated to START + assertThat(toolbar.dockState).isEqualTo(DOCK_STATE_START) + + val params = toolbar.layoutParams as FrameLayout.LayoutParams + assertThat(params.gravity).isEqualTo(Gravity.CENTER_VERTICAL or Gravity.START) + } + + @Test + fun dragAndDrop_toRightSide_snapsToEnd() { + onView(withId(TOOLBAR_VIEW_ID)).perform(longClick()) + onIdle() + + performDragAndDrop(toolbarId = TOOLBAR_VIEW_ID, to = ToolbarViewActions.DragTarget.RIGHT) + onIdle() + + assertThat(toolbar.dockState).isEqualTo(DOCK_STATE_END) + val params = toolbar.layoutParams as FrameLayout.LayoutParams + assertThat(params.gravity).isEqualTo(Gravity.CENTER_VERTICAL or Gravity.END) + } + + @Test + fun dragAndDrop_toBottomSide_snapsToBottom() { + // Move to Start first so we can drag back to bottom + activityRule.scenario.onActivity { toolbar.dockState = DOCK_STATE_START } + onIdle() + + onView(withId(TOOLBAR_VIEW_ID)).perform(longClick()) + onIdle() + + performDragAndDrop(toolbarId = TOOLBAR_VIEW_ID, to = ToolbarViewActions.DragTarget.BOTTOM) + onIdle() + + assertThat(toolbar.dockState).isEqualTo(DOCK_STATE_BOTTOM) + val params = toolbar.layoutParams as FrameLayout.LayoutParams + assertThat(params.gravity).isEqualTo(Gravity.BOTTOM or Gravity.CENTER_HORIZONTAL) + } + + companion object { + private const val COORDINATOR_VIEW_ID = 1001 + private const val TOOLBAR_VIEW_ID = 1002 + } +} diff --git a/pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/util/ToolbarViewActions.kt b/pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/util/ToolbarViewActions.kt new file mode 100644 index 0000000000000..593fd3f6e001f --- /dev/null +++ b/pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/util/ToolbarViewActions.kt @@ -0,0 +1,80 @@ +/* + * Copyright 2026 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package androidx.pdf.util + +import android.view.View +import androidx.pdf.ink.view.draganddrop.ToolbarCoordinator +import androidx.test.espresso.Espresso.onView +import androidx.test.espresso.action.GeneralLocation +import androidx.test.espresso.action.GeneralSwipeAction +import androidx.test.espresso.action.Press +import androidx.test.espresso.action.Swipe +import androidx.test.espresso.matcher.ViewMatchers.withId + +internal object ToolbarViewActions { + + // Space from boundary of the view + private const val DELTA_FROM_BOUNDARY = 10f + + /** + * Performs a drag and drop action from the center of the toolbar to a specified target edge of + * the [ToolbarCoordinator]. + * + * @param to The target edge to drag the toolbar towards. + */ + fun performDragAndDrop(toolbarId: Int, to: DragTarget) { + onView(withId(toolbarId)) + .perform( + GeneralSwipeAction( + Swipe.FAST, + GeneralLocation.CENTER, + { view -> + val coordinator = view.parent as View + val screenPos = IntArray(2) + coordinator.getLocationOnScreen(screenPos) + val x: Float + val y: Float + + when (to) { + DragTarget.LEFT -> { + x = screenPos[0].toFloat() + DELTA_FROM_BOUNDARY + y = screenPos[1].toFloat() + (coordinator.height / 2f) + } + DragTarget.RIGHT -> { + x = screenPos[0].toFloat() + coordinator.width - DELTA_FROM_BOUNDARY + y = screenPos[1].toFloat() + (coordinator.height / 2f) + } + DragTarget.BOTTOM -> { + x = screenPos[0].toFloat() + (coordinator.width / 2f) + y = + screenPos[1].toFloat() + coordinator.height - + DELTA_FROM_BOUNDARY + } + } + floatArrayOf(x, y) + }, + Press.FINGER, + ) + ) + } + + enum class DragTarget { + LEFT, + RIGHT, + BOTTOM, + } +} diff --git a/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/draganddrop/AnchorManager.kt b/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/draganddrop/AnchorManager.kt new file mode 100644 index 0000000000000..14c29d0d1a750 --- /dev/null +++ b/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/draganddrop/AnchorManager.kt @@ -0,0 +1,94 @@ +/* + * Copyright 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package androidx.pdf.ink.view.draganddrop + +import android.view.View +import androidx.pdf.ink.view.draganddrop.ToolbarDockState.Companion.DOCK_STATE_BOTTOM +import androidx.pdf.ink.view.draganddrop.ToolbarDockState.Companion.DOCK_STATE_END +import androidx.pdf.ink.view.draganddrop.ToolbarDockState.Companion.DOCK_STATE_START +import kotlin.math.hypot + +/** + * Manages a set of views that act as anchor points for a drag-and-drop operation. + * + * This class is responsible for: + * - Toggling the visibility of the anchor views. + * - Calculating which anchor is closest to a given point on the screen. + * - Providing visual feedback by highlighting the closest (active) anchor. + * + * @param left The [View] representing the anchor on the start/left side. + * @param right The [View] representing the anchor on the end/right side. + * @param bottom The [View] representing the anchor on the bottom. + */ +internal class AnchorManager( + private val left: View, + private val right: View, + private val bottom: View, +) { + + private val anchors = + mapOf(DOCK_STATE_START to left, DOCK_STATE_END to right, DOCK_STATE_BOTTOM to bottom) + + fun showAnchors() { + anchors.values.forEach { view -> + // Reset to inactive state initially + view.alpha = ALPHA_INACTIVE + view.visibility = View.VISIBLE + } + } + + fun hideAnchors() { + anchors.values.forEach { it.visibility = View.GONE } + } + + /** Calculates nearest anchor, updates UI highlights, and returns the closest State. */ + fun updateHighlightingAndGetClosest( + currentX: Float, + currentY: Float, + viewWidth: Int, + viewHeight: Int, + ): Int { + val centerX = currentX + viewWidth / 2 + val centerY = currentY + viewHeight / 2 + + val closestEntry = anchors.minByOrNull { (_, view) -> getDistance(centerX, centerY, view) } + + anchors.values.forEach { it.alpha = ALPHA_INACTIVE } + + // Highlight the closest one and return its state. + closestEntry?.let { (state, view) -> + view.alpha = ALPHA_ACTIVE + return state + } + + return DOCK_STATE_BOTTOM + } + + fun getAnchorView(@ToolbarDockState.DockState state: Int): View? = anchors[state] + + private fun getDistance(x1: Float, y1: Float, target: View): Float { + val x2 = target.x + target.width / 2 + val y2 = target.y + target.height / 2 + return hypot(x1 - x2, y1 - y2) + } + + companion object { + // Opacity values for visual feedback + private const val ALPHA_ACTIVE = 0.8f + private const val ALPHA_INACTIVE = 0.3f + } +} diff --git a/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/draganddrop/ToolbarCoordinator.kt b/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/draganddrop/ToolbarCoordinator.kt new file mode 100644 index 0000000000000..bb2fa9bbf5662 --- /dev/null +++ b/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/draganddrop/ToolbarCoordinator.kt @@ -0,0 +1,221 @@ +/* + * Copyright 2026 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package androidx.pdf.ink.view.draganddrop + +import android.content.Context +import android.util.AttributeSet +import android.view.Gravity +import android.view.LayoutInflater +import android.view.MotionEvent +import android.view.animation.OvershootInterpolator +import android.widget.FrameLayout +import androidx.pdf.ink.R +import androidx.pdf.ink.view.AnnotationToolbar +import androidx.pdf.ink.view.draganddrop.ToolbarDockState.Companion.DOCK_STATE_BOTTOM +import androidx.pdf.ink.view.draganddrop.ToolbarDockState.Companion.DOCK_STATE_END +import androidx.pdf.ink.view.draganddrop.ToolbarDockState.Companion.DOCK_STATE_START +import org.jetbrains.annotations.VisibleForTesting + +/** + * A [FrameLayout] layout that manages the dragging, dropping, and docking of an + * [AnnotationToolbar]. + * + * This coordinator is responsible for providing visible anchor points for docking, listening for + * drag gestures initiated on the attached toolbar, moving the toolbar in response to the user's + * drag input and finally snapping it to the closest anchor when the drag ends. + * + * It also applied the correct layout parameters and orientation for toolbar's final docked state. + */ +internal class ToolbarCoordinator(context: Context, attrs: AttributeSet? = null) : + FrameLayout(context, attrs) { + + // Required to disable any animation while performing ui tests + @VisibleForTesting internal var areAnimationsEnabled: Boolean = true + + private var toolbar: AnnotationToolbar? = null + + private val anchorManager: AnchorManager + + private lateinit var toolbarDragListener: ToolbarDragListener + + private val collapseToolWidth = resources.getDimensionPixelSize(R.dimen.annotation_tool_width) + private val collapsedToolHeight = + resources.getDimensionPixelSize(R.dimen.annotation_tool_height) + + private val margin16Dp = resources.getDimensionPixelSize(R.dimen.margin_16dp) + + init { + LayoutInflater.from(context).inflate(R.layout.toolbar_coordinator, this, true) + + anchorManager = + AnchorManager( + left = findViewById(R.id.anchorLeft), + right = findViewById(R.id.anchorRight), + bottom = findViewById(R.id.anchorBottom), + ) + } + + /** + * Attaches the [AnnotationToolbar] to this coordinator and sets up drag-and-drop handling. + * + * @param view The [AnnotationToolbar] instance to manage. + */ + fun attachToolbar(view: AnnotationToolbar) { + // Remove if already added + toolbar?.let { removeView(it) } + + this.toolbar = view + + addView(view) + initializeDragAndDrop() + updateLayout() + } + + /** Re-applies the layout constraints for the toolbar's current dock state. */ + fun updateLayout() { + toolbar?.post { + applyDockLayoutParams( + toolbar?.dockState ?: throw IllegalStateException("dock state not initialized") + ) + } + } + + private fun initializeDragAndDrop() { + val toolbar = toolbar ?: return + val isToolbarVertical = toolbar.dockState != DOCK_STATE_BOTTOM + + toolbarDragListener = + object : ToolbarDragListener { + + override fun onDragStart(event: MotionEvent) { + anchorManager.showAnchors() + toolbar.collapseToolbar() + } + + override fun onDragMove(event: MotionEvent) { + val collapseViewSize = + if (isToolbarVertical) collapsedToolHeight else collapseToolWidth + toolbar.x = event.rawX - collapseViewSize + toolbar.y = event.rawY - collapseViewSize + + anchorManager.updateHighlightingAndGetClosest( + toolbar.x, + toolbar.y, + toolbar.width, + toolbar.height, + ) + } + + override fun onDragEnd() { + val closestState = + anchorManager.updateHighlightingAndGetClosest( + toolbar.x, + toolbar.y, + toolbar.width, + toolbar.height, + ) + + anchorManager.hideAnchors() + + snapToState(closestState) + } + } + + toolbar.setOnToolbarDragListener(toolbarDragListener) + } + + /** + * Animates the toolbar to its final position over the target anchor. + * + * @param state The target [ToolbarDockState] to snap to. + */ + private fun snapToState(@ToolbarDockState.DockState state: Int) { + val localToolbar = toolbar ?: return + val targetAnchor = anchorManager.getAnchorView(state) ?: return + + // Calculate target position (centering toolbar over anchor) + val targetX = targetAnchor.x + (targetAnchor.width / 2) - (localToolbar.width / 2) + val targetY = targetAnchor.y + (targetAnchor.height / 2) - (localToolbar.height / 2) + + dockToolbar(localToolbar, targetX, targetY, state) + } + + private fun dockToolbar( + toolbar: AnnotationToolbar, + targetX: Float, + targetY: Float, + state: Int, + ) { + if (areAnimationsEnabled) { + toolbar + .animate() + .x(targetX) + .y(targetY) + .setDuration(SNAP_ANIMATION_DURATION) + .setInterpolator(OvershootInterpolator(SNAP_BOUNCE_TENSION)) // The "Snap" bounce + .withEndAction { + applyDockLayoutParams(state) + toolbar.post { toolbar.expandToolbar() } + } + .start() + } else { + toolbar.x = targetX + toolbar.y = targetY + applyDockLayoutParams(state) + toolbar.post { toolbar.expandToolbar() } + } + } + + /** + * Applies the final layout parameters to the toolbar based on its new docked state. + * + * @param state The target [ToolbarDockState]. + */ + private fun applyDockLayoutParams(@ToolbarDockState.DockState state: Int) { + val localToolbar = toolbar ?: return + + val params = LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT) + + // Reset toolbar translation; critical as we previously animated view.translateX and + // view.translateY + localToolbar.translationX = 0f + localToolbar.translationY = 0f + + when (state) { + DOCK_STATE_START -> { + params.gravity = Gravity.CENTER_VERTICAL or Gravity.START + params.marginStart = margin16Dp + } + DOCK_STATE_END -> { + params.gravity = Gravity.CENTER_VERTICAL or Gravity.END + params.marginEnd = margin16Dp + } + DOCK_STATE_BOTTOM -> { + params.gravity = Gravity.BOTTOM or Gravity.CENTER_HORIZONTAL + params.bottomMargin = margin16Dp + } + } + + localToolbar.layoutParams = params + localToolbar.dockState = state + } + + companion object { + private const val SNAP_ANIMATION_DURATION = 250L + private const val SNAP_BOUNCE_TENSION = 1.0f + } +} diff --git a/pdf/pdf-ink/src/main/res/drawable/anchor_background.xml b/pdf/pdf-ink/src/main/res/drawable/anchor_background.xml new file mode 100644 index 0000000000000..cbca86fb9ad8a --- /dev/null +++ b/pdf/pdf-ink/src/main/res/drawable/anchor_background.xml @@ -0,0 +1,26 @@ + + + + + + + \ No newline at end of file diff --git a/pdf/pdf-ink/src/main/res/layout/annotation_toolbar_layout.xml b/pdf/pdf-ink/src/main/res/layout/annotation_toolbar_layout.xml index bc977721ce6c0..225e8e5eb7f0b 100644 --- a/pdf/pdf-ink/src/main/res/layout/annotation_toolbar_layout.xml +++ b/pdf/pdf-ink/src/main/res/layout/annotation_toolbar_layout.xml @@ -25,6 +25,4 @@ android:focusable="true" android:elevation="@dimen/annotation_toolbar_elevation" android:padding="@dimen/padding_8dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" /> + android:layout_gravity="bottom|center_horizontal"/> diff --git a/pdf/pdf-ink/src/main/res/layout/toolbar_coordinator.xml b/pdf/pdf-ink/src/main/res/layout/toolbar_coordinator.xml new file mode 100644 index 0000000000000..ceaf701c43def --- /dev/null +++ b/pdf/pdf-ink/src/main/res/layout/toolbar_coordinator.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/pdf/pdf-ink/src/main/res/values/ids.xml b/pdf/pdf-ink/src/main/res/values/ids.xml index 42f4ee8f27cfd..bfd6e5cc877da 100644 --- a/pdf/pdf-ink/src/main/res/values/ids.xml +++ b/pdf/pdf-ink/src/main/res/values/ids.xml @@ -16,4 +16,5 @@ + \ No newline at end of file diff --git a/pdf/pdf-ink/src/test/kotlin/androidx/pdf/ink/view/draganddrop/AnchorManagerTest.kt b/pdf/pdf-ink/src/test/kotlin/androidx/pdf/ink/view/draganddrop/AnchorManagerTest.kt new file mode 100644 index 0000000000000..23d4fce3f4e98 --- /dev/null +++ b/pdf/pdf-ink/src/test/kotlin/androidx/pdf/ink/view/draganddrop/AnchorManagerTest.kt @@ -0,0 +1,122 @@ +/* + * Copyright 2026 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package androidx.pdf.ink.view.draganddrop + +import android.content.Context +import android.view.View +import androidx.pdf.ink.view.draganddrop.ToolbarDockState.Companion.DOCK_STATE_BOTTOM +import androidx.pdf.ink.view.draganddrop.ToolbarDockState.Companion.DOCK_STATE_END +import androidx.pdf.ink.view.draganddrop.ToolbarDockState.Companion.DOCK_STATE_START +import androidx.test.core.app.ApplicationProvider +import com.google.common.truth.Truth.assertThat +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner + +@RunWith(RobolectricTestRunner::class) +@org.robolectric.annotation.Config(sdk = [org.robolectric.annotation.Config.TARGET_SDK]) +class AnchorManagerTest { + + private lateinit var context: Context + private lateinit var leftAnchor: View + private lateinit var rightAnchor: View + private lateinit var bottomAnchor: View + private lateinit var anchorManager: AnchorManager + + private val ALPHA_ACTIVE = 0.8f + private val ALPHA_INACTIVE = 0.3f + + @Before + fun setUp() { + context = ApplicationProvider.getApplicationContext() + leftAnchor = View(context) + rightAnchor = View(context) + bottomAnchor = View(context) + + // Give anchors some size and position for distance calculations + // Left: (0, 500), Right: (1000, 500), Bottom: (500, 1000) + leftAnchor.layout(0, 450, 100, 550) + rightAnchor.layout(900, 450, 1000, 550) + bottomAnchor.layout(450, 950, 550, 1050) + + anchorManager = AnchorManager(leftAnchor, rightAnchor, bottomAnchor) + } + + @Test + fun showAnchors_makesAllAnchorsVisibleAndInactive() { + anchorManager.showAnchors() + + assertThat(leftAnchor.visibility).isEqualTo(View.VISIBLE) + assertThat(rightAnchor.visibility).isEqualTo(View.VISIBLE) + assertThat(bottomAnchor.visibility).isEqualTo(View.VISIBLE) + + assertThat(leftAnchor.alpha).isEqualTo(ALPHA_INACTIVE) + assertThat(rightAnchor.alpha).isEqualTo(ALPHA_INACTIVE) + assertThat(bottomAnchor.alpha).isEqualTo(ALPHA_INACTIVE) + } + + @Test + fun hideAnchors_makesAllAnchorsGone() { + anchorManager.showAnchors() // First make them visible + anchorManager.hideAnchors() + + assertThat(leftAnchor.visibility).isEqualTo(View.GONE) + assertThat(rightAnchor.visibility).isEqualTo(View.GONE) + assertThat(bottomAnchor.visibility).isEqualTo(View.GONE) + } + + @Test + fun updateHighlighting_nearLeft_highlightsLeftAndReturnsStart() { + // Position "toolbar" center near left anchor (50, 500) + val state = + anchorManager.updateHighlightingAndGetClosest( + currentX = 0f, + currentY = 450f, + viewWidth = 100, + viewHeight = 100, + ) + + assertThat(state).isEqualTo(DOCK_STATE_START) + assertThat(leftAnchor.alpha).isEqualTo(ALPHA_ACTIVE) + assertThat(rightAnchor.alpha).isEqualTo(ALPHA_INACTIVE) + assertThat(bottomAnchor.alpha).isEqualTo(ALPHA_INACTIVE) + } + + @Test + fun updateHighlighting_nearBottom_highlightsBottomAndReturnsBottom() { + // Position "toolbar" center near bottom anchor (500, 1000) + val state = + anchorManager.updateHighlightingAndGetClosest( + currentX = 450f, + currentY = 950f, + viewWidth = 100, + viewHeight = 100, + ) + + assertThat(state).isEqualTo(DOCK_STATE_BOTTOM) + assertThat(bottomAnchor.alpha).isEqualTo(ALPHA_ACTIVE) + assertThat(leftAnchor.alpha).isEqualTo(ALPHA_INACTIVE) + } + + @Test + fun getAnchorView_returnsCorrectViewForState() { + assertThat(anchorManager.getAnchorView(DOCK_STATE_START)).isEqualTo(leftAnchor) + assertThat(anchorManager.getAnchorView(DOCK_STATE_END)).isEqualTo(rightAnchor) + assertThat(anchorManager.getAnchorView(DOCK_STATE_BOTTOM)).isEqualTo(bottomAnchor) + } +} From 161bf32291739085103b0d7ea28ea2b8f0ea6ab4 Mon Sep 17 00:00:00 2001 From: Rahul Kanojia Date: Mon, 12 Jan 2026 19:12:00 -0800 Subject: [PATCH 08/14] Revert "Revert "feat(fragment): Integrate ToolbarCoordinator in ..." Revert submission 3912621-revert-3907980-drag-and-drop-FPUDSWLHLS Reason for revert: Relanding with fix for b/475234286. The aosp cuttlefish emulator contains a bottom nav bar, which obstructs views present at bottom after API 35 enabled edge-to-edge by default. The fix adjusts container to be drawn below status bar and above nav bars. Reverted changes: /q/submissionid:3912621-revert-3907980-drag-and-drop-FPUDSWLHLS Bug: b/472376277 Test: ./gradlew :pdf:pdf-ink:connectedAndroidTest Change-Id: Ib433a2396936c59ebc65105c404ea9ab27746994 --- pdf/pdf-ink/build.gradle | 2 + .../src/androidTest/assets/sample_form.pdf | Bin 0 -> 16254 bytes .../EditablePdfViewerFragmentTests.kt | 225 ++++++++++++++++++ .../fragment/TestEditablePdfViewerFragment.kt | 108 +++++++++ .../androidx/pdf/util/FragmentTestUtils.kt | 59 +++++ .../androidx/pdf/util/PdfIdlingResource.kt | 47 ++++ .../kotlin/androidx/pdf/util/TestUtils.kt | 34 +++ .../androidx/pdf/util/ToolbarMatchers.kt | 65 +++++ .../pdf/ink/EditablePdfViewerFragment.kt | 45 +++- pdf/pdf-ink/src/main/res/values/ids.xml | 1 + 10 files changed, 582 insertions(+), 4 deletions(-) create mode 100755 pdf/pdf-ink/src/androidTest/assets/sample_form.pdf create mode 100644 pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/ink/fragment/EditablePdfViewerFragmentTests.kt create mode 100644 pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/ink/fragment/TestEditablePdfViewerFragment.kt create mode 100644 pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/util/FragmentTestUtils.kt create mode 100644 pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/util/PdfIdlingResource.kt create mode 100644 pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/util/TestUtils.kt create mode 100644 pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/util/ToolbarMatchers.kt diff --git a/pdf/pdf-ink/build.gradle b/pdf/pdf-ink/build.gradle index 5705ce05ddd03..79b1a25352436 100644 --- a/pdf/pdf-ink/build.gradle +++ b/pdf/pdf-ink/build.gradle @@ -69,7 +69,9 @@ dependencies { androidTestImplementation(libs.kotlinCoroutinesTest) androidTestImplementation(libs.espressoCore) androidTestImplementation(libs.bundles.espressoContrib) + androidTestImplementation(libs.espressoIdlingResource) androidTestImplementation(project(":test:screenshot:screenshot")) + androidTestImplementation("androidx.fragment:fragment-testing:1.7.1") } androidx { diff --git a/pdf/pdf-ink/src/androidTest/assets/sample_form.pdf b/pdf/pdf-ink/src/androidTest/assets/sample_form.pdf new file mode 100755 index 0000000000000000000000000000000000000000..ab9460180429c6eb07bfc43d5efc3e83bfccce54 GIT binary patch literal 16254 zcmeHO?{3>h693Mp*e?On0-^Q~_a9Ich}}9@v`tc5cfCW<4~i^1&dJhMR@(HQ=bqqj zPjG#)`^}JCQY4kAu4DBA8M3$>&MaqVhQFO1t{y!9;^dLaefB{7`tSe#>(~EeN=UJM z`C5GTSti72{L4RPVst!NPv*-@B0Qg5&TfPT(ZBr1vYYI||26*=7<(ged4rO~jom|7SC)_@o+{{>gGWhChwrUxeZqxMo z&1`YGegz$rBA%P|YBssfe&nc;g7lPPdYv7O*#L0)_yWv%A;#Z`FULeLd6Wn?*Ft$I z#@FKE_|?^oxS%+iLgC5P;^q@Eel5nIc7%#ZLe{d-^wn(o_m|7J@Y-Z?E>@HCtEG7P zX1!i^#mN~k8|mWmQ0YQS|ICUjary*}+*=(BIz}gb5Ua~<0i)a83T-96Riw{qCXPPM zzQdq3O%fnIsUKFq>7K}R<0Me&v!nVt z8NO`Q>X-H@4X={rRb|Xl{kG{@;5uws>(@7mEjUIKRkb>xgwN4!q5qE63OFeefn!LhVb0cY8dyy1`Z%eIfj}x(N zXg*=BL2dM?*-1h4QEFXxj5E4p;;!_lwEm7}(+Z5Md6g#M2Di(3oM)Pi>EQdT^UE2} z5GR1_qxFKWo``}EfJ-_)7d-J$^K>@Fln6{DL}Vb=Uh)h&77sBMoIhL4e>tvj`4f^D z|9Q)W$It7@a`d!rf&XtnbH&L6qrC|J`E5upGh7eDp8$zcYA4A7#53j`eb1IEdH*CvPl@r{uM^|ZF^onKU!@91Pw2ce z-&EI*AB%?tnXc^ZFXfGKQu&oE@w@%1Nx@;iV(Os@R-5G4dY(=G+#tNekGjshk{@*) zN!9QM{HU9(30KMay3Ujup`IUm5u-a1)A$ix(&)GNku390Kh_g|%av)~Z@JKJxRCDI zxR4^Xabf$xyAVZG){uU!2kMkEnvGJr~8v+ z*G+`JRa(7+pAOjjuuigCljLT(>cc!vs(hXZdw1~D0eWdkGvKPB73yD~y?l)|CP7y! zSyFwO2y|qJmNm;%$i*VA$|>Jd#-;SCOyjCDW|ZA3<|WE-Pw?Mao1vhGd4ldkAC&Sg zQsEHHKMSf3Zd3?wxIoCbQp=WAMwLhDD7!*YG{oqs&S!FO3V;EMlU^Ga#5}`gTR4Nt zq0gOmR6=yQ@g|}U6>{l4)%<*Jqc&*N6jaPSG?&Ppsi7Q-k?70j&T_>GC0A3R+yR=* zqYV*79V!h5MDjd?gp46XVe%M*(GfJ4M~ylq)`Ph#3d_2ogetuWz@NNOAr@M=+<7fg zrPR490%)KVP~S&Tq|yPi+!TFbX(Ju<%>xEtys&xUF}4kgauQ4p&oqOjOfXb6tL2JZ z2WcEE)=-qz1(uhvZ`7dSFF16$2ObJjWF8bVM)d$=ap=nL{>HDtI?`e<4da;Y)KLcbOl%xMs> z4#8>QBs5&)$U)auMsG1>)q4!)*{kdV4^6L*#igHaf^@$y5oG6G$6caCf54mNfpQAF z-vI-n21lGnfhXO&!UG_IE}q_5bb%2}$i^eysk{#w!BmMe`#@A2!0`Z%2XF*FZv)4n z+THzPMc`6m>qT%0j(DQ)1}b{^$Tj=@P6*rZk@Ch09>X?xz8koH>NfrBbH%!ZHWaDz3&GqDlE&e>_E*E!NFGxEOfCFa&!(x zukl(@0;`vCCWGCj*}v-yVh4X zbly6}^DEQ+hOoCE#-IJ*9jdb4Z#rYtmce>WMWKL|Pg=FKszJF#zEl0bCxly^6veI6 zk35ivO0)Ot+$~s)s@q-owja*>uW%YwYxUDIy3EcsdE^W}GGiMdalv=~d#GN~GT+tDX}8_IYi-F_q7=&%*a4iR3?#|hMSo~rv;w*O*}^}~}^UAD$Ap=dkgA1x~*^=ye| zX#O$bj8d>(iLg)n$ia-ZVec8t%y0?!5aL)N>;elWQ)Dvz3G9}_zQ_xa zX!Ofh`V)&pQ}lC>E-eCfI<&&}`7Aa`b@;HCsmI4Vbh>;f8h2%}g{Rk_DX?#=BWohP zoS?sE90eGAv;sdx?ebycT9;-G{Z3}HKZ{?qc4;p3?Z-bX?Z^g2zr@+>FVN<+4lNeg z`Uv>tncclRDWzrTWqQA^oKVTz58ODRM+RK z(AXl@k+rnXEz#Di$<=(eDu3xUI$bW;C_j`xY#5zg{c}dKj4g*Z>&a@((T$%T#+W^L K@a40UEc+jdTCCLo literal 0 HcmV?d00001 diff --git a/pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/ink/fragment/EditablePdfViewerFragmentTests.kt b/pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/ink/fragment/EditablePdfViewerFragmentTests.kt new file mode 100644 index 0000000000000..71f1aaca066e0 --- /dev/null +++ b/pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/ink/fragment/EditablePdfViewerFragmentTests.kt @@ -0,0 +1,225 @@ +/* + * Copyright 2026 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package androidx.pdf.ink.fragment + +import android.content.pm.ActivityInfo +import android.os.Build +import android.os.ext.SdkExtensions +import android.widget.LinearLayout +import androidx.annotation.RequiresExtension +import androidx.fragment.app.testing.FragmentScenario +import androidx.fragment.app.testing.launchFragmentInContainer +import androidx.lifecycle.Lifecycle +import androidx.pdf.R as PdfR +import androidx.pdf.ink.R +import androidx.pdf.ink.view.AnnotationToolbar +import androidx.pdf.ink.view.draganddrop.ToolbarDockState.Companion.DOCK_STATE_BOTTOM +import androidx.pdf.ink.view.draganddrop.ToolbarDockState.Companion.DOCK_STATE_END +import androidx.pdf.ink.view.draganddrop.ToolbarDockState.Companion.DOCK_STATE_START +import androidx.pdf.util.FragmentTestUtils.scenarioLoadDocument +import androidx.pdf.util.ToolbarMatchers.matchesToolbarMask +import androidx.pdf.util.ToolbarMatchers.withDockState +import androidx.pdf.util.ToolbarViewActions +import androidx.pdf.util.ToolbarViewActions.performDragAndDrop +import androidx.test.espresso.Espresso.onIdle +import androidx.test.espresso.Espresso.onView +import androidx.test.espresso.IdlingRegistry +import androidx.test.espresso.action.ViewActions +import androidx.test.espresso.action.ViewActions.click +import androidx.test.espresso.assertion.ViewAssertions.matches +import androidx.test.espresso.matcher.ViewMatchers.isDisplayed +import androidx.test.espresso.matcher.ViewMatchers.withId +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.LargeTest +import com.google.common.truth.Truth.assertThat +import org.hamcrest.CoreMatchers.not +import org.junit.After +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith + +@LargeTest +@RunWith(AndroidJUnit4::class) +@RequiresExtension(extension = Build.VERSION_CODES.S, version = 18) +class EditablePdfViewerFragmentTests { + private lateinit var scenario: FragmentScenario + + @Before + fun setup() { + scenario = + launchFragmentInContainer( + themeResId = + com.google.android.material.R.style.Theme_Material3_DayNight_NoActionBar, + initialState = Lifecycle.State.INITIALIZED, + ) + .onFragment { fragment -> + IdlingRegistry.getInstance() + .register(fragment.pdfLoadingIdlingResource.countingIdlingResource) + } + } + + @After + fun cleanup() { + if (!::scenario.isInitialized) return + + scenario.onFragment { fragment -> + IdlingRegistry.getInstance() + .unregister(fragment.pdfLoadingIdlingResource.countingIdlingResource) + } + scenario.close() + } + + private fun loadDocumentAndSetupFragment() { + scenarioLoadDocument( + scenario = scenario, + filename = TEST_DOCUMENT_FILE, + nextState = Lifecycle.State.RESUMED, + orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT, + ) + onIdle() // Wait for document to load + + scenario.onFragment { fragment -> + fragment.setIsAnnotationIntentResolvable(true) + fragment.isToolboxVisible = true + } + } + + private fun enterEditMode() { + onView(withId(PdfR.id.edit_fab)).apply { + check(matches(isDisplayed())) + perform(click()) + check(matches(not(isDisplayed()))) + } + onIdle() + } + + @Test + fun test_annotationToolbar_dockedAtBottom_andCanDragToStart() { + if (!isRequiredSdkExtensionAvailable()) return + + loadDocumentAndSetupFragment() + enterEditMode() + + onView(withId(R.id.annotationToolbar)) + .check(matches(isDisplayed())) + .check(matches(withDockState(DOCK_STATE_BOTTOM))) + + // Initiate drag event + onView(withId(R.id.annotationToolbar)).perform(ViewActions.longClick()) + onIdle() + // Verify toolbar collapses on long press + onView(withId(R.id.collapsed_tool)).check(matches(isDisplayed())) + + // Drag to the left side of the screen + performDragAndDrop( + toolbarId = R.id.annotationToolbar, + to = ToolbarViewActions.DragTarget.LEFT, + ) + onIdle() + + // Verify toolbar docked to the left side + onView(withId(R.id.annotationToolbar)).check(matches(withDockState(DOCK_STATE_START))) + + // Verify tool tray orientation is vertical + scenario.onFragment { fragment -> + val toolTray = fragment.view?.findViewById(R.id.tool_tray) + assertThat(toolTray?.orientation).isEqualTo(LinearLayout.VERTICAL) + } + } + + @Test + fun test_annotationToolbar_persistsDockStateThroughRotation() { + if (!isRequiredSdkExtensionAvailable()) return + + loadDocumentAndSetupFragment() + enterEditMode() + + // Move toolbar to the END (Right) side + onView(withId(R.id.annotationToolbar)).perform(ViewActions.longClick()) + performDragAndDrop( + toolbarId = R.id.annotationToolbar, + to = ToolbarViewActions.DragTarget.RIGHT, + ) + onIdle() + + // Rotate the device to Landscape + scenario.onFragment { fragment -> + fragment.activity?.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE + } + onIdle() + + // Verify it remains on the END side after rotation + onView(withId(R.id.annotationToolbar)).check(matches(withDockState(DOCK_STATE_END))) + } + + @Test + fun test_toolbarMovement_updatesWetStrokesMaskPath() { + if (!isRequiredSdkExtensionAvailable()) return + + loadDocumentAndSetupFragment() + enterEditMode() + + var toolbar: AnnotationToolbar? = null + scenario.onFragment { fragment -> + toolbar = fragment.view?.findViewById(R.id.annotationToolbar) + } + + // Initial check: Toolbar is at bottom, mask should be at bottom + onView(withId(R.id.pdf_wet_strokes_view)).check(matches(matchesToolbarMask(toolbar!!))) + + // Move the toolbar to the START (Left) side + onView(withId(R.id.annotationToolbar)).perform(ViewActions.longClick()) + performDragAndDrop( + R.id.annotationToolbar, + to = ToolbarViewActions.DragTarget.LEFT, + ) // Using the helper from previous step + onIdle() + + // Verify the mask path updated to the new location (START side) + onView(withId(R.id.pdf_wet_strokes_view)).check(matches(matchesToolbarMask(toolbar!!))) + } + + @Test + fun test_annotationToolbar_reExpands_onLongPressWithoutMove() { + if (!isRequiredSdkExtensionAvailable()) return + + loadDocumentAndSetupFragment() + enterEditMode() + + // Perform Long Press but do NOT call performDragAndDrop + onView(withId(R.id.annotationToolbar)).perform(ViewActions.longClick()) + onIdle() + + // Simulate releasing the touch (Action Up) + onView(withId(R.id.annotationToolbar)).perform(click()) + // Since we didn't move, it should re-expand at same dock position + onView(withId(R.id.tool_tray)).check(matches(isDisplayed())) + onView(withId(R.id.collapsed_tool)).check(matches(not(isDisplayed()))) + onView(withId(R.id.annotationToolbar)).check(matches(withDockState(DOCK_STATE_BOTTOM))) + } + + companion object { + private const val TEST_DOCUMENT_FILE = "sample_form.pdf" + private const val REQUIRED_EXTENSION_VERSION = 18 + + fun isRequiredSdkExtensionAvailable(): Boolean { + // Get the device's version for the specified SDK extension + val deviceExtensionVersion = SdkExtensions.getExtensionVersion(Build.VERSION_CODES.R) + return deviceExtensionVersion >= REQUIRED_EXTENSION_VERSION + } + } +} diff --git a/pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/ink/fragment/TestEditablePdfViewerFragment.kt b/pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/ink/fragment/TestEditablePdfViewerFragment.kt new file mode 100644 index 0000000000000..c138c731c3064 --- /dev/null +++ b/pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/ink/fragment/TestEditablePdfViewerFragment.kt @@ -0,0 +1,108 @@ +/* + * Copyright 2026 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package androidx.pdf.ink.fragment + +import android.os.Build +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.FrameLayout +import android.widget.FrameLayout.LayoutParams +import android.widget.FrameLayout.LayoutParams.MATCH_PARENT +import androidx.annotation.RequiresExtension +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import androidx.pdf.PdfDocument +import androidx.pdf.ink.EditablePdfViewerFragment +import androidx.pdf.util.PdfIdlingResource +import java.util.UUID + +/** + * A subclass fragment from [EditablePdfViewerFragment] to include + * [androidx.test.espresso.IdlingResource] while loading pdf document. + */ +@RequiresExtension(extension = Build.VERSION_CODES.S, version = 18) +internal class TestEditablePdfViewerFragment : EditablePdfViewerFragment { + + constructor() : super() + + val pdfLoadingIdlingResource = PdfIdlingResource(PDF_LOAD_RESOURCE_NAME) + + var pdfDocument: PdfDocument? = null + var documentLoaded = false + var documentError: Throwable? = null + private var hostView: FrameLayout? = null + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle?, + ): View? { + val view = super.onCreateView(inflater, container, savedInstanceState) as ConstraintLayout + + // Inflate the custom layout for this fragment + hostView = + FrameLayout(requireContext()).apply { + layoutParams = LayoutParams(MATCH_PARENT, MATCH_PARENT) + } + hostView?.let { hostView -> handleInsets(hostView) } + + // Add the default PDF viewer to the custom layout + hostView?.addView(view) + return hostView + } + + override fun onLoadDocumentSuccess(document: PdfDocument) { + super.onLoadDocumentSuccess(document) + pdfDocument = document + documentLoaded = true + pdfLoadingIdlingResource.decrement() + } + + override fun onLoadDocumentError(error: Throwable) { + super.onLoadDocumentError(error) + documentError = error + pdfLoadingIdlingResource.decrement() + } + + fun setIsAnnotationIntentResolvable(value: Boolean) { + setAnnotationIntentResolvability(value) + } + + companion object { + // Resource name must be unique to avoid conflicts while running multiple test scenarios + private val PDF_LOAD_RESOURCE_NAME = "PdfLoad-${UUID.randomUUID()}" + + fun handleInsets(hostView: View) { + ViewCompat.setOnApplyWindowInsetsListener(hostView) { view, insets -> + // Get the insets for the system bars (status bar, navigation bar) + val systemBarsInsets = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + + // Adjust the padding of the container view to accommodate system windows + view.setPadding( + view.paddingLeft, + systemBarsInsets.top, + view.paddingRight, + systemBarsInsets.bottom, + ) + insets + } + } + } +} diff --git a/pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/util/FragmentTestUtils.kt b/pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/util/FragmentTestUtils.kt new file mode 100644 index 0000000000000..fe435279d3d9c --- /dev/null +++ b/pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/util/FragmentTestUtils.kt @@ -0,0 +1,59 @@ +/* + * Copyright 2026 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package androidx.pdf.util + +import android.os.Build +import android.os.ext.SdkExtensions +import androidx.annotation.RequiresExtension +import androidx.fragment.app.Fragment +import androidx.fragment.app.testing.FragmentScenario +import androidx.lifecycle.Lifecycle +import androidx.pdf.ink.fragment.TestEditablePdfViewerFragment +import androidx.test.platform.app.InstrumentationRegistry + +internal object FragmentTestUtils { + + private const val TEST_DOCUMENT_FILE = "sample_form.pdf" + + @RequiresExtension(extension = Build.VERSION_CODES.S, version = 13) + internal fun scenarioLoadDocument( + scenario: FragmentScenario, + filename: String = TEST_DOCUMENT_FILE, + nextState: Lifecycle.State, + orientation: Int, + ): FragmentScenario { + val context = InstrumentationRegistry.getInstrumentation().context + val inputStream = context.assets.open(filename) + + scenario.moveToState(nextState) + scenario.onFragment { it.requireActivity().requestedOrientation = orientation } + + // Load the document in the fragment + scenario.onFragment { fragment -> + if ( + fragment is TestEditablePdfViewerFragment && + Build.VERSION.SDK_INT >= Build.VERSION_CODES.S && + SdkExtensions.getExtensionVersion(Build.VERSION_CODES.S) >= 18 + ) { + fragment.pdfLoadingIdlingResource.increment() + fragment.documentUri = TestUtils.saveStream(inputStream, fragment.requireContext()) + } + } + + return scenario + } +} diff --git a/pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/util/PdfIdlingResource.kt b/pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/util/PdfIdlingResource.kt new file mode 100644 index 0000000000000..5cc185da85cf6 --- /dev/null +++ b/pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/util/PdfIdlingResource.kt @@ -0,0 +1,47 @@ +/* + * Copyright 2026 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package androidx.pdf.util + +import androidx.test.espresso.idling.CountingIdlingResource +import java.util.concurrent.atomic.AtomicInteger + +/** + * A wrapper around Espresso's [CountingIdlingResource] that will help to define idling resource for + * any background work. + */ +internal class PdfIdlingResource(private val resourceName: String) { + + val countingIdlingResource: CountingIdlingResource = CountingIdlingResource(resourceName) + val decrementCounter: AtomicInteger = AtomicInteger() + + fun increment() { + countingIdlingResource.increment() + if (decrementCounter.get() > 0) { + decrementCounter.andDecrement + decrement() + } + } + + fun decrement() { + // Check if idling resource is not already idle + if (!countingIdlingResource.isIdleNow) { + countingIdlingResource.decrement() + } else { + decrementCounter.andIncrement + } + } +} diff --git a/pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/util/TestUtils.kt b/pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/util/TestUtils.kt new file mode 100644 index 0000000000000..f7ece2a8e7f63 --- /dev/null +++ b/pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/util/TestUtils.kt @@ -0,0 +1,34 @@ +/* + * Copyright 2026 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package androidx.pdf.util + +import android.content.Context +import android.net.Uri +import java.io.File +import java.io.FileOutputStream +import java.io.InputStream + +object TestUtils { + private val TEMP_FILE_NAME = "temp" + private val TEMP_FILE_TYPE = ".pdf" + + fun saveStream(inputStream: InputStream, context: Context): Uri { + val tempFile = File.createTempFile(TEMP_FILE_NAME, TEMP_FILE_TYPE, context.cacheDir) + FileOutputStream(tempFile).use { outputStream -> inputStream.copyTo(outputStream) } + return Uri.fromFile(tempFile) + } +} diff --git a/pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/util/ToolbarMatchers.kt b/pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/util/ToolbarMatchers.kt new file mode 100644 index 0000000000000..1b905afefd150 --- /dev/null +++ b/pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/util/ToolbarMatchers.kt @@ -0,0 +1,65 @@ +/* + * Copyright 2026 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package androidx.pdf.util + +import android.graphics.RectF +import android.view.View +import androidx.ink.authoring.InProgressStrokesView +import androidx.pdf.ink.view.AnnotationToolbar +import androidx.test.espresso.matcher.BoundedMatcher +import org.hamcrest.Matcher + +internal object ToolbarMatchers { + /** + * Verifies that the [InProgressStrokesView] has a mask that matches the bounds of the toolbar. + */ + fun matchesToolbarMask(toolbar: AnnotationToolbar): Matcher { + return object : + BoundedMatcher(InProgressStrokesView::class.java) { + override fun describeTo(description: org.hamcrest.Description) { + description.appendText( + "with mask path matching toolbar at ${toolbar.x}, ${toolbar.y}" + ) + } + + override fun matchesSafely(view: InProgressStrokesView): Boolean { + val mask = view.maskPath ?: return false + val bounds = RectF() + mask.computeBounds(bounds, true) + + // The mask should roughly match the toolbar's location and size + return bounds.left == toolbar.x && + bounds.top == toolbar.y && + bounds.width() == toolbar.width.toFloat() && + bounds.height() == toolbar.height.toFloat() + } + } + } + + /** Custom Matcher to check the internal dockState of the AnnotationToolbar. */ + fun withDockState(expectedState: Int): Matcher { + return object : BoundedMatcher(AnnotationToolbar::class.java) { + override fun describeTo(description: org.hamcrest.Description) { + description.appendText("with dockState: $expectedState") + } + + override fun matchesSafely(toolbar: AnnotationToolbar): Boolean { + return toolbar.dockState == expectedState + } + } + } +} diff --git a/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/EditablePdfViewerFragment.kt b/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/EditablePdfViewerFragment.kt index 5992c7f07bf0c..8205e5971021b 100644 --- a/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/EditablePdfViewerFragment.kt +++ b/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/EditablePdfViewerFragment.kt @@ -30,6 +30,7 @@ import android.view.View import android.view.View.GONE import android.view.View.VISIBLE import android.view.ViewGroup +import android.view.ViewGroup.LayoutParams import androidx.annotation.RequiresExtension import androidx.annotation.RestrictTo import androidx.constraintlayout.widget.ConstraintLayout @@ -59,6 +60,7 @@ import androidx.pdf.ink.util.PageTransformCalculator import androidx.pdf.ink.util.toHighlighterConfig import androidx.pdf.ink.util.toInkBrush import androidx.pdf.ink.view.AnnotationToolbar +import androidx.pdf.ink.view.draganddrop.ToolbarCoordinator import androidx.pdf.ink.view.tool.AnnotationToolInfo import androidx.pdf.view.PdfContentLayout import androidx.pdf.view.PdfView @@ -202,6 +204,25 @@ public open class EditablePdfViewerFragment : PdfViewerFragment { private lateinit var wetStrokesViewTouchHandler: WetStrokesViewTouchHandler private lateinit var pdfContentLayoutTouchListener: PdfContentLayoutTouchListener private lateinit var annotationToolbar: AnnotationToolbar + + private lateinit var toolbarCoordinator: ToolbarCoordinator + + private val toolbarLayoutChangeListener = + View.OnLayoutChangeListener { + v, + left, + top, + right, + bottom, + oldLeft, + oldTop, + oldRight, + oldBottom -> + if (left != oldLeft || top != oldTop || right != oldRight || bottom != oldBottom) { + wetStrokesView.maskPath = createToolbarMaskPath() + } + } + private lateinit var pageInfoProvider: PageInfoProviderImpl private val annotationsViewDispatcher = AnnotationsViewTouchEventDispatcher() @@ -260,6 +281,7 @@ public open class EditablePdfViewerFragment : PdfViewerFragment { wetStrokesView = InProgressStrokesView(requireContext()).apply { + id = R.id.pdf_wet_strokes_view layoutParams = ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, @@ -277,9 +299,12 @@ public open class EditablePdfViewerFragment : PdfViewerFragment { ViewGroup.LayoutParams.MATCH_PARENT, ) } - - inflater.inflate(R.layout.annotation_toolbar_layout, rootView, true) - annotationToolbar = rootView.findViewById(R.id.annotationToolbar) + annotationToolbar = + inflater.inflate(R.layout.annotation_toolbar_layout, null, false) as AnnotationToolbar + toolbarCoordinator = + ToolbarCoordinator(requireContext()).apply { + layoutParams = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT) + } val pdfContentLayout = rootView.findViewById( @@ -288,6 +313,8 @@ public open class EditablePdfViewerFragment : PdfViewerFragment { pdfContentLayout.addView(annotationView) pdfContentLayout.addView(wetStrokesView) + rootView.addView(toolbarCoordinator) + return rootView } @@ -318,6 +345,7 @@ public open class EditablePdfViewerFragment : PdfViewerFragment { setupPdfViewListeners() setupAnnotationViewListeners() setupAnnotationToolbar() + setupToolbarCoordinator(annotationToolbar) } private fun setupAnnotationViewListeners() { @@ -352,6 +380,10 @@ public open class EditablePdfViewerFragment : PdfViewerFragment { } } + private fun setupToolbarCoordinator(toolbar: AnnotationToolbar) { + toolbarCoordinator.apply { attachToolbar(toolbar) } + } + /** * If the document is an [EditablePdfDocument], sets it for editing and initializes draft state. * This method must call `super.onLoadDocumentSuccess(document)` first. @@ -382,6 +414,9 @@ public open class EditablePdfViewerFragment : PdfViewerFragment { wetStrokesView.removeFinishedStrokesListener(wetStrokesOnFinishedListener) annotationToolbar.setAnnotationToolbarListener(null) pdfContainer.setOnTouchListener(null) + if (::annotationToolbar.isInitialized) { + annotationToolbar.removeOnLayoutChangeListener(toolbarLayoutChangeListener) + } } private fun updateUiForEditMode(isEnabled: Boolean) { @@ -396,8 +431,9 @@ public open class EditablePdfViewerFragment : PdfViewerFragment { } else { annotationToolbar.apply { reset() - post { wetStrokesView.maskPath = null } + wetStrokesView.maskPath = null } + toolbarCoordinator.updateLayout() } } @@ -570,6 +606,7 @@ public open class EditablePdfViewerFragment : PdfViewerFragment { } private fun setupAnnotationToolbar() { + annotationToolbar.addOnLayoutChangeListener(toolbarLayoutChangeListener) annotationToolbar.setAnnotationToolbarListener( object : AnnotationToolbar.AnnotationToolbarListener { override fun onToolChanged(toolInfo: AnnotationToolInfo) { diff --git a/pdf/pdf-ink/src/main/res/values/ids.xml b/pdf/pdf-ink/src/main/res/values/ids.xml index 42f4ee8f27cfd..a523a17b33193 100644 --- a/pdf/pdf-ink/src/main/res/values/ids.xml +++ b/pdf/pdf-ink/src/main/res/values/ids.xml @@ -15,5 +15,6 @@ --> + \ No newline at end of file From fa6b5b980340133cd7501a11f9cf8400fbbbe7be Mon Sep 17 00:00:00 2001 From: rahulkanojia Date: Tue, 13 Jan 2026 09:06:27 +0530 Subject: [PATCH 09/14] Fix: account for navigation bar insets in test container On AOSP Cuttlefish emulators (API 35+), edge-to-edge display is enabled by default. This causes the bottom navigation bar to overlap with views drawn at the bottom of the screen, leading to failed touch interactions in instrumentation tests. This CL adjusts the test activity's container view to incorporate system bar insets. This ensures that the AnnotationToolbar and other interactive components are drawn within the safe clickable area, avoiding occlusion by the system navigation bar. Bug: b/475234286 Test: ./gradlew :pdf:pdf-ink:connectedAndroidTest Change-Id: I6187509a704376a40b9161edfb03ace8c9b58a75 --- .../kotlin/androidx/pdf/PdfTestActivity.kt | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/PdfTestActivity.kt b/pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/PdfTestActivity.kt index 735e073c7bfe9..a421941df9562 100644 --- a/pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/PdfTestActivity.kt +++ b/pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/PdfTestActivity.kt @@ -33,13 +33,14 @@ open class PdfTestActivity : Activity() { container = FrameLayout(this) setContentView(container) - // With targetSdk of AndroidX = 35, UI is drawn beneath the top system bars, - // which causes click interactions to be blocked and not being propagated - // properly to PdfView. Hence we add padding to offset the PdfView so that it lies - // below the system bars. + // With targetSdk of AndroidX = 35, UI is drawn beneath the top system bars and the + // bottom nav bars which causes interactions to be blocked and not being propagated + // properly to test views. Hence we add padding to offset the container so that it lies + // below the system bars and above nav bars. ViewCompat.setOnApplyWindowInsetsListener(container) { v, insets -> val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) - v.updatePadding(top = systemBars.top) + val navBars = insets.getInsets(WindowInsetsCompat.Type.navigationBars()) + v.updatePadding(top = systemBars.top, bottom = navBars.bottom) insets } From fabbbfaa66ae0c9e2d984812654bfa9223bf96b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tolga=20Can=20=C3=9Cnal?= Date: Thu, 8 Jan 2026 11:50:04 +0000 Subject: [PATCH 10/14] Add Press and Release interaction first frame benchmark for Glimmer.surface Local results with Pixel 6: 9,972 ns 3 allocs SurfaceBenchmark.surface_secondDrawFocusAnimation 100,855 ns 87 allocs SurfaceBenchmark.surface_secondFrameFocusAnimation 420,030 ns 107 allocs SurfaceBenchmark.surface_thirdFrameFocusAnimation 73,982 ns 29 allocs SurfaceBenchmark.surface_firstDraw 302,176 ns 29 allocs SurfaceBenchmark.surface_thirdDrawFocusAnimation 57,898 ns 14 allocs SurfaceBenchmark.surface_firstFrame_afterReleaseInteraction 111,219 ns 52 allocs SurfaceBenchmark.surface_firstFrame_afterPressInteraction 746,559 ns 584 allocs SurfaceBenchmark.surface_firstFrame Test: Run benchmark Bug: 472311836 Change-Id: Iafabfa67ccc8992b0eedd6ad38f9a418491ab7c7 --- .../xr/glimmer/benchmark/SurfaceBenchmark.kt | 111 ++++++++++++++++-- 1 file changed, 102 insertions(+), 9 deletions(-) diff --git a/xr/glimmer/benchmark/src/androidTest/java/androidx/xr/glimmer/benchmark/SurfaceBenchmark.kt b/xr/glimmer/benchmark/src/androidTest/java/androidx/xr/glimmer/benchmark/SurfaceBenchmark.kt index 907893f7ce0fb..0193624ece736 100644 --- a/xr/glimmer/benchmark/src/androidTest/java/androidx/xr/glimmer/benchmark/SurfaceBenchmark.kt +++ b/xr/glimmer/benchmark/src/androidTest/java/androidx/xr/glimmer/benchmark/SurfaceBenchmark.kt @@ -16,6 +16,9 @@ package androidx.xr.glimmer.benchmark +import androidx.compose.foundation.interaction.Interaction +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.interaction.PressInteraction import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.size import androidx.compose.runtime.Composable @@ -25,12 +28,14 @@ import androidx.compose.testutils.ToggleableTestCase import androidx.compose.testutils.benchmark.ComposeBenchmarkRule import androidx.compose.testutils.doFramesUntilNoChangesPending import androidx.compose.ui.Modifier +import androidx.compose.ui.geometry.Offset import androidx.compose.ui.unit.dp import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.LargeTest import androidx.xr.glimmer.GlimmerTheme import androidx.xr.glimmer.surface import androidx.xr.glimmer.testutils.createGlimmerRule +import kotlinx.coroutines.runBlocking import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -50,7 +55,7 @@ class SurfaceBenchmark { @Test fun surface_firstFrame() { with(benchmarkRule) { - runBenchmarkFor({ SurfaceTestCase() }) { + runBenchmarkFor({ SurfaceTestCase(addSurfaceModifierEnabledByDefault = false) }) { measureRepeatedOnUiThread { runWithMeasurementDisabled { doFramesUntilNoChangesPending() @@ -70,7 +75,7 @@ class SurfaceBenchmark { @Test fun surface_firstDraw() { with(benchmarkRule) { - runBenchmarkFor({ SurfaceTestCase() }) { + runBenchmarkFor({ SurfaceTestCase(addSurfaceModifierEnabledByDefault = false) }) { measureRepeatedOnUiThread { runWithMeasurementDisabled { doFramesUntilNoChangesPending() @@ -103,7 +108,7 @@ class SurfaceBenchmark { @Test fun surface_secondFrameFocusAnimation() { with(benchmarkRule) { - runBenchmarkFor({ SurfaceTestCase() }) { + runBenchmarkFor({ SurfaceTestCase(addSurfaceModifierEnabledByDefault = false) }) { measureRepeatedOnUiThread { runWithMeasurementDisabled { doFramesUntilNoChangesPending() @@ -130,7 +135,7 @@ class SurfaceBenchmark { @Test fun surface_secondDrawFocusAnimation() { with(benchmarkRule) { - runBenchmarkFor({ SurfaceTestCase() }) { + runBenchmarkFor({ SurfaceTestCase(addSurfaceModifierEnabledByDefault = false) }) { measureRepeatedOnUiThread { runWithMeasurementDisabled { doFramesUntilNoChangesPending() @@ -166,7 +171,7 @@ class SurfaceBenchmark { @Test fun surface_thirdFrameFocusAnimation() { with(benchmarkRule) { - runBenchmarkFor({ SurfaceTestCase() }) { + runBenchmarkFor({ SurfaceTestCase(addSurfaceModifierEnabledByDefault = false) }) { measureRepeatedOnUiThread { runWithMeasurementDisabled { doFramesUntilNoChangesPending() @@ -196,7 +201,7 @@ class SurfaceBenchmark { @Test fun surface_thirdDrawFocusAnimation() { with(benchmarkRule) { - runBenchmarkFor({ SurfaceTestCase() }) { + runBenchmarkFor({ SurfaceTestCase(addSurfaceModifierEnabledByDefault = false) }) { measureRepeatedOnUiThread { runWithMeasurementDisabled { doFramesUntilNoChangesPending() @@ -227,18 +232,102 @@ class SurfaceBenchmark { } } } + + /** + * Measures the time to draw the first frame after emitting a [PressInteraction.Press]. This is + * benchmarked on an already-focused surface to isolate the press state change. + */ + @Test + fun surface_firstFrame_afterPressInteraction() { + with(benchmarkRule) { + runBenchmarkFor({ SurfaceTestCase(addSurfaceModifierEnabledByDefault = true) }) { + runOnUiThread { + // Complete the focus animation frames. (288 frame ~= 2 second in 144fps) + doFramesUntilNoChangesPending(maxAmountOfFrames = 288) + } + + val press = PressInteraction.Press(Offset.Zero) + measureRepeatedOnUiThread { + runWithMeasurementDisabled { + runBlocking { getTestCase().emitInteraction(press) } + } + + doFrame() + + runWithMeasurementDisabled { + // Don't dispose the content to re-use for the next press interaction. + // Content will be disposed after `runBenchmarkFor` is completed. + + runBlocking { + // We should reset the press state in surface for the next repeated + // measure. + getTestCase().emitInteraction(PressInteraction.Cancel(press)) + } + + // Run the release animation. + doFramesUntilNoChangesPending() + } + } + } + } + } + + /** + * Measures the time to draw the first frame after emitting a [PressInteraction.Release]. This + * is benchmarked on an already-focused and pressed surface to isolate the release state change. + */ + @Test + fun surface_firstFrame_afterReleaseInteraction() { + with(benchmarkRule) { + runBenchmarkFor({ SurfaceTestCase(addSurfaceModifierEnabledByDefault = true) }) { + runOnUiThread { + // Complete the focus animation frames. (288 frame ~= 2 second in 144fps) + doFramesUntilNoChangesPending(maxAmountOfFrames = 288) + } + + val press = PressInteraction.Press(Offset.Zero) + measureRepeatedOnUiThread { + runWithMeasurementDisabled { + runBlocking { + // Emit interaction to start press animation. + getTestCase().emitInteraction(press) + + doFramesUntilNoChangesPending() + + // Emit interaction to trigger release animation + getTestCase().emitInteraction(PressInteraction.Release(press)) + } + } + + doFrame() + + runWithMeasurementDisabled { + // Don't dispose the content to re-use for the next release interaction. + // Content will be disposed after `runBenchmarkFor` is completed. + doFramesUntilNoChangesPending() + } + } + } + } + } } -private class SurfaceTestCase : LayeredComposeTestCase(), ToggleableTestCase { +private class SurfaceTestCase(addSurfaceModifierEnabledByDefault: Boolean) : + LayeredComposeTestCase(), ToggleableTestCase { - private val addSurfaceModifier = mutableStateOf(false) + private val addSurfaceModifier = mutableStateOf(addSurfaceModifierEnabledByDefault) + private val interactionSource = MutableInteractionSource() @Composable override fun MeasuredContent() { Box( modifier = Modifier.size(100.dp) - .then(if (addSurfaceModifier.value) Modifier.surface() else Modifier) + .then( + if (addSurfaceModifier.value) { + Modifier.surface(interactionSource = interactionSource) + } else Modifier + ) ) } @@ -246,6 +335,10 @@ private class SurfaceTestCase : LayeredComposeTestCase(), ToggleableTestCase { addSurfaceModifier.value = !addSurfaceModifier.value } + suspend fun emitInteraction(interaction: Interaction) { + interactionSource.emit(interaction) + } + @Composable override fun ContentWrappers(content: @Composable () -> Unit) { GlimmerTheme { content() } From 11b12a1ad86584ade04b3623080eeb7113b81de4 Mon Sep 17 00:00:00 2001 From: Yuri Schimke Date: Mon, 12 Jan 2026 11:25:41 +0000 Subject: [PATCH 11/14] Shader use RemoteColor and RemoteFloat Update gradient shaders and resolve color stops via creation state. Test: RemoteBrushTest Bug: 465453482 Change-Id: I54d6ae0ab4756d7b41dcd44eed5003474c6babae --- .../compose/remote/BasicLayoutTest.kt | 4 +- .../compose/capture/RecordingCanvasTest.kt | 38 ++-- .../compose/layout/RemoteBrushTest.kt | 50 ++++- .../compose/layout/RemoteCanvasTest.kt | 27 ++- .../modifier/BackgroundModifierTest.kt | 14 +- .../compose/capture/RecordingCanvas.kt | 2 +- .../creation/compose/shaders/RemoteBrush.kt | 10 +- .../compose/shaders/RemoteLinearGradient.kt | 209 +++++++++--------- .../compose/shaders/RemoteRadialGradient.kt | 125 +++++------ .../compose/shaders/RemoteSolidColor.kt | 6 - .../compose/shaders/RemoteSweepGradient.kt | 112 +++++----- .../compose/remote/material3/RemoteButton.kt | 5 +- 12 files changed, 326 insertions(+), 276 deletions(-) diff --git a/compose/remote/remote-creation-compose/src/androidTest/java/androidx/compose/remote/BasicLayoutTest.kt b/compose/remote/remote-creation-compose/src/androidTest/java/androidx/compose/remote/BasicLayoutTest.kt index 959ef89ba5674..2c3ebebf15229 100644 --- a/compose/remote/remote-creation-compose/src/androidTest/java/androidx/compose/remote/BasicLayoutTest.kt +++ b/compose/remote/remote-creation-compose/src/androidTest/java/androidx/compose/remote/BasicLayoutTest.kt @@ -1137,7 +1137,7 @@ ROOT [-2:-1] = [0.0, 0.0, 715.0, 825.0] VISIBLE """ testLayout(result) { val colors = - listOf((Color.Red).copy(alpha = 0.5f).compositeOver(Color.Green), Color.Black) + listOf((Color.Red).copy(alpha = 0.5f).compositeOver(Color.Green).rc, Color.Black.rc) RemoteBox( modifier = RemoteModifier.fillMaxSize() @@ -1186,7 +1186,7 @@ ROOT [-2:-1] = [0.0, 0.0, 715.0, 825.0] VISIBLE """ testLayout(result) { val colors = - listOf((Color.Red).copy(alpha = 0.5f).compositeOver(Color.Green), Color.Black) + listOf((Color.Red).copy(alpha = 0.5f).compositeOver(Color.Green).rc, Color.Black.rc) RemoteBox( modifier = RemoteModifier.fillMaxSize() diff --git a/compose/remote/remote-creation-compose/src/androidTest/java/androidx/compose/remote/creation/compose/capture/RecordingCanvasTest.kt b/compose/remote/remote-creation-compose/src/androidTest/java/androidx/compose/remote/creation/compose/capture/RecordingCanvasTest.kt index 05b640b65cc96..b3902a6bf4efc 100644 --- a/compose/remote/remote-creation-compose/src/androidTest/java/androidx/compose/remote/creation/compose/capture/RecordingCanvasTest.kt +++ b/compose/remote/remote-creation-compose/src/androidTest/java/androidx/compose/remote/creation/compose/capture/RecordingCanvasTest.kt @@ -24,7 +24,6 @@ import android.graphics.Canvas import android.graphics.Color import android.graphics.Paint import android.graphics.Rect -import android.graphics.Shader import android.graphics.Typeface import androidx.compose.remote.core.CoreDocument import androidx.compose.remote.core.Operation @@ -47,6 +46,7 @@ import androidx.compose.remote.creation.compose.state.RemoteFloat import androidx.compose.remote.creation.compose.state.RemoteMatrix3x3 import androidx.compose.remote.creation.compose.state.RemotePaint import androidx.compose.remote.creation.compose.state.RemoteString +import androidx.compose.remote.creation.compose.state.rc import androidx.compose.remote.creation.compose.state.rf import androidx.compose.remote.creation.compose.state.tween import androidx.compose.remote.creation.compose.test.R @@ -54,6 +54,8 @@ import androidx.compose.remote.creation.platform.AndroidxRcPlatformServices import androidx.compose.remote.creation.profile.Profile import androidx.compose.remote.player.core.platform.AndroidRemoteContext import androidx.compose.ui.geometry.Size +import androidx.compose.ui.graphics.Color as ComposeColor +import androidx.compose.ui.graphics.TileMode import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.MediumTest @@ -65,7 +67,6 @@ import java.time.Clock import java.time.LocalDateTime import java.time.ZoneId import java.time.ZonedDateTime -import java.util.ArrayList import org.junit.Before import org.junit.Rule import org.junit.Test @@ -565,33 +566,38 @@ class RecordingCanvasTest { @Test fun setShaderMatrixCalledOnce() { val remoteShader = - RemoteSweepShader(100f, 100f, intArrayOf(Color.RED, Color.GREEN, Color.BLUE), null) - .apply { remoteMatrix3x3 = RemoteMatrix3x3.createRotate(RemoteFloat(90f)) } + RemoteSweepShader( + 100f.rf, + 100f.rf, + listOf(ComposeColor.Red.rc, ComposeColor.Green.rc, ComposeColor.Blue.rc), + null, + ) + .apply { remoteMatrix3x3 = RemoteMatrix3x3.createRotate(90f.rf) } val paintWithShader = RemotePaint().apply { shader = remoteShader } val paintWithShader2 = RemotePaint().apply { shader = RemoteLinearShader( - 10f, - 100f, - 200f, - 200f, - intArrayOf(Color.RED, Color.GREEN, Color.BLUE), + 10f.rf, + 100f.rf, + 200f.rf, + 200f.rf, + listOf(ComposeColor.Red.rc, ComposeColor.Green.rc, ComposeColor.Blue.rc), null, - Shader.TileMode.REPEAT, + TileMode.Repeated, ) } val paintWithShader3 = RemotePaint().apply { shader = RemoteLinearShader( - 10f, - 100f, - 100f, - 200f, - intArrayOf(Color.RED, Color.BLUE), + 10f.rf, + 100f.rf, + 100f.rf, + 200f.rf, + listOf(ComposeColor.Red.rc, ComposeColor.Blue.rc), null, - Shader.TileMode.REPEAT, + TileMode.Repeated, ) } recordingCanvas.usePaint(paintWithShader) diff --git a/compose/remote/remote-creation-compose/src/androidTest/java/androidx/compose/remote/creation/compose/layout/RemoteBrushTest.kt b/compose/remote/remote-creation-compose/src/androidTest/java/androidx/compose/remote/creation/compose/layout/RemoteBrushTest.kt index 008dc67b74ab4..5fbe2cb4b0928 100644 --- a/compose/remote/remote-creation-compose/src/androidTest/java/androidx/compose/remote/creation/compose/layout/RemoteBrushTest.kt +++ b/compose/remote/remote-creation-compose/src/androidTest/java/androidx/compose/remote/creation/compose/layout/RemoteBrushTest.kt @@ -31,6 +31,8 @@ import androidx.compose.remote.creation.compose.shaders.linearGradient import androidx.compose.remote.creation.compose.shaders.radialGradient import androidx.compose.remote.creation.compose.shaders.sweepGradient import androidx.compose.remote.creation.compose.shaders.verticalGradient +import androidx.compose.remote.creation.compose.state.RemoteColor +import androidx.compose.remote.creation.compose.state.rc import androidx.compose.remote.creation.compose.state.rdp import androidx.compose.remote.creation.compose.state.rf import androidx.compose.remote.player.compose.test.utils.screenshot.TargetPlayer @@ -62,10 +64,26 @@ class RemoteBrushTest { ) } - private val colors = listOf(Color.Red, Color.Blue) + private val colors = listOf(Color.Red.rc, Color.Blue.rc) + private val dynamicColors = + listOf( + // Force non constant values with createReference() + RemoteColor( + alpha = 1f.rf.createReference(), + red = 1f.rf, + green = 0f.rf, + blue = 0f.rf, + ), // Red + RemoteColor( + alpha = 1f.rf.createReference(), + red = 0f.rf, + green = 0f.rf, + blue = 1f.rf, + ), // Blue + ) private val tests = - listOf Unit>>( + listOf Unit>>( "LinearGradient_Infinite" to { RemoteBox( @@ -74,7 +92,7 @@ class RemoteBrushTest { .background( RemoteBrush.linearGradient( colors = colors, - start = RemoteOffset(0f, 0f), + start = RemoteOffset(0f.rf, 0f.rf), end = RemoteOffset(Offset.Infinite), ) ) @@ -135,6 +153,30 @@ class RemoteBrushTest { ) ) }, + "LinearGradient_DynamicColors" to + { + RemoteBox( + modifier = + RemoteModifier.fillMaxSize() + .background(RemoteBrush.linearGradient(colors = dynamicColors)) + ) + }, + "RadialGradient_DynamicColors" to + { + RemoteBox( + modifier = + RemoteModifier.fillMaxSize() + .background(RemoteBrush.radialGradient(colors = dynamicColors)) + ) + }, + "SweepGradient_DynamicColors" to + { + RemoteBox( + modifier = + RemoteModifier.fillMaxSize() + .background(RemoteBrush.sweepGradient(colors = dynamicColors)) + ) + }, ) @Test @@ -172,6 +214,6 @@ class RemoteBrushTest { private companion object { val Padding = 24.rdp val ContainerSize = 100.rdp - val ContainerColor = Color(0xFFCFD8DC.toInt()) + val ContainerColor = Color(0xFFCFD8DC.toInt()).rc } } diff --git a/compose/remote/remote-creation-compose/src/androidTest/java/androidx/compose/remote/creation/compose/layout/RemoteCanvasTest.kt b/compose/remote/remote-creation-compose/src/androidTest/java/androidx/compose/remote/creation/compose/layout/RemoteCanvasTest.kt index b2d1106392023..ce294f1868989 100644 --- a/compose/remote/remote-creation-compose/src/androidTest/java/androidx/compose/remote/creation/compose/layout/RemoteCanvasTest.kt +++ b/compose/remote/remote-creation-compose/src/androidTest/java/androidx/compose/remote/creation/compose/layout/RemoteCanvasTest.kt @@ -14,10 +14,16 @@ * limitations under the License. */ -package androidx.compose.remote.creation.compose.layout - -import androidx.compose.remote.core.RemoteContext import androidx.compose.remote.creation.compose.SCREENSHOT_GOLDEN_DIRECTORY +import androidx.compose.remote.creation.compose.layout.RemoteAlignment +import androidx.compose.remote.creation.compose.layout.RemoteArrangement +import androidx.compose.remote.creation.compose.layout.RemoteBox +import androidx.compose.remote.creation.compose.layout.RemoteCanvas +import androidx.compose.remote.creation.compose.layout.RemoteColumn +import androidx.compose.remote.creation.compose.layout.RemoteComposable +import androidx.compose.remote.creation.compose.layout.RemoteOffset +import androidx.compose.remote.creation.compose.layout.RemoteRow +import androidx.compose.remote.creation.compose.layout.RemoteSize import androidx.compose.remote.creation.compose.modifier.RemoteModifier import androidx.compose.remote.creation.compose.modifier.background import androidx.compose.remote.creation.compose.modifier.fillMaxSize @@ -29,6 +35,7 @@ import androidx.compose.remote.creation.compose.shaders.solidColor import androidx.compose.remote.creation.compose.state.RemoteColor import androidx.compose.remote.creation.compose.state.RemotePaint import androidx.compose.remote.creation.compose.state.RemoteString +import androidx.compose.remote.creation.compose.state.rc import androidx.compose.remote.creation.compose.state.rdp import androidx.compose.remote.creation.compose.state.rf import androidx.compose.remote.creation.compose.state.rs @@ -172,7 +179,7 @@ class RemoteCanvasTest { anchorY = 40f.rf, paint = RemotePaint().apply { - applyRemoteBrush(RemoteBrush.solidColor(Color.Red), remoteSize) + applyRemoteBrush(RemoteBrush.solidColor(Color.Red.rc), remoteSize) textSize = SMALL_FONT_SIZE.rf.id }, ) @@ -182,7 +189,7 @@ class RemoteCanvasTest { anchorY = 80f.rf, paint = RemotePaint().apply { - applyRemoteBrush(RemoteBrush.solidColor(Color.Green), remoteSize) + applyRemoteBrush(RemoteBrush.solidColor(Color.Green.rc), remoteSize) textSize = MEDIUM_FONT_SIZE.rf.id }, ) @@ -192,7 +199,7 @@ class RemoteCanvasTest { anchorY = 120f.rf, paint = RemotePaint().apply { - applyRemoteBrush(RemoteBrush.solidColor(Color.Blue), remoteSize) + applyRemoteBrush(RemoteBrush.solidColor(Color.Blue.rc), remoteSize) textSize = LARGE_FONT_SIZE.rf.id }, ) @@ -202,9 +209,7 @@ class RemoteCanvasTest { @RemoteComposable @Composable fun TestDrawAnchoredText_colorExpression() { - // this would be animated, but screenshots are frozen. - val color = - RemoteColor.fromARGB(0.5f.rf, 0.8f.rf, RemoteContext.FLOAT_CONTINUOUS_SEC.rf, 0.9f.rf) + val color = RemoteColor.fromARGB(0.9f.rf.createReference(), 0.8f.rf, 0.9f.rf, 0.9f.rf) val text = "Visible Hello".rs RemoteCanvas(modifier = RemoteModifier.fillMaxSize()) { val w = remoteWidth @@ -214,7 +219,7 @@ class RemoteCanvasTest { anchorY = 40f.rf, paint = RemotePaint().apply { - applyRemoteBrush(RemoteBrush.solidColor(color), remoteSize) + remoteColor = color textSize = SMALL_FONT_SIZE.rf.id }, ) @@ -284,7 +289,7 @@ class RemoteCanvasTest { private companion object { val Padding = 24.rdp val ContainerSize = 100.rdp - val ContainerColor = Color(0xFFCFD8DC) + val ContainerColor = Color(0xFFCFD8DC.toInt()).rc const val SMALL_FONT_SIZE = 16f const val MEDIUM_FONT_SIZE = 32f const val LARGE_FONT_SIZE = 48f diff --git a/compose/remote/remote-creation-compose/src/androidTest/java/androidx/compose/remote/creation/compose/modifier/BackgroundModifierTest.kt b/compose/remote/remote-creation-compose/src/androidTest/java/androidx/compose/remote/creation/compose/modifier/BackgroundModifierTest.kt index 5d07434401eb2..9d0c2e2b663eb 100644 --- a/compose/remote/remote-creation-compose/src/androidTest/java/androidx/compose/remote/creation/compose/modifier/BackgroundModifierTest.kt +++ b/compose/remote/remote-creation-compose/src/androidTest/java/androidx/compose/remote/creation/compose/modifier/BackgroundModifierTest.kt @@ -166,7 +166,9 @@ class BackgroundModifierTest { RemoteBox( modifier = RemoteModifier.fillMaxSize() - .background(RemoteBrush.verticalGradient(listOf(Color.Blue, Color.Red))) + .background( + RemoteBrush.verticalGradient(listOf(Color.Blue.rc, Color.Red.rc)) + ) ) } } @@ -183,7 +185,7 @@ class BackgroundModifierTest { modifier = RemoteModifier.fillMaxSize() .background( - RemoteBrush.horizontalGradient(listOf(Color.Blue, Color.Red)) + RemoteBrush.horizontalGradient(listOf(Color.Blue.rc, Color.Red.rc)) ) ) } @@ -200,7 +202,9 @@ class BackgroundModifierTest { RemoteBox( modifier = RemoteModifier.fillMaxSize() - .background(RemoteBrush.radialGradient(listOf(Color.Blue, Color.Red))) + .background( + RemoteBrush.radialGradient(listOf(Color.Blue.rc, Color.Red.rc)) + ) ) } } @@ -216,7 +220,9 @@ class BackgroundModifierTest { RemoteBox( modifier = RemoteModifier.fillMaxSize() - .background(RemoteBrush.sweepGradient(listOf(Color.Blue, Color.Red))) + .background( + RemoteBrush.sweepGradient(listOf(Color.Blue.rc, Color.Red.rc)) + ) ) } } diff --git a/compose/remote/remote-creation-compose/src/main/java/androidx/compose/remote/creation/compose/capture/RecordingCanvas.kt b/compose/remote/remote-creation-compose/src/main/java/androidx/compose/remote/creation/compose/capture/RecordingCanvas.kt index 42c88b8d06052..b7326b43df9f6 100644 --- a/compose/remote/remote-creation-compose/src/main/java/androidx/compose/remote/creation/compose/capture/RecordingCanvas.kt +++ b/compose/remote/remote-creation-compose/src/main/java/androidx/compose/remote/creation/compose/capture/RecordingCanvas.kt @@ -339,7 +339,7 @@ public open class RecordingCanvas(bitmap: Bitmap) : Canvas(bitmap) { val shader = paint.shader as? RemoteShader if (forceSendingPaint || shader != lastRemoteShader) { if (shader != null) { - shader.apply(paintBundle) + shader.apply(creationState, paintBundle) if (usingShaderMatrix || shader.remoteMatrix3x3 != null) { usingShaderMatrix = true val remoteMatrix3x3 = shader.remoteMatrix3x3 diff --git a/compose/remote/remote-creation-compose/src/main/java/androidx/compose/remote/creation/compose/shaders/RemoteBrush.kt b/compose/remote/remote-creation-compose/src/main/java/androidx/compose/remote/creation/compose/shaders/RemoteBrush.kt index 6663dc20c667f..00e38cf511fe3 100644 --- a/compose/remote/remote-creation-compose/src/main/java/androidx/compose/remote/creation/compose/shaders/RemoteBrush.kt +++ b/compose/remote/remote-creation-compose/src/main/java/androidx/compose/remote/creation/compose/shaders/RemoteBrush.kt @@ -19,9 +19,11 @@ package androidx.compose.remote.creation.compose.shaders import androidx.annotation.RestrictTo import androidx.compose.remote.core.operations.paint.PaintBundle +import androidx.compose.remote.creation.compose.capture.RemoteComposeCreationState import androidx.compose.remote.creation.compose.layout.RemoteSize import androidx.compose.remote.creation.compose.state.RemoteFloat import androidx.compose.remote.creation.compose.state.RemoteMatrix3x3 +import androidx.compose.remote.creation.compose.state.rc import androidx.compose.runtime.Immutable import androidx.compose.ui.geometry.Size import androidx.compose.ui.graphics.Brush @@ -52,10 +54,10 @@ public abstract class RemoteBrush { public companion object { public fun fromComposeUi(brush: Brush): RemoteBrush { return when (brush) { - is SolidColor -> RemoteBrush.solidColor(brush.value) + is SolidColor -> RemoteBrush.solidColor(brush.value.rc) else -> { println("RemoteBrush.fromComposeUi not implemented for $brush") - RemoteBrush.solidColor(Color.Transparent) + RemoteBrush.solidColor(Color.Transparent.rc) } } } @@ -72,8 +74,8 @@ public abstract class RemoteBrush { @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) @Suppress("DEPRECATION") -public interface RemoteShader { - public abstract fun apply(paintBundle: PaintBundle) +public abstract class RemoteShader : android.graphics.Shader() { + public abstract fun apply(creationState: RemoteComposeCreationState, paintBundle: PaintBundle) /** * The [RemoteMatrix3x3] if any to apply to the shader. Note not all profiles will support diff --git a/compose/remote/remote-creation-compose/src/main/java/androidx/compose/remote/creation/compose/shaders/RemoteLinearGradient.kt b/compose/remote/remote-creation-compose/src/main/java/androidx/compose/remote/creation/compose/shaders/RemoteLinearGradient.kt index b0274aa610532..ffe6db10ed6de 100644 --- a/compose/remote/remote-creation-compose/src/main/java/androidx/compose/remote/creation/compose/shaders/RemoteLinearGradient.kt +++ b/compose/remote/remote-creation-compose/src/main/java/androidx/compose/remote/creation/compose/shaders/RemoteLinearGradient.kt @@ -17,21 +17,21 @@ package androidx.compose.remote.creation.compose.shaders -import android.graphics.LinearGradient import androidx.annotation.RestrictTo import androidx.compose.remote.core.operations.paint.PaintBundle +import androidx.compose.remote.creation.compose.capture.RemoteComposeCreationState import androidx.compose.remote.creation.compose.layout.RemoteOffset import androidx.compose.remote.creation.compose.layout.RemoteSize +import androidx.compose.remote.creation.compose.state.RemoteColor import androidx.compose.remote.creation.compose.state.RemoteFloat import androidx.compose.remote.creation.compose.state.RemoteMatrix3x3 import androidx.compose.remote.creation.compose.state.rf import androidx.compose.runtime.Immutable import androidx.compose.runtime.Stable -import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Shader -import androidx.compose.ui.graphics.TileMode +import androidx.compose.ui.graphics.TileMode as ComposeTileMode import androidx.compose.ui.graphics.toAndroidTileMode -import androidx.compose.ui.graphics.toArgb +import androidx.compose.ui.util.fastMap /** * Creates a linear gradient with the provided colors along the given start and end coordinates. The @@ -39,64 +39,62 @@ import androidx.compose.ui.graphics.toArgb * * ``` * Brush.linearGradient( - * 0.0f to Color.Red, - * 0.3f to Color.Green, - * 1.0f to Color.Blue, - * start = Offset(0.0f, 50.0f), - * end = Offset(0.0f, 100.0f) + * 0.0f.rf to Color.Red.rc, + * 0.3f.rf to Color.Green.rc, + * 1.0f.rf to Color.Blue.rc, + * start = RemoteOffset(0.0f.rf, 50.0f.rf), + * end = RemoteOffset(0.0f.rf, 100.0f.rf) * ) * ``` * * @param colorStops Colors and their offset in the gradient area - * @param start Starting position of the linear gradient. This can be set to [Offset.Zero] to + * @param start Starting position of the linear gradient. This can be set to [RemoteOffset.Zero] to * position at the far left and top of the drawing area - * @param end Ending position of the linear gradient. This can be set to [Offset.Infinite] to + * @param end Ending position of the linear gradient. This can be set to [RemoteOffset] Inifnite to * position at the far right and bottom of the drawing area * @param tileMode Determines the behavior for how the shader is to fill a region outside its - * bounds. Defaults to [TileMode.Clamp] to repeat the edge pixels + * bounds. Defaults to [ComposeTileMode.Clamp] to repeat the edge pixels */ @Stable public fun RemoteBrush.Companion.linearGradient( - vararg colorStops: Pair, - start: RemoteOffset, - end: RemoteOffset, - tileMode: TileMode = TileMode.Clamp, + vararg colorStops: Pair, + start: RemoteOffset? = null, + end: RemoteOffset? = null, + tileMode: ComposeTileMode = ComposeTileMode.Clamp, ): RemoteLinearGradient = RemoteLinearGradient( - colors = List(colorStops.size) { i -> colorStops[i].second }, - stops = List(colorStops.size) { i -> colorStops[i].first }, + colors = List(colorStops.size) { i -> colorStops[i].second }, + stops = List(colorStops.size) { i -> colorStops[i].first }, start = start, end = end, tileMode = tileMode, ) /** - * Creates a linear gradient with the provided colors along the given start and end coordinates. The - * colors are + * Creates a linear gradient with the provided colors along the given start and end coordinates. * * ``` * Brush.linearGradient( - * listOf(Color.Red, Color.Green, Color.Blue), - * start = Offset(0.0f, 50.0f) - * end = Offset(0.0f, 100.0f) + * listOf(Color.Red.rc, Color.Blue.rc), + * start = Offset(0.rf, 50.rf) + * end = Offset(0.rf, 100.rf) * ) * ``` * * @param colors Colors to be rendered as part of the gradient - * @param start Starting position of the linear gradient. This can be set to [Offset.Zero] to + * @param start Starting position of the linear gradient. This can be set to [RemoteOffset.Zero] to * position at the far left and top of the drawing area - * @param end Ending position of the linear gradient. This can be set to [Offset.Infinite] to + * @param end Ending position of the linear gradient. This can be set to [RemoteOffset] Infinite to * position at the far right and bottom of the drawing area * @param tileMode Determines the behavior for how the shader is to fill a region outside its - * bounds. Defaults to [TileMode.Clamp] to repeat the edge pixels + * bounds. Defaults to [ComposeTileMode.Clamp] to repeat the edge pixels */ @Stable -@Suppress("PrimitiveInCollection") public fun RemoteBrush.Companion.linearGradient( - colors: List, - start: RemoteOffset, - end: RemoteOffset, - tileMode: TileMode = TileMode.Clamp, + colors: List, + start: RemoteOffset? = null, + end: RemoteOffset? = null, + tileMode: ComposeTileMode = ComposeTileMode.Clamp, ): RemoteLinearGradient = RemoteLinearGradient( colors = colors, @@ -112,33 +110,32 @@ public fun RemoteBrush.Companion.linearGradient( * Ex: * ``` * Brush.horizontalGradient( - * listOf(Color.Red, Color.Green, Color.Blue), - * startX = 10.0f, - * endX = 20.0f + * listOf(Color.Red.rc, Color.Green.rc, Color.Blue.rc), + * startX = 10.rf, + * endX = 20.rf * ) * ``` * - * @param colors colors Colors to be rendered as part of the gradient + * @param colors colors to be rendered as part of the gradient * @param startX Starting x position of the horizontal gradient. Defaults to 0 which represents the * left of the drawing area * @param endX Ending x position of the horizontal gradient. Defaults to [Float.POSITIVE_INFINITY] * which indicates the right of the specified drawing area * @param tileMode Determines the behavior for how the shader is to fill a region outside its - * bounds. Defaults to [TileMode.Clamp] to repeat the edge pixels + * bounds. Defaults to [ComposeTileMode.Clamp] to repeat the edge pixels */ @Stable -@Suppress("PrimitiveInCollection") public fun RemoteBrush.Companion.horizontalGradient( - colors: List, + colors: List, startX: RemoteFloat? = null, endX: RemoteFloat? = null, - tileMode: TileMode = TileMode.Clamp, + tileMode: ComposeTileMode = ComposeTileMode.Clamp, ): RemoteLinearGradient = RemoteLinearGradient( colors = colors, stops = null, - start = startX?.let { RemoteOffset(it, 0.0f) }, - end = endX?.let { RemoteOffset(it, 0.0f) }, + start = startX?.let { RemoteOffset(it, 0.0f.rf) }, + end = endX?.let { RemoteOffset(it, 0.0f.rf) }, endVector = { size -> RemoteOffset(size.width, 0f) }, tileMode = tileMode, ) @@ -150,11 +147,11 @@ public fun RemoteBrush.Companion.horizontalGradient( * Ex: * ``` * Brush.horizontalGradient( - * 0.0f to Color.Red, - * 0.3f to Color.Green, - * 1.0f to Color.Blue, - * startX = 0.0f, - * endX = 100.0f + * 0.rf to Color.Red.rc, + * 0.3.rf to Color.Green.rc, + * 1.rf to Color.Blue.rc, + * startX = 0.rf, + * endX = 100.rf * ) * ``` * @@ -165,14 +162,14 @@ public fun RemoteBrush.Companion.horizontalGradient( * @param endX Ending x position of the horizontal gradient. Defaults to [Float.POSITIVE_INFINITY] * which indicates the right of the specified drawing area * @param tileMode Determines the behavior for how the shader is to fill a region outside its - * bounds. Defaults to [TileMode.Clamp] to repeat the edge pixels + * bounds. Defaults to [ComposeTileMode.Clamp] to repeat the edge pixels */ @Stable public fun RemoteBrush.Companion.horizontalGradient( - vararg colorStops: Pair, + vararg colorStops: Pair, startX: RemoteFloat?, endX: RemoteFloat?, - tileMode: TileMode = TileMode.Clamp, + tileMode: ComposeTileMode = ComposeTileMode.Clamp, ): RemoteLinearGradient = RemoteLinearGradient( colors = List(colorStops.size) { i -> colorStops[i].second }, @@ -187,28 +184,27 @@ public fun RemoteBrush.Companion.horizontalGradient( * Creates a vertical gradient with the given colors evenly dispersed within the gradient Ex: * ``` * Brush.verticalGradient( - * listOf(Color.Red, Color.Green, Color.Blue), - * startY = 0.0f, - * endY = 100.0f + * listOf(Color.Red.rc, Color.Green.rc, Color.Blue.rc), + * startY = 0.rf, + * endY = 100.rf * ) - * * ``` * - * @param colors colors Colors to be rendered as part of the gradient + * @param colors colors to be rendered as part of the gradient * @param startY Starting y position of the vertical gradient. Defaults to 0 which represents the * top of the drawing area * @param endY Ending y position of the vertical gradient. Defaults to [Float.POSITIVE_INFINITY] * which indicates the bottom of the specified drawing area * @param tileMode Determines the behavior for how the shader is to fill a region outside its - * bounds. Defaults to [TileMode.Clamp] to repeat the edge pixels + * bounds. Defaults to [ComposeTileMode.Clamp] to repeat the edge pixels */ @Stable @Suppress("PrimitiveInCollection") public fun RemoteBrush.Companion.verticalGradient( - colors: List, + colors: List, startY: RemoteFloat? = null, endY: RemoteFloat? = null, - tileMode: TileMode = TileMode.Clamp, + tileMode: ComposeTileMode = ComposeTileMode.Clamp, ): RemoteLinearGradient = RemoteLinearGradient( colors = colors, @@ -241,36 +237,60 @@ public fun RemoteBrush.Companion.verticalGradient( * @param endY Ending y position of the vertical gradient. Defaults to [Float.POSITIVE_INFINITY] * which indicates the bottom of the specified drawing area * @param tileMode Determines the behavior for how the shader is to fill a region outside its - * bounds. Defaults to [TileMode.Clamp] to repeat the edge pixels + * bounds. Defaults to [ComposeTileMode.Clamp] to repeat the edge pixels */ @Stable public fun RemoteBrush.Companion.verticalGradient( - vararg colorStops: Pair, + vararg colorStops: Pair, startY: RemoteFloat?, endY: RemoteFloat?, - tileMode: TileMode = TileMode.Clamp, + tileMode: ComposeTileMode = ComposeTileMode.Clamp, ): RemoteLinearGradient = RemoteLinearGradient( colors = List(colorStops.size) { i -> colorStops[i].second }, stops = List(colorStops.size) { i -> colorStops[i].first }, - start = startY?.let { RemoteOffset(0.0f, startY) }, - end = endY?.let { RemoteOffset(0.0f, endY) }, + start = startY?.let { RemoteOffset(0.0f.rf, startY) }, + end = endY?.let { RemoteOffset(0.0f.rf, endY) }, endVector = { size -> RemoteOffset(0f, size.height) }, tileMode = tileMode, ) @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) public class RemoteLinearShader( - public val x0: Float, - public var y0: Float, - public var x1: Float, - public var y1: Float, - public var colors: IntArray, - public var positions: FloatArray?, - public var tileMode: TileMode, -) : LinearGradient(x0, y0, x1, y1, colors, positions, tileMode), RemoteShader { - override fun apply(paintBundle: PaintBundle) { - paintBundle.setLinearGradient(colors, 0, positions, x0, y0, x1, y1, tileMode.ordinal) + public var x0: RemoteFloat, + public var y0: RemoteFloat, + public var x1: RemoteFloat, + public var y1: RemoteFloat, + public var colors: List, + public var positions: List?, + public var tileMode: ComposeTileMode, +) : RemoteShader() { + override fun apply(creationState: RemoteComposeCreationState, paintBundle: PaintBundle) { + var mask = 0 + val colorsArray = + IntArray(colors.size) { i -> + val color = colors[i] + val constantValue = color.constantValue + if (constantValue != null) { + constantValue.toArgb() + } else { + mask = mask or (1 shl i) + color.getIdForCreationState(creationState) + } + } + val positionsArray = + positions?.fastMap { it.getFloatIdForCreationState(creationState) }?.toFloatArray() + + paintBundle.setLinearGradient( + colorsArray, + mask, + positionsArray, + x0.getFloatIdForCreationState(creationState), + y0.getFloatIdForCreationState(creationState), + x1.getFloatIdForCreationState(creationState), + y1.getFloatIdForCreationState(creationState), + tileMode.toAndroidTileMode().ordinal, + ) } override var remoteMatrix3x3: RemoteMatrix3x3? = null @@ -278,52 +298,29 @@ public class RemoteLinearShader( @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) @Immutable -@Suppress("PrimitiveInCollection") public data class RemoteLinearGradient( - private val colors: List, - private val stops: List? = null, + private val colors: List, + private val stops: List? = null, private val start: RemoteOffset?, private val end: RemoteOffset?, private val endVector: (RemoteSize) -> RemoteOffset = { size -> RemoteOffset(size.width, size.height) }, - private val tileMode: TileMode = TileMode.Clamp, + private val tileMode: ComposeTileMode = ComposeTileMode.Clamp, ) : RemoteBrush() { override fun createShader(size: RemoteSize): Shader { - val realStart = start ?: RemoteOffset(0.0f, 0.0f) + val realStart = start ?: RemoteOffset(0.0f.rf, 0.0f.rf) val realEnd = end ?: endVector(size) - val x0 = resolve(realStart.x, size.width) - val y0 = resolve(realStart.y, size.height) - val x1 = resolve(realEnd.x, size.width) - val y1 = resolve(realEnd.y, size.height) - validateColorStops(colors = colors, colorStops = stops) return RemoteLinearShader( - x0 = x0.toFloat(), - y0 = y0.toFloat(), - x1 = x1.toFloat(), - y1 = y1.toFloat(), - colors = - // No change for Android O+, map the colors directly to their argb equivalent - IntArray(colors.size) { i -> colors[i].toArgb() }, - positions = stops?.toFloatArray(), - tileMode = tileMode.toAndroidTileMode(), - ) - } -} - -@Suppress("PrimitiveInCollection") -private fun validateColorStops(colors: List, colorStops: List?) { - if (colorStops == null) { - if (colors.size < 2) { - throw IllegalArgumentException( - "colors must have length of at least 2 if colorStops " + "is omitted." - ) - } - } else if (colors.size != colorStops.size) { - throw IllegalArgumentException( - "colors and colorStops arguments must have" + " equal length." + x0 = resolve(realStart.x, size.width), + y0 = resolve(realStart.y, size.height), + x1 = resolve(realEnd.x, size.width), + y1 = resolve(realEnd.y, size.height), + colors = colors, + positions = stops, + tileMode = tileMode, ) } } diff --git a/compose/remote/remote-creation-compose/src/main/java/androidx/compose/remote/creation/compose/shaders/RemoteRadialGradient.kt b/compose/remote/remote-creation-compose/src/main/java/androidx/compose/remote/creation/compose/shaders/RemoteRadialGradient.kt index bf9076405ad13..20f90d8ede450 100644 --- a/compose/remote/remote-creation-compose/src/main/java/androidx/compose/remote/creation/compose/shaders/RemoteRadialGradient.kt +++ b/compose/remote/remote-creation-compose/src/main/java/androidx/compose/remote/creation/compose/shaders/RemoteRadialGradient.kt @@ -17,19 +17,21 @@ package androidx.compose.remote.creation.compose.shaders -import android.graphics.RadialGradient import androidx.annotation.RestrictTo import androidx.compose.remote.core.operations.paint.PaintBundle +import androidx.compose.remote.creation.compose.capture.RemoteComposeCreationState import androidx.compose.remote.creation.compose.layout.RemoteOffset import androidx.compose.remote.creation.compose.layout.RemoteSize +import androidx.compose.remote.creation.compose.state.RemoteColor import androidx.compose.remote.creation.compose.state.RemoteFloat import androidx.compose.remote.creation.compose.state.RemoteMatrix3x3 import androidx.compose.runtime.Immutable import androidx.compose.runtime.Stable import androidx.compose.ui.geometry.Offset -import androidx.compose.ui.graphics.* +import androidx.compose.ui.graphics.Shader +import androidx.compose.ui.graphics.TileMode as ComposeTileMode import androidx.compose.ui.graphics.toAndroidTileMode -import androidx.compose.ui.graphics.toArgb +import androidx.compose.ui.util.fastMap /** * Creates a radial gradient with the given colors at the provided offset defined in the colorstop @@ -37,9 +39,9 @@ import androidx.compose.ui.graphics.toArgb * * ``` * Brush.radialGradient( - * 0.0f to Color.Red, - * 0.3f to Color.Green, - * 1.0f to Color.Blue, + * 0.0f to Color.Red.rc, + * 0.3f to Color.Green.rc, + * 1.0f to Color.Blue.rc, * center = Offset(side1 / 2.0f, side2 / 2.0f), * radius = side1 / 2.0f, * tileMode = TileMode.Repeated @@ -55,18 +57,18 @@ import androidx.compose.ui.graphics.toArgb * @param radius Radius for the radial gradient. Defaults to positive infinity to indicate the * largest radius that can fit within the bounds of the drawing area * @param tileMode Determines the behavior for how the shader is to fill a region outside its - * bounds. Defaults to [TileMode.Clamp] to repeat the edge pixels + * bounds. Defaults to [ComposeTileMode.Clamp] to repeat the edge pixels */ @Stable public fun RemoteBrush.Companion.radialGradient( - vararg colorStops: Pair, + vararg colorStops: Pair, center: RemoteOffset? = null, radius: RemoteFloat? = null, - tileMode: TileMode = TileMode.Clamp, + tileMode: ComposeTileMode = ComposeTileMode.Clamp, ): RemoteRadialGradient = RemoteRadialGradient( - colors = List(colorStops.size) { i -> colorStops[i].second }, - stops = List(colorStops.size) { i -> colorStops[i].first }, + colors = List(colorStops.size) { i -> colorStops[i].second }, + stops = List(colorStops.size) { i -> colorStops[i].first }, center = center, radius = radius, tileMode = tileMode, @@ -77,9 +79,8 @@ public fun RemoteBrush.Companion.radialGradient( * * ``` * Brush.radialGradient( - * listOf(Color.Red, Color.Green, Color.Blue), - * centerX = side1 / 2.0f, - * centerY = side2 / 2.0f, + * listOf(Color.Red.rc, Color.Blue.rc), + * center = Offset(side1 / 2.0f, side2 / 2.0f), * radius = side1 / 2.0f, * tileMode = TileMode.Repeated * ) @@ -93,15 +94,14 @@ public fun RemoteBrush.Companion.radialGradient( * @param radius Radius for the radial gradient. Defaults to positive infinity to indicate the * largest radius that can fit within the bounds of the drawing area * @param tileMode Determines the behavior for how the shader is to fill a region outside its - * bounds. Defaults to [TileMode.Clamp] to repeat the edge pixels + * bounds. Defaults to [ComposeTileMode.Clamp] to repeat the edge pixels */ @Stable -@Suppress("PrimitiveInCollection") public fun RemoteBrush.Companion.radialGradient( - colors: List, + colors: List, center: RemoteOffset? = null, radius: RemoteFloat? = null, - tileMode: TileMode = TileMode.Clamp, + tileMode: ComposeTileMode = ComposeTileMode.Clamp, ): RemoteRadialGradient = RemoteRadialGradient( colors = colors, @@ -113,71 +113,68 @@ public fun RemoteBrush.Companion.radialGradient( @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) @Immutable -@Suppress("PrimitiveInCollection") public data class RemoteRadialGradient( - private val colors: List, - private val stops: List? = null, + private val colors: List, + private val stops: List? = null, private val center: RemoteOffset?, private val radius: RemoteFloat?, - private val tileMode: TileMode = TileMode.Clamp, + private val tileMode: ComposeTileMode = ComposeTileMode.Clamp, ) : RemoteBrush() { override fun createShader(size: RemoteSize): Shader { - - validateColorStops(colors = colors, colorStops = stops) val realCenter = center ?: size.center + val realRadius = radius ?: (size.width.min(size.height) / 2f) + val centerX = resolve(realCenter.x, size.width) val centerY = resolve(realCenter.y, size.height) - val realRadius = radius ?: (size.width.min(size.height) / 2f) val resolvedRadius = resolve(realRadius, size.minDimension / 2f) return RemoteRadialShader( - centerX.toFloat(), - centerY.toFloat(), - resolvedRadius.toFloat(), - // No change for Android O+, map the colors directly to their argb equivalent - IntArray(colors.size) { i -> colors[i].toArgb() }, - stops?.toFloatArray(), - tileMode.toAndroidTileMode(), - ) - } -} - -@Suppress("PrimitiveInCollection") -private fun validateColorStops(colors: List, colorStops: List?) { - if (colorStops == null) { - if (colors.size < 2) { - throw IllegalArgumentException( - "colors must have length of at least 2 if colorStops " + "is omitted." - ) - } - } else if (colors.size != colorStops.size) { - throw IllegalArgumentException( - "colors and colorStops arguments must have" + " equal length." + centerX = centerX, + centerY = centerY, + radius = resolvedRadius, + colors = colors, + positions = stops, + tileMode = tileMode, ) } } @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) public class RemoteRadialShader( - public var centerX: Float, - public var centerY: Float, - public var radius: Float, - public var colors: IntArray, - public var positions: FloatArray?, - public var tileMode: TileMode, -) : RadialGradient(centerX, centerY, radius, colors, positions, tileMode), RemoteShader { - override fun apply(paintBundle: PaintBundle) { + public var centerX: RemoteFloat, + public var centerY: RemoteFloat, + public var radius: RemoteFloat, + public var colors: List, + public var positions: List?, + public var tileMode: ComposeTileMode, +) : RemoteShader() { + override var remoteMatrix3x3: RemoteMatrix3x3? = null + + override fun apply(creationState: RemoteComposeCreationState, paintBundle: PaintBundle) { + var mask = 0 + val colorsArray = + IntArray(colors.size) { i -> + val color = colors[i] + val constantValue = color.constantValue + if (constantValue != null) { + constantValue.toArgb() + } else { + mask = mask or (1 shl i) + color.getIdForCreationState(creationState) + } + } + val positionsArray = + positions?.fastMap { it.getFloatIdForCreationState(creationState) }?.toFloatArray() + paintBundle.setRadialGradient( - colors, - 0, - positions, - centerX, - centerY, - radius, - tileMode.ordinal, + colorsArray, + mask, + positionsArray, + centerX.getFloatIdForCreationState(creationState), + centerY.getFloatIdForCreationState(creationState), + radius.getFloatIdForCreationState(creationState), + tileMode.toAndroidTileMode().ordinal, ) } - - override var remoteMatrix3x3: RemoteMatrix3x3? = null } diff --git a/compose/remote/remote-creation-compose/src/main/java/androidx/compose/remote/creation/compose/shaders/RemoteSolidColor.kt b/compose/remote/remote-creation-compose/src/main/java/androidx/compose/remote/creation/compose/shaders/RemoteSolidColor.kt index e7c501898c324..65c4ba27b7d75 100644 --- a/compose/remote/remote-creation-compose/src/main/java/androidx/compose/remote/creation/compose/shaders/RemoteSolidColor.kt +++ b/compose/remote/remote-creation-compose/src/main/java/androidx/compose/remote/creation/compose/shaders/RemoteSolidColor.kt @@ -22,13 +22,7 @@ import androidx.compose.remote.creation.compose.layout.RemoteSize import androidx.compose.remote.creation.compose.state.RemoteColor import androidx.compose.runtime.Immutable import androidx.compose.runtime.Stable -import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Shader -import androidx.compose.ui.graphics.toArgb - -@Stable -public fun RemoteBrush.Companion.solidColor(color: Color): RemoteSolidColor = - RemoteSolidColor(RemoteColor(color.toArgb())) @Stable public fun RemoteBrush.Companion.solidColor(color: RemoteColor): RemoteSolidColor = diff --git a/compose/remote/remote-creation-compose/src/main/java/androidx/compose/remote/creation/compose/shaders/RemoteSweepGradient.kt b/compose/remote/remote-creation-compose/src/main/java/androidx/compose/remote/creation/compose/shaders/RemoteSweepGradient.kt index 26101a6523c64..c0306e6293297 100644 --- a/compose/remote/remote-creation-compose/src/main/java/androidx/compose/remote/creation/compose/shaders/RemoteSweepGradient.kt +++ b/compose/remote/remote-creation-compose/src/main/java/androidx/compose/remote/creation/compose/shaders/RemoteSweepGradient.kt @@ -17,31 +17,18 @@ package androidx.compose.remote.creation.compose.shaders -import android.graphics.SweepGradient import androidx.annotation.RestrictTo import androidx.compose.remote.core.operations.paint.PaintBundle +import androidx.compose.remote.creation.compose.capture.RemoteComposeCreationState import androidx.compose.remote.creation.compose.layout.RemoteOffset import androidx.compose.remote.creation.compose.layout.RemoteSize +import androidx.compose.remote.creation.compose.state.RemoteColor +import androidx.compose.remote.creation.compose.state.RemoteFloat import androidx.compose.remote.creation.compose.state.RemoteMatrix3x3 import androidx.compose.runtime.Immutable import androidx.compose.runtime.Stable -import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Shader -import androidx.compose.ui.graphics.toArgb - -@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) -public class RemoteSweepShader( - public var centerX: Float, - public var centerY: Float, - public var colors: IntArray, - public var positions: FloatArray?, -) : SweepGradient(centerX, centerY, colors, positions), RemoteShader { - override fun apply(paintBundle: PaintBundle) { - paintBundle.setSweepGradient(colors, 0, positions, centerX, centerY) - } - - override var remoteMatrix3x3: RemoteMatrix3x3? = null -} +import androidx.compose.ui.util.fastMap /** * Creates a sweep gradient with the given colors dispersed around the center with offsets defined @@ -51,28 +38,26 @@ public class RemoteSweepShader( * Ex: * ``` * Brush.sweepGradient( - * 0.0f to Color.Red, - * 0.3f to Color.Green, - * 1.0f to Color.Blue, - * center = Offset(0.0f, 100.0f) + * 0.0.rf to Color.Red.rc, + * 0.3.rf to Color.Green.rc, + * 1.0.rf to Color.Blue.rc, + * center = Offset(0.rf, 100.rf) * ) * ``` * * @param colorStops Colors and offsets to determine how the colors are dispersed throughout the * sweep gradient - * @param center Center position of the sweep gradient circle. If this is set to - * [Offset.Unspecified] then the center of the drawing area is used as the center for the sweep - * gradient + * @param center Center position of the sweep gradient circle. If this is set to null then the + * center of the drawing area is used as the center for the sweep gradient */ @Stable -@Suppress("PrimitiveInCollection") public fun RemoteBrush.Companion.sweepGradient( - vararg colorStops: Pair, - center: RemoteOffset, + vararg colorStops: Pair, + center: RemoteOffset? = null, ): RemoteSweepGradient = RemoteSweepGradient( - colors = List(colorStops.size) { i -> colorStops[i].second }, - stops = List(colorStops.size) { i -> colorStops[i].first }, + colors = List(colorStops.size) { i -> colorStops[i].second }, + stops = List(colorStops.size) { i -> colorStops[i].first }, center = center, ) @@ -84,29 +69,26 @@ public fun RemoteBrush.Companion.sweepGradient( * Ex: * ``` * Brush.sweepGradient( - * listOf(Color.Red, Color.Green, Color.Blue), - * center = Offset(10.0f, 20.0f) + * listOf(Color.Red.rc, Color.Blue.rc), + * center = Offset(10.rf, 20.rf) * ) * ``` * * @param colors List of colors to fill the sweep gradient - * @param center Center position of the sweep gradient circle. If this is set to - * [Offset.Unspecified] then the center of the drawing area is used as the center for the sweep - * gradient + * @param center Center position of the sweep gradient circle. If this is null then the center of + * the drawing area is used as the center for the sweep gradient */ @Stable -@Suppress("PrimitiveInCollection") public fun RemoteBrush.Companion.sweepGradient( - colors: List, + colors: List, center: RemoteOffset? = null, ): RemoteSweepGradient = RemoteSweepGradient(colors = colors, stops = null, center = center) @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) @Immutable -@Suppress("PrimitiveInCollection") public data class RemoteSweepGradient( - private val colors: List, - private val stops: List? = null, + private val colors: List, + private val stops: List? = null, private val center: RemoteOffset? = null, ) : RemoteBrush() { @@ -114,28 +96,46 @@ public data class RemoteSweepGradient( val realCenter = center ?: size.center val centerX = resolve(realCenter.x, size.width) val centerY = resolve(realCenter.y, size.height) - validateColorStops(colors = colors, colorStops = stops) return RemoteSweepShader( - centerX.toFloat(), - centerY.toFloat(), - // No change for Android O+, map the colors directly to their argb equivalent - IntArray(colors.size) { i -> colors[i].toArgb() }, - stops?.toFloatArray(), + centerX = centerX, + centerY = centerY, + colors = colors, + positions = stops, ) } } -@Suppress("PrimitiveInCollection") -private fun validateColorStops(colors: List, colorStops: List?) { - if (colorStops == null) { - if (colors.size < 2) { - throw IllegalArgumentException( - "colors must have length of at least 2 if colorStops " + "is omitted." - ) - } - } else if (colors.size != colorStops.size) { - throw IllegalArgumentException( - "colors and colorStops arguments must have" + " equal length." +@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) +public class RemoteSweepShader( + public var centerX: RemoteFloat, + public var centerY: RemoteFloat, + public var colors: List, + public var positions: List?, +) : RemoteShader() { + override var remoteMatrix3x3: RemoteMatrix3x3? = null + + override fun apply(creationState: RemoteComposeCreationState, paintBundle: PaintBundle) { + var mask = 0 + val colorsArray = + IntArray(colors.size) { i -> + val color = colors[i] + val constantValue = color.constantValue + if (constantValue != null) { + constantValue.toArgb() + } else { + mask = mask or (1 shl i) + color.getIdForCreationState(creationState) + } + } + val positionsArray = + positions?.fastMap { it.getFloatIdForCreationState(creationState) }?.toFloatArray() + + paintBundle.setSweepGradient( + colorsArray, + mask, + positionsArray, + centerX.getFloatIdForCreationState(creationState), + centerY.getFloatIdForCreationState(creationState), ) } } diff --git a/wear/compose/remote/remote-material3/src/main/java/androidx/wear/compose/remote/material3/RemoteButton.kt b/wear/compose/remote/remote-material3/src/main/java/androidx/wear/compose/remote/material3/RemoteButton.kt index 52fd853d22e60..2f8c0d926c723 100644 --- a/wear/compose/remote/remote-material3/src/main/java/androidx/wear/compose/remote/material3/RemoteButton.kt +++ b/wear/compose/remote/remote-material3/src/main/java/androidx/wear/compose/remote/material3/RemoteButton.kt @@ -56,6 +56,7 @@ import androidx.compose.remote.creation.compose.state.RemoteDp import androidx.compose.remote.creation.compose.state.RemoteFloat import androidx.compose.remote.creation.compose.state.RemotePaint import androidx.compose.remote.creation.compose.state.rb +import androidx.compose.remote.creation.compose.state.rc import androidx.compose.remote.creation.compose.state.rdp import androidx.compose.remote.creation.compose.state.rf import androidx.compose.runtime.Composable @@ -780,8 +781,8 @@ public object RemoteButtonDefaults { */ @Composable public fun scrimBrush(size: RemoteSize): RemoteBrush { - val startColor = scrimGradientStartColor - val endColor = scrimGradientEndColor + val startColor = scrimGradientStartColor.rc + val endColor = scrimGradientEndColor.rc return RemoteBrush.linearGradient( colors = listOf(startColor, endColor), RemoteOffset.Zero, From e009b8ff18d1b322c915717e2154a5f2b07379cf Mon Sep 17 00:00:00 2001 From: rahulkanojia Date: Tue, 13 Jan 2026 17:27:33 +0530 Subject: [PATCH 12/14] fix(toolbar): Fixes minor UI glitches for annotation toolbar - The PdfContentLayoutTouchListener now create a clone of move event instead of creating a fake down, which misses to capture metadata about the pointer. The stylus works fine with annotation toolbar. - Updates the spanCount of the color palette in the same layout phase instead of next frame to avoid UI glitch. Bug: b/475461521 Test: ./gradlew pdf:pdf-ink:connectedAndroidTest Change-Id: Ifee255d9a430184d75da936868e7084468884d2e --- .../pdf/ink/PdfContentLayoutTouchListener.kt | 13 ++++--------- .../pdf/ink/view/colorpalette/ColorPaletteView.kt | 6 ++---- 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/PdfContentLayoutTouchListener.kt b/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/PdfContentLayoutTouchListener.kt index ce98d9ec6bdcc..9a5841a02ef80 100644 --- a/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/PdfContentLayoutTouchListener.kt +++ b/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/PdfContentLayoutTouchListener.kt @@ -107,15 +107,10 @@ internal class PdfContentLayoutTouchListener( // If we receive a MOVE but haven't initialized state (because DOWN was consumed elsewhere), // we essentially treat this first MOVE as our "Start". if (primaryPointerId == MotionEvent.INVALID_POINTER_ID) { - val fakeDown = - MotionEvent.obtain( - event.downTime, - event.eventTime, - MotionEvent.ACTION_DOWN, - event.x, - event.y, - event.metaState, - ) + val fakeDown = MotionEvent.obtain(event) + // Change the action to DOWN while keeping all other data intact + fakeDown.action = MotionEvent.ACTION_DOWN + handleDown(fakeDown) fakeDown.recycle() // If the user has already dragged past touch slop in this single event history, diff --git a/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/colorpalette/ColorPaletteView.kt b/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/colorpalette/ColorPaletteView.kt index 99aa182aea3a3..025f3588308bd 100644 --- a/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/colorpalette/ColorPaletteView.kt +++ b/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/colorpalette/ColorPaletteView.kt @@ -96,10 +96,8 @@ constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 // by adding back one spacing unit because a grid of 'n' items has 'n-1' gaps val availableWidth = w - paddingLeft - paddingRight + itemSpacing val newSpanCount = max(1, availableWidth / totalItemSpace) - - // Post the span count update to the message queue. This ensures it runs after the - // current layout pass is complete, avoiding race conditions. - post { (layoutManager as? GridLayoutManager)?.spanCount = newSpanCount } + val lm = layoutManager as? GridLayoutManager ?: return + if (newSpanCount != lm.spanCount) lm.spanCount = newSpanCount } } } From 271814ceb1276f6e952f39a5be6145a0b6176d42 Mon Sep 17 00:00:00 2001 From: Michal Idzkowski Date: Thu, 8 Jan 2026 14:14:51 -0500 Subject: [PATCH 13/14] Adds the `ProjectedDeviceCapabilityProvider` and an implementation of the `XrDeviceCapabilityProviderFactory` to the XR Projected library Bug: 474095480 Test: ProjectedDeviceCapabilityProviderFactoryTest Change-Id: I075701ef04783f85c8276d5f4c70aedb80bf192b --- xr/projected/projected/build.gradle | 1 + .../ProjectedDeviceCapabilityProvider.kt | 30 +++++++++ ...rojectedDeviceCapabilityProviderFactory.kt | 33 ++++++++++ .../xr/projected/ProjectedDeviceLifecycle.kt | 8 +-- ...ctedDeviceCapabilityProviderFactoryTest.kt | 61 +++++++++++++++++++ .../ProjectedDeviceCapabilityProviderTest.kt | 51 ++++++++++++++++ 6 files changed, 180 insertions(+), 4 deletions(-) create mode 100644 xr/projected/projected/src/main/kotlin/androidx/xr/projected/ProjectedDeviceCapabilityProvider.kt create mode 100644 xr/projected/projected/src/main/kotlin/androidx/xr/projected/ProjectedDeviceCapabilityProviderFactory.kt create mode 100644 xr/projected/projected/src/test/kotlin/androidx/xr/projected/ProjectedDeviceCapabilityProviderFactoryTest.kt create mode 100644 xr/projected/projected/src/test/kotlin/androidx/xr/projected/ProjectedDeviceCapabilityProviderTest.kt diff --git a/xr/projected/projected/build.gradle b/xr/projected/projected/build.gradle index 0265728ab9e34..744b926b7861f 100644 --- a/xr/projected/projected/build.gradle +++ b/xr/projected/projected/build.gradle @@ -31,6 +31,7 @@ plugins { dependencies { api(libs.kotlinCoroutinesCore) + api(project(":xr:runtime:runtime")) implementation(project(":xr:projected:projected-binding")) implementation("androidx.activity:activity-compose:1.10.1") diff --git a/xr/projected/projected/src/main/kotlin/androidx/xr/projected/ProjectedDeviceCapabilityProvider.kt b/xr/projected/projected/src/main/kotlin/androidx/xr/projected/ProjectedDeviceCapabilityProvider.kt new file mode 100644 index 0000000000000..1211974e4995f --- /dev/null +++ b/xr/projected/projected/src/main/kotlin/androidx/xr/projected/ProjectedDeviceCapabilityProvider.kt @@ -0,0 +1,30 @@ +/* + * Copyright 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package androidx.xr.projected + +import android.content.Context +import androidx.lifecycle.Lifecycle +import androidx.xr.runtime.internal.XrDeviceCapabilityProvider +import kotlin.coroutines.CoroutineContext + +internal class ProjectedDeviceCapabilityProvider( + override val context: Context, + private val coroutineContext: CoroutineContext, +) : XrDeviceCapabilityProvider { + override val lifecycle: Lifecycle + get() = ProjectedDeviceLifecycle(provider = this, context, coroutineContext) +} diff --git a/xr/projected/projected/src/main/kotlin/androidx/xr/projected/ProjectedDeviceCapabilityProviderFactory.kt b/xr/projected/projected/src/main/kotlin/androidx/xr/projected/ProjectedDeviceCapabilityProviderFactory.kt new file mode 100644 index 0000000000000..f155a6e8dcce9 --- /dev/null +++ b/xr/projected/projected/src/main/kotlin/androidx/xr/projected/ProjectedDeviceCapabilityProviderFactory.kt @@ -0,0 +1,33 @@ +/* + * Copyright 2026 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package androidx.xr.projected + +import android.content.Context +import androidx.xr.runtime.internal.Feature +import androidx.xr.runtime.internal.XrDeviceCapabilityProvider +import androidx.xr.runtime.internal.XrDeviceCapabilityProviderFactory +import kotlin.coroutines.CoroutineContext + +internal class ProjectedDeviceCapabilityProviderFactory : XrDeviceCapabilityProviderFactory { + + override val requirements: Set = setOf(Feature.FULLSTACK, Feature.PROJECTED) + + override fun create( + context: Context, + coroutineContext: CoroutineContext, + ): XrDeviceCapabilityProvider = ProjectedDeviceCapabilityProvider(context, coroutineContext) +} diff --git a/xr/projected/projected/src/main/kotlin/androidx/xr/projected/ProjectedDeviceLifecycle.kt b/xr/projected/projected/src/main/kotlin/androidx/xr/projected/ProjectedDeviceLifecycle.kt index d299302bcdac8..49da807db0cc1 100644 --- a/xr/projected/projected/src/main/kotlin/androidx/xr/projected/ProjectedDeviceLifecycle.kt +++ b/xr/projected/projected/src/main/kotlin/androidx/xr/projected/ProjectedDeviceLifecycle.kt @@ -27,7 +27,7 @@ import androidx.xr.projected.binding.ProjectedServiceConnection import androidx.xr.projected.platform.IProjectedDeviceStateListener import androidx.xr.projected.platform.IProjectedService import androidx.xr.projected.platform.ProjectedDeviceState -import kotlinx.coroutines.CoroutineDispatcher +import kotlin.coroutines.CoroutineContext import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -36,12 +36,12 @@ import kotlinx.coroutines.launch internal class ProjectedDeviceLifecycle( provider: LifecycleOwner, private val context: Context, - private val serviceConnectionDispatcher: CoroutineDispatcher, + private val serviceConnectionCoroutineContext: CoroutineContext, ) : Lifecycle() { private val registry = LifecycleRegistry(provider) private val mainDispatcherCoroutineScope = CoroutineScope(Dispatchers.Main) - private val serviceConnectionCoroutineScope = CoroutineScope(serviceConnectionDispatcher) + private val serviceConnectionCoroutineScope = CoroutineScope(serviceConnectionCoroutineContext) private var serviceConnection: ProjectedServiceConnection? = null private var projectedService: IProjectedService? = null @@ -82,7 +82,7 @@ internal class ProjectedDeviceLifecycle( val notInitialized = registry.observerCount == 0 registry.addObserver(observer) if (notInitialized) { - launch(serviceConnectionDispatcher) { initialize() } + launch(serviceConnectionCoroutineContext) { initialize() } } } } diff --git a/xr/projected/projected/src/test/kotlin/androidx/xr/projected/ProjectedDeviceCapabilityProviderFactoryTest.kt b/xr/projected/projected/src/test/kotlin/androidx/xr/projected/ProjectedDeviceCapabilityProviderFactoryTest.kt new file mode 100644 index 0000000000000..3ead3222a62ed --- /dev/null +++ b/xr/projected/projected/src/test/kotlin/androidx/xr/projected/ProjectedDeviceCapabilityProviderFactoryTest.kt @@ -0,0 +1,61 @@ +/* + * Copyright 2026 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package androidx.xr.projected + +import android.content.Context +import android.os.Build +import androidx.test.core.app.ApplicationProvider +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.xr.runtime.internal.Feature +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.test.StandardTestDispatcher +import kotlinx.coroutines.test.TestCoroutineScheduler +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.annotation.Config + +@Config(sdk = [Build.VERSION_CODES.BAKLAVA]) +@RunWith(AndroidJUnit4::class) +class ProjectedDeviceCapabilityProviderFactoryTest { + + private val context: Context = ApplicationProvider.getApplicationContext() + private val testScheduler = TestCoroutineScheduler() + private val testDispatcher = StandardTestDispatcher(testScheduler) + private lateinit var projectedDeviceCapabilityProviderFactory: + ProjectedDeviceCapabilityProviderFactory + + @Before + fun setUp() { + projectedDeviceCapabilityProviderFactory = ProjectedDeviceCapabilityProviderFactory() + } + + @Test + fun requirements_containsFullStackAndProjected() { + assertThat(projectedDeviceCapabilityProviderFactory.requirements) + .containsExactly(Feature.FULLSTACK, Feature.PROJECTED) + } + + @Test + fun create_returnsProjectedDeviceCapabilityProviderInstance() { + val xrDeviceCapabilityProvider = + projectedDeviceCapabilityProviderFactory.create(context, testDispatcher) + + assertThat(xrDeviceCapabilityProvider) + .isInstanceOf(ProjectedDeviceCapabilityProvider::class.java) + } +} diff --git a/xr/projected/projected/src/test/kotlin/androidx/xr/projected/ProjectedDeviceCapabilityProviderTest.kt b/xr/projected/projected/src/test/kotlin/androidx/xr/projected/ProjectedDeviceCapabilityProviderTest.kt new file mode 100644 index 0000000000000..0eda5b1b9d6b2 --- /dev/null +++ b/xr/projected/projected/src/test/kotlin/androidx/xr/projected/ProjectedDeviceCapabilityProviderTest.kt @@ -0,0 +1,51 @@ +/* + * Copyright 2026 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package androidx.xr.projected + +import android.content.Context +import android.os.Build +import androidx.test.core.app.ApplicationProvider +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.test.StandardTestDispatcher +import kotlinx.coroutines.test.TestCoroutineScheduler +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.annotation.Config + +@Config(sdk = [Build.VERSION_CODES.BAKLAVA]) +@RunWith(AndroidJUnit4::class) +class ProjectedDeviceCapabilityProviderTest { + + private val context: Context = ApplicationProvider.getApplicationContext() + private val testScheduler = TestCoroutineScheduler() + private val testDispatcher = StandardTestDispatcher(testScheduler) + private lateinit var projectedDeviceCapabilityProvider: ProjectedDeviceCapabilityProvider + + @Before + fun setUp() { + projectedDeviceCapabilityProvider = + ProjectedDeviceCapabilityProvider(context, testDispatcher) + } + + @Test + fun lifecycle_returnsProjectedDeviceLifecycleInstance() { + assertThat(projectedDeviceCapabilityProvider.lifecycle) + .isInstanceOf(ProjectedDeviceLifecycle::class.java) + } +} From 8f3b233e3b513fa65bcaaf852bd86a5c7102390d Mon Sep 17 00:00:00 2001 From: Fred Sladkey Date: Thu, 8 Jan 2026 11:40:57 -0500 Subject: [PATCH 14/14] Ignore material3 experimental APIs for BCV Relnote: N/A Test: ./gradlew ignoreAbiChanges && ./gradlew updateAbi Change-Id: Ib985ce7e9b64ffe0494cd42db50aea7e38be01f6 --- .../BinaryCompatibilityValidation.kt | 1 + .../material3/bcv/native/current.ignore | 71 ++- .../material3/bcv/native/current.txt | 499 +----------------- .../runtime-retain/bcv/native/current.ignore | 2 +- 4 files changed, 71 insertions(+), 502 deletions(-) diff --git a/buildSrc/private/src/main/kotlin/androidx/build/binarycompatibilityvalidator/BinaryCompatibilityValidation.kt b/buildSrc/private/src/main/kotlin/androidx/build/binarycompatibilityvalidator/BinaryCompatibilityValidation.kt index 56de6c00b424b..12e2dc75baade 100644 --- a/buildSrc/private/src/main/kotlin/androidx/build/binarycompatibilityvalidator/BinaryCompatibilityValidation.kt +++ b/buildSrc/private/src/main/kotlin/androidx/build/binarycompatibilityvalidator/BinaryCompatibilityValidation.kt @@ -389,6 +389,7 @@ private val nonPublicMarkers = "androidx.wear.compose.foundation.ExperimentalWearFoundationApi", "androidx.wear.compose.material.ExperimentalWearMaterialApi", "androidx.window.core.ExperimentalWindowApi", + "androidx.compose.material3.ExperimentalMaterial3Api", ) const val NEW_ISSUE_URL = "https://b.corp.google.com/issues/new?component=1102332" diff --git a/compose/material3/material3/bcv/native/current.ignore b/compose/material3/material3/bcv/native/current.ignore index 395c39f0441c5..8ecc37731293b 100644 --- a/compose/material3/material3/bcv/native/current.ignore +++ b/compose/material3/material3/bcv/native/current.ignore @@ -1,4 +1,25 @@ // Baseline format: 1.0 +[linuxX64]: Removed declaration androidx.compose.material3/SearchBarValue from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/SheetValue from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/BottomAppBarScrollBehavior from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/BottomAppBarState from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/SearchBarScrollBehavior from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/TopAppBarScrollBehavior from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/BottomSheetScaffoldState from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/ModalBottomSheetProperties from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/RangeSliderState from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/SearchBarColors from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/SearchBarState from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/SheetState from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/SliderState from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/TimePickerColors from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/TimePickerSelectionMode from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/ExposedDropdownMenuBoxScope from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/BottomSheetDefaults from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/ExposedDropdownMenuDefaults from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/ModalBottomSheetDefaults from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/SearchBarDefaults from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/TimePickerDefaults from androidx.compose.material [linuxX64]: Removed declaration androidx.compose.material3.carousel/androidx_compose_material3_carousel_Arrangement$stableprop from androidx.compose.material [linuxX64]: Removed declaration androidx.compose.material3.carousel/androidx_compose_material3_carousel_CarouselItemDrawInfoImpl$stableprop from androidx.compose.material [linuxX64]: Removed declaration androidx.compose.material3.carousel/androidx_compose_material3_carousel_CarouselItemScopeImpl$stableprop from androidx.compose.material @@ -151,6 +172,7 @@ [linuxX64]: Removed declaration androidx.compose.material3.tokens/androidx_compose_material3_tokens_TypographyTokens$stableprop from androidx.compose.material [linuxX64]: Removed declaration androidx.compose.material3.tokens/androidx_compose_material3_tokens_XLargeIconButtonTokens$stableprop from androidx.compose.material [linuxX64]: Removed declaration androidx.compose.material3.tokens/androidx_compose_material3_tokens_XSmallIconButtonTokens$stableprop from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/LocalMinimumInteractiveComponentEnforcement from androidx.compose.material [linuxX64]: Removed declaration androidx.compose.material3/androidx_compose_material3_AnalogTimePickerState$stableprop from androidx.compose.material [linuxX64]: Removed declaration androidx.compose.material3/androidx_compose_material3_AppBarScopeImpl$stableprop from androidx.compose.material [linuxX64]: Removed declaration androidx.compose.material3/androidx_compose_material3_BaseDatePickerStateImpl$stableprop from androidx.compose.material @@ -181,6 +203,7 @@ [linuxX64]: Removed declaration androidx.compose.material3/androidx_compose_material3_WindowBoundsCalculator$stableprop from androidx.compose.material [linuxX64]: Removed declaration (androidx.compose.material3/TooltipScope).androidx.compose.material3/PlainTooltip(androidx.compose.ui/Modifier?, androidx.compose.ui.unit/DpSize, androidx.compose.ui.unit/Dp, androidx.compose.ui.graphics/Shape?, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.unit/Dp, androidx.compose.ui.unit/Dp, kotlin/Function2, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) from androidx.compose.material [linuxX64]: Removed declaration (androidx.compose.material3/TooltipScope).androidx.compose.material3/RichTooltip(androidx.compose.ui/Modifier?, kotlin/Function2?, kotlin/Function2?, androidx.compose.ui.unit/DpSize, androidx.compose.ui.unit/Dp, androidx.compose.ui.graphics/Shape?, androidx.compose.material3/RichTooltipColors?, androidx.compose.ui.unit/Dp, androidx.compose.ui.unit/Dp, kotlin/Function2, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int) from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3.carousel/HorizontalCenteredHeroCarousel(androidx.compose.material3.carousel/CarouselState, androidx.compose.ui/Modifier?, androidx.compose.ui.unit/Dp, androidx.compose.ui.unit/Dp, androidx.compose.foundation.gestures/TargetedFlingBehavior?, kotlin/Boolean, androidx.compose.ui.unit/Dp, androidx.compose.ui.unit/Dp, androidx.compose.foundation.layout/PaddingValues?, kotlin/Function4, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) from androidx.compose.material [linuxX64]: Removed declaration androidx.compose.material3.carousel/HorizontalMultiBrowseCarousel(androidx.compose.material3.carousel/CarouselState, androidx.compose.ui.unit/Dp, androidx.compose.ui/Modifier?, androidx.compose.ui.unit/Dp, androidx.compose.foundation.gestures/TargetedFlingBehavior?, androidx.compose.ui.unit/Dp, androidx.compose.ui.unit/Dp, androidx.compose.foundation.layout/PaddingValues?, kotlin/Function4, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) from androidx.compose.material [linuxX64]: Removed declaration androidx.compose.material3.carousel/HorizontalUncontainedCarousel(androidx.compose.material3.carousel/CarouselState, androidx.compose.ui.unit/Dp, androidx.compose.ui/Modifier?, androidx.compose.ui.unit/Dp, androidx.compose.foundation.gestures/TargetedFlingBehavior?, androidx.compose.foundation.layout/PaddingValues?, kotlin/Function4, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) from androidx.compose.material [linuxX64]: Removed declaration androidx.compose.material3.carousel/androidx_compose_material3_carousel_Arrangement$stableprop_getter() from androidx.compose.material @@ -335,13 +358,37 @@ [linuxX64]: Removed declaration androidx.compose.material3.tokens/androidx_compose_material3_tokens_TypographyTokens$stableprop_getter() from androidx.compose.material [linuxX64]: Removed declaration androidx.compose.material3.tokens/androidx_compose_material3_tokens_XLargeIconButtonTokens$stableprop_getter() from androidx.compose.material [linuxX64]: Removed declaration androidx.compose.material3.tokens/androidx_compose_material3_tokens_XSmallIconButtonTokens$stableprop_getter() from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/AlertDialog(kotlin/Function0, androidx.compose.ui/Modifier?, androidx.compose.ui.window/DialogProperties?, kotlin/Function2, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/BasicAlertDialog(kotlin/Function0, androidx.compose.ui/Modifier?, androidx.compose.ui.window/DialogProperties?, kotlin/Function2, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/BottomAppBar(androidx.compose.ui/Modifier?, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.unit/Dp, androidx.compose.foundation.layout/PaddingValues?, androidx.compose.foundation.layout/WindowInsets?, androidx.compose.material3/BottomAppBarScrollBehavior?, kotlin/Function3, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/BottomAppBar(kotlin/Function3, androidx.compose.ui/Modifier?, kotlin/Function2?, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.unit/Dp, androidx.compose.foundation.layout/PaddingValues?, androidx.compose.foundation.layout/WindowInsets?, androidx.compose.material3/BottomAppBarScrollBehavior?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/BottomAppBarState(kotlin/Float, kotlin/Float, kotlin/Float) from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/BottomSheetScaffold(kotlin/Function3, androidx.compose.ui/Modifier?, androidx.compose.material3/BottomSheetScaffoldState?, androidx.compose.ui.unit/Dp, androidx.compose.ui.unit/Dp, androidx.compose.ui.graphics/Shape?, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.unit/Dp, androidx.compose.ui.unit/Dp, kotlin/Function2?, kotlin/Boolean, kotlin/Function2?, kotlin/Function3?, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, kotlin/Function3, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int) from androidx.compose.material [linuxX64]: Removed declaration androidx.compose.material3/CenterAlignedTopAppBar(kotlin/Function2, androidx.compose.ui/Modifier?, kotlin/Function2?, kotlin/Function3?, androidx.compose.foundation.layout/WindowInsets?, androidx.compose.material3/TopAppBarColors?, androidx.compose.material3/TopAppBarScrollBehavior?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/DockedSearchBar(kotlin/Function2, kotlin/Boolean, kotlin/Function1, androidx.compose.ui/Modifier?, androidx.compose.ui.graphics/Shape?, androidx.compose.material3/SearchBarColors?, androidx.compose.ui.unit/Dp, androidx.compose.ui.unit/Dp, kotlin/Function3, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/DockedSearchBar(kotlin/String, kotlin/Function1, kotlin/Function1, kotlin/Boolean, kotlin/Function1, androidx.compose.ui/Modifier?, kotlin/Boolean, kotlin/Function2?, kotlin/Function2?, kotlin/Function2?, androidx.compose.ui.graphics/Shape?, androidx.compose.material3/SearchBarColors?, androidx.compose.ui.unit/Dp, androidx.compose.ui.unit/Dp, androidx.compose.foundation.interaction/MutableInteractionSource?, kotlin/Function3, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int) from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/ExpandedDockedSearchBar(androidx.compose.material3/SearchBarState, kotlin/Function2, androidx.compose.ui/Modifier?, androidx.compose.ui.graphics/Shape?, androidx.compose.material3/SearchBarColors?, androidx.compose.ui.unit/Dp, androidx.compose.ui.unit/Dp, androidx.compose.ui.window/PopupProperties?, kotlin/Function3, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/ExpandedFullScreenSearchBar(androidx.compose.material3/SearchBarState, kotlin/Function2, androidx.compose.ui/Modifier?, androidx.compose.ui.graphics/Shape?, androidx.compose.material3/SearchBarColors?, androidx.compose.ui.unit/Dp, androidx.compose.ui.unit/Dp, kotlin/Function2?, androidx.compose.ui.window/DialogProperties?, kotlin/Function3, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/ExposedDropdownMenuBox(kotlin/Boolean, kotlin/Function1, androidx.compose.ui/Modifier?, kotlin/Function3, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/Label(kotlin/Function3, androidx.compose.ui/Modifier?, androidx.compose.foundation.interaction/MutableInteractionSource?, kotlin/Boolean, kotlin/Function2, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) from androidx.compose.material [linuxX64]: Removed declaration androidx.compose.material3/LargeTopAppBar(kotlin/Function2, androidx.compose.ui/Modifier?, kotlin/Function2?, kotlin/Function3?, androidx.compose.foundation.layout/WindowInsets?, androidx.compose.material3/TopAppBarColors?, androidx.compose.material3/TopAppBarScrollBehavior?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) from androidx.compose.material [linuxX64]: Removed declaration androidx.compose.material3/MediumTopAppBar(kotlin/Function2, androidx.compose.ui/Modifier?, kotlin/Function2?, kotlin/Function3?, androidx.compose.foundation.layout/WindowInsets?, androidx.compose.material3/TopAppBarColors?, androidx.compose.material3/TopAppBarScrollBehavior?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) from androidx.compose.material [linuxX64]: Removed declaration androidx.compose.material3/ModalBottomSheet(kotlin/Function0, androidx.compose.ui/Modifier?, androidx.compose.material3/SheetState?, androidx.compose.ui.unit/Dp, androidx.compose.ui.graphics/Shape?, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.unit/Dp, androidx.compose.ui.graphics/Color, kotlin/Function2?, kotlin/Function2?, androidx.compose.material3/ModalBottomSheetProperties?, kotlin/Function3, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int) from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/ModalBottomSheet(kotlin/Function0, androidx.compose.ui/Modifier?, androidx.compose.material3/SheetState?, androidx.compose.ui.unit/Dp, kotlin/Boolean, androidx.compose.ui.graphics/Shape?, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.unit/Dp, androidx.compose.ui.graphics/Color, kotlin/Function2?, kotlin/Function2?, androidx.compose.material3/ModalBottomSheetProperties?, kotlin/Function3, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int) from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/RangeSlider(androidx.compose.material3/RangeSliderState, androidx.compose.ui/Modifier?, kotlin/Boolean, androidx.compose.material3/SliderColors?, androidx.compose.foundation.interaction/MutableInteractionSource?, androidx.compose.foundation.interaction/MutableInteractionSource?, kotlin/Function3?, kotlin/Function3?, kotlin/Function3?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/RangeSlider(kotlin.ranges/ClosedFloatingPointRange, kotlin/Function1, kotlin/Unit>, androidx.compose.ui/Modifier?, kotlin/Boolean, kotlin.ranges/ClosedFloatingPointRange?, kotlin/Function0?, androidx.compose.material3/SliderColors?, androidx.compose.foundation.interaction/MutableInteractionSource?, androidx.compose.foundation.interaction/MutableInteractionSource?, kotlin/Function3?, kotlin/Function3?, kotlin/Function3?, kotlin/Int, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int) from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/SearchBar(androidx.compose.material3/SearchBarState, kotlin/Function2, androidx.compose.ui/Modifier?, androidx.compose.ui.graphics/Shape?, androidx.compose.material3/SearchBarColors?, androidx.compose.ui.unit/Dp, androidx.compose.ui.unit/Dp, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/SearchBar(kotlin/Function2, kotlin/Boolean, kotlin/Function1, androidx.compose.ui/Modifier?, androidx.compose.ui.graphics/Shape?, androidx.compose.material3/SearchBarColors?, androidx.compose.ui.unit/Dp, androidx.compose.ui.unit/Dp, androidx.compose.foundation.layout/WindowInsets?, kotlin/Function3, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/SearchBar(kotlin/String, kotlin/Function1, kotlin/Function1, kotlin/Boolean, kotlin/Function1, androidx.compose.ui/Modifier?, kotlin/Boolean, kotlin/Function2?, kotlin/Function2?, kotlin/Function2?, androidx.compose.ui.graphics/Shape?, androidx.compose.material3/SearchBarColors?, androidx.compose.ui.unit/Dp, androidx.compose.ui.unit/Dp, androidx.compose.foundation.layout/WindowInsets?, androidx.compose.foundation.interaction/MutableInteractionSource?, kotlin/Function3, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int) from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/Slider(androidx.compose.material3/SliderState, androidx.compose.ui/Modifier?, kotlin/Boolean, androidx.compose.material3/SliderColors?, androidx.compose.foundation.interaction/MutableInteractionSource?, kotlin/Function3?, kotlin/Function3?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/Slider(kotlin/Float, kotlin/Function1, androidx.compose.ui/Modifier?, kotlin/Boolean, kotlin/Function0?, androidx.compose.material3/SliderColors?, androidx.compose.foundation.interaction/MutableInteractionSource?, kotlin/Int, kotlin/Function3?, kotlin/Function3?, kotlin.ranges/ClosedFloatingPointRange?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int) from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/TimeInput(androidx.compose.material3/TimePickerState, androidx.compose.ui/Modifier?, androidx.compose.material3/TimePickerColors?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/TimePicker(androidx.compose.material3/TimePickerState, androidx.compose.ui/Modifier?, androidx.compose.material3/TimePickerColors?, androidx.compose.material3/TimePickerLayoutType, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/TimePickerState(kotlin/Int, kotlin/Int, kotlin/Boolean) from androidx.compose.material [linuxX64]: Removed declaration androidx.compose.material3/TooltipBox(androidx.compose.ui.window/PopupPositionProvider, kotlin/Function3, androidx.compose.material3/TooltipState, androidx.compose.ui/Modifier?, kotlin/Boolean, kotlin/Boolean, kotlin/Function2, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) from androidx.compose.material [linuxX64]: Removed declaration androidx.compose.material3/TooltipBox(androidx.compose.ui.window/PopupPositionProvider, kotlin/Function3, androidx.compose.material3/TooltipState, androidx.compose.ui/Modifier?, kotlin/Function0?, kotlin/Boolean, kotlin/Boolean, kotlin/Function2, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) from androidx.compose.material [linuxX64]: Removed declaration androidx.compose.material3/TopAppBar(kotlin/Function2, androidx.compose.ui/Modifier?, kotlin/Function2?, kotlin/Function3?, androidx.compose.foundation.layout/WindowInsets?, androidx.compose.material3/TopAppBarColors?, androidx.compose.material3/TopAppBarScrollBehavior?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/TopSearchBar(androidx.compose.material3/SearchBarState, kotlin/Function2, androidx.compose.ui/Modifier?, androidx.compose.ui.graphics/Shape?, androidx.compose.material3/SearchBarColors?, androidx.compose.ui.unit/Dp, androidx.compose.ui.unit/Dp, androidx.compose.foundation.layout/WindowInsets?, androidx.compose.material3/SearchBarScrollBehavior?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) from androidx.compose.material [linuxX64]: Removed declaration androidx.compose.material3/androidx_compose_material3_AnalogTimePickerState$stableprop_getter() from androidx.compose.material [linuxX64]: Removed declaration androidx.compose.material3/androidx_compose_material3_AppBarScopeImpl$stableprop_getter() from androidx.compose.material [linuxX64]: Removed declaration androidx.compose.material3/androidx_compose_material3_BaseDatePickerStateImpl$stableprop_getter() from androidx.compose.material @@ -370,8 +417,26 @@ [linuxX64]: Removed declaration androidx.compose.material3/androidx_compose_material3_TooltipScopeImpl$stableprop_getter() from androidx.compose.material [linuxX64]: Removed declaration androidx.compose.material3/androidx_compose_material3_WideNavigationRailStateImpl$stableprop_getter() from androidx.compose.material [linuxX64]: Removed declaration androidx.compose.material3/androidx_compose_material3_WindowBoundsCalculator$stableprop_getter() from androidx.compose.material -[linuxX64]: Removed declaration (kotlin/Boolean) from androidx.compose.material3/ModalBottomSheetProperties -[linuxX64]: Removed declaration TrailingIcon(kotlin/Boolean, androidx.compose.runtime/Composer?, kotlin/Int) from androidx.compose.material3/ExposedDropdownMenuDefaults +[linuxX64]: Removed declaration androidx.compose.material3/rememberBottomAppBarState(kotlin/Float, kotlin/Float, kotlin/Float, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/rememberBottomSheetScaffoldState(androidx.compose.material3/SheetState?, androidx.compose.material3/SnackbarHostState?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/rememberModalBottomSheetState(kotlin/Boolean, kotlin/Function1?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/rememberRangeSliderState(kotlin/Float, kotlin/Float, kotlin/Int, kotlin/Function0?, kotlin.ranges/ClosedFloatingPointRange?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/rememberSearchBarState(androidx.compose.material3/SearchBarValue?, androidx.compose.animation.core/AnimationSpec?, androidx.compose.animation.core/AnimationSpec?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/rememberSliderState(kotlin/Float, kotlin/Int, kotlin/Function0?, kotlin.ranges/ClosedFloatingPointRange?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/rememberStandardBottomSheetState(androidx.compose.material3/SheetValue?, kotlin/Function1?, kotlin/Boolean, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) from androidx.compose.material +[linuxX64]: Removed declaration androidx.compose.material3/rememberTimePickerState(kotlin/Int, kotlin/Int, kotlin/Boolean, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) from androidx.compose.material +[linuxX64]: Removed declaration containerColor from androidx.compose.material3.pulltorefresh/PullToRefreshDefaults +[linuxX64]: Removed declaration shape from androidx.compose.material3.pulltorefresh/PullToRefreshDefaults +[linuxX64]: Removed declaration exitAlwaysScrollBehavior(androidx.compose.material3/BottomAppBarState?, kotlin/Function0?, androidx.compose.animation.core/AnimationSpec?, androidx.compose.animation.core/DecayAnimationSpec?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) from androidx.compose.material3/BottomAppBarDefaults +[linuxX64]: Removed declaration ContainerBox(kotlin/Boolean, kotlin/Boolean, androidx.compose.foundation.interaction/InteractionSource, androidx.compose.material3/TextFieldColors?, androidx.compose.ui.graphics/Shape?, androidx.compose.ui.unit/Dp, androidx.compose.ui.unit/Dp, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) from androidx.compose.material3/OutlinedTextFieldDefaults +[linuxX64]: Removed declaration CircularIndicatorTrackGapSize from androidx.compose.material3/ProgressIndicatorDefaults +[linuxX64]: Removed declaration LinearIndicatorTrackGapSize from androidx.compose.material3/ProgressIndicatorDefaults +[linuxX64]: Removed declaration LinearTrackStopIndicatorSize from androidx.compose.material3/ProgressIndicatorDefaults [linuxX64]: Removed declaration Track(androidx.compose.material3/SliderState, androidx.compose.ui/Modifier?, androidx.compose.material3/SliderColors?, kotlin/Boolean, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) from androidx.compose.material3/SliderDefaults +[linuxX64]: Removed declaration Track(androidx.compose.material3/SliderState, androidx.compose.ui/Modifier?, kotlin/Boolean, androidx.compose.material3/SliderColors?, kotlin/Function2?, kotlin/Function3?, androidx.compose.ui.unit/Dp, androidx.compose.ui.unit/Dp, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) from androidx.compose.material3/SliderDefaults [linuxX64]: Removed declaration (androidx.compose.ui/Modifier).indicatorLine(kotlin/Boolean, kotlin/Boolean, androidx.compose.foundation.interaction/InteractionSource, androidx.compose.material3/TextFieldColors, androidx.compose.ui.unit/Dp, androidx.compose.ui.unit/Dp) from androidx.compose.material3/TextFieldDefaults -[linuxX64]: Removed declaration enterAlwaysScrollBehavior(androidx.compose.material3/TopAppBarState?, kotlin/Function0?, androidx.compose.animation.core/AnimationSpec?, androidx.compose.animation.core/DecayAnimationSpec?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) from androidx.compose.material3/TopAppBarDefaults \ No newline at end of file +[linuxX64]: Removed declaration ContainerBox(kotlin/Boolean, kotlin/Boolean, androidx.compose.foundation.interaction/InteractionSource, androidx.compose.material3/TextFieldColors, androidx.compose.ui.graphics/Shape?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) from androidx.compose.material3/TextFieldDefaults +[linuxX64]: Removed declaration enterAlwaysScrollBehavior(androidx.compose.material3/TopAppBarState?, kotlin/Function0?, androidx.compose.animation.core/AnimationSpec?, androidx.compose.animation.core/DecayAnimationSpec?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) from androidx.compose.material3/TopAppBarDefaults +[linuxX64]: Removed declaration enterAlwaysScrollBehavior(androidx.compose.material3/TopAppBarState?, kotlin/Function0?, androidx.compose.animation.core/AnimationSpec?, androidx.compose.animation.core/DecayAnimationSpec?, kotlin/Boolean, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) from androidx.compose.material3/TopAppBarDefaults +[linuxX64]: Removed declaration exitUntilCollapsedScrollBehavior(androidx.compose.material3/TopAppBarState?, kotlin/Function0?, androidx.compose.animation.core/AnimationSpec?, androidx.compose.animation.core/DecayAnimationSpec?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) from androidx.compose.material3/TopAppBarDefaults +[linuxX64]: Removed declaration pinnedScrollBehavior(androidx.compose.material3/TopAppBarState?, kotlin/Function0?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) from androidx.compose.material3/TopAppBarDefaults \ No newline at end of file diff --git a/compose/material3/material3/bcv/native/current.txt b/compose/material3/material3/bcv/native/current.txt index c15a47d6e1d44..0e9d0589c1650 100644 --- a/compose/material3/material3/bcv/native/current.txt +++ b/compose/material3/material3/bcv/native/current.txt @@ -29,29 +29,6 @@ final enum class androidx.compose.material3/DrawerValue : kotlin/Enum // androidx.compose.material3/DrawerValue.values|values#static(){}[0] } -final enum class androidx.compose.material3/SearchBarValue : kotlin/Enum { // androidx.compose.material3/SearchBarValue|null[0] - enum entry Collapsed // androidx.compose.material3/SearchBarValue.Collapsed|null[0] - enum entry Expanded // androidx.compose.material3/SearchBarValue.Expanded|null[0] - - final val entries // androidx.compose.material3/SearchBarValue.entries|#static{}entries[0] - final fun (): kotlin.enums/EnumEntries // androidx.compose.material3/SearchBarValue.entries.|#static(){}[0] - - final fun valueOf(kotlin/String): androidx.compose.material3/SearchBarValue // androidx.compose.material3/SearchBarValue.valueOf|valueOf#static(kotlin.String){}[0] - final fun values(): kotlin/Array // androidx.compose.material3/SearchBarValue.values|values#static(){}[0] -} - -final enum class androidx.compose.material3/SheetValue : kotlin/Enum { // androidx.compose.material3/SheetValue|null[0] - enum entry Expanded // androidx.compose.material3/SheetValue.Expanded|null[0] - enum entry Hidden // androidx.compose.material3/SheetValue.Hidden|null[0] - enum entry PartiallyExpanded // androidx.compose.material3/SheetValue.PartiallyExpanded|null[0] - - final val entries // androidx.compose.material3/SheetValue.entries|#static{}entries[0] - final fun (): kotlin.enums/EnumEntries // androidx.compose.material3/SheetValue.entries.|#static(){}[0] - - final fun valueOf(kotlin/String): androidx.compose.material3/SheetValue // androidx.compose.material3/SheetValue.valueOf|valueOf#static(kotlin.String){}[0] - final fun values(): kotlin/Array // androidx.compose.material3/SheetValue.values|values#static(){}[0] -} - final enum class androidx.compose.material3/SnackbarDuration : kotlin/Enum { // androidx.compose.material3/SnackbarDuration|null[0] enum entry Indefinite // androidx.compose.material3/SnackbarDuration.Indefinite|null[0] enum entry Long // androidx.compose.material3/SnackbarDuration.Long|null[0] @@ -98,10 +75,7 @@ final enum class androidx.compose.material3/WideNavigationRailValue : kotlin/Enu final fun values(): kotlin/Array // androidx.compose.material3/WideNavigationRailValue.values|values#static(){}[0] } -abstract interface androidx.compose.material3.carousel/MultiAspectCarouselScope { // androidx.compose.material3.carousel/MultiAspectCarouselScope|null[0] - abstract fun (androidx.compose.ui/Modifier).maskBorder(androidx.compose.foundation/BorderStroke, androidx.compose.ui.graphics/Shape, androidx.compose.material3.carousel/MultiAspectCarouselItemDrawInfo, androidx.compose.runtime/Composer?, kotlin/Int): androidx.compose.ui/Modifier // androidx.compose.material3.carousel/MultiAspectCarouselScope.maskBorder|maskBorder@androidx.compose.ui.Modifier(androidx.compose.foundation.BorderStroke;androidx.compose.ui.graphics.Shape;androidx.compose.material3.carousel.MultiAspectCarouselItemDrawInfo;androidx.compose.runtime.Composer?;kotlin.Int){}[0] - abstract fun (androidx.compose.ui/Modifier).maskClip(androidx.compose.ui.graphics/Shape, androidx.compose.material3.carousel/MultiAspectCarouselItemDrawInfo): androidx.compose.ui/Modifier // androidx.compose.material3.carousel/MultiAspectCarouselScope.maskClip|maskClip@androidx.compose.ui.Modifier(androidx.compose.ui.graphics.Shape;androidx.compose.material3.carousel.MultiAspectCarouselItemDrawInfo){}[0] -} +abstract interface androidx.compose.material3.carousel/MultiAspectCarouselScope // androidx.compose.material3.carousel/MultiAspectCarouselScope|null[0] abstract interface androidx.compose.material3.pulltorefresh/PullToRefreshState { // androidx.compose.material3.pulltorefresh/PullToRefreshState|null[0] abstract val distanceFraction // androidx.compose.material3.pulltorefresh/PullToRefreshState.distanceFraction|{}distanceFraction[0] @@ -122,39 +96,6 @@ abstract interface androidx.compose.material3/BasicAlertDialogOverride { // andr abstract fun (androidx.compose.material3/BasicAlertDialogOverrideScope).BasicAlertDialog(androidx.compose.runtime/Composer?, kotlin/Int) // androidx.compose.material3/BasicAlertDialogOverride.BasicAlertDialog|BasicAlertDialog@androidx.compose.material3.BasicAlertDialogOverrideScope(androidx.compose.runtime.Composer?;kotlin.Int){}[0] } -abstract interface androidx.compose.material3/BottomAppBarScrollBehavior { // androidx.compose.material3/BottomAppBarScrollBehavior|null[0] - abstract val flingAnimationSpec // androidx.compose.material3/BottomAppBarScrollBehavior.flingAnimationSpec|{}flingAnimationSpec[0] - abstract fun (): androidx.compose.animation.core/DecayAnimationSpec? // androidx.compose.material3/BottomAppBarScrollBehavior.flingAnimationSpec.|(){}[0] - abstract val isPinned // androidx.compose.material3/BottomAppBarScrollBehavior.isPinned|{}isPinned[0] - abstract fun (): kotlin/Boolean // androidx.compose.material3/BottomAppBarScrollBehavior.isPinned.|(){}[0] - abstract val nestedScrollConnection // androidx.compose.material3/BottomAppBarScrollBehavior.nestedScrollConnection|{}nestedScrollConnection[0] - abstract fun (): androidx.compose.ui.input.nestedscroll/NestedScrollConnection // androidx.compose.material3/BottomAppBarScrollBehavior.nestedScrollConnection.|(){}[0] - abstract val snapAnimationSpec // androidx.compose.material3/BottomAppBarScrollBehavior.snapAnimationSpec|{}snapAnimationSpec[0] - abstract fun (): androidx.compose.animation.core/AnimationSpec? // androidx.compose.material3/BottomAppBarScrollBehavior.snapAnimationSpec.|(){}[0] - abstract val state // androidx.compose.material3/BottomAppBarScrollBehavior.state|{}state[0] - abstract fun (): androidx.compose.material3/BottomAppBarState // androidx.compose.material3/BottomAppBarScrollBehavior.state.|(){}[0] -} - -abstract interface androidx.compose.material3/BottomAppBarState { // androidx.compose.material3/BottomAppBarState|null[0] - abstract val collapsedFraction // androidx.compose.material3/BottomAppBarState.collapsedFraction|{}collapsedFraction[0] - abstract fun (): kotlin/Float // androidx.compose.material3/BottomAppBarState.collapsedFraction.|(){}[0] - - abstract var contentOffset // androidx.compose.material3/BottomAppBarState.contentOffset|{}contentOffset[0] - abstract fun (): kotlin/Float // androidx.compose.material3/BottomAppBarState.contentOffset.|(){}[0] - abstract fun (kotlin/Float) // androidx.compose.material3/BottomAppBarState.contentOffset.|(kotlin.Float){}[0] - abstract var heightOffset // androidx.compose.material3/BottomAppBarState.heightOffset|{}heightOffset[0] - abstract fun (): kotlin/Float // androidx.compose.material3/BottomAppBarState.heightOffset.|(){}[0] - abstract fun (kotlin/Float) // androidx.compose.material3/BottomAppBarState.heightOffset.|(kotlin.Float){}[0] - abstract var heightOffsetLimit // androidx.compose.material3/BottomAppBarState.heightOffsetLimit|{}heightOffsetLimit[0] - abstract fun (): kotlin/Float // androidx.compose.material3/BottomAppBarState.heightOffsetLimit.|(){}[0] - abstract fun (kotlin/Float) // androidx.compose.material3/BottomAppBarState.heightOffsetLimit.|(kotlin.Float){}[0] - - final object Companion { // androidx.compose.material3/BottomAppBarState.Companion|null[0] - final val Saver // androidx.compose.material3/BottomAppBarState.Companion.Saver|{}Saver[0] - final fun (): androidx.compose.runtime.saveable/Saver // androidx.compose.material3/BottomAppBarState.Companion.Saver.|(){}[0] - } -} - abstract interface androidx.compose.material3/ButtonGroupScope { // androidx.compose.material3/ButtonGroupScope|null[0] abstract fun (androidx.compose.ui/Modifier).align(androidx.compose.ui/Alignment.Vertical): androidx.compose.ui/Modifier // androidx.compose.material3/ButtonGroupScope.align|align@androidx.compose.ui.Modifier(androidx.compose.ui.Alignment.Vertical){}[0] abstract fun (androidx.compose.ui/Modifier).animateWidth(androidx.compose.foundation.interaction/InteractionSource): androidx.compose.ui/Modifier // androidx.compose.material3/ButtonGroupScope.animateWidth|animateWidth@androidx.compose.ui.Modifier(androidx.compose.foundation.interaction.InteractionSource){}[0] @@ -273,23 +214,6 @@ abstract interface androidx.compose.material3/NavigationRailOverride { // androi abstract fun (androidx.compose.material3/NavigationRailOverrideScope).NavigationRail(androidx.compose.runtime/Composer?, kotlin/Int) // androidx.compose.material3/NavigationRailOverride.NavigationRail|NavigationRail@androidx.compose.material3.NavigationRailOverrideScope(androidx.compose.runtime.Composer?;kotlin.Int){}[0] } -abstract interface androidx.compose.material3/SearchBarScrollBehavior { // androidx.compose.material3/SearchBarScrollBehavior|null[0] - abstract val nestedScrollConnection // androidx.compose.material3/SearchBarScrollBehavior.nestedScrollConnection|{}nestedScrollConnection[0] - abstract fun (): androidx.compose.ui.input.nestedscroll/NestedScrollConnection // androidx.compose.material3/SearchBarScrollBehavior.nestedScrollConnection.|(){}[0] - - abstract var contentOffset // androidx.compose.material3/SearchBarScrollBehavior.contentOffset|{}contentOffset[0] - abstract fun (): kotlin/Float // androidx.compose.material3/SearchBarScrollBehavior.contentOffset.|(){}[0] - abstract fun (kotlin/Float) // androidx.compose.material3/SearchBarScrollBehavior.contentOffset.|(kotlin.Float){}[0] - abstract var scrollOffset // androidx.compose.material3/SearchBarScrollBehavior.scrollOffset|{}scrollOffset[0] - abstract fun (): kotlin/Float // androidx.compose.material3/SearchBarScrollBehavior.scrollOffset.|(){}[0] - abstract fun (kotlin/Float) // androidx.compose.material3/SearchBarScrollBehavior.scrollOffset.|(kotlin.Float){}[0] - abstract var scrollOffsetLimit // androidx.compose.material3/SearchBarScrollBehavior.scrollOffsetLimit|{}scrollOffsetLimit[0] - abstract fun (): kotlin/Float // androidx.compose.material3/SearchBarScrollBehavior.scrollOffsetLimit.|(){}[0] - abstract fun (kotlin/Float) // androidx.compose.material3/SearchBarScrollBehavior.scrollOffsetLimit.|(kotlin.Float){}[0] - - abstract fun (androidx.compose.ui/Modifier).searchBarScrollBehavior(): androidx.compose.ui/Modifier // androidx.compose.material3/SearchBarScrollBehavior.searchBarScrollBehavior|searchBarScrollBehavior@androidx.compose.ui.Modifier(){}[0] -} - abstract interface androidx.compose.material3/SelectableDates { // androidx.compose.material3/SelectableDates|null[0] open fun isSelectableDate(kotlin/Long): kotlin/Boolean // androidx.compose.material3/SelectableDates.isSelectableDate|isSelectableDate(kotlin.Long){}[0] open fun isSelectableYear(kotlin/Int): kotlin/Boolean // androidx.compose.material3/SelectableDates.isSelectableYear|isSelectableYear(kotlin.Int){}[0] @@ -373,19 +297,6 @@ abstract interface androidx.compose.material3/TooltipState { // androidx.compose abstract suspend fun show(androidx.compose.foundation/MutatePriority = ...) // androidx.compose.material3/TooltipState.show|show(androidx.compose.foundation.MutatePriority){}[0] } -abstract interface androidx.compose.material3/TopAppBarScrollBehavior { // androidx.compose.material3/TopAppBarScrollBehavior|null[0] - abstract val flingAnimationSpec // androidx.compose.material3/TopAppBarScrollBehavior.flingAnimationSpec|{}flingAnimationSpec[0] - abstract fun (): androidx.compose.animation.core/DecayAnimationSpec? // androidx.compose.material3/TopAppBarScrollBehavior.flingAnimationSpec.|(){}[0] - abstract val isPinned // androidx.compose.material3/TopAppBarScrollBehavior.isPinned|{}isPinned[0] - abstract fun (): kotlin/Boolean // androidx.compose.material3/TopAppBarScrollBehavior.isPinned.|(){}[0] - abstract val nestedScrollConnection // androidx.compose.material3/TopAppBarScrollBehavior.nestedScrollConnection|{}nestedScrollConnection[0] - abstract fun (): androidx.compose.ui.input.nestedscroll/NestedScrollConnection // androidx.compose.material3/TopAppBarScrollBehavior.nestedScrollConnection.|(){}[0] - abstract val snapAnimationSpec // androidx.compose.material3/TopAppBarScrollBehavior.snapAnimationSpec|{}snapAnimationSpec[0] - abstract fun (): androidx.compose.animation.core/AnimationSpec? // androidx.compose.material3/TopAppBarScrollBehavior.snapAnimationSpec.|(){}[0] - abstract val state // androidx.compose.material3/TopAppBarScrollBehavior.state|{}state[0] - abstract fun (): androidx.compose.material3/TopAppBarState // androidx.compose.material3/TopAppBarScrollBehavior.state.|(){}[0] -} - abstract interface androidx.compose.material3/TwoRowsTopAppBarOverride { // androidx.compose.material3/TwoRowsTopAppBarOverride|null[0] abstract fun (androidx.compose.material3/TwoRowsTopAppBarOverrideScope).TwoRowsTopAppBar(androidx.compose.runtime/Composer?, kotlin/Int) // androidx.compose.material3/TwoRowsTopAppBarOverride.TwoRowsTopAppBar|TwoRowsTopAppBar@androidx.compose.material3.TwoRowsTopAppBarOverrideScope(androidx.compose.runtime.Composer?;kotlin.Int){}[0] } @@ -436,25 +347,6 @@ sealed interface androidx.compose.material3.carousel/CarouselItemScope { // andr abstract fun rememberMaskShape(androidx.compose.ui.graphics/Shape, androidx.compose.runtime/Composer?, kotlin/Int): androidx.compose.foundation.shape/GenericShape // androidx.compose.material3.carousel/CarouselItemScope.rememberMaskShape|rememberMaskShape(androidx.compose.ui.graphics.Shape;androidx.compose.runtime.Composer?;kotlin.Int){}[0] } -sealed interface androidx.compose.material3.carousel/MultiAspectCarouselItemDrawInfo { // androidx.compose.material3.carousel/MultiAspectCarouselItemDrawInfo|null[0] - abstract val index // androidx.compose.material3.carousel/MultiAspectCarouselItemDrawInfo.index|{}index[0] - abstract fun (): kotlin/Int // androidx.compose.material3.carousel/MultiAspectCarouselItemDrawInfo.index.|(){}[0] - abstract val isHorizontal // androidx.compose.material3.carousel/MultiAspectCarouselItemDrawInfo.isHorizontal|{}isHorizontal[0] - abstract fun (): kotlin/Boolean // androidx.compose.material3.carousel/MultiAspectCarouselItemDrawInfo.isHorizontal.|(){}[0] - abstract val maskEnd // androidx.compose.material3.carousel/MultiAspectCarouselItemDrawInfo.maskEnd|{}maskEnd[0] - abstract fun (): kotlin/Float // androidx.compose.material3.carousel/MultiAspectCarouselItemDrawInfo.maskEnd.|(){}[0] - abstract val maskStart // androidx.compose.material3.carousel/MultiAspectCarouselItemDrawInfo.maskStart|{}maskStart[0] - abstract fun (): kotlin/Float // androidx.compose.material3.carousel/MultiAspectCarouselItemDrawInfo.maskStart.|(){}[0] - abstract val maxSize // androidx.compose.material3.carousel/MultiAspectCarouselItemDrawInfo.maxSize|{}maxSize[0] - abstract fun (): kotlin/Float // androidx.compose.material3.carousel/MultiAspectCarouselItemDrawInfo.maxSize.|(){}[0] - abstract val minSize // androidx.compose.material3.carousel/MultiAspectCarouselItemDrawInfo.minSize|{}minSize[0] - abstract fun (): kotlin/Float // androidx.compose.material3.carousel/MultiAspectCarouselItemDrawInfo.minSize.|(){}[0] - abstract val parallax // androidx.compose.material3.carousel/MultiAspectCarouselItemDrawInfo.parallax|{}parallax[0] - abstract fun (): kotlin/Float // androidx.compose.material3.carousel/MultiAspectCarouselItemDrawInfo.parallax.|(){}[0] - abstract val size // androidx.compose.material3.carousel/MultiAspectCarouselItemDrawInfo.size|{}size[0] - abstract fun (): kotlin/Float // androidx.compose.material3.carousel/MultiAspectCarouselItemDrawInfo.size.|(){}[0] -} - sealed interface androidx.compose.material3/AppBarScope { // androidx.compose.material3/AppBarScope|null[0] abstract fun clickableItem(kotlin/Function0, kotlin/Function2, kotlin/String, kotlin/Boolean = ...) // androidx.compose.material3/AppBarScope.clickableItem|clickableItem(kotlin.Function0;kotlin.Function2;kotlin.String;kotlin.Boolean){}[0] abstract fun customItem(kotlin/Function2, kotlin/Function3) // androidx.compose.material3/AppBarScope.customItem|customItem(kotlin.Function2;kotlin.Function3){}[0] @@ -539,27 +431,6 @@ final class androidx.compose.material3/AppBarMenuState { // androidx.compose.mat final fun show() // androidx.compose.material3/AppBarMenuState.show|show(){}[0] } -final class androidx.compose.material3/AppBarWithSearchColors { // androidx.compose.material3/AppBarWithSearchColors|null[0] - constructor (androidx.compose.material3/SearchBarColors, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color) // androidx.compose.material3/AppBarWithSearchColors.|(androidx.compose.material3.SearchBarColors;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color){}[0] - constructor (androidx.compose.material3/SearchBarColors, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color) // androidx.compose.material3/AppBarWithSearchColors.|(androidx.compose.material3.SearchBarColors;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color){}[0] - - final val appBarActionIconColor // androidx.compose.material3/AppBarWithSearchColors.appBarActionIconColor|{}appBarActionIconColor[0] - final fun (): androidx.compose.ui.graphics/Color // androidx.compose.material3/AppBarWithSearchColors.appBarActionIconColor.|(){}[0] - final val appBarContainerColor // androidx.compose.material3/AppBarWithSearchColors.appBarContainerColor|{}appBarContainerColor[0] - final fun (): androidx.compose.ui.graphics/Color // androidx.compose.material3/AppBarWithSearchColors.appBarContainerColor.|(){}[0] - final val appBarNavigationIconColor // androidx.compose.material3/AppBarWithSearchColors.appBarNavigationIconColor|{}appBarNavigationIconColor[0] - final fun (): androidx.compose.ui.graphics/Color // androidx.compose.material3/AppBarWithSearchColors.appBarNavigationIconColor.|(){}[0] - final val scrolledAppBarContainerColor // androidx.compose.material3/AppBarWithSearchColors.scrolledAppBarContainerColor|{}scrolledAppBarContainerColor[0] - final fun (): androidx.compose.ui.graphics/Color // androidx.compose.material3/AppBarWithSearchColors.scrolledAppBarContainerColor.|(){}[0] - final val scrolledSearchBarContainerColor // androidx.compose.material3/AppBarWithSearchColors.scrolledSearchBarContainerColor|{}scrolledSearchBarContainerColor[0] - final fun (): androidx.compose.ui.graphics/Color // androidx.compose.material3/AppBarWithSearchColors.scrolledSearchBarContainerColor.|(){}[0] - final val searchBarColors // androidx.compose.material3/AppBarWithSearchColors.searchBarColors|{}searchBarColors[0] - final fun (): androidx.compose.material3/SearchBarColors // androidx.compose.material3/AppBarWithSearchColors.searchBarColors.|(){}[0] - - final fun equals(kotlin/Any?): kotlin/Boolean // androidx.compose.material3/AppBarWithSearchColors.equals|equals(kotlin.Any?){}[0] - final fun hashCode(): kotlin/Int // androidx.compose.material3/AppBarWithSearchColors.hashCode|hashCode(){}[0] -} - final class androidx.compose.material3/BasicAlertDialogOverrideScope { // androidx.compose.material3/BasicAlertDialogOverrideScope|null[0] final val content // androidx.compose.material3/BasicAlertDialogOverrideScope.content|{}content[0] final fun (): kotlin/Function2 // androidx.compose.material3/BasicAlertDialogOverrideScope.content.|(){}[0] @@ -571,15 +442,6 @@ final class androidx.compose.material3/BasicAlertDialogOverrideScope { // androi final fun (): androidx.compose.ui.window/DialogProperties // androidx.compose.material3/BasicAlertDialogOverrideScope.properties.|(){}[0] } -final class androidx.compose.material3/BottomSheetScaffoldState { // androidx.compose.material3/BottomSheetScaffoldState|null[0] - constructor (androidx.compose.material3/SheetState, androidx.compose.material3/SnackbarHostState) // androidx.compose.material3/BottomSheetScaffoldState.|(androidx.compose.material3.SheetState;androidx.compose.material3.SnackbarHostState){}[0] - - final val bottomSheetState // androidx.compose.material3/BottomSheetScaffoldState.bottomSheetState|{}bottomSheetState[0] - final fun (): androidx.compose.material3/SheetState // androidx.compose.material3/BottomSheetScaffoldState.bottomSheetState.|(){}[0] - final val snackbarHostState // androidx.compose.material3/BottomSheetScaffoldState.snackbarHostState|{}snackbarHostState[0] - final fun (): androidx.compose.material3/SnackbarHostState // androidx.compose.material3/BottomSheetScaffoldState.snackbarHostState.|(){}[0] -} - final class androidx.compose.material3/ButtonColors { // androidx.compose.material3/ButtonColors|null[0] constructor (androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color) // androidx.compose.material3/ButtonColors.|(androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color){}[0] @@ -1313,16 +1175,6 @@ final class androidx.compose.material3/MenuItemShapes { // androidx.compose.mate final fun hashCode(): kotlin/Int // androidx.compose.material3/MenuItemShapes.hashCode|hashCode(){}[0] } -final class androidx.compose.material3/ModalBottomSheetProperties { // androidx.compose.material3/ModalBottomSheetProperties|null[0] - constructor (kotlin/Boolean = ..., kotlin/Boolean = ...) // androidx.compose.material3/ModalBottomSheetProperties.|(kotlin.Boolean;kotlin.Boolean){}[0] - constructor (kotlin/Boolean, kotlin/Boolean, kotlin/Boolean) // androidx.compose.material3/ModalBottomSheetProperties.|(kotlin.Boolean;kotlin.Boolean;kotlin.Boolean){}[0] - - final val shouldDismissOnBackPress // androidx.compose.material3/ModalBottomSheetProperties.shouldDismissOnBackPress|{}shouldDismissOnBackPress[0] - final fun (): kotlin/Boolean // androidx.compose.material3/ModalBottomSheetProperties.shouldDismissOnBackPress.|(){}[0] - final val shouldDismissOnClickOutside // androidx.compose.material3/ModalBottomSheetProperties.shouldDismissOnClickOutside|{}shouldDismissOnClickOutside[0] - final fun (): kotlin/Boolean // androidx.compose.material3/ModalBottomSheetProperties.shouldDismissOnClickOutside.|(){}[0] -} - final class androidx.compose.material3/ModalWideNavigationRailOverrideScope { // androidx.compose.material3/ModalWideNavigationRailOverrideScope|null[0] final val arrangement // androidx.compose.material3/ModalWideNavigationRailOverrideScope.arrangement|{}arrangement[0] final fun (): androidx.compose.foundation.layout/Arrangement.Vertical // androidx.compose.material3/ModalWideNavigationRailOverrideScope.arrangement.|(){}[0] @@ -1475,29 +1327,6 @@ final class androidx.compose.material3/RadioButtonColors { // androidx.compose.m final fun hashCode(): kotlin/Int // androidx.compose.material3/RadioButtonColors.hashCode|hashCode(){}[0] } -final class androidx.compose.material3/RangeSliderState { // androidx.compose.material3/RangeSliderState|null[0] - constructor (kotlin/Float = ..., kotlin/Float = ..., kotlin/Int = ..., kotlin/Function0? = ..., kotlin.ranges/ClosedFloatingPointRange = ...) // androidx.compose.material3/RangeSliderState.|(kotlin.Float;kotlin.Float;kotlin.Int;kotlin.Function0?;kotlin.ranges.ClosedFloatingPointRange){}[0] - - final val steps // androidx.compose.material3/RangeSliderState.steps|{}steps[0] - final fun (): kotlin/Int // androidx.compose.material3/RangeSliderState.steps.|(){}[0] - final val valueRange // androidx.compose.material3/RangeSliderState.valueRange|{}valueRange[0] - final fun (): kotlin.ranges/ClosedFloatingPointRange // androidx.compose.material3/RangeSliderState.valueRange.|(){}[0] - - final var activeRangeEnd // androidx.compose.material3/RangeSliderState.activeRangeEnd|{}activeRangeEnd[0] - final fun (): kotlin/Float // androidx.compose.material3/RangeSliderState.activeRangeEnd.|(){}[0] - final fun (kotlin/Float) // androidx.compose.material3/RangeSliderState.activeRangeEnd.|(kotlin.Float){}[0] - final var activeRangeStart // androidx.compose.material3/RangeSliderState.activeRangeStart|{}activeRangeStart[0] - final fun (): kotlin/Float // androidx.compose.material3/RangeSliderState.activeRangeStart.|(){}[0] - final fun (kotlin/Float) // androidx.compose.material3/RangeSliderState.activeRangeStart.|(kotlin.Float){}[0] - final var onValueChangeFinished // androidx.compose.material3/RangeSliderState.onValueChangeFinished|{}onValueChangeFinished[0] - final fun (): kotlin/Function0? // androidx.compose.material3/RangeSliderState.onValueChangeFinished.|(){}[0] - final fun (kotlin/Function0?) // androidx.compose.material3/RangeSliderState.onValueChangeFinished.|(kotlin.Function0?){}[0] - - final object Companion { // androidx.compose.material3/RangeSliderState.Companion|null[0] - final fun Saver(kotlin/Function0?, kotlin.ranges/ClosedFloatingPointRange): androidx.compose.runtime.saveable/Saver // androidx.compose.material3/RangeSliderState.Companion.Saver|Saver(kotlin.Function0?;kotlin.ranges.ClosedFloatingPointRange){}[0] - } -} - final class androidx.compose.material3/RichTooltipColors { // androidx.compose.material3/RichTooltipColors|null[0] constructor (androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color) // androidx.compose.material3/RichTooltipColors.|(androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color){}[0] @@ -1528,47 +1357,6 @@ final class androidx.compose.material3/RippleConfiguration { // androidx.compose final fun toString(): kotlin/String // androidx.compose.material3/RippleConfiguration.toString|toString(){}[0] } -final class androidx.compose.material3/SearchBarColors { // androidx.compose.material3/SearchBarColors|null[0] - constructor (androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color) // androidx.compose.material3/SearchBarColors.|(androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color){}[0] - constructor (androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.material3/TextFieldColors) // androidx.compose.material3/SearchBarColors.|(androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.material3.TextFieldColors){}[0] - - final val containerColor // androidx.compose.material3/SearchBarColors.containerColor|{}containerColor[0] - final fun (): androidx.compose.ui.graphics/Color // androidx.compose.material3/SearchBarColors.containerColor.|(){}[0] - final val dividerColor // androidx.compose.material3/SearchBarColors.dividerColor|{}dividerColor[0] - final fun (): androidx.compose.ui.graphics/Color // androidx.compose.material3/SearchBarColors.dividerColor.|(){}[0] - final val inputFieldColors // androidx.compose.material3/SearchBarColors.inputFieldColors|{}inputFieldColors[0] - final fun (): androidx.compose.material3/TextFieldColors // androidx.compose.material3/SearchBarColors.inputFieldColors.|(){}[0] - - final fun copy(androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.material3/TextFieldColors = ...): androidx.compose.material3/SearchBarColors // androidx.compose.material3/SearchBarColors.copy|copy(androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.material3.TextFieldColors){}[0] - final fun equals(kotlin/Any?): kotlin/Boolean // androidx.compose.material3/SearchBarColors.equals|equals(kotlin.Any?){}[0] - final fun hashCode(): kotlin/Int // androidx.compose.material3/SearchBarColors.hashCode|hashCode(){}[0] -} - -final class androidx.compose.material3/SearchBarState { // androidx.compose.material3/SearchBarState|null[0] - constructor (androidx.compose.material3/SearchBarValue, androidx.compose.animation.core/AnimationSpec, androidx.compose.animation.core/AnimationSpec) // androidx.compose.material3/SearchBarState.|(androidx.compose.material3.SearchBarValue;androidx.compose.animation.core.AnimationSpec;androidx.compose.animation.core.AnimationSpec){}[0] - - final val currentValue // androidx.compose.material3/SearchBarState.currentValue|{}currentValue[0] - final fun (): androidx.compose.material3/SearchBarValue // androidx.compose.material3/SearchBarState.currentValue.|(){}[0] - final val isAnimating // androidx.compose.material3/SearchBarState.isAnimating|{}isAnimating[0] - final fun (): kotlin/Boolean // androidx.compose.material3/SearchBarState.isAnimating.|(){}[0] - final val progress // androidx.compose.material3/SearchBarState.progress|{}progress[0] - final fun (): kotlin/Float // androidx.compose.material3/SearchBarState.progress.|(){}[0] - final val targetValue // androidx.compose.material3/SearchBarState.targetValue|{}targetValue[0] - final fun (): androidx.compose.material3/SearchBarValue // androidx.compose.material3/SearchBarState.targetValue.|(){}[0] - - final var collapsedCoords // androidx.compose.material3/SearchBarState.collapsedCoords|{}collapsedCoords[0] - final fun (): androidx.compose.ui.layout/LayoutCoordinates? // androidx.compose.material3/SearchBarState.collapsedCoords.|(){}[0] - final fun (androidx.compose.ui.layout/LayoutCoordinates?) // androidx.compose.material3/SearchBarState.collapsedCoords.|(androidx.compose.ui.layout.LayoutCoordinates?){}[0] - - final suspend fun animateToCollapsed() // androidx.compose.material3/SearchBarState.animateToCollapsed|animateToCollapsed(){}[0] - final suspend fun animateToExpanded() // androidx.compose.material3/SearchBarState.animateToExpanded|animateToExpanded(){}[0] - final suspend fun snapTo(kotlin/Float) // androidx.compose.material3/SearchBarState.snapTo|snapTo(kotlin.Float){}[0] - - final object Companion { // androidx.compose.material3/SearchBarState.Companion|null[0] - final fun Saver(androidx.compose.animation.core/AnimationSpec, androidx.compose.animation.core/AnimationSpec): androidx.compose.runtime.saveable/Saver // androidx.compose.material3/SearchBarState.Companion.Saver|Saver(androidx.compose.animation.core.AnimationSpec;androidx.compose.animation.core.AnimationSpec){}[0] - } -} - final class androidx.compose.material3/SegmentedButtonColors { // androidx.compose.material3/SegmentedButtonColors|null[0] constructor (androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color) // androidx.compose.material3/SegmentedButtonColors.|(androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color){}[0] @@ -1658,35 +1446,6 @@ final class androidx.compose.material3/Shapes { // androidx.compose.material3/Sh final fun toString(): kotlin/String // androidx.compose.material3/Shapes.toString|toString(){}[0] } -final class androidx.compose.material3/SheetState { // androidx.compose.material3/SheetState|null[0] - constructor (kotlin/Boolean, androidx.compose.ui.unit/Density, androidx.compose.material3/SheetValue = ..., kotlin/Function1 = ..., kotlin/Boolean = ...) // androidx.compose.material3/SheetState.|(kotlin.Boolean;androidx.compose.ui.unit.Density;androidx.compose.material3.SheetValue;kotlin.Function1;kotlin.Boolean){}[0] - constructor (kotlin/Boolean, kotlin/Function0, kotlin/Function0, androidx.compose.material3/SheetValue = ..., kotlin/Function1 = ..., kotlin/Boolean = ...) // androidx.compose.material3/SheetState.|(kotlin.Boolean;kotlin.Function0;kotlin.Function0;androidx.compose.material3.SheetValue;kotlin.Function1;kotlin.Boolean){}[0] - - final val currentValue // androidx.compose.material3/SheetState.currentValue|{}currentValue[0] - final fun (): androidx.compose.material3/SheetValue // androidx.compose.material3/SheetState.currentValue.|(){}[0] - final val hasExpandedState // androidx.compose.material3/SheetState.hasExpandedState|{}hasExpandedState[0] - final fun (): kotlin/Boolean // androidx.compose.material3/SheetState.hasExpandedState.|(){}[0] - final val hasPartiallyExpandedState // androidx.compose.material3/SheetState.hasPartiallyExpandedState|{}hasPartiallyExpandedState[0] - final fun (): kotlin/Boolean // androidx.compose.material3/SheetState.hasPartiallyExpandedState.|(){}[0] - final val isAnimationRunning // androidx.compose.material3/SheetState.isAnimationRunning|{}isAnimationRunning[0] - final fun (): kotlin/Boolean // androidx.compose.material3/SheetState.isAnimationRunning.|(){}[0] - final val isVisible // androidx.compose.material3/SheetState.isVisible|{}isVisible[0] - final fun (): kotlin/Boolean // androidx.compose.material3/SheetState.isVisible.|(){}[0] - final val targetValue // androidx.compose.material3/SheetState.targetValue|{}targetValue[0] - final fun (): androidx.compose.material3/SheetValue // androidx.compose.material3/SheetState.targetValue.|(){}[0] - - final fun requireOffset(): kotlin/Float // androidx.compose.material3/SheetState.requireOffset|requireOffset(){}[0] - final suspend fun expand() // androidx.compose.material3/SheetState.expand|expand(){}[0] - final suspend fun hide() // androidx.compose.material3/SheetState.hide|hide(){}[0] - final suspend fun partialExpand() // androidx.compose.material3/SheetState.partialExpand|partialExpand(){}[0] - final suspend fun show() // androidx.compose.material3/SheetState.show|show(){}[0] - - final object Companion { // androidx.compose.material3/SheetState.Companion|null[0] - final fun Saver(kotlin/Boolean, kotlin/Function0, kotlin/Function0, kotlin/Function1, kotlin/Boolean): androidx.compose.runtime.saveable/Saver // androidx.compose.material3/SheetState.Companion.Saver|Saver(kotlin.Boolean;kotlin.Function0;kotlin.Function0;kotlin.Function1;kotlin.Boolean){}[0] - final fun Saver(kotlin/Boolean, kotlin/Function1, androidx.compose.ui.unit/Density, kotlin/Boolean): androidx.compose.runtime.saveable/Saver // androidx.compose.material3/SheetState.Companion.Saver|Saver(kotlin.Boolean;kotlin.Function1;androidx.compose.ui.unit.Density;kotlin.Boolean){}[0] - } -} - final class androidx.compose.material3/ShortNavigationBarOverrideScope { // androidx.compose.material3/ShortNavigationBarOverrideScope|null[0] final val arrangement // androidx.compose.material3/ShortNavigationBarOverrideScope.arrangement|{}arrangement[0] final fun (): androidx.compose.material3/ShortNavigationBarArrangement // androidx.compose.material3/ShortNavigationBarOverrideScope.arrangement.|(){}[0] @@ -1772,39 +1531,6 @@ final class androidx.compose.material3/SliderPositions { // androidx.compose.mat final fun hashCode(): kotlin/Int // androidx.compose.material3/SliderPositions.hashCode|hashCode(){}[0] } -final class androidx.compose.material3/SliderState : androidx.compose.foundation.gestures/DraggableState { // androidx.compose.material3/SliderState|null[0] - constructor (kotlin/Float = ..., kotlin/Int = ..., kotlin/Function0? = ..., kotlin.ranges/ClosedFloatingPointRange = ...) // androidx.compose.material3/SliderState.|(kotlin.Float;kotlin.Int;kotlin.Function0?;kotlin.ranges.ClosedFloatingPointRange){}[0] - - final val coercedValueAsFraction // androidx.compose.material3/SliderState.coercedValueAsFraction|{}coercedValueAsFraction[0] - final fun (): kotlin/Float // androidx.compose.material3/SliderState.coercedValueAsFraction.|(){}[0] - final val steps // androidx.compose.material3/SliderState.steps|{}steps[0] - final fun (): kotlin/Int // androidx.compose.material3/SliderState.steps.|(){}[0] - final val valueRange // androidx.compose.material3/SliderState.valueRange|{}valueRange[0] - final fun (): kotlin.ranges/ClosedFloatingPointRange // androidx.compose.material3/SliderState.valueRange.|(){}[0] - - final var isDragging // androidx.compose.material3/SliderState.isDragging|{}isDragging[0] - final fun (): kotlin/Boolean // androidx.compose.material3/SliderState.isDragging.|(){}[0] - final var onValueChange // androidx.compose.material3/SliderState.onValueChange|{}onValueChange[0] - final fun (): kotlin/Function1? // androidx.compose.material3/SliderState.onValueChange.|(){}[0] - final fun (kotlin/Function1?) // androidx.compose.material3/SliderState.onValueChange.|(kotlin.Function1?){}[0] - final var onValueChangeFinished // androidx.compose.material3/SliderState.onValueChangeFinished|{}onValueChangeFinished[0] - final fun (): kotlin/Function0? // androidx.compose.material3/SliderState.onValueChangeFinished.|(){}[0] - final fun (kotlin/Function0?) // androidx.compose.material3/SliderState.onValueChangeFinished.|(kotlin.Function0?){}[0] - final var shouldAutoSnap // androidx.compose.material3/SliderState.shouldAutoSnap|{}shouldAutoSnap[0] - final fun (): kotlin/Boolean // androidx.compose.material3/SliderState.shouldAutoSnap.|(){}[0] - final fun (kotlin/Boolean) // androidx.compose.material3/SliderState.shouldAutoSnap.|(kotlin.Boolean){}[0] - final var value // androidx.compose.material3/SliderState.value|{}value[0] - final fun (): kotlin/Float // androidx.compose.material3/SliderState.value.|(){}[0] - final fun (kotlin/Float) // androidx.compose.material3/SliderState.value.|(kotlin.Float){}[0] - - final fun dispatchRawDelta(kotlin/Float) // androidx.compose.material3/SliderState.dispatchRawDelta|dispatchRawDelta(kotlin.Float){}[0] - final suspend fun drag(androidx.compose.foundation/MutatePriority, kotlin.coroutines/SuspendFunction1) // androidx.compose.material3/SliderState.drag|drag(androidx.compose.foundation.MutatePriority;kotlin.coroutines.SuspendFunction1){}[0] - - final object Companion { // androidx.compose.material3/SliderState.Companion|null[0] - final fun Saver(kotlin/Function0?, kotlin.ranges/ClosedFloatingPointRange): androidx.compose.runtime.saveable/Saver // androidx.compose.material3/SliderState.Companion.Saver|Saver(kotlin.Function0?;kotlin.ranges.ClosedFloatingPointRange){}[0] - } -} - final class androidx.compose.material3/SnackbarHostState { // androidx.compose.material3/SnackbarHostState|null[0] constructor () // androidx.compose.material3/SnackbarHostState.|(){}[0] @@ -2017,43 +1743,6 @@ final class androidx.compose.material3/TextFieldColors { // androidx.compose.mat final fun trailingIconColor(kotlin/Boolean, kotlin/Boolean, kotlin/Boolean): androidx.compose.ui.graphics/Color // androidx.compose.material3/TextFieldColors.trailingIconColor|trailingIconColor(kotlin.Boolean;kotlin.Boolean;kotlin.Boolean){}[0] } -final class androidx.compose.material3/TimePickerColors { // androidx.compose.material3/TimePickerColors|null[0] - constructor (androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color) // androidx.compose.material3/TimePickerColors.|(androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color){}[0] - - final val clockDialColor // androidx.compose.material3/TimePickerColors.clockDialColor|{}clockDialColor[0] - final fun (): androidx.compose.ui.graphics/Color // androidx.compose.material3/TimePickerColors.clockDialColor.|(){}[0] - final val clockDialSelectedContentColor // androidx.compose.material3/TimePickerColors.clockDialSelectedContentColor|{}clockDialSelectedContentColor[0] - final fun (): androidx.compose.ui.graphics/Color // androidx.compose.material3/TimePickerColors.clockDialSelectedContentColor.|(){}[0] - final val clockDialUnselectedContentColor // androidx.compose.material3/TimePickerColors.clockDialUnselectedContentColor|{}clockDialUnselectedContentColor[0] - final fun (): androidx.compose.ui.graphics/Color // androidx.compose.material3/TimePickerColors.clockDialUnselectedContentColor.|(){}[0] - final val containerColor // androidx.compose.material3/TimePickerColors.containerColor|{}containerColor[0] - final fun (): androidx.compose.ui.graphics/Color // androidx.compose.material3/TimePickerColors.containerColor.|(){}[0] - final val periodSelectorBorderColor // androidx.compose.material3/TimePickerColors.periodSelectorBorderColor|{}periodSelectorBorderColor[0] - final fun (): androidx.compose.ui.graphics/Color // androidx.compose.material3/TimePickerColors.periodSelectorBorderColor.|(){}[0] - final val periodSelectorSelectedContainerColor // androidx.compose.material3/TimePickerColors.periodSelectorSelectedContainerColor|{}periodSelectorSelectedContainerColor[0] - final fun (): androidx.compose.ui.graphics/Color // androidx.compose.material3/TimePickerColors.periodSelectorSelectedContainerColor.|(){}[0] - final val periodSelectorSelectedContentColor // androidx.compose.material3/TimePickerColors.periodSelectorSelectedContentColor|{}periodSelectorSelectedContentColor[0] - final fun (): androidx.compose.ui.graphics/Color // androidx.compose.material3/TimePickerColors.periodSelectorSelectedContentColor.|(){}[0] - final val periodSelectorUnselectedContainerColor // androidx.compose.material3/TimePickerColors.periodSelectorUnselectedContainerColor|{}periodSelectorUnselectedContainerColor[0] - final fun (): androidx.compose.ui.graphics/Color // androidx.compose.material3/TimePickerColors.periodSelectorUnselectedContainerColor.|(){}[0] - final val periodSelectorUnselectedContentColor // androidx.compose.material3/TimePickerColors.periodSelectorUnselectedContentColor|{}periodSelectorUnselectedContentColor[0] - final fun (): androidx.compose.ui.graphics/Color // androidx.compose.material3/TimePickerColors.periodSelectorUnselectedContentColor.|(){}[0] - final val selectorColor // androidx.compose.material3/TimePickerColors.selectorColor|{}selectorColor[0] - final fun (): androidx.compose.ui.graphics/Color // androidx.compose.material3/TimePickerColors.selectorColor.|(){}[0] - final val timeSelectorSelectedContainerColor // androidx.compose.material3/TimePickerColors.timeSelectorSelectedContainerColor|{}timeSelectorSelectedContainerColor[0] - final fun (): androidx.compose.ui.graphics/Color // androidx.compose.material3/TimePickerColors.timeSelectorSelectedContainerColor.|(){}[0] - final val timeSelectorSelectedContentColor // androidx.compose.material3/TimePickerColors.timeSelectorSelectedContentColor|{}timeSelectorSelectedContentColor[0] - final fun (): androidx.compose.ui.graphics/Color // androidx.compose.material3/TimePickerColors.timeSelectorSelectedContentColor.|(){}[0] - final val timeSelectorUnselectedContainerColor // androidx.compose.material3/TimePickerColors.timeSelectorUnselectedContainerColor|{}timeSelectorUnselectedContainerColor[0] - final fun (): androidx.compose.ui.graphics/Color // androidx.compose.material3/TimePickerColors.timeSelectorUnselectedContainerColor.|(){}[0] - final val timeSelectorUnselectedContentColor // androidx.compose.material3/TimePickerColors.timeSelectorUnselectedContentColor|{}timeSelectorUnselectedContentColor[0] - final fun (): androidx.compose.ui.graphics/Color // androidx.compose.material3/TimePickerColors.timeSelectorUnselectedContentColor.|(){}[0] - - final fun copy(androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ...): androidx.compose.material3/TimePickerColors // androidx.compose.material3/TimePickerColors.copy|copy(androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color){}[0] - final fun equals(kotlin/Any?): kotlin/Boolean // androidx.compose.material3/TimePickerColors.equals|equals(kotlin.Any?){}[0] - final fun hashCode(): kotlin/Int // androidx.compose.material3/TimePickerColors.hashCode|hashCode(){}[0] -} - final class androidx.compose.material3/ToggleButtonColors { // androidx.compose.material3/ToggleButtonColors|null[0] constructor (androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color) // androidx.compose.material3/ToggleButtonColors.|(androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color){}[0] @@ -2479,22 +2168,6 @@ final value class androidx.compose.material3/TimePickerLayoutType { // androidx. } } -final value class androidx.compose.material3/TimePickerSelectionMode { // androidx.compose.material3/TimePickerSelectionMode|null[0] - final val value // androidx.compose.material3/TimePickerSelectionMode.value|{}value[0] - final fun (): kotlin/Int // androidx.compose.material3/TimePickerSelectionMode.value.|(){}[0] - - final fun equals(kotlin/Any?): kotlin/Boolean // androidx.compose.material3/TimePickerSelectionMode.equals|equals(kotlin.Any?){}[0] - final fun hashCode(): kotlin/Int // androidx.compose.material3/TimePickerSelectionMode.hashCode|hashCode(){}[0] - final fun toString(): kotlin/String // androidx.compose.material3/TimePickerSelectionMode.toString|toString(){}[0] - - final object Companion { // androidx.compose.material3/TimePickerSelectionMode.Companion|null[0] - final val Hour // androidx.compose.material3/TimePickerSelectionMode.Companion.Hour|{}Hour[0] - final fun (): androidx.compose.material3/TimePickerSelectionMode // androidx.compose.material3/TimePickerSelectionMode.Companion.Hour.|(){}[0] - final val Minute // androidx.compose.material3/TimePickerSelectionMode.Companion.Minute|{}Minute[0] - final fun (): androidx.compose.material3/TimePickerSelectionMode // androidx.compose.material3/TimePickerSelectionMode.Companion.Minute.|(){}[0] - } -} - final value class androidx.compose.material3/TooltipAnchorPosition { // androidx.compose.material3/TooltipAnchorPosition|null[0] final fun equals(kotlin/Any?): kotlin/Boolean // androidx.compose.material3/TooltipAnchorPosition.equals|equals(kotlin.Any?){}[0] final fun hashCode(): kotlin/Int // androidx.compose.material3/TooltipAnchorPosition.hashCode|hashCode(){}[0] @@ -2521,15 +2194,6 @@ open class androidx.compose.material3/FloatingActionButtonElevation { // android open fun hashCode(): kotlin/Int // androidx.compose.material3/FloatingActionButtonElevation.hashCode|hashCode(){}[0] } -sealed class androidx.compose.material3/ExposedDropdownMenuBoxScope { // androidx.compose.material3/ExposedDropdownMenuBoxScope|null[0] - abstract fun (androidx.compose.ui/Modifier).exposedDropdownSize(kotlin/Boolean = ...): androidx.compose.ui/Modifier // androidx.compose.material3/ExposedDropdownMenuBoxScope.exposedDropdownSize|exposedDropdownSize@androidx.compose.ui.Modifier(kotlin.Boolean){}[0] - abstract fun (androidx.compose.ui/Modifier).menuAnchor(androidx.compose.material3/ExposedDropdownMenuAnchorType, kotlin/Boolean = ...): androidx.compose.ui/Modifier // androidx.compose.material3/ExposedDropdownMenuBoxScope.menuAnchor|menuAnchor@androidx.compose.ui.Modifier(androidx.compose.material3.ExposedDropdownMenuAnchorType;kotlin.Boolean){}[0] - final fun (androidx.compose.ui/Modifier).menuAnchor(): androidx.compose.ui/Modifier // androidx.compose.material3/ExposedDropdownMenuBoxScope.menuAnchor|menuAnchor@androidx.compose.ui.Modifier(){}[0] - final fun ExposedDropdownMenu(kotlin/Boolean, kotlin/Function0, androidx.compose.ui/Modifier?, androidx.compose.foundation/ScrollState?, kotlin/Boolean, androidx.compose.ui.graphics/Shape?, androidx.compose.ui.graphics/Color, androidx.compose.ui.unit/Dp, androidx.compose.ui.unit/Dp, androidx.compose.foundation/BorderStroke?, kotlin/Function3, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int) // androidx.compose.material3/ExposedDropdownMenuBoxScope.ExposedDropdownMenu|ExposedDropdownMenu(kotlin.Boolean;kotlin.Function0;androidx.compose.ui.Modifier?;androidx.compose.foundation.ScrollState?;kotlin.Boolean;androidx.compose.ui.graphics.Shape?;androidx.compose.ui.graphics.Color;androidx.compose.ui.unit.Dp;androidx.compose.ui.unit.Dp;androidx.compose.foundation.BorderStroke?;kotlin.Function3;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int;kotlin.Int){}[0] - final fun ExposedDropdownMenu(kotlin/Boolean, kotlin/Function0, androidx.compose.ui/Modifier?, androidx.compose.foundation/ScrollState?, kotlin/Boolean, kotlin/Boolean, androidx.compose.ui.graphics/Shape?, androidx.compose.ui.graphics/Color, androidx.compose.ui.unit/Dp, androidx.compose.ui.unit/Dp, androidx.compose.foundation/BorderStroke?, kotlin/Function3, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int) // androidx.compose.material3/ExposedDropdownMenuBoxScope.ExposedDropdownMenu|ExposedDropdownMenu(kotlin.Boolean;kotlin.Function0;androidx.compose.ui.Modifier?;androidx.compose.foundation.ScrollState?;kotlin.Boolean;kotlin.Boolean;androidx.compose.ui.graphics.Shape?;androidx.compose.ui.graphics.Color;androidx.compose.ui.unit.Dp;androidx.compose.ui.unit.Dp;androidx.compose.foundation.BorderStroke?;kotlin.Function3;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int;kotlin.Int){}[0] - final fun ExposedDropdownMenu(kotlin/Boolean, kotlin/Function0, androidx.compose.ui/Modifier?, androidx.compose.foundation/ScrollState?, kotlin/Function3, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/ExposedDropdownMenuBoxScope.ExposedDropdownMenu|ExposedDropdownMenu(kotlin.Boolean;kotlin.Function0;androidx.compose.ui.Modifier?;androidx.compose.foundation.ScrollState?;kotlin.Function3;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] -} - sealed class androidx.compose.material3/MaterialShapes { // androidx.compose.material3/MaterialShapes|null[0] final object Companion { // androidx.compose.material3/MaterialShapes.Companion|null[0] final val Arch // androidx.compose.material3/MaterialShapes.Companion.Arch|{}Arch[0] @@ -2625,8 +2289,6 @@ final object androidx.compose.material3.pulltorefresh/PullToRefreshDefaults { // final fun (): androidx.compose.ui.unit/Dp // androidx.compose.material3.pulltorefresh/PullToRefreshDefaults.LoadingIndicatorElevation.|(){}[0] final val PositionalThreshold // androidx.compose.material3.pulltorefresh/PullToRefreshDefaults.PositionalThreshold|{}PositionalThreshold[0] final fun (): androidx.compose.ui.unit/Dp // androidx.compose.material3.pulltorefresh/PullToRefreshDefaults.PositionalThreshold.|(){}[0] - final val containerColor // androidx.compose.material3.pulltorefresh/PullToRefreshDefaults.containerColor|{}containerColor[0] - final fun (androidx.compose.runtime/Composer?, kotlin/Int): androidx.compose.ui.graphics/Color // androidx.compose.material3.pulltorefresh/PullToRefreshDefaults.containerColor.|(androidx.compose.runtime.Composer?;kotlin.Int){}[0] final val indicatorColor // androidx.compose.material3.pulltorefresh/PullToRefreshDefaults.indicatorColor|{}indicatorColor[0] final fun (androidx.compose.runtime/Composer?, kotlin/Int): androidx.compose.ui.graphics/Color // androidx.compose.material3.pulltorefresh/PullToRefreshDefaults.indicatorColor.|(androidx.compose.runtime.Composer?;kotlin.Int){}[0] final val indicatorContainerColor // androidx.compose.material3.pulltorefresh/PullToRefreshDefaults.indicatorContainerColor|{}indicatorContainerColor[0] @@ -2637,8 +2299,6 @@ final object androidx.compose.material3.pulltorefresh/PullToRefreshDefaults { // final fun (androidx.compose.runtime/Composer?, kotlin/Int): androidx.compose.ui.graphics/Color // androidx.compose.material3.pulltorefresh/PullToRefreshDefaults.loadingIndicatorColor.|(androidx.compose.runtime.Composer?;kotlin.Int){}[0] final val loadingIndicatorContainerColor // androidx.compose.material3.pulltorefresh/PullToRefreshDefaults.loadingIndicatorContainerColor|{}loadingIndicatorContainerColor[0] final fun (androidx.compose.runtime/Composer?, kotlin/Int): androidx.compose.ui.graphics/Color // androidx.compose.material3.pulltorefresh/PullToRefreshDefaults.loadingIndicatorContainerColor.|(androidx.compose.runtime.Composer?;kotlin.Int){}[0] - final val shape // androidx.compose.material3.pulltorefresh/PullToRefreshDefaults.shape|{}shape[0] - final fun (): androidx.compose.ui.graphics/Shape // androidx.compose.material3.pulltorefresh/PullToRefreshDefaults.shape.|(){}[0] final fun Indicator(androidx.compose.material3.pulltorefresh/PullToRefreshState, kotlin/Boolean, androidx.compose.ui/Modifier?, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.unit/Dp, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3.pulltorefresh/PullToRefreshDefaults.Indicator|Indicator(androidx.compose.material3.pulltorefresh.PullToRefreshState;kotlin.Boolean;androidx.compose.ui.Modifier?;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.unit.Dp;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun IndicatorBox(androidx.compose.material3.pulltorefresh/PullToRefreshState, kotlin/Boolean, androidx.compose.ui/Modifier?, androidx.compose.ui.unit/Dp, androidx.compose.ui.graphics/Shape?, androidx.compose.ui.graphics/Color, androidx.compose.ui.unit/Dp, kotlin/Function3, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3.pulltorefresh/PullToRefreshDefaults.IndicatorBox|IndicatorBox(androidx.compose.material3.pulltorefresh.PullToRefreshState;kotlin.Boolean;androidx.compose.ui.Modifier?;androidx.compose.ui.unit.Dp;androidx.compose.ui.graphics.Shape?;androidx.compose.ui.graphics.Color;androidx.compose.ui.unit.Dp;kotlin.Function3;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] @@ -2706,29 +2366,6 @@ final object androidx.compose.material3/BottomAppBarDefaults { // androidx.compo final fun (androidx.compose.runtime/Composer?, kotlin/Int): androidx.compose.ui.graphics/Color // androidx.compose.material3/BottomAppBarDefaults.containerColor.|(androidx.compose.runtime.Composer?;kotlin.Int){}[0] final val windowInsets // androidx.compose.material3/BottomAppBarDefaults.windowInsets|{}windowInsets[0] final fun (androidx.compose.runtime/Composer?, kotlin/Int): androidx.compose.foundation.layout/WindowInsets // androidx.compose.material3/BottomAppBarDefaults.windowInsets.|(androidx.compose.runtime.Composer?;kotlin.Int){}[0] - - final fun exitAlwaysScrollBehavior(androidx.compose.material3/BottomAppBarState?, kotlin/Function0?, androidx.compose.animation.core/AnimationSpec?, androidx.compose.animation.core/DecayAnimationSpec?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int): androidx.compose.material3/BottomAppBarScrollBehavior // androidx.compose.material3/BottomAppBarDefaults.exitAlwaysScrollBehavior|exitAlwaysScrollBehavior(androidx.compose.material3.BottomAppBarState?;kotlin.Function0?;androidx.compose.animation.core.AnimationSpec?;androidx.compose.animation.core.DecayAnimationSpec?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] -} - -final object androidx.compose.material3/BottomSheetDefaults { // androidx.compose.material3/BottomSheetDefaults|null[0] - final val ContainerColor // androidx.compose.material3/BottomSheetDefaults.ContainerColor|{}ContainerColor[0] - final fun (androidx.compose.runtime/Composer?, kotlin/Int): androidx.compose.ui.graphics/Color // androidx.compose.material3/BottomSheetDefaults.ContainerColor.|(androidx.compose.runtime.Composer?;kotlin.Int){}[0] - final val Elevation // androidx.compose.material3/BottomSheetDefaults.Elevation|{}Elevation[0] - final fun (): androidx.compose.ui.unit/Dp // androidx.compose.material3/BottomSheetDefaults.Elevation.|(){}[0] - final val ExpandedShape // androidx.compose.material3/BottomSheetDefaults.ExpandedShape|{}ExpandedShape[0] - final fun (androidx.compose.runtime/Composer?, kotlin/Int): androidx.compose.ui.graphics/Shape // androidx.compose.material3/BottomSheetDefaults.ExpandedShape.|(androidx.compose.runtime.Composer?;kotlin.Int){}[0] - final val HiddenShape // androidx.compose.material3/BottomSheetDefaults.HiddenShape|{}HiddenShape[0] - final fun (androidx.compose.runtime/Composer?, kotlin/Int): androidx.compose.ui.graphics/Shape // androidx.compose.material3/BottomSheetDefaults.HiddenShape.|(androidx.compose.runtime.Composer?;kotlin.Int){}[0] - final val ScrimColor // androidx.compose.material3/BottomSheetDefaults.ScrimColor|{}ScrimColor[0] - final fun (androidx.compose.runtime/Composer?, kotlin/Int): androidx.compose.ui.graphics/Color // androidx.compose.material3/BottomSheetDefaults.ScrimColor.|(androidx.compose.runtime.Composer?;kotlin.Int){}[0] - final val SheetMaxWidth // androidx.compose.material3/BottomSheetDefaults.SheetMaxWidth|{}SheetMaxWidth[0] - final fun (): androidx.compose.ui.unit/Dp // androidx.compose.material3/BottomSheetDefaults.SheetMaxWidth.|(){}[0] - final val SheetPeekHeight // androidx.compose.material3/BottomSheetDefaults.SheetPeekHeight|{}SheetPeekHeight[0] - final fun (): androidx.compose.ui.unit/Dp // androidx.compose.material3/BottomSheetDefaults.SheetPeekHeight.|(){}[0] - final val windowInsets // androidx.compose.material3/BottomSheetDefaults.windowInsets|{}windowInsets[0] - final fun (androidx.compose.runtime/Composer?, kotlin/Int): androidx.compose.foundation.layout/WindowInsets // androidx.compose.material3/BottomSheetDefaults.windowInsets.|(androidx.compose.runtime.Composer?;kotlin.Int){}[0] - - final fun DragHandle(androidx.compose.ui/Modifier?, androidx.compose.ui.unit/Dp, androidx.compose.ui.unit/Dp, androidx.compose.ui.graphics/Shape?, androidx.compose.ui.graphics/Color, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/BottomSheetDefaults.DragHandle|DragHandle(androidx.compose.ui.Modifier?;androidx.compose.ui.unit.Dp;androidx.compose.ui.unit.Dp;androidx.compose.ui.graphics.Shape?;androidx.compose.ui.graphics.Color;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] } final object androidx.compose.material3/ButtonDefaults { // androidx.compose.material3/ButtonDefaults|null[0] @@ -2889,15 +2526,6 @@ final object androidx.compose.material3/CheckboxDefaults { // androidx.compose.m final fun colors(androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int): androidx.compose.material3/CheckboxColors // androidx.compose.material3/CheckboxDefaults.colors|colors(androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int;kotlin.Int){}[0] } -final object androidx.compose.material3/ComposeMaterial3Flags { // androidx.compose.material3/ComposeMaterial3Flags|null[0] - final var isCheckboxStylingFixEnabled // androidx.compose.material3/ComposeMaterial3Flags.isCheckboxStylingFixEnabled|{}isCheckboxStylingFixEnabled[0] - final fun (): kotlin/Boolean // androidx.compose.material3/ComposeMaterial3Flags.isCheckboxStylingFixEnabled.|(){}[0] - final fun (kotlin/Boolean) // androidx.compose.material3/ComposeMaterial3Flags.isCheckboxStylingFixEnabled.|(kotlin.Boolean){}[0] - final var isPrecisionPointerComponentSizingEnabled // androidx.compose.material3/ComposeMaterial3Flags.isPrecisionPointerComponentSizingEnabled|{}isPrecisionPointerComponentSizingEnabled[0] - final fun (): kotlin/Boolean // androidx.compose.material3/ComposeMaterial3Flags.isPrecisionPointerComponentSizingEnabled.|(){}[0] - final fun (kotlin/Boolean) // androidx.compose.material3/ComposeMaterial3Flags.isPrecisionPointerComponentSizingEnabled.|(kotlin.Boolean){}[0] -} - final object androidx.compose.material3/DatePickerDefaults { // androidx.compose.material3/DatePickerDefaults|null[0] final const val YearAbbrMonthDaySkeleton // androidx.compose.material3/DatePickerDefaults.YearAbbrMonthDaySkeleton|{}YearAbbrMonthDaySkeleton[0] final fun (): kotlin/String // androidx.compose.material3/DatePickerDefaults.YearAbbrMonthDaySkeleton.|(){}[0] @@ -3005,19 +2633,6 @@ final object androidx.compose.material3/DrawerDefaults { // androidx.compose.mat final fun (androidx.compose.runtime/Composer?, kotlin/Int): androidx.compose.foundation.layout/WindowInsets // androidx.compose.material3/DrawerDefaults.windowInsets.|(androidx.compose.runtime.Composer?;kotlin.Int){}[0] } -final object androidx.compose.material3/ExposedDropdownMenuDefaults { // androidx.compose.material3/ExposedDropdownMenuDefaults|null[0] - final val ItemContentPadding // androidx.compose.material3/ExposedDropdownMenuDefaults.ItemContentPadding|{}ItemContentPadding[0] - final fun (): androidx.compose.foundation.layout/PaddingValues // androidx.compose.material3/ExposedDropdownMenuDefaults.ItemContentPadding.|(){}[0] - - final fun TrailingIcon(kotlin/Boolean, androidx.compose.ui/Modifier?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/ExposedDropdownMenuDefaults.TrailingIcon|TrailingIcon(kotlin.Boolean;androidx.compose.ui.Modifier?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] - final fun outlinedTextFieldColors(androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.foundation.text.selection/TextSelectionColors?, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int, kotlin/Int): androidx.compose.material3/TextFieldColors // androidx.compose.material3/ExposedDropdownMenuDefaults.outlinedTextFieldColors|outlinedTextFieldColors(androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.foundation.text.selection.TextSelectionColors?;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int;kotlin.Int;kotlin.Int){}[0] - final fun outlinedTextFieldColors(androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.foundation.text.selection/TextSelectionColors?, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int, kotlin/Int, kotlin/Int, kotlin/Int): androidx.compose.material3/TextFieldColors // androidx.compose.material3/ExposedDropdownMenuDefaults.outlinedTextFieldColors|outlinedTextFieldColors(androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.foundation.text.selection.TextSelectionColors?;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int;kotlin.Int;kotlin.Int;kotlin.Int;kotlin.Int){}[0] - final fun outlinedTextFieldColors(androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.foundation.text.selection/TextSelectionColors?, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int, kotlin/Int, kotlin/Int, kotlin/Int): androidx.compose.material3/TextFieldColors // androidx.compose.material3/ExposedDropdownMenuDefaults.outlinedTextFieldColors|outlinedTextFieldColors(androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.foundation.text.selection.TextSelectionColors?;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int;kotlin.Int;kotlin.Int;kotlin.Int;kotlin.Int){}[0] - final fun textFieldColors(androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.foundation.text.selection/TextSelectionColors?, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int, kotlin/Int): androidx.compose.material3/TextFieldColors // androidx.compose.material3/ExposedDropdownMenuDefaults.textFieldColors|textFieldColors(androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.foundation.text.selection.TextSelectionColors?;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int;kotlin.Int;kotlin.Int){}[0] - final fun textFieldColors(androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.foundation.text.selection/TextSelectionColors?, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int, kotlin/Int, kotlin/Int, kotlin/Int): androidx.compose.material3/TextFieldColors // androidx.compose.material3/ExposedDropdownMenuDefaults.textFieldColors|textFieldColors(androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.foundation.text.selection.TextSelectionColors?;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int;kotlin.Int;kotlin.Int;kotlin.Int;kotlin.Int){}[0] - final fun textFieldColors(androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.foundation.text.selection/TextSelectionColors?, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int, kotlin/Int, kotlin/Int, kotlin/Int): androidx.compose.material3/TextFieldColors // androidx.compose.material3/ExposedDropdownMenuDefaults.textFieldColors|textFieldColors(androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.foundation.text.selection.TextSelectionColors?;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int;kotlin.Int;kotlin.Int;kotlin.Int;kotlin.Int){}[0] -} - final object androidx.compose.material3/FilterChipDefaults { // androidx.compose.material3/FilterChipDefaults|null[0] final val ContentPadding // androidx.compose.material3/FilterChipDefaults.ContentPadding|{}ContentPadding[0] final fun (): androidx.compose.foundation.layout/PaddingValues // androidx.compose.material3/FilterChipDefaults.ContentPadding.|(){}[0] @@ -3359,11 +2974,6 @@ final object androidx.compose.material3/MenuDefaults { // androidx.compose.mater final fun selectableItemVibrantColors(androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int): androidx.compose.material3/MenuItemColors // androidx.compose.material3/MenuDefaults.selectableItemVibrantColors|selectableItemVibrantColors(androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int;kotlin.Int){}[0] } -final object androidx.compose.material3/ModalBottomSheetDefaults { // androidx.compose.material3/ModalBottomSheetDefaults|null[0] - final val properties // androidx.compose.material3/ModalBottomSheetDefaults.properties|{}properties[0] - final fun (): androidx.compose.material3/ModalBottomSheetProperties // androidx.compose.material3/ModalBottomSheetDefaults.properties.|(){}[0] -} - final object androidx.compose.material3/ModalWideNavigationRailDefaults { // androidx.compose.material3/ModalWideNavigationRailDefaults|null[0] final val Properties // androidx.compose.material3/ModalWideNavigationRailDefaults.Properties|{}Properties[0] final fun (): androidx.compose.material3/ModalWideNavigationRailProperties // androidx.compose.material3/ModalWideNavigationRailDefaults.Properties.|(){}[0] @@ -3417,7 +3027,6 @@ final object androidx.compose.material3/OutlinedTextFieldDefaults { // androidx. final fun (androidx.compose.runtime/Composer?, kotlin/Int): androidx.compose.ui.graphics/Shape // androidx.compose.material3/OutlinedTextFieldDefaults.shape.|(androidx.compose.runtime.Composer?;kotlin.Int){}[0] final fun Container(kotlin/Boolean, kotlin/Boolean, androidx.compose.foundation.interaction/InteractionSource, androidx.compose.ui/Modifier?, androidx.compose.material3/TextFieldColors?, androidx.compose.ui.graphics/Shape?, androidx.compose.ui.unit/Dp, androidx.compose.ui.unit/Dp, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/OutlinedTextFieldDefaults.Container|Container(kotlin.Boolean;kotlin.Boolean;androidx.compose.foundation.interaction.InteractionSource;androidx.compose.ui.Modifier?;androidx.compose.material3.TextFieldColors?;androidx.compose.ui.graphics.Shape?;androidx.compose.ui.unit.Dp;androidx.compose.ui.unit.Dp;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] - final fun ContainerBox(kotlin/Boolean, kotlin/Boolean, androidx.compose.foundation.interaction/InteractionSource, androidx.compose.material3/TextFieldColors?, androidx.compose.ui.graphics/Shape?, androidx.compose.ui.unit/Dp, androidx.compose.ui.unit/Dp, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/OutlinedTextFieldDefaults.ContainerBox|ContainerBox(kotlin.Boolean;kotlin.Boolean;androidx.compose.foundation.interaction.InteractionSource;androidx.compose.material3.TextFieldColors?;androidx.compose.ui.graphics.Shape?;androidx.compose.ui.unit.Dp;androidx.compose.ui.unit.Dp;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun DecorationBox(kotlin/String, kotlin/Function2, kotlin/Boolean, kotlin/Boolean, androidx.compose.ui.text.input/VisualTransformation, androidx.compose.foundation.interaction/InteractionSource, kotlin/Boolean, kotlin/Function2?, kotlin/Function2?, kotlin/Function2?, kotlin/Function2?, kotlin/Function2?, kotlin/Function2?, kotlin/Function2?, androidx.compose.material3/TextFieldColors?, androidx.compose.foundation.layout/PaddingValues?, kotlin/Function2?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int) // androidx.compose.material3/OutlinedTextFieldDefaults.DecorationBox|DecorationBox(kotlin.String;kotlin.Function2;kotlin.Boolean;kotlin.Boolean;androidx.compose.ui.text.input.VisualTransformation;androidx.compose.foundation.interaction.InteractionSource;kotlin.Boolean;kotlin.Function2?;kotlin.Function2?;kotlin.Function2?;kotlin.Function2?;kotlin.Function2?;kotlin.Function2?;kotlin.Function2?;androidx.compose.material3.TextFieldColors?;androidx.compose.foundation.layout.PaddingValues?;kotlin.Function2?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int;kotlin.Int){}[0] final fun colors(androidx.compose.runtime/Composer?, kotlin/Int): androidx.compose.material3/TextFieldColors // androidx.compose.material3/OutlinedTextFieldDefaults.colors|colors(androidx.compose.runtime.Composer?;kotlin.Int){}[0] final fun colors(androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.foundation.text.selection/TextSelectionColors?, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int, kotlin/Int, kotlin/Int, kotlin/Int, kotlin/Int): androidx.compose.material3/TextFieldColors // androidx.compose.material3/OutlinedTextFieldDefaults.colors|colors(androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.foundation.text.selection.TextSelectionColors?;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int;kotlin.Int;kotlin.Int;kotlin.Int;kotlin.Int;kotlin.Int){}[0] @@ -3430,16 +3039,10 @@ final object androidx.compose.material3/ProgressIndicatorDefaults { // androidx. final fun (): androidx.compose.ui.graphics/StrokeCap // androidx.compose.material3/ProgressIndicatorDefaults.CircularDeterminateStrokeCap.|(){}[0] final val CircularIndeterminateStrokeCap // androidx.compose.material3/ProgressIndicatorDefaults.CircularIndeterminateStrokeCap|{}CircularIndeterminateStrokeCap[0] final fun (): androidx.compose.ui.graphics/StrokeCap // androidx.compose.material3/ProgressIndicatorDefaults.CircularIndeterminateStrokeCap.|(){}[0] - final val CircularIndicatorTrackGapSize // androidx.compose.material3/ProgressIndicatorDefaults.CircularIndicatorTrackGapSize|{}CircularIndicatorTrackGapSize[0] - final fun (): androidx.compose.ui.unit/Dp // androidx.compose.material3/ProgressIndicatorDefaults.CircularIndicatorTrackGapSize.|(){}[0] final val CircularStrokeWidth // androidx.compose.material3/ProgressIndicatorDefaults.CircularStrokeWidth|{}CircularStrokeWidth[0] final fun (): androidx.compose.ui.unit/Dp // androidx.compose.material3/ProgressIndicatorDefaults.CircularStrokeWidth.|(){}[0] - final val LinearIndicatorTrackGapSize // androidx.compose.material3/ProgressIndicatorDefaults.LinearIndicatorTrackGapSize|{}LinearIndicatorTrackGapSize[0] - final fun (): androidx.compose.ui.unit/Dp // androidx.compose.material3/ProgressIndicatorDefaults.LinearIndicatorTrackGapSize.|(){}[0] final val LinearStrokeCap // androidx.compose.material3/ProgressIndicatorDefaults.LinearStrokeCap|{}LinearStrokeCap[0] final fun (): androidx.compose.ui.graphics/StrokeCap // androidx.compose.material3/ProgressIndicatorDefaults.LinearStrokeCap.|(){}[0] - final val LinearTrackStopIndicatorSize // androidx.compose.material3/ProgressIndicatorDefaults.LinearTrackStopIndicatorSize|{}LinearTrackStopIndicatorSize[0] - final fun (): androidx.compose.ui.unit/Dp // androidx.compose.material3/ProgressIndicatorDefaults.LinearTrackStopIndicatorSize.|(){}[0] final val ProgressAnimationSpec // androidx.compose.material3/ProgressIndicatorDefaults.ProgressAnimationSpec|{}ProgressAnimationSpec[0] final fun (): androidx.compose.animation.core/SpringSpec // androidx.compose.material3/ProgressIndicatorDefaults.ProgressAnimationSpec.|(){}[0] final val circularColor // androidx.compose.material3/ProgressIndicatorDefaults.circularColor|{}circularColor[0] @@ -3473,51 +3076,6 @@ final object androidx.compose.material3/ScaffoldDefaults { // androidx.compose.m final fun (androidx.compose.runtime/Composer?, kotlin/Int): androidx.compose.foundation.layout/WindowInsets // androidx.compose.material3/ScaffoldDefaults.contentWindowInsets.|(androidx.compose.runtime.Composer?;kotlin.Int){}[0] } -final object androidx.compose.material3/SearchBarDefaults { // androidx.compose.material3/SearchBarDefaults|null[0] - final val AppBarContentPadding // androidx.compose.material3/SearchBarDefaults.AppBarContentPadding|{}AppBarContentPadding[0] - final fun (): androidx.compose.foundation.layout/PaddingValues // androidx.compose.material3/SearchBarDefaults.AppBarContentPadding.|(){}[0] - final val Elevation // androidx.compose.material3/SearchBarDefaults.Elevation|{}Elevation[0] - final fun (): androidx.compose.ui.unit/Dp // androidx.compose.material3/SearchBarDefaults.Elevation.|(){}[0] - final val InputFieldHeight // androidx.compose.material3/SearchBarDefaults.InputFieldHeight|{}InputFieldHeight[0] - final fun (): androidx.compose.ui.unit/Dp // androidx.compose.material3/SearchBarDefaults.InputFieldHeight.|(){}[0] - final val ShadowElevation // androidx.compose.material3/SearchBarDefaults.ShadowElevation|{}ShadowElevation[0] - final fun (): androidx.compose.ui.unit/Dp // androidx.compose.material3/SearchBarDefaults.ShadowElevation.|(){}[0] - final val TonalElevation // androidx.compose.material3/SearchBarDefaults.TonalElevation|{}TonalElevation[0] - final fun (): androidx.compose.ui.unit/Dp // androidx.compose.material3/SearchBarDefaults.TonalElevation.|(){}[0] - final val collapsedContainedSearchBarColor // androidx.compose.material3/SearchBarDefaults.collapsedContainedSearchBarColor|{}collapsedContainedSearchBarColor[0] - final fun (androidx.compose.runtime/Composer?, kotlin/Int): androidx.compose.ui.graphics/Color // androidx.compose.material3/SearchBarDefaults.collapsedContainedSearchBarColor.|(androidx.compose.runtime.Composer?;kotlin.Int){}[0] - final val dockedDropdownGapSize // androidx.compose.material3/SearchBarDefaults.dockedDropdownGapSize|{}dockedDropdownGapSize[0] - final fun (): androidx.compose.ui.unit/Dp // androidx.compose.material3/SearchBarDefaults.dockedDropdownGapSize.|(){}[0] - final val dockedDropdownShape // androidx.compose.material3/SearchBarDefaults.dockedDropdownShape|{}dockedDropdownShape[0] - final fun (): androidx.compose.ui.graphics/Shape // androidx.compose.material3/SearchBarDefaults.dockedDropdownShape.|(){}[0] - final val dockedShape // androidx.compose.material3/SearchBarDefaults.dockedShape|{}dockedShape[0] - final fun (androidx.compose.runtime/Composer?, kotlin/Int): androidx.compose.ui.graphics/Shape // androidx.compose.material3/SearchBarDefaults.dockedShape.|(androidx.compose.runtime.Composer?;kotlin.Int){}[0] - final val fullScreenContainedSearchBarColor // androidx.compose.material3/SearchBarDefaults.fullScreenContainedSearchBarColor|{}fullScreenContainedSearchBarColor[0] - final fun (androidx.compose.runtime/Composer?, kotlin/Int): androidx.compose.ui.graphics/Color // androidx.compose.material3/SearchBarDefaults.fullScreenContainedSearchBarColor.|(androidx.compose.runtime.Composer?;kotlin.Int){}[0] - final val fullScreenShape // androidx.compose.material3/SearchBarDefaults.fullScreenShape|{}fullScreenShape[0] - final fun (androidx.compose.runtime/Composer?, kotlin/Int): androidx.compose.ui.graphics/Shape // androidx.compose.material3/SearchBarDefaults.fullScreenShape.|(androidx.compose.runtime.Composer?;kotlin.Int){}[0] - final val fullScreenWindowInsets // androidx.compose.material3/SearchBarDefaults.fullScreenWindowInsets|{}fullScreenWindowInsets[0] - final fun (androidx.compose.runtime/Composer?, kotlin/Int): androidx.compose.foundation.layout/WindowInsets // androidx.compose.material3/SearchBarDefaults.fullScreenWindowInsets.|(androidx.compose.runtime.Composer?;kotlin.Int){}[0] - final val inputFieldShape // androidx.compose.material3/SearchBarDefaults.inputFieldShape|{}inputFieldShape[0] - final fun (androidx.compose.runtime/Composer?, kotlin/Int): androidx.compose.ui.graphics/Shape // androidx.compose.material3/SearchBarDefaults.inputFieldShape.|(androidx.compose.runtime.Composer?;kotlin.Int){}[0] - final val windowInsets // androidx.compose.material3/SearchBarDefaults.windowInsets|{}windowInsets[0] - final fun (androidx.compose.runtime/Composer?, kotlin/Int): androidx.compose.foundation.layout/WindowInsets // androidx.compose.material3/SearchBarDefaults.windowInsets.|(androidx.compose.runtime.Composer?;kotlin.Int){}[0] - - final fun InputField(androidx.compose.foundation.text.input/TextFieldState, androidx.compose.material3/SearchBarState, kotlin/Function1, androidx.compose.ui/Modifier?, kotlin/Boolean, kotlin/Boolean, androidx.compose.ui.text/TextStyle?, kotlin/Function2?, kotlin/Function2?, kotlin/Function2?, kotlin/Function2?, kotlin/Function2?, androidx.compose.foundation.text.input/InputTransformation?, androidx.compose.foundation.text.input/OutputTransformation?, androidx.compose.foundation.text/KeyboardOptions?, androidx.compose.foundation.text.input/TextFieldLineLimits?, androidx.compose.foundation/ScrollState?, androidx.compose.ui.graphics/Shape?, androidx.compose.material3/TextFieldColors?, androidx.compose.foundation.interaction/MutableInteractionSource?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int, kotlin/Int) // androidx.compose.material3/SearchBarDefaults.InputField|InputField(androidx.compose.foundation.text.input.TextFieldState;androidx.compose.material3.SearchBarState;kotlin.Function1;androidx.compose.ui.Modifier?;kotlin.Boolean;kotlin.Boolean;androidx.compose.ui.text.TextStyle?;kotlin.Function2?;kotlin.Function2?;kotlin.Function2?;kotlin.Function2?;kotlin.Function2?;androidx.compose.foundation.text.input.InputTransformation?;androidx.compose.foundation.text.input.OutputTransformation?;androidx.compose.foundation.text.KeyboardOptions?;androidx.compose.foundation.text.input.TextFieldLineLimits?;androidx.compose.foundation.ScrollState?;androidx.compose.ui.graphics.Shape?;androidx.compose.material3.TextFieldColors?;androidx.compose.foundation.interaction.MutableInteractionSource?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int;kotlin.Int;kotlin.Int){}[0] - final fun InputField(androidx.compose.foundation.text.input/TextFieldState, androidx.compose.material3/SearchBarState, kotlin/Function1, androidx.compose.ui/Modifier?, kotlin/Boolean, kotlin/Boolean, androidx.compose.ui.text/TextStyle?, kotlin/Function2?, kotlin/Function2?, kotlin/Function2?, kotlin/Function2?, kotlin/Function2?, androidx.compose.foundation.text.input/InputTransformation?, androidx.compose.foundation.text.input/OutputTransformation?, androidx.compose.foundation/ScrollState?, androidx.compose.ui.graphics/Shape?, androidx.compose.material3/TextFieldColors?, androidx.compose.foundation.interaction/MutableInteractionSource?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int) // androidx.compose.material3/SearchBarDefaults.InputField|InputField(androidx.compose.foundation.text.input.TextFieldState;androidx.compose.material3.SearchBarState;kotlin.Function1;androidx.compose.ui.Modifier?;kotlin.Boolean;kotlin.Boolean;androidx.compose.ui.text.TextStyle?;kotlin.Function2?;kotlin.Function2?;kotlin.Function2?;kotlin.Function2?;kotlin.Function2?;androidx.compose.foundation.text.input.InputTransformation?;androidx.compose.foundation.text.input.OutputTransformation?;androidx.compose.foundation.ScrollState?;androidx.compose.ui.graphics.Shape?;androidx.compose.material3.TextFieldColors?;androidx.compose.foundation.interaction.MutableInteractionSource?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int;kotlin.Int){}[0] - final fun InputField(androidx.compose.foundation.text.input/TextFieldState, kotlin/Function1, kotlin/Boolean, kotlin/Function1, androidx.compose.ui/Modifier?, kotlin/Boolean, kotlin/Boolean, androidx.compose.ui.text/TextStyle?, kotlin/Function2?, kotlin/Function2?, kotlin/Function2?, kotlin/Function2?, kotlin/Function2?, androidx.compose.foundation.text.input/InputTransformation?, androidx.compose.foundation.text.input/OutputTransformation?, androidx.compose.foundation/ScrollState?, androidx.compose.ui.graphics/Shape?, androidx.compose.material3/TextFieldColors?, androidx.compose.foundation.interaction/MutableInteractionSource?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int) // androidx.compose.material3/SearchBarDefaults.InputField|InputField(androidx.compose.foundation.text.input.TextFieldState;kotlin.Function1;kotlin.Boolean;kotlin.Function1;androidx.compose.ui.Modifier?;kotlin.Boolean;kotlin.Boolean;androidx.compose.ui.text.TextStyle?;kotlin.Function2?;kotlin.Function2?;kotlin.Function2?;kotlin.Function2?;kotlin.Function2?;androidx.compose.foundation.text.input.InputTransformation?;androidx.compose.foundation.text.input.OutputTransformation?;androidx.compose.foundation.ScrollState?;androidx.compose.ui.graphics.Shape?;androidx.compose.material3.TextFieldColors?;androidx.compose.foundation.interaction.MutableInteractionSource?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int;kotlin.Int){}[0] - final fun InputField(kotlin/String, kotlin/Function1, kotlin/Function1, kotlin/Boolean, kotlin/Function1, androidx.compose.ui/Modifier?, kotlin/Boolean, kotlin/Function2?, kotlin/Function2?, kotlin/Function2?, androidx.compose.material3/TextFieldColors?, androidx.compose.foundation.interaction/MutableInteractionSource?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int) // androidx.compose.material3/SearchBarDefaults.InputField|InputField(kotlin.String;kotlin.Function1;kotlin.Function1;kotlin.Boolean;kotlin.Function1;androidx.compose.ui.Modifier?;kotlin.Boolean;kotlin.Function2?;kotlin.Function2?;kotlin.Function2?;androidx.compose.material3.TextFieldColors?;androidx.compose.foundation.interaction.MutableInteractionSource?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int;kotlin.Int){}[0] - final fun appBarWithSearchColors(androidx.compose.material3/SearchBarColors?, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int): androidx.compose.material3/AppBarWithSearchColors // androidx.compose.material3/SearchBarDefaults.appBarWithSearchColors|appBarWithSearchColors(androidx.compose.material3.SearchBarColors?;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] - final fun colors(androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.material3/TextFieldColors?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int): androidx.compose.material3/SearchBarColors // androidx.compose.material3/SearchBarDefaults.colors|colors(androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.material3.TextFieldColors?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] - final fun colors(androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int): androidx.compose.material3/SearchBarColors // androidx.compose.material3/SearchBarDefaults.colors|colors(androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] - final fun containedColors(androidx.compose.material3/SearchBarState, androidx.compose.runtime/Composer?, kotlin/Int): androidx.compose.material3/SearchBarColors // androidx.compose.material3/SearchBarDefaults.containedColors|containedColors(androidx.compose.material3.SearchBarState;androidx.compose.runtime.Composer?;kotlin.Int){}[0] - final fun enterAlwaysSearchBarScrollBehavior(kotlin/Float, kotlin/Float, kotlin/Float, kotlin/Function0?, androidx.compose.animation.core/AnimationSpec?, androidx.compose.animation.core/DecayAnimationSpec?, kotlin/Boolean, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int): androidx.compose.material3/SearchBarScrollBehavior // androidx.compose.material3/SearchBarDefaults.enterAlwaysSearchBarScrollBehavior|enterAlwaysSearchBarScrollBehavior(kotlin.Float;kotlin.Float;kotlin.Float;kotlin.Function0?;androidx.compose.animation.core.AnimationSpec?;androidx.compose.animation.core.DecayAnimationSpec?;kotlin.Boolean;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] - final fun enterAlwaysSearchBarScrollBehavior(kotlin/Float, kotlin/Float, kotlin/Function0?, androidx.compose.animation.core/AnimationSpec?, androidx.compose.animation.core/DecayAnimationSpec?, kotlin/Boolean, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int): androidx.compose.material3/SearchBarScrollBehavior // androidx.compose.material3/SearchBarDefaults.enterAlwaysSearchBarScrollBehavior|enterAlwaysSearchBarScrollBehavior(kotlin.Float;kotlin.Float;kotlin.Function0?;androidx.compose.animation.core.AnimationSpec?;androidx.compose.animation.core.DecayAnimationSpec?;kotlin.Boolean;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] - final fun inputFieldColors(androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.foundation.text.selection/TextSelectionColors?, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int): androidx.compose.material3/TextFieldColors // androidx.compose.material3/SearchBarDefaults.inputFieldColors|inputFieldColors(androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.foundation.text.selection.TextSelectionColors?;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int;kotlin.Int){}[0] - final fun inputFieldColors(androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.foundation.text.selection/TextSelectionColors?, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int): androidx.compose.material3/TextFieldColors // androidx.compose.material3/SearchBarDefaults.inputFieldColors|inputFieldColors(androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.foundation.text.selection.TextSelectionColors?;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int;kotlin.Int){}[0] - final fun inputFieldColors(androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.foundation.text.selection/TextSelectionColors?, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int, kotlin/Int): androidx.compose.material3/TextFieldColors // androidx.compose.material3/SearchBarDefaults.inputFieldColors|inputFieldColors(androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.foundation.text.selection.TextSelectionColors?;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int;kotlin.Int;kotlin.Int){}[0] -} - final object androidx.compose.material3/SegmentedButtonDefaults { // androidx.compose.material3/SegmentedButtonDefaults|null[0] final val BorderWidth // androidx.compose.material3/SegmentedButtonDefaults.BorderWidth|{}BorderWidth[0] final fun (): androidx.compose.ui.unit/Dp // androidx.compose.material3/SegmentedButtonDefaults.BorderWidth.|(){}[0] @@ -3588,7 +3146,6 @@ final object androidx.compose.material3/SliderDefaults { // androidx.compose.mat final fun Track(androidx.compose.material3/RangeSliderState, androidx.compose.ui/Modifier?, kotlin/Boolean, androidx.compose.material3/SliderColors?, kotlin/Function2?, kotlin/Function3?, androidx.compose.ui.unit/Dp, androidx.compose.ui.unit/Dp, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/SliderDefaults.Track|Track(androidx.compose.material3.RangeSliderState;androidx.compose.ui.Modifier?;kotlin.Boolean;androidx.compose.material3.SliderColors?;kotlin.Function2?;kotlin.Function3?;androidx.compose.ui.unit.Dp;androidx.compose.ui.unit.Dp;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun Track(androidx.compose.material3/SliderPositions, androidx.compose.ui/Modifier?, androidx.compose.material3/SliderColors?, kotlin/Boolean, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/SliderDefaults.Track|Track(androidx.compose.material3.SliderPositions;androidx.compose.ui.Modifier?;androidx.compose.material3.SliderColors?;kotlin.Boolean;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun Track(androidx.compose.material3/SliderState, androidx.compose.ui.unit/Dp, androidx.compose.ui/Modifier?, kotlin/Boolean, androidx.compose.material3/SliderColors?, kotlin/Function2?, kotlin/Function3?, androidx.compose.ui.unit/Dp, androidx.compose.ui.unit/Dp, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/SliderDefaults.Track|Track(androidx.compose.material3.SliderState;androidx.compose.ui.unit.Dp;androidx.compose.ui.Modifier?;kotlin.Boolean;androidx.compose.material3.SliderColors?;kotlin.Function2?;kotlin.Function3?;androidx.compose.ui.unit.Dp;androidx.compose.ui.unit.Dp;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] - final fun Track(androidx.compose.material3/SliderState, androidx.compose.ui/Modifier?, kotlin/Boolean, androidx.compose.material3/SliderColors?, kotlin/Function2?, kotlin/Function3?, androidx.compose.ui.unit/Dp, androidx.compose.ui.unit/Dp, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/SliderDefaults.Track|Track(androidx.compose.material3.SliderState;androidx.compose.ui.Modifier?;kotlin.Boolean;androidx.compose.material3.SliderColors?;kotlin.Function2?;kotlin.Function3?;androidx.compose.ui.unit.Dp;androidx.compose.ui.unit.Dp;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun colors(androidx.compose.runtime/Composer?, kotlin/Int): androidx.compose.material3/SliderColors // androidx.compose.material3/SliderDefaults.colors|colors(androidx.compose.runtime.Composer?;kotlin.Int){}[0] final fun colors(androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int): androidx.compose.material3/SliderColors // androidx.compose.material3/SliderDefaults.colors|colors(androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int;kotlin.Int){}[0] } @@ -3780,7 +3337,6 @@ final object androidx.compose.material3/TextFieldDefaults { // androidx.compose. final fun (androidx.compose.ui/Modifier).indicatorLine(kotlin/Boolean, kotlin/Boolean, androidx.compose.foundation.interaction/InteractionSource, androidx.compose.material3/TextFieldColors? = ..., androidx.compose.ui.graphics/Shape? = ..., androidx.compose.ui.unit/Dp = ..., androidx.compose.ui.unit/Dp = ...): androidx.compose.ui/Modifier // androidx.compose.material3/TextFieldDefaults.indicatorLine|indicatorLine@androidx.compose.ui.Modifier(kotlin.Boolean;kotlin.Boolean;androidx.compose.foundation.interaction.InteractionSource;androidx.compose.material3.TextFieldColors?;androidx.compose.ui.graphics.Shape?;androidx.compose.ui.unit.Dp;androidx.compose.ui.unit.Dp){}[0] final fun Container(kotlin/Boolean, kotlin/Boolean, androidx.compose.foundation.interaction/InteractionSource, androidx.compose.ui/Modifier?, androidx.compose.material3/TextFieldColors?, androidx.compose.ui.graphics/Shape?, androidx.compose.ui.unit/Dp, androidx.compose.ui.unit/Dp, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/TextFieldDefaults.Container|Container(kotlin.Boolean;kotlin.Boolean;androidx.compose.foundation.interaction.InteractionSource;androidx.compose.ui.Modifier?;androidx.compose.material3.TextFieldColors?;androidx.compose.ui.graphics.Shape?;androidx.compose.ui.unit.Dp;androidx.compose.ui.unit.Dp;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] - final fun ContainerBox(kotlin/Boolean, kotlin/Boolean, androidx.compose.foundation.interaction/InteractionSource, androidx.compose.material3/TextFieldColors, androidx.compose.ui.graphics/Shape?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/TextFieldDefaults.ContainerBox|ContainerBox(kotlin.Boolean;kotlin.Boolean;androidx.compose.foundation.interaction.InteractionSource;androidx.compose.material3.TextFieldColors;androidx.compose.ui.graphics.Shape?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun DecorationBox(kotlin/String, kotlin/Function2, kotlin/Boolean, kotlin/Boolean, androidx.compose.ui.text.input/VisualTransformation, androidx.compose.foundation.interaction/InteractionSource, kotlin/Boolean, kotlin/Function2?, kotlin/Function2?, kotlin/Function2?, kotlin/Function2?, kotlin/Function2?, kotlin/Function2?, kotlin/Function2?, androidx.compose.ui.graphics/Shape?, androidx.compose.material3/TextFieldColors?, androidx.compose.foundation.layout/PaddingValues?, kotlin/Function2?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int) // androidx.compose.material3/TextFieldDefaults.DecorationBox|DecorationBox(kotlin.String;kotlin.Function2;kotlin.Boolean;kotlin.Boolean;androidx.compose.ui.text.input.VisualTransformation;androidx.compose.foundation.interaction.InteractionSource;kotlin.Boolean;kotlin.Function2?;kotlin.Function2?;kotlin.Function2?;kotlin.Function2?;kotlin.Function2?;kotlin.Function2?;kotlin.Function2?;androidx.compose.ui.graphics.Shape?;androidx.compose.material3.TextFieldColors?;androidx.compose.foundation.layout.PaddingValues?;kotlin.Function2?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int;kotlin.Int){}[0] final fun colors(androidx.compose.runtime/Composer?, kotlin/Int): androidx.compose.material3/TextFieldColors // androidx.compose.material3/TextFieldDefaults.colors|colors(androidx.compose.runtime.Composer?;kotlin.Int){}[0] final fun colors(androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.foundation.text.selection/TextSelectionColors?, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int, kotlin/Int, kotlin/Int, kotlin/Int, kotlin/Int): androidx.compose.material3/TextFieldColors // androidx.compose.material3/TextFieldDefaults.colors|colors(androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.foundation.text.selection.TextSelectionColors?;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int;kotlin.Int;kotlin.Int;kotlin.Int;kotlin.Int;kotlin.Int){}[0] @@ -3792,12 +3348,6 @@ final object androidx.compose.material3/TextFieldDefaults { // androidx.compose. final fun textFieldWithoutLabelPadding(androidx.compose.ui.unit/Dp = ..., androidx.compose.ui.unit/Dp = ..., androidx.compose.ui.unit/Dp = ..., androidx.compose.ui.unit/Dp = ...): androidx.compose.foundation.layout/PaddingValues // androidx.compose.material3/TextFieldDefaults.textFieldWithoutLabelPadding|textFieldWithoutLabelPadding(androidx.compose.ui.unit.Dp;androidx.compose.ui.unit.Dp;androidx.compose.ui.unit.Dp;androidx.compose.ui.unit.Dp){}[0] } -final object androidx.compose.material3/TimePickerDefaults { // androidx.compose.material3/TimePickerDefaults|null[0] - final fun colors(androidx.compose.runtime/Composer?, kotlin/Int): androidx.compose.material3/TimePickerColors // androidx.compose.material3/TimePickerDefaults.colors|colors(androidx.compose.runtime.Composer?;kotlin.Int){}[0] - final fun colors(androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int): androidx.compose.material3/TimePickerColors // androidx.compose.material3/TimePickerDefaults.colors|colors(androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int;kotlin.Int){}[0] - final fun layoutType(androidx.compose.runtime/Composer?, kotlin/Int): androidx.compose.material3/TimePickerLayoutType // androidx.compose.material3/TimePickerDefaults.layoutType|layoutType(androidx.compose.runtime.Composer?;kotlin.Int){}[0] -} - final object androidx.compose.material3/TimePickerDialogDefaults { // androidx.compose.material3/TimePickerDialogDefaults|null[0] final val MinHeightForTimePicker // androidx.compose.material3/TimePickerDialogDefaults.MinHeightForTimePicker|{}MinHeightForTimePicker[0] final fun (): androidx.compose.ui.unit/Dp // androidx.compose.material3/TimePickerDialogDefaults.MinHeightForTimePicker.|(){}[0] @@ -3937,18 +3487,10 @@ final object androidx.compose.material3/TopAppBarDefaults { // androidx.compose. final fun centerAlignedTopAppBarColors(androidx.compose.runtime/Composer?, kotlin/Int): androidx.compose.material3/TopAppBarColors // androidx.compose.material3/TopAppBarDefaults.centerAlignedTopAppBarColors|centerAlignedTopAppBarColors(androidx.compose.runtime.Composer?;kotlin.Int){}[0] final fun centerAlignedTopAppBarColors(androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int): androidx.compose.material3/TopAppBarColors // androidx.compose.material3/TopAppBarDefaults.centerAlignedTopAppBarColors|centerAlignedTopAppBarColors(androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] - final fun enterAlwaysScrollBehavior(androidx.compose.foundation.lazy/LazyListState, androidx.compose.material3/TopAppBarState?, kotlin/Function0?, androidx.compose.animation.core/AnimationSpec?, androidx.compose.animation.core/DecayAnimationSpec?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int): androidx.compose.material3/TopAppBarScrollBehavior // androidx.compose.material3/TopAppBarDefaults.enterAlwaysScrollBehavior|enterAlwaysScrollBehavior(androidx.compose.foundation.lazy.LazyListState;androidx.compose.material3.TopAppBarState?;kotlin.Function0?;androidx.compose.animation.core.AnimationSpec?;androidx.compose.animation.core.DecayAnimationSpec?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] - final fun enterAlwaysScrollBehavior(androidx.compose.foundation/ScrollState, kotlin/Boolean, androidx.compose.material3/TopAppBarState?, kotlin/Function0?, androidx.compose.animation.core/AnimationSpec?, androidx.compose.animation.core/DecayAnimationSpec?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int): androidx.compose.material3/TopAppBarScrollBehavior // androidx.compose.material3/TopAppBarDefaults.enterAlwaysScrollBehavior|enterAlwaysScrollBehavior(androidx.compose.foundation.ScrollState;kotlin.Boolean;androidx.compose.material3.TopAppBarState?;kotlin.Function0?;androidx.compose.animation.core.AnimationSpec?;androidx.compose.animation.core.DecayAnimationSpec?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] - final fun enterAlwaysScrollBehavior(androidx.compose.material3/TopAppBarState?, kotlin/Function0?, androidx.compose.animation.core/AnimationSpec?, androidx.compose.animation.core/DecayAnimationSpec?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int): androidx.compose.material3/TopAppBarScrollBehavior // androidx.compose.material3/TopAppBarDefaults.enterAlwaysScrollBehavior|enterAlwaysScrollBehavior(androidx.compose.material3.TopAppBarState?;kotlin.Function0?;androidx.compose.animation.core.AnimationSpec?;androidx.compose.animation.core.DecayAnimationSpec?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] - final fun enterAlwaysScrollBehavior(androidx.compose.material3/TopAppBarState?, kotlin/Function0?, androidx.compose.animation.core/AnimationSpec?, androidx.compose.animation.core/DecayAnimationSpec?, kotlin/Boolean, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int): androidx.compose.material3/TopAppBarScrollBehavior // androidx.compose.material3/TopAppBarDefaults.enterAlwaysScrollBehavior|enterAlwaysScrollBehavior(androidx.compose.material3.TopAppBarState?;kotlin.Function0?;androidx.compose.animation.core.AnimationSpec?;androidx.compose.animation.core.DecayAnimationSpec?;kotlin.Boolean;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] - final fun exitUntilCollapsedScrollBehavior(androidx.compose.material3/TopAppBarState?, kotlin/Function0?, androidx.compose.animation.core/AnimationSpec?, androidx.compose.animation.core/DecayAnimationSpec?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int): androidx.compose.material3/TopAppBarScrollBehavior // androidx.compose.material3/TopAppBarDefaults.exitUntilCollapsedScrollBehavior|exitUntilCollapsedScrollBehavior(androidx.compose.material3.TopAppBarState?;kotlin.Function0?;androidx.compose.animation.core.AnimationSpec?;androidx.compose.animation.core.DecayAnimationSpec?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun largeTopAppBarColors(androidx.compose.runtime/Composer?, kotlin/Int): androidx.compose.material3/TopAppBarColors // androidx.compose.material3/TopAppBarDefaults.largeTopAppBarColors|largeTopAppBarColors(androidx.compose.runtime.Composer?;kotlin.Int){}[0] final fun largeTopAppBarColors(androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int): androidx.compose.material3/TopAppBarColors // androidx.compose.material3/TopAppBarDefaults.largeTopAppBarColors|largeTopAppBarColors(androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun mediumTopAppBarColors(androidx.compose.runtime/Composer?, kotlin/Int): androidx.compose.material3/TopAppBarColors // androidx.compose.material3/TopAppBarDefaults.mediumTopAppBarColors|mediumTopAppBarColors(androidx.compose.runtime.Composer?;kotlin.Int){}[0] final fun mediumTopAppBarColors(androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int): androidx.compose.material3/TopAppBarColors // androidx.compose.material3/TopAppBarDefaults.mediumTopAppBarColors|mediumTopAppBarColors(androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] - final fun pinnedScrollBehavior(androidx.compose.foundation.lazy/LazyListState, androidx.compose.material3/TopAppBarState?, kotlin/Function0?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int): androidx.compose.material3/TopAppBarScrollBehavior // androidx.compose.material3/TopAppBarDefaults.pinnedScrollBehavior|pinnedScrollBehavior(androidx.compose.foundation.lazy.LazyListState;androidx.compose.material3.TopAppBarState?;kotlin.Function0?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] - final fun pinnedScrollBehavior(androidx.compose.foundation/ScrollState, kotlin/Boolean, androidx.compose.material3/TopAppBarState?, kotlin/Function0?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int): androidx.compose.material3/TopAppBarScrollBehavior // androidx.compose.material3/TopAppBarDefaults.pinnedScrollBehavior|pinnedScrollBehavior(androidx.compose.foundation.ScrollState;kotlin.Boolean;androidx.compose.material3.TopAppBarState?;kotlin.Function0?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] - final fun pinnedScrollBehavior(androidx.compose.material3/TopAppBarState?, kotlin/Function0?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int): androidx.compose.material3/TopAppBarScrollBehavior // androidx.compose.material3/TopAppBarDefaults.pinnedScrollBehavior|pinnedScrollBehavior(androidx.compose.material3.TopAppBarState?;kotlin.Function0?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun topAppBarColors(androidx.compose.runtime/Composer?, kotlin/Int): androidx.compose.material3/TopAppBarColors // androidx.compose.material3/TopAppBarDefaults.topAppBarColors|topAppBarColors(androidx.compose.runtime.Composer?;kotlin.Int){}[0] final fun topAppBarColors(androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int): androidx.compose.material3/TopAppBarColors // androidx.compose.material3/TopAppBarDefaults.topAppBarColors|topAppBarColors(androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun topAppBarColors(androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int): androidx.compose.material3/TopAppBarColors // androidx.compose.material3/TopAppBarDefaults.topAppBarColors|topAppBarColors(androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] @@ -4049,8 +3591,6 @@ final val androidx.compose.material3/LocalHorizontalFloatingToolbarOverride // a final fun (): androidx.compose.runtime/ProvidableCompositionLocal // androidx.compose.material3/LocalHorizontalFloatingToolbarOverride.|(){}[0] final val androidx.compose.material3/LocalHorizontalFloatingToolbarWithFabOverride // androidx.compose.material3/LocalHorizontalFloatingToolbarWithFabOverride|{}LocalHorizontalFloatingToolbarWithFabOverride[0] final fun (): androidx.compose.runtime/ProvidableCompositionLocal // androidx.compose.material3/LocalHorizontalFloatingToolbarWithFabOverride.|(){}[0] -final val androidx.compose.material3/LocalMinimumInteractiveComponentEnforcement // androidx.compose.material3/LocalMinimumInteractiveComponentEnforcement|{}LocalMinimumInteractiveComponentEnforcement[0] - final fun (): androidx.compose.runtime/ProvidableCompositionLocal // androidx.compose.material3/LocalMinimumInteractiveComponentEnforcement.|(){}[0] final val androidx.compose.material3/LocalMinimumInteractiveComponentSize // androidx.compose.material3/LocalMinimumInteractiveComponentSize|{}LocalMinimumInteractiveComponentSize[0] final fun (): androidx.compose.runtime/ProvidableCompositionLocal // androidx.compose.material3/LocalMinimumInteractiveComponentSize.|(){}[0] final val androidx.compose.material3/LocalModalWideNavigationRailOverride // androidx.compose.material3/LocalModalWideNavigationRailOverride|{}LocalModalWideNavigationRailOverride[0] @@ -4260,11 +3800,8 @@ final fun (androidx.compose.ui/Modifier).androidx.compose.material3/minimumInter final fun (androidx.graphics.shapes/Morph).androidx.compose.material3/toPath(kotlin/Float, androidx.compose.ui.graphics/Path = ..., kotlin/Int = ...): androidx.compose.ui.graphics/Path // androidx.compose.material3/toPath|toPath@androidx.graphics.shapes.Morph(kotlin.Float;androidx.compose.ui.graphics.Path;kotlin.Int){}[0] final fun (androidx.graphics.shapes/RoundedPolygon).androidx.compose.material3/toPath(kotlin/Int, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int): androidx.compose.ui.graphics/Path // androidx.compose.material3/toPath|toPath@androidx.graphics.shapes.RoundedPolygon(kotlin.Int;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun (androidx.graphics.shapes/RoundedPolygon).androidx.compose.material3/toShape(kotlin/Int, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int): androidx.compose.ui.graphics/Shape // androidx.compose.material3/toShape|toShape@androidx.graphics.shapes.RoundedPolygon(kotlin.Int;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] -final fun androidx.compose.material3.carousel/HorizontalCenteredHeroCarousel(androidx.compose.material3.carousel/CarouselState, androidx.compose.ui/Modifier?, androidx.compose.ui.unit/Dp, androidx.compose.ui.unit/Dp, androidx.compose.foundation.gestures/TargetedFlingBehavior?, kotlin/Boolean, androidx.compose.ui.unit/Dp, androidx.compose.ui.unit/Dp, androidx.compose.foundation.layout/PaddingValues?, kotlin/Function4, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3.carousel/HorizontalCenteredHeroCarousel|HorizontalCenteredHeroCarousel(androidx.compose.material3.carousel.CarouselState;androidx.compose.ui.Modifier?;androidx.compose.ui.unit.Dp;androidx.compose.ui.unit.Dp;androidx.compose.foundation.gestures.TargetedFlingBehavior?;kotlin.Boolean;androidx.compose.ui.unit.Dp;androidx.compose.ui.unit.Dp;androidx.compose.foundation.layout.PaddingValues?;kotlin.Function4;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3.carousel/HorizontalMultiBrowseCarousel(androidx.compose.material3.carousel/CarouselState, androidx.compose.ui.unit/Dp, androidx.compose.ui/Modifier?, androidx.compose.ui.unit/Dp, androidx.compose.foundation.gestures/TargetedFlingBehavior?, kotlin/Boolean, androidx.compose.ui.unit/Dp, androidx.compose.ui.unit/Dp, androidx.compose.foundation.layout/PaddingValues?, kotlin/Function4, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3.carousel/HorizontalMultiBrowseCarousel|HorizontalMultiBrowseCarousel(androidx.compose.material3.carousel.CarouselState;androidx.compose.ui.unit.Dp;androidx.compose.ui.Modifier?;androidx.compose.ui.unit.Dp;androidx.compose.foundation.gestures.TargetedFlingBehavior?;kotlin.Boolean;androidx.compose.ui.unit.Dp;androidx.compose.ui.unit.Dp;androidx.compose.foundation.layout.PaddingValues?;kotlin.Function4;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3.carousel/HorizontalUncontainedCarousel(androidx.compose.material3.carousel/CarouselState, androidx.compose.ui.unit/Dp, androidx.compose.ui/Modifier?, androidx.compose.ui.unit/Dp, androidx.compose.foundation.gestures/TargetedFlingBehavior?, kotlin/Boolean, androidx.compose.foundation.layout/PaddingValues?, kotlin/Function4, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3.carousel/HorizontalUncontainedCarousel|HorizontalUncontainedCarousel(androidx.compose.material3.carousel.CarouselState;androidx.compose.ui.unit.Dp;androidx.compose.ui.Modifier?;androidx.compose.ui.unit.Dp;androidx.compose.foundation.gestures.TargetedFlingBehavior?;kotlin.Boolean;androidx.compose.foundation.layout.PaddingValues?;kotlin.Function4;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] -final fun androidx.compose.material3.carousel/MultiAspectCarouselItemDrawInfo(kotlin/Int, androidx.compose.foundation.lazy.grid/LazyGridState): androidx.compose.material3.carousel/MultiAspectCarouselItemDrawInfo // androidx.compose.material3.carousel/MultiAspectCarouselItemDrawInfo|MultiAspectCarouselItemDrawInfo(kotlin.Int;androidx.compose.foundation.lazy.grid.LazyGridState){}[0] -final fun androidx.compose.material3.carousel/MultiAspectCarouselItemDrawInfo(kotlin/Int, androidx.compose.foundation.lazy/LazyListState): androidx.compose.material3.carousel/MultiAspectCarouselItemDrawInfo // androidx.compose.material3.carousel/MultiAspectCarouselItemDrawInfo|MultiAspectCarouselItemDrawInfo(kotlin.Int;androidx.compose.foundation.lazy.LazyListState){}[0] final fun androidx.compose.material3.carousel/MultiAspectCarouselScope(kotlin/Function3, androidx.compose.runtime/Composer?, kotlin/Int) // androidx.compose.material3.carousel/MultiAspectCarouselScope|MultiAspectCarouselScope(kotlin.Function3;androidx.compose.runtime.Composer?;kotlin.Int){}[0] final fun androidx.compose.material3.carousel/androidx_compose_material3_carousel_CarouselDefaults$stableprop_getter(): kotlin/Int // androidx.compose.material3.carousel/androidx_compose_material3_carousel_CarouselDefaults$stableprop_getter|androidx_compose_material3_carousel_CarouselDefaults$stableprop_getter(){}[0] final fun androidx.compose.material3.carousel/androidx_compose_material3_carousel_CarouselState$stableprop_getter(): kotlin/Int // androidx.compose.material3.carousel/androidx_compose_material3_carousel_CarouselState$stableprop_getter|androidx_compose_material3_carousel_CarouselState$stableprop_getter(){}[0] @@ -4280,26 +3817,19 @@ final fun androidx.compose.material3.pulltorefresh/PullToRefreshBox(kotlin/Boole final fun androidx.compose.material3.pulltorefresh/PullToRefreshState(): androidx.compose.material3.pulltorefresh/PullToRefreshState // androidx.compose.material3.pulltorefresh/PullToRefreshState|PullToRefreshState(){}[0] final fun androidx.compose.material3.pulltorefresh/androidx_compose_material3_pulltorefresh_PullToRefreshDefaults$stableprop_getter(): kotlin/Int // androidx.compose.material3.pulltorefresh/androidx_compose_material3_pulltorefresh_PullToRefreshDefaults$stableprop_getter|androidx_compose_material3_pulltorefresh_PullToRefreshDefaults$stableprop_getter(){}[0] final fun androidx.compose.material3.pulltorefresh/rememberPullToRefreshState(androidx.compose.runtime/Composer?, kotlin/Int): androidx.compose.material3.pulltorefresh/PullToRefreshState // androidx.compose.material3.pulltorefresh/rememberPullToRefreshState|rememberPullToRefreshState(androidx.compose.runtime.Composer?;kotlin.Int){}[0] -final fun androidx.compose.material3/AlertDialog(kotlin/Function0, androidx.compose.ui/Modifier?, androidx.compose.ui.window/DialogProperties?, kotlin/Function2, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/AlertDialog|AlertDialog(kotlin.Function0;androidx.compose.ui.Modifier?;androidx.compose.ui.window.DialogProperties?;kotlin.Function2;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/AlertDialog(kotlin/Function0, kotlin/Function2, androidx.compose.ui/Modifier?, kotlin/Function2?, kotlin/Function2?, kotlin/Function2?, kotlin/Function2?, androidx.compose.ui.graphics/Shape?, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.unit/Dp, androidx.compose.ui.window/DialogProperties?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int) // androidx.compose.material3/AlertDialog|AlertDialog(kotlin.Function0;kotlin.Function2;androidx.compose.ui.Modifier?;kotlin.Function2?;kotlin.Function2?;kotlin.Function2?;kotlin.Function2?;androidx.compose.ui.graphics.Shape?;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.unit.Dp;androidx.compose.ui.window.DialogProperties?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/AppBarColumn(androidx.compose.ui/Modifier?, kotlin/Function3?, kotlin/Int, kotlin/Function1, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/AppBarColumn|AppBarColumn(androidx.compose.ui.Modifier?;kotlin.Function3?;kotlin.Int;kotlin.Function1;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/AppBarColumn(kotlin/Function3, androidx.compose.ui/Modifier?, kotlin/Int, kotlin/Function1, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/AppBarColumn|AppBarColumn(kotlin.Function3;androidx.compose.ui.Modifier?;kotlin.Int;kotlin.Function1;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/AppBarOverflowIndicator(androidx.compose.material3/AppBarMenuState, androidx.compose.ui/Modifier?, kotlin/Boolean, androidx.compose.ui.graphics/Shape?, androidx.compose.material3/IconButtonColors?, androidx.compose.foundation.interaction/MutableInteractionSource?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/AppBarOverflowIndicator|AppBarOverflowIndicator(androidx.compose.material3.AppBarMenuState;androidx.compose.ui.Modifier?;kotlin.Boolean;androidx.compose.ui.graphics.Shape?;androidx.compose.material3.IconButtonColors?;androidx.compose.foundation.interaction.MutableInteractionSource?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/AppBarRow(androidx.compose.ui/Modifier?, kotlin/Function3?, kotlin/Int, kotlin/Function1, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/AppBarRow|AppBarRow(androidx.compose.ui.Modifier?;kotlin.Function3?;kotlin.Int;kotlin.Function1;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/AppBarRow(kotlin/Function3, androidx.compose.ui/Modifier?, kotlin/Int, kotlin/Function1, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/AppBarRow|AppBarRow(kotlin.Function3;androidx.compose.ui.Modifier?;kotlin.Int;kotlin.Function1;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] -final fun androidx.compose.material3/AppBarWithSearch(androidx.compose.material3/SearchBarState, kotlin/Function2, androidx.compose.ui/Modifier?, kotlin/Function2?, kotlin/Function3?, androidx.compose.ui.graphics/Shape?, androidx.compose.material3/AppBarWithSearchColors?, androidx.compose.ui.unit/Dp, androidx.compose.ui.unit/Dp, androidx.compose.foundation.layout/PaddingValues?, androidx.compose.foundation.layout/WindowInsets?, androidx.compose.material3/SearchBarScrollBehavior?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int) // androidx.compose.material3/AppBarWithSearch|AppBarWithSearch(androidx.compose.material3.SearchBarState;kotlin.Function2;androidx.compose.ui.Modifier?;kotlin.Function2?;kotlin.Function3?;androidx.compose.ui.graphics.Shape?;androidx.compose.material3.AppBarWithSearchColors?;androidx.compose.ui.unit.Dp;androidx.compose.ui.unit.Dp;androidx.compose.foundation.layout.PaddingValues?;androidx.compose.foundation.layout.WindowInsets?;androidx.compose.material3.SearchBarScrollBehavior?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/AssistChip(kotlin/Function0, kotlin/Function2, androidx.compose.ui/Modifier?, kotlin/Boolean, kotlin/Function2?, kotlin/Function2?, androidx.compose.ui.graphics/Shape?, androidx.compose.material3/ChipColors?, androidx.compose.material3/ChipElevation?, androidx.compose.foundation/BorderStroke?, androidx.compose.foundation.interaction/MutableInteractionSource?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int) // androidx.compose.material3/AssistChip|AssistChip(kotlin.Function0;kotlin.Function2;androidx.compose.ui.Modifier?;kotlin.Boolean;kotlin.Function2?;kotlin.Function2?;androidx.compose.ui.graphics.Shape?;androidx.compose.material3.ChipColors?;androidx.compose.material3.ChipElevation?;androidx.compose.foundation.BorderStroke?;androidx.compose.foundation.interaction.MutableInteractionSource?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/AssistChip(kotlin/Function0, kotlin/Function2, androidx.compose.ui/Modifier?, kotlin/Boolean, kotlin/Function2?, kotlin/Function2?, androidx.compose.ui.graphics/Shape?, androidx.compose.material3/ChipColors?, androidx.compose.material3/ChipElevation?, androidx.compose.foundation/BorderStroke?, androidx.compose.ui.unit/Dp, androidx.compose.foundation.layout/PaddingValues?, androidx.compose.foundation.interaction/MutableInteractionSource?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int) // androidx.compose.material3/AssistChip|AssistChip(kotlin.Function0;kotlin.Function2;androidx.compose.ui.Modifier?;kotlin.Boolean;kotlin.Function2?;kotlin.Function2?;androidx.compose.ui.graphics.Shape?;androidx.compose.material3.ChipColors?;androidx.compose.material3.ChipElevation?;androidx.compose.foundation.BorderStroke?;androidx.compose.ui.unit.Dp;androidx.compose.foundation.layout.PaddingValues?;androidx.compose.foundation.interaction.MutableInteractionSource?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/AssistChip(kotlin/Function0, kotlin/Function2, androidx.compose.ui/Modifier?, kotlin/Boolean, kotlin/Function2?, kotlin/Function2?, androidx.compose.ui.graphics/Shape?, androidx.compose.material3/ChipColors?, androidx.compose.material3/ChipElevation?, androidx.compose.material3/ChipBorder?, androidx.compose.foundation.interaction/MutableInteractionSource?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int) // androidx.compose.material3/AssistChip|AssistChip(kotlin.Function0;kotlin.Function2;androidx.compose.ui.Modifier?;kotlin.Boolean;kotlin.Function2?;kotlin.Function2?;androidx.compose.ui.graphics.Shape?;androidx.compose.material3.ChipColors?;androidx.compose.material3.ChipElevation?;androidx.compose.material3.ChipBorder?;androidx.compose.foundation.interaction.MutableInteractionSource?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/Badge(androidx.compose.ui/Modifier?, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, kotlin/Function3?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/Badge|Badge(androidx.compose.ui.Modifier?;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;kotlin.Function3?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/BadgedBox(kotlin/Function3, androidx.compose.ui/Modifier?, kotlin/Function3, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/BadgedBox|BadgedBox(kotlin.Function3;androidx.compose.ui.Modifier?;kotlin.Function3;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] -final fun androidx.compose.material3/BasicAlertDialog(kotlin/Function0, androidx.compose.ui/Modifier?, androidx.compose.ui.window/DialogProperties?, kotlin/Function2, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/BasicAlertDialog|BasicAlertDialog(kotlin.Function0;androidx.compose.ui.Modifier?;androidx.compose.ui.window.DialogProperties?;kotlin.Function2;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] -final fun androidx.compose.material3/BottomAppBar(androidx.compose.ui/Modifier?, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.unit/Dp, androidx.compose.foundation.layout/PaddingValues?, androidx.compose.foundation.layout/WindowInsets?, androidx.compose.material3/BottomAppBarScrollBehavior?, kotlin/Function3, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/BottomAppBar|BottomAppBar(androidx.compose.ui.Modifier?;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.unit.Dp;androidx.compose.foundation.layout.PaddingValues?;androidx.compose.foundation.layout.WindowInsets?;androidx.compose.material3.BottomAppBarScrollBehavior?;kotlin.Function3;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/BottomAppBar(androidx.compose.ui/Modifier?, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.unit/Dp, androidx.compose.foundation.layout/PaddingValues?, androidx.compose.foundation.layout/WindowInsets?, kotlin/Function3, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/BottomAppBar|BottomAppBar(androidx.compose.ui.Modifier?;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.unit.Dp;androidx.compose.foundation.layout.PaddingValues?;androidx.compose.foundation.layout.WindowInsets?;kotlin.Function3;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] -final fun androidx.compose.material3/BottomAppBar(kotlin/Function3, androidx.compose.ui/Modifier?, kotlin/Function2?, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.unit/Dp, androidx.compose.foundation.layout/PaddingValues?, androidx.compose.foundation.layout/WindowInsets?, androidx.compose.material3/BottomAppBarScrollBehavior?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/BottomAppBar|BottomAppBar(kotlin.Function3;androidx.compose.ui.Modifier?;kotlin.Function2?;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.unit.Dp;androidx.compose.foundation.layout.PaddingValues?;androidx.compose.foundation.layout.WindowInsets?;androidx.compose.material3.BottomAppBarScrollBehavior?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/BottomAppBar(kotlin/Function3, androidx.compose.ui/Modifier?, kotlin/Function2?, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.unit/Dp, androidx.compose.foundation.layout/PaddingValues?, androidx.compose.foundation.layout/WindowInsets?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/BottomAppBar|BottomAppBar(kotlin.Function3;androidx.compose.ui.Modifier?;kotlin.Function2?;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.unit.Dp;androidx.compose.foundation.layout.PaddingValues?;androidx.compose.foundation.layout.WindowInsets?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] -final fun androidx.compose.material3/BottomAppBarState(kotlin/Float, kotlin/Float, kotlin/Float): androidx.compose.material3/BottomAppBarState // androidx.compose.material3/BottomAppBarState|BottomAppBarState(kotlin.Float;kotlin.Float;kotlin.Float){}[0] -final fun androidx.compose.material3/BottomSheetScaffold(kotlin/Function3, androidx.compose.ui/Modifier?, androidx.compose.material3/BottomSheetScaffoldState?, androidx.compose.ui.unit/Dp, androidx.compose.ui.unit/Dp, androidx.compose.ui.graphics/Shape?, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.unit/Dp, androidx.compose.ui.unit/Dp, kotlin/Function2?, kotlin/Boolean, kotlin/Function2?, kotlin/Function3?, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, kotlin/Function3, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int) // androidx.compose.material3/BottomSheetScaffold|BottomSheetScaffold(kotlin.Function3;androidx.compose.ui.Modifier?;androidx.compose.material3.BottomSheetScaffoldState?;androidx.compose.ui.unit.Dp;androidx.compose.ui.unit.Dp;androidx.compose.ui.graphics.Shape?;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.unit.Dp;androidx.compose.ui.unit.Dp;kotlin.Function2?;kotlin.Boolean;kotlin.Function2?;kotlin.Function3?;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;kotlin.Function3;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/Button(kotlin/Function0, androidx.compose.material3/ButtonShapes, androidx.compose.ui/Modifier?, kotlin/Boolean, androidx.compose.material3/ButtonColors?, androidx.compose.material3/ButtonElevation?, androidx.compose.foundation/BorderStroke?, androidx.compose.foundation.layout/PaddingValues?, androidx.compose.foundation.interaction/MutableInteractionSource?, kotlin/Function3, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/Button|Button(kotlin.Function0;androidx.compose.material3.ButtonShapes;androidx.compose.ui.Modifier?;kotlin.Boolean;androidx.compose.material3.ButtonColors?;androidx.compose.material3.ButtonElevation?;androidx.compose.foundation.BorderStroke?;androidx.compose.foundation.layout.PaddingValues?;androidx.compose.foundation.interaction.MutableInteractionSource?;kotlin.Function3;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/Button(kotlin/Function0, androidx.compose.ui/Modifier?, kotlin/Boolean, androidx.compose.ui.graphics/Shape?, androidx.compose.material3/ButtonColors?, androidx.compose.material3/ButtonElevation?, androidx.compose.foundation/BorderStroke?, androidx.compose.foundation.layout/PaddingValues?, androidx.compose.foundation.interaction/MutableInteractionSource?, kotlin/Function3, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/Button|Button(kotlin.Function0;androidx.compose.ui.Modifier?;kotlin.Boolean;androidx.compose.ui.graphics.Shape?;androidx.compose.material3.ButtonColors?;androidx.compose.material3.ButtonElevation?;androidx.compose.foundation.BorderStroke?;androidx.compose.foundation.layout.PaddingValues?;androidx.compose.foundation.interaction.MutableInteractionSource?;kotlin.Function3;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/ButtonGroup(androidx.compose.ui/Modifier?, kotlin/Float, androidx.compose.foundation.layout/Arrangement.Horizontal?, kotlin/Function3, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/ButtonGroup|ButtonGroup(androidx.compose.ui.Modifier?;kotlin.Float;androidx.compose.foundation.layout.Arrangement.Horizontal?;kotlin.Function3;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] @@ -4336,8 +3866,6 @@ final fun androidx.compose.material3/DismissibleDrawerSheet(androidx.compose.mat final fun androidx.compose.material3/DismissibleDrawerSheet(androidx.compose.ui/Modifier?, androidx.compose.ui.graphics/Shape?, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.unit/Dp, androidx.compose.foundation.layout/WindowInsets?, kotlin/Function3, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/DismissibleDrawerSheet|DismissibleDrawerSheet(androidx.compose.ui.Modifier?;androidx.compose.ui.graphics.Shape?;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.unit.Dp;androidx.compose.foundation.layout.WindowInsets?;kotlin.Function3;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/DismissibleNavigationDrawer(kotlin/Function2, androidx.compose.ui/Modifier?, androidx.compose.material3/DrawerState?, kotlin/Boolean, kotlin/Function2, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/DismissibleNavigationDrawer|DismissibleNavigationDrawer(kotlin.Function2;androidx.compose.ui.Modifier?;androidx.compose.material3.DrawerState?;kotlin.Boolean;kotlin.Function2;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/Divider(androidx.compose.ui/Modifier?, androidx.compose.ui.unit/Dp, androidx.compose.ui.graphics/Color, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/Divider|Divider(androidx.compose.ui.Modifier?;androidx.compose.ui.unit.Dp;androidx.compose.ui.graphics.Color;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] -final fun androidx.compose.material3/DockedSearchBar(kotlin/Function2, kotlin/Boolean, kotlin/Function1, androidx.compose.ui/Modifier?, androidx.compose.ui.graphics/Shape?, androidx.compose.material3/SearchBarColors?, androidx.compose.ui.unit/Dp, androidx.compose.ui.unit/Dp, kotlin/Function3, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/DockedSearchBar|DockedSearchBar(kotlin.Function2;kotlin.Boolean;kotlin.Function1;androidx.compose.ui.Modifier?;androidx.compose.ui.graphics.Shape?;androidx.compose.material3.SearchBarColors?;androidx.compose.ui.unit.Dp;androidx.compose.ui.unit.Dp;kotlin.Function3;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] -final fun androidx.compose.material3/DockedSearchBar(kotlin/String, kotlin/Function1, kotlin/Function1, kotlin/Boolean, kotlin/Function1, androidx.compose.ui/Modifier?, kotlin/Boolean, kotlin/Function2?, kotlin/Function2?, kotlin/Function2?, androidx.compose.ui.graphics/Shape?, androidx.compose.material3/SearchBarColors?, androidx.compose.ui.unit/Dp, androidx.compose.ui.unit/Dp, androidx.compose.foundation.interaction/MutableInteractionSource?, kotlin/Function3, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int) // androidx.compose.material3/DockedSearchBar|DockedSearchBar(kotlin.String;kotlin.Function1;kotlin.Function1;kotlin.Boolean;kotlin.Function1;androidx.compose.ui.Modifier?;kotlin.Boolean;kotlin.Function2?;kotlin.Function2?;kotlin.Function2?;androidx.compose.ui.graphics.Shape?;androidx.compose.material3.SearchBarColors?;androidx.compose.ui.unit.Dp;androidx.compose.ui.unit.Dp;androidx.compose.foundation.interaction.MutableInteractionSource?;kotlin.Function3;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/DropdownMenu(kotlin/Boolean, kotlin/Function0, androidx.compose.ui/Modifier?, androidx.compose.ui.unit/DpOffset, androidx.compose.foundation/ScrollState?, androidx.compose.ui.window/PopupProperties?, androidx.compose.ui.graphics/Shape?, androidx.compose.ui.graphics/Color, androidx.compose.ui.unit/Dp, androidx.compose.ui.unit/Dp, androidx.compose.foundation/BorderStroke?, kotlin/Function3, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int) // androidx.compose.material3/DropdownMenu|DropdownMenu(kotlin.Boolean;kotlin.Function0;androidx.compose.ui.Modifier?;androidx.compose.ui.unit.DpOffset;androidx.compose.foundation.ScrollState?;androidx.compose.ui.window.PopupProperties?;androidx.compose.ui.graphics.Shape?;androidx.compose.ui.graphics.Color;androidx.compose.ui.unit.Dp;androidx.compose.ui.unit.Dp;androidx.compose.foundation.BorderStroke?;kotlin.Function3;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/DropdownMenuGroup(androidx.compose.material3/MenuGroupShapes, androidx.compose.ui/Modifier?, androidx.compose.ui.graphics/Color, androidx.compose.ui.unit/Dp, androidx.compose.ui.unit/Dp, androidx.compose.foundation/BorderStroke?, androidx.compose.foundation.layout/PaddingValues?, androidx.compose.foundation.interaction/MutableInteractionSource?, kotlin/Function3, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/DropdownMenuGroup|DropdownMenuGroup(androidx.compose.material3.MenuGroupShapes;androidx.compose.ui.Modifier?;androidx.compose.ui.graphics.Color;androidx.compose.ui.unit.Dp;androidx.compose.ui.unit.Dp;androidx.compose.foundation.BorderStroke?;androidx.compose.foundation.layout.PaddingValues?;androidx.compose.foundation.interaction.MutableInteractionSource?;kotlin.Function3;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/DropdownMenuItem(kotlin/Boolean, kotlin/Function0, kotlin/Function2, androidx.compose.material3/MenuItemShapes, androidx.compose.ui/Modifier?, kotlin/Function2?, kotlin/Function2?, kotlin/Function2?, kotlin/Boolean, androidx.compose.material3/MenuItemColors?, androidx.compose.foundation.layout/PaddingValues?, androidx.compose.foundation.interaction/MutableInteractionSource?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int) // androidx.compose.material3/DropdownMenuItem|DropdownMenuItem(kotlin.Boolean;kotlin.Function0;kotlin.Function2;androidx.compose.material3.MenuItemShapes;androidx.compose.ui.Modifier?;kotlin.Function2?;kotlin.Function2?;kotlin.Function2?;kotlin.Boolean;androidx.compose.material3.MenuItemColors?;androidx.compose.foundation.layout.PaddingValues?;androidx.compose.foundation.interaction.MutableInteractionSource?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int;kotlin.Int){}[0] @@ -4357,11 +3885,8 @@ final fun androidx.compose.material3/ElevatedFilterChip(kotlin/Boolean, kotlin/F final fun androidx.compose.material3/ElevatedSuggestionChip(kotlin/Function0, kotlin/Function2, androidx.compose.ui/Modifier?, kotlin/Boolean, kotlin/Function2?, androidx.compose.ui.graphics/Shape?, androidx.compose.material3/ChipColors?, androidx.compose.material3/ChipElevation?, androidx.compose.foundation/BorderStroke?, androidx.compose.foundation.interaction/MutableInteractionSource?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/ElevatedSuggestionChip|ElevatedSuggestionChip(kotlin.Function0;kotlin.Function2;androidx.compose.ui.Modifier?;kotlin.Boolean;kotlin.Function2?;androidx.compose.ui.graphics.Shape?;androidx.compose.material3.ChipColors?;androidx.compose.material3.ChipElevation?;androidx.compose.foundation.BorderStroke?;androidx.compose.foundation.interaction.MutableInteractionSource?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/ElevatedSuggestionChip(kotlin/Function0, kotlin/Function2, androidx.compose.ui/Modifier?, kotlin/Boolean, kotlin/Function2?, androidx.compose.ui.graphics/Shape?, androidx.compose.material3/ChipColors?, androidx.compose.material3/ChipElevation?, androidx.compose.material3/ChipBorder?, androidx.compose.foundation.interaction/MutableInteractionSource?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/ElevatedSuggestionChip|ElevatedSuggestionChip(kotlin.Function0;kotlin.Function2;androidx.compose.ui.Modifier?;kotlin.Boolean;kotlin.Function2?;androidx.compose.ui.graphics.Shape?;androidx.compose.material3.ChipColors?;androidx.compose.material3.ChipElevation?;androidx.compose.material3.ChipBorder?;androidx.compose.foundation.interaction.MutableInteractionSource?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/ElevatedToggleButton(kotlin/Boolean, kotlin/Function1, androidx.compose.ui/Modifier?, kotlin/Boolean, androidx.compose.material3/ToggleButtonShapes?, androidx.compose.material3/ToggleButtonColors?, androidx.compose.material3/ButtonElevation?, androidx.compose.foundation/BorderStroke?, androidx.compose.foundation.layout/PaddingValues?, androidx.compose.foundation.interaction/MutableInteractionSource?, kotlin/Function3, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int) // androidx.compose.material3/ElevatedToggleButton|ElevatedToggleButton(kotlin.Boolean;kotlin.Function1;androidx.compose.ui.Modifier?;kotlin.Boolean;androidx.compose.material3.ToggleButtonShapes?;androidx.compose.material3.ToggleButtonColors?;androidx.compose.material3.ButtonElevation?;androidx.compose.foundation.BorderStroke?;androidx.compose.foundation.layout.PaddingValues?;androidx.compose.foundation.interaction.MutableInteractionSource?;kotlin.Function3;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int;kotlin.Int){}[0] -final fun androidx.compose.material3/ExpandedDockedSearchBar(androidx.compose.material3/SearchBarState, kotlin/Function2, androidx.compose.ui/Modifier?, androidx.compose.ui.graphics/Shape?, androidx.compose.material3/SearchBarColors?, androidx.compose.ui.unit/Dp, androidx.compose.ui.unit/Dp, androidx.compose.ui.window/PopupProperties?, kotlin/Function3, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/ExpandedDockedSearchBar|ExpandedDockedSearchBar(androidx.compose.material3.SearchBarState;kotlin.Function2;androidx.compose.ui.Modifier?;androidx.compose.ui.graphics.Shape?;androidx.compose.material3.SearchBarColors?;androidx.compose.ui.unit.Dp;androidx.compose.ui.unit.Dp;androidx.compose.ui.window.PopupProperties?;kotlin.Function3;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/ExpandedDockedSearchBarWithGap(androidx.compose.material3/SearchBarState, kotlin/Function2, androidx.compose.ui/Modifier?, androidx.compose.ui.graphics/Shape?, androidx.compose.ui.unit/Dp, androidx.compose.material3/SearchBarColors?, androidx.compose.ui.unit/Dp, androidx.compose.ui.unit/Dp, androidx.compose.ui.window/PopupProperties?, kotlin/Function3, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/ExpandedDockedSearchBarWithGap|ExpandedDockedSearchBarWithGap(androidx.compose.material3.SearchBarState;kotlin.Function2;androidx.compose.ui.Modifier?;androidx.compose.ui.graphics.Shape?;androidx.compose.ui.unit.Dp;androidx.compose.material3.SearchBarColors?;androidx.compose.ui.unit.Dp;androidx.compose.ui.unit.Dp;androidx.compose.ui.window.PopupProperties?;kotlin.Function3;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/ExpandedFullScreenContainedSearchBar(androidx.compose.material3/SearchBarState, kotlin/Function2, androidx.compose.ui/Modifier?, androidx.compose.ui.graphics/Shape?, androidx.compose.material3/SearchBarColors?, androidx.compose.ui.unit/Dp, androidx.compose.ui.unit/Dp, kotlin/Function2?, androidx.compose.ui.window/DialogProperties?, kotlin/Function3, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/ExpandedFullScreenContainedSearchBar|ExpandedFullScreenContainedSearchBar(androidx.compose.material3.SearchBarState;kotlin.Function2;androidx.compose.ui.Modifier?;androidx.compose.ui.graphics.Shape?;androidx.compose.material3.SearchBarColors?;androidx.compose.ui.unit.Dp;androidx.compose.ui.unit.Dp;kotlin.Function2?;androidx.compose.ui.window.DialogProperties?;kotlin.Function3;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] -final fun androidx.compose.material3/ExpandedFullScreenSearchBar(androidx.compose.material3/SearchBarState, kotlin/Function2, androidx.compose.ui/Modifier?, androidx.compose.ui.graphics/Shape?, androidx.compose.material3/SearchBarColors?, androidx.compose.ui.unit/Dp, androidx.compose.ui.unit/Dp, kotlin/Function2?, androidx.compose.ui.window/DialogProperties?, kotlin/Function3, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/ExpandedFullScreenSearchBar|ExpandedFullScreenSearchBar(androidx.compose.material3.SearchBarState;kotlin.Function2;androidx.compose.ui.Modifier?;androidx.compose.ui.graphics.Shape?;androidx.compose.material3.SearchBarColors?;androidx.compose.ui.unit.Dp;androidx.compose.ui.unit.Dp;kotlin.Function2?;androidx.compose.ui.window.DialogProperties?;kotlin.Function3;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] -final fun androidx.compose.material3/ExposedDropdownMenuBox(kotlin/Boolean, kotlin/Function1, androidx.compose.ui/Modifier?, kotlin/Function3, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/ExposedDropdownMenuBox|ExposedDropdownMenuBox(kotlin.Boolean;kotlin.Function1;androidx.compose.ui.Modifier?;kotlin.Function3;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/ExtendedFloatingActionButton(kotlin/Function0, androidx.compose.ui/Modifier?, androidx.compose.ui.graphics/Shape?, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.material3/FloatingActionButtonElevation?, androidx.compose.foundation.interaction/MutableInteractionSource?, kotlin/Function3, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/ExtendedFloatingActionButton|ExtendedFloatingActionButton(kotlin.Function0;androidx.compose.ui.Modifier?;androidx.compose.ui.graphics.Shape?;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.material3.FloatingActionButtonElevation?;androidx.compose.foundation.interaction.MutableInteractionSource?;kotlin.Function3;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/ExtendedFloatingActionButton(kotlin/Function2, kotlin/Function2, kotlin/Function0, androidx.compose.ui/Modifier?, kotlin/Boolean, androidx.compose.ui.graphics/Shape?, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.material3/FloatingActionButtonElevation?, androidx.compose.foundation.interaction/MutableInteractionSource?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/ExtendedFloatingActionButton|ExtendedFloatingActionButton(kotlin.Function2;kotlin.Function2;kotlin.Function0;androidx.compose.ui.Modifier?;kotlin.Boolean;androidx.compose.ui.graphics.Shape?;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.material3.FloatingActionButtonElevation?;androidx.compose.foundation.interaction.MutableInteractionSource?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/FilledIconButton(kotlin/Function0, androidx.compose.material3/IconButtonShapes, androidx.compose.ui/Modifier?, kotlin/Boolean, androidx.compose.material3/IconButtonColors?, androidx.compose.foundation.interaction/MutableInteractionSource?, kotlin/Function2, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/FilledIconButton|FilledIconButton(kotlin.Function0;androidx.compose.material3.IconButtonShapes;androidx.compose.ui.Modifier?;kotlin.Boolean;androidx.compose.material3.IconButtonColors?;androidx.compose.foundation.interaction.MutableInteractionSource?;kotlin.Function2;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] @@ -4395,7 +3920,6 @@ final fun androidx.compose.material3/IconToggleButton(kotlin/Boolean, kotlin/Fun final fun androidx.compose.material3/IconToggleButton(kotlin/Boolean, kotlin/Function1, androidx.compose.ui/Modifier?, kotlin/Boolean, androidx.compose.material3/IconToggleButtonColors?, androidx.compose.foundation.interaction/MutableInteractionSource?, androidx.compose.ui.graphics/Shape?, kotlin/Function2, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/IconToggleButton|IconToggleButton(kotlin.Boolean;kotlin.Function1;androidx.compose.ui.Modifier?;kotlin.Boolean;androidx.compose.material3.IconToggleButtonColors?;androidx.compose.foundation.interaction.MutableInteractionSource?;androidx.compose.ui.graphics.Shape?;kotlin.Function2;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/IconToggleButton(kotlin/Boolean, kotlin/Function1, androidx.compose.ui/Modifier?, kotlin/Boolean, androidx.compose.material3/IconToggleButtonColors?, androidx.compose.foundation.interaction/MutableInteractionSource?, kotlin/Function2, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/IconToggleButton|IconToggleButton(kotlin.Boolean;kotlin.Function1;androidx.compose.ui.Modifier?;kotlin.Boolean;androidx.compose.material3.IconToggleButtonColors?;androidx.compose.foundation.interaction.MutableInteractionSource?;kotlin.Function2;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/InputChip(kotlin/Boolean, kotlin/Function0, kotlin/Function2, androidx.compose.ui/Modifier?, kotlin/Boolean, kotlin/Function2?, kotlin/Function2?, kotlin/Function2?, androidx.compose.ui.graphics/Shape?, androidx.compose.material3/SelectableChipColors?, androidx.compose.material3/SelectableChipElevation?, androidx.compose.foundation/BorderStroke?, androidx.compose.foundation.interaction/MutableInteractionSource?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int) // androidx.compose.material3/InputChip|InputChip(kotlin.Boolean;kotlin.Function0;kotlin.Function2;androidx.compose.ui.Modifier?;kotlin.Boolean;kotlin.Function2?;kotlin.Function2?;kotlin.Function2?;androidx.compose.ui.graphics.Shape?;androidx.compose.material3.SelectableChipColors?;androidx.compose.material3.SelectableChipElevation?;androidx.compose.foundation.BorderStroke?;androidx.compose.foundation.interaction.MutableInteractionSource?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int;kotlin.Int){}[0] -final fun androidx.compose.material3/Label(kotlin/Function3, androidx.compose.ui/Modifier?, androidx.compose.foundation.interaction/MutableInteractionSource?, kotlin/Boolean, kotlin/Function2, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/Label|Label(kotlin.Function3;androidx.compose.ui.Modifier?;androidx.compose.foundation.interaction.MutableInteractionSource?;kotlin.Boolean;kotlin.Function2;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/LargeExtendedFloatingActionButton(kotlin/Function0, androidx.compose.ui/Modifier?, androidx.compose.ui.graphics/Shape?, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.material3/FloatingActionButtonElevation?, androidx.compose.foundation.interaction/MutableInteractionSource?, kotlin/Function3, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/LargeExtendedFloatingActionButton|LargeExtendedFloatingActionButton(kotlin.Function0;androidx.compose.ui.Modifier?;androidx.compose.ui.graphics.Shape?;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.material3.FloatingActionButtonElevation?;androidx.compose.foundation.interaction.MutableInteractionSource?;kotlin.Function3;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/LargeExtendedFloatingActionButton(kotlin/Function2, kotlin/Function2, kotlin/Function0, androidx.compose.ui/Modifier?, kotlin/Boolean, androidx.compose.ui.graphics/Shape?, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.material3/FloatingActionButtonElevation?, androidx.compose.foundation.interaction/MutableInteractionSource?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/LargeExtendedFloatingActionButton|LargeExtendedFloatingActionButton(kotlin.Function2;kotlin.Function2;kotlin.Function0;androidx.compose.ui.Modifier?;kotlin.Boolean;androidx.compose.ui.graphics.Shape?;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.material3.FloatingActionButtonElevation?;androidx.compose.foundation.interaction.MutableInteractionSource?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/LargeFlexibleTopAppBar(kotlin/Function2, androidx.compose.ui/Modifier?, kotlin/Function2?, kotlin/Function2?, kotlin/Function3?, androidx.compose.ui/Alignment.Horizontal?, androidx.compose.ui.unit/Dp, androidx.compose.ui.unit/Dp, androidx.compose.foundation.layout/WindowInsets?, androidx.compose.material3/TopAppBarColors?, androidx.compose.material3/TopAppBarScrollBehavior?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int) // androidx.compose.material3/LargeFlexibleTopAppBar|LargeFlexibleTopAppBar(kotlin.Function2;androidx.compose.ui.Modifier?;kotlin.Function2?;kotlin.Function2?;kotlin.Function3?;androidx.compose.ui.Alignment.Horizontal?;androidx.compose.ui.unit.Dp;androidx.compose.ui.unit.Dp;androidx.compose.foundation.layout.WindowInsets?;androidx.compose.material3.TopAppBarColors?;androidx.compose.material3.TopAppBarScrollBehavior?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int;kotlin.Int){}[0] @@ -4430,7 +3954,6 @@ final fun androidx.compose.material3/MediumExtendedFloatingActionButton(kotlin/F final fun androidx.compose.material3/MediumFlexibleTopAppBar(kotlin/Function2, androidx.compose.ui/Modifier?, kotlin/Function2?, kotlin/Function2?, kotlin/Function3?, androidx.compose.ui/Alignment.Horizontal?, androidx.compose.ui.unit/Dp, androidx.compose.ui.unit/Dp, androidx.compose.foundation.layout/WindowInsets?, androidx.compose.material3/TopAppBarColors?, androidx.compose.material3/TopAppBarScrollBehavior?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int) // androidx.compose.material3/MediumFlexibleTopAppBar|MediumFlexibleTopAppBar(kotlin.Function2;androidx.compose.ui.Modifier?;kotlin.Function2?;kotlin.Function2?;kotlin.Function3?;androidx.compose.ui.Alignment.Horizontal?;androidx.compose.ui.unit.Dp;androidx.compose.ui.unit.Dp;androidx.compose.foundation.layout.WindowInsets?;androidx.compose.material3.TopAppBarColors?;androidx.compose.material3.TopAppBarScrollBehavior?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/MediumFloatingActionButton(kotlin/Function0, androidx.compose.ui/Modifier?, androidx.compose.ui.graphics/Shape?, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.material3/FloatingActionButtonElevation?, androidx.compose.foundation.interaction/MutableInteractionSource?, kotlin/Function2, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/MediumFloatingActionButton|MediumFloatingActionButton(kotlin.Function0;androidx.compose.ui.Modifier?;androidx.compose.ui.graphics.Shape?;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.material3.FloatingActionButtonElevation?;androidx.compose.foundation.interaction.MutableInteractionSource?;kotlin.Function2;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/MediumTopAppBar(kotlin/Function2, androidx.compose.ui/Modifier?, kotlin/Function2?, kotlin/Function3?, androidx.compose.ui.unit/Dp, androidx.compose.ui.unit/Dp, androidx.compose.foundation.layout/WindowInsets?, androidx.compose.material3/TopAppBarColors?, androidx.compose.material3/TopAppBarScrollBehavior?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/MediumTopAppBar|MediumTopAppBar(kotlin.Function2;androidx.compose.ui.Modifier?;kotlin.Function2?;kotlin.Function3?;androidx.compose.ui.unit.Dp;androidx.compose.ui.unit.Dp;androidx.compose.foundation.layout.WindowInsets?;androidx.compose.material3.TopAppBarColors?;androidx.compose.material3.TopAppBarScrollBehavior?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] -final fun androidx.compose.material3/ModalBottomSheet(kotlin/Function0, androidx.compose.ui/Modifier?, androidx.compose.material3/SheetState?, androidx.compose.ui.unit/Dp, kotlin/Boolean, androidx.compose.ui.graphics/Shape?, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.unit/Dp, androidx.compose.ui.graphics/Color, kotlin/Function2?, kotlin/Function2?, androidx.compose.material3/ModalBottomSheetProperties?, kotlin/Function3, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int) // androidx.compose.material3/ModalBottomSheet|ModalBottomSheet(kotlin.Function0;androidx.compose.ui.Modifier?;androidx.compose.material3.SheetState?;androidx.compose.ui.unit.Dp;kotlin.Boolean;androidx.compose.ui.graphics.Shape?;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.unit.Dp;androidx.compose.ui.graphics.Color;kotlin.Function2?;kotlin.Function2?;androidx.compose.material3.ModalBottomSheetProperties?;kotlin.Function3;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/ModalDrawerSheet(androidx.compose.material3/DrawerState, androidx.compose.ui/Modifier?, androidx.compose.ui.graphics/Shape?, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.unit/Dp, androidx.compose.foundation.layout/WindowInsets?, kotlin/Function3, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/ModalDrawerSheet|ModalDrawerSheet(androidx.compose.material3.DrawerState;androidx.compose.ui.Modifier?;androidx.compose.ui.graphics.Shape?;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.unit.Dp;androidx.compose.foundation.layout.WindowInsets?;kotlin.Function3;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/ModalDrawerSheet(androidx.compose.ui/Modifier?, androidx.compose.ui.graphics/Shape?, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.unit/Dp, androidx.compose.foundation.layout/WindowInsets?, kotlin/Function3, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/ModalDrawerSheet|ModalDrawerSheet(androidx.compose.ui.Modifier?;androidx.compose.ui.graphics.Shape?;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.unit.Dp;androidx.compose.foundation.layout.WindowInsets?;kotlin.Function3;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/ModalNavigationDrawer(kotlin/Function2, androidx.compose.ui/Modifier?, androidx.compose.material3/DrawerState?, kotlin/Boolean, androidx.compose.ui.graphics/Color, kotlin/Function2, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/ModalNavigationDrawer|ModalNavigationDrawer(kotlin.Function2;androidx.compose.ui.Modifier?;androidx.compose.material3.DrawerState?;kotlin.Boolean;androidx.compose.ui.graphics.Color;kotlin.Function2;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] @@ -4461,15 +3984,10 @@ final fun androidx.compose.material3/PrimaryScrollableTabRow(kotlin/Int, android final fun androidx.compose.material3/PrimaryTabRow(kotlin/Int, androidx.compose.ui/Modifier?, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, kotlin/Function3?, kotlin/Function2?, kotlin/Function2, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/PrimaryTabRow|PrimaryTabRow(kotlin.Int;androidx.compose.ui.Modifier?;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;kotlin.Function3?;kotlin.Function2?;kotlin.Function2;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/ProvideTextStyle(androidx.compose.ui.text/TextStyle, kotlin/Function2, androidx.compose.runtime/Composer?, kotlin/Int) // androidx.compose.material3/ProvideTextStyle|ProvideTextStyle(androidx.compose.ui.text.TextStyle;kotlin.Function2;androidx.compose.runtime.Composer?;kotlin.Int){}[0] final fun androidx.compose.material3/RadioButton(kotlin/Boolean, kotlin/Function0?, androidx.compose.ui/Modifier?, kotlin/Boolean, androidx.compose.material3/RadioButtonColors?, androidx.compose.foundation.interaction/MutableInteractionSource?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/RadioButton|RadioButton(kotlin.Boolean;kotlin.Function0?;androidx.compose.ui.Modifier?;kotlin.Boolean;androidx.compose.material3.RadioButtonColors?;androidx.compose.foundation.interaction.MutableInteractionSource?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] -final fun androidx.compose.material3/RangeSlider(androidx.compose.material3/RangeSliderState, androidx.compose.ui/Modifier?, kotlin/Boolean, androidx.compose.material3/SliderColors?, androidx.compose.foundation.interaction/MutableInteractionSource?, androidx.compose.foundation.interaction/MutableInteractionSource?, kotlin/Function3?, kotlin/Function3?, kotlin/Function3?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/RangeSlider|RangeSlider(androidx.compose.material3.RangeSliderState;androidx.compose.ui.Modifier?;kotlin.Boolean;androidx.compose.material3.SliderColors?;androidx.compose.foundation.interaction.MutableInteractionSource?;androidx.compose.foundation.interaction.MutableInteractionSource?;kotlin.Function3?;kotlin.Function3?;kotlin.Function3?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] -final fun androidx.compose.material3/RangeSlider(kotlin.ranges/ClosedFloatingPointRange, kotlin/Function1, kotlin/Unit>, androidx.compose.ui/Modifier?, kotlin/Boolean, kotlin.ranges/ClosedFloatingPointRange?, kotlin/Function0?, androidx.compose.material3/SliderColors?, androidx.compose.foundation.interaction/MutableInteractionSource?, androidx.compose.foundation.interaction/MutableInteractionSource?, kotlin/Function3?, kotlin/Function3?, kotlin/Function3?, kotlin/Int, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int) // androidx.compose.material3/RangeSlider|RangeSlider(kotlin.ranges.ClosedFloatingPointRange;kotlin.Function1,kotlin.Unit>;androidx.compose.ui.Modifier?;kotlin.Boolean;kotlin.ranges.ClosedFloatingPointRange?;kotlin.Function0?;androidx.compose.material3.SliderColors?;androidx.compose.foundation.interaction.MutableInteractionSource?;androidx.compose.foundation.interaction.MutableInteractionSource?;kotlin.Function3?;kotlin.Function3?;kotlin.Function3?;kotlin.Int;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/RangeSlider(kotlin.ranges/ClosedFloatingPointRange, kotlin/Function1, kotlin/Unit>, androidx.compose.ui/Modifier?, kotlin/Boolean, kotlin.ranges/ClosedFloatingPointRange?, kotlin/Int, kotlin/Function0?, androidx.compose.material3/SliderColors?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/RangeSlider|RangeSlider(kotlin.ranges.ClosedFloatingPointRange;kotlin.Function1,kotlin.Unit>;androidx.compose.ui.Modifier?;kotlin.Boolean;kotlin.ranges.ClosedFloatingPointRange?;kotlin.Int;kotlin.Function0?;androidx.compose.material3.SliderColors?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/Scaffold(androidx.compose.ui/Modifier?, kotlin/Function2?, kotlin/Function2?, kotlin/Function2?, kotlin/Function2?, androidx.compose.material3/FabPosition, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.foundation.layout/WindowInsets?, kotlin/Function3, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/Scaffold|Scaffold(androidx.compose.ui.Modifier?;kotlin.Function2?;kotlin.Function2?;kotlin.Function2?;kotlin.Function2?;androidx.compose.material3.FabPosition;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.foundation.layout.WindowInsets?;kotlin.Function3;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/Scaffold(androidx.compose.ui/Modifier?, kotlin/Function2?, kotlin/Function2?, kotlin/Function2?, kotlin/Function2?, androidx.compose.material3/FabPosition?, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.foundation.layout/WindowInsets?, kotlin/Function3, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/Scaffold|Scaffold(androidx.compose.ui.Modifier?;kotlin.Function2?;kotlin.Function2?;kotlin.Function2?;kotlin.Function2?;androidx.compose.material3.FabPosition?;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.foundation.layout.WindowInsets?;kotlin.Function3;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/ScrollableTabRow(kotlin/Int, androidx.compose.ui/Modifier?, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.unit/Dp, kotlin/Function3, androidx.compose.runtime/Composer, kotlin/Int, kotlin/Unit>?, kotlin/Function2?, kotlin/Function2, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/ScrollableTabRow|ScrollableTabRow(kotlin.Int;androidx.compose.ui.Modifier?;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.unit.Dp;kotlin.Function3,androidx.compose.runtime.Composer,kotlin.Int,kotlin.Unit>?;kotlin.Function2?;kotlin.Function2;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] -final fun androidx.compose.material3/SearchBar(androidx.compose.material3/SearchBarState, kotlin/Function2, androidx.compose.ui/Modifier?, androidx.compose.ui.graphics/Shape?, androidx.compose.material3/SearchBarColors?, androidx.compose.ui.unit/Dp, androidx.compose.ui.unit/Dp, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/SearchBar|SearchBar(androidx.compose.material3.SearchBarState;kotlin.Function2;androidx.compose.ui.Modifier?;androidx.compose.ui.graphics.Shape?;androidx.compose.material3.SearchBarColors?;androidx.compose.ui.unit.Dp;androidx.compose.ui.unit.Dp;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] -final fun androidx.compose.material3/SearchBar(kotlin/Function2, kotlin/Boolean, kotlin/Function1, androidx.compose.ui/Modifier?, androidx.compose.ui.graphics/Shape?, androidx.compose.material3/SearchBarColors?, androidx.compose.ui.unit/Dp, androidx.compose.ui.unit/Dp, androidx.compose.foundation.layout/WindowInsets?, kotlin/Function3, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/SearchBar|SearchBar(kotlin.Function2;kotlin.Boolean;kotlin.Function1;androidx.compose.ui.Modifier?;androidx.compose.ui.graphics.Shape?;androidx.compose.material3.SearchBarColors?;androidx.compose.ui.unit.Dp;androidx.compose.ui.unit.Dp;androidx.compose.foundation.layout.WindowInsets?;kotlin.Function3;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] -final fun androidx.compose.material3/SearchBar(kotlin/String, kotlin/Function1, kotlin/Function1, kotlin/Boolean, kotlin/Function1, androidx.compose.ui/Modifier?, kotlin/Boolean, kotlin/Function2?, kotlin/Function2?, kotlin/Function2?, androidx.compose.ui.graphics/Shape?, androidx.compose.material3/SearchBarColors?, androidx.compose.ui.unit/Dp, androidx.compose.ui.unit/Dp, androidx.compose.foundation.layout/WindowInsets?, androidx.compose.foundation.interaction/MutableInteractionSource?, kotlin/Function3, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int) // androidx.compose.material3/SearchBar|SearchBar(kotlin.String;kotlin.Function1;kotlin.Function1;kotlin.Boolean;kotlin.Function1;androidx.compose.ui.Modifier?;kotlin.Boolean;kotlin.Function2?;kotlin.Function2?;kotlin.Function2?;androidx.compose.ui.graphics.Shape?;androidx.compose.material3.SearchBarColors?;androidx.compose.ui.unit.Dp;androidx.compose.ui.unit.Dp;androidx.compose.foundation.layout.WindowInsets?;androidx.compose.foundation.interaction.MutableInteractionSource?;kotlin.Function3;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/SecondaryScrollableTabRow(kotlin/Int, androidx.compose.ui/Modifier?, androidx.compose.foundation/ScrollState?, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.unit/Dp, kotlin/Function3?, kotlin/Function2?, androidx.compose.ui.unit/Dp, kotlin/Function2, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/SecondaryScrollableTabRow|SecondaryScrollableTabRow(kotlin.Int;androidx.compose.ui.Modifier?;androidx.compose.foundation.ScrollState?;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.unit.Dp;kotlin.Function3?;kotlin.Function2?;androidx.compose.ui.unit.Dp;kotlin.Function2;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/SecondaryScrollableTabRow(kotlin/Int, androidx.compose.ui/Modifier?, androidx.compose.foundation/ScrollState?, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.ui.unit/Dp, kotlin/Function3?, kotlin/Function2?, kotlin/Function2, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/SecondaryScrollableTabRow|SecondaryScrollableTabRow(kotlin.Int;androidx.compose.ui.Modifier?;androidx.compose.foundation.ScrollState?;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.unit.Dp;kotlin.Function3?;kotlin.Function2?;kotlin.Function2;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/SecondaryTabRow(kotlin/Int, androidx.compose.ui/Modifier?, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, kotlin/Function3?, kotlin/Function2?, kotlin/Function2, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/SecondaryTabRow|SecondaryTabRow(kotlin.Int;androidx.compose.ui.Modifier?;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;kotlin.Function3?;kotlin.Function2?;kotlin.Function2;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] @@ -4483,9 +4001,7 @@ final fun androidx.compose.material3/ShortNavigationBar(androidx.compose.ui/Modi final fun androidx.compose.material3/ShortNavigationBarItem(kotlin/Boolean, kotlin/Function0, kotlin/Function2, kotlin/Function2?, androidx.compose.ui/Modifier?, kotlin/Boolean, androidx.compose.material3/NavigationItemIconPosition, androidx.compose.material3/NavigationItemColors?, androidx.compose.foundation.interaction/MutableInteractionSource?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/ShortNavigationBarItem|ShortNavigationBarItem(kotlin.Boolean;kotlin.Function0;kotlin.Function2;kotlin.Function2?;androidx.compose.ui.Modifier?;kotlin.Boolean;androidx.compose.material3.NavigationItemIconPosition;androidx.compose.material3.NavigationItemColors?;androidx.compose.foundation.interaction.MutableInteractionSource?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/ShortNavigationBarItem(kotlin/Boolean, kotlin/Function0, kotlin/Function2, kotlin/Function2?, androidx.compose.ui/Modifier?, kotlin/Boolean, androidx.compose.material3/NavigationItemIconPosition?, androidx.compose.material3/NavigationItemColors?, androidx.compose.foundation.interaction/MutableInteractionSource?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/ShortNavigationBarItem|ShortNavigationBarItem(kotlin.Boolean;kotlin.Function0;kotlin.Function2;kotlin.Function2?;androidx.compose.ui.Modifier?;kotlin.Boolean;androidx.compose.material3.NavigationItemIconPosition?;androidx.compose.material3.NavigationItemColors?;androidx.compose.foundation.interaction.MutableInteractionSource?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/SingleChoiceSegmentedButtonRow(androidx.compose.ui/Modifier?, androidx.compose.ui.unit/Dp, kotlin/Function3, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/SingleChoiceSegmentedButtonRow|SingleChoiceSegmentedButtonRow(androidx.compose.ui.Modifier?;androidx.compose.ui.unit.Dp;kotlin.Function3;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] -final fun androidx.compose.material3/Slider(androidx.compose.material3/SliderState, androidx.compose.ui/Modifier?, kotlin/Boolean, androidx.compose.material3/SliderColors?, androidx.compose.foundation.interaction/MutableInteractionSource?, kotlin/Function3?, kotlin/Function3?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/Slider|Slider(androidx.compose.material3.SliderState;androidx.compose.ui.Modifier?;kotlin.Boolean;androidx.compose.material3.SliderColors?;androidx.compose.foundation.interaction.MutableInteractionSource?;kotlin.Function3?;kotlin.Function3?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/Slider(kotlin/Float, kotlin/Function1, androidx.compose.ui/Modifier?, kotlin/Boolean, kotlin.ranges/ClosedFloatingPointRange?, kotlin/Int, kotlin/Function0?, androidx.compose.material3/SliderColors?, androidx.compose.foundation.interaction/MutableInteractionSource?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/Slider|Slider(kotlin.Float;kotlin.Function1;androidx.compose.ui.Modifier?;kotlin.Boolean;kotlin.ranges.ClosedFloatingPointRange?;kotlin.Int;kotlin.Function0?;androidx.compose.material3.SliderColors?;androidx.compose.foundation.interaction.MutableInteractionSource?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] -final fun androidx.compose.material3/Slider(kotlin/Float, kotlin/Function1, androidx.compose.ui/Modifier?, kotlin/Boolean, kotlin/Function0?, androidx.compose.material3/SliderColors?, androidx.compose.foundation.interaction/MutableInteractionSource?, kotlin/Int, kotlin/Function3?, kotlin/Function3?, kotlin.ranges/ClosedFloatingPointRange?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int) // androidx.compose.material3/Slider|Slider(kotlin.Float;kotlin.Function1;androidx.compose.ui.Modifier?;kotlin.Boolean;kotlin.Function0?;androidx.compose.material3.SliderColors?;androidx.compose.foundation.interaction.MutableInteractionSource?;kotlin.Int;kotlin.Function3?;kotlin.Function3?;kotlin.ranges.ClosedFloatingPointRange?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/SmallExtendedFloatingActionButton(kotlin/Function0, androidx.compose.ui/Modifier?, androidx.compose.ui.graphics/Shape?, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.material3/FloatingActionButtonElevation?, androidx.compose.foundation.interaction/MutableInteractionSource?, kotlin/Function3, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/SmallExtendedFloatingActionButton|SmallExtendedFloatingActionButton(kotlin.Function0;androidx.compose.ui.Modifier?;androidx.compose.ui.graphics.Shape?;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.material3.FloatingActionButtonElevation?;androidx.compose.foundation.interaction.MutableInteractionSource?;kotlin.Function3;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/SmallExtendedFloatingActionButton(kotlin/Function2, kotlin/Function2, kotlin/Function0, androidx.compose.ui/Modifier?, kotlin/Boolean, androidx.compose.ui.graphics/Shape?, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.material3/FloatingActionButtonElevation?, androidx.compose.foundation.interaction/MutableInteractionSource?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/SmallExtendedFloatingActionButton|SmallExtendedFloatingActionButton(kotlin.Function2;kotlin.Function2;kotlin.Function0;androidx.compose.ui.Modifier?;kotlin.Boolean;androidx.compose.ui.graphics.Shape?;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.material3.FloatingActionButtonElevation?;androidx.compose.foundation.interaction.MutableInteractionSource?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/SmallFloatingActionButton(kotlin/Function0, androidx.compose.ui/Modifier?, androidx.compose.ui.graphics/Shape?, androidx.compose.ui.graphics/Color, androidx.compose.ui.graphics/Color, androidx.compose.material3/FloatingActionButtonElevation?, androidx.compose.foundation.interaction/MutableInteractionSource?, kotlin/Function2, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/SmallFloatingActionButton|SmallFloatingActionButton(kotlin.Function0;androidx.compose.ui.Modifier?;androidx.compose.ui.graphics.Shape?;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.material3.FloatingActionButtonElevation?;androidx.compose.foundation.interaction.MutableInteractionSource?;kotlin.Function2;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] @@ -4526,11 +4042,7 @@ final fun androidx.compose.material3/TextButton(kotlin/Function0, a final fun androidx.compose.material3/TextField(androidx.compose.foundation.text.input/TextFieldState, androidx.compose.ui/Modifier?, kotlin/Boolean, kotlin/Boolean, androidx.compose.ui.text/TextStyle?, androidx.compose.material3/TextFieldLabelPosition?, kotlin/Function3?, kotlin/Function2?, kotlin/Function2?, kotlin/Function2?, kotlin/Function2?, kotlin/Function2?, kotlin/Function2?, kotlin/Boolean, androidx.compose.foundation.text.input/InputTransformation?, androidx.compose.foundation.text.input/OutputTransformation?, androidx.compose.foundation.text/KeyboardOptions?, androidx.compose.foundation.text.input/KeyboardActionHandler?, androidx.compose.foundation.text.input/TextFieldLineLimits?, kotlin/Function2, kotlin/Unit>?, androidx.compose.foundation/ScrollState?, androidx.compose.ui.graphics/Shape?, androidx.compose.material3/TextFieldColors?, androidx.compose.foundation.layout/PaddingValues?, androidx.compose.foundation.interaction/MutableInteractionSource?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int, kotlin/Int) // androidx.compose.material3/TextField|TextField(androidx.compose.foundation.text.input.TextFieldState;androidx.compose.ui.Modifier?;kotlin.Boolean;kotlin.Boolean;androidx.compose.ui.text.TextStyle?;androidx.compose.material3.TextFieldLabelPosition?;kotlin.Function3?;kotlin.Function2?;kotlin.Function2?;kotlin.Function2?;kotlin.Function2?;kotlin.Function2?;kotlin.Function2?;kotlin.Boolean;androidx.compose.foundation.text.input.InputTransformation?;androidx.compose.foundation.text.input.OutputTransformation?;androidx.compose.foundation.text.KeyboardOptions?;androidx.compose.foundation.text.input.KeyboardActionHandler?;androidx.compose.foundation.text.input.TextFieldLineLimits?;kotlin.Function2,kotlin.Unit>?;androidx.compose.foundation.ScrollState?;androidx.compose.ui.graphics.Shape?;androidx.compose.material3.TextFieldColors?;androidx.compose.foundation.layout.PaddingValues?;androidx.compose.foundation.interaction.MutableInteractionSource?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/TextField(androidx.compose.ui.text.input/TextFieldValue, kotlin/Function1, androidx.compose.ui/Modifier?, kotlin/Boolean, kotlin/Boolean, androidx.compose.ui.text/TextStyle?, kotlin/Function2?, kotlin/Function2?, kotlin/Function2?, kotlin/Function2?, kotlin/Function2?, kotlin/Function2?, kotlin/Function2?, kotlin/Boolean, androidx.compose.ui.text.input/VisualTransformation?, androidx.compose.foundation.text/KeyboardOptions?, androidx.compose.foundation.text/KeyboardActions?, kotlin/Boolean, kotlin/Int, kotlin/Int, androidx.compose.foundation.interaction/MutableInteractionSource?, androidx.compose.ui.graphics/Shape?, androidx.compose.material3/TextFieldColors?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int, kotlin/Int) // androidx.compose.material3/TextField|TextField(androidx.compose.ui.text.input.TextFieldValue;kotlin.Function1;androidx.compose.ui.Modifier?;kotlin.Boolean;kotlin.Boolean;androidx.compose.ui.text.TextStyle?;kotlin.Function2?;kotlin.Function2?;kotlin.Function2?;kotlin.Function2?;kotlin.Function2?;kotlin.Function2?;kotlin.Function2?;kotlin.Boolean;androidx.compose.ui.text.input.VisualTransformation?;androidx.compose.foundation.text.KeyboardOptions?;androidx.compose.foundation.text.KeyboardActions?;kotlin.Boolean;kotlin.Int;kotlin.Int;androidx.compose.foundation.interaction.MutableInteractionSource?;androidx.compose.ui.graphics.Shape?;androidx.compose.material3.TextFieldColors?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/TextField(kotlin/String, kotlin/Function1, androidx.compose.ui/Modifier?, kotlin/Boolean, kotlin/Boolean, androidx.compose.ui.text/TextStyle?, kotlin/Function2?, kotlin/Function2?, kotlin/Function2?, kotlin/Function2?, kotlin/Function2?, kotlin/Function2?, kotlin/Function2?, kotlin/Boolean, androidx.compose.ui.text.input/VisualTransformation?, androidx.compose.foundation.text/KeyboardOptions?, androidx.compose.foundation.text/KeyboardActions?, kotlin/Boolean, kotlin/Int, kotlin/Int, androidx.compose.foundation.interaction/MutableInteractionSource?, androidx.compose.ui.graphics/Shape?, androidx.compose.material3/TextFieldColors?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int, kotlin/Int) // androidx.compose.material3/TextField|TextField(kotlin.String;kotlin.Function1;androidx.compose.ui.Modifier?;kotlin.Boolean;kotlin.Boolean;androidx.compose.ui.text.TextStyle?;kotlin.Function2?;kotlin.Function2?;kotlin.Function2?;kotlin.Function2?;kotlin.Function2?;kotlin.Function2?;kotlin.Function2?;kotlin.Boolean;androidx.compose.ui.text.input.VisualTransformation?;androidx.compose.foundation.text.KeyboardOptions?;androidx.compose.foundation.text.KeyboardActions?;kotlin.Boolean;kotlin.Int;kotlin.Int;androidx.compose.foundation.interaction.MutableInteractionSource?;androidx.compose.ui.graphics.Shape?;androidx.compose.material3.TextFieldColors?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int;kotlin.Int;kotlin.Int){}[0] -final fun androidx.compose.material3/TimeInput(androidx.compose.material3/TimePickerState, androidx.compose.ui/Modifier?, androidx.compose.material3/TimePickerColors?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/TimeInput|TimeInput(androidx.compose.material3.TimePickerState;androidx.compose.ui.Modifier?;androidx.compose.material3.TimePickerColors?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] -final fun androidx.compose.material3/TimePicker(androidx.compose.material3/TimePickerState, androidx.compose.ui/Modifier?, androidx.compose.material3/TimePickerColors?, androidx.compose.material3/TimePickerLayoutType, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/TimePicker|TimePicker(androidx.compose.material3.TimePickerState;androidx.compose.ui.Modifier?;androidx.compose.material3.TimePickerColors?;androidx.compose.material3.TimePickerLayoutType;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] -final fun androidx.compose.material3/TimePicker(androidx.compose.material3/TimePickerState, androidx.compose.ui/Modifier?, androidx.compose.material3/TimePickerColors?, androidx.compose.material3/TimePickerLayoutType?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/TimePicker|TimePicker(androidx.compose.material3.TimePickerState;androidx.compose.ui.Modifier?;androidx.compose.material3.TimePickerColors?;androidx.compose.material3.TimePickerLayoutType?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/TimePickerDialog(kotlin/Function0, kotlin/Function2, kotlin/Function2, androidx.compose.ui/Modifier?, androidx.compose.ui.window/DialogProperties?, kotlin/Function2?, kotlin/Function2?, androidx.compose.ui.graphics/Shape?, androidx.compose.ui.graphics/Color, kotlin/Function3, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/TimePickerDialog|TimePickerDialog(kotlin.Function0;kotlin.Function2;kotlin.Function2;androidx.compose.ui.Modifier?;androidx.compose.ui.window.DialogProperties?;kotlin.Function2?;kotlin.Function2?;androidx.compose.ui.graphics.Shape?;androidx.compose.ui.graphics.Color;kotlin.Function3;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] -final fun androidx.compose.material3/TimePickerState(kotlin/Int, kotlin/Int, kotlin/Boolean): androidx.compose.material3/TimePickerState // androidx.compose.material3/TimePickerState|TimePickerState(kotlin.Int;kotlin.Int;kotlin.Boolean){}[0] final fun androidx.compose.material3/ToggleButton(kotlin/Boolean, kotlin/Function1, androidx.compose.ui/Modifier?, kotlin/Boolean, androidx.compose.material3/ToggleButtonShapes?, androidx.compose.material3/ToggleButtonColors?, androidx.compose.material3/ButtonElevation?, androidx.compose.foundation/BorderStroke?, androidx.compose.foundation.layout/PaddingValues?, androidx.compose.foundation.interaction/MutableInteractionSource?, kotlin/Function3, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int) // androidx.compose.material3/ToggleButton|ToggleButton(kotlin.Boolean;kotlin.Function1;androidx.compose.ui.Modifier?;kotlin.Boolean;androidx.compose.material3.ToggleButtonShapes?;androidx.compose.material3.ToggleButtonColors?;androidx.compose.material3.ButtonElevation?;androidx.compose.foundation.BorderStroke?;androidx.compose.foundation.layout.PaddingValues?;androidx.compose.foundation.interaction.MutableInteractionSource?;kotlin.Function3;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/ToggleFloatingActionButton(kotlin/Boolean, kotlin/Function1, androidx.compose.ui/Modifier?, kotlin/Function1?, androidx.compose.ui/Alignment?, kotlin/Function1?, kotlin/Function1?, kotlin/Function3, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/ToggleFloatingActionButton|ToggleFloatingActionButton(kotlin.Boolean;kotlin.Function1;androidx.compose.ui.Modifier?;kotlin.Function1?;androidx.compose.ui.Alignment?;kotlin.Function1?;kotlin.Function1?;kotlin.Function3;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/TonalToggleButton(kotlin/Boolean, kotlin/Function1, androidx.compose.ui/Modifier?, kotlin/Boolean, androidx.compose.material3/ToggleButtonShapes?, androidx.compose.material3/ToggleButtonColors?, androidx.compose.material3/ButtonElevation?, androidx.compose.foundation/BorderStroke?, androidx.compose.foundation.layout/PaddingValues?, androidx.compose.foundation.interaction/MutableInteractionSource?, kotlin/Function3, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int) // androidx.compose.material3/TonalToggleButton|TonalToggleButton(kotlin.Boolean;kotlin.Function1;androidx.compose.ui.Modifier?;kotlin.Boolean;androidx.compose.material3.ToggleButtonShapes?;androidx.compose.material3.ToggleButtonColors?;androidx.compose.material3.ButtonElevation?;androidx.compose.foundation.BorderStroke?;androidx.compose.foundation.layout.PaddingValues?;androidx.compose.foundation.interaction.MutableInteractionSource?;kotlin.Function3;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int;kotlin.Int){}[0] @@ -4539,7 +4051,6 @@ final fun androidx.compose.material3/TooltipState(kotlin/Boolean = ..., kotlin/B final fun androidx.compose.material3/TopAppBar(kotlin/Function2, androidx.compose.ui/Modifier?, kotlin/Function2?, kotlin/Function3?, androidx.compose.ui.unit/Dp, androidx.compose.foundation.layout/WindowInsets?, androidx.compose.material3/TopAppBarColors?, androidx.compose.material3/TopAppBarScrollBehavior?, androidx.compose.foundation.layout/PaddingValues?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/TopAppBar|TopAppBar(kotlin.Function2;androidx.compose.ui.Modifier?;kotlin.Function2?;kotlin.Function3?;androidx.compose.ui.unit.Dp;androidx.compose.foundation.layout.WindowInsets?;androidx.compose.material3.TopAppBarColors?;androidx.compose.material3.TopAppBarScrollBehavior?;androidx.compose.foundation.layout.PaddingValues?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/TopAppBar(kotlin/Function2, androidx.compose.ui/Modifier?, kotlin/Function2?, kotlin/Function3?, androidx.compose.ui.unit/Dp, androidx.compose.foundation.layout/WindowInsets?, androidx.compose.material3/TopAppBarColors?, androidx.compose.material3/TopAppBarScrollBehavior?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/TopAppBar|TopAppBar(kotlin.Function2;androidx.compose.ui.Modifier?;kotlin.Function2?;kotlin.Function3?;androidx.compose.ui.unit.Dp;androidx.compose.foundation.layout.WindowInsets?;androidx.compose.material3.TopAppBarColors?;androidx.compose.material3.TopAppBarScrollBehavior?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/TopAppBar(kotlin/Function2, kotlin/Function2, androidx.compose.ui/Modifier?, kotlin/Function2?, kotlin/Function3?, androidx.compose.ui/Alignment.Horizontal?, androidx.compose.ui.unit/Dp, androidx.compose.foundation.layout/WindowInsets?, androidx.compose.material3/TopAppBarColors?, androidx.compose.material3/TopAppBarScrollBehavior?, androidx.compose.foundation.layout/PaddingValues?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int) // androidx.compose.material3/TopAppBar|TopAppBar(kotlin.Function2;kotlin.Function2;androidx.compose.ui.Modifier?;kotlin.Function2?;kotlin.Function3?;androidx.compose.ui.Alignment.Horizontal?;androidx.compose.ui.unit.Dp;androidx.compose.foundation.layout.WindowInsets?;androidx.compose.material3.TopAppBarColors?;androidx.compose.material3.TopAppBarScrollBehavior?;androidx.compose.foundation.layout.PaddingValues?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int;kotlin.Int){}[0] -final fun androidx.compose.material3/TopSearchBar(androidx.compose.material3/SearchBarState, kotlin/Function2, androidx.compose.ui/Modifier?, androidx.compose.ui.graphics/Shape?, androidx.compose.material3/SearchBarColors?, androidx.compose.ui.unit/Dp, androidx.compose.ui.unit/Dp, androidx.compose.foundation.layout/WindowInsets?, androidx.compose.material3/SearchBarScrollBehavior?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/TopSearchBar|TopSearchBar(androidx.compose.material3.SearchBarState;kotlin.Function2;androidx.compose.ui.Modifier?;androidx.compose.ui.graphics.Shape?;androidx.compose.material3.SearchBarColors?;androidx.compose.ui.unit.Dp;androidx.compose.ui.unit.Dp;androidx.compose.foundation.layout.WindowInsets?;androidx.compose.material3.SearchBarScrollBehavior?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/TriStateCheckbox(androidx.compose.ui.state/ToggleableState, kotlin/Function0?, androidx.compose.ui.graphics.drawscope/Stroke, androidx.compose.ui.graphics.drawscope/Stroke, androidx.compose.ui/Modifier?, kotlin/Boolean, androidx.compose.material3/CheckboxColors?, androidx.compose.foundation.interaction/MutableInteractionSource?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/TriStateCheckbox|TriStateCheckbox(androidx.compose.ui.state.ToggleableState;kotlin.Function0?;androidx.compose.ui.graphics.drawscope.Stroke;androidx.compose.ui.graphics.drawscope.Stroke;androidx.compose.ui.Modifier?;kotlin.Boolean;androidx.compose.material3.CheckboxColors?;androidx.compose.foundation.interaction.MutableInteractionSource?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/TriStateCheckbox(androidx.compose.ui.state/ToggleableState, kotlin/Function0?, androidx.compose.ui/Modifier?, kotlin/Boolean, androidx.compose.material3/CheckboxColors?, androidx.compose.foundation.interaction/MutableInteractionSource?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // androidx.compose.material3/TriStateCheckbox|TriStateCheckbox(androidx.compose.ui.state.ToggleableState;kotlin.Function0?;androidx.compose.ui.Modifier?;kotlin.Boolean;androidx.compose.material3.CheckboxColors?;androidx.compose.foundation.interaction.MutableInteractionSource?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/TwoRowsTopAppBar(kotlin/Function3, androidx.compose.ui/Modifier?, kotlin/Function3?, kotlin/Function2?, kotlin/Function3?, androidx.compose.ui/Alignment.Horizontal?, androidx.compose.ui.unit/Dp, androidx.compose.ui.unit/Dp, androidx.compose.foundation.layout/WindowInsets?, androidx.compose.material3/TopAppBarColors?, androidx.compose.material3/TopAppBarScrollBehavior?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int, kotlin/Int) // androidx.compose.material3/TwoRowsTopAppBar|TwoRowsTopAppBar(kotlin.Function3;androidx.compose.ui.Modifier?;kotlin.Function3?;kotlin.Function2?;kotlin.Function3?;androidx.compose.ui.Alignment.Horizontal?;androidx.compose.ui.unit.Dp;androidx.compose.ui.unit.Dp;androidx.compose.foundation.layout.WindowInsets?;androidx.compose.material3.TopAppBarColors?;androidx.compose.material3.TopAppBarScrollBehavior?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int;kotlin.Int){}[0] @@ -4716,22 +4227,14 @@ final fun androidx.compose.material3/expressiveLightColorScheme(): androidx.comp final fun androidx.compose.material3/lightColorScheme(androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ...): androidx.compose.material3/ColorScheme // androidx.compose.material3/lightColorScheme|lightColorScheme(androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color){}[0] final fun androidx.compose.material3/lightColorScheme(androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ...): androidx.compose.material3/ColorScheme // androidx.compose.material3/lightColorScheme|lightColorScheme(androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color){}[0] final fun androidx.compose.material3/lightColorScheme(androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ...): androidx.compose.material3/ColorScheme // androidx.compose.material3/lightColorScheme|lightColorScheme(androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color){}[0] -final fun androidx.compose.material3/rememberBottomAppBarState(kotlin/Float, kotlin/Float, kotlin/Float, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int): androidx.compose.material3/BottomAppBarState // androidx.compose.material3/rememberBottomAppBarState|rememberBottomAppBarState(kotlin.Float;kotlin.Float;kotlin.Float;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] -final fun androidx.compose.material3/rememberBottomSheetScaffoldState(androidx.compose.material3/SheetState?, androidx.compose.material3/SnackbarHostState?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int): androidx.compose.material3/BottomSheetScaffoldState // androidx.compose.material3/rememberBottomSheetScaffoldState|rememberBottomSheetScaffoldState(androidx.compose.material3.SheetState?;androidx.compose.material3.SnackbarHostState?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/rememberDatePickerState(kotlin/Long?, kotlin/Long?, kotlin.ranges/IntRange?, androidx.compose.material3/DisplayMode, androidx.compose.material3/SelectableDates?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int): androidx.compose.material3/DatePickerState // androidx.compose.material3/rememberDatePickerState|rememberDatePickerState(kotlin.Long?;kotlin.Long?;kotlin.ranges.IntRange?;androidx.compose.material3.DisplayMode;androidx.compose.material3.SelectableDates?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/rememberDatePickerState(kotlin/Long?, kotlin/Long?, kotlin.ranges/IntRange?, androidx.compose.material3/DisplayMode?, androidx.compose.material3/SelectableDates?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int): androidx.compose.material3/DatePickerState // androidx.compose.material3/rememberDatePickerState|rememberDatePickerState(kotlin.Long?;kotlin.Long?;kotlin.ranges.IntRange?;androidx.compose.material3.DisplayMode?;androidx.compose.material3.SelectableDates?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/rememberDateRangePickerState(kotlin/Long?, kotlin/Long?, kotlin/Long?, kotlin.ranges/IntRange?, androidx.compose.material3/DisplayMode, androidx.compose.material3/SelectableDates?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int): androidx.compose.material3/DateRangePickerState // androidx.compose.material3/rememberDateRangePickerState|rememberDateRangePickerState(kotlin.Long?;kotlin.Long?;kotlin.Long?;kotlin.ranges.IntRange?;androidx.compose.material3.DisplayMode;androidx.compose.material3.SelectableDates?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/rememberDateRangePickerState(kotlin/Long?, kotlin/Long?, kotlin/Long?, kotlin.ranges/IntRange?, androidx.compose.material3/DisplayMode?, androidx.compose.material3/SelectableDates?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int): androidx.compose.material3/DateRangePickerState // androidx.compose.material3/rememberDateRangePickerState|rememberDateRangePickerState(kotlin.Long?;kotlin.Long?;kotlin.Long?;kotlin.ranges.IntRange?;androidx.compose.material3.DisplayMode?;androidx.compose.material3.SelectableDates?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/rememberDrawerState(androidx.compose.material3/DrawerValue, kotlin/Function1?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int): androidx.compose.material3/DrawerState // androidx.compose.material3/rememberDrawerState|rememberDrawerState(androidx.compose.material3.DrawerValue;kotlin.Function1?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/rememberFloatingToolbarState(kotlin/Float, kotlin/Float, kotlin/Float, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int): androidx.compose.material3/FloatingToolbarState // androidx.compose.material3/rememberFloatingToolbarState|rememberFloatingToolbarState(kotlin.Float;kotlin.Float;kotlin.Float;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] -final fun androidx.compose.material3/rememberModalBottomSheetState(kotlin/Boolean, kotlin/Function1?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int): androidx.compose.material3/SheetState // androidx.compose.material3/rememberModalBottomSheetState|rememberModalBottomSheetState(kotlin.Boolean;kotlin.Function1?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] -final fun androidx.compose.material3/rememberRangeSliderState(kotlin/Float, kotlin/Float, kotlin/Int, kotlin/Function0?, kotlin.ranges/ClosedFloatingPointRange?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int): androidx.compose.material3/RangeSliderState // androidx.compose.material3/rememberRangeSliderState|rememberRangeSliderState(kotlin.Float;kotlin.Float;kotlin.Int;kotlin.Function0?;kotlin.ranges.ClosedFloatingPointRange?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] -final fun androidx.compose.material3/rememberSearchBarState(androidx.compose.material3/SearchBarValue?, androidx.compose.animation.core/AnimationSpec?, androidx.compose.animation.core/AnimationSpec?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int): androidx.compose.material3/SearchBarState // androidx.compose.material3/rememberSearchBarState|rememberSearchBarState(androidx.compose.material3.SearchBarValue?;androidx.compose.animation.core.AnimationSpec?;androidx.compose.animation.core.AnimationSpec?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] -final fun androidx.compose.material3/rememberSliderState(kotlin/Float, kotlin/Int, kotlin/Function0?, kotlin.ranges/ClosedFloatingPointRange?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int): androidx.compose.material3/SliderState // androidx.compose.material3/rememberSliderState|rememberSliderState(kotlin.Float;kotlin.Int;kotlin.Function0?;kotlin.ranges.ClosedFloatingPointRange?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] -final fun androidx.compose.material3/rememberStandardBottomSheetState(androidx.compose.material3/SheetValue?, kotlin/Function1?, kotlin/Boolean, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int): androidx.compose.material3/SheetState // androidx.compose.material3/rememberStandardBottomSheetState|rememberStandardBottomSheetState(androidx.compose.material3.SheetValue?;kotlin.Function1?;kotlin.Boolean;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/rememberSwipeToDismissBoxState(androidx.compose.material3/SwipeToDismissBoxValue?, kotlin/Function1?, kotlin/Function1?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int): androidx.compose.material3/SwipeToDismissBoxState // androidx.compose.material3/rememberSwipeToDismissBoxState|rememberSwipeToDismissBoxState(androidx.compose.material3.SwipeToDismissBoxValue?;kotlin.Function1?;kotlin.Function1?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/rememberSwipeToDismissBoxState(androidx.compose.material3/SwipeToDismissBoxValue?, kotlin/Function1?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int): androidx.compose.material3/SwipeToDismissBoxState // androidx.compose.material3/rememberSwipeToDismissBoxState|rememberSwipeToDismissBoxState(androidx.compose.material3.SwipeToDismissBoxValue?;kotlin.Function1?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] -final fun androidx.compose.material3/rememberTimePickerState(kotlin/Int, kotlin/Int, kotlin/Boolean, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int): androidx.compose.material3/TimePickerState // androidx.compose.material3/rememberTimePickerState|rememberTimePickerState(kotlin.Int;kotlin.Int;kotlin.Boolean;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/rememberTooltipState(kotlin/Boolean, kotlin/Boolean, androidx.compose.foundation/MutatorMutex?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int): androidx.compose.material3/TooltipState // androidx.compose.material3/rememberTooltipState|rememberTooltipState(kotlin.Boolean;kotlin.Boolean;androidx.compose.foundation.MutatorMutex?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/rememberTopAppBarState(kotlin/Float, kotlin/Float, kotlin/Float, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int): androidx.compose.material3/TopAppBarState // androidx.compose.material3/rememberTopAppBarState|rememberTopAppBarState(kotlin.Float;kotlin.Float;kotlin.Float;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] final fun androidx.compose.material3/rememberWideNavigationRailState(androidx.compose.material3/WideNavigationRailValue?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int): androidx.compose.material3/WideNavigationRailState // androidx.compose.material3/rememberWideNavigationRailState|rememberWideNavigationRailState(androidx.compose.material3.WideNavigationRailValue?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){}[0] diff --git a/compose/runtime/runtime-retain/bcv/native/current.ignore b/compose/runtime/runtime-retain/bcv/native/current.ignore index f3117aac644b3..313b9ca239cb3 100644 --- a/compose/runtime/runtime-retain/bcv/native/current.ignore +++ b/compose/runtime/runtime-retain/bcv/native/current.ignore @@ -50,4 +50,4 @@ [watchosSimulatorArm64]: Removed declaration getExitedValueOrElse(kotlin/Any, kotlin/Any?) from androidx.compose.runtime.retain/RetainedValuesStore [watchosSimulatorArm64]: Added declaration consumeExitedValueOrDefault(kotlin/Any, kotlin/Any?) to androidx.compose.runtime.retain/RetainedValuesStore [watchosSimulatorArm64]: Removed declaration getExitedValueOrElse(kotlin/Any, kotlin/Any?) from androidx.compose.runtime.retain/ManagedRetainedValuesStore -[watchosSimulatorArm64]: Removed declaration getExitedValueOrElse(kotlin/Any, kotlin/Any?) from androidx.compose.runtime.retain/ForgetfulRetainedValuesStore +[watchosSimulatorArm64]: Removed declaration getExitedValueOrElse(kotlin/Any, kotlin/Any?) from androidx.compose.runtime.retain/ForgetfulRetainedValuesStore \ No newline at end of file