Skip to content

Commit

Permalink
Fix ScalingLazyColumn Rotary issue (#2220)
Browse files Browse the repository at this point in the history

---------

Co-authored-by: yschimke <[email protected]>
  • Loading branch information
yschimke and yschimke authored May 1, 2024
1 parent afd0de4 commit 59bca15
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 39 deletions.
4 changes: 1 addition & 3 deletions compose-layout/api/current.api
Original file line number Diff line number Diff line change
Expand Up @@ -90,12 +90,11 @@ package com.google.android.horologist.compose.layout {
}

@com.google.android.horologist.annotations.ExperimentalHorologistApi public final class ScalingLazyColumnState implements androidx.compose.foundation.gestures.ScrollableState {
ctor public ScalingLazyColumnState(optional com.google.android.horologist.compose.layout.ScalingLazyColumnState.ScrollPosition initialScrollPosition, optional androidx.wear.compose.foundation.lazy.AutoCenteringParams? autoCentering, optional int anchorType, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional com.google.android.horologist.compose.layout.ScalingLazyColumnState.RotaryMode? rotaryMode, optional boolean reverseLayout, optional androidx.compose.foundation.layout.Arrangement.Vertical verticalArrangement, optional androidx.compose.ui.Alignment.Horizontal horizontalAlignment, optional androidx.compose.foundation.gestures.FlingBehavior? flingBehavior, optional boolean userScrollEnabled, optional androidx.wear.compose.foundation.lazy.ScalingParams scalingParams, optional boolean hapticsEnabled);
ctor public ScalingLazyColumnState(optional com.google.android.horologist.compose.layout.ScalingLazyColumnState.ScrollPosition initialScrollPosition, optional androidx.wear.compose.foundation.lazy.AutoCenteringParams? autoCentering, optional int anchorType, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional com.google.android.horologist.compose.layout.ScalingLazyColumnState.RotaryMode? rotaryMode, optional boolean reverseLayout, optional androidx.compose.foundation.layout.Arrangement.Vertical verticalArrangement, optional androidx.compose.ui.Alignment.Horizontal horizontalAlignment, optional boolean userScrollEnabled, optional androidx.wear.compose.foundation.lazy.ScalingParams scalingParams, optional boolean hapticsEnabled);
method public float dispatchRawDelta(float delta);
method public int getAnchorType();
method public androidx.wear.compose.foundation.lazy.AutoCenteringParams? getAutoCentering();
method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
method public androidx.compose.foundation.gestures.FlingBehavior? getFlingBehavior();
method public boolean getHapticsEnabled();
method public androidx.compose.ui.Alignment.Horizontal getHorizontalAlignment();
method public com.google.android.horologist.compose.layout.ScalingLazyColumnState.ScrollPosition getInitialScrollPosition();
Expand All @@ -113,7 +112,6 @@ package com.google.android.horologist.compose.layout {
property public boolean canScrollBackward;
property public boolean canScrollForward;
property public final androidx.compose.foundation.layout.PaddingValues contentPadding;
property public final androidx.compose.foundation.gestures.FlingBehavior? flingBehavior;
property public final boolean hapticsEnabled;
property public final androidx.compose.ui.Alignment.Horizontal horizontalAlignment;
property public final com.google.android.horologist.compose.layout.ScalingLazyColumnState.ScrollPosition initialScrollPosition;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,10 @@
*/

@file:Suppress("ObjectLiteralToLambda")
@file:OptIn(ExperimentalWearFoundationApi::class)

package com.google.android.horologist.compose.layout

import androidx.compose.foundation.MutatePriority
import androidx.compose.foundation.gestures.FlingBehavior
import androidx.compose.foundation.gestures.ScrollScope
import androidx.compose.foundation.gestures.ScrollableDefaults
import androidx.compose.foundation.gestures.ScrollableState
Expand All @@ -34,17 +32,15 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.unit.dp
import androidx.wear.compose.foundation.ExperimentalWearFoundationApi
import androidx.wear.compose.foundation.lazy.AutoCenteringParams
import androidx.wear.compose.foundation.lazy.ScalingLazyColumn
import androidx.wear.compose.foundation.lazy.ScalingLazyColumnDefaults.snapFlingBehavior
import androidx.wear.compose.foundation.lazy.ScalingLazyListAnchorType
import androidx.wear.compose.foundation.lazy.ScalingLazyListScope
import androidx.wear.compose.foundation.lazy.ScalingLazyListState
import androidx.wear.compose.foundation.lazy.ScalingParams
import androidx.wear.compose.foundation.rememberActiveFocusRequester
import androidx.wear.compose.foundation.rotary.RotaryDefaults.scrollBehavior
import androidx.wear.compose.foundation.rotary.RotaryDefaults.snapBehavior
import androidx.wear.compose.foundation.rotary.rotary
import com.google.android.horologist.annotations.ExperimentalHorologistApi
import com.google.android.horologist.compose.layout.ScalingLazyColumnDefaults.responsiveScalingParams
import com.google.android.horologist.compose.layout.ScalingLazyColumnState.RotaryMode
Expand All @@ -71,7 +67,6 @@ public class ScalingLazyColumnState(
alignment = if (!reverseLayout) Alignment.Top else Alignment.Bottom,
),
public val horizontalAlignment: Alignment.Horizontal = Alignment.CenterHorizontally,
public val flingBehavior: FlingBehavior? = null,
public val userScrollEnabled: Boolean = true,
public val scalingParams: ScalingParams = WearScalingLazyColumnDefaults.scalingParams(),
public val hapticsEnabled: Boolean = true,
Expand Down Expand Up @@ -200,44 +195,37 @@ public fun ScalingLazyColumn(
modifier: Modifier = Modifier,
content: ScalingLazyListScope.() -> Unit,
) {
val focusRequester = rememberActiveFocusRequester()
val (rotaryBehavior, flingBehavior) = when (columnState.rotaryMode) {
RotaryMode.Snap -> Pair(
snapBehavior(
state = columnState.state,
hapticFeedbackEnabled = columnState.hapticsEnabled,
),
snapFlingBehavior(state = columnState.state),
)

@Suppress("DEPRECATION")
val modifierWithRotary = when (columnState.rotaryMode) {
RotaryMode.Snap -> modifier.rotary(
rotaryBehavior = scrollBehavior(
else -> Pair(
scrollBehavior(
scrollableState = columnState.state,
hapticFeedbackEnabled = columnState.hapticsEnabled,
),
focusRequester = focusRequester,
reverseDirection = columnState.reverseLayout,
ScrollableDefaults.flingBehavior(),
)

RotaryMode.Scroll ->
modifier.rotary(
rotaryBehavior = snapBehavior(
state = columnState.state,
hapticFeedbackEnabled = columnState.hapticsEnabled,
),
focusRequester = focusRequester,
reverseDirection = columnState.reverseLayout,
)

else -> modifier
}

ScalingLazyColumn(
modifier = modifierWithRotary.fillMaxSize(),
modifier = modifier.fillMaxSize(),
state = columnState.state,
contentPadding = columnState.contentPadding,
reverseLayout = columnState.reverseLayout,
verticalArrangement = columnState.verticalArrangement,
horizontalAlignment = columnState.horizontalAlignment,
flingBehavior = columnState.flingBehavior ?: ScrollableDefaults.flingBehavior(),
flingBehavior = flingBehavior,
userScrollEnabled = columnState.userScrollEnabled,
scalingParams = columnState.scalingParams,
anchorType = columnState.anchorType,
autoCentering = columnState.autoCentering,
rotaryBehavior = rotaryBehavior,
content = content,
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,14 @@
* limitations under the License.
*/

@file:Suppress("ObjectLiteralToLambda", "DEPRECATION")
@file:Suppress("ObjectLiteralToLambda")

package com.google.android.horologist.media.ui.screens.browse

import androidx.wear.compose.foundation.lazy.ScalingLazyColumnDefaults.scalingParams
import androidx.wear.compose.foundation.lazy.ScalingParams
import com.google.android.horologist.compose.layout.ScalingLazyColumnDefaults
import com.google.android.horologist.compose.layout.ScalingLazyColumnState
import com.google.android.horologist.compose.layout.rememberResponsiveColumnState
import com.google.android.horologist.media.ui.PlayerLibraryPreview
import com.google.android.horologist.screenshots.rng.WearLegacyA11yTest
import org.junit.Test
Expand All @@ -37,14 +38,12 @@ class PlaylistDownloadBrowseScreenA11yTallScreenshotTest : WearLegacyA11yTest()
val screenState = BrowseScreenState.Loaded(downloadList)

runScreenTest {
val scalingParams =
androidx.wear.compose.foundation.lazy.ScalingLazyColumnDefaults.scalingParams(
val columnState: ScalingLazyColumnState = rememberResponsiveColumnState().copy(
scalingParams = scalingParams(
edgeScale = 1f,
edgeAlpha = 1f,
)
val columnState: ScalingLazyColumnState =
ScalingLazyColumnDefaults.responsive().create()
.copy(scalingParams = scalingParams)
),
)

PlayerLibraryPreview(columnState = columnState, round = false) {
PlaylistDownloadBrowseScreen(
Expand All @@ -70,7 +69,6 @@ public fun ScalingLazyColumnState.copy(scalingParams: ScalingParams): ScalingLaz
reverseLayout,
verticalArrangement,
horizontalAlignment,
flingBehavior,
userScrollEnabled,
scalingParams,
)

0 comments on commit 59bca15

Please sign in to comment.