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/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/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 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..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,23 +186,21 @@ 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", accessibilityLabel = "readOnlyCheckbox", - readOnly = true, + isReadOnly = true, ) val checkBox = - FormWidgetInfo( - widgetType = FormWidgetInfo.WIDGET_TYPE_CHECKBOX, + FormWidgetInfo.createCheckbox( widgetIndex = 1, widgetRect = Rect(135, 70, 155, 90), textValue = "false", accessibilityLabel = "checkbox", - readOnly = false, + isReadOnly = false, ) verifyFormWidgetInfos( @@ -217,26 +215,24 @@ 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", accessibilityLabel = "checkbox", - readOnly = false, + isReadOnly = false, ) val clickPoint = PdfPoint(pageNum = 0, x = 145f, y = 80f) val editRec = FormEditInfo.createClick(before.widgetIndex, clickPoint = clickPoint) val after = - FormWidgetInfo( - widgetType = FormWidgetInfo.WIDGET_TYPE_CHECKBOX, + FormWidgetInfo.createCheckbox( widgetIndex = 1, widgetRect = widgetArea, textValue = "true", accessibilityLabel = "checkbox", - readOnly = false, + isReadOnly = false, ) val expectedDirtyArea: List = listOf(widgetArea) @@ -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, - readOnly = readOnly, - editableText = editableText, - fontSize = fontSize.takeIf { it > 0 }, + isReadOnly = readOnly, + isEditableText = editableText, + fontSize = fontSize.takeIf { it > 0 } ?: 0f, listItems = listItems, ) } @@ -1010,13 +1005,12 @@ class PdfFormFillingTest { textValue: String, accessibilityLabel: String, ): FormWidgetInfo { - return FormWidgetInfo( - widgetType = FormWidgetInfo.WIDGET_TYPE_RADIOBUTTON, + return FormWidgetInfo.createRadioButton( widgetIndex = widgetIndex, widgetRect = widgetRect, textValue = textValue, accessibilityLabel = accessibilityLabel, - readOnly = readOnly, + isReadOnly = readOnly, ) } @@ -1029,14 +1023,13 @@ class PdfFormFillingTest { multiSelect: Boolean, listItems: List, ): FormWidgetInfo { - return FormWidgetInfo( - widgetType = FormWidgetInfo.WIDGET_TYPE_LISTBOX, + return FormWidgetInfo.createListBox( widgetIndex = widgetIndex, widgetRect = widgetRect, textValue = textValue, accessibilityLabel = accessibilityLabel, - readOnly = readOnly, - multiSelect = multiSelect, + isReadOnly = readOnly, + isMultiSelect = multiSelect, listItems = listItems, ) } @@ -1052,17 +1045,16 @@ class PdfFormFillingTest { maxLength: Int, fontSize: Float, ): FormWidgetInfo { - return FormWidgetInfo( - widgetType = FormWidgetInfo.WIDGET_TYPE_TEXTFIELD, + return FormWidgetInfo.createTextField( widgetIndex = widgetIndex, widgetRect = widgetRect, textValue = textValue, accessibilityLabel = accessibilityLabel, - readOnly = readOnly, - editableText = editableText, - multiLineText = multiLineText, - maxLength = maxLength.takeIf { it >= 0 }, // Only include if > 0 - fontSize = fontSize.takeIf { it > 0 }, // Only include if > 0 + isReadOnly = readOnly, + isEditableText = editableText, + isMultiLineText = multiLineText, + 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/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-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/build.gradle b/pdf/pdf-ink/build.gradle index 5705ce05ddd03..750da8b131832 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) @@ -69,7 +71,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 0000000000000..ab9460180429c Binary files /dev/null and b/pdf/pdf-ink/src/androidTest/assets/sample_form.pdf differ 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/FakeEditablePdfDocument.kt b/pdf/pdf-ink/src/androidTest/kotlin/androidx/pdf/FakeEditablePdfDocument.kt index a94d1a795be50..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,26 +339,25 @@ 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", accessibilityLabel = "ListBox", listItems = listOf(ListItem("Apple", false), ListItem("Banana", false)), - multiSelect = true, - readOnly = true, + isMultiSelect = true, + isReadOnly = true, ) ), ), 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 } 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/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/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/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/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/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/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/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/AnnotationToolbar.kt b/pdf/pdf-ink/src/main/kotlin/androidx/pdf/ink/view/AnnotationToolbar.kt index f967f2d4722c3..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 @@ -17,15 +17,20 @@ 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.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 @@ -43,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 @@ -61,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)) @@ -82,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. @@ -139,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 @@ -165,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 @@ -213,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) } @@ -257,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) @@ -457,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 } @@ -467,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]. @@ -481,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() /** @@ -503,3 +587,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/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/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 } } } 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/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/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/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/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/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.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"> - - - + + + + + + + - + 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/dimens.xml b/pdf/pdf-ink/src/main/res/values/dimens.xml index 4a40ef94a3ce2..eb827e2153320 100644 --- a/pdf/pdf-ink/src/main/res/values/dimens.xml +++ b/pdf/pdf-ink/src/main/res/values/dimens.xml @@ -22,6 +22,7 @@ 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/main/res/values/ids.xml b/pdf/pdf-ink/src/main/res/values/ids.xml index 42f4ee8f27cfd..7189b7f9a811e 100644 --- a/pdf/pdf-ink/src/main/res/values/ids.xml +++ b/pdf/pdf-ink/src/main/res/values/ids.xml @@ -15,5 +15,7 @@ --> + + \ No newline at end of file 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/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) + } +} 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, + ) + } +} 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) } } 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..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,31 +364,28 @@ 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", accessibilityLabel = "checkbox", - readOnly = false, + isReadOnly = false, ) val expectedFormWidgetInfoIndex5 = - FormWidgetInfo( - widgetType = FormWidgetInfo.WIDGET_TYPE_RADIOBUTTON, + FormWidgetInfo.createRadioButton( widgetIndex = 5, widgetRect = Rect(85, 230, 105, 250), textValue = "true", accessibilityLabel = "", - readOnly = false, + isReadOnly = false, ) val expectedFormWidgetInfoIndex7 = - FormWidgetInfo( - widgetType = FormWidgetInfo.WIDGET_TYPE_RADIOBUTTON, + FormWidgetInfo.createRadioButton( widgetIndex = 7, 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..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,26 +337,25 @@ 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", 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..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", - multiLineText = false, + 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,14 +347,14 @@ 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, - 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..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,7 +20,9 @@ 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 import androidx.core.os.ParcelCompat import java.util.Objects @@ -34,63 +36,67 @@ 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 */ 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" } + require(fontSize >= 0f) { "fontSize 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 +106,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 +123,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 +137,12 @@ public class FormWidgetInfo( widgetType, widgetIndex, widgetRect, - readOnly, + isReadOnly, textValue, accessibilityLabel, - editableText, - multiSelect, - multiLineText, + isEditableText, + isMultiSelect, + isMultiLineText, maxLength, fontSize, listItems, @@ -151,18 +156,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 +200,153 @@ 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, + @FloatRange(from = 0.0) 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, + @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, + 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..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,26 +315,25 @@ 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", 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/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 17c993c890a23..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,13 +70,12 @@ 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", accessibilityLabel = "accessible", - readOnly = false, + isReadOnly = false, ) val expectedEditRecord = @@ -101,13 +100,12 @@ 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", accessibilityLabel = "accessible", - readOnly = false, + isReadOnly = false, ) val expectedEditRecord = FormEditInfo.createClick( @@ -130,13 +128,12 @@ 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", accessibilityLabel = "accessible", - readOnly = false, + isReadOnly = false, ) val expectedEditRecord = FormEditInfo.createClick( @@ -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", - readOnly = false, + 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, ) ) 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/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, 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" 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()) + } } } 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() } 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) + } +}