Skip to content

Commit 26a103c

Browse files
authored
Merge pull request android#444 from android/beta03
[All] Update to Compose 1.0.0-beta03
2 parents f7796b2 + 8324723 commit 26a103c

File tree

49 files changed

+114
-313
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+114
-313
lines changed

Crane/app/src/main/java/androidx/compose/samples/crane/base/ExploreSection.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ import androidx.compose.ui.graphics.Color
4747
import androidx.compose.ui.layout.ContentScale
4848
import androidx.compose.ui.res.painterResource
4949
import androidx.compose.ui.unit.dp
50-
import dev.chrisbanes.accompanist.coil.CoilImage
50+
import com.google.accompanist.coil.CoilImage
5151

5252
@Composable
5353
fun ExploreSection(

Crane/buildSrc/src/main/java/com/example/crane/buildsrc/Dependencies.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ object Versions {
2121
}
2222

2323
object Libs {
24-
const val androidGradlePlugin = "com.android.tools.build:gradle:7.0.0-alpha09"
24+
const val androidGradlePlugin = "com.android.tools.build:gradle:7.0.0-alpha10"
2525
const val ktLint = "com.pinterest:ktlint:${Versions.ktLint}"
2626

2727
object GoogleMaps {
@@ -30,8 +30,8 @@ object Libs {
3030
}
3131

3232
object Accompanist {
33-
private const val version = "0.6.2"
34-
const val coil = "dev.chrisbanes.accompanist:accompanist-coil:$version"
33+
private const val version = "0.7.0"
34+
const val coil = "com.google.accompanist:accompanist-coil:$version"
3535
}
3636

3737
object Kotlin {
@@ -49,14 +49,14 @@ object Libs {
4949

5050
object AndroidX {
5151
object Activity {
52-
const val activityCompose = "androidx.activity:activity-compose:1.3.0-alpha04"
52+
const val activityCompose = "androidx.activity:activity-compose:1.3.0-alpha05"
5353
}
5454

5555
const val appcompat = "androidx.appcompat:appcompat:1.3.0-beta01"
5656

5757
object Compose {
5858
const val snapshot = ""
59-
private const val version = "1.0.0-beta02"
59+
private const val version = "1.0.0-beta03"
6060

6161
const val runtime = "androidx.compose.runtime:runtime:$version"
6262
const val runtimeLivedata = "androidx.compose.runtime:runtime-livedata:$version"

JetNews/app/src/main/java/com/example/jetnews/ui/theme/Theme.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ private val DarkThemeColors = darkColors(
3838
primaryVariant = Red700,
3939
onPrimary = Color.Black,
4040
secondary = Red300,
41-
onSecondary = Color.White,
41+
onSecondary = Color.Black,
4242
error = Red200
4343
)
4444

JetNews/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
buildscript {
1818
ext.kotlin_version = '1.4.31'
19-
ext.compose_version = '1.0.0-beta02'
19+
ext.compose_version = '1.0.0-beta03'
2020
ext.coroutines_version = '1.4.2'
2121

2222
repositories {
@@ -25,7 +25,7 @@ buildscript {
2525
}
2626

2727
dependencies {
28-
classpath 'com.android.tools.build:gradle:7.0.0-alpha09'
28+
classpath 'com.android.tools.build:gradle:7.0.0-alpha10'
2929
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
3030
}
3131
}

Jetcaster/app/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ dependencies {
112112
implementation Libs.AndroidX.Lifecycle.viewModelCompose
113113

114114
implementation Libs.Accompanist.coil
115-
115+
implementation Libs.Accompanist.pager
116116
implementation Libs.Accompanist.insets
117117

118118
implementation Libs.OkHttp.okhttp

Jetcaster/app/src/main/java/com/example/jetcaster/ui/MainActivity.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import androidx.activity.ComponentActivity
2121
import androidx.activity.compose.setContent
2222
import androidx.core.view.WindowCompat
2323
import com.example.jetcaster.ui.theme.JetcasterTheme
24-
import dev.chrisbanes.accompanist.insets.ProvideWindowInsets
24+
import com.google.accompanist.insets.ProvideWindowInsets
2525

2626
class MainActivity : ComponentActivity() {
2727
override fun onCreate(savedInstanceState: Bundle?) {

Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/Home.kt

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@ import androidx.compose.runtime.CompositionLocalProvider
5151
import androidx.compose.runtime.LaunchedEffect
5252
import androidx.compose.runtime.collectAsState
5353
import androidx.compose.runtime.getValue
54-
import androidx.compose.runtime.remember
5554
import androidx.compose.ui.Alignment
5655
import androidx.compose.ui.Modifier
5756
import androidx.compose.ui.draw.clip
@@ -69,15 +68,17 @@ import com.example.jetcaster.ui.home.discover.Discover
6968
import com.example.jetcaster.ui.theme.JetcasterTheme
7069
import com.example.jetcaster.ui.theme.Keyline1
7170
import com.example.jetcaster.util.DynamicThemePrimaryColorsFromImage
72-
import com.example.jetcaster.util.Pager
73-
import com.example.jetcaster.util.PagerState
7471
import com.example.jetcaster.util.ToggleFollowPodcastIconButton
7572
import com.example.jetcaster.util.constrastAgainst
7673
import com.example.jetcaster.util.quantityStringResource
7774
import com.example.jetcaster.util.rememberDominantColorState
7875
import com.example.jetcaster.util.verticalGradientScrim
79-
import dev.chrisbanes.accompanist.coil.CoilImage
80-
import dev.chrisbanes.accompanist.insets.statusBarsHeight
76+
import com.google.accompanist.coil.CoilImage
77+
import com.google.accompanist.insets.statusBarsHeight
78+
import com.google.accompanist.pager.ExperimentalPagerApi
79+
import com.google.accompanist.pager.HorizontalPager
80+
import com.google.accompanist.pager.PagerState
81+
import com.google.accompanist.pager.rememberPagerState
8182
import java.time.Duration
8283
import java.time.LocalDateTime
8384
import java.time.OffsetDateTime
@@ -154,6 +155,7 @@ fun HomeAppBar(
154155
*/
155156
private const val MinConstastOfPrimaryVsSurface = 3f
156157

158+
@OptIn(ExperimentalPagerApi::class) // HorizontalPager is experimental
157159
@Composable
158160
fun HomeContent(
159161
featuredPodcasts: List<PodcastWithExtraInfo>,
@@ -175,8 +177,7 @@ fun HomeContent(
175177
}
176178

177179
DynamicThemePrimaryColorsFromImage(dominantColorState) {
178-
179-
val pagerState = remember { PagerState() }
180+
val pagerState = rememberPagerState(pageCount = featuredPodcasts.size)
180181

181182
val selectedImageUrl = featuredPodcasts.getOrNull(pagerState.currentPage)
182183
?.podcast?.imageUrl
@@ -309,19 +310,18 @@ fun HomeCategoryTabIndicator(
309310
)
310311
}
311312

313+
@ExperimentalPagerApi // HorizontalPager is experimental
312314
@Composable
313315
fun FollowedPodcasts(
314316
items: List<PodcastWithExtraInfo>,
317+
pagerState: PagerState,
315318
modifier: Modifier = Modifier,
316-
pagerState: PagerState = remember { PagerState() },
317319
onPodcastUnfollowed: (String) -> Unit,
318320
) {
319-
pagerState.maxPage = (items.size - 1).coerceAtLeast(0)
320-
321-
Pager(
321+
HorizontalPager(
322322
state = pagerState,
323323
modifier = modifier
324-
) {
324+
) { page ->
325325
val (podcast, lastEpisodeDate) = items[page]
326326
FollowedPodcastCarouselItem(
327327
podcastImageUrl = podcast.imageUrl,

Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/category/PodcastCategory.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ import com.example.jetcaster.ui.theme.JetcasterTheme
7474
import com.example.jetcaster.ui.theme.Keyline1
7575
import com.example.jetcaster.util.ToggleFollowPodcastIconButton
7676
import com.example.jetcaster.util.viewModelProviderFactoryOf
77-
import dev.chrisbanes.accompanist.coil.CoilImage
77+
import com.google.accompanist.coil.CoilImage
7878
import java.time.format.DateTimeFormatter
7979
import java.time.format.FormatStyle
8080

Jetcaster/app/src/main/java/com/example/jetcaster/util/Pager.kt

Lines changed: 1 addition & 209 deletions
Original file line numberDiff line numberDiff line change
@@ -14,216 +14,8 @@
1414
* limitations under the License.
1515
*/
1616

17-
@file:Suppress("unused")
18-
1917
package com.example.jetcaster.util
2018

21-
import androidx.compose.animation.core.Animatable
22-
import androidx.compose.foundation.gestures.Orientation
23-
import androidx.compose.foundation.gestures.draggable
24-
import androidx.compose.foundation.gestures.rememberDraggableState
25-
import androidx.compose.foundation.layout.Box
26-
import androidx.compose.runtime.Composable
27-
import androidx.compose.runtime.Immutable
28-
import androidx.compose.runtime.getValue
29-
import androidx.compose.runtime.key
30-
import androidx.compose.runtime.mutableStateOf
31-
import androidx.compose.runtime.remember
32-
import androidx.compose.runtime.rememberCoroutineScope
33-
import androidx.compose.runtime.setValue
34-
import androidx.compose.runtime.structuralEqualityPolicy
35-
import androidx.compose.ui.Alignment
36-
import androidx.compose.ui.Modifier
37-
import androidx.compose.ui.layout.Layout
38-
import androidx.compose.ui.layout.Measurable
39-
import androidx.compose.ui.layout.ParentDataModifier
40-
import androidx.compose.ui.unit.Density
41-
import kotlinx.coroutines.launch
42-
import kotlin.math.roundToInt
43-
4419
/**
45-
* This is a modified version of:
46-
* https://gist.github.com/adamp/07d468f4bcfe632670f305ce3734f511
20+
* Pager is now a library! https://google.github.io/accompanist/pager/
4721
*/
48-
49-
class PagerState(
50-
currentPage: Int = 0,
51-
minPage: Int = 0,
52-
maxPage: Int = 0
53-
) {
54-
private var _minPage by mutableStateOf(minPage)
55-
var minPage: Int
56-
get() = _minPage
57-
set(value) {
58-
_minPage = value.coerceAtMost(_maxPage)
59-
_currentPage = _currentPage.coerceIn(_minPage, _maxPage)
60-
}
61-
62-
private var _maxPage by mutableStateOf(maxPage, structuralEqualityPolicy())
63-
var maxPage: Int
64-
get() = _maxPage
65-
set(value) {
66-
_maxPage = value.coerceAtLeast(_minPage)
67-
_currentPage = _currentPage.coerceIn(_minPage, maxPage)
68-
}
69-
70-
private var _currentPage by mutableStateOf(currentPage.coerceIn(minPage, maxPage))
71-
var currentPage: Int
72-
get() = _currentPage
73-
set(value) {
74-
_currentPage = value.coerceIn(minPage, maxPage)
75-
}
76-
77-
enum class SelectionState { Selected, Undecided }
78-
79-
var selectionState by mutableStateOf(SelectionState.Selected)
80-
81-
suspend inline fun <R> selectPage(block: PagerState.() -> R): R = try {
82-
selectionState = SelectionState.Undecided
83-
block()
84-
} finally {
85-
selectPage()
86-
}
87-
88-
suspend fun selectPage() {
89-
currentPage -= currentPageOffset.roundToInt()
90-
snapToOffset(0f)
91-
selectionState = SelectionState.Selected
92-
}
93-
94-
private var _currentPageOffset = Animatable(0f).apply {
95-
updateBounds(-1f, 1f)
96-
}
97-
val currentPageOffset: Float
98-
get() = _currentPageOffset.value
99-
100-
suspend fun snapToOffset(offset: Float) {
101-
val max = if (currentPage == minPage) 0f else 1f
102-
val min = if (currentPage == maxPage) 0f else -1f
103-
_currentPageOffset.snapTo(offset.coerceIn(min, max))
104-
}
105-
106-
suspend fun fling(velocity: Float) {
107-
if (velocity < 0 && currentPage == maxPage) return
108-
if (velocity > 0 && currentPage == minPage) return
109-
110-
_currentPageOffset.animateTo(currentPageOffset.roundToInt().toFloat())
111-
selectPage()
112-
}
113-
114-
override fun toString(): String = "PagerState{minPage=$minPage, maxPage=$maxPage, " +
115-
"currentPage=$currentPage, currentPageOffset=$currentPageOffset}"
116-
}
117-
118-
@Immutable
119-
private data class PageData(val page: Int) : ParentDataModifier {
120-
override fun Density.modifyParentData(parentData: Any?): Any = this@PageData
121-
}
122-
123-
private val Measurable.page: Int
124-
get() = (parentData as? PageData)?.page ?: error("no PageData for measurable $this")
125-
126-
@Composable
127-
fun Pager(
128-
state: PagerState,
129-
modifier: Modifier = Modifier,
130-
offscreenLimit: Int = 2,
131-
pageContent: @Composable PagerScope.() -> Unit
132-
) {
133-
var pageSize by remember { mutableStateOf(0) }
134-
val coroutineScope = rememberCoroutineScope()
135-
Layout(
136-
content = {
137-
val minPage = (state.currentPage - offscreenLimit).coerceAtLeast(state.minPage)
138-
val maxPage = (state.currentPage + offscreenLimit).coerceAtMost(state.maxPage)
139-
140-
for (page in minPage..maxPage) {
141-
val pageData = PageData(page)
142-
val scope = PagerScope(state, page)
143-
key(pageData) {
144-
Box(contentAlignment = Alignment.Center, modifier = pageData) {
145-
scope.pageContent()
146-
}
147-
}
148-
}
149-
},
150-
modifier = modifier.draggable(
151-
orientation = Orientation.Horizontal,
152-
onDragStarted = {
153-
state.selectionState = PagerState.SelectionState.Undecided
154-
},
155-
onDragStopped = { velocity ->
156-
coroutineScope.launch {
157-
// Velocity is in pixels per second, but we deal in percentage offsets, so we
158-
// need to scale the velocity to match
159-
state.fling(velocity / pageSize)
160-
}
161-
},
162-
state = rememberDraggableState { dy ->
163-
coroutineScope.launch {
164-
with(state) {
165-
val pos = pageSize * currentPageOffset
166-
val max = if (currentPage == minPage) 0 else pageSize * offscreenLimit
167-
val min = if (currentPage == maxPage) 0 else -pageSize * offscreenLimit
168-
val newPos = (pos + dy).coerceIn(min.toFloat(), max.toFloat())
169-
snapToOffset(newPos / pageSize)
170-
}
171-
}
172-
},
173-
)
174-
) { measurables, constraints ->
175-
layout(constraints.maxWidth, constraints.maxHeight) {
176-
val currentPage = state.currentPage
177-
val offset = state.currentPageOffset
178-
val childConstraints = constraints.copy(minWidth = 0, minHeight = 0)
179-
180-
measurables
181-
.map {
182-
it.measure(childConstraints) to it.page
183-
}
184-
.forEach { (placeable, page) ->
185-
// TODO: current this centers each page. We should investigate reading
186-
// gravity modifiers on the child, or maybe as a param to Pager.
187-
val xCenterOffset = (constraints.maxWidth - placeable.width) / 2
188-
val yCenterOffset = (constraints.maxHeight - placeable.height) / 2
189-
190-
if (currentPage == page) {
191-
pageSize = placeable.width
192-
}
193-
194-
val xItemOffset = ((page + offset - currentPage) * placeable.width).roundToInt()
195-
196-
placeable.place(
197-
x = xCenterOffset + xItemOffset,
198-
y = yCenterOffset
199-
)
200-
}
201-
}
202-
}
203-
}
204-
205-
/**
206-
* Scope for [Pager] content.
207-
*/
208-
class PagerScope(
209-
private val state: PagerState,
210-
val page: Int
211-
) {
212-
/**
213-
* Returns the current selected page
214-
*/
215-
val currentPage: Int
216-
get() = state.currentPage
217-
218-
/**
219-
* Returns the current selected page offset
220-
*/
221-
val currentPageOffset: Float
222-
get() = state.currentPageOffset
223-
224-
/**
225-
* Returns the current selection state
226-
*/
227-
val selectionState: PagerState.SelectionState
228-
get() = state.selectionState
229-
}

Jetcaster/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ subprojects {
4242
// Jetpack Compose SNAPSHOTs
4343
if (!Libs.AndroidX.Compose.snapshot.isEmpty()) {
4444
maven { url "https://androidx.dev/snapshots/builds/${Libs.AndroidX.Compose.snapshot}/artifacts/repository/" }
45+
maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' }
4546
}
4647
}
4748

0 commit comments

Comments
 (0)