From d15fe9340432525d75258e8a117467adbd1ab046 Mon Sep 17 00:00:00 2001 From: Jolanda Verhoef Date: Thu, 10 Dec 2020 16:56:06 +0100 Subject: [PATCH 1/6] [Jetnews] Update to snapshot 7024175 --- .../main/java/com/example/jetnews/ui/SwipeToRefresh.kt | 7 ++++++- .../src/main/java/com/example/jetnews/ui/theme/Theme.kt | 4 ---- JetNews/build.gradle | 8 ++++++-- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/JetNews/app/src/main/java/com/example/jetnews/ui/SwipeToRefresh.kt b/JetNews/app/src/main/java/com/example/jetnews/ui/SwipeToRefresh.kt index ff0a30199b..1b89edad2b 100644 --- a/JetNews/app/src/main/java/com/example/jetnews/ui/SwipeToRefresh.kt +++ b/JetNews/app/src/main/java/com/example/jetnews/ui/SwipeToRefresh.kt @@ -28,7 +28,9 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.gesture.scrollorientationlocking.Orientation import androidx.compose.ui.platform.AmbientDensity +import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.dp +import kotlin.math.roundToInt private val RefreshDistance = 80.dp @@ -59,7 +61,10 @@ fun SwipeToRefreshLayout( ) ) { content() - Box(Modifier.align(Alignment.TopCenter).offset(y = { state.offset.value })) { + Box(Modifier + .align(Alignment.TopCenter) + .offset { IntOffset(0, state.offset.value.roundToInt()) } + ) { if (state.offset.value != -refreshDistance) { refreshIndicator() } diff --git a/JetNews/app/src/main/java/com/example/jetnews/ui/theme/Theme.kt b/JetNews/app/src/main/java/com/example/jetnews/ui/theme/Theme.kt index 00bd9a7463..5ebcd0c944 100644 --- a/JetNews/app/src/main/java/com/example/jetnews/ui/theme/Theme.kt +++ b/JetNews/app/src/main/java/com/example/jetnews/ui/theme/Theme.kt @@ -43,10 +43,6 @@ private val DarkThemeColors = darkColors( error = Red200 ) -@Composable -val Colors.snackbarAction: Color - get() = if (isLight) Red300 else Red700 - @Composable fun JetnewsTheme( darkTheme: Boolean = isSystemInDarkTheme(), diff --git a/JetNews/build.gradle b/JetNews/build.gradle index 4e82506134..d8d6470253 100644 --- a/JetNews/build.gradle +++ b/JetNews/build.gradle @@ -16,8 +16,8 @@ buildscript { ext.kotlin_version = '1.4.20' - ext.compose_version = '1.0.0-alpha08' - ext.coroutines_version = '1.4.1' + ext.compose_version = '1.0.0-SNAPSHOT' + ext.coroutines_version = '1.4.2' repositories { google() @@ -36,6 +36,10 @@ plugins { subprojects { repositories { + maven { + def snapshot = "7024175" + url "https://androidx.dev/snapshots/builds/$snapshot/artifacts/repository/" + } google() jcenter() } From b6abae4b9e1a8e968b68e90c434d53ea2ae3089d Mon Sep 17 00:00:00 2001 From: Jolanda Verhoef Date: Mon, 14 Dec 2020 09:07:48 +0100 Subject: [PATCH 2/6] [Jetnews] Update to snapshot 7030654 --- JetNews/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/JetNews/build.gradle b/JetNews/build.gradle index d8d6470253..6bf26d750d 100644 --- a/JetNews/build.gradle +++ b/JetNews/build.gradle @@ -15,7 +15,7 @@ */ buildscript { - ext.kotlin_version = '1.4.20' + ext.kotlin_version = '1.4.21' ext.compose_version = '1.0.0-SNAPSHOT' ext.coroutines_version = '1.4.2' @@ -37,7 +37,7 @@ plugins { subprojects { repositories { maven { - def snapshot = "7024175" + def snapshot = "7030654" url "https://androidx.dev/snapshots/builds/$snapshot/artifacts/repository/" } google() From 741b5ada2e3445faec8d8247dc9d7ad93f8f94ff Mon Sep 17 00:00:00 2001 From: Jolanda Verhoef Date: Mon, 14 Dec 2020 09:32:42 +0100 Subject: [PATCH 3/6] [Jetnews] Apply spotless fixes --- .../src/main/java/com/example/jetnews/ui/SwipeToRefresh.kt | 7 ++++--- .../src/main/java/com/example/jetnews/ui/theme/Theme.kt | 1 - 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/JetNews/app/src/main/java/com/example/jetnews/ui/SwipeToRefresh.kt b/JetNews/app/src/main/java/com/example/jetnews/ui/SwipeToRefresh.kt index 1b89edad2b..2ddcee56ff 100644 --- a/JetNews/app/src/main/java/com/example/jetnews/ui/SwipeToRefresh.kt +++ b/JetNews/app/src/main/java/com/example/jetnews/ui/SwipeToRefresh.kt @@ -61,9 +61,10 @@ fun SwipeToRefreshLayout( ) ) { content() - Box(Modifier - .align(Alignment.TopCenter) - .offset { IntOffset(0, state.offset.value.roundToInt()) } + Box( + Modifier + .align(Alignment.TopCenter) + .offset { IntOffset(0, state.offset.value.roundToInt()) } ) { if (state.offset.value != -refreshDistance) { refreshIndicator() diff --git a/JetNews/app/src/main/java/com/example/jetnews/ui/theme/Theme.kt b/JetNews/app/src/main/java/com/example/jetnews/ui/theme/Theme.kt index 5ebcd0c944..0cf964ffb9 100644 --- a/JetNews/app/src/main/java/com/example/jetnews/ui/theme/Theme.kt +++ b/JetNews/app/src/main/java/com/example/jetnews/ui/theme/Theme.kt @@ -17,7 +17,6 @@ package com.example.jetnews.ui.theme import androidx.compose.foundation.isSystemInDarkTheme -import androidx.compose.material.Colors import androidx.compose.material.MaterialTheme import androidx.compose.material.darkColors import androidx.compose.material.lightColors From 17c6687f7e6cb4b27f2a5f8c9f8a660b94e3e32e Mon Sep 17 00:00:00 2001 From: Jolanda Verhoef Date: Tue, 15 Dec 2020 08:43:42 +0100 Subject: [PATCH 4/6] [Jetnews] Fix swipe to refresh using nested scrolling --- .../com/example/jetnews/ui/SwipeToRefresh.kt | 80 ++++++++++++++++--- 1 file changed, 71 insertions(+), 9 deletions(-) diff --git a/JetNews/app/src/main/java/com/example/jetnews/ui/SwipeToRefresh.kt b/JetNews/app/src/main/java/com/example/jetnews/ui/SwipeToRefresh.kt index 2ddcee56ff..34f7d35998 100644 --- a/JetNews/app/src/main/java/com/example/jetnews/ui/SwipeToRefresh.kt +++ b/JetNews/app/src/main/java/com/example/jetnews/ui/SwipeToRefresh.kt @@ -20,15 +20,21 @@ import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.offset import androidx.compose.material.ExperimentalMaterialApi import androidx.compose.material.FractionalThreshold +import androidx.compose.material.SwipeableState import androidx.compose.material.rememberSwipeableState import androidx.compose.material.swipeable import androidx.compose.runtime.Composable import androidx.compose.runtime.onCommit import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.gesture.nestedscroll.NestedScrollConnection +import androidx.compose.ui.gesture.nestedscroll.NestedScrollSource +import androidx.compose.ui.gesture.nestedscroll.nestedScroll import androidx.compose.ui.gesture.scrollorientationlocking.Orientation import androidx.compose.ui.platform.AmbientDensity import androidx.compose.ui.unit.IntOffset +import androidx.compose.ui.unit.Velocity import androidx.compose.ui.unit.dp import kotlin.math.roundToInt @@ -50,15 +56,17 @@ fun SwipeToRefreshLayout( } Box( - modifier = Modifier.swipeable( - state = state, - anchors = mapOf( - -refreshDistance to false, - refreshDistance to true - ), - thresholds = { _, _ -> FractionalThreshold(0.5f) }, - orientation = Orientation.Vertical - ) + modifier = Modifier + .nestedScroll(state.PreUpPostDownNestedScrollConnection) + .swipeable( + state = state, + anchors = mapOf( + -refreshDistance to false, + refreshDistance to true + ), + thresholds = { _, _ -> FractionalThreshold(0.5f) }, + orientation = Orientation.Vertical + ) ) { content() Box( @@ -79,3 +87,57 @@ fun SwipeToRefreshLayout( } } } + +/** + * Temporary workaround for nested scrolling behavior. See b/174756744 + */ +@ExperimentalMaterialApi +private val SwipeableState.PreUpPostDownNestedScrollConnection: NestedScrollConnection + get() = object : NestedScrollConnection { + override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset { + val delta = available.toFloat() + return if (delta < 0 && source == NestedScrollSource.Drag) { + performDrag(delta).toOffset() + } else { + Offset.Zero + } + } + + override fun onPostScroll( + consumed: Offset, + available: Offset, + source: NestedScrollSource + ): Offset { + return if (source == NestedScrollSource.Drag) { + performDrag(available.toFloat()).toOffset() + } else { + Offset.Zero + } + } + + override fun onPreFling(available: Velocity): Velocity { + val toFling = available.pixelsPerSecond.toFloat() + return if (toFling < 0) { + performFling(velocity = toFling) {} + // since we go to the anchor with tween settling, consume all for the best UX + available + } else { + Velocity.Zero + } + } + + override fun onPostFling( + consumed: Velocity, + available: Velocity, + onFinished: (Velocity) -> Unit + ) { + performFling(velocity = available.pixelsPerSecond.toFloat()) { + // since we go to the anchor with tween settling, consume all for the best UX + onFinished.invoke(available) + } + } + + private fun Float.toOffset(): Offset = Offset(0f, this) + + private fun Offset.toFloat(): Float = this.y + } From 9325b2b8ce23240ce69e7963c3a2e12228fb3a2f Mon Sep 17 00:00:00 2001 From: Jolanda Verhoef Date: Tue, 15 Dec 2020 10:19:25 +0100 Subject: [PATCH 5/6] [Jetnews] Upgrade to snapshot 7033025 --- JetNews/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/JetNews/build.gradle b/JetNews/build.gradle index 6bf26d750d..7ec8539e59 100644 --- a/JetNews/build.gradle +++ b/JetNews/build.gradle @@ -37,7 +37,7 @@ plugins { subprojects { repositories { maven { - def snapshot = "7030654" + def snapshot = "7033025" url "https://androidx.dev/snapshots/builds/$snapshot/artifacts/repository/" } google() From 8faa6b778977a0b061a87657af48d08676a71f2e Mon Sep 17 00:00:00 2001 From: Jolanda Verhoef Date: Tue, 15 Dec 2020 11:51:03 +0100 Subject: [PATCH 6/6] [Jetnews] Explain workaround for swipe to refresh --- .../app/src/main/java/com/example/jetnews/ui/SwipeToRefresh.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/JetNews/app/src/main/java/com/example/jetnews/ui/SwipeToRefresh.kt b/JetNews/app/src/main/java/com/example/jetnews/ui/SwipeToRefresh.kt index 34f7d35998..3bf09254ed 100644 --- a/JetNews/app/src/main/java/com/example/jetnews/ui/SwipeToRefresh.kt +++ b/JetNews/app/src/main/java/com/example/jetnews/ui/SwipeToRefresh.kt @@ -89,7 +89,8 @@ fun SwipeToRefreshLayout( } /** - * Temporary workaround for nested scrolling behavior. See b/174756744 + * Temporary workaround for nested scrolling behavior. There is no default implementation for + * pull to refresh yet, this nested scroll connection mimics the behavior. */ @ExperimentalMaterialApi private val SwipeableState.PreUpPostDownNestedScrollConnection: NestedScrollConnection