From 6e7fa5bc0265d3b85bdc4b8be667ab9f026b0f2c Mon Sep 17 00:00:00 2001 From: Jolanda Verhoef Date: Mon, 15 Feb 2021 13:50:10 +0100 Subject: [PATCH 01/37] [Jetnews] Upgrade to snapshot 7141639 --- JetNews/app/build.gradle | 14 ++++----- .../example/jetnews/HomeScreenSnackbarTest.kt | 2 +- .../java/com/example/jetnews/ui/AppDrawer.kt | 10 +++---- .../com/example/jetnews/ui/SwipeToRefresh.kt | 30 +++++++++---------- .../jetnews/ui/article/ArticleScreen.kt | 6 ++-- .../example/jetnews/ui/article/PostContent.kt | 30 +++++++++---------- .../com/example/jetnews/ui/home/HomeScreen.kt | 12 ++++---- .../example/jetnews/ui/home/PostCardTop.kt | 8 ++--- .../jetnews/ui/home/PostCardYourNetwork.kt | 8 ++--- .../com/example/jetnews/ui/home/PostCards.kt | 12 ++++---- .../jetnews/ui/interests/InterestsScreen.kt | 11 +++---- .../jetnews/ui/interests/SelectTopicButton.kt | 4 +-- JetNews/build.gradle | 8 +++-- 13 files changed, 79 insertions(+), 76 deletions(-) diff --git a/JetNews/app/build.gradle b/JetNews/app/build.gradle index 9878c7eeb3..7c2e070eff 100644 --- a/JetNews/app/build.gradle +++ b/JetNews/app/build.gradle @@ -91,18 +91,14 @@ dependencies { implementation "androidx.compose.runtime:runtime-livedata:$compose_version" implementation 'androidx.appcompat:appcompat:1.3.0-beta01' - implementation 'androidx.activity:activity-ktx:1.1.0' + implementation 'androidx.activity:activity-ktx:1.2.0' implementation 'androidx.core:core-ktx:1.5.0-beta01' - implementation "androidx.activity:activity-compose:1.3.0-alpha02" + implementation "androidx.activity:activity-compose:1.3.0-SNAPSHOT" - implementation "androidx.lifecycle:lifecycle-viewmodel-savedstate:2.3.0-rc01" - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.0-rc01" - implementation "androidx.lifecycle:lifecycle-viewmodel-compose:1.0.0-alpha01" + implementation "androidx.lifecycle:lifecycle-viewmodel-savedstate:2.3.0" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.0" + implementation "androidx.lifecycle:lifecycle-viewmodel-compose:1.0.0-SNAPSHOT" - // FIXME: only needed for Compose alpha12 - androidTestImplementation "androidx.activity:activity-compose:1.3.0-alpha02" - - androidTestImplementation 'junit:junit:4.13.1' androidTestImplementation 'androidx.test:rules:1.3.0' androidTestImplementation 'androidx.test:runner:1.3.0' androidTestImplementation "androidx.compose.ui:ui-test:$compose_version" diff --git a/JetNews/app/src/androidTest/java/com/example/jetnews/HomeScreenSnackbarTest.kt b/JetNews/app/src/androidTest/java/com/example/jetnews/HomeScreenSnackbarTest.kt index 38e5f767a4..a810711b44 100644 --- a/JetNews/app/src/androidTest/java/com/example/jetnews/HomeScreenSnackbarTest.kt +++ b/JetNews/app/src/androidTest/java/com/example/jetnews/HomeScreenSnackbarTest.kt @@ -20,7 +20,7 @@ import androidx.compose.material.ExperimentalMaterialApi import androidx.compose.material.SnackbarHostState import androidx.compose.material.rememberScaffoldState import androidx.compose.runtime.ExperimentalComposeApi -import androidx.compose.runtime.snapshots.snapshotFlow +import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.junit4.createComposeRule import androidx.compose.ui.test.onNodeWithText diff --git a/JetNews/app/src/main/java/com/example/jetnews/ui/AppDrawer.kt b/JetNews/app/src/main/java/com/example/jetnews/ui/AppDrawer.kt index 9b44720182..c0686367c4 100644 --- a/JetNews/app/src/main/java/com/example/jetnews/ui/AppDrawer.kt +++ b/JetNews/app/src/main/java/com/example/jetnews/ui/AppDrawer.kt @@ -23,9 +23,9 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredHeight -import androidx.compose.foundation.layout.preferredWidth +import androidx.compose.foundation.layout.width import androidx.compose.material.Divider import androidx.compose.material.MaterialTheme import androidx.compose.material.Surface @@ -53,7 +53,7 @@ fun AppDrawer( closeDrawer: () -> Unit ) { Column(modifier = Modifier.fillMaxSize()) { - Spacer(Modifier.preferredHeight(24.dp)) + Spacer(Modifier.height(24.dp)) JetNewsLogo(Modifier.padding(16.dp)) Divider(color = MaterialTheme.colors.onSurface.copy(alpha = .2f)) DrawerButton( @@ -86,7 +86,7 @@ private fun JetNewsLogo(modifier: Modifier = Modifier) { contentDescription = null, // decorative colorFilter = ColorFilter.tint(MaterialTheme.colors.primary) ) - Spacer(Modifier.preferredWidth(8.dp)) + Spacer(Modifier.width(8.dp)) Image( painter = painterResource(R.drawable.ic_jetnews_wordmark), contentDescription = stringResource(R.string.app_name), @@ -143,7 +143,7 @@ private fun DrawerButton( colorFilter = ColorFilter.tint(textIconColor), alpha = imageAlpha ) - Spacer(Modifier.preferredWidth(16.dp)) + Spacer(Modifier.width(16.dp)) Text( text = label, style = MaterialTheme.typography.body2, 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 4e31daf503..8b2bfaa83a 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 @@ -16,6 +16,7 @@ package com.example.jetnews.ui +import androidx.compose.foundation.gestures.Orientation import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.offset import androidx.compose.material.ExperimentalMaterialApi @@ -25,17 +26,18 @@ import androidx.compose.material.rememberSwipeableState import androidx.compose.material.swipeable import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.rememberCoroutineScope 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.input.nestedscroll.NestedScrollConnection +import androidx.compose.ui.input.nestedscroll.NestedScrollSource +import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.Velocity import androidx.compose.ui.unit.dp +import kotlinx.coroutines.launch import kotlin.math.roundToInt private val RefreshDistance = 80.dp @@ -68,6 +70,7 @@ fun SwipeToRefreshLayout( orientation = Orientation.Vertical ) ) { + val scope = rememberCoroutineScope() content() Box( Modifier @@ -83,7 +86,7 @@ fun SwipeToRefreshLayout( // workaround for a bug in the SwipableState API. Currently, state.value is a duplicated // source of truth of refreshingState. DisposableEffect(refreshingState) { - state.animateTo(refreshingState) + scope.launch { state.animateTo(refreshingState) } onDispose {} } } @@ -117,10 +120,10 @@ private val SwipeableState.PreUpPostDownNestedScrollConnection: NestedScr } } - override fun onPreFling(available: Velocity): Velocity { + override suspend fun onPreFling(available: Velocity): Velocity { val toFling = Offset(available.x, available.y).toFloat() return if (toFling < 0) { - performFling(velocity = toFling) {} + performFling(velocity = toFling) // since we go to the anchor with tween settling, consume all for the best UX available } else { @@ -128,15 +131,12 @@ private val SwipeableState.PreUpPostDownNestedScrollConnection: NestedScr } } - override fun onPostFling( + override suspend fun onPostFling( consumed: Velocity, - available: Velocity, - onFinished: (Velocity) -> Unit - ) { - performFling(velocity = Offset(available.x, available.y).toFloat()) { - // since we go to the anchor with tween settling, consume all for the best UX - onFinished.invoke(available) - } + available: Velocity + ): Velocity { + performFling(velocity = Offset(available.x, available.y).toFloat()) + return Velocity.Zero } private fun Float.toOffset(): Offset = Offset(0f, this) diff --git a/JetNews/app/src/main/java/com/example/jetnews/ui/article/ArticleScreen.kt b/JetNews/app/src/main/java/com/example/jetnews/ui/article/ArticleScreen.kt index a710faf5a0..c1ecbc55e9 100644 --- a/JetNews/app/src/main/java/com/example/jetnews/ui/article/ArticleScreen.kt +++ b/JetNews/app/src/main/java/com/example/jetnews/ui/article/ArticleScreen.kt @@ -21,8 +21,8 @@ import android.content.Intent import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredHeight import androidx.compose.material.AlertDialog import androidx.compose.material.Icon import androidx.compose.material.IconButton @@ -144,7 +144,7 @@ fun ArticleScreen( } ) }, - bodyContent = { innerPadding -> + content = { innerPadding -> val modifier = Modifier.padding(innerPadding) PostContent(post, modifier) }, @@ -178,7 +178,7 @@ private fun BottomBar( Row( verticalAlignment = Alignment.CenterVertically, modifier = Modifier - .preferredHeight(56.dp) + .height(56.dp) .fillMaxWidth() ) { IconButton(onClick = onUnimplementedAction) { diff --git a/JetNews/app/src/main/java/com/example/jetnews/ui/article/PostContent.kt b/JetNews/app/src/main/java/com/example/jetnews/ui/article/PostContent.kt index ff55842cc9..cd19c71ed3 100644 --- a/JetNews/app/src/main/java/com/example/jetnews/ui/article/PostContent.kt +++ b/JetNews/app/src/main/java/com/example/jetnews/ui/article/PostContent.kt @@ -23,11 +23,11 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredHeight -import androidx.compose.foundation.layout.preferredSize -import androidx.compose.foundation.layout.preferredWidth +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.foundation.shape.CircleShape @@ -42,7 +42,7 @@ import androidx.compose.material.Typography import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.AccountCircle import androidx.compose.runtime.Composable -import androidx.compose.runtime.Providers +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color @@ -82,34 +82,34 @@ fun PostContent(post: Post, modifier: Modifier = Modifier) { modifier = modifier.padding(horizontal = defaultSpacerSize) ) { item { - Spacer(Modifier.preferredHeight(defaultSpacerSize)) + Spacer(Modifier.height(defaultSpacerSize)) PostHeaderImage(post) } item { Text(text = post.title, style = MaterialTheme.typography.h4) - Spacer(Modifier.preferredHeight(8.dp)) + Spacer(Modifier.height(8.dp)) } post.subtitle?.let { subtitle -> item { - Providers(LocalContentAlpha provides ContentAlpha.medium) { + CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) { Text( text = subtitle, style = MaterialTheme.typography.body2, lineHeight = 20.sp ) } - Spacer(Modifier.preferredHeight(defaultSpacerSize)) + Spacer(Modifier.height(defaultSpacerSize)) } } item { PostMetadata(post.metadata) - Spacer(Modifier.preferredHeight(24.dp)) + Spacer(Modifier.height(24.dp)) } items(post.paragraphs) { Paragraph(paragraph = it) } item { - Spacer(Modifier.preferredHeight(48.dp)) + Spacer(Modifier.height(48.dp)) } } } @@ -126,7 +126,7 @@ private fun PostHeaderImage(post: Post) { modifier = imageModifier, contentScale = ContentScale.Crop ) - Spacer(Modifier.preferredHeight(defaultSpacerSize)) + Spacer(Modifier.height(defaultSpacerSize)) } @Composable @@ -139,11 +139,11 @@ private fun PostMetadata(metadata: Metadata) { Image( imageVector = Icons.Filled.AccountCircle, contentDescription = null, // decorative - modifier = Modifier.preferredSize(40.dp), + modifier = Modifier.size(40.dp), colorFilter = ColorFilter.tint(LocalContentColor.current), contentScale = ContentScale.Fit ) - Spacer(Modifier.preferredWidth(8.dp)) + Spacer(Modifier.width(8.dp)) Column { Text( text = metadata.author.name, @@ -151,7 +151,7 @@ private fun PostMetadata(metadata: Metadata) { modifier = Modifier.padding(top = 4.dp) ) - Providers(LocalContentAlpha provides ContentAlpha.medium) { + CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) { Text( text = "${metadata.date} • ${metadata.readTimeMinutes} min read", style = typography.caption @@ -228,7 +228,7 @@ private fun BulletParagraph( // this box is acting as a character, so it's sized with font scaling (sp) Box( modifier = Modifier - .preferredSize(8.sp.toDp(), 8.sp.toDp()) + .size(8.sp.toDp(), 8.sp.toDp()) .alignBy { // Add an alignment "baseline" 1sp below the bottom of the circle 9.sp.roundToPx() diff --git a/JetNews/app/src/main/java/com/example/jetnews/ui/home/HomeScreen.kt b/JetNews/app/src/main/java/com/example/jetnews/ui/home/HomeScreen.kt index 662147035e..f6dee53c3d 100644 --- a/JetNews/app/src/main/java/com/example/jetnews/ui/home/HomeScreen.kt +++ b/JetNews/app/src/main/java/com/example/jetnews/ui/home/HomeScreen.kt @@ -21,7 +21,7 @@ import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredSize +import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyRow @@ -133,6 +133,8 @@ fun HomeScreen( navigateTo: (Screen) -> Unit, scaffoldState: ScaffoldState ) { + val scope = rememberCoroutineScope() + if (posts.hasError) { val errorMessage = stringResource(id = R.string.load_error) val retryMessage = stringResource(id = R.string.retry) @@ -162,7 +164,7 @@ fun HomeScreen( drawerContent = { AppDrawer( currentScreen = Screen.Home, - closeDrawer = { scaffoldState.drawerState.close() }, + closeDrawer = { scope.launch { scaffoldState.drawerState.close() } }, navigateTo = navigateTo ) }, @@ -171,7 +173,7 @@ fun HomeScreen( TopAppBar( title = { Text(text = title) }, navigationIcon = { - IconButton(onClick = { scaffoldState.drawerState.open() }) { + IconButton(onClick = { scope.launch { scaffoldState.drawerState.open() } }) { Icon( painter = painterResource(R.drawable.ic_jetnews_logo), contentDescription = stringResource(R.string.cd_open_navigation_drawer) @@ -180,7 +182,7 @@ fun HomeScreen( } ) }, - bodyContent = { innerPadding -> + content = { innerPadding -> val modifier = Modifier.padding(innerPadding) LoadingContent( empty = posts.initialLoad, @@ -231,7 +233,7 @@ private fun LoadingContent( Surface(elevation = 10.dp, shape = CircleShape) { CircularProgressIndicator( modifier = Modifier - .preferredSize(36.dp) + .size(36.dp) .padding(4.dp) ) } diff --git a/JetNews/app/src/main/java/com/example/jetnews/ui/home/PostCardTop.kt b/JetNews/app/src/main/java/com/example/jetnews/ui/home/PostCardTop.kt index 0a3f06adcd..0d4fae6640 100644 --- a/JetNews/app/src/main/java/com/example/jetnews/ui/home/PostCardTop.kt +++ b/JetNews/app/src/main/java/com/example/jetnews/ui/home/PostCardTop.kt @@ -20,15 +20,15 @@ import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredHeight import androidx.compose.material.ContentAlpha import androidx.compose.material.LocalContentAlpha import androidx.compose.material.MaterialTheme import androidx.compose.material.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.Providers +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.layout.ContentScale @@ -55,7 +55,7 @@ fun PostCardTop(post: Post, modifier: Modifier = Modifier) { modifier = imageModifier, contentScale = ContentScale.Crop ) - Spacer(Modifier.preferredHeight(16.dp)) + Spacer(Modifier.height(16.dp)) Text( text = post.title, @@ -66,7 +66,7 @@ fun PostCardTop(post: Post, modifier: Modifier = Modifier) { style = typography.body2 ) - Providers(LocalContentAlpha provides ContentAlpha.medium) { + CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) { Text( text = "${post.metadata.date} - ${post.metadata.readTimeMinutes} min read", style = typography.body2 diff --git a/JetNews/app/src/main/java/com/example/jetnews/ui/home/PostCardYourNetwork.kt b/JetNews/app/src/main/java/com/example/jetnews/ui/home/PostCardYourNetwork.kt index 4dbc5e12c7..78ba06b2a6 100644 --- a/JetNews/app/src/main/java/com/example/jetnews/ui/home/PostCardYourNetwork.kt +++ b/JetNews/app/src/main/java/com/example/jetnews/ui/home/PostCardYourNetwork.kt @@ -20,9 +20,9 @@ import androidx.compose.foundation.Image import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredHeight -import androidx.compose.foundation.layout.preferredSize +import androidx.compose.foundation.layout.size import androidx.compose.material.Card import androidx.compose.material.MaterialTheme import androidx.compose.material.Text @@ -47,7 +47,7 @@ fun PostCardPopular( ) { Card( shape = MaterialTheme.shapes.medium, - modifier = modifier.preferredSize(280.dp, 240.dp) + modifier = modifier.size(280.dp, 240.dp) ) { Column(modifier = Modifier.clickable(onClick = { navigateTo(Screen.Article(post.id)) })) { @@ -56,7 +56,7 @@ fun PostCardPopular( contentDescription = null, // decorative contentScale = ContentScale.Crop, modifier = Modifier - .preferredHeight(100.dp) + .height(100.dp) .fillMaxWidth() ) diff --git a/JetNews/app/src/main/java/com/example/jetnews/ui/home/PostCards.kt b/JetNews/app/src/main/java/com/example/jetnews/ui/home/PostCards.kt index a8cc9d18b3..d4792ba4cc 100644 --- a/JetNews/app/src/main/java/com/example/jetnews/ui/home/PostCards.kt +++ b/JetNews/app/src/main/java/com/example/jetnews/ui/home/PostCards.kt @@ -21,7 +21,7 @@ import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredSize +import androidx.compose.foundation.layout.size import androidx.compose.material.ContentAlpha import androidx.compose.material.Icon import androidx.compose.material.IconToggleButton @@ -34,7 +34,7 @@ import androidx.compose.material.icons.filled.Bookmark import androidx.compose.material.icons.filled.BookmarkBorder import androidx.compose.material.icons.filled.MoreVert import androidx.compose.runtime.Composable -import androidx.compose.runtime.Providers +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.res.painterResource @@ -58,7 +58,7 @@ fun AuthorAndReadTime( modifier: Modifier = Modifier ) { Row(modifier) { - Providers(LocalContentAlpha provides ContentAlpha.medium) { + CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) { val textStyle = MaterialTheme.typography.body2 Text( text = post.metadata.author.name, @@ -78,7 +78,7 @@ fun PostImage(post: Post, modifier: Modifier = Modifier) { painter = painterResource(post.imageThumbId), contentDescription = null, // decorative modifier = modifier - .preferredSize(40.dp, 40.dp) + .size(40.dp, 40.dp) .clip(MaterialTheme.shapes.small) ) } @@ -138,7 +138,7 @@ fun PostCardHistory(post: Post, navigateTo: (Screen) -> Unit) { modifier = Modifier.padding(end = 16.dp) ) Column(Modifier.weight(1f)) { - Providers(LocalContentAlpha provides ContentAlpha.medium) { + CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) { Text( text = "BASED ON YOUR HISTORY", style = MaterialTheme.typography.overline @@ -150,7 +150,7 @@ fun PostCardHistory(post: Post, navigateTo: (Screen) -> Unit) { modifier = Modifier.padding(top = 4.dp) ) } - Providers(LocalContentAlpha provides ContentAlpha.medium) { + CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) { Icon( imageVector = Icons.Filled.MoreVert, contentDescription = stringResource(R.string.cd_more_actions) diff --git a/JetNews/app/src/main/java/com/example/jetnews/ui/interests/InterestsScreen.kt b/JetNews/app/src/main/java/com/example/jetnews/ui/interests/InterestsScreen.kt index b6117bbc35..d00f3f1303 100644 --- a/JetNews/app/src/main/java/com/example/jetnews/ui/interests/InterestsScreen.kt +++ b/JetNews/app/src/main/java/com/example/jetnews/ui/interests/InterestsScreen.kt @@ -22,7 +22,7 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredSize +import androidx.compose.foundation.layout.size import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.foundation.selection.toggleable @@ -170,12 +170,13 @@ fun InterestsScreen( navigateTo: (Screen) -> Unit, scaffoldState: ScaffoldState, ) { + val scope = rememberCoroutineScope() Scaffold( scaffoldState = scaffoldState, drawerContent = { AppDrawer( currentScreen = Screen.Interests, - closeDrawer = { scaffoldState.drawerState.close() }, + closeDrawer = { scope.launch { scaffoldState.drawerState.close() } }, navigateTo = navigateTo ) }, @@ -183,7 +184,7 @@ fun InterestsScreen( TopAppBar( title = { Text("Interests") }, navigationIcon = { - IconButton(onClick = { scaffoldState.drawerState.open() }) { + IconButton(onClick = { scope.launch { scaffoldState.drawerState.open() } }) { Icon( painter = painterResource(R.drawable.ic_jetnews_logo), contentDescription = stringResource(R.string.cd_open_navigation_drawer) @@ -192,7 +193,7 @@ fun InterestsScreen( } ) }, - bodyContent = { + content = { TabContent(tab, onTabChange, tabContent) } ) @@ -360,7 +361,7 @@ private fun TopicItem(itemTitle: String, selected: Boolean, onToggle: () -> Unit contentDescription = null, // decorative modifier = Modifier .align(Alignment.CenterVertically) - .preferredSize(56.dp, 56.dp) + .size(56.dp, 56.dp) .clip(RoundedCornerShape(4.dp)) ) Text( diff --git a/JetNews/app/src/main/java/com/example/jetnews/ui/interests/SelectTopicButton.kt b/JetNews/app/src/main/java/com/example/jetnews/ui/interests/SelectTopicButton.kt index fcc711529b..f96529b646 100644 --- a/JetNews/app/src/main/java/com/example/jetnews/ui/interests/SelectTopicButton.kt +++ b/JetNews/app/src/main/java/com/example/jetnews/ui/interests/SelectTopicButton.kt @@ -17,7 +17,7 @@ package com.example.jetnews.ui.interests import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredSize +import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.CircleShape import androidx.compose.material.Icon import androidx.compose.material.MaterialTheme @@ -45,7 +45,7 @@ fun SelectTopicButton( Surface( color = backgroundColor, shape = CircleShape, - modifier = modifier.preferredSize(36.dp, 36.dp) + modifier = modifier.size(36.dp, 36.dp) ) { Icon( imageVector = icon, diff --git a/JetNews/build.gradle b/JetNews/build.gradle index f71010f0b1..9dedc23814 100644 --- a/JetNews/build.gradle +++ b/JetNews/build.gradle @@ -16,7 +16,7 @@ buildscript { ext.kotlin_version = '1.4.30' - ext.compose_version = '1.0.0-alpha12' + ext.compose_version = '1.0.0-SNAPSHOT' ext.coroutines_version = '1.4.2' repositories { @@ -25,7 +25,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:7.0.0-alpha05' + classpath 'com.android.tools.build:gradle:7.0.0-alpha06' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } @@ -36,6 +36,10 @@ plugins { subprojects { repositories { + maven { + def snapshot = "7141639" + url "https://androidx.dev/snapshots/builds/$snapshot/artifacts/repository/" + } google() jcenter() } From 7b9a5ad89b8671c310508125ec8ba8ec2c3b1051 Mon Sep 17 00:00:00 2001 From: Jolanda Verhoef Date: Tue, 16 Feb 2021 11:42:38 +0100 Subject: [PATCH 02/37] [Rally] Upgrade to snapshot 7141639 --- Rally/app/build.gradle | 5 ----- .../compose/rally/AnimatingCircleTests.kt | 4 ++-- .../compose/rally/ui/components/CommonUi.kt | 22 +++++++++---------- .../rally/ui/components/DetailsScreen.kt | 6 ++--- .../compose/rally/ui/components/TopAppBar.kt | 19 ++++++++-------- .../rally/ui/overview/OverviewScreen.kt | 10 ++++----- .../compose/rally/buildsrc/dependencies.kt | 14 +++++------- 7 files changed, 37 insertions(+), 43 deletions(-) diff --git a/Rally/app/build.gradle b/Rally/app/build.gradle index 594d9226f4..57b7d8350d 100644 --- a/Rally/app/build.gradle +++ b/Rally/app/build.gradle @@ -105,14 +105,9 @@ dependencies { implementation Libs.AndroidX.Compose.runtime implementation Libs.AndroidX.Compose.runtimeLivedata - // FIXME: only needed for Compose alpha12 - androidTestImplementation Libs.AndroidX.Activity.activityCompose - - androidTestImplementation Libs.junit androidTestImplementation Libs.AndroidX.Test.core androidTestImplementation Libs.AndroidX.Test.espressoCore androidTestImplementation Libs.AndroidX.Test.rules - androidTestImplementation Libs.AndroidX.Test.Ext.junit androidTestImplementation Libs.AndroidX.Compose.test androidTestImplementation Libs.AndroidX.Compose.uiTest } diff --git a/Rally/app/src/androidTest/java/com/example/compose/rally/AnimatingCircleTests.kt b/Rally/app/src/androidTest/java/com/example/compose/rally/AnimatingCircleTests.kt index fb41b8032b..971b4984b3 100644 --- a/Rally/app/src/androidTest/java/com/example/compose/rally/AnimatingCircleTests.kt +++ b/Rally/app/src/androidTest/java/com/example/compose/rally/AnimatingCircleTests.kt @@ -18,7 +18,7 @@ package com.example.compose.rally import android.os.Build import androidx.compose.foundation.background -import androidx.compose.foundation.layout.preferredSize +import androidx.compose.foundation.layout.size import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.test.ExperimentalTestApi @@ -93,7 +93,7 @@ class AnimatingCircleTests { composeTestRule.setContent { RallyTheme { AnimatedCircle( - modifier = Modifier.background(Color.White).preferredSize(320.dp), + modifier = Modifier.background(Color.White).size(320.dp), proportions = listOf(0.25f, 0.5f, 0.25f), colors = listOf(Color.Red, Color.DarkGray, Color.Black) ) diff --git a/Rally/app/src/main/java/com/example/compose/rally/ui/components/CommonUi.kt b/Rally/app/src/main/java/com/example/compose/rally/ui/components/CommonUi.kt index e5199d4a60..a9738e219b 100644 --- a/Rally/app/src/main/java/com/example/compose/rally/ui/components/CommonUi.kt +++ b/Rally/app/src/main/java/com/example/compose/rally/ui/components/CommonUi.kt @@ -22,9 +22,9 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredHeight -import androidx.compose.foundation.layout.preferredSize -import androidx.compose.foundation.layout.preferredWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width import androidx.compose.material.ContentAlpha import androidx.compose.material.Divider import androidx.compose.material.Icon @@ -34,7 +34,7 @@ import androidx.compose.material.Text import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ChevronRight import androidx.compose.runtime.Composable -import androidx.compose.runtime.Providers +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -80,7 +80,7 @@ private fun BaseRow( negative: Boolean ) { Row( - modifier = Modifier.preferredHeight(68.dp), + modifier = Modifier.height(68.dp), verticalAlignment = Alignment.CenterVertically ) { val typography = MaterialTheme.typography @@ -88,10 +88,10 @@ private fun BaseRow( color = color, modifier = Modifier ) - Spacer(Modifier.preferredWidth(12.dp)) + Spacer(Modifier.width(12.dp)) Column(Modifier) { Text(text = title, style = typography.body1) - Providers(LocalContentAlpha provides ContentAlpha.medium) { + CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) { Text(text = subtitle, style = typography.subtitle1) } } @@ -112,15 +112,15 @@ private fun BaseRow( modifier = Modifier.align(Alignment.CenterVertically) ) } - Spacer(Modifier.preferredWidth(16.dp)) + Spacer(Modifier.width(16.dp)) - Providers(LocalContentAlpha provides ContentAlpha.medium) { + CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) { Icon( imageVector = Icons.Filled.ChevronRight, contentDescription = null, modifier = Modifier .padding(end = 12.dp) - .preferredSize(24.dp) + .size(24.dp) ) } } @@ -132,7 +132,7 @@ private fun BaseRow( */ @Composable private fun AccountIndicator(color: Color, modifier: Modifier = Modifier) { - Spacer(modifier.preferredSize(4.dp, 36.dp).background(color = color)) + Spacer(modifier.size(4.dp, 36.dp).background(color = color)) } @Composable diff --git a/Rally/app/src/main/java/com/example/compose/rally/ui/components/DetailsScreen.kt b/Rally/app/src/main/java/com/example/compose/rally/ui/components/DetailsScreen.kt index dde0ce6af0..f6c0a35674 100644 --- a/Rally/app/src/main/java/com/example/compose/rally/ui/components/DetailsScreen.kt +++ b/Rally/app/src/main/java/com/example/compose/rally/ui/components/DetailsScreen.kt @@ -21,7 +21,7 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredHeight +import androidx.compose.foundation.layout.height import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material.Card @@ -53,7 +53,7 @@ fun StatementBody( accountsProportion, circleColors, Modifier - .preferredHeight(300.dp) + .height(300.dp) .align(Alignment.Center) .fillMaxWidth() ) @@ -70,7 +70,7 @@ fun StatementBody( ) } } - Spacer(Modifier.preferredHeight(10.dp)) + Spacer(Modifier.height(10.dp)) Card { Column(modifier = Modifier.padding(12.dp)) { items.forEach { item -> diff --git a/Rally/app/src/main/java/com/example/compose/rally/ui/components/TopAppBar.kt b/Rally/app/src/main/java/com/example/compose/rally/ui/components/TopAppBar.kt index 55bd3d79cf..30734089cd 100644 --- a/Rally/app/src/main/java/com/example/compose/rally/ui/components/TopAppBar.kt +++ b/Rally/app/src/main/java/com/example/compose/rally/ui/components/TopAppBar.kt @@ -20,13 +20,13 @@ import androidx.compose.animation.animateColorAsState import androidx.compose.animation.animateContentSize import androidx.compose.animation.core.LinearEasing import androidx.compose.animation.core.tween -import androidx.compose.foundation.InteractionState +import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredHeight -import androidx.compose.foundation.layout.preferredWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.width import androidx.compose.foundation.selection.selectable import androidx.compose.material.Icon import androidx.compose.material.MaterialTheme @@ -42,6 +42,7 @@ import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import com.example.compose.rally.RallyScreen +import java.util.* @Composable fun RallyTopAppBar( @@ -51,13 +52,13 @@ fun RallyTopAppBar( ) { Surface( Modifier - .preferredHeight(TabHeight) + .height(TabHeight) .fillMaxWidth() ) { - Row { + Row() { allScreens.forEach { screen -> RallyTab( - text = screen.name.toUpperCase(), + text = screen.name.toUpperCase(Locale.getDefault()), icon = screen.icon, onSelected = { onTabSelected(screen) }, selected = currentScreen == screen @@ -91,11 +92,11 @@ private fun RallyTab( modifier = Modifier .padding(16.dp) .animateContentSize() - .preferredHeight(TabHeight) + .height(TabHeight) .selectable( selected = selected, onClick = onSelected, - interactionState = remember { InteractionState() }, + interactionSource = remember { MutableInteractionSource() }, indication = rememberRipple( bounded = false, radius = Dp.Unspecified, @@ -105,7 +106,7 @@ private fun RallyTab( ) { Icon(imageVector = icon, contentDescription = null, tint = tabTintColor) if (selected) { - Spacer(Modifier.preferredWidth(12.dp)) + Spacer(Modifier.width(12.dp)) Text(text, color = tabTintColor) } } diff --git a/Rally/app/src/main/java/com/example/compose/rally/ui/overview/OverviewScreen.kt b/Rally/app/src/main/java/com/example/compose/rally/ui/overview/OverviewScreen.kt index 7609b2f403..10c552acae 100644 --- a/Rally/app/src/main/java/com/example/compose/rally/ui/overview/OverviewScreen.kt +++ b/Rally/app/src/main/java/com/example/compose/rally/ui/overview/OverviewScreen.kt @@ -24,7 +24,7 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredHeight +import androidx.compose.foundation.layout.height import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material.Card @@ -62,9 +62,9 @@ fun OverviewBody(onScreenChange: (RallyScreen) -> Unit = {}) { .verticalScroll(rememberScrollState()) ) { AlertCard() - Spacer(Modifier.preferredHeight(RallyDefaultPadding)) + Spacer(Modifier.height(RallyDefaultPadding)) AccountsCard(onScreenChange) - Spacer(Modifier.preferredHeight(RallyDefaultPadding)) + Spacer(Modifier.height(RallyDefaultPadding)) BillsCard(onScreenChange) } } @@ -187,7 +187,7 @@ private fun OverViewDivider( Spacer( modifier = Modifier .weight(values(item)) - .preferredHeight(1.dp) + .height(1.dp) .background(colors(item)) ) } @@ -247,7 +247,7 @@ private fun SeeAllButton(onClick: () -> Unit) { TextButton( onClick = onClick, modifier = Modifier - .preferredHeight(44.dp) + .height(44.dp) .fillMaxWidth() ) { Text(stringResource(R.string.see_all)) diff --git a/Rally/buildSrc/src/main/java/com/example/compose/rally/buildsrc/dependencies.kt b/Rally/buildSrc/src/main/java/com/example/compose/rally/buildsrc/dependencies.kt index 4ff44a53aa..10cae51879 100644 --- a/Rally/buildSrc/src/main/java/com/example/compose/rally/buildsrc/dependencies.kt +++ b/Rally/buildSrc/src/main/java/com/example/compose/rally/buildsrc/dependencies.kt @@ -21,11 +21,9 @@ object Versions { } object Libs { - const val androidGradlePlugin = "com.android.tools.build:gradle:7.0.0-alpha05" + const val androidGradlePlugin = "com.android.tools.build:gradle:7.0.0-alpha06" const val jdkDesugar = "com.android.tools:desugar_jdk_libs:1.0.9" - const val junit = "junit:junit:4.13" - const val material = "com.google.android.material:material:1.1.0" object Kotlin { @@ -36,7 +34,7 @@ object Libs { } object Coroutines { - private const val version = "1.4.1" + private const val version = "1.4.2" const val core = "org.jetbrains.kotlinx:kotlinx-coroutines-core:$version" const val android = "org.jetbrains.kotlinx:kotlinx-coroutines-android:$version" const val test = "org.jetbrains.kotlinx:kotlinx-coroutines-test:$version" @@ -47,12 +45,12 @@ object Libs { const val coreKtx = "androidx.core:core-ktx:1.5.0-alpha02" object Activity { - const val activityCompose = "androidx.activity:activity-compose:1.3.0-alpha02" + const val activityCompose = "androidx.activity:activity-compose:1.3.0-SNAPSHOT" } object Compose { - const val snapshot = "" - const val version = "1.0.0-alpha12" + const val snapshot = "7141639" + const val version = "1.0.0-SNAPSHOT" const val core = "androidx.compose.ui:ui:$version" const val foundation = "androidx.compose.foundation:foundation:$version" @@ -67,7 +65,7 @@ object Libs { } object Lifecycle { - private const val version = "2.2.0" + private const val version = "2.3.0" const val extensions = "androidx.lifecycle:lifecycle-extensions:$version" const val livedata = "androidx.lifecycle:lifecycle-livedata-ktx:$version" const val viewmodel = "androidx.lifecycle:lifecycle-viewmodel-ktx:$version" From f804e329901f0b86cde3244340a9a9c1555e9d6d Mon Sep 17 00:00:00 2001 From: Jolanda Verhoef Date: Tue, 16 Feb 2021 11:49:40 +0100 Subject: [PATCH 03/37] [Rally] Run spotlessApply --- .../java/com/example/compose/rally/ui/components/CommonUi.kt | 2 +- .../com/example/compose/rally/ui/components/DetailsScreen.kt | 2 +- .../java/com/example/compose/rally/ui/components/TopAppBar.kt | 4 ++-- .../com/example/compose/rally/ui/overview/OverviewScreen.kt | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Rally/app/src/main/java/com/example/compose/rally/ui/components/CommonUi.kt b/Rally/app/src/main/java/com/example/compose/rally/ui/components/CommonUi.kt index a9738e219b..94589a691d 100644 --- a/Rally/app/src/main/java/com/example/compose/rally/ui/components/CommonUi.kt +++ b/Rally/app/src/main/java/com/example/compose/rally/ui/components/CommonUi.kt @@ -21,8 +21,8 @@ import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.material.ContentAlpha diff --git a/Rally/app/src/main/java/com/example/compose/rally/ui/components/DetailsScreen.kt b/Rally/app/src/main/java/com/example/compose/rally/ui/components/DetailsScreen.kt index f6c0a35674..3c3694b4eb 100644 --- a/Rally/app/src/main/java/com/example/compose/rally/ui/components/DetailsScreen.kt +++ b/Rally/app/src/main/java/com/example/compose/rally/ui/components/DetailsScreen.kt @@ -20,8 +20,8 @@ import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material.Card diff --git a/Rally/app/src/main/java/com/example/compose/rally/ui/components/TopAppBar.kt b/Rally/app/src/main/java/com/example/compose/rally/ui/components/TopAppBar.kt index 30734089cd..e8fa693a29 100644 --- a/Rally/app/src/main/java/com/example/compose/rally/ui/components/TopAppBar.kt +++ b/Rally/app/src/main/java/com/example/compose/rally/ui/components/TopAppBar.kt @@ -24,8 +24,8 @@ import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width import androidx.compose.foundation.selection.selectable import androidx.compose.material.Icon @@ -42,7 +42,7 @@ import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import com.example.compose.rally.RallyScreen -import java.util.* +import java.util.Locale @Composable fun RallyTopAppBar( diff --git a/Rally/app/src/main/java/com/example/compose/rally/ui/overview/OverviewScreen.kt b/Rally/app/src/main/java/com/example/compose/rally/ui/overview/OverviewScreen.kt index 10c552acae..926061959e 100644 --- a/Rally/app/src/main/java/com/example/compose/rally/ui/overview/OverviewScreen.kt +++ b/Rally/app/src/main/java/com/example/compose/rally/ui/overview/OverviewScreen.kt @@ -23,8 +23,8 @@ import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material.Card From 18ee035506a40837cc4b685314ff672e202607cb Mon Sep 17 00:00:00 2001 From: Jolanda Verhoef Date: Tue, 16 Feb 2021 12:16:41 +0100 Subject: [PATCH 04/37] [Rally] Use selectableGroup to indicate that topAppBar tabs are part of a group --- .../com/example/compose/rally/ui/components/TopAppBar.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Rally/app/src/main/java/com/example/compose/rally/ui/components/TopAppBar.kt b/Rally/app/src/main/java/com/example/compose/rally/ui/components/TopAppBar.kt index e8fa693a29..346fab06f1 100644 --- a/Rally/app/src/main/java/com/example/compose/rally/ui/components/TopAppBar.kt +++ b/Rally/app/src/main/java/com/example/compose/rally/ui/components/TopAppBar.kt @@ -28,6 +28,7 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width import androidx.compose.foundation.selection.selectable +import androidx.compose.foundation.selection.selectableGroup import androidx.compose.material.Icon import androidx.compose.material.MaterialTheme import androidx.compose.material.Surface @@ -42,7 +43,6 @@ import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import com.example.compose.rally.RallyScreen -import java.util.Locale @Composable fun RallyTopAppBar( @@ -55,10 +55,10 @@ fun RallyTopAppBar( .height(TabHeight) .fillMaxWidth() ) { - Row() { + Row(Modifier.selectableGroup()) { allScreens.forEach { screen -> RallyTab( - text = screen.name.toUpperCase(Locale.getDefault()), + text = screen.name.toUpperCase(), icon = screen.icon, onSelected = { onTabSelected(screen) }, selected = currentScreen == screen From e1432b80b0b786b6732a18fe64a01a13ab5cb171 Mon Sep 17 00:00:00 2001 From: Jolanda Verhoef Date: Tue, 16 Feb 2021 13:53:19 +0100 Subject: [PATCH 05/37] [Jetnews] Fix review comments --- .../main/java/com/example/jetnews/ui/SwipeToRefresh.kt | 10 ++-------- .../java/com/example/jetnews/ui/home/HomeScreen.kt | 7 +++---- .../example/jetnews/ui/interests/InterestsScreen.kt | 6 +++--- 3 files changed, 8 insertions(+), 15 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 8b2bfaa83a..a7941ede7c 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 @@ -25,8 +25,7 @@ import androidx.compose.material.SwipeableState import androidx.compose.material.rememberSwipeableState import androidx.compose.material.swipeable import androidx.compose.runtime.Composable -import androidx.compose.runtime.DisposableEffect -import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Offset @@ -37,7 +36,6 @@ import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.Velocity import androidx.compose.ui.unit.dp -import kotlinx.coroutines.launch import kotlin.math.roundToInt private val RefreshDistance = 80.dp @@ -70,7 +68,6 @@ fun SwipeToRefreshLayout( orientation = Orientation.Vertical ) ) { - val scope = rememberCoroutineScope() content() Box( Modifier @@ -85,10 +82,7 @@ fun SwipeToRefreshLayout( // TODO (https://issuetracker.google.com/issues/164113834): This state->event trampoline is a // workaround for a bug in the SwipableState API. Currently, state.value is a duplicated // source of truth of refreshingState. - DisposableEffect(refreshingState) { - scope.launch { state.animateTo(refreshingState) } - onDispose {} - } + LaunchedEffect(refreshingState) { state.animateTo(refreshingState) } } } diff --git a/JetNews/app/src/main/java/com/example/jetnews/ui/home/HomeScreen.kt b/JetNews/app/src/main/java/com/example/jetnews/ui/home/HomeScreen.kt index f6dee53c3d..80c76ffcb7 100644 --- a/JetNews/app/src/main/java/com/example/jetnews/ui/home/HomeScreen.kt +++ b/JetNews/app/src/main/java/com/example/jetnews/ui/home/HomeScreen.kt @@ -133,8 +133,6 @@ fun HomeScreen( navigateTo: (Screen) -> Unit, scaffoldState: ScaffoldState ) { - val scope = rememberCoroutineScope() - if (posts.hasError) { val errorMessage = stringResource(id = R.string.load_error) val retryMessage = stringResource(id = R.string.retry) @@ -159,12 +157,13 @@ fun HomeScreen( } } + val coroutineScope = rememberCoroutineScope() Scaffold( scaffoldState = scaffoldState, drawerContent = { AppDrawer( currentScreen = Screen.Home, - closeDrawer = { scope.launch { scaffoldState.drawerState.close() } }, + closeDrawer = { coroutineScope.launch { scaffoldState.drawerState.close() } }, navigateTo = navigateTo ) }, @@ -173,7 +172,7 @@ fun HomeScreen( TopAppBar( title = { Text(text = title) }, navigationIcon = { - IconButton(onClick = { scope.launch { scaffoldState.drawerState.open() } }) { + IconButton(onClick = { coroutineScope.launch { scaffoldState.drawerState.open() } }) { Icon( painter = painterResource(R.drawable.ic_jetnews_logo), contentDescription = stringResource(R.string.cd_open_navigation_drawer) diff --git a/JetNews/app/src/main/java/com/example/jetnews/ui/interests/InterestsScreen.kt b/JetNews/app/src/main/java/com/example/jetnews/ui/interests/InterestsScreen.kt index d00f3f1303..9210abd9a5 100644 --- a/JetNews/app/src/main/java/com/example/jetnews/ui/interests/InterestsScreen.kt +++ b/JetNews/app/src/main/java/com/example/jetnews/ui/interests/InterestsScreen.kt @@ -170,13 +170,13 @@ fun InterestsScreen( navigateTo: (Screen) -> Unit, scaffoldState: ScaffoldState, ) { - val scope = rememberCoroutineScope() + val coroutineScope = rememberCoroutineScope() Scaffold( scaffoldState = scaffoldState, drawerContent = { AppDrawer( currentScreen = Screen.Interests, - closeDrawer = { scope.launch { scaffoldState.drawerState.close() } }, + closeDrawer = { coroutineScope.launch { scaffoldState.drawerState.close() } }, navigateTo = navigateTo ) }, @@ -184,7 +184,7 @@ fun InterestsScreen( TopAppBar( title = { Text("Interests") }, navigationIcon = { - IconButton(onClick = { scope.launch { scaffoldState.drawerState.open() } }) { + IconButton(onClick = { coroutineScope.launch { scaffoldState.drawerState.open() } }) { Icon( painter = painterResource(R.drawable.ic_jetnews_logo), contentDescription = stringResource(R.string.cd_open_navigation_drawer) From 881c1280ccf7d5e27205abb0b9b7fadf4772130c Mon Sep 17 00:00:00 2001 From: Jolanda Verhoef Date: Tue, 16 Feb 2021 13:15:05 +0100 Subject: [PATCH 06/37] [Rally] Specify content description and role of tabs --- .../com/example/compose/rally/ui/components/TopAppBar.kt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Rally/app/src/main/java/com/example/compose/rally/ui/components/TopAppBar.kt b/Rally/app/src/main/java/com/example/compose/rally/ui/components/TopAppBar.kt index 346fab06f1..e0c09ca355 100644 --- a/Rally/app/src/main/java/com/example/compose/rally/ui/components/TopAppBar.kt +++ b/Rally/app/src/main/java/com/example/compose/rally/ui/components/TopAppBar.kt @@ -40,6 +40,8 @@ import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.semantics.Role +import androidx.compose.ui.semantics.clearAndSetSemantics import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import com.example.compose.rally.RallyScreen @@ -96,6 +98,7 @@ private fun RallyTab( .selectable( selected = selected, onClick = onSelected, + role = Role.Tab, interactionSource = remember { MutableInteractionSource() }, indication = rememberRipple( bounded = false, @@ -104,10 +107,10 @@ private fun RallyTab( ) ) ) { - Icon(imageVector = icon, contentDescription = null, tint = tabTintColor) + Icon(imageVector = icon, contentDescription = text, tint = tabTintColor) if (selected) { Spacer(Modifier.width(12.dp)) - Text(text, color = tabTintColor) + Text(text, color = tabTintColor, modifier = Modifier.clearAndSetSemantics {}) } } } From 43d673a962f7e9de008d0199344345d4ffdd9f0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=20Alc=C3=A9rreca?= Date: Tue, 16 Feb 2021 14:35:42 +0000 Subject: [PATCH 07/37] [Jetchat] Update to snapshot 7141639 --- Jetchat/app/build.gradle | 9 +- .../compose/jetchat/ConversationTest.kt | 4 +- .../example/compose/jetchat/UserInputTest.kt | 4 +- .../example/compose/jetchat/NavActivity.kt | 145 ++++++++++++++---- .../jetchat/components/JetchatDrawer.kt | 22 +-- .../jetchat/components/JetchatScaffold.kt | 2 +- .../jetchat/conversation/BackHandler.kt | 2 +- .../jetchat/conversation/Conversation.kt | 42 +++-- .../conversation/ConversationFragment.kt | 4 +- .../jetchat/conversation/JumpToBottom.kt | 6 +- .../jetchat/conversation/MessageFormatter.kt | 3 +- .../compose/jetchat/conversation/UserInput.kt | 48 ++---- .../compose/jetchat/profile/Profile.kt | 24 +-- .../jetchat/profile/ProfileFragment.kt | 4 +- .../app/src/main/res/layout/content_main.xml | 2 +- .../compose/jetchat/buildsrc/dependencies.kt | 14 +- 16 files changed, 204 insertions(+), 131 deletions(-) diff --git a/Jetchat/app/build.gradle b/Jetchat/app/build.gradle index 1650f8b427..8d4c282f8a 100644 --- a/Jetchat/app/build.gradle +++ b/Jetchat/app/build.gradle @@ -120,7 +120,10 @@ dependencies { androidTestImplementation Libs.AndroidX.Test.Ext.junit androidTestImplementation Libs.AndroidX.Compose.uiTest - // FIXME: Temporary for alpha12 - androidTestImplementation Libs.AndroidX.Activity.activityCompose - + // androidx.test is forcing JUnit, 4.12. This forces it to use 4.13 + configurations.configureEach { + resolutionStrategy { + force Libs.junit + } + } } diff --git a/Jetchat/app/src/androidTest/java/com/example/compose/jetchat/ConversationTest.kt b/Jetchat/app/src/androidTest/java/com/example/compose/jetchat/ConversationTest.kt index 42d22197aa..0b99a75709 100644 --- a/Jetchat/app/src/androidTest/java/com/example/compose/jetchat/ConversationTest.kt +++ b/Jetchat/app/src/androidTest/java/com/example/compose/jetchat/ConversationTest.kt @@ -17,7 +17,7 @@ package com.example.compose.jetchat import androidx.activity.ComponentActivity -import androidx.compose.runtime.Providers +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.collectAsState import androidx.compose.ui.geometry.Offset import androidx.compose.ui.test.assertIsDisplayed @@ -59,7 +59,7 @@ class ConversationTest { // Launch the conversation screen composeTestRule.setContent { val onBackPressedDispatcher = composeTestRule.activity.onBackPressedDispatcher - Providers( + CompositionLocalProvider( LocalBackPressedDispatcher provides onBackPressedDispatcher, LocalWindowInsets provides windowInsets ) { diff --git a/Jetchat/app/src/androidTest/java/com/example/compose/jetchat/UserInputTest.kt b/Jetchat/app/src/androidTest/java/com/example/compose/jetchat/UserInputTest.kt index f98435d1bc..c4fb7946c7 100644 --- a/Jetchat/app/src/androidTest/java/com/example/compose/jetchat/UserInputTest.kt +++ b/Jetchat/app/src/androidTest/java/com/example/compose/jetchat/UserInputTest.kt @@ -17,7 +17,7 @@ package com.example.compose.jetchat import androidx.activity.ComponentActivity -import androidx.compose.runtime.Providers +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.ui.test.SemanticsMatcher import androidx.compose.ui.test.SemanticsNodeInteraction import androidx.compose.ui.test.assertIsDisplayed @@ -64,7 +64,7 @@ class UserInputTest { // Launch the conversation screen val onBackPressedDispatcher = composeTestRule.activity.onBackPressedDispatcher composeTestRule.setContent { - Providers( + CompositionLocalProvider( LocalBackPressedDispatcher provides onBackPressedDispatcher, LocalWindowInsets provides windowInsets, ) { diff --git a/Jetchat/app/src/main/java/com/example/compose/jetchat/NavActivity.kt b/Jetchat/app/src/main/java/com/example/compose/jetchat/NavActivity.kt index 7cd2640fdb..78212007af 100644 --- a/Jetchat/app/src/main/java/com/example/compose/jetchat/NavActivity.kt +++ b/Jetchat/app/src/main/java/com/example/compose/jetchat/NavActivity.kt @@ -17,20 +17,31 @@ package com.example.compose.jetchat import android.os.Bundle +import android.view.LayoutInflater +import android.view.ViewGroup import androidx.activity.compose.setContent import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity import androidx.compose.material.rememberScaffoldState -import androidx.compose.runtime.Providers +import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.livedata.observeAsState +import androidx.compose.runtime.mutableStateListOf import androidx.compose.runtime.remember -import androidx.compose.ui.node.Ref -import androidx.compose.ui.platform.LocalView -import androidx.compose.ui.platform.compositionContext -import androidx.compose.ui.platform.findViewTreeCompositionContext +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.snapshots.SnapshotStateList +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.viewinterop.AndroidViewBinding import androidx.core.os.bundleOf import androidx.core.view.WindowCompat +import androidx.core.view.forEach +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentActivity +import androidx.fragment.app.FragmentContainerView +import androidx.fragment.app.commit +import androidx.fragment.app.findFragment import androidx.navigation.findNavController import androidx.viewbinding.ViewBinding import com.example.compose.jetchat.components.JetchatScaffold @@ -38,6 +49,7 @@ import com.example.compose.jetchat.conversation.BackPressHandler import com.example.compose.jetchat.conversation.LocalBackPressedDispatcher import com.example.compose.jetchat.databinding.ContentMainBinding import dev.chrisbanes.accompanist.insets.ProvideWindowInsets +import kotlinx.coroutines.launch /** * Main activity for the app. @@ -56,20 +68,28 @@ class NavActivity : AppCompatActivity() { // Provide WindowInsets to our content. We don't want to consume them, so that // they keep being pass down the view hierarchy (since we're using fragments). ProvideWindowInsets(consumeWindowInsets = false) { - Providers(LocalBackPressedDispatcher provides this.onBackPressedDispatcher) { + CompositionLocalProvider( + LocalBackPressedDispatcher provides this.onBackPressedDispatcher + ) { val scaffoldState = rememberScaffoldState() + val scope = rememberCoroutineScope() val openDrawerEvent = viewModel.drawerShouldBeOpened.observeAsState() if (openDrawerEvent.value == true) { // Open drawer and reset state in VM. - scaffoldState.drawerState.open { + scope.launch { + scaffoldState.drawerState.open() viewModel.resetOpenDrawerAction() } } // Intercepts back navigation when the drawer is open if (scaffoldState.drawerState.isOpen) { - BackPressHandler { scaffoldState.drawerState.close() } + BackPressHandler { + scope.launch { + scaffoldState.drawerState.close() + } + } } JetchatScaffold( @@ -77,7 +97,9 @@ class NavActivity : AppCompatActivity() { onChatClicked = { findNavController(R.id.nav_host_fragment) .popBackStack(R.id.nav_home, true) - scaffoldState.drawerState.close() + scope.launch { + scaffoldState.drawerState.close() + } }, onProfileClicked = { val bundle = bundleOf("userId" to it) @@ -85,29 +107,32 @@ class NavActivity : AppCompatActivity() { R.id.nav_profile, bundle ) - scaffoldState.drawerState.close() + scope.launch { + scaffoldState.drawerState.close() + } } ) { - // Workaround for https://issuetracker.google.com/178174718 - // and https://issuetracker.google.com/179181757 - - // Inflate the XML layout using View Binding: - val bindingRef = remember { Ref() } - val currentView = LocalView.current - - AndroidViewBinding({ inflater, parent, attachToParent -> - if (bindingRef.value == null) { - val binding: ViewBinding = - ContentMainBinding.inflate(inflater, parent, attachToParent) - bindingRef.value = binding - binding.root.compositionContext = - currentView.findViewTreeCompositionContext() - } - bindingRef.value as ViewBinding - }) - // End of workaround +// // Workaround for https://issuetracker.google.com/178174718 +// // and https://issuetracker.google.com/179181757 +// +// // Inflate the XML layout using View Binding: +// val bindingRef = remember { Ref() } +// val currentView = LocalView.current +// +// AndroidViewBinding({ inflater, parent, attachToParent -> +// if (bindingRef.value == null) { +// val binding: ViewBinding = +// ContentMainBinding.inflate(inflater, parent, attachToParent) +// bindingRef.value = binding +// binding.root.compositionContext = +// currentView.findViewTreeCompositionContext() +// } +// bindingRef.value as ViewBinding +// }) +// // End of workaround // AndroidViewBinding(ContentMainBinding::inflate) + FragmentAwareAndroidViewBinding(ContentMainBinding::inflate) } } } @@ -119,3 +144,67 @@ class NavActivity : AppCompatActivity() { return navController.navigateUp() || super.onSupportNavigateUp() } } + +@Composable +fun FragmentAwareAndroidViewBinding( + bindingBlock: (LayoutInflater, ViewGroup, Boolean) -> T, + modifier: Modifier = Modifier, + update: T.() -> Unit = {} +) { + val fragmentContainerViews = remember { mutableStateListOf() } + AndroidViewBinding(bindingBlock, modifier = modifier) { + fragmentContainerViews.clear() + val rootGroup = root as? ViewGroup + if (rootGroup != null) { + findFragmentContainerViews(rootGroup, fragmentContainerViews) + } + update() + } + val activity = LocalContext.current as FragmentActivity + fragmentContainerViews.forEach { container -> + DisposableEffect(container) { + // Find the right FragmentManager + val fragmentManager = try { + val parentFragment = container.findFragment() + parentFragment.childFragmentManager + } catch (e: Exception) { + activity.supportFragmentManager + } + // Now find the fragment inflated via the FragmentContainerView + val existingFragment = fragmentManager.findFragmentById(R.id.nav_host_fragment) + if (existingFragment != null) { + val fragmentView = existingFragment.requireView() + // Remove the Fragment from whatever old parent it had + // (this is most likely an old binding if it is non-null) + (fragmentView.parent as? ViewGroup)?.run { + removeView(fragmentView) + } + // Re-add it to the layout if it was moved to RESUMED before + // this Composable ran + container.addView(existingFragment.requireView()) + } + onDispose { + if (existingFragment != null && !fragmentManager.isStateSaved) { + // If the state isn't saved, that means that some state change + // has removed this Composable from the hierarchy + fragmentManager.commit { + remove(existingFragment) + } + } + } + } + } +} + +private fun findFragmentContainerViews( + viewGroup: ViewGroup, + list: SnapshotStateList +) { + viewGroup.forEach { + if (it is FragmentContainerView) { + list += it + } else if (it is ViewGroup) { + findFragmentContainerViews(it, list) + } + } +} diff --git a/Jetchat/app/src/main/java/com/example/compose/jetchat/components/JetchatDrawer.kt b/Jetchat/app/src/main/java/com/example/compose/jetchat/components/JetchatDrawer.kt index 3dda1844e2..30a0448b3c 100644 --- a/Jetchat/app/src/main/java/com/example/compose/jetchat/components/JetchatDrawer.kt +++ b/Jetchat/app/src/main/java/com/example/compose/jetchat/components/JetchatDrawer.kt @@ -25,10 +25,10 @@ import androidx.compose.foundation.layout.ColumnScope import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredHeight -import androidx.compose.foundation.layout.preferredSize -import androidx.compose.foundation.layout.preferredWidth +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.CircleShape import androidx.compose.material.ContentAlpha import androidx.compose.material.Divider @@ -39,7 +39,7 @@ import androidx.compose.material.MaterialTheme import androidx.compose.material.Surface import androidx.compose.material.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.Providers +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.ui.Alignment.Companion.CenterVertically import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip @@ -76,7 +76,7 @@ private fun DrawerHeader() { Image( painter = painterResource(id = R.drawable.ic_jetchat), contentDescription = null, - modifier = Modifier.preferredSize(24.dp) + modifier = Modifier.size(24.dp) ) Image( painter = painterResource(id = R.drawable.jetchat_logo), @@ -87,7 +87,7 @@ private fun DrawerHeader() { } @Composable private fun DrawerItemHeader(text: String) { - Providers(LocalContentAlpha provides ContentAlpha.medium) { + CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) { Text(text, style = MaterialTheme.typography.caption, modifier = Modifier.padding(16.dp)) } } @@ -101,7 +101,7 @@ private fun ChatItem(text: String, selected: Boolean, onChatClicked: () -> Unit) } Row( modifier = Modifier - .preferredHeight(48.dp) + .height(48.dp) .fillMaxWidth() .padding(horizontal = 8.dp, vertical = 4.dp) .then(background) @@ -120,7 +120,7 @@ private fun ChatItem(text: String, selected: Boolean, onChatClicked: () -> Unit) modifier = Modifier.padding(8.dp), contentDescription = null ) - Providers(LocalContentAlpha provides ContentAlpha.medium) { + CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) { Text( text, style = MaterialTheme.typography.body2, @@ -135,15 +135,15 @@ private fun ChatItem(text: String, selected: Boolean, onChatClicked: () -> Unit) private fun ProfileItem(text: String, @DrawableRes profilePic: Int?, onProfileClicked: () -> Unit) { Row( modifier = Modifier - .preferredHeight(48.dp) + .height(48.dp) .fillMaxWidth() .padding(horizontal = 8.dp, vertical = 4.dp) .clip(MaterialTheme.shapes.medium) .clickable(onClick = onProfileClicked), verticalAlignment = CenterVertically ) { - Providers(LocalContentAlpha provides ContentAlpha.medium) { - val widthPaddingModifier = Modifier.preferredWidth(24.dp).padding(8.dp) + CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) { + val widthPaddingModifier = Modifier.width(24.dp).padding(8.dp) if (profilePic != null) { Image( painter = painterResource(id = profilePic), diff --git a/Jetchat/app/src/main/java/com/example/compose/jetchat/components/JetchatScaffold.kt b/Jetchat/app/src/main/java/com/example/compose/jetchat/components/JetchatScaffold.kt index 69b62a80d1..c11f854090 100644 --- a/Jetchat/app/src/main/java/com/example/compose/jetchat/components/JetchatScaffold.kt +++ b/Jetchat/app/src/main/java/com/example/compose/jetchat/components/JetchatScaffold.kt @@ -39,7 +39,7 @@ fun JetchatScaffold( onChatClicked = onChatClicked ) }, - bodyContent = content + content = content ) } } diff --git a/Jetchat/app/src/main/java/com/example/compose/jetchat/conversation/BackHandler.kt b/Jetchat/app/src/main/java/com/example/compose/jetchat/conversation/BackHandler.kt index 667dc3f514..bfa4574d61 100644 --- a/Jetchat/app/src/main/java/com/example/compose/jetchat/conversation/BackHandler.kt +++ b/Jetchat/app/src/main/java/com/example/compose/jetchat/conversation/BackHandler.kt @@ -62,7 +62,7 @@ fun BackPressHandler(onBackPressed: () -> Unit) { * This [CompositionLocal] is used to provide an [OnBackPressedDispatcher]: * * ``` - * Providers(LocalBackPressedDispatcher provides requireActivity().onBackPressedDispatcher) { } + * CompositionLocalProvider(LocalBackPressedDispatcher provides requireActivity().onBackPressedDispatcher) { } * ``` * * and setting up the callbacks with [BackPressHandler]. diff --git a/Jetchat/app/src/main/java/com/example/compose/jetchat/conversation/Conversation.kt b/Jetchat/app/src/main/java/com/example/compose/jetchat/conversation/Conversation.kt index 471bb3471a..353ecf27bb 100644 --- a/Jetchat/app/src/main/java/com/example/compose/jetchat/conversation/Conversation.kt +++ b/Jetchat/app/src/main/java/com/example/compose/jetchat/conversation/Conversation.kt @@ -16,7 +16,6 @@ package com.example.compose.jetchat.conversation -import androidx.compose.foundation.ClickableText import androidx.compose.foundation.Image import androidx.compose.foundation.ScrollState import androidx.compose.foundation.border @@ -31,12 +30,12 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.paddingFrom -import androidx.compose.foundation.layout.preferredHeight -import androidx.compose.foundation.layout.preferredSize -import androidx.compose.foundation.layout.preferredWidth +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.text.ClickableText import androidx.compose.foundation.verticalScroll import androidx.compose.material.ContentAlpha import androidx.compose.material.Divider @@ -50,7 +49,7 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Info import androidx.compose.material.icons.outlined.Search import androidx.compose.runtime.Composable -import androidx.compose.runtime.Providers +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -148,7 +147,7 @@ fun ChannelNameBar( style = MaterialTheme.typography.subtitle1 ) // Number of members - Providers(LocalContentAlpha provides ContentAlpha.medium) { + CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) { Text( text = stringResource(R.string.members, channelMembers), style = MaterialTheme.typography.caption @@ -157,14 +156,14 @@ fun ChannelNameBar( } }, actions = { - Providers(LocalContentAlpha provides ContentAlpha.medium) { + CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) { // Search icon Icon( imageVector = Icons.Outlined.Search, modifier = Modifier .clickable(onClick = {}) // TODO: Show not implemented dialog. .padding(horizontal = 12.dp, vertical = 16.dp) - .preferredHeight(24.dp), + .height(24.dp), contentDescription = stringResource(id = R.string.search) ) // Info icon @@ -173,7 +172,7 @@ fun ChannelNameBar( modifier = Modifier .clickable(onClick = {}) // TODO: Show not implemented dialog. .padding(horizontal = 12.dp, vertical = 16.dp) - .preferredHeight(24.dp), + .height(24.dp), contentDescription = stringResource(id = R.string.info) ) } @@ -201,7 +200,7 @@ fun Messages( .verticalScroll(scrollState, reverseScrolling = true) ) { val authorMe = stringResource(id = R.string.author_me) - Spacer(modifier = Modifier.preferredHeight(64.dp)) + Spacer(modifier = Modifier.height(64.dp)) messages.forEachIndexed { index, content -> val prevAuthor = messages.getOrNull(index - 1)?.author val nextAuthor = messages.getOrNull(index + 1)?.author @@ -240,7 +239,7 @@ fun Messages( enabled = jumpToBottomButtonEnabled, onClicked = { scope.launch { - scrollState.smoothScrollTo(BottomScrollState) + scrollState.animateScrollTo(0) } }, modifier = Modifier.align(Alignment.BottomCenter) @@ -276,7 +275,7 @@ fun Message( modifier = Modifier .clickable(onClick = onAuthorClick) .padding(horizontal = 16.dp) - .preferredSize(42.dp) + .size(42.dp) .border(1.5.dp, borderColor, CircleShape) .border(3.dp, MaterialTheme.colors.surface, CircleShape) .clip(CircleShape) @@ -287,7 +286,7 @@ fun Message( ) } else { // Space under avatar - Spacer(modifier = Modifier.preferredWidth(74.dp)) + Spacer(modifier = Modifier.width(74.dp)) } AuthorAndTextMessage( msg = msg, @@ -314,10 +313,10 @@ fun AuthorAndTextMessage( ChatItemBubble(msg, isLastMessageByAuthor) if (isLastMessageByAuthor) { // Last bubble before next author - Spacer(modifier = Modifier.preferredHeight(8.dp)) + Spacer(modifier = Modifier.height(8.dp)) } else { // Between bubbles - Spacer(modifier = Modifier.preferredHeight(4.dp)) + Spacer(modifier = Modifier.height(4.dp)) } } } @@ -333,8 +332,8 @@ private fun AuthorNameTimestamp(msg: Message) { .alignBy(LastBaseline) .paddingFrom(LastBaseline, after = 8.dp) // Space to 1st bubble ) - Spacer(modifier = Modifier.preferredWidth(8.dp)) - Providers(LocalContentAlpha provides ContentAlpha.medium) { + Spacer(modifier = Modifier.width(8.dp)) + CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) { Text( text = msg.timestamp, style = MaterialTheme.typography.caption, @@ -352,10 +351,10 @@ fun DayHeader(dayString: String) { Row( modifier = Modifier .padding(vertical = 8.dp, horizontal = 16.dp) - .preferredHeight(16.dp) + .height(16.dp) ) { DayHeaderLine() - Providers(LocalContentAlpha provides ContentAlpha.medium) { + CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) { Text( text = dayString, modifier = Modifier.padding(horizontal = 16.dp), @@ -403,7 +402,7 @@ fun ChatItemBubble( Image( painter = painterResource(it), contentScale = ContentScale.Fit, - modifier = Modifier.preferredSize(160.dp), + modifier = Modifier.size(160.dp), contentDescription = stringResource(id = R.string.attached_image) ) } @@ -463,6 +462,5 @@ fun DayHeaderPrev() { } private val JumpToBottomThreshold = 56.dp -private val BottomScrollState = 0f -private fun ScrollState.atBottom(): Boolean = value == BottomScrollState +private fun ScrollState.atBottom(): Boolean = value == 0 diff --git a/Jetchat/app/src/main/java/com/example/compose/jetchat/conversation/ConversationFragment.kt b/Jetchat/app/src/main/java/com/example/compose/jetchat/conversation/ConversationFragment.kt index b58f8efcd2..333ff57d65 100644 --- a/Jetchat/app/src/main/java/com/example/compose/jetchat/conversation/ConversationFragment.kt +++ b/Jetchat/app/src/main/java/com/example/compose/jetchat/conversation/ConversationFragment.kt @@ -22,7 +22,7 @@ import android.view.View import android.view.ViewGroup import android.view.ViewGroup.LayoutParams import android.view.ViewGroup.LayoutParams.MATCH_PARENT -import androidx.compose.runtime.Providers +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.ui.Modifier import androidx.compose.ui.platform.ComposeView import androidx.core.os.bundleOf @@ -60,7 +60,7 @@ class ConversationFragment : Fragment() { .start(windowInsetsAnimationsEnabled = true) setContent { - Providers( + CompositionLocalProvider( LocalBackPressedDispatcher provides requireActivity().onBackPressedDispatcher, LocalWindowInsets provides windowInsets, ) { diff --git a/Jetchat/app/src/main/java/com/example/compose/jetchat/conversation/JumpToBottom.kt b/Jetchat/app/src/main/java/com/example/compose/jetchat/conversation/JumpToBottom.kt index be9d9c3f46..252f6e24bf 100644 --- a/Jetchat/app/src/main/java/com/example/compose/jetchat/conversation/JumpToBottom.kt +++ b/Jetchat/app/src/main/java/com/example/compose/jetchat/conversation/JumpToBottom.kt @@ -18,8 +18,8 @@ package com.example.compose.jetchat.conversation import androidx.compose.animation.core.animateDp import androidx.compose.animation.core.updateTransition +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.offset -import androidx.compose.foundation.layout.preferredHeight import androidx.compose.material.ExtendedFloatingActionButton import androidx.compose.material.Icon import androidx.compose.material.MaterialTheme @@ -62,7 +62,7 @@ fun JumpToBottom( icon = { Icon( imageVector = Icons.Filled.ArrowDownward, - modifier = Modifier.preferredHeight(18.dp), + modifier = Modifier.height(18.dp), contentDescription = null ) }, @@ -74,7 +74,7 @@ fun JumpToBottom( contentColor = MaterialTheme.colors.primary, modifier = modifier .offset(x = 0.dp, y = -bottomOffset) - .preferredHeight(36.dp) + .height(36.dp) ) } } diff --git a/Jetchat/app/src/main/java/com/example/compose/jetchat/conversation/MessageFormatter.kt b/Jetchat/app/src/main/java/com/example/compose/jetchat/conversation/MessageFormatter.kt index e0782c95fa..433ec6ded3 100644 --- a/Jetchat/app/src/main/java/com/example/compose/jetchat/conversation/MessageFormatter.kt +++ b/Jetchat/app/src/main/java/com/example/compose/jetchat/conversation/MessageFormatter.kt @@ -22,7 +22,6 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.SpanStyle -import androidx.compose.ui.text.StringAnnotation import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.font.FontStyle @@ -40,7 +39,7 @@ val symbolPattern by lazy { enum class SymbolAnnotationType { PERSON, LINK } - +typealias StringAnnotation = AnnotatedString.Range // Pair returning styled content and annotation for ClickableText when matching syntax token typealias SymbolAnnotation = Pair diff --git a/Jetchat/app/src/main/java/com/example/compose/jetchat/conversation/UserInput.kt b/Jetchat/app/src/main/java/com/example/compose/jetchat/conversation/UserInput.kt index 757a44bd5d..1caf8bf266 100644 --- a/Jetchat/app/src/main/java/com/example/compose/jetchat/conversation/UserInput.kt +++ b/Jetchat/app/src/main/java/com/example/compose/jetchat/conversation/UserInput.kt @@ -30,10 +30,10 @@ import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.paddingFrom -import androidx.compose.foundation.layout.preferredHeight -import androidx.compose.foundation.layout.preferredSize +import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.sizeIn import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.foundation.rememberScrollState @@ -60,8 +60,7 @@ import androidx.compose.material.icons.outlined.InsertPhoto import androidx.compose.material.icons.outlined.Mood import androidx.compose.material.icons.outlined.Place import androidx.compose.runtime.Composable -import androidx.compose.runtime.DisposableEffect -import androidx.compose.runtime.Providers +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.SideEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -77,6 +76,7 @@ import androidx.compose.ui.focus.focusModifier import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.focus.onFocusChanged import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.SolidColor import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.layout.FirstBaseline import androidx.compose.ui.res.stringResource @@ -84,7 +84,6 @@ import androidx.compose.ui.semantics.SemanticsPropertyKey import androidx.compose.ui.semantics.SemanticsPropertyReceiver import androidx.compose.ui.semantics.contentDescription import androidx.compose.ui.semantics.semantics -import androidx.compose.ui.text.SoftwareKeyboardController import androidx.compose.ui.text.TextRange import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardType @@ -152,7 +151,7 @@ fun UserInput( if (focused) { currentInputSelector = InputSelector.NONE scope.launch { - scrollState.smoothScrollTo(0f) + scrollState.animateScrollTo(0) } } textFieldFocusState = focused @@ -168,7 +167,7 @@ fun UserInput( textState = TextFieldValue() // Move scroll to bottom scope.launch { - scrollState.smoothScrollTo(0f) + scrollState.animateScrollTo(0) } dismissKeyboard() }, @@ -232,7 +231,7 @@ fun FunctionalityNotAvailablePanel() { AnimatedVisibility(visible = true, initiallyVisible = false, enter = fadeIn()) { Column( modifier = Modifier - .preferredHeight(320.dp) + .height(320.dp) .fillMaxWidth(), verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally, @@ -241,7 +240,7 @@ fun FunctionalityNotAvailablePanel() { text = stringResource(id = R.string.not_available), style = MaterialTheme.typography.subtitle1 ) - Providers(LocalContentAlpha provides ContentAlpha.medium) { + CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) { Text( text = stringResource(id = R.string.not_available_subtitle), modifier = Modifier.paddingFrom(FirstBaseline, before = 32.dp), @@ -271,7 +270,7 @@ private fun UserInputSelector( ) { Row( modifier = modifier - .preferredHeight(56.dp) + .height(56.dp) .wrapContentHeight() .padding(horizontal = 4.dp), verticalAlignment = Alignment.CenterVertically @@ -329,7 +328,7 @@ private fun UserInputSelector( Button( modifier = Modifier .padding(horizontal = 16.dp) - .preferredHeight(36.dp), + .height(36.dp), enabled = sendMessageEnabled, onClick = onMessageSent, colors = buttonColors, @@ -353,14 +352,14 @@ private fun InputSelectorButton( selected: Boolean ) { IconButton(onClick = onClick) { - Providers(LocalContentAlpha provides ContentAlpha.medium) { + CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) { val tint = if (selected) MaterialTheme.colors.primary else LocalContentColor.current Icon( icon, tint = tint, modifier = Modifier .padding(12.dp) - .preferredSize(20.dp), + .size(20.dp), contentDescription = description ) } @@ -385,25 +384,11 @@ private fun UserInputText( onTextFieldFocused: (Boolean) -> Unit, focusState: Boolean ) { - // Grab a reference to the keyboard controller whenever text input starts - var keyboardController by remember { mutableStateOf(null) } - - // Show or hide the keyboard - DisposableEffect( - keyboardController, - keyboardShown - ) { // Guard side-effects against failed commits - keyboardController?.let { - if (keyboardShown) it.showSoftwareKeyboard() else it.hideSoftwareKeyboard() - } - onDispose { /* no-op */ } - } - val a11ylabel = stringResource(id = R.string.textfield_desc) Row( modifier = Modifier .fillMaxWidth() - .preferredHeight(48.dp) + .height(48.dp) .semantics { contentDescription = a11ylabel keyboardShownProperty = keyboardShown @@ -413,7 +398,7 @@ private fun UserInputText( Surface { Box( modifier = Modifier - .preferredHeight(48.dp) + .height(48.dp) .weight(1f) .align(Alignment.Bottom) ) { @@ -435,9 +420,8 @@ private fun UserInputText( keyboardType = keyboardType, imeAction = ImeAction.Send ), - onTextInputStarted = { keyboardController = it }, maxLines = 1, - cursorColor = LocalContentColor.current, + cursorBrush = SolidColor(LocalContentColor.current), textStyle = LocalTextStyle.current.copy(color = LocalContentColor.current) ) @@ -516,7 +500,7 @@ fun ExtendedSelectorInnerButton( onClick = onClick, modifier = modifier .padding(horizontal = 8.dp, vertical = 8.dp) - .preferredHeight(30.dp), + .height(30.dp), shape = MaterialTheme.shapes.medium, enabled = selected, colors = colors, diff --git a/Jetchat/app/src/main/java/com/example/compose/jetchat/profile/Profile.kt b/Jetchat/app/src/main/java/com/example/compose/jetchat/profile/Profile.kt index 2f81d08822..71bd6cf669 100644 --- a/Jetchat/app/src/main/java/com/example/compose/jetchat/profile/Profile.kt +++ b/Jetchat/app/src/main/java/com/example/compose/jetchat/profile/Profile.kt @@ -24,9 +24,9 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredHeight -import androidx.compose.foundation.layout.preferredHeightIn import androidx.compose.foundation.layout.widthIn import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll @@ -43,7 +43,7 @@ import androidx.compose.material.icons.outlined.Chat import androidx.compose.material.icons.outlined.Create import androidx.compose.material.icons.outlined.MoreVert import androidx.compose.runtime.Composable -import androidx.compose.runtime.Providers +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.key import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -79,14 +79,14 @@ fun ProfileScreen(userData: ProfileScreenState, onNavIconPressed: () -> Unit = { onNavIconPressed = onNavIconPressed, title = { }, actions = { - Providers(LocalContentAlpha provides ContentAlpha.medium) { + CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) { // More icon Icon( imageVector = Icons.Outlined.MoreVert, modifier = Modifier .clickable(onClick = {}) // TODO: Show not implemented dialog. .padding(horizontal = 12.dp, vertical = 16.dp) - .preferredHeight(24.dp), + .height(24.dp), contentDescription = stringResource(id = R.string.more_options) ) } @@ -108,7 +108,7 @@ fun ProfileScreen(userData: ProfileScreenState, onNavIconPressed: () -> Unit = { } } ProfileFab( - extended = scrollState.value == 0f, + extended = scrollState.value == 0, userIsMe = userData.isMe(), modifier = Modifier.align(Alignment.BottomEnd) ) @@ -119,7 +119,7 @@ fun ProfileScreen(userData: ProfileScreenState, onNavIconPressed: () -> Unit = { @Composable private fun UserInfoFields(userData: ProfileScreenState, containerHeight: Dp) { Column { - Spacer(modifier = Modifier.preferredHeight(8.dp)) + Spacer(modifier = Modifier.height(8.dp)) NameAndPosition(userData) @@ -135,7 +135,7 @@ private fun UserInfoFields(userData: ProfileScreenState, containerHeight: Dp) { // Add a spacer that always shows part (320.dp) of the fields list regardless of the device, // in order to always leave some content at the top. - Spacer(Modifier.preferredHeight((containerHeight - 320.dp).coerceAtLeast(0.dp))) + Spacer(Modifier.height((containerHeight - 320.dp).coerceAtLeast(0.dp))) } } @@ -168,7 +168,7 @@ private fun Name(userData: ProfileScreenState, modifier: Modifier = Modifier) { @Composable private fun Position(userData: ProfileScreenState, modifier: Modifier = Modifier) { - Providers(LocalContentAlpha provides ContentAlpha.medium) { + CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) { Text( text = userData.position, modifier = modifier, @@ -189,7 +189,7 @@ private fun ProfileHeader( data.photo?.let { Image( modifier = Modifier - .preferredHeightIn(max = containerHeight / 2) + .heightIn(max = containerHeight / 2) .fillMaxWidth() .padding(top = offsetDp), painter = painterResource(id = it), @@ -203,7 +203,7 @@ private fun ProfileHeader( fun ProfileProperty(label: String, value: String, isLink: Boolean = false) { Column(modifier = Modifier.padding(start = 16.dp, end = 16.dp, bottom = 16.dp)) { Divider() - Providers(LocalContentAlpha provides ContentAlpha.medium) { + CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) { Text( text = label, modifier = Modifier.baselineHeight(24.dp), @@ -237,7 +237,7 @@ fun ProfileFab(extended: Boolean, userIsMe: Boolean, modifier: Modifier = Modifi modifier = modifier .padding(16.dp) .navigationBarsPadding() - .preferredHeight(48.dp) + .height(48.dp) .widthIn(min = 48.dp), backgroundColor = MaterialTheme.colors.primary, contentColor = MaterialTheme.colors.onPrimary diff --git a/Jetchat/app/src/main/java/com/example/compose/jetchat/profile/ProfileFragment.kt b/Jetchat/app/src/main/java/com/example/compose/jetchat/profile/ProfileFragment.kt index 3cb224b8b5..48a59ec9eb 100644 --- a/Jetchat/app/src/main/java/com/example/compose/jetchat/profile/ProfileFragment.kt +++ b/Jetchat/app/src/main/java/com/example/compose/jetchat/profile/ProfileFragment.kt @@ -21,7 +21,7 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.compose.runtime.Providers +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.getValue import androidx.compose.runtime.livedata.observeAsState import androidx.compose.ui.platform.ComposeView @@ -63,7 +63,7 @@ class ProfileFragment : Fragment() { setContent { val userData by viewModel.userData.observeAsState() - Providers(LocalWindowInsets provides windowInsets) { + CompositionLocalProvider(LocalWindowInsets provides windowInsets) { JetchatTheme { if (userData == null) { ProfileError() diff --git a/Jetchat/app/src/main/res/layout/content_main.xml b/Jetchat/app/src/main/res/layout/content_main.xml index accf21f538..d212a8473a 100644 --- a/Jetchat/app/src/main/res/layout/content_main.xml +++ b/Jetchat/app/src/main/res/layout/content_main.xml @@ -25,7 +25,7 @@ - Date: Tue, 16 Feb 2021 14:58:17 +0000 Subject: [PATCH 08/37] Cleanup and some fixes --- .../example/compose/jetchat/NavActivity.kt | 43 +++++++------------ .../jetchat/components/JetchatDrawer.kt | 3 +- .../jetchat/conversation/BackHandler.kt | 4 +- .../app/src/main/res/layout/content_main.xml | 2 - 4 files changed, 20 insertions(+), 32 deletions(-) diff --git a/Jetchat/app/src/main/java/com/example/compose/jetchat/NavActivity.kt b/Jetchat/app/src/main/java/com/example/compose/jetchat/NavActivity.kt index 78212007af..07618007ee 100644 --- a/Jetchat/app/src/main/java/com/example/compose/jetchat/NavActivity.kt +++ b/Jetchat/app/src/main/java/com/example/compose/jetchat/NavActivity.kt @@ -42,7 +42,9 @@ import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentContainerView import androidx.fragment.app.commit import androidx.fragment.app.findFragment +import androidx.navigation.NavController import androidx.navigation.findNavController +import androidx.navigation.fragment.NavHostFragment import androidx.viewbinding.ViewBinding import com.example.compose.jetchat.components.JetchatScaffold import com.example.compose.jetchat.conversation.BackPressHandler @@ -95,42 +97,21 @@ class NavActivity : AppCompatActivity() { JetchatScaffold( scaffoldState, onChatClicked = { - findNavController(R.id.nav_host_fragment) - .popBackStack(R.id.nav_home, true) + findNavController().popBackStack(R.id.nav_home, true) scope.launch { scaffoldState.drawerState.close() } }, onProfileClicked = { val bundle = bundleOf("userId" to it) - findNavController(R.id.nav_host_fragment).navigate( - R.id.nav_profile, - bundle - ) + findNavController().navigate(R.id.nav_profile, bundle) scope.launch { scaffoldState.drawerState.close() } } ) { -// // Workaround for https://issuetracker.google.com/178174718 -// // and https://issuetracker.google.com/179181757 -// -// // Inflate the XML layout using View Binding: -// val bindingRef = remember { Ref() } -// val currentView = LocalView.current -// -// AndroidViewBinding({ inflater, parent, attachToParent -> -// if (bindingRef.value == null) { -// val binding: ViewBinding = -// ContentMainBinding.inflate(inflater, parent, attachToParent) -// bindingRef.value = binding -// binding.root.compositionContext = -// currentView.findViewTreeCompositionContext() -// } -// bindingRef.value as ViewBinding -// }) -// // End of workaround - + // TODO: Fragments inflated via AndroidViewBinding don't work as expected + // https://issuetracker.google.com/179915946 // AndroidViewBinding(ContentMainBinding::inflate) FragmentAwareAndroidViewBinding(ContentMainBinding::inflate) } @@ -140,8 +121,16 @@ class NavActivity : AppCompatActivity() { } override fun onSupportNavigateUp(): Boolean { - val navController = findNavController(R.id.nav_host_fragment) - return navController.navigateUp() || super.onSupportNavigateUp() + return findNavController().navigateUp() || super.onSupportNavigateUp() + } + + /** + * See https://issuetracker.google.com/142847973 + */ + private fun findNavController(): NavController { + val navHostFragment = + supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment + return navHostFragment.navController } } diff --git a/Jetchat/app/src/main/java/com/example/compose/jetchat/components/JetchatDrawer.kt b/Jetchat/app/src/main/java/com/example/compose/jetchat/components/JetchatDrawer.kt index 30a0448b3c..52657ac524 100644 --- a/Jetchat/app/src/main/java/com/example/compose/jetchat/components/JetchatDrawer.kt +++ b/Jetchat/app/src/main/java/com/example/compose/jetchat/components/JetchatDrawer.kt @@ -28,7 +28,6 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size -import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.CircleShape import androidx.compose.material.ContentAlpha import androidx.compose.material.Divider @@ -143,7 +142,7 @@ private fun ProfileItem(text: String, @DrawableRes profilePic: Int?, onProfileCl verticalAlignment = CenterVertically ) { CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) { - val widthPaddingModifier = Modifier.width(24.dp).padding(8.dp) + val widthPaddingModifier = Modifier.padding(8.dp).size(24.dp) if (profilePic != null) { Image( painter = painterResource(id = profilePic), diff --git a/Jetchat/app/src/main/java/com/example/compose/jetchat/conversation/BackHandler.kt b/Jetchat/app/src/main/java/com/example/compose/jetchat/conversation/BackHandler.kt index bfa4574d61..abef1d10c0 100644 --- a/Jetchat/app/src/main/java/com/example/compose/jetchat/conversation/BackHandler.kt +++ b/Jetchat/app/src/main/java/com/example/compose/jetchat/conversation/BackHandler.kt @@ -62,7 +62,9 @@ fun BackPressHandler(onBackPressed: () -> Unit) { * This [CompositionLocal] is used to provide an [OnBackPressedDispatcher]: * * ``` - * CompositionLocalProvider(LocalBackPressedDispatcher provides requireActivity().onBackPressedDispatcher) { } + * CompositionLocalProvider( + * LocalBackPressedDispatcher provides requireActivity().onBackPressedDispatcher + * ) { } * ``` * * and setting up the callbacks with [BackPressHandler]. diff --git a/Jetchat/app/src/main/res/layout/content_main.xml b/Jetchat/app/src/main/res/layout/content_main.xml index d212a8473a..31302894b9 100644 --- a/Jetchat/app/src/main/res/layout/content_main.xml +++ b/Jetchat/app/src/main/res/layout/content_main.xml @@ -23,8 +23,6 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - - Date: Tue, 16 Feb 2021 16:07:57 +0100 Subject: [PATCH 09/37] [Rally] Group elements at a higher granularity --- .../compose/rally/ui/components/CommonUi.kt | 17 ++++++++++++----- .../compose/rally/ui/overview/OverviewScreen.kt | 14 +++++++++++--- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/Rally/app/src/main/java/com/example/compose/rally/ui/components/CommonUi.kt b/Rally/app/src/main/java/com/example/compose/rally/ui/components/CommonUi.kt index 94589a691d..7fa41c01cc 100644 --- a/Rally/app/src/main/java/com/example/compose/rally/ui/components/CommonUi.kt +++ b/Rally/app/src/main/java/com/example/compose/rally/ui/components/CommonUi.kt @@ -39,6 +39,8 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.stringResource +import androidx.compose.ui.semantics.clearAndSetSemantics +import androidx.compose.ui.semantics.contentDescription import androidx.compose.ui.unit.dp import com.example.compose.rally.R import java.text.DecimalFormat @@ -79,8 +81,15 @@ private fun BaseRow( amount: Float, negative: Boolean ) { + val dollarSign = if (negative) "–$ " else "$ " + val formattedAmount = formatAmount(amount) Row( - modifier = Modifier.height(68.dp), + modifier = Modifier + .height(68.dp) + .clearAndSetSemantics { + contentDescription = + "$title account ending in ${subtitle.takeLast(4)}, current balance $dollarSign$formattedAmount" + }, verticalAlignment = Alignment.CenterVertically ) { val typography = MaterialTheme.typography @@ -100,14 +109,12 @@ private fun BaseRow( horizontalArrangement = Arrangement.SpaceBetween ) { Text( - text = if (negative) "–$ " else "$ ", + text = dollarSign, style = typography.h6, modifier = Modifier.align(Alignment.CenterVertically) ) Text( - text = formatAmount( - amount - ), + text = formattedAmount, style = typography.h6, modifier = Modifier.align(Alignment.CenterVertically) ) diff --git a/Rally/app/src/main/java/com/example/compose/rally/ui/overview/OverviewScreen.kt b/Rally/app/src/main/java/com/example/compose/rally/ui/overview/OverviewScreen.kt index 926061959e..70be4b32ca 100644 --- a/Rally/app/src/main/java/com/example/compose/rally/ui/overview/OverviewScreen.kt +++ b/Rally/app/src/main/java/com/example/compose/rally/ui/overview/OverviewScreen.kt @@ -44,6 +44,8 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.stringResource +import androidx.compose.ui.semantics.clearAndSetSemantics +import androidx.compose.ui.semantics.semantics import androidx.compose.ui.unit.dp import com.example.compose.rally.R import com.example.compose.rally.RallyScreen @@ -128,7 +130,9 @@ private fun AlertHeader(onClickSeeAll: () -> Unit) { @Composable private fun AlertItem(message: String) { Row( - modifier = Modifier.padding(RallyDefaultPadding), + modifier = Modifier + .padding(RallyDefaultPadding) + .semantics(mergeDescendants = true) {}, horizontalArrangement = Arrangement.SpaceBetween ) { Text( @@ -138,9 +142,11 @@ private fun AlertItem(message: String) { ) IconButton( onClick = {}, - modifier = Modifier.align(Alignment.Top) + modifier = Modifier + .align(Alignment.Top) + .clearAndSetSemantics {} ) { - Icon(Icons.Filled.Sort, contentDescription = stringResource(id = R.string.sort)) + Icon(Icons.Filled.Sort, contentDescription = null) } } } @@ -193,6 +199,7 @@ private fun OverViewDivider( } } } + /** * The Accounts card within the Rally Overview screen. */ @@ -217,6 +224,7 @@ private fun AccountsCard(onScreenChange: (RallyScreen) -> Unit) { ) } } + /** * The Bills card within the Rally Overview screen. */ From 22f348717abbaaa95e171aa22a1bf8717bed36a2 Mon Sep 17 00:00:00 2001 From: Yacine Rezgui Date: Tue, 16 Feb 2021 20:27:18 +0000 Subject: [PATCH 10/37] [Jetcaster] Update to beta01 snapshot --- .../main/java/com/example/jetcaster/ui/home/Home.kt | 9 ++++----- .../jetcaster/ui/home/category/PodcastCategory.kt | 10 +++++----- .../com/example/jetcaster/ui/home/discover/Discover.kt | 6 +++--- .../src/main/java/com/example/jetcaster/util/Pager.kt | 2 +- .../com/example/jetcaster/buildsrc/dependencies.kt | 10 +++++----- 5 files changed, 18 insertions(+), 19 deletions(-) diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/Home.kt b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/Home.kt index 603f49b2ed..eb2565af2d 100644 --- a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/Home.kt +++ b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/Home.kt @@ -27,9 +27,8 @@ import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredHeight -import androidx.compose.foundation.layout.preferredHeightIn import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.ContentAlpha @@ -119,7 +118,7 @@ fun HomeAppBar( contentDescription = stringResource(R.string.app_name), modifier = Modifier .padding(start = 4.dp) - .preferredHeightIn(max = 24.dp) + .heightIn(max = 24.dp) ) } }, @@ -225,7 +224,7 @@ fun HomeContent( modifier = Modifier .padding(start = Keyline1, top = 16.dp, end = Keyline1) .fillMaxWidth() - .preferredHeight(200.dp) + .height(200.dp) ) Spacer(Modifier.height(16.dp)) @@ -305,7 +304,7 @@ fun HomeCategoryTabIndicator( Spacer( modifier .padding(horizontal = 24.dp) - .preferredHeight(4.dp) + .height(4.dp) .background(color, RoundedCornerShape(topStartPercent = 100, topEndPercent = 100)) ) } diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/category/PodcastCategory.kt b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/category/PodcastCategory.kt index d117e8ca59..a9f5c372c2 100644 --- a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/category/PodcastCategory.kt +++ b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/category/PodcastCategory.kt @@ -28,8 +28,8 @@ import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredSize -import androidx.compose.foundation.layout.preferredWidth +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyRow import androidx.compose.foundation.lazy.items @@ -152,7 +152,7 @@ fun EpisodeListItem( contentScale = ContentScale.Crop, loading = { /* TODO do something better here */ }, modifier = Modifier - .preferredSize(56.dp) + .size(56.dp) .clip(MaterialTheme.shapes.medium) .constrainAs(image) { end.linkTo(parent.end, 16.dp) @@ -305,10 +305,10 @@ private fun CategoryPodcastRow( podcastImageUrl = podcast.imageUrl, isFollowed = isFollowed, onToggleFollowClicked = { onTogglePodcastFollowed(podcast.uri) }, - modifier = Modifier.preferredWidth(128.dp) + modifier = Modifier.width(128.dp) ) - if (index < lastIndex) Spacer(Modifier.preferredWidth(24.dp)) + if (index < lastIndex) Spacer(Modifier.width(24.dp)) } } } diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/discover/Discover.kt b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/discover/Discover.kt index 3c95f22fc1..08a1715e0d 100644 --- a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/discover/Discover.kt +++ b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/discover/Discover.kt @@ -21,8 +21,8 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredHeight import androidx.compose.material.MaterialTheme import androidx.compose.material.ScrollableTabRow import androidx.compose.material.Surface @@ -50,7 +50,7 @@ fun Discover( if (viewState.categories.isNotEmpty() && selectedCategory != null) { Column(modifier) { - Spacer(Modifier.preferredHeight(8.dp)) + Spacer(Modifier.height(8.dp)) PodcastCategoryTabs( categories = viewState.categories, @@ -59,7 +59,7 @@ fun Discover( modifier = Modifier.fillMaxWidth() ) - Spacer(Modifier.preferredHeight(8.dp)) + Spacer(Modifier.height(8.dp)) Crossfade( targetState = selectedCategory, diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/util/Pager.kt b/Jetcaster/app/src/main/java/com/example/jetcaster/util/Pager.kt index e9fb0d2d3d..1a62469e1d 100644 --- a/Jetcaster/app/src/main/java/com/example/jetcaster/util/Pager.kt +++ b/Jetcaster/app/src/main/java/com/example/jetcaster/util/Pager.kt @@ -34,7 +34,7 @@ import androidx.compose.runtime.setValue import androidx.compose.runtime.structuralEqualityPolicy import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.gesture.scrollorientationlocking.Orientation +import androidx.compose.foundation.gestures.Orientation import androidx.compose.ui.layout.Layout import androidx.compose.ui.layout.Measurable import androidx.compose.ui.layout.ParentDataModifier diff --git a/Jetcaster/buildSrc/src/main/java/com/example/jetcaster/buildsrc/dependencies.kt b/Jetcaster/buildSrc/src/main/java/com/example/jetcaster/buildsrc/dependencies.kt index b2e3e993aa..c026d89ed8 100644 --- a/Jetcaster/buildSrc/src/main/java/com/example/jetcaster/buildsrc/dependencies.kt +++ b/Jetcaster/buildSrc/src/main/java/com/example/jetcaster/buildsrc/dependencies.kt @@ -21,7 +21,7 @@ object Versions { } object Libs { - const val androidGradlePlugin = "com.android.tools.build:gradle:7.0.0-alpha05" + const val androidGradlePlugin = "com.android.tools.build:gradle:7.0.0-alpha06" const val jdkDesugar = "com.android.tools:desugar_jdk_libs:1.0.9" const val junit = "junit:junit:4.13" @@ -29,7 +29,7 @@ object Libs { const val material = "com.google.android.material:material:1.1.0" object Accompanist { - private const val version = "0.5.1" + private const val version = "0.5.2.compose-7141639-SNAPSHOT" const val coil = "dev.chrisbanes.accompanist:accompanist-coil:$version" const val insets = "dev.chrisbanes.accompanist:accompanist-insets:$version" } @@ -61,7 +61,7 @@ object Libs { const val coreKtx = "androidx.core:core-ktx:1.5.0-beta01" object Activity { - const val activityCompose = "androidx.activity:activity-compose:1.3.0-alpha02" + const val activityCompose = "androidx.activity:activity-compose:1.3.0-SNAPSHOT" } object Constraint { @@ -69,8 +69,8 @@ object Libs { } object Compose { - private const val snapshot = "" - private const val version = "1.0.0-alpha12" + private const val snapshot = "7141639" + private const val version = "1.0.0-SNAPSHOT" @get:JvmStatic val snapshotUrl: String From f41063ab596ee594408960bd46b02644027b148a Mon Sep 17 00:00:00 2001 From: Yacine Rezgui Date: Tue, 16 Feb 2021 22:18:54 +0000 Subject: [PATCH 11/37] Apply update changes --- Jetcaster/app/build.gradle | 2 +- .../jetcaster/ui/home/category/PodcastCategory.kt | 8 ++++---- .../main/java/com/example/jetcaster/util/Pager.kt | 10 ++-------- Jetcaster/build.gradle | 13 +++++++++++++ .../com/example/jetcaster/buildsrc/dependencies.kt | 7 +++++-- 5 files changed, 25 insertions(+), 15 deletions(-) diff --git a/Jetcaster/app/build.gradle b/Jetcaster/app/build.gradle index a5993fb810..5c1c203f37 100644 --- a/Jetcaster/app/build.gradle +++ b/Jetcaster/app/build.gradle @@ -101,7 +101,7 @@ dependencies { implementation Libs.AndroidX.Activity.activityCompose -// implementation Libs.AndroidX.Constraint.constraintLayoutCompose + implementation Libs.AndroidX.Constraint.constraintLayoutCompose implementation Libs.AndroidX.Compose.foundation implementation Libs.AndroidX.Compose.material diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/category/PodcastCategory.kt b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/category/PodcastCategory.kt index a9f5c372c2..067308496a 100644 --- a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/category/PodcastCategory.kt +++ b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/category/PodcastCategory.kt @@ -48,7 +48,7 @@ import androidx.compose.material.icons.filled.PlaylistAdd import androidx.compose.material.icons.rounded.PlayCircleFilled import androidx.compose.material.ripple.rememberRipple import androidx.compose.runtime.Composable -import androidx.compose.runtime.Providers +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.remember @@ -191,7 +191,7 @@ fun EpisodeListItem( val titleImageBarrier = createBottomBarrier(podcastTitle, image) - Providers(LocalContentAlpha provides ContentAlpha.medium) { + CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) { Text( text = podcast.title, maxLines = 2, @@ -221,7 +221,7 @@ fun EpisodeListItem( interactionState = remember { InteractionState() }, indication = rememberRipple(bounded = false, radius = 24.dp) ) { /* TODO */ } - .preferredSize(36.dp) + .size(36.dp) .constrainAs(playIcon) { start.linkTo(parent.start, Keyline1) top.linkTo(titleImageBarrier, margin = 16.dp) @@ -229,7 +229,7 @@ fun EpisodeListItem( } ) - Providers(LocalContentAlpha provides ContentAlpha.medium) { + CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) { Text( text = when { episode.duration != null -> { diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/util/Pager.kt b/Jetcaster/app/src/main/java/com/example/jetcaster/util/Pager.kt index 1a62469e1d..4527376f62 100644 --- a/Jetcaster/app/src/main/java/com/example/jetcaster/util/Pager.kt +++ b/Jetcaster/app/src/main/java/com/example/jetcaster/util/Pager.kt @@ -19,8 +19,7 @@ package com.example.jetcaster.util import androidx.compose.animation.core.Animatable -import androidx.compose.animation.core.AnimationEndReason -import androidx.compose.animation.core.exponentialDecay +import androidx.compose.foundation.gestures.Orientation import androidx.compose.foundation.gestures.draggable import androidx.compose.foundation.layout.Box import androidx.compose.runtime.Composable @@ -34,7 +33,6 @@ import androidx.compose.runtime.setValue import androidx.compose.runtime.structuralEqualityPolicy import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.foundation.gestures.Orientation import androidx.compose.ui.layout.Layout import androidx.compose.ui.layout.Measurable import androidx.compose.ui.layout.ParentDataModifier @@ -108,12 +106,8 @@ class PagerState( if (velocity < 0 && currentPage == maxPage) return if (velocity > 0 && currentPage == minPage) return - val result = _currentPageOffset.animateDecay(velocity, exponentialDecay()) - - if (result.endReason != AnimationEndReason.Interrupted) { - _currentPageOffset.animateTo(currentPageOffset.roundToInt().toFloat()) + _currentPageOffset.animateTo(currentPageOffset.roundToInt().toFloat()) selectPage() - } } override fun toString(): String = "PagerState{minPage=$minPage, maxPage=$maxPage, " + diff --git a/Jetcaster/build.gradle b/Jetcaster/build.gradle index d9d1811508..cab26a5972 100644 --- a/Jetcaster/build.gradle +++ b/Jetcaster/build.gradle @@ -75,4 +75,17 @@ subprojects { jvmTarget = "1.8" } } + + configurations.configureEach { + // androidx.test forces JUnit, 4.12, prefer 4.13 + resolutionStrategy { + force Libs.JUnit.junit + } + // FIXME remove when have an updated constraintlayout-compose dep + resolutionStrategy.eachDependency { details -> + if (details.requested.group.startsWith('androidx.compose')) { + details.useVersion Libs.AndroidX.Compose.version + } + } + } } diff --git a/Jetcaster/buildSrc/src/main/java/com/example/jetcaster/buildsrc/dependencies.kt b/Jetcaster/buildSrc/src/main/java/com/example/jetcaster/buildsrc/dependencies.kt index c026d89ed8..08aa0d27b9 100644 --- a/Jetcaster/buildSrc/src/main/java/com/example/jetcaster/buildsrc/dependencies.kt +++ b/Jetcaster/buildSrc/src/main/java/com/example/jetcaster/buildsrc/dependencies.kt @@ -24,8 +24,6 @@ object Libs { const val androidGradlePlugin = "com.android.tools.build:gradle:7.0.0-alpha06" const val jdkDesugar = "com.android.tools:desugar_jdk_libs:1.0.9" - const val junit = "junit:junit:4.13" - const val material = "com.google.android.material:material:1.1.0" object Accompanist { @@ -54,6 +52,11 @@ object Libs { const val logging = "com.squareup.okhttp3:logging-interceptor:$version" } + object JUnit { + private const val version = "4.13" + const val junit = "junit:junit:$version" + } + object AndroidX { const val appcompat = "androidx.appcompat:appcompat:1.2.0" const val palette = "androidx.palette:palette:1.0.0" From 2dd3282fea7fa93fb7f81d739bc9e139104cf4c7 Mon Sep 17 00:00:00 2001 From: Jolanda Verhoef Date: Wed, 17 Feb 2021 14:03:30 +0100 Subject: [PATCH 12/37] [Rally] Add comment explaining use of mergeDescendants --- .../com/example/compose/rally/ui/overview/OverviewScreen.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Rally/app/src/main/java/com/example/compose/rally/ui/overview/OverviewScreen.kt b/Rally/app/src/main/java/com/example/compose/rally/ui/overview/OverviewScreen.kt index 70be4b32ca..909c53fb3a 100644 --- a/Rally/app/src/main/java/com/example/compose/rally/ui/overview/OverviewScreen.kt +++ b/Rally/app/src/main/java/com/example/compose/rally/ui/overview/OverviewScreen.kt @@ -132,6 +132,10 @@ private fun AlertItem(message: String) { Row( modifier = Modifier .padding(RallyDefaultPadding) + // Regard the whole row as one semantics node. This way each row will receive focus as + // a whole and the focus bounds will be around the whole row content. The semantics + // properties of the descendants will be merged. If we'd use clearAndSetSemantics instead, + // we'd have to define the semantics properties explicitly. .semantics(mergeDescendants = true) {}, horizontalArrangement = Arrangement.SpaceBetween ) { From db1f1129edf76e622b373e5ce0f8fa59a0615aa7 Mon Sep 17 00:00:00 2001 From: Yacine Rezgui Date: Wed, 17 Feb 2021 15:54:39 +0000 Subject: [PATCH 13/37] Update imports --- Jetcaster/app/build.gradle | 1 + .../app/src/main/java/com/example/jetcaster/ui/home/Home.kt | 6 +++--- .../example/jetcaster/ui/home/category/PodcastCategory.kt | 3 +-- Jetcaster/build.gradle | 2 ++ .../java/com/example/jetcaster/buildsrc/dependencies.kt | 2 +- 5 files changed, 8 insertions(+), 6 deletions(-) diff --git a/Jetcaster/app/build.gradle b/Jetcaster/app/build.gradle index 5c1c203f37..3ac4b1ac11 100644 --- a/Jetcaster/app/build.gradle +++ b/Jetcaster/app/build.gradle @@ -123,6 +123,7 @@ dependencies { implementation Libs.AndroidX.Room.runtime implementation Libs.AndroidX.Room.ktx + implementation 'androidx.constraintlayout:constraintlayout:2.0.4' kapt Libs.AndroidX.Room.compiler coreLibraryDesugaring Libs.jdkDesugar diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/Home.kt b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/Home.kt index eb2565af2d..56cb7f8aae 100644 --- a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/Home.kt +++ b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/Home.kt @@ -48,7 +48,7 @@ import androidx.compose.material.icons.filled.AccountCircle import androidx.compose.material.icons.filled.Search import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.Providers +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.remember @@ -124,7 +124,7 @@ fun HomeAppBar( }, backgroundColor = backgroundColor, actions = { - Providers(LocalContentAlpha provides ContentAlpha.medium) { + CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) { IconButton( onClick = { /* TODO: Open search */ } ) { @@ -370,7 +370,7 @@ private fun FollowedPodcastCarouselItem( } if (lastEpisodeDate != null) { - Providers(LocalContentAlpha provides ContentAlpha.medium) { + CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) { Text( text = lastUpdated(lastEpisodeDate), style = MaterialTheme.typography.caption, diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/category/PodcastCategory.kt b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/category/PodcastCategory.kt index 067308496a..35356a12b3 100644 --- a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/category/PodcastCategory.kt +++ b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/category/PodcastCategory.kt @@ -17,11 +17,9 @@ package com.example.jetcaster.ui.home.category import androidx.compose.foundation.Image -import androidx.compose.foundation.InteractionState import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.ConstraintLayout import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.aspectRatio @@ -61,6 +59,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import androidx.constraintlayout.compose.ConstraintLayout import androidx.lifecycle.viewmodel.compose.viewModel import com.example.jetcaster.R import com.example.jetcaster.data.Episode diff --git a/Jetcaster/build.gradle b/Jetcaster/build.gradle index cab26a5972..e409c92b2f 100644 --- a/Jetcaster/build.gradle +++ b/Jetcaster/build.gradle @@ -35,6 +35,8 @@ plugins { subprojects { repositories { + maven { url "http://androidx.dev/storage/repository/androidx/constraintlayout" } + google() mavenCentral() jcenter() diff --git a/Jetcaster/buildSrc/src/main/java/com/example/jetcaster/buildsrc/dependencies.kt b/Jetcaster/buildSrc/src/main/java/com/example/jetcaster/buildsrc/dependencies.kt index 08aa0d27b9..cdca7cfdaf 100644 --- a/Jetcaster/buildSrc/src/main/java/com/example/jetcaster/buildsrc/dependencies.kt +++ b/Jetcaster/buildSrc/src/main/java/com/example/jetcaster/buildsrc/dependencies.kt @@ -68,7 +68,7 @@ object Libs { } object Constraint { - const val constraintLayoutCompose = "androidx.constraintlayout:constraintlayout-compose:1.0.0-alpha01" + const val constraintLayoutCompose = "androidx.constraintlayout:constraintlayout-compose:1.0.0-SNAPSHOT" } object Compose { From f63a7d87249816a5d8d67db86535d8b7d0c8785b Mon Sep 17 00:00:00 2001 From: Yacine Rezgui Date: Wed, 17 Feb 2021 17:12:32 +0000 Subject: [PATCH 14/37] Update imports Simplify temporarily click animation logic --- .../java/com/example/jetcaster/ui/home/Home.kt | 2 +- .../ui/home/category/PodcastCategory.kt | 17 ++++++++--------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/Home.kt b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/Home.kt index 56cb7f8aae..dfc865d447 100644 --- a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/Home.kt +++ b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/Home.kt @@ -47,8 +47,8 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.AccountCircle import androidx.compose.material.icons.filled.Search import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.remember diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/category/PodcastCategory.kt b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/category/PodcastCategory.kt index 35356a12b3..51f7cedc14 100644 --- a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/category/PodcastCategory.kt +++ b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/category/PodcastCategory.kt @@ -44,12 +44,10 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.MoreVert import androidx.compose.material.icons.filled.PlaylistAdd import androidx.compose.material.icons.rounded.PlayCircleFilled -import androidx.compose.material.ripple.rememberRipple import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue -import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip @@ -60,6 +58,8 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.constraintlayout.compose.ConstraintLayout +import androidx.constraintlayout.compose.Dimension.Companion.fillToConstraints +import androidx.constraintlayout.compose.Dimension.Companion.preferredWrapContent import androidx.lifecycle.viewmodel.compose.viewModel import com.example.jetcaster.R import com.example.jetcaster.data.Episode @@ -138,7 +138,7 @@ fun EpisodeListItem( top.linkTo(parent.top) centerHorizontallyTo(parent) - width = androidx.compose.foundation.layout.Dimension.fillToConstraints + width = fillToConstraints } ) @@ -184,7 +184,7 @@ fun EpisodeListItem( ) top.linkTo(parent.top, 16.dp) - width = androidx.compose.foundation.layout.Dimension.preferredWrapContent + width = preferredWrapContent } ) @@ -205,7 +205,7 @@ fun EpisodeListItem( ) top.linkTo(episodeTitle.bottom, 6.dp) - width = androidx.compose.foundation.layout.Dimension.preferredWrapContent + width = preferredWrapContent } ) } @@ -216,10 +216,9 @@ fun EpisodeListItem( contentScale = ContentScale.Fit, colorFilter = ColorFilter.tint(LocalContentColor.current), modifier = Modifier - .clickable( - interactionState = remember { InteractionState() }, - indication = rememberRipple(bounded = false, radius = 24.dp) - ) { /* TODO */ } + // TODO: Bring back clickable logic + // https://github.com/android/compose-samples/blob/89b5cf0482a52d58119b1f46bc977d2ec4fadfad/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/category/PodcastCategory.kt#L220-L223 + .clickable{ /* TODO */ } .size(36.dp) .constrainAs(playIcon) { start.linkTo(parent.start, Keyline1) From 4f29b06108d2fdc08065794c497c3a8c452aa30f Mon Sep 17 00:00:00 2001 From: Yacine Rezgui Date: Wed, 17 Feb 2021 17:24:21 +0000 Subject: [PATCH 15/37] Update .draggable modifier usage --- .../java/com/example/jetcaster/util/Pager.kt | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/util/Pager.kt b/Jetcaster/app/src/main/java/com/example/jetcaster/util/Pager.kt index 4527376f62..fcfab5483c 100644 --- a/Jetcaster/app/src/main/java/com/example/jetcaster/util/Pager.kt +++ b/Jetcaster/app/src/main/java/com/example/jetcaster/util/Pager.kt @@ -21,6 +21,7 @@ package com.example.jetcaster.util import androidx.compose.animation.core.Animatable import androidx.compose.foundation.gestures.Orientation import androidx.compose.foundation.gestures.draggable +import androidx.compose.foundation.gestures.rememberDraggableState import androidx.compose.foundation.layout.Box import androidx.compose.runtime.Composable import androidx.compose.runtime.Immutable @@ -157,18 +158,19 @@ fun Pager( // need to scale the velocity to match state.fling(velocity / pageSize) } - } - ) { dy -> - coroutineScope.launch { - with(state) { - val pos = pageSize * currentPageOffset - val max = if (currentPage == minPage) 0 else pageSize * offscreenLimit - val min = if (currentPage == maxPage) 0 else -pageSize * offscreenLimit - val newPos = (pos + dy).coerceIn(min.toFloat(), max.toFloat()) - snapToOffset(newPos / pageSize) + }, + state = rememberDraggableState { dy -> + coroutineScope.launch { + with(state) { + val pos = pageSize * currentPageOffset + val max = if (currentPage == minPage) 0 else pageSize * offscreenLimit + val min = if (currentPage == maxPage) 0 else -pageSize * offscreenLimit + val newPos = (pos + dy).coerceIn(min.toFloat(), max.toFloat()) + snapToOffset(newPos / pageSize) + } } - } - } + }, + ) ) { measurables, constraints -> layout(constraints.maxWidth, constraints.maxHeight) { val currentPage = state.currentPage From 3b8ec59deeeebcf3d9c42118bed35393a2981cf5 Mon Sep 17 00:00:00 2001 From: Yacine Rezgui Date: Wed, 17 Feb 2021 17:34:16 +0000 Subject: [PATCH 16/37] Move up clickable logic comment --- .../jetcaster/ui/home/category/PodcastCategory.kt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/category/PodcastCategory.kt b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/category/PodcastCategory.kt index 51f7cedc14..db7f055383 100644 --- a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/category/PodcastCategory.kt +++ b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/category/PodcastCategory.kt @@ -210,15 +210,16 @@ fun EpisodeListItem( ) } + + // TODO: Bring back clickable logic + // https://github.com/android/compose-samples/blob/89b5cf0482a52d58119b1f46bc977d2ec4fadfad/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/category/PodcastCategory.kt#L220-L223 + Image( imageVector = Icons.Rounded.PlayCircleFilled, contentDescription = stringResource(R.string.cd_play), contentScale = ContentScale.Fit, colorFilter = ColorFilter.tint(LocalContentColor.current), - modifier = Modifier - // TODO: Bring back clickable logic - // https://github.com/android/compose-samples/blob/89b5cf0482a52d58119b1f46bc977d2ec4fadfad/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/category/PodcastCategory.kt#L220-L223 - .clickable{ /* TODO */ } + modifier = Modifier.clickable{ /* TODO */ } .size(36.dp) .constrainAs(playIcon) { start.linkTo(parent.start, Keyline1) From 8ece21f15698149a1c1f0d28a81770a1413c98ce Mon Sep 17 00:00:00 2001 From: Yacine Rezgui Date: Wed, 17 Feb 2021 17:57:29 +0000 Subject: [PATCH 17/37] Apply spotless --- .../com/example/jetcaster/ui/home/category/PodcastCategory.kt | 3 +-- .../app/src/main/java/com/example/jetcaster/util/Pager.kt | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/category/PodcastCategory.kt b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/category/PodcastCategory.kt index db7f055383..0916445b72 100644 --- a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/category/PodcastCategory.kt +++ b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/category/PodcastCategory.kt @@ -210,7 +210,6 @@ fun EpisodeListItem( ) } - // TODO: Bring back clickable logic // https://github.com/android/compose-samples/blob/89b5cf0482a52d58119b1f46bc977d2ec4fadfad/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/category/PodcastCategory.kt#L220-L223 @@ -219,7 +218,7 @@ fun EpisodeListItem( contentDescription = stringResource(R.string.cd_play), contentScale = ContentScale.Fit, colorFilter = ColorFilter.tint(LocalContentColor.current), - modifier = Modifier.clickable{ /* TODO */ } + modifier = Modifier.clickable { /* TODO */ } .size(36.dp) .constrainAs(playIcon) { start.linkTo(parent.start, Keyline1) diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/util/Pager.kt b/Jetcaster/app/src/main/java/com/example/jetcaster/util/Pager.kt index fcfab5483c..9b49985aa1 100644 --- a/Jetcaster/app/src/main/java/com/example/jetcaster/util/Pager.kt +++ b/Jetcaster/app/src/main/java/com/example/jetcaster/util/Pager.kt @@ -108,7 +108,7 @@ class PagerState( if (velocity > 0 && currentPage == minPage) return _currentPageOffset.animateTo(currentPageOffset.roundToInt().toFloat()) - selectPage() + selectPage() } override fun toString(): String = "PagerState{minPage=$minPage, maxPage=$maxPage, " + From a96126fb5489274740d3f8ebd57b35393639c550 Mon Sep 17 00:00:00 2001 From: Yacine Rezgui Date: Wed, 17 Feb 2021 19:42:31 +0000 Subject: [PATCH 18/37] Add viewModel temporary fix --- Jetcaster/app/build.gradle | 2 +- .../com/example/jetcaster/ui/home/Home.kt | 4 +- .../ui/home/category/PodcastCategory.kt | 2 +- .../jetcaster/ui/home/discover/Discover.kt | 2 +- .../example/jetcaster/util/LocalViewModel.kt | 66 +++++++++++++++++++ 5 files changed, 71 insertions(+), 5 deletions(-) create mode 100644 Jetcaster/app/src/main/java/com/example/jetcaster/util/LocalViewModel.kt diff --git a/Jetcaster/app/build.gradle b/Jetcaster/app/build.gradle index 3ac4b1ac11..4b2d56e764 100644 --- a/Jetcaster/app/build.gradle +++ b/Jetcaster/app/build.gradle @@ -123,7 +123,7 @@ dependencies { implementation Libs.AndroidX.Room.runtime implementation Libs.AndroidX.Room.ktx - implementation 'androidx.constraintlayout:constraintlayout:2.0.4' + kapt Libs.AndroidX.Room.compiler coreLibraryDesugaring Libs.jdkDesugar diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/Home.kt b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/Home.kt index dfc865d447..96aa8a854b 100644 --- a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/Home.kt +++ b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/Home.kt @@ -62,7 +62,6 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import androidx.lifecycle.viewmodel.compose.viewModel import com.example.jetcaster.R import com.example.jetcaster.data.PodcastWithExtraInfo import com.example.jetcaster.ui.home.discover.Discover @@ -76,6 +75,7 @@ import com.example.jetcaster.util.constrastAgainst import com.example.jetcaster.util.quantityStringResource import com.example.jetcaster.util.rememberDominantColorState import com.example.jetcaster.util.verticalGradientScrim +import com.example.jetcaster.util.viewModel import dev.chrisbanes.accompanist.coil.CoilImage import dev.chrisbanes.accompanist.insets.statusBarsHeight import java.time.Duration @@ -84,7 +84,7 @@ import java.time.OffsetDateTime @Composable fun Home() { - val viewModel: HomeViewModel = viewModel() + val viewModel = viewModel(HomeViewModel::class.java) val viewState by viewModel.state.collectAsState() diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/category/PodcastCategory.kt b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/category/PodcastCategory.kt index 0916445b72..ea27e89008 100644 --- a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/category/PodcastCategory.kt +++ b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/category/PodcastCategory.kt @@ -60,7 +60,6 @@ import androidx.compose.ui.unit.dp import androidx.constraintlayout.compose.ConstraintLayout import androidx.constraintlayout.compose.Dimension.Companion.fillToConstraints import androidx.constraintlayout.compose.Dimension.Companion.preferredWrapContent -import androidx.lifecycle.viewmodel.compose.viewModel import com.example.jetcaster.R import com.example.jetcaster.data.Episode import com.example.jetcaster.data.Podcast @@ -70,6 +69,7 @@ import com.example.jetcaster.ui.home.PreviewPodcasts import com.example.jetcaster.ui.theme.JetcasterTheme import com.example.jetcaster.ui.theme.Keyline1 import com.example.jetcaster.util.ToggleFollowPodcastIconButton +import com.example.jetcaster.util.viewModel import com.example.jetcaster.util.viewModelProviderFactoryOf import dev.chrisbanes.accompanist.coil.CoilImage import java.time.format.DateTimeFormatter diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/discover/Discover.kt b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/discover/Discover.kt index 08a1715e0d..7cdae25d7e 100644 --- a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/discover/Discover.kt +++ b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/discover/Discover.kt @@ -43,7 +43,7 @@ import com.example.jetcaster.ui.theme.Keyline1 fun Discover( modifier: Modifier = Modifier ) { - val viewModel: DiscoverViewModel = viewModel() + val viewModel = viewModel(DiscoverViewModel::class.java) val viewState by viewModel.state.collectAsState() val selectedCategory = viewState.selectedCategory diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/util/LocalViewModel.kt b/Jetcaster/app/src/main/java/com/example/jetcaster/util/LocalViewModel.kt new file mode 100644 index 0000000000..0c167cfe43 --- /dev/null +++ b/Jetcaster/app/src/main/java/com/example/jetcaster/util/LocalViewModel.kt @@ -0,0 +1,66 @@ +package com.example.jetcaster.util + +// FIXME: This is a temporary fix, delete this file and import the dependency from androidx package instead + +import androidx.lifecycle.viewmodel.compose.LocalViewModelStoreOwner + +import androidx.compose.runtime.Composable +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.ViewModelStoreOwner + +/** + * Returns an existing [ViewModel] or creates a new one in the scope (usually, a fragment or + * an activity) + * + * The created [ViewModel] is associated with the given scope and will be retained + * as long as the scope is alive (e.g. if it is an activity, until it is + * finished or process is killed). + * + * @param key The key to use to identify the [ViewModel]. + * @return A [ViewModel] that is an instance of the given [T] type. + */ +@Suppress("MissingJvmstatic") +@Composable +public inline fun viewModel( + key: String? = null, + factory: ViewModelProvider.Factory? = null +): T = viewModel(T::class.java, key, factory) + +/** + * Returns an existing [ViewModel] or creates a new one in the scope (usually, a fragment or + * an activity) + * + * The created [ViewModel] is associated with the given scope and will be retained + * as long as the scope is alive (e.g. if it is an activity, until it is + * finished or process is killed). + * + * @param modelClass The class of the [ViewModel] to create an instance of it if it is not + * present. + * @param key The key to use to identify the [ViewModel]. + * @return A [ViewModel] that is an instance of the given [T] type. + */ +@Suppress("MissingJvmstatic") +@Composable +public fun viewModel( + modelClass: Class, + key: String? = null, + factory: ViewModelProvider.Factory? = null +): T = LocalViewModelStoreOwner.current.get(modelClass, key, factory) + +private fun ViewModelStoreOwner.get( + javaClass: Class, + key: String? = null, + factory: ViewModelProvider.Factory? = null +): T { + val provider = if (factory != null) { + ViewModelProvider(this, factory) + } else { + ViewModelProvider(this) + } + return if (key != null) { + provider.get(key, javaClass) + } else { + provider.get(javaClass) + } +} From ef07b941bf25ebf29e9783d66c014754355ea1ab Mon Sep 17 00:00:00 2001 From: Yacine Rezgui Date: Wed, 17 Feb 2021 19:54:41 +0000 Subject: [PATCH 19/37] Change FIXME to TODO (spotless wasn't happy) --- .../example/jetcaster/util/LocalViewModel.kt | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/util/LocalViewModel.kt b/Jetcaster/app/src/main/java/com/example/jetcaster/util/LocalViewModel.kt index 0c167cfe43..34c2ebd1d7 100644 --- a/Jetcaster/app/src/main/java/com/example/jetcaster/util/LocalViewModel.kt +++ b/Jetcaster/app/src/main/java/com/example/jetcaster/util/LocalViewModel.kt @@ -1,13 +1,28 @@ -package com.example.jetcaster.util +/* + * Copyright 2021 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 + * + * https://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. + */ -// FIXME: This is a temporary fix, delete this file and import the dependency from androidx package instead +package com.example.jetcaster.util -import androidx.lifecycle.viewmodel.compose.LocalViewModelStoreOwner +// TODO: This is a temporary fix, delete this file and import the dependency from androidx package instead import androidx.compose.runtime.Composable import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelStoreOwner +import androidx.lifecycle.viewmodel.compose.LocalViewModelStoreOwner /** * Returns an existing [ViewModel] or creates a new one in the scope (usually, a fragment or From 7a61a8eb778b1eae4b73c394340ce3409e4b5da4 Mon Sep 17 00:00:00 2001 From: Yacine Rezgui Date: Wed, 17 Feb 2021 21:35:02 +0000 Subject: [PATCH 20/37] Use snapshot version of compose viewmodel --- .../com/example/jetcaster/ui/home/Home.kt | 2 +- .../ui/home/category/PodcastCategory.kt | 2 +- .../example/jetcaster/util/LocalViewModel.kt | 81 ------------------- .../jetcaster/buildsrc/dependencies.kt | 2 +- 4 files changed, 3 insertions(+), 84 deletions(-) delete mode 100644 Jetcaster/app/src/main/java/com/example/jetcaster/util/LocalViewModel.kt diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/Home.kt b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/Home.kt index 96aa8a854b..77220d7247 100644 --- a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/Home.kt +++ b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/Home.kt @@ -62,6 +62,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import androidx.lifecycle.viewmodel.compose.viewModel import com.example.jetcaster.R import com.example.jetcaster.data.PodcastWithExtraInfo import com.example.jetcaster.ui.home.discover.Discover @@ -75,7 +76,6 @@ import com.example.jetcaster.util.constrastAgainst import com.example.jetcaster.util.quantityStringResource import com.example.jetcaster.util.rememberDominantColorState import com.example.jetcaster.util.verticalGradientScrim -import com.example.jetcaster.util.viewModel import dev.chrisbanes.accompanist.coil.CoilImage import dev.chrisbanes.accompanist.insets.statusBarsHeight import java.time.Duration diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/category/PodcastCategory.kt b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/category/PodcastCategory.kt index ea27e89008..0916445b72 100644 --- a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/category/PodcastCategory.kt +++ b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/category/PodcastCategory.kt @@ -60,6 +60,7 @@ import androidx.compose.ui.unit.dp import androidx.constraintlayout.compose.ConstraintLayout import androidx.constraintlayout.compose.Dimension.Companion.fillToConstraints import androidx.constraintlayout.compose.Dimension.Companion.preferredWrapContent +import androidx.lifecycle.viewmodel.compose.viewModel import com.example.jetcaster.R import com.example.jetcaster.data.Episode import com.example.jetcaster.data.Podcast @@ -69,7 +70,6 @@ import com.example.jetcaster.ui.home.PreviewPodcasts import com.example.jetcaster.ui.theme.JetcasterTheme import com.example.jetcaster.ui.theme.Keyline1 import com.example.jetcaster.util.ToggleFollowPodcastIconButton -import com.example.jetcaster.util.viewModel import com.example.jetcaster.util.viewModelProviderFactoryOf import dev.chrisbanes.accompanist.coil.CoilImage import java.time.format.DateTimeFormatter diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/util/LocalViewModel.kt b/Jetcaster/app/src/main/java/com/example/jetcaster/util/LocalViewModel.kt deleted file mode 100644 index 34c2ebd1d7..0000000000 --- a/Jetcaster/app/src/main/java/com/example/jetcaster/util/LocalViewModel.kt +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright 2021 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 - * - * https://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 com.example.jetcaster.util - -// TODO: This is a temporary fix, delete this file and import the dependency from androidx package instead - -import androidx.compose.runtime.Composable -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import androidx.lifecycle.ViewModelStoreOwner -import androidx.lifecycle.viewmodel.compose.LocalViewModelStoreOwner - -/** - * Returns an existing [ViewModel] or creates a new one in the scope (usually, a fragment or - * an activity) - * - * The created [ViewModel] is associated with the given scope and will be retained - * as long as the scope is alive (e.g. if it is an activity, until it is - * finished or process is killed). - * - * @param key The key to use to identify the [ViewModel]. - * @return A [ViewModel] that is an instance of the given [T] type. - */ -@Suppress("MissingJvmstatic") -@Composable -public inline fun viewModel( - key: String? = null, - factory: ViewModelProvider.Factory? = null -): T = viewModel(T::class.java, key, factory) - -/** - * Returns an existing [ViewModel] or creates a new one in the scope (usually, a fragment or - * an activity) - * - * The created [ViewModel] is associated with the given scope and will be retained - * as long as the scope is alive (e.g. if it is an activity, until it is - * finished or process is killed). - * - * @param modelClass The class of the [ViewModel] to create an instance of it if it is not - * present. - * @param key The key to use to identify the [ViewModel]. - * @return A [ViewModel] that is an instance of the given [T] type. - */ -@Suppress("MissingJvmstatic") -@Composable -public fun viewModel( - modelClass: Class, - key: String? = null, - factory: ViewModelProvider.Factory? = null -): T = LocalViewModelStoreOwner.current.get(modelClass, key, factory) - -private fun ViewModelStoreOwner.get( - javaClass: Class, - key: String? = null, - factory: ViewModelProvider.Factory? = null -): T { - val provider = if (factory != null) { - ViewModelProvider(this, factory) - } else { - ViewModelProvider(this) - } - return if (key != null) { - provider.get(key, javaClass) - } else { - provider.get(javaClass) - } -} diff --git a/Jetcaster/buildSrc/src/main/java/com/example/jetcaster/buildsrc/dependencies.kt b/Jetcaster/buildSrc/src/main/java/com/example/jetcaster/buildsrc/dependencies.kt index cdca7cfdaf..a882ddc510 100644 --- a/Jetcaster/buildSrc/src/main/java/com/example/jetcaster/buildsrc/dependencies.kt +++ b/Jetcaster/buildSrc/src/main/java/com/example/jetcaster/buildsrc/dependencies.kt @@ -92,7 +92,7 @@ object Libs { object Lifecycle { private const val version = "2.3.0-beta01" - const val viewModelCompose = "androidx.lifecycle:lifecycle-viewmodel-compose:1.0.0-alpha01" + const val viewModelCompose = "androidx.lifecycle:lifecycle-viewmodel-compose:1.0.0-SNAPSHOT" const val viewmodel = "androidx.lifecycle:lifecycle-viewmodel-ktx:$version" } From 94aabf726f5238494d893d5906c5a438d878f9a9 Mon Sep 17 00:00:00 2001 From: Nick Butcher Date: Mon, 15 Feb 2021 10:27:50 +0000 Subject: [PATCH 21/37] [Owl] Update to snapshot 7141639. Change-Id: I33530df9297a5a4c9347274197ca48556f4fc168 --- Owl/app/build.gradle | 3 +- .../java/com/example/owl/ui/NavigationTest.kt | 4 +- .../owl/ui/fakes/ProvideTestImageLoader.kt | 4 +- .../main/java/com/example/owl/ui/OwlApp.kt | 4 +- .../example/owl/ui/common/CourseListItem.kt | 6 +-- .../example/owl/ui/course/CourseDetails.kt | 45 +++++++++++-------- .../com/example/owl/ui/courses/Courses.kt | 6 +-- .../example/owl/ui/courses/FeaturedCourses.kt | 8 ++-- .../com/example/owl/ui/courses/MyCourses.kt | 8 ++-- .../example/owl/ui/courses/SearchCourses.kt | 3 +- .../example/owl/ui/onboarding/Onboarding.kt | 14 +++--- .../java/com/example/owl/ui/theme/Images.kt | 4 +- .../java/com/example/owl/ui/theme/Theme.kt | 8 ++-- .../com/example/owl/ui/utils/NetworkImage.kt | 4 +- Owl/build.gradle | 12 +++-- .../com/example/owl/buildsrc/Dependencies.kt | 21 +++++---- 16 files changed, 87 insertions(+), 67 deletions(-) diff --git a/Owl/app/build.gradle b/Owl/app/build.gradle index 56ed91a040..5f6a16aba2 100644 --- a/Owl/app/build.gradle +++ b/Owl/app/build.gradle @@ -102,10 +102,9 @@ dependencies { implementation Libs.Accompanist.coil implementation Libs.Accompanist.insets - // FIXME: Only needed for Compose alpha12 androidTestImplementation Libs.AndroidX.Activity.activityCompose - androidTestImplementation Libs.junit + androidTestImplementation Libs.JUnit.junit androidTestImplementation Libs.AndroidX.Test.core androidTestImplementation Libs.AndroidX.Test.espressoCore androidTestImplementation Libs.AndroidX.Test.rules diff --git a/Owl/app/src/androidTest/java/com/example/owl/ui/NavigationTest.kt b/Owl/app/src/androidTest/java/com/example/owl/ui/NavigationTest.kt index ea7d8d00ec..af3499847d 100644 --- a/Owl/app/src/androidTest/java/com/example/owl/ui/NavigationTest.kt +++ b/Owl/app/src/androidTest/java/com/example/owl/ui/NavigationTest.kt @@ -17,7 +17,7 @@ package com.example.owl.ui import androidx.activity.ComponentActivity -import androidx.compose.runtime.Providers +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.ui.test.hasContentDescription import androidx.compose.ui.test.hasText import androidx.compose.ui.test.junit4.createAndroidComposeRule @@ -48,7 +48,7 @@ class NavigationTest { private fun startActivity(startDestination: String? = null) { composeTestRule.setContent { val backDispatcher = composeTestRule.activity.onBackPressedDispatcher - Providers(LocalBackDispatcher provides backDispatcher) { + CompositionLocalProvider(LocalBackDispatcher provides backDispatcher) { ProvideWindowInsets { ProvideTestImageLoader { if (startDestination == null) { diff --git a/Owl/app/src/androidTest/java/com/example/owl/ui/fakes/ProvideTestImageLoader.kt b/Owl/app/src/androidTest/java/com/example/owl/ui/fakes/ProvideTestImageLoader.kt index fd9286edbd..54edea4a7f 100644 --- a/Owl/app/src/androidTest/java/com/example/owl/ui/fakes/ProvideTestImageLoader.kt +++ b/Owl/app/src/androidTest/java/com/example/owl/ui/fakes/ProvideTestImageLoader.kt @@ -19,7 +19,7 @@ package com.example.owl.ui.fakes import android.graphics.Color import android.graphics.drawable.ColorDrawable import androidx.compose.runtime.Composable -import androidx.compose.runtime.Providers +import androidx.compose.runtime.CompositionLocalProvider import coil.ImageLoader import coil.annotation.ExperimentalCoilApi import coil.bitmap.BitmapPool @@ -77,5 +77,5 @@ fun ProvideTestImageLoader(content: @Composable () -> Unit) { override fun shutdown() {} } - Providers(LocalImageLoader provides loader, content = content) + CompositionLocalProvider(LocalImageLoader provides loader, content = content) } diff --git a/Owl/app/src/main/java/com/example/owl/ui/OwlApp.kt b/Owl/app/src/main/java/com/example/owl/ui/OwlApp.kt index 1163ebb181..02494115ad 100644 --- a/Owl/app/src/main/java/com/example/owl/ui/OwlApp.kt +++ b/Owl/app/src/main/java/com/example/owl/ui/OwlApp.kt @@ -18,7 +18,7 @@ package com.example.owl.ui import androidx.activity.OnBackPressedDispatcher import androidx.compose.runtime.Composable -import androidx.compose.runtime.Providers +import androidx.compose.runtime.CompositionLocalProvider import com.example.owl.ui.utils.LocalBackDispatcher import com.example.owl.ui.utils.ProvideImageLoader import dev.chrisbanes.accompanist.insets.ProvideWindowInsets @@ -26,7 +26,7 @@ import dev.chrisbanes.accompanist.insets.ProvideWindowInsets @Composable fun OwlApp(backDispatcher: OnBackPressedDispatcher) { - Providers(LocalBackDispatcher provides backDispatcher) { + CompositionLocalProvider(LocalBackDispatcher provides backDispatcher) { ProvideWindowInsets { ProvideImageLoader { NavGraph() diff --git a/Owl/app/src/main/java/com/example/owl/ui/common/CourseListItem.kt b/Owl/app/src/main/java/com/example/owl/ui/common/CourseListItem.kt index a784baa057..cabf73702a 100644 --- a/Owl/app/src/main/java/com/example/owl/ui/common/CourseListItem.kt +++ b/Owl/app/src/main/java/com/example/owl/ui/common/CourseListItem.kt @@ -21,7 +21,7 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredSize +import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.wrapContentWidth import androidx.compose.foundation.shape.CircleShape import androidx.compose.material.Icon @@ -92,7 +92,7 @@ fun CourseListItem( imageVector = Icons.Rounded.OndemandVideo, tint = MaterialTheme.colors.primary, contentDescription = null, - modifier = Modifier.preferredSize(iconSize) + modifier = Modifier.size(iconSize) ) Text( text = stringResource( @@ -111,7 +111,7 @@ fun CourseListItem( url = course.instructor, contentDescription = null, modifier = Modifier - .preferredSize(28.dp) + .size(28.dp) .clip(CircleShape) ) } diff --git a/Owl/app/src/main/java/com/example/owl/ui/course/CourseDetails.kt b/Owl/app/src/main/java/com/example/owl/ui/course/CourseDetails.kt index c81ed4e271..d84b800eb3 100644 --- a/Owl/app/src/main/java/com/example/owl/ui/course/CourseDetails.kt +++ b/Owl/app/src/main/java/com/example/owl/ui/course/CourseDetails.kt @@ -19,6 +19,7 @@ package com.example.owl.ui.course import androidx.compose.animation.core.animateDpAsState import androidx.compose.foundation.Image import androidx.compose.foundation.clickable +import androidx.compose.foundation.gestures.Orientation.Vertical import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.BoxWithConstraints import androidx.compose.foundation.layout.Column @@ -28,10 +29,10 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredHeight -import androidx.compose.foundation.layout.preferredSize +import androidx.compose.foundation.layout.size import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyListState import androidx.compose.foundation.lazy.LazyRow @@ -59,12 +60,12 @@ import androidx.compose.material.primarySurface import androidx.compose.material.rememberSwipeableState import androidx.compose.material.swipeable import androidx.compose.runtime.Composable -import androidx.compose.runtime.Providers +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.getValue import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.gesture.scrollorientationlocking.Orientation import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.platform.LocalDensity @@ -93,6 +94,7 @@ import dev.chrisbanes.accompanist.insets.LocalWindowInsets import dev.chrisbanes.accompanist.insets.navigationBarsPadding import dev.chrisbanes.accompanist.insets.statusBarsPadding import dev.chrisbanes.accompanist.insets.toPaddingValues +import kotlinx.coroutines.launch private val FabSize = 56.dp private const val ExpandedSheetAlpha = 0.96f @@ -121,10 +123,15 @@ fun CourseDetails( val sheetState = rememberSwipeableState(SheetState.Closed) val fabSize = with(LocalDensity.current) { FabSize.toPx() } val dragRange = constraints.maxHeight - fabSize + val scope = rememberCoroutineScope() backHandler( - enabled = sheetState.value == SheetState.Open, - onBack = { sheetState.animateTo(SheetState.Closed) } + enabled = sheetState.currentValue == SheetState.Open, + onBack = { + scope.launch { + sheetState.animateTo(SheetState.Closed) + } + } ) Box( @@ -137,7 +144,7 @@ fun CourseDetails( -dragRange to SheetState.Open ), thresholds = { _, _ -> FractionalThreshold(0.5f) }, - orientation = Orientation.Vertical + orientation = Vertical ) ) { val openFraction = if (sheetState.offset.value.isNaN()) { @@ -152,7 +159,9 @@ fun CourseDetails( this@BoxWithConstraints.constraints.maxWidth.toFloat(), this@BoxWithConstraints.constraints.maxHeight.toFloat() ) { state -> - sheetState.animateTo(state) + scope.launch { + sheetState.animateTo(state) + } } } } @@ -205,7 +214,7 @@ private fun CourseDescriptionHeader( contentDescription = null, modifier = Modifier .padding(bottom = 4.dp) - .preferredSize(24.dp) + .size(24.dp) .align(Alignment.CenterVertically) ) Spacer(modifier = Modifier.weight(1f)) @@ -213,7 +222,7 @@ private fun CourseDescriptionHeader( OutlinedAvatar( url = course.instructor, modifier = Modifier - .preferredSize(40.dp) + .size(40.dp) .align(Alignment.BottomCenter) .offset(y = 20.dp) // overlap bottom of image ) @@ -244,8 +253,8 @@ private fun CourseDescriptionBody(course: Course) { .fillMaxWidth() .padding(horizontal = 16.dp) ) - Spacer(modifier = Modifier.preferredHeight(16.dp)) - Providers(LocalContentAlpha provides ContentAlpha.medium) { + Spacer(modifier = Modifier.height(16.dp)) + CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) { Text( text = stringResource(id = R.string.course_desc), style = MaterialTheme.typography.body1, @@ -264,7 +273,7 @@ private fun CourseDescriptionBody(course: Course) { .fillMaxWidth() .padding(16.dp) ) - Providers(LocalContentAlpha provides ContentAlpha.medium) { + CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) { Text( text = stringResource(id = R.string.needs), style = MaterialTheme.typography.body1, @@ -318,7 +327,7 @@ private fun RelatedCourses( titleStyle = MaterialTheme.typography.body2, modifier = Modifier .padding(end = 8.dp) - .preferredSize(288.dp, 80.dp), + .size(288.dp, 80.dp), iconSize = 14.dp ) } @@ -424,7 +433,7 @@ private fun Lessons( val fabAlpha = lerp(1f, 0f, 0f, 0.15f, openFraction) Box( modifier = Modifier - .preferredSize(FabSize) + .size(FabSize) .padding(start = 16.dp, top = 8.dp) // visually center contents .graphicsLayer { alpha = fabAlpha } ) { @@ -452,7 +461,7 @@ private fun Lesson(lesson: Lesson) { NetworkImage( url = lesson.imageUrl, contentDescription = null, - modifier = Modifier.preferredSize(112.dp, 64.dp) + modifier = Modifier.size(112.dp, 64.dp) ) Column( modifier = Modifier @@ -465,7 +474,7 @@ private fun Lesson(lesson: Lesson) { maxLines = 2, overflow = TextOverflow.Ellipsis ) - Providers(LocalContentAlpha provides ContentAlpha.medium) { + CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) { Row( modifier = Modifier.padding(top = 4.dp), verticalAlignment = Alignment.CenterVertically @@ -473,7 +482,7 @@ private fun Lesson(lesson: Lesson) { Icon( imageVector = Icons.Rounded.PlayCircleOutline, contentDescription = null, - modifier = Modifier.preferredSize(16.dp) + modifier = Modifier.size(16.dp) ) Text( modifier = Modifier.padding(start = 4.dp), diff --git a/Owl/app/src/main/java/com/example/owl/ui/courses/Courses.kt b/Owl/app/src/main/java/com/example/owl/ui/courses/Courses.kt index 5296a0a685..896fe5b375 100644 --- a/Owl/app/src/main/java/com/example/owl/ui/courses/Courses.kt +++ b/Owl/app/src/main/java/com/example/owl/ui/courses/Courses.kt @@ -19,8 +19,8 @@ package com.example.owl.ui.courses import androidx.annotation.DrawableRes import androidx.annotation.StringRes import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredHeight import androidx.compose.material.BottomNavigation import androidx.compose.material.BottomNavigationItem import androidx.compose.material.Icon @@ -65,7 +65,7 @@ fun Courses(selectCourse: (Long) -> Unit) { label = { Text(stringResource(tab.title).toUpperCase()) }, selected = tab == selectedTab, onClick = { setSelectedTab(tab) }, - alwaysShowLabels = false, + alwaysShowLabel = false, selectedContentColor = MaterialTheme.colors.secondary, unselectedContentColor = LocalContentColor.current, modifier = Modifier.navigationBarsPadding() @@ -88,7 +88,7 @@ fun Courses(selectCourse: (Long) -> Unit) { fun CoursesAppBar() { TopAppBar( elevation = 0.dp, - modifier = Modifier.preferredHeight(80.dp) + modifier = Modifier.height(80.dp) ) { Image( modifier = Modifier diff --git a/Owl/app/src/main/java/com/example/owl/ui/courses/FeaturedCourses.kt b/Owl/app/src/main/java/com/example/owl/ui/courses/FeaturedCourses.kt index 50c3805c62..89af2ce85d 100644 --- a/Owl/app/src/main/java/com/example/owl/ui/courses/FeaturedCourses.kt +++ b/Owl/app/src/main/java/com/example/owl/ui/courses/FeaturedCourses.kt @@ -18,10 +18,9 @@ package com.example.owl.ui.courses import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.ExperimentalLayout import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredSize +import androidx.compose.foundation.layout.size import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material.Icon @@ -75,7 +74,6 @@ fun FeaturedCourses( } } -@OptIn(ExperimentalLayout::class) @Composable fun FeaturedCourse( course: Course, @@ -117,7 +115,7 @@ fun FeaturedCourse( url = course.instructor, outlineColor = outlineColor, modifier = Modifier - .preferredSize(38.dp) + .size(38.dp) .constrainAs(avatar) { centerHorizontallyTo(parent) centerAround(image.bottom) @@ -151,7 +149,7 @@ fun FeaturedCourse( tint = MaterialTheme.colors.primary, contentDescription = null, modifier = Modifier - .preferredSize(16.dp) + .size(16.dp) .constrainAs(icon) { end.linkTo(center) centerVerticallyTo(steps) diff --git a/Owl/app/src/main/java/com/example/owl/ui/courses/MyCourses.kt b/Owl/app/src/main/java/com/example/owl/ui/courses/MyCourses.kt index 3f296186e0..5683d07963 100644 --- a/Owl/app/src/main/java/com/example/owl/ui/courses/MyCourses.kt +++ b/Owl/app/src/main/java/com/example/owl/ui/courses/MyCourses.kt @@ -18,9 +18,9 @@ package com.example.owl.ui.courses import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredHeight -import androidx.compose.foundation.layout.preferredWidth +import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.shape.RoundedCornerShape @@ -61,12 +61,12 @@ fun MyCourse( ) { Row(modifier = Modifier.padding(bottom = 8.dp)) { val stagger = if (index % 2 == 0) 72.dp else 16.dp - Spacer(modifier = Modifier.preferredWidth(stagger)) + Spacer(modifier = Modifier.width(stagger)) CourseListItem( course = course, onClick = { selectCourse(course.id) }, shape = RoundedCornerShape(topStart = 24.dp), - modifier = Modifier.preferredHeight(96.dp) + modifier = Modifier.height(96.dp) ) } } diff --git a/Owl/app/src/main/java/com/example/owl/ui/courses/SearchCourses.kt b/Owl/app/src/main/java/com/example/owl/ui/courses/SearchCourses.kt index ea7ee67c04..b0d1b77456 100644 --- a/Owl/app/src/main/java/com/example/owl/ui/courses/SearchCourses.kt +++ b/Owl/app/src/main/java/com/example/owl/ui/courses/SearchCourses.kt @@ -38,6 +38,7 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.SolidColor import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.TextFieldValue @@ -113,7 +114,7 @@ private fun AppBar( color = LocalContentColor.current ), maxLines = 1, - cursorColor = LocalContentColor.current, + cursorBrush = SolidColor(LocalContentColor.current), modifier = Modifier .weight(1f) .align(Alignment.CenterVertically) diff --git a/Owl/app/src/main/java/com/example/owl/ui/onboarding/Onboarding.kt b/Owl/app/src/main/java/com/example/owl/ui/onboarding/Onboarding.kt index 09b990fac8..856b536f2e 100644 --- a/Owl/app/src/main/java/com/example/owl/ui/onboarding/Onboarding.kt +++ b/Owl/app/src/main/java/com/example/owl/ui/onboarding/Onboarding.kt @@ -28,9 +28,9 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredHeight -import androidx.compose.foundation.layout.preferredSize +import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.foundation.rememberScrollState @@ -51,7 +51,7 @@ import androidx.compose.material.icons.filled.Settings import androidx.compose.material.icons.rounded.Explore import androidx.compose.material.primarySurface import androidx.compose.runtime.Composable -import androidx.compose.runtime.Providers +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -114,7 +114,7 @@ fun Onboarding(onboardingComplete: () -> Unit) { .weight(1f) .wrapContentHeight() ) - Spacer(Modifier.preferredHeight(56.dp)) // center grid accounting for FAB + Spacer(Modifier.height(56.dp)) // center grid accounting for FAB } } } @@ -196,7 +196,7 @@ private fun TopicChip(topic: Topic) { url = topic.imageUrl, contentDescription = null, modifier = Modifier - .preferredSize(width = 72.dp, height = 72.dp) + .size(width = 72.dp, height = 72.dp) .aspectRatio(1f) ) if (selectedAlpha > 0f) { @@ -227,13 +227,13 @@ private fun TopicChip(topic: Topic) { ) ) Row(verticalAlignment = Alignment.CenterVertically) { - Providers(LocalContentAlpha provides ContentAlpha.medium) { + CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) { Icon( painter = painterResource(R.drawable.ic_grain), contentDescription = null, modifier = Modifier .padding(start = 16.dp) - .preferredSize(12.dp) + .size(12.dp) ) Text( text = topic.courses.toString(), diff --git a/Owl/app/src/main/java/com/example/owl/ui/theme/Images.kt b/Owl/app/src/main/java/com/example/owl/ui/theme/Images.kt index da629ea256..fa82bf0727 100644 --- a/Owl/app/src/main/java/com/example/owl/ui/theme/Images.kt +++ b/Owl/app/src/main/java/com/example/owl/ui/theme/Images.kt @@ -26,4 +26,6 @@ import androidx.compose.runtime.staticCompositionLocalOf @Immutable data class Images(@DrawableRes val lockupLogo: Int) -internal val AmbientImages = staticCompositionLocalOf(null) +internal val LocalImages = staticCompositionLocalOf { + error("No LocalImages specified") +} diff --git a/Owl/app/src/main/java/com/example/owl/ui/theme/Theme.kt b/Owl/app/src/main/java/com/example/owl/ui/theme/Theme.kt index ffbfef6f08..6f14c4765f 100644 --- a/Owl/app/src/main/java/com/example/owl/ui/theme/Theme.kt +++ b/Owl/app/src/main/java/com/example/owl/ui/theme/Theme.kt @@ -24,7 +24,7 @@ import androidx.compose.material.Typography import androidx.compose.material.darkColors import androidx.compose.material.lightColors import androidx.compose.runtime.Composable -import androidx.compose.runtime.Providers +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.dp import com.example.owl.R @@ -126,9 +126,9 @@ private fun OwlTheme( ) { val elevation = if (darkTheme) DarkElevation else LightElevation val images = if (darkTheme) DarkImages else LightImages - Providers( + CompositionLocalProvider( LocalElevations provides elevation, - AmbientImages provides images + LocalImages provides images ) { MaterialTheme( colors = colors, @@ -178,5 +178,5 @@ object OwlTheme { */ val images: Images @Composable - get() = AmbientImages.current + get() = LocalImages.current } diff --git a/Owl/app/src/main/java/com/example/owl/ui/utils/NetworkImage.kt b/Owl/app/src/main/java/com/example/owl/ui/utils/NetworkImage.kt index 6a92aaf2f2..b943b59fd9 100644 --- a/Owl/app/src/main/java/com/example/owl/ui/utils/NetworkImage.kt +++ b/Owl/app/src/main/java/com/example/owl/ui/utils/NetworkImage.kt @@ -21,7 +21,7 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.material.MaterialTheme import androidx.compose.runtime.Composable -import androidx.compose.runtime.Providers +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -74,7 +74,7 @@ fun ProvideImageLoader(content: @Composable () -> Unit) { add(UnsplashSizingInterceptor) }.build() } - Providers(LocalImageLoader provides loader, content = content) + CompositionLocalProvider(LocalImageLoader provides loader, content = content) } /** diff --git a/Owl/build.gradle b/Owl/build.gradle index e6d90ac3b3..1d36228870 100644 --- a/Owl/build.gradle +++ b/Owl/build.gradle @@ -38,9 +38,8 @@ subprojects { jcenter() if (!Libs.AndroidX.Compose.snapshot.isEmpty()) { - maven { - url "https://androidx.dev/snapshots/builds/${Libs.AndroidX.Compose.snapshot}/artifacts/repository/" - } + maven { url "https://androidx.dev/snapshots/builds/${Libs.AndroidX.Compose.snapshot}/artifacts/repository/" } + maven { url "http://androidx.dev/storage/repository/androidx/constraintlayout" } } maven { url 'https://oss.sonatype.org/content/repositories/snapshots' } @@ -55,6 +54,13 @@ subprojects { } } + configurations.configureEach { + // androidx.test forces JUnit, 4.12, prefer 4.13 + resolutionStrategy { + force Libs.JUnit.junit + } + } + apply plugin: 'com.diffplug.spotless' spotless { kotlin { diff --git a/Owl/buildSrc/src/main/java/com/example/owl/buildsrc/Dependencies.kt b/Owl/buildSrc/src/main/java/com/example/owl/buildsrc/Dependencies.kt index 4e43012658..76d4b6bf6d 100644 --- a/Owl/buildSrc/src/main/java/com/example/owl/buildsrc/Dependencies.kt +++ b/Owl/buildSrc/src/main/java/com/example/owl/buildsrc/Dependencies.kt @@ -21,11 +21,10 @@ object Versions { } object Libs { - const val androidGradlePlugin = "com.android.tools.build:gradle:7.0.0-alpha05" - const val junit = "junit:junit:4.13" + const val androidGradlePlugin = "com.android.tools.build:gradle:7.0.0-alpha06" object Accompanist { - private const val version = "0.5.1" + private const val version = "0.5.2.compose-7141639-SNAPSHOT" const val coil = "dev.chrisbanes.accompanist:accompanist-coil:$version" const val insets = "dev.chrisbanes.accompanist:accompanist-insets:$version" } @@ -44,13 +43,18 @@ object Libs { const val test = "org.jetbrains.kotlinx:kotlinx-coroutines-test:$version" } + object JUnit { + private const val version = "4.13" + const val junit = "junit:junit:$version" + } + object AndroidX { const val coreKtx = "androidx.core:core-ktx:1.5.0-beta01" - const val navigation = "androidx.navigation:navigation-compose:1.0.0-alpha07" + const val navigation = "androidx.navigation:navigation-compose:1.0.0-SNAPSHOT" object Compose { - const val snapshot = "" - const val version = "1.0.0-alpha12" + const val snapshot = "7141639" + const val version = "1.0.0-SNAPSHOT" const val animation = "androidx.compose.animation:animation:$version" const val foundation = "androidx.compose.foundation:foundation:$version" @@ -65,11 +69,12 @@ object Libs { } object Activity { - const val activityCompose = "androidx.activity:activity-compose:1.3.0-alpha02" + const val activityCompose = "androidx.activity:activity-compose:1.3.0-SNAPSHOT" } object ConstraintLayout { - const val constraintLayoutCompose = "androidx.constraintlayout:constraintlayout-compose:1.0.0-alpha02" + const val constraintLayoutCompose = + "androidx.constraintlayout:constraintlayout-compose:1.0.0-SNAPSHOT" } object Test { From 59583203ca1c388fbc2d0ff17e3585ef10d0be56 Mon Sep 17 00:00:00 2001 From: Nick Butcher Date: Mon, 15 Feb 2021 11:42:14 +0000 Subject: [PATCH 22/37] [Jetsnack] Update to snapshot 7141639. Change-Id: I2da127fb7d0e41dfd1de9b8c80524f92ea74a821 --- .../com/example/jetsnack/ui/MainActivity.kt | 4 +- .../example/jetsnack/ui/components/Button.kt | 15 +++--- .../example/jetsnack/ui/components/Filters.kt | 8 +-- .../ui/components/QuantitySelector.kt | 8 +-- .../jetsnack/ui/components/Scaffold.kt | 4 +- .../example/jetsnack/ui/components/Snacks.kt | 30 +++++------ .../example/jetsnack/ui/components/Surface.kt | 4 +- .../java/com/example/jetsnack/ui/home/Home.kt | 4 +- .../com/example/jetsnack/ui/home/cart/Cart.kt | 15 +++--- .../jetsnack/ui/home/search/Categories.kt | 10 ++-- .../jetsnack/ui/home/search/Results.kt | 14 +++--- .../example/jetsnack/ui/home/search/Search.kt | 14 +++--- .../jetsnack/ui/home/search/Suggestions.kt | 10 ++-- .../jetsnack/ui/snackdetail/SnackDetail.kt | 50 +++++++++---------- .../com/example/jetsnack/ui/theme/Theme.kt | 4 +- .../com/example/jetsnack/ui/utils/SystemUi.kt | 2 +- Jetsnack/build.gradle | 6 ++- .../example/jetsnack/buildsrc/Dependencies.kt | 30 ++++------- 18 files changed, 111 insertions(+), 121 deletions(-) diff --git a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/MainActivity.kt b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/MainActivity.kt index c405ac1e4f..07aea3c7d6 100644 --- a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/MainActivity.kt +++ b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/MainActivity.kt @@ -19,7 +19,7 @@ package com.example.jetsnack.ui import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent -import androidx.compose.runtime.Providers +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.remember import androidx.core.view.WindowCompat import com.example.jetsnack.ui.utils.LocalSysUiController @@ -34,7 +34,7 @@ class MainActivity : ComponentActivity() { setContent { val systemUiController = remember { SystemUiController(window) } - Providers(LocalSysUiController provides systemUiController) { + CompositionLocalProvider(LocalSysUiController provides systemUiController) { JetsnackApp(onBackPressedDispatcher) } } diff --git a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/Button.kt b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/Button.kt index b8459c8535..6500ffdaad 100644 --- a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/Button.kt +++ b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/Button.kt @@ -17,21 +17,21 @@ package com.example.jetsnack.ui.components import androidx.compose.foundation.BorderStroke -import androidx.compose.foundation.InteractionState -import androidx.compose.foundation.LocalIndication import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.indication +import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.RowScope -import androidx.compose.foundation.layout.defaultMinSizeConstraints +import androidx.compose.foundation.layout.defaultMinSize import androidx.compose.foundation.layout.padding import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.ButtonDefaults import androidx.compose.material.MaterialTheme import androidx.compose.material.ProvideTextStyle +import androidx.compose.material.ripple.rememberRipple import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Alignment @@ -44,11 +44,12 @@ import androidx.compose.ui.semantics.Role import com.example.jetsnack.ui.theme.JetsnackTheme @Composable + fun JetsnackButton( onClick: () -> Unit, modifier: Modifier = Modifier, enabled: Boolean = true, - interactionState: InteractionState = remember { InteractionState() }, + interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, shape: Shape = ButtonShape, border: BorderStroke? = null, backgroundGradient: List = JetsnackTheme.colors.interactivePrimary, @@ -74,7 +75,7 @@ fun JetsnackButton( onClick = onClick, enabled = enabled, role = Role.Button, - interactionState = interactionState, + interactionSource = interactionSource, indication = null ) ) { @@ -83,11 +84,11 @@ fun JetsnackButton( ) { Row( Modifier - .defaultMinSizeConstraints( + .defaultMinSize( minWidth = ButtonDefaults.MinWidth, minHeight = ButtonDefaults.MinHeight ) - .indication(interactionState, LocalIndication.current) + .indication(interactionSource, rememberRipple()) .padding(contentPadding), horizontalArrangement = Arrangement.Center, verticalAlignment = Alignment.CenterVertically, diff --git a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/Filters.kt b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/Filters.kt index a2cb49d366..fdef0ce8d5 100644 --- a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/Filters.kt +++ b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/Filters.kt @@ -20,9 +20,9 @@ import androidx.compose.animation.animateColorAsState import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredHeight -import androidx.compose.foundation.layout.preferredHeightIn import androidx.compose.foundation.lazy.LazyRow import androidx.compose.foundation.lazy.items import androidx.compose.foundation.selection.toggleable @@ -50,7 +50,7 @@ fun FilterBar(filters: List) { verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(8.dp), contentPadding = PaddingValues(start = 8.dp, end = 8.dp), - modifier = Modifier.preferredHeightIn(min = 56.dp) + modifier = Modifier.heightIn(min = 56.dp) ) { item { IconButton(onClick = { /* todo */ }) { @@ -91,7 +91,7 @@ fun FilterChip( ) JetsnackSurface( modifier = modifier - .preferredHeight(28.dp) + .height(28.dp) .then(border), color = backgroundColor, contentColor = textColor, diff --git a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/QuantitySelector.kt b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/QuantitySelector.kt index a5a2484e2d..f852eac663 100644 --- a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/QuantitySelector.kt +++ b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/QuantitySelector.kt @@ -17,7 +17,7 @@ package com.example.jetsnack.ui.components import androidx.compose.animation.Crossfade -import androidx.compose.foundation.layout.preferredWidthIn +import androidx.compose.foundation.layout.widthIn import androidx.compose.material.ContentAlpha import androidx.compose.material.LocalContentAlpha import androidx.compose.material.MaterialTheme @@ -26,7 +26,7 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.AddCircleOutline import androidx.compose.material.icons.outlined.RemoveCircleOutline import androidx.compose.runtime.Composable -import androidx.compose.runtime.Providers +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign @@ -48,7 +48,7 @@ fun QuantitySelector( ConstraintLayout(modifier = modifier) { val (qty, minus, quantity, plus) = createRefs() createHorizontalChain(qty, minus, quantity, plus, chainStyle = ChainStyle.Packed) - Providers(LocalContentAlpha provides ContentAlpha.medium) { + CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) { Text( text = stringResource(R.string.quantity), style = MaterialTheme.typography.subtitle1, @@ -79,7 +79,7 @@ fun QuantitySelector( fontSize = 18.sp, color = JetsnackTheme.colors.textPrimary, textAlign = TextAlign.Center, - modifier = Modifier.preferredWidthIn(min = 24.dp) + modifier = Modifier.widthIn(min = 24.dp) ) } JetsnackGradientTintedIconButton( diff --git a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/Scaffold.kt b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/Scaffold.kt index 68419d2b22..337a02d8c6 100644 --- a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/Scaffold.kt +++ b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/Scaffold.kt @@ -56,7 +56,7 @@ fun JetsnackScaffold( drawerScrimColor: Color = JetsnackTheme.colors.uiBorder, backgroundColor: Color = JetsnackTheme.colors.uiBackground, contentColor: Color = JetsnackTheme.colors.textSecondary, - bodyContent: @Composable (PaddingValues) -> Unit + content: @Composable (PaddingValues) -> Unit ) { Scaffold( modifier = modifier, @@ -75,6 +75,6 @@ fun JetsnackScaffold( drawerScrimColor = drawerScrimColor, backgroundColor = backgroundColor, contentColor = contentColor, - bodyContent = bodyContent + content = content ) } diff --git a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/Snacks.kt b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/Snacks.kt index 7f2ae21af1..96126de9a8 100644 --- a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/Snacks.kt +++ b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/Snacks.kt @@ -25,10 +25,10 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredHeight -import androidx.compose.foundation.layout.preferredHeightIn -import androidx.compose.foundation.layout.preferredSize +import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.wrapContentWidth import androidx.compose.foundation.lazy.LazyRow import androidx.compose.foundation.lazy.items @@ -80,7 +80,7 @@ fun SnackCollection( Row( verticalAlignment = Alignment.CenterVertically, modifier = Modifier - .preferredHeightIn(min = 56.dp) + .heightIn(min = 56.dp) .padding(start = 24.dp) ) { Text( @@ -119,7 +119,7 @@ private fun HighlightedSnacks( onSnackClick: (Long) -> Unit, modifier: Modifier = Modifier ) { - val scroll = rememberScrollState(0f) + val scroll = rememberScrollState(0) val gradient = when (index % 2) { 0 -> JetsnackTheme.colors.gradient6_1 else -> JetsnackTheme.colors.gradient6_2 @@ -186,7 +186,7 @@ fun SnackItem( imageUrl = snack.imageUrl, elevation = 4.dp, contentDescription = null, - modifier = Modifier.preferredSize(120.dp) + modifier = Modifier.size(120.dp) ) Text( text = snack.name, @@ -205,7 +205,7 @@ private fun HighlightSnackItem( index: Int, gradient: List, gradientWidth: Float, - scroll: Float, + scroll: Int, modifier: Modifier = Modifier ) { val left = index * with(LocalDensity.current) { @@ -214,7 +214,7 @@ private fun HighlightSnackItem( JetsnackCard( elevation = 4.dp, modifier = modifier - .preferredSize( + .size( width = 170.dp, height = 250.dp ) @@ -227,13 +227,13 @@ private fun HighlightSnackItem( ) { Box( modifier = Modifier - .preferredHeight(160.dp) + .height(160.dp) .fillMaxWidth() ) { val gradientOffset = left - (scroll / 3f) Box( modifier = Modifier - .preferredHeight(100.dp) + .height(100.dp) .fillMaxWidth() .offsetGradientBackground(gradient, gradientWidth, gradientOffset) ) @@ -241,11 +241,11 @@ private fun HighlightSnackItem( imageUrl = snack.imageUrl, contentDescription = null, modifier = Modifier - .preferredSize(120.dp) + .size(120.dp) .align(Alignment.BottomCenter) ) } - Spacer(modifier = Modifier.preferredHeight(8.dp)) + Spacer(modifier = Modifier.height(8.dp)) Text( text = snack.name, maxLines = 1, @@ -254,7 +254,7 @@ private fun HighlightSnackItem( color = JetsnackTheme.colors.textSecondary, modifier = Modifier.padding(horizontal = 16.dp) ) - Spacer(modifier = Modifier.preferredHeight(4.dp)) + Spacer(modifier = Modifier.height(4.dp)) Text( text = snack.tagline, style = MaterialTheme.typography.body1, @@ -298,7 +298,7 @@ fun SnackCardPreview() { index = 0, gradient = JetsnackTheme.colors.gradient6_1, gradientWidth = gradientWidth, - scroll = 0f + scroll = 0 ) } } @@ -314,7 +314,7 @@ fun SnackCardDarkPreview() { index = 0, gradient = JetsnackTheme.colors.gradient6_1, gradientWidth = gradientWidth, - scroll = 0f + scroll = 0 ) } } diff --git a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/Surface.kt b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/Surface.kt index 0e682c356d..584c446367 100644 --- a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/Surface.kt +++ b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/Surface.kt @@ -22,7 +22,7 @@ import androidx.compose.foundation.border import androidx.compose.foundation.layout.Box import androidx.compose.material.LocalContentColor import androidx.compose.runtime.Composable -import androidx.compose.runtime.Providers +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.shadow @@ -60,7 +60,7 @@ fun JetsnackSurface( ) .clip(shape) ) { - Providers(LocalContentColor provides contentColor, content = content) + CompositionLocalProvider(LocalContentColor provides contentColor, content = content) } } diff --git a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/Home.kt b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/Home.kt index 9768d5999f..d8e76bf65d 100644 --- a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/Home.kt +++ b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/Home.kt @@ -29,8 +29,8 @@ import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.BoxScope import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredHeight import androidx.compose.foundation.selection.selectable import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.Icon @@ -207,7 +207,7 @@ private fun JetsnackBottomNavLayout( } Layout( - modifier = modifier.preferredHeight(BottomNavHeight), + modifier = modifier.height(BottomNavHeight), content = { content() Box(Modifier.layoutId("indicator"), content = indicator) diff --git a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/cart/Cart.kt b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/cart/Cart.kt index 408d3eaea0..0f427ca736 100644 --- a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/cart/Cart.kt +++ b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/cart/Cart.kt @@ -25,10 +25,9 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredHeight -import androidx.compose.foundation.layout.preferredHeightIn -import androidx.compose.foundation.layout.preferredSize +import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.foundation.layout.wrapContentWidth import androidx.compose.foundation.lazy.LazyColumn @@ -144,7 +143,7 @@ private fun CartContent( maxLines = 1, overflow = TextOverflow.Ellipsis, modifier = Modifier - .preferredHeightIn(min = 56.dp) + .heightIn(min = 56.dp) .padding(horizontal = 24.dp, vertical = 4.dp) .wrapContentHeight() ) @@ -197,7 +196,7 @@ fun CartItem( imageUrl = snack.imageUrl, contentDescription = null, modifier = Modifier - .preferredSize(100.dp) + .size(100.dp) .constrainAs(image) { top.linkTo(parent.top, margin = 16.dp) bottom.linkTo(parent.bottom, margin = 16.dp) @@ -249,7 +248,7 @@ fun CartItem( ) Spacer( Modifier - .preferredHeight(8.dp) + .height(8.dp) .constrainAs(priceSpacer) { linkTo(top = tag.bottom, bottom = price.top) } @@ -301,7 +300,7 @@ fun SummaryItem( overflow = TextOverflow.Ellipsis, modifier = Modifier .padding(horizontal = 24.dp) - .preferredHeightIn(min = 56.dp) + .heightIn(min = 56.dp) .wrapContentHeight() ) Row(modifier = Modifier.padding(horizontal = 24.dp)) { @@ -334,7 +333,7 @@ fun SummaryItem( modifier = Modifier.alignBy(LastBaseline) ) } - Spacer(modifier = Modifier.preferredHeight(8.dp)) + Spacer(modifier = Modifier.height(8.dp)) JetsnackDivider() Row(modifier = Modifier.padding(horizontal = 24.dp, vertical = 8.dp)) { Text( diff --git a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/search/Categories.kt b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/search/Categories.kt index 563a0e184f..c72c240fd3 100644 --- a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/search/Categories.kt +++ b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/search/Categories.kt @@ -22,9 +22,9 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredHeight -import androidx.compose.foundation.layout.preferredHeightIn import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.itemsIndexed @@ -57,7 +57,7 @@ fun SearchCategories( SearchCategoryCollection(collection, index) } } - Spacer(Modifier.preferredHeight(8.dp)) + Spacer(Modifier.height(8.dp)) } @Composable @@ -72,7 +72,7 @@ private fun SearchCategoryCollection( style = MaterialTheme.typography.h6, color = JetsnackTheme.colors.textPrimary, modifier = Modifier - .preferredHeightIn(min = 56.dp) + .heightIn(min = 56.dp) .padding(horizontal = 24.dp, vertical = 4.dp) .wrapContentHeight() ) @@ -89,7 +89,7 @@ private fun SearchCategoryCollection( ) } } - Spacer(Modifier.preferredHeight(4.dp)) + Spacer(Modifier.height(4.dp)) } } diff --git a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/search/Results.kt b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/search/Results.kt index 87298a161b..f6fd552169 100644 --- a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/search/Results.kt +++ b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/search/Results.kt @@ -23,9 +23,9 @@ import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredHeight -import androidx.compose.foundation.layout.preferredSize +import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.itemsIndexed @@ -106,7 +106,7 @@ private fun SearchResult( imageUrl = snack.imageUrl, contentDescription = null, modifier = Modifier - .preferredSize(100.dp) + .size(100.dp) .constrainAs(image) { linkTo( top = parent.top, @@ -147,7 +147,7 @@ private fun SearchResult( ) Spacer( Modifier - .preferredHeight(8.dp) + .height(8.dp) .constrainAs(priceSpacer) { linkTo(top = tag.bottom, bottom = price.top) } @@ -171,7 +171,7 @@ private fun SearchResult( shape = CircleShape, contentPadding = PaddingValues(0.dp), modifier = Modifier - .preferredSize(36.dp) + .size(36.dp) .constrainAs(add) { linkTo(top = parent.top, bottom = parent.bottom) end.linkTo(parent.end) @@ -201,14 +201,14 @@ fun NoResults( painterResource(R.drawable.empty_state_search), contentDescription = null ) - Spacer(Modifier.preferredHeight(24.dp)) + Spacer(Modifier.height(24.dp)) Text( text = stringResource(R.string.search_no_matches, query), style = MaterialTheme.typography.subtitle1, textAlign = TextAlign.Center, modifier = Modifier.fillMaxWidth() ) - Spacer(Modifier.preferredHeight(16.dp)) + Spacer(Modifier.height(16.dp)) Text( text = stringResource(R.string.search_no_matches_retry), style = MaterialTheme.typography.body2, diff --git a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/search/Search.kt b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/search/Search.kt index a57a5b352f..ec1ed3ea5f 100644 --- a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/search/Search.kt +++ b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/search/Search.kt @@ -22,10 +22,10 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredHeight -import androidx.compose.foundation.layout.preferredSize -import androidx.compose.foundation.layout.preferredWidth +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.foundation.text.BasicTextField @@ -174,7 +174,7 @@ private fun SearchBar( shape = MaterialTheme.shapes.small, modifier = modifier .fillMaxWidth() - .preferredHeight(56.dp) + .height(56.dp) .padding(horizontal = 24.dp, vertical = 8.dp) ) { Box(Modifier.fillMaxSize()) { @@ -210,10 +210,10 @@ private fun SearchBar( color = JetsnackTheme.colors.iconPrimary, modifier = Modifier .padding(horizontal = 6.dp) - .preferredSize(36.dp) + .size(36.dp) ) } else { - Spacer(Modifier.preferredWidth(IconSize)) // balance arrow icon + Spacer(Modifier.width(IconSize)) // balance arrow icon } } } @@ -235,7 +235,7 @@ private fun SearchHint() { tint = JetsnackTheme.colors.textHelp, contentDescription = stringResource(R.string.label_search) ) - Spacer(Modifier.preferredWidth(8.dp)) + Spacer(Modifier.width(8.dp)) Text( text = stringResource(R.string.search_jetsnack), color = JetsnackTheme.colors.textHelp diff --git a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/search/Suggestions.kt b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/search/Suggestions.kt index a86bdd7bc4..bf96a1c2a9 100644 --- a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/search/Suggestions.kt +++ b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/search/Suggestions.kt @@ -18,9 +18,9 @@ package com.example.jetsnack.ui.home.search import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredHeight -import androidx.compose.foundation.layout.preferredHeightIn import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.foundation.lazy.LazyColumn @@ -55,7 +55,7 @@ fun SearchSuggestions( ) } item { - Spacer(Modifier.preferredHeight(4.dp)) + Spacer(Modifier.height(4.dp)) } } } @@ -71,7 +71,7 @@ private fun SuggestionHeader( style = MaterialTheme.typography.h6, color = JetsnackTheme.colors.textPrimary, modifier = modifier - .preferredHeightIn(min = 56.dp) + .heightIn(min = 56.dp) .padding(horizontal = 24.dp, vertical = 4.dp) .wrapContentHeight() ) @@ -87,7 +87,7 @@ private fun Suggestion( text = suggestion, style = MaterialTheme.typography.subtitle1, modifier = modifier - .preferredHeightIn(min = 48.dp) + .heightIn(min = 48.dp) .clickable { onSuggestionSelect(suggestion) } .padding(start = 24.dp) .wrapContentSize(Alignment.CenterStart) diff --git a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/snackdetail/SnackDetail.kt b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/snackdetail/SnackDetail.kt index de7597a032..cad681f444 100644 --- a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/snackdetail/SnackDetail.kt +++ b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/snackdetail/SnackDetail.kt @@ -25,11 +25,11 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredHeight -import androidx.compose.foundation.layout.preferredHeightIn -import androidx.compose.foundation.layout.preferredSize -import androidx.compose.foundation.layout.preferredWidth +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.verticalScroll @@ -94,7 +94,7 @@ fun SnackDetail( val related = remember(snackId) { SnackRepo.getRelated(snackId) } Box(Modifier.fillMaxSize()) { - val scroll = rememberScrollState(0f) + val scroll = rememberScrollState(0) Header() Body(related, scroll) Title(snack, scroll.value) @@ -108,7 +108,7 @@ fun SnackDetail( private fun Header() { Spacer( modifier = Modifier - .preferredHeight(280.dp) + .height(280.dp) .fillMaxWidth() .background(Brush.horizontalGradient(JetsnackTheme.colors.interactivePrimary)) ) @@ -121,7 +121,7 @@ private fun Up(upPress: () -> Unit) { modifier = Modifier .statusBarsPadding() .padding(horizontal = 16.dp, vertical = 10.dp) - .preferredSize(36.dp) + .size(36.dp) .background( color = Neutral8.copy(alpha = 0.32f), shape = CircleShape @@ -145,25 +145,25 @@ private fun Body( modifier = Modifier .fillMaxWidth() .statusBarsPadding() - .preferredHeight(MinTitleOffset) + .height(MinTitleOffset) ) Column( modifier = Modifier.verticalScroll(scroll) ) { - Spacer(Modifier.preferredHeight(GradientScroll)) + Spacer(Modifier.height(GradientScroll)) JetsnackSurface(Modifier.fillMaxWidth()) { Column { - Spacer(Modifier.preferredHeight(ImageOverlap)) - Spacer(Modifier.preferredHeight(TitleHeight)) + Spacer(Modifier.height(ImageOverlap)) + Spacer(Modifier.height(TitleHeight)) - Spacer(Modifier.preferredHeight(16.dp)) + Spacer(Modifier.height(16.dp)) Text( text = stringResource(R.string.detail_header), style = MaterialTheme.typography.overline, color = JetsnackTheme.colors.textHelp, modifier = HzPadding ) - Spacer(Modifier.preferredHeight(4.dp)) + Spacer(Modifier.height(4.dp)) Text( text = stringResource(R.string.detail_placeholder), style = MaterialTheme.typography.body1, @@ -171,14 +171,14 @@ private fun Body( modifier = HzPadding ) - Spacer(Modifier.preferredHeight(40.dp)) + Spacer(Modifier.height(40.dp)) Text( text = stringResource(R.string.ingredients), style = MaterialTheme.typography.overline, color = JetsnackTheme.colors.textHelp, modifier = HzPadding ) - Spacer(Modifier.preferredHeight(4.dp)) + Spacer(Modifier.height(4.dp)) Text( text = stringResource(R.string.ingredients_list), style = MaterialTheme.typography.body1, @@ -186,7 +186,7 @@ private fun Body( modifier = HzPadding ) - Spacer(Modifier.preferredHeight(16.dp)) + Spacer(Modifier.height(16.dp)) JetsnackDivider() related.forEach { snackCollection -> @@ -203,7 +203,7 @@ private fun Body( modifier = Modifier .padding(bottom = BottomBarHeight) .navigationBarsPadding(left = false, right = false) - .preferredHeight(8.dp) + .height(8.dp) ) } } @@ -212,19 +212,19 @@ private fun Body( } @Composable -private fun Title(snack: Snack, scroll: Float) { +private fun Title(snack: Snack, scroll: Int) { val maxOffset = with(LocalDensity.current) { MaxTitleOffset.toPx() } val minOffset = with(LocalDensity.current) { MinTitleOffset.toPx() } val offset = (maxOffset - scroll).coerceAtLeast(minOffset) Column( verticalArrangement = Arrangement.Bottom, modifier = Modifier - .preferredHeightIn(min = TitleHeight) + .heightIn(min = TitleHeight) .statusBarsPadding() .graphicsLayer { translationY = offset } .background(color = JetsnackTheme.colors.uiBackground) ) { - Spacer(Modifier.preferredHeight(16.dp)) + Spacer(Modifier.height(16.dp)) Text( text = snack.name, style = MaterialTheme.typography.h4, @@ -238,7 +238,7 @@ private fun Title(snack: Snack, scroll: Float) { color = JetsnackTheme.colors.textHelp, modifier = HzPadding ) - Spacer(Modifier.preferredHeight(4.dp)) + Spacer(Modifier.height(4.dp)) Text( text = formatPrice(snack.price), style = MaterialTheme.typography.h6, @@ -246,7 +246,7 @@ private fun Title(snack: Snack, scroll: Float) { modifier = HzPadding ) - Spacer(Modifier.preferredHeight(8.dp)) + Spacer(Modifier.height(8.dp)) JetsnackDivider() } } @@ -254,7 +254,7 @@ private fun Title(snack: Snack, scroll: Float) { @Composable private fun Image( imageUrl: String, - scroll: Float + scroll: Int ) { val collapseRange = with(LocalDensity.current) { (MaxTitleOffset - MinTitleOffset).toPx() } val collapseFraction = (scroll / collapseRange).coerceIn(0f, 1f) @@ -314,14 +314,14 @@ private fun CartBottomBar(modifier: Modifier = Modifier) { modifier = Modifier .navigationBarsPadding(left = false, right = false) .then(HzPadding) - .preferredHeightIn(min = BottomBarHeight) + .heightIn(min = BottomBarHeight) ) { QuantitySelector( count = count, decreaseItemCount = { if (count > 0) updateCount(count - 1) }, increaseItemCount = { updateCount(count + 1) } ) - Spacer(Modifier.preferredWidth(16.dp)) + Spacer(Modifier.width(16.dp)) JetsnackButton( onClick = { /* todo */ }, modifier = Modifier.weight(1f) diff --git a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/theme/Theme.kt b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/theme/Theme.kt index 4eb4d8c5f9..b7b61f9007 100644 --- a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/theme/Theme.kt +++ b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/theme/Theme.kt @@ -20,7 +20,7 @@ import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.material.Colors import androidx.compose.material.MaterialTheme import androidx.compose.runtime.Composable -import androidx.compose.runtime.Providers +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.SideEffect import androidx.compose.runtime.Stable import androidx.compose.runtime.getValue @@ -225,7 +225,7 @@ fun ProvideJetsnackColors( ) { val colorPalette = remember { colors } colorPalette.update(colors) - Providers(LocalJetsnackColors provides colorPalette, content = content) + CompositionLocalProvider(LocalJetsnackColors provides colorPalette, content = content) } private val LocalJetsnackColors = staticCompositionLocalOf { diff --git a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/utils/SystemUi.kt b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/utils/SystemUi.kt index 22166b1473..1af6be3666 100644 --- a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/utils/SystemUi.kt +++ b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/utils/SystemUi.kt @@ -142,7 +142,7 @@ private class SystemUiControllerImpl(private val window: Window) : SystemUiContr /** * An [androidx.compose.runtime.Ambient] holding the current [LocalSysUiController]. Defaults to a - * no-op controller; consumers should [provide][androidx.compose.runtime.Providers] a real one. + * no-op controller; consumers should [provide][androidx.compose.runtime.CompositionLocalProvider] a real one. */ val LocalSysUiController = staticCompositionLocalOf { FakeSystemUiController diff --git a/Jetsnack/build.gradle b/Jetsnack/build.gradle index 3744155a33..08b130f99a 100644 --- a/Jetsnack/build.gradle +++ b/Jetsnack/build.gradle @@ -37,9 +37,11 @@ subprojects { google() jcenter() - if (Libs.AndroidX.Compose.version.endsWith('SNAPSHOT')) { - maven { url Libs.AndroidX.Compose.snapshotUrl } + if (!Libs.AndroidX.Compose.snapshot.isEmpty()) { + maven { url "https://androidx.dev/snapshots/builds/${Libs.AndroidX.Compose.snapshot}/artifacts/repository/" } + maven { url "http://androidx.dev/storage/repository/androidx/constraintlayout" } } + maven { url 'https://oss.sonatype.org/content/repositories/snapshots' } } tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach { diff --git a/Jetsnack/buildSrc/src/main/java/com/example/jetsnack/buildsrc/Dependencies.kt b/Jetsnack/buildSrc/src/main/java/com/example/jetsnack/buildsrc/Dependencies.kt index b9da6135ac..23dc12ea58 100644 --- a/Jetsnack/buildSrc/src/main/java/com/example/jetsnack/buildsrc/Dependencies.kt +++ b/Jetsnack/buildSrc/src/main/java/com/example/jetsnack/buildsrc/Dependencies.kt @@ -21,11 +21,10 @@ object Versions { } object Libs { - const val androidGradlePlugin = "com.android.tools.build:gradle:7.0.0-alpha05" - const val junit = "junit:junit:4.13" + const val androidGradlePlugin = "com.android.tools.build:gradle:7.0.0-alpha06" object Accompanist { - private const val version = "0.5.1" + private const val version = "0.5.2.compose-7141639-SNAPSHOT" const val coil = "dev.chrisbanes.accompanist:accompanist-coil:$version" const val insets = "dev.chrisbanes.accompanist:accompanist-insets:$version" } @@ -48,8 +47,8 @@ object Libs { const val coreKtx = "androidx.core:core-ktx:1.5.0-beta01" object Compose { - const val snapshot = "" - const val version = "1.0.0-alpha12" + const val snapshot = "7141639" + const val version = "1.0.0-SNAPSHOT" const val foundation = "androidx.compose.foundation:foundation:${version}" const val layout = "androidx.compose.foundation:foundation-layout:${version}" @@ -63,28 +62,17 @@ object Libs { } object Activity { - const val activityCompose = "androidx.activity:activity-compose:1.3.0-alpha02" + const val activityCompose = "androidx.activity:activity-compose:1.3.0-SNAPSHOT" } object Lifecycle { - const val viewModelCompose = "androidx.lifecycle:lifecycle-viewmodel-compose:1.0.0-alpha01" + const val viewModelCompose = + "androidx.lifecycle:lifecycle-viewmodel-compose:1.0.0-SNAPSHOT" } object ConstraintLayout { - const val constraintLayoutCompose = "androidx.constraintlayout:constraintlayout-compose:1.0.0-alpha02" - } - - object Test { - private const val version = "1.2.0" - const val core = "androidx.test:core:$version" - const val rules = "androidx.test:rules:$version" - - object Ext { - private const val version = "1.1.2-rc01" - const val junit = "androidx.test.ext:junit-ktx:$version" - } - - const val espressoCore = "androidx.test.espresso:espresso-core:3.2.0" + const val constraintLayoutCompose = + "androidx.constraintlayout:constraintlayout-compose:1.0.0-SNAPSHOT" } } } From 3292ea4a8c5e436012d99eb5799f2556356cd300 Mon Sep 17 00:00:00 2001 From: Yacine Rezgui Date: Thu, 18 Feb 2021 10:01:14 +0000 Subject: [PATCH 23/37] Bring back click logic --- .../jetcaster/ui/home/category/PodcastCategory.kt | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/category/PodcastCategory.kt b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/category/PodcastCategory.kt index 0916445b72..f0e0d1c848 100644 --- a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/category/PodcastCategory.kt +++ b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/category/PodcastCategory.kt @@ -18,6 +18,7 @@ package com.example.jetcaster.ui.home.category import androidx.compose.foundation.Image import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues @@ -44,10 +45,12 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.MoreVert import androidx.compose.material.icons.filled.PlaylistAdd import androidx.compose.material.icons.rounded.PlayCircleFilled +import androidx.compose.material.ripple.rememberRipple import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip @@ -210,15 +213,15 @@ fun EpisodeListItem( ) } - // TODO: Bring back clickable logic - // https://github.com/android/compose-samples/blob/89b5cf0482a52d58119b1f46bc977d2ec4fadfad/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/category/PodcastCategory.kt#L220-L223 - Image( imageVector = Icons.Rounded.PlayCircleFilled, contentDescription = stringResource(R.string.cd_play), contentScale = ContentScale.Fit, colorFilter = ColorFilter.tint(LocalContentColor.current), - modifier = Modifier.clickable { /* TODO */ } + modifier = Modifier.clickable( + interactionSource = remember { MutableInteractionSource() }, + indication = rememberRipple(bounded = false, radius = 24.dp) + ) { /* TODO */ } .size(36.dp) .constrainAs(playIcon) { start.linkTo(parent.start, Keyline1) From 9a068b47b80b8af83183edfda5d492776de7a333 Mon Sep 17 00:00:00 2001 From: Manuel Vivo Date: Thu, 18 Feb 2021 12:07:07 +0100 Subject: [PATCH 24/37] [Crane] Update to snapshot 7141639 (#396) --- .../samples/crane/calendar/CalendarTest.kt | 16 +++++++---- .../compose/samples/crane/home/HomeTest.kt | 11 +++++--- .../samples/crane/base/BaseUserInput.kt | 13 +++++---- .../compose/samples/crane/base/CraneDrawer.kt | 4 +-- .../compose/samples/crane/base/CraneTabs.kt | 6 ++-- .../samples/crane/base/ExploreSection.kt | 16 +++++------ .../samples/crane/calendar/Calendar.kt | 16 +++++------ .../samples/crane/details/DetailsActivity.kt | 6 ++-- .../compose/samples/crane/home/CraneHome.kt | 28 +++++++++++-------- .../samples/crane/home/HomeFeatures.kt | 18 ++++++------ Crane/build.gradle | 6 ++++ .../example/crane/buildsrc/Dependencies.kt | 14 +++++----- 12 files changed, 86 insertions(+), 68 deletions(-) diff --git a/Crane/app/src/androidTest/java/androidx/compose/samples/crane/calendar/CalendarTest.kt b/Crane/app/src/androidTest/java/androidx/compose/samples/crane/calendar/CalendarTest.kt index 032b8b70ec..f37a2ccc0b 100644 --- a/Crane/app/src/androidTest/java/androidx/compose/samples/crane/calendar/CalendarTest.kt +++ b/Crane/app/src/androidTest/java/androidx/compose/samples/crane/calendar/CalendarTest.kt @@ -27,6 +27,7 @@ import androidx.compose.samples.crane.data.DatesRepository import androidx.compose.samples.crane.ui.CraneTheme import androidx.compose.ui.test.SemanticsMatcher import androidx.compose.ui.test.assertContentDescriptionEquals +import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.junit4.ComposeTestRule import androidx.compose.ui.test.junit4.createAndroidComposeRule import androidx.compose.ui.test.onNodeWithContentDescription @@ -68,16 +69,17 @@ class CalendarTest { @Ignore("performScrollTo doesn't work with LazyLists: issuetracker.google.com/178483889") @Test fun scrollsToTheBottom() { - composeTestRule.onNodeWithContentDescription("January 1").assertExists() + composeTestRule.onNodeWithContentDescription("January 1").assertIsDisplayed() composeTestRule.onNodeWithContentDescription("December 31").performScrollTo().performClick() assert(datesRepository.datesSelected.toString() == "Dec 31") } @Test fun onDaySelected() { - composeTestRule.onNodeWithContentDescription("January 1").assertExists() - composeTestRule.onNodeWithContentDescription("January 2").assertExists().performClick() - composeTestRule.onNodeWithContentDescription("January 3").assertExists() + composeTestRule.onNodeWithContentDescription("January 1").assertIsDisplayed() + composeTestRule.onNodeWithContentDescription("January 2") + .assertIsDisplayed().performClick() + composeTestRule.onNodeWithContentDescription("January 3").assertIsDisplayed() val datesNoSelected = composeTestRule.onDateNodes(NoSelected) datesNoSelected[0].assertContentDescriptionEquals("January 1") @@ -88,13 +90,15 @@ class CalendarTest { @Test fun twoDaysSelected() { - composeTestRule.onNodeWithContentDescription("January 2").assertExists().performClick() + composeTestRule.onNodeWithContentDescription("January 2") + .assertIsDisplayed().performClick() val datesNoSelectedOneClick = composeTestRule.onDateNodes(NoSelected) datesNoSelectedOneClick[0].assertContentDescriptionEquals("January 1") datesNoSelectedOneClick[1].assertContentDescriptionEquals("January 3") - composeTestRule.onNodeWithContentDescription("January 4").assertExists().performClick() + composeTestRule.onNodeWithContentDescription("January 4") + .assertIsDisplayed().performClick() composeTestRule.onDateNode(FirstDay).assertContentDescriptionEquals("January 2") composeTestRule.onDateNode(Selected).assertContentDescriptionEquals("January 3") diff --git a/Crane/app/src/androidTest/java/androidx/compose/samples/crane/home/HomeTest.kt b/Crane/app/src/androidTest/java/androidx/compose/samples/crane/home/HomeTest.kt index 6867a6daa1..65dbbfc454 100644 --- a/Crane/app/src/androidTest/java/androidx/compose/samples/crane/home/HomeTest.kt +++ b/Crane/app/src/androidTest/java/androidx/compose/samples/crane/home/HomeTest.kt @@ -16,12 +16,14 @@ package androidx.compose.samples.crane.home +import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.junit4.createAndroidComposeRule import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick import dagger.hilt.android.testing.HiltAndroidRule import dagger.hilt.android.testing.HiltAndroidTest import org.junit.Before +import org.junit.Ignore import org.junit.Rule import org.junit.Test @@ -41,14 +43,15 @@ class HomeTest { } } + @Ignore("Swipeable bug makes the app crash: https://issuetracker.google.com/180488877") @Test fun home_navigatesToAllScreens() { - composeTestRule.onNodeWithText("Explore Flights by Destination").assertExists() + composeTestRule.onNodeWithText("Explore Flights by Destination").assertIsDisplayed() composeTestRule.onNodeWithText("SLEEP").performClick() - composeTestRule.onNodeWithText("Explore Properties by Destination").assertExists() + composeTestRule.onNodeWithText("Explore Properties by Destination").assertIsDisplayed() composeTestRule.onNodeWithText("EAT").performClick() - composeTestRule.onNodeWithText("Explore Restaurants by Destination").assertExists() + composeTestRule.onNodeWithText("Explore Restaurants by Destination").assertIsDisplayed() composeTestRule.onNodeWithText("FLY").performClick() - composeTestRule.onNodeWithText("Explore Flights by Destination").assertExists() + composeTestRule.onNodeWithText("Explore Flights by Destination").assertIsDisplayed() } } diff --git a/Crane/app/src/main/java/androidx/compose/samples/crane/base/BaseUserInput.kt b/Crane/app/src/main/java/androidx/compose/samples/crane/base/BaseUserInput.kt index 5a3fd416eb..961b95ea8a 100644 --- a/Crane/app/src/main/java/androidx/compose/samples/crane/base/BaseUserInput.kt +++ b/Crane/app/src/main/java/androidx/compose/samples/crane/base/BaseUserInput.kt @@ -21,8 +21,8 @@ import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredSize -import androidx.compose.foundation.layout.preferredWidth +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width import androidx.compose.foundation.text.BasicTextField import androidx.compose.material.Icon import androidx.compose.material.LocalContentColor @@ -39,6 +39,7 @@ import androidx.compose.samples.crane.ui.captionTextStyle import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.SolidColor import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.tooling.preview.Preview @@ -104,7 +105,7 @@ fun CraneEditableUserInput( } else { MaterialTheme.typography.body1.copy(color = LocalContentColor.current) }, - cursorColor = LocalContentColor.current + cursorBrush = SolidColor(LocalContentColor.current) ) } } @@ -123,12 +124,12 @@ private fun CraneBaseUserInput( Row(Modifier.padding(all = 12.dp)) { if (vectorImageId != null) { Icon( - modifier = Modifier.preferredSize(24.dp, 24.dp), + modifier = Modifier.size(24.dp, 24.dp), painter = painterResource(id = vectorImageId), tint = if (tintIcon()) tint else Color(0x80FFFFFF), contentDescription = null ) - Spacer(Modifier.preferredWidth(8.dp)) + Spacer(Modifier.width(8.dp)) } if (caption != null && showCaption()) { Text( @@ -136,7 +137,7 @@ private fun CraneBaseUserInput( text = caption, style = (captionTextStyle).copy(color = tint) ) - Spacer(Modifier.preferredWidth(8.dp)) + Spacer(Modifier.width(8.dp)) } Row(Modifier.weight(1f).align(Alignment.CenterVertically)) { content() diff --git a/Crane/app/src/main/java/androidx/compose/samples/crane/base/CraneDrawer.kt b/Crane/app/src/main/java/androidx/compose/samples/crane/base/CraneDrawer.kt index d76132dae7..494636dd9e 100644 --- a/Crane/app/src/main/java/androidx/compose/samples/crane/base/CraneDrawer.kt +++ b/Crane/app/src/main/java/androidx/compose/samples/crane/base/CraneDrawer.kt @@ -20,8 +20,8 @@ import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredHeight import androidx.compose.material.MaterialTheme import androidx.compose.material.Text import androidx.compose.runtime.Composable @@ -47,7 +47,7 @@ fun CraneDrawer(modifier: Modifier = Modifier) { contentDescription = stringResource(R.string.cd_drawer) ) for (screen in screens) { - Spacer(Modifier.preferredHeight(24.dp)) + Spacer(Modifier.height(24.dp)) Text(text = screen, style = MaterialTheme.typography.h4) } } diff --git a/Crane/app/src/main/java/androidx/compose/samples/crane/base/CraneTabs.kt b/Crane/app/src/main/java/androidx/compose/samples/crane/base/CraneTabs.kt index c69cf780e1..c0eb34b8eb 100644 --- a/Crane/app/src/main/java/androidx/compose/samples/crane/base/CraneTabs.kt +++ b/Crane/app/src/main/java/androidx/compose/samples/crane/base/CraneTabs.kt @@ -20,11 +20,10 @@ import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.Image import androidx.compose.foundation.border import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.ExperimentalLayout import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredWidth +import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.MaterialTheme import androidx.compose.material.Tab @@ -58,7 +57,7 @@ fun CraneTabBar( painter = painterResource(id = R.drawable.ic_menu), contentDescription = stringResource(id = R.string.cd_menu) ) - Spacer(Modifier.preferredWidth(8.dp)) + Spacer(Modifier.width(8.dp)) Image( painter = painterResource(id = R.drawable.ic_crane_logo), contentDescription = null @@ -72,7 +71,6 @@ fun CraneTabBar( } } -@OptIn(ExperimentalLayout::class) @Composable fun CraneTabs( modifier: Modifier = Modifier, diff --git a/Crane/app/src/main/java/androidx/compose/samples/crane/base/ExploreSection.kt b/Crane/app/src/main/java/androidx/compose/samples/crane/base/ExploreSection.kt index fe2634b366..02374b79c4 100644 --- a/Crane/app/src/main/java/androidx/compose/samples/crane/base/ExploreSection.kt +++ b/Crane/app/src/main/java/androidx/compose/samples/crane/base/ExploreSection.kt @@ -23,10 +23,10 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredHeight -import androidx.compose.foundation.layout.preferredSize -import androidx.compose.foundation.layout.preferredWidth +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.foundation.shape.RoundedCornerShape @@ -62,7 +62,7 @@ fun ExploreSection( text = title, style = MaterialTheme.typography.caption.copy(color = crane_caption) ) - Spacer(Modifier.preferredHeight(8.dp)) + Spacer(Modifier.height(8.dp)) LazyColumn( modifier = Modifier.weight(1f), ) { @@ -101,7 +101,7 @@ private fun ExploreItem( loading = { Box(Modifier.fillMaxSize()) { Image( - modifier = Modifier.preferredSize(36.dp).align(Alignment.Center), + modifier = Modifier.size(36.dp).align(Alignment.Center), painter = painterResource(id = R.drawable.ic_crane_logo), contentDescription = null ) @@ -109,13 +109,13 @@ private fun ExploreItem( } ) } - Spacer(Modifier.preferredWidth(24.dp)) + Spacer(Modifier.width(24.dp)) Column { Text( text = item.city.nameToDisplay, style = MaterialTheme.typography.h6 ) - Spacer(Modifier.preferredHeight(8.dp)) + Spacer(Modifier.height(8.dp)) Text( text = item.description, style = MaterialTheme.typography.caption.copy(color = crane_caption) @@ -126,7 +126,7 @@ private fun ExploreItem( @Composable private fun ExploreImageContainer(content: @Composable () -> Unit) { - Surface(Modifier.preferredSize(width = 60.dp, height = 60.dp), RoundedCornerShape(4.dp)) { + Surface(Modifier.size(width = 60.dp, height = 60.dp), RoundedCornerShape(4.dp)) { content() } } diff --git a/Crane/app/src/main/java/androidx/compose/samples/crane/calendar/Calendar.kt b/Crane/app/src/main/java/androidx/compose/samples/crane/calendar/Calendar.kt index 4eb6347016..bc0b9457d0 100644 --- a/Crane/app/src/main/java/androidx/compose/samples/crane/calendar/Calendar.kt +++ b/Crane/app/src/main/java/androidx/compose/samples/crane/calendar/Calendar.kt @@ -23,10 +23,10 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredHeight -import androidx.compose.foundation.layout.preferredHeightIn -import androidx.compose.foundation.layout.preferredSize +import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.foundation.layout.wrapContentWidth import androidx.compose.foundation.lazy.LazyColumn @@ -64,11 +64,11 @@ fun Calendar( modifier: Modifier = Modifier ) { LazyColumn(modifier) { - item { Spacer(Modifier.preferredHeight(32.dp)) } + item { Spacer(Modifier.height(32.dp)) } for (month in calendarYear) { itemsCalendarMonth(month = month, onDayClicked = onDayClicked) item { - Spacer(Modifier.preferredHeight(32.dp)) + Spacer(Modifier.height(32.dp)) } } } @@ -102,7 +102,7 @@ private fun Week( Row(modifier = modifier) { val spaceModifiers = Modifier .weight(1f) - .preferredHeightIn(max = CELL_SIZE) + .heightIn(max = CELL_SIZE) Surface(modifier = spaceModifiers, color = leftFillColor) { Spacer(Modifier.fillMaxHeight()) } @@ -175,7 +175,7 @@ private fun DayContainer( ) { // What if this doesn't fit the screen? - LayoutFlexible(1f) + LayoutAspectRatio(1f) Surface( - modifier = modifier.preferredSize(width = CELL_SIZE, height = CELL_SIZE), + modifier = modifier.size(width = CELL_SIZE, height = CELL_SIZE), color = backgroundColor ) { content() @@ -234,7 +234,7 @@ private fun LazyListScope.itemsCalendarMonth( ) } item { - Spacer(Modifier.preferredHeight(8.dp)) + Spacer(Modifier.height(8.dp)) } } } diff --git a/Crane/app/src/main/java/androidx/compose/samples/crane/details/DetailsActivity.kt b/Crane/app/src/main/java/androidx/compose/samples/crane/details/DetailsActivity.kt index 36491a5817..b2b6c81586 100644 --- a/Crane/app/src/main/java/androidx/compose/samples/crane/details/DetailsActivity.kt +++ b/Crane/app/src/main/java/androidx/compose/samples/crane/details/DetailsActivity.kt @@ -27,8 +27,8 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredHeight import androidx.compose.material.Button import androidx.compose.material.ButtonDefaults import androidx.compose.material.MaterialTheme @@ -121,7 +121,7 @@ fun DetailsScreen( @Composable fun DetailsContent(exploreModel: ExploreModel) { Column(verticalArrangement = Arrangement.Center) { - Spacer(Modifier.preferredHeight(32.dp)) + Spacer(Modifier.height(32.dp)) Text( modifier = Modifier.align(Alignment.CenterHorizontally), text = exploreModel.city.nameToDisplay, @@ -132,7 +132,7 @@ fun DetailsContent(exploreModel: ExploreModel) { text = exploreModel.description, style = MaterialTheme.typography.h6 ) - Spacer(Modifier.preferredHeight(16.dp)) + Spacer(Modifier.height(16.dp)) CityMapView(exploreModel.city.latitude, exploreModel.city.longitude) } } diff --git a/Crane/app/src/main/java/androidx/compose/samples/crane/home/CraneHome.kt b/Crane/app/src/main/java/androidx/compose/samples/crane/home/CraneHome.kt index 4b0678afd2..8cd0851a69 100644 --- a/Crane/app/src/main/java/androidx/compose/samples/crane/home/CraneHome.kt +++ b/Crane/app/src/main/java/androidx/compose/samples/crane/home/CraneHome.kt @@ -20,7 +20,7 @@ import androidx.compose.material.BackdropScaffold import androidx.compose.material.BackdropValue import androidx.compose.material.DrawerValue import androidx.compose.material.ExperimentalMaterialApi -import androidx.compose.material.ModalDrawerLayout +import androidx.compose.material.ModalDrawer import androidx.compose.material.rememberBackdropScaffoldState import androidx.compose.material.rememberDrawerState import androidx.compose.runtime.Composable @@ -28,6 +28,7 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.samples.crane.base.CraneDrawer import androidx.compose.samples.crane.base.CraneTabBar @@ -37,6 +38,7 @@ import androidx.compose.samples.crane.data.ExploreModel import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.lifecycle.viewmodel.compose.viewModel +import kotlinx.coroutines.launch typealias OnExploreItemClicked = (ExploreModel) -> Unit @@ -51,19 +53,23 @@ fun CraneHome( modifier: Modifier = Modifier, ) { val drawerState = rememberDrawerState(DrawerValue.Closed) - ModalDrawerLayout( + ModalDrawer( drawerState = drawerState, gesturesEnabled = drawerState.isOpen, drawerContent = { CraneDrawer() }, - bodyContent = { - CraneHomeContent( - modifier = modifier, - onExploreItemClicked = onExploreItemClicked, - onDateSelectionClicked = onDateSelectionClicked, - openDrawer = { drawerState.open() } - ) - } - ) + ) { + val scope = rememberCoroutineScope() + CraneHomeContent( + modifier = modifier, + onExploreItemClicked = onExploreItemClicked, + onDateSelectionClicked = onDateSelectionClicked, + openDrawer = { + scope.launch { + drawerState.open() + } + } + ) + } } @OptIn(ExperimentalMaterialApi::class) diff --git a/Crane/app/src/main/java/androidx/compose/samples/crane/home/HomeFeatures.kt b/Crane/app/src/main/java/androidx/compose/samples/crane/home/HomeFeatures.kt index 7622f64d08..6058792aa1 100644 --- a/Crane/app/src/main/java/androidx/compose/samples/crane/home/HomeFeatures.kt +++ b/Crane/app/src/main/java/androidx/compose/samples/crane/home/HomeFeatures.kt @@ -18,8 +18,8 @@ package androidx.compose.samples.crane.home import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredHeight import androidx.compose.runtime.Composable import androidx.compose.samples.crane.R import androidx.compose.samples.crane.base.SimpleUserInput @@ -33,11 +33,11 @@ fun FlySearchContent(datesSelected: String, searchUpdates: FlySearchContentUpdat titleSuffix = ", Economy", onPeopleChanged = searchUpdates.onPeopleChanged ) - Spacer(Modifier.preferredHeight(8.dp)) + Spacer(Modifier.height(8.dp)) FromDestination() - Spacer(Modifier.preferredHeight(8.dp)) + Spacer(Modifier.height(8.dp)) ToDestinationUserInput(onToDestinationChanged = searchUpdates.onToDestinationChanged) - Spacer(Modifier.preferredHeight(8.dp)) + Spacer(Modifier.height(8.dp)) DatesUserInput(datesSelected, onDateSelectionClicked = searchUpdates.onDateSelectionClicked) } } @@ -46,9 +46,9 @@ fun FlySearchContent(datesSelected: String, searchUpdates: FlySearchContentUpdat fun SleepSearchContent(datesSelected: String, sleepUpdates: SleepSearchContentUpdates) { CraneSearch { PeopleUserInput(onPeopleChanged = { sleepUpdates.onPeopleChanged }) - Spacer(Modifier.preferredHeight(8.dp)) + Spacer(Modifier.height(8.dp)) DatesUserInput(datesSelected, onDateSelectionClicked = sleepUpdates.onDateSelectionClicked) - Spacer(Modifier.preferredHeight(8.dp)) + Spacer(Modifier.height(8.dp)) SimpleUserInput(caption = "Select Location", vectorImageId = R.drawable.ic_hotel) } } @@ -57,11 +57,11 @@ fun SleepSearchContent(datesSelected: String, sleepUpdates: SleepSearchContentUp fun EatSearchContent(datesSelected: String, eatUpdates: EatSearchContentUpdates) { CraneSearch { PeopleUserInput(onPeopleChanged = { eatUpdates.onPeopleChanged }) - Spacer(Modifier.preferredHeight(8.dp)) + Spacer(Modifier.height(8.dp)) DatesUserInput(datesSelected, onDateSelectionClicked = eatUpdates.onDateSelectionClicked) - Spacer(Modifier.preferredHeight(8.dp)) + Spacer(Modifier.height(8.dp)) SimpleUserInput(caption = "Select Time", vectorImageId = R.drawable.ic_time) - Spacer(Modifier.preferredHeight(8.dp)) + Spacer(Modifier.height(8.dp)) SimpleUserInput(caption = "Select Location", vectorImageId = R.drawable.ic_restaurant) } } diff --git a/Crane/build.gradle b/Crane/build.gradle index b99810e907..8b95a00aea 100644 --- a/Crane/build.gradle +++ b/Crane/build.gradle @@ -68,4 +68,10 @@ subprojects { freeCompilerArgs += '-Xopt-in=kotlin.RequiresOptIn' } } + // androidx.test and hilt are forcing JUnit, 4.12. This forces them to use 4.13 + configurations.configureEach { + resolutionStrategy { + force Libs.JUnit.junit + } + } } diff --git a/Crane/buildSrc/src/main/java/com/example/crane/buildsrc/Dependencies.kt b/Crane/buildSrc/src/main/java/com/example/crane/buildsrc/Dependencies.kt index 96b9a59296..2dff85e066 100644 --- a/Crane/buildSrc/src/main/java/com/example/crane/buildsrc/Dependencies.kt +++ b/Crane/buildSrc/src/main/java/com/example/crane/buildsrc/Dependencies.kt @@ -21,7 +21,7 @@ object Versions { } object Libs { - const val androidGradlePlugin = "com.android.tools.build:gradle:7.0.0-alpha05" + const val androidGradlePlugin = "com.android.tools.build:gradle:7.0.0-alpha06" const val ktLint = "com.pinterest:ktlint:${Versions.ktLint}" object GoogleMaps { @@ -30,7 +30,7 @@ object Libs { } object Accompanist { - private const val version = "0.5.1" + private const val version = "0.5.2.compose-7141639-SNAPSHOT" const val coil = "dev.chrisbanes.accompanist:accompanist-coil:$version" } @@ -49,12 +49,12 @@ object Libs { object AndroidX { object Activity { - const val activityCompose = "androidx.activity:activity-compose:1.3.0-alpha02" + const val activityCompose = "androidx.activity:activity-compose:1.3.0-SNAPSHOT" } object Compose { - const val snapshot = "" - private const val version = "1.0.0-alpha12" + const val snapshot = "7141639" + private const val version = "1.0.0-SNAPSHOT" const val runtime = "androidx.compose.runtime:runtime:$version" const val runtimeLivedata = "androidx.compose.runtime:runtime-livedata:$version" @@ -67,8 +67,8 @@ object Libs { } object Lifecycle { - private const val version = "2.3.0-beta01" - const val viewModelCompose = "androidx.lifecycle:lifecycle-viewmodel-compose:1.0.0-alpha01" + private const val version = "2.3.0" + const val viewModelCompose = "androidx.lifecycle:lifecycle-viewmodel-compose:1.0.0-SNAPSHOT" const val viewModelKtx = "androidx.lifecycle:lifecycle-viewmodel-ktx:$version" } From 4a132dc8e3cdc8dbdfc0e4fdb8cb6ae6720f7981 Mon Sep 17 00:00:00 2001 From: Yacine Rezgui Date: Thu, 18 Feb 2021 12:13:37 +0000 Subject: [PATCH 25/37] Remove dependencies resolution strategy --- .../ui/home/category/PodcastCategory.kt | 1 - Jetcaster/build.gradle | 20 +++---------------- 2 files changed, 3 insertions(+), 18 deletions(-) diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/category/PodcastCategory.kt b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/category/PodcastCategory.kt index f0e0d1c848..5195d292aa 100644 --- a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/category/PodcastCategory.kt +++ b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/category/PodcastCategory.kt @@ -127,7 +127,6 @@ fun EpisodeListItem( podcast: Podcast, modifier: Modifier = Modifier ) { - @Suppress("DEPRECATION") // ConstraintLayout ConstraintLayout( modifier = Modifier.clickable { /* TODO */ } then modifier ) { diff --git a/Jetcaster/build.gradle b/Jetcaster/build.gradle index e409c92b2f..10e88697ca 100644 --- a/Jetcaster/build.gradle +++ b/Jetcaster/build.gradle @@ -35,15 +35,14 @@ plugins { subprojects { repositories { - maven { url "http://androidx.dev/storage/repository/androidx/constraintlayout" } - google() mavenCentral() jcenter() // Jetpack Compose SNAPSHOTs - if (Libs.AndroidX.Compose.version.endsWith("SNAPSHOT")) { - maven { url Libs.AndroidX.Compose.snapshotUrl } + if (!Libs.AndroidX.Compose.snapshot.isEmpty()) { + maven { url "https://androidx.dev/snapshots/builds/${Libs.AndroidX.Compose.snapshot}/artifacts/repository/" } + maven { url "http://androidx.dev/storage/repository/androidx/constraintlayout" } } maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' } @@ -77,17 +76,4 @@ subprojects { jvmTarget = "1.8" } } - - configurations.configureEach { - // androidx.test forces JUnit, 4.12, prefer 4.13 - resolutionStrategy { - force Libs.JUnit.junit - } - // FIXME remove when have an updated constraintlayout-compose dep - resolutionStrategy.eachDependency { details -> - if (details.requested.group.startsWith('androidx.compose')) { - details.useVersion Libs.AndroidX.Compose.version - } - } - } } From 64ba0e9c3b4270a58b0bb60befdde42d1e3d05fd Mon Sep 17 00:00:00 2001 From: Nick Butcher Date: Mon, 15 Feb 2021 11:42:14 +0000 Subject: [PATCH 26/37] [Jetsnack] Update to snapshot 7141639. Change-Id: I2da127fb7d0e41dfd1de9b8c80524f92ea74a821 --- .../com/example/jetsnack/ui/MainActivity.kt | 4 +- .../example/jetsnack/ui/components/Button.kt | 15 +++--- .../example/jetsnack/ui/components/Filters.kt | 8 +-- .../ui/components/QuantitySelector.kt | 8 +-- .../jetsnack/ui/components/Scaffold.kt | 4 +- .../example/jetsnack/ui/components/Snacks.kt | 30 +++++------ .../example/jetsnack/ui/components/Surface.kt | 4 +- .../java/com/example/jetsnack/ui/home/Home.kt | 4 +- .../com/example/jetsnack/ui/home/cart/Cart.kt | 15 +++--- .../jetsnack/ui/home/search/Categories.kt | 10 ++-- .../jetsnack/ui/home/search/Results.kt | 14 +++--- .../example/jetsnack/ui/home/search/Search.kt | 14 +++--- .../jetsnack/ui/home/search/Suggestions.kt | 10 ++-- .../jetsnack/ui/snackdetail/SnackDetail.kt | 50 +++++++++---------- .../com/example/jetsnack/ui/theme/Theme.kt | 4 +- .../com/example/jetsnack/ui/utils/SystemUi.kt | 2 +- Jetsnack/build.gradle | 6 ++- .../example/jetsnack/buildsrc/Dependencies.kt | 30 ++++------- 18 files changed, 111 insertions(+), 121 deletions(-) diff --git a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/MainActivity.kt b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/MainActivity.kt index c405ac1e4f..07aea3c7d6 100644 --- a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/MainActivity.kt +++ b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/MainActivity.kt @@ -19,7 +19,7 @@ package com.example.jetsnack.ui import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent -import androidx.compose.runtime.Providers +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.remember import androidx.core.view.WindowCompat import com.example.jetsnack.ui.utils.LocalSysUiController @@ -34,7 +34,7 @@ class MainActivity : ComponentActivity() { setContent { val systemUiController = remember { SystemUiController(window) } - Providers(LocalSysUiController provides systemUiController) { + CompositionLocalProvider(LocalSysUiController provides systemUiController) { JetsnackApp(onBackPressedDispatcher) } } diff --git a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/Button.kt b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/Button.kt index b8459c8535..6500ffdaad 100644 --- a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/Button.kt +++ b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/Button.kt @@ -17,21 +17,21 @@ package com.example.jetsnack.ui.components import androidx.compose.foundation.BorderStroke -import androidx.compose.foundation.InteractionState -import androidx.compose.foundation.LocalIndication import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.indication +import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.RowScope -import androidx.compose.foundation.layout.defaultMinSizeConstraints +import androidx.compose.foundation.layout.defaultMinSize import androidx.compose.foundation.layout.padding import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.ButtonDefaults import androidx.compose.material.MaterialTheme import androidx.compose.material.ProvideTextStyle +import androidx.compose.material.ripple.rememberRipple import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Alignment @@ -44,11 +44,12 @@ import androidx.compose.ui.semantics.Role import com.example.jetsnack.ui.theme.JetsnackTheme @Composable + fun JetsnackButton( onClick: () -> Unit, modifier: Modifier = Modifier, enabled: Boolean = true, - interactionState: InteractionState = remember { InteractionState() }, + interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, shape: Shape = ButtonShape, border: BorderStroke? = null, backgroundGradient: List = JetsnackTheme.colors.interactivePrimary, @@ -74,7 +75,7 @@ fun JetsnackButton( onClick = onClick, enabled = enabled, role = Role.Button, - interactionState = interactionState, + interactionSource = interactionSource, indication = null ) ) { @@ -83,11 +84,11 @@ fun JetsnackButton( ) { Row( Modifier - .defaultMinSizeConstraints( + .defaultMinSize( minWidth = ButtonDefaults.MinWidth, minHeight = ButtonDefaults.MinHeight ) - .indication(interactionState, LocalIndication.current) + .indication(interactionSource, rememberRipple()) .padding(contentPadding), horizontalArrangement = Arrangement.Center, verticalAlignment = Alignment.CenterVertically, diff --git a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/Filters.kt b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/Filters.kt index a2cb49d366..fdef0ce8d5 100644 --- a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/Filters.kt +++ b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/Filters.kt @@ -20,9 +20,9 @@ import androidx.compose.animation.animateColorAsState import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredHeight -import androidx.compose.foundation.layout.preferredHeightIn import androidx.compose.foundation.lazy.LazyRow import androidx.compose.foundation.lazy.items import androidx.compose.foundation.selection.toggleable @@ -50,7 +50,7 @@ fun FilterBar(filters: List) { verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(8.dp), contentPadding = PaddingValues(start = 8.dp, end = 8.dp), - modifier = Modifier.preferredHeightIn(min = 56.dp) + modifier = Modifier.heightIn(min = 56.dp) ) { item { IconButton(onClick = { /* todo */ }) { @@ -91,7 +91,7 @@ fun FilterChip( ) JetsnackSurface( modifier = modifier - .preferredHeight(28.dp) + .height(28.dp) .then(border), color = backgroundColor, contentColor = textColor, diff --git a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/QuantitySelector.kt b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/QuantitySelector.kt index a5a2484e2d..f852eac663 100644 --- a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/QuantitySelector.kt +++ b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/QuantitySelector.kt @@ -17,7 +17,7 @@ package com.example.jetsnack.ui.components import androidx.compose.animation.Crossfade -import androidx.compose.foundation.layout.preferredWidthIn +import androidx.compose.foundation.layout.widthIn import androidx.compose.material.ContentAlpha import androidx.compose.material.LocalContentAlpha import androidx.compose.material.MaterialTheme @@ -26,7 +26,7 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.AddCircleOutline import androidx.compose.material.icons.outlined.RemoveCircleOutline import androidx.compose.runtime.Composable -import androidx.compose.runtime.Providers +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign @@ -48,7 +48,7 @@ fun QuantitySelector( ConstraintLayout(modifier = modifier) { val (qty, minus, quantity, plus) = createRefs() createHorizontalChain(qty, minus, quantity, plus, chainStyle = ChainStyle.Packed) - Providers(LocalContentAlpha provides ContentAlpha.medium) { + CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) { Text( text = stringResource(R.string.quantity), style = MaterialTheme.typography.subtitle1, @@ -79,7 +79,7 @@ fun QuantitySelector( fontSize = 18.sp, color = JetsnackTheme.colors.textPrimary, textAlign = TextAlign.Center, - modifier = Modifier.preferredWidthIn(min = 24.dp) + modifier = Modifier.widthIn(min = 24.dp) ) } JetsnackGradientTintedIconButton( diff --git a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/Scaffold.kt b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/Scaffold.kt index 68419d2b22..337a02d8c6 100644 --- a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/Scaffold.kt +++ b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/Scaffold.kt @@ -56,7 +56,7 @@ fun JetsnackScaffold( drawerScrimColor: Color = JetsnackTheme.colors.uiBorder, backgroundColor: Color = JetsnackTheme.colors.uiBackground, contentColor: Color = JetsnackTheme.colors.textSecondary, - bodyContent: @Composable (PaddingValues) -> Unit + content: @Composable (PaddingValues) -> Unit ) { Scaffold( modifier = modifier, @@ -75,6 +75,6 @@ fun JetsnackScaffold( drawerScrimColor = drawerScrimColor, backgroundColor = backgroundColor, contentColor = contentColor, - bodyContent = bodyContent + content = content ) } diff --git a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/Snacks.kt b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/Snacks.kt index 7f2ae21af1..96126de9a8 100644 --- a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/Snacks.kt +++ b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/Snacks.kt @@ -25,10 +25,10 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredHeight -import androidx.compose.foundation.layout.preferredHeightIn -import androidx.compose.foundation.layout.preferredSize +import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.wrapContentWidth import androidx.compose.foundation.lazy.LazyRow import androidx.compose.foundation.lazy.items @@ -80,7 +80,7 @@ fun SnackCollection( Row( verticalAlignment = Alignment.CenterVertically, modifier = Modifier - .preferredHeightIn(min = 56.dp) + .heightIn(min = 56.dp) .padding(start = 24.dp) ) { Text( @@ -119,7 +119,7 @@ private fun HighlightedSnacks( onSnackClick: (Long) -> Unit, modifier: Modifier = Modifier ) { - val scroll = rememberScrollState(0f) + val scroll = rememberScrollState(0) val gradient = when (index % 2) { 0 -> JetsnackTheme.colors.gradient6_1 else -> JetsnackTheme.colors.gradient6_2 @@ -186,7 +186,7 @@ fun SnackItem( imageUrl = snack.imageUrl, elevation = 4.dp, contentDescription = null, - modifier = Modifier.preferredSize(120.dp) + modifier = Modifier.size(120.dp) ) Text( text = snack.name, @@ -205,7 +205,7 @@ private fun HighlightSnackItem( index: Int, gradient: List, gradientWidth: Float, - scroll: Float, + scroll: Int, modifier: Modifier = Modifier ) { val left = index * with(LocalDensity.current) { @@ -214,7 +214,7 @@ private fun HighlightSnackItem( JetsnackCard( elevation = 4.dp, modifier = modifier - .preferredSize( + .size( width = 170.dp, height = 250.dp ) @@ -227,13 +227,13 @@ private fun HighlightSnackItem( ) { Box( modifier = Modifier - .preferredHeight(160.dp) + .height(160.dp) .fillMaxWidth() ) { val gradientOffset = left - (scroll / 3f) Box( modifier = Modifier - .preferredHeight(100.dp) + .height(100.dp) .fillMaxWidth() .offsetGradientBackground(gradient, gradientWidth, gradientOffset) ) @@ -241,11 +241,11 @@ private fun HighlightSnackItem( imageUrl = snack.imageUrl, contentDescription = null, modifier = Modifier - .preferredSize(120.dp) + .size(120.dp) .align(Alignment.BottomCenter) ) } - Spacer(modifier = Modifier.preferredHeight(8.dp)) + Spacer(modifier = Modifier.height(8.dp)) Text( text = snack.name, maxLines = 1, @@ -254,7 +254,7 @@ private fun HighlightSnackItem( color = JetsnackTheme.colors.textSecondary, modifier = Modifier.padding(horizontal = 16.dp) ) - Spacer(modifier = Modifier.preferredHeight(4.dp)) + Spacer(modifier = Modifier.height(4.dp)) Text( text = snack.tagline, style = MaterialTheme.typography.body1, @@ -298,7 +298,7 @@ fun SnackCardPreview() { index = 0, gradient = JetsnackTheme.colors.gradient6_1, gradientWidth = gradientWidth, - scroll = 0f + scroll = 0 ) } } @@ -314,7 +314,7 @@ fun SnackCardDarkPreview() { index = 0, gradient = JetsnackTheme.colors.gradient6_1, gradientWidth = gradientWidth, - scroll = 0f + scroll = 0 ) } } diff --git a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/Surface.kt b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/Surface.kt index 0e682c356d..584c446367 100644 --- a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/Surface.kt +++ b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/Surface.kt @@ -22,7 +22,7 @@ import androidx.compose.foundation.border import androidx.compose.foundation.layout.Box import androidx.compose.material.LocalContentColor import androidx.compose.runtime.Composable -import androidx.compose.runtime.Providers +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.shadow @@ -60,7 +60,7 @@ fun JetsnackSurface( ) .clip(shape) ) { - Providers(LocalContentColor provides contentColor, content = content) + CompositionLocalProvider(LocalContentColor provides contentColor, content = content) } } diff --git a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/Home.kt b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/Home.kt index 9768d5999f..d8e76bf65d 100644 --- a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/Home.kt +++ b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/Home.kt @@ -29,8 +29,8 @@ import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.BoxScope import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredHeight import androidx.compose.foundation.selection.selectable import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.Icon @@ -207,7 +207,7 @@ private fun JetsnackBottomNavLayout( } Layout( - modifier = modifier.preferredHeight(BottomNavHeight), + modifier = modifier.height(BottomNavHeight), content = { content() Box(Modifier.layoutId("indicator"), content = indicator) diff --git a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/cart/Cart.kt b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/cart/Cart.kt index 408d3eaea0..0f427ca736 100644 --- a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/cart/Cart.kt +++ b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/cart/Cart.kt @@ -25,10 +25,9 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredHeight -import androidx.compose.foundation.layout.preferredHeightIn -import androidx.compose.foundation.layout.preferredSize +import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.foundation.layout.wrapContentWidth import androidx.compose.foundation.lazy.LazyColumn @@ -144,7 +143,7 @@ private fun CartContent( maxLines = 1, overflow = TextOverflow.Ellipsis, modifier = Modifier - .preferredHeightIn(min = 56.dp) + .heightIn(min = 56.dp) .padding(horizontal = 24.dp, vertical = 4.dp) .wrapContentHeight() ) @@ -197,7 +196,7 @@ fun CartItem( imageUrl = snack.imageUrl, contentDescription = null, modifier = Modifier - .preferredSize(100.dp) + .size(100.dp) .constrainAs(image) { top.linkTo(parent.top, margin = 16.dp) bottom.linkTo(parent.bottom, margin = 16.dp) @@ -249,7 +248,7 @@ fun CartItem( ) Spacer( Modifier - .preferredHeight(8.dp) + .height(8.dp) .constrainAs(priceSpacer) { linkTo(top = tag.bottom, bottom = price.top) } @@ -301,7 +300,7 @@ fun SummaryItem( overflow = TextOverflow.Ellipsis, modifier = Modifier .padding(horizontal = 24.dp) - .preferredHeightIn(min = 56.dp) + .heightIn(min = 56.dp) .wrapContentHeight() ) Row(modifier = Modifier.padding(horizontal = 24.dp)) { @@ -334,7 +333,7 @@ fun SummaryItem( modifier = Modifier.alignBy(LastBaseline) ) } - Spacer(modifier = Modifier.preferredHeight(8.dp)) + Spacer(modifier = Modifier.height(8.dp)) JetsnackDivider() Row(modifier = Modifier.padding(horizontal = 24.dp, vertical = 8.dp)) { Text( diff --git a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/search/Categories.kt b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/search/Categories.kt index 563a0e184f..c72c240fd3 100644 --- a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/search/Categories.kt +++ b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/search/Categories.kt @@ -22,9 +22,9 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredHeight -import androidx.compose.foundation.layout.preferredHeightIn import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.itemsIndexed @@ -57,7 +57,7 @@ fun SearchCategories( SearchCategoryCollection(collection, index) } } - Spacer(Modifier.preferredHeight(8.dp)) + Spacer(Modifier.height(8.dp)) } @Composable @@ -72,7 +72,7 @@ private fun SearchCategoryCollection( style = MaterialTheme.typography.h6, color = JetsnackTheme.colors.textPrimary, modifier = Modifier - .preferredHeightIn(min = 56.dp) + .heightIn(min = 56.dp) .padding(horizontal = 24.dp, vertical = 4.dp) .wrapContentHeight() ) @@ -89,7 +89,7 @@ private fun SearchCategoryCollection( ) } } - Spacer(Modifier.preferredHeight(4.dp)) + Spacer(Modifier.height(4.dp)) } } diff --git a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/search/Results.kt b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/search/Results.kt index 87298a161b..f6fd552169 100644 --- a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/search/Results.kt +++ b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/search/Results.kt @@ -23,9 +23,9 @@ import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredHeight -import androidx.compose.foundation.layout.preferredSize +import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.itemsIndexed @@ -106,7 +106,7 @@ private fun SearchResult( imageUrl = snack.imageUrl, contentDescription = null, modifier = Modifier - .preferredSize(100.dp) + .size(100.dp) .constrainAs(image) { linkTo( top = parent.top, @@ -147,7 +147,7 @@ private fun SearchResult( ) Spacer( Modifier - .preferredHeight(8.dp) + .height(8.dp) .constrainAs(priceSpacer) { linkTo(top = tag.bottom, bottom = price.top) } @@ -171,7 +171,7 @@ private fun SearchResult( shape = CircleShape, contentPadding = PaddingValues(0.dp), modifier = Modifier - .preferredSize(36.dp) + .size(36.dp) .constrainAs(add) { linkTo(top = parent.top, bottom = parent.bottom) end.linkTo(parent.end) @@ -201,14 +201,14 @@ fun NoResults( painterResource(R.drawable.empty_state_search), contentDescription = null ) - Spacer(Modifier.preferredHeight(24.dp)) + Spacer(Modifier.height(24.dp)) Text( text = stringResource(R.string.search_no_matches, query), style = MaterialTheme.typography.subtitle1, textAlign = TextAlign.Center, modifier = Modifier.fillMaxWidth() ) - Spacer(Modifier.preferredHeight(16.dp)) + Spacer(Modifier.height(16.dp)) Text( text = stringResource(R.string.search_no_matches_retry), style = MaterialTheme.typography.body2, diff --git a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/search/Search.kt b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/search/Search.kt index a57a5b352f..ec1ed3ea5f 100644 --- a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/search/Search.kt +++ b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/search/Search.kt @@ -22,10 +22,10 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredHeight -import androidx.compose.foundation.layout.preferredSize -import androidx.compose.foundation.layout.preferredWidth +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.foundation.text.BasicTextField @@ -174,7 +174,7 @@ private fun SearchBar( shape = MaterialTheme.shapes.small, modifier = modifier .fillMaxWidth() - .preferredHeight(56.dp) + .height(56.dp) .padding(horizontal = 24.dp, vertical = 8.dp) ) { Box(Modifier.fillMaxSize()) { @@ -210,10 +210,10 @@ private fun SearchBar( color = JetsnackTheme.colors.iconPrimary, modifier = Modifier .padding(horizontal = 6.dp) - .preferredSize(36.dp) + .size(36.dp) ) } else { - Spacer(Modifier.preferredWidth(IconSize)) // balance arrow icon + Spacer(Modifier.width(IconSize)) // balance arrow icon } } } @@ -235,7 +235,7 @@ private fun SearchHint() { tint = JetsnackTheme.colors.textHelp, contentDescription = stringResource(R.string.label_search) ) - Spacer(Modifier.preferredWidth(8.dp)) + Spacer(Modifier.width(8.dp)) Text( text = stringResource(R.string.search_jetsnack), color = JetsnackTheme.colors.textHelp diff --git a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/search/Suggestions.kt b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/search/Suggestions.kt index a86bdd7bc4..bf96a1c2a9 100644 --- a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/search/Suggestions.kt +++ b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/search/Suggestions.kt @@ -18,9 +18,9 @@ package com.example.jetsnack.ui.home.search import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredHeight -import androidx.compose.foundation.layout.preferredHeightIn import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.foundation.lazy.LazyColumn @@ -55,7 +55,7 @@ fun SearchSuggestions( ) } item { - Spacer(Modifier.preferredHeight(4.dp)) + Spacer(Modifier.height(4.dp)) } } } @@ -71,7 +71,7 @@ private fun SuggestionHeader( style = MaterialTheme.typography.h6, color = JetsnackTheme.colors.textPrimary, modifier = modifier - .preferredHeightIn(min = 56.dp) + .heightIn(min = 56.dp) .padding(horizontal = 24.dp, vertical = 4.dp) .wrapContentHeight() ) @@ -87,7 +87,7 @@ private fun Suggestion( text = suggestion, style = MaterialTheme.typography.subtitle1, modifier = modifier - .preferredHeightIn(min = 48.dp) + .heightIn(min = 48.dp) .clickable { onSuggestionSelect(suggestion) } .padding(start = 24.dp) .wrapContentSize(Alignment.CenterStart) diff --git a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/snackdetail/SnackDetail.kt b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/snackdetail/SnackDetail.kt index de7597a032..cad681f444 100644 --- a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/snackdetail/SnackDetail.kt +++ b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/snackdetail/SnackDetail.kt @@ -25,11 +25,11 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredHeight -import androidx.compose.foundation.layout.preferredHeightIn -import androidx.compose.foundation.layout.preferredSize -import androidx.compose.foundation.layout.preferredWidth +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.verticalScroll @@ -94,7 +94,7 @@ fun SnackDetail( val related = remember(snackId) { SnackRepo.getRelated(snackId) } Box(Modifier.fillMaxSize()) { - val scroll = rememberScrollState(0f) + val scroll = rememberScrollState(0) Header() Body(related, scroll) Title(snack, scroll.value) @@ -108,7 +108,7 @@ fun SnackDetail( private fun Header() { Spacer( modifier = Modifier - .preferredHeight(280.dp) + .height(280.dp) .fillMaxWidth() .background(Brush.horizontalGradient(JetsnackTheme.colors.interactivePrimary)) ) @@ -121,7 +121,7 @@ private fun Up(upPress: () -> Unit) { modifier = Modifier .statusBarsPadding() .padding(horizontal = 16.dp, vertical = 10.dp) - .preferredSize(36.dp) + .size(36.dp) .background( color = Neutral8.copy(alpha = 0.32f), shape = CircleShape @@ -145,25 +145,25 @@ private fun Body( modifier = Modifier .fillMaxWidth() .statusBarsPadding() - .preferredHeight(MinTitleOffset) + .height(MinTitleOffset) ) Column( modifier = Modifier.verticalScroll(scroll) ) { - Spacer(Modifier.preferredHeight(GradientScroll)) + Spacer(Modifier.height(GradientScroll)) JetsnackSurface(Modifier.fillMaxWidth()) { Column { - Spacer(Modifier.preferredHeight(ImageOverlap)) - Spacer(Modifier.preferredHeight(TitleHeight)) + Spacer(Modifier.height(ImageOverlap)) + Spacer(Modifier.height(TitleHeight)) - Spacer(Modifier.preferredHeight(16.dp)) + Spacer(Modifier.height(16.dp)) Text( text = stringResource(R.string.detail_header), style = MaterialTheme.typography.overline, color = JetsnackTheme.colors.textHelp, modifier = HzPadding ) - Spacer(Modifier.preferredHeight(4.dp)) + Spacer(Modifier.height(4.dp)) Text( text = stringResource(R.string.detail_placeholder), style = MaterialTheme.typography.body1, @@ -171,14 +171,14 @@ private fun Body( modifier = HzPadding ) - Spacer(Modifier.preferredHeight(40.dp)) + Spacer(Modifier.height(40.dp)) Text( text = stringResource(R.string.ingredients), style = MaterialTheme.typography.overline, color = JetsnackTheme.colors.textHelp, modifier = HzPadding ) - Spacer(Modifier.preferredHeight(4.dp)) + Spacer(Modifier.height(4.dp)) Text( text = stringResource(R.string.ingredients_list), style = MaterialTheme.typography.body1, @@ -186,7 +186,7 @@ private fun Body( modifier = HzPadding ) - Spacer(Modifier.preferredHeight(16.dp)) + Spacer(Modifier.height(16.dp)) JetsnackDivider() related.forEach { snackCollection -> @@ -203,7 +203,7 @@ private fun Body( modifier = Modifier .padding(bottom = BottomBarHeight) .navigationBarsPadding(left = false, right = false) - .preferredHeight(8.dp) + .height(8.dp) ) } } @@ -212,19 +212,19 @@ private fun Body( } @Composable -private fun Title(snack: Snack, scroll: Float) { +private fun Title(snack: Snack, scroll: Int) { val maxOffset = with(LocalDensity.current) { MaxTitleOffset.toPx() } val minOffset = with(LocalDensity.current) { MinTitleOffset.toPx() } val offset = (maxOffset - scroll).coerceAtLeast(minOffset) Column( verticalArrangement = Arrangement.Bottom, modifier = Modifier - .preferredHeightIn(min = TitleHeight) + .heightIn(min = TitleHeight) .statusBarsPadding() .graphicsLayer { translationY = offset } .background(color = JetsnackTheme.colors.uiBackground) ) { - Spacer(Modifier.preferredHeight(16.dp)) + Spacer(Modifier.height(16.dp)) Text( text = snack.name, style = MaterialTheme.typography.h4, @@ -238,7 +238,7 @@ private fun Title(snack: Snack, scroll: Float) { color = JetsnackTheme.colors.textHelp, modifier = HzPadding ) - Spacer(Modifier.preferredHeight(4.dp)) + Spacer(Modifier.height(4.dp)) Text( text = formatPrice(snack.price), style = MaterialTheme.typography.h6, @@ -246,7 +246,7 @@ private fun Title(snack: Snack, scroll: Float) { modifier = HzPadding ) - Spacer(Modifier.preferredHeight(8.dp)) + Spacer(Modifier.height(8.dp)) JetsnackDivider() } } @@ -254,7 +254,7 @@ private fun Title(snack: Snack, scroll: Float) { @Composable private fun Image( imageUrl: String, - scroll: Float + scroll: Int ) { val collapseRange = with(LocalDensity.current) { (MaxTitleOffset - MinTitleOffset).toPx() } val collapseFraction = (scroll / collapseRange).coerceIn(0f, 1f) @@ -314,14 +314,14 @@ private fun CartBottomBar(modifier: Modifier = Modifier) { modifier = Modifier .navigationBarsPadding(left = false, right = false) .then(HzPadding) - .preferredHeightIn(min = BottomBarHeight) + .heightIn(min = BottomBarHeight) ) { QuantitySelector( count = count, decreaseItemCount = { if (count > 0) updateCount(count - 1) }, increaseItemCount = { updateCount(count + 1) } ) - Spacer(Modifier.preferredWidth(16.dp)) + Spacer(Modifier.width(16.dp)) JetsnackButton( onClick = { /* todo */ }, modifier = Modifier.weight(1f) diff --git a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/theme/Theme.kt b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/theme/Theme.kt index 4eb4d8c5f9..b7b61f9007 100644 --- a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/theme/Theme.kt +++ b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/theme/Theme.kt @@ -20,7 +20,7 @@ import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.material.Colors import androidx.compose.material.MaterialTheme import androidx.compose.runtime.Composable -import androidx.compose.runtime.Providers +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.SideEffect import androidx.compose.runtime.Stable import androidx.compose.runtime.getValue @@ -225,7 +225,7 @@ fun ProvideJetsnackColors( ) { val colorPalette = remember { colors } colorPalette.update(colors) - Providers(LocalJetsnackColors provides colorPalette, content = content) + CompositionLocalProvider(LocalJetsnackColors provides colorPalette, content = content) } private val LocalJetsnackColors = staticCompositionLocalOf { diff --git a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/utils/SystemUi.kt b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/utils/SystemUi.kt index 22166b1473..1af6be3666 100644 --- a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/utils/SystemUi.kt +++ b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/utils/SystemUi.kt @@ -142,7 +142,7 @@ private class SystemUiControllerImpl(private val window: Window) : SystemUiContr /** * An [androidx.compose.runtime.Ambient] holding the current [LocalSysUiController]. Defaults to a - * no-op controller; consumers should [provide][androidx.compose.runtime.Providers] a real one. + * no-op controller; consumers should [provide][androidx.compose.runtime.CompositionLocalProvider] a real one. */ val LocalSysUiController = staticCompositionLocalOf { FakeSystemUiController diff --git a/Jetsnack/build.gradle b/Jetsnack/build.gradle index 3744155a33..08b130f99a 100644 --- a/Jetsnack/build.gradle +++ b/Jetsnack/build.gradle @@ -37,9 +37,11 @@ subprojects { google() jcenter() - if (Libs.AndroidX.Compose.version.endsWith('SNAPSHOT')) { - maven { url Libs.AndroidX.Compose.snapshotUrl } + if (!Libs.AndroidX.Compose.snapshot.isEmpty()) { + maven { url "https://androidx.dev/snapshots/builds/${Libs.AndroidX.Compose.snapshot}/artifacts/repository/" } + maven { url "http://androidx.dev/storage/repository/androidx/constraintlayout" } } + maven { url 'https://oss.sonatype.org/content/repositories/snapshots' } } tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach { diff --git a/Jetsnack/buildSrc/src/main/java/com/example/jetsnack/buildsrc/Dependencies.kt b/Jetsnack/buildSrc/src/main/java/com/example/jetsnack/buildsrc/Dependencies.kt index b9da6135ac..23dc12ea58 100644 --- a/Jetsnack/buildSrc/src/main/java/com/example/jetsnack/buildsrc/Dependencies.kt +++ b/Jetsnack/buildSrc/src/main/java/com/example/jetsnack/buildsrc/Dependencies.kt @@ -21,11 +21,10 @@ object Versions { } object Libs { - const val androidGradlePlugin = "com.android.tools.build:gradle:7.0.0-alpha05" - const val junit = "junit:junit:4.13" + const val androidGradlePlugin = "com.android.tools.build:gradle:7.0.0-alpha06" object Accompanist { - private const val version = "0.5.1" + private const val version = "0.5.2.compose-7141639-SNAPSHOT" const val coil = "dev.chrisbanes.accompanist:accompanist-coil:$version" const val insets = "dev.chrisbanes.accompanist:accompanist-insets:$version" } @@ -48,8 +47,8 @@ object Libs { const val coreKtx = "androidx.core:core-ktx:1.5.0-beta01" object Compose { - const val snapshot = "" - const val version = "1.0.0-alpha12" + const val snapshot = "7141639" + const val version = "1.0.0-SNAPSHOT" const val foundation = "androidx.compose.foundation:foundation:${version}" const val layout = "androidx.compose.foundation:foundation-layout:${version}" @@ -63,28 +62,17 @@ object Libs { } object Activity { - const val activityCompose = "androidx.activity:activity-compose:1.3.0-alpha02" + const val activityCompose = "androidx.activity:activity-compose:1.3.0-SNAPSHOT" } object Lifecycle { - const val viewModelCompose = "androidx.lifecycle:lifecycle-viewmodel-compose:1.0.0-alpha01" + const val viewModelCompose = + "androidx.lifecycle:lifecycle-viewmodel-compose:1.0.0-SNAPSHOT" } object ConstraintLayout { - const val constraintLayoutCompose = "androidx.constraintlayout:constraintlayout-compose:1.0.0-alpha02" - } - - object Test { - private const val version = "1.2.0" - const val core = "androidx.test:core:$version" - const val rules = "androidx.test:rules:$version" - - object Ext { - private const val version = "1.1.2-rc01" - const val junit = "androidx.test.ext:junit-ktx:$version" - } - - const val espressoCore = "androidx.test.espresso:espresso-core:3.2.0" + const val constraintLayoutCompose = + "androidx.constraintlayout:constraintlayout-compose:1.0.0-SNAPSHOT" } } } From 284bf9e4b15f3db35dda75ae6b68e17b4baf3da8 Mon Sep 17 00:00:00 2001 From: Nick Butcher Date: Mon, 15 Feb 2021 10:27:50 +0000 Subject: [PATCH 27/37] [Owl] Update to snapshot 7141639. Change-Id: I33530df9297a5a4c9347274197ca48556f4fc168 --- Owl/app/build.gradle | 3 +- .../java/com/example/owl/ui/NavigationTest.kt | 4 +- .../owl/ui/fakes/ProvideTestImageLoader.kt | 4 +- .../main/java/com/example/owl/ui/OwlApp.kt | 4 +- .../example/owl/ui/common/CourseListItem.kt | 6 +-- .../example/owl/ui/course/CourseDetails.kt | 45 +++++++++++-------- .../com/example/owl/ui/courses/Courses.kt | 6 +-- .../example/owl/ui/courses/FeaturedCourses.kt | 8 ++-- .../com/example/owl/ui/courses/MyCourses.kt | 8 ++-- .../example/owl/ui/courses/SearchCourses.kt | 3 +- .../example/owl/ui/onboarding/Onboarding.kt | 14 +++--- .../java/com/example/owl/ui/theme/Images.kt | 4 +- .../java/com/example/owl/ui/theme/Theme.kt | 8 ++-- .../com/example/owl/ui/utils/NetworkImage.kt | 4 +- Owl/build.gradle | 12 +++-- .../com/example/owl/buildsrc/Dependencies.kt | 21 +++++---- 16 files changed, 87 insertions(+), 67 deletions(-) diff --git a/Owl/app/build.gradle b/Owl/app/build.gradle index 56ed91a040..5f6a16aba2 100644 --- a/Owl/app/build.gradle +++ b/Owl/app/build.gradle @@ -102,10 +102,9 @@ dependencies { implementation Libs.Accompanist.coil implementation Libs.Accompanist.insets - // FIXME: Only needed for Compose alpha12 androidTestImplementation Libs.AndroidX.Activity.activityCompose - androidTestImplementation Libs.junit + androidTestImplementation Libs.JUnit.junit androidTestImplementation Libs.AndroidX.Test.core androidTestImplementation Libs.AndroidX.Test.espressoCore androidTestImplementation Libs.AndroidX.Test.rules diff --git a/Owl/app/src/androidTest/java/com/example/owl/ui/NavigationTest.kt b/Owl/app/src/androidTest/java/com/example/owl/ui/NavigationTest.kt index ea7d8d00ec..af3499847d 100644 --- a/Owl/app/src/androidTest/java/com/example/owl/ui/NavigationTest.kt +++ b/Owl/app/src/androidTest/java/com/example/owl/ui/NavigationTest.kt @@ -17,7 +17,7 @@ package com.example.owl.ui import androidx.activity.ComponentActivity -import androidx.compose.runtime.Providers +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.ui.test.hasContentDescription import androidx.compose.ui.test.hasText import androidx.compose.ui.test.junit4.createAndroidComposeRule @@ -48,7 +48,7 @@ class NavigationTest { private fun startActivity(startDestination: String? = null) { composeTestRule.setContent { val backDispatcher = composeTestRule.activity.onBackPressedDispatcher - Providers(LocalBackDispatcher provides backDispatcher) { + CompositionLocalProvider(LocalBackDispatcher provides backDispatcher) { ProvideWindowInsets { ProvideTestImageLoader { if (startDestination == null) { diff --git a/Owl/app/src/androidTest/java/com/example/owl/ui/fakes/ProvideTestImageLoader.kt b/Owl/app/src/androidTest/java/com/example/owl/ui/fakes/ProvideTestImageLoader.kt index fd9286edbd..54edea4a7f 100644 --- a/Owl/app/src/androidTest/java/com/example/owl/ui/fakes/ProvideTestImageLoader.kt +++ b/Owl/app/src/androidTest/java/com/example/owl/ui/fakes/ProvideTestImageLoader.kt @@ -19,7 +19,7 @@ package com.example.owl.ui.fakes import android.graphics.Color import android.graphics.drawable.ColorDrawable import androidx.compose.runtime.Composable -import androidx.compose.runtime.Providers +import androidx.compose.runtime.CompositionLocalProvider import coil.ImageLoader import coil.annotation.ExperimentalCoilApi import coil.bitmap.BitmapPool @@ -77,5 +77,5 @@ fun ProvideTestImageLoader(content: @Composable () -> Unit) { override fun shutdown() {} } - Providers(LocalImageLoader provides loader, content = content) + CompositionLocalProvider(LocalImageLoader provides loader, content = content) } diff --git a/Owl/app/src/main/java/com/example/owl/ui/OwlApp.kt b/Owl/app/src/main/java/com/example/owl/ui/OwlApp.kt index 1163ebb181..02494115ad 100644 --- a/Owl/app/src/main/java/com/example/owl/ui/OwlApp.kt +++ b/Owl/app/src/main/java/com/example/owl/ui/OwlApp.kt @@ -18,7 +18,7 @@ package com.example.owl.ui import androidx.activity.OnBackPressedDispatcher import androidx.compose.runtime.Composable -import androidx.compose.runtime.Providers +import androidx.compose.runtime.CompositionLocalProvider import com.example.owl.ui.utils.LocalBackDispatcher import com.example.owl.ui.utils.ProvideImageLoader import dev.chrisbanes.accompanist.insets.ProvideWindowInsets @@ -26,7 +26,7 @@ import dev.chrisbanes.accompanist.insets.ProvideWindowInsets @Composable fun OwlApp(backDispatcher: OnBackPressedDispatcher) { - Providers(LocalBackDispatcher provides backDispatcher) { + CompositionLocalProvider(LocalBackDispatcher provides backDispatcher) { ProvideWindowInsets { ProvideImageLoader { NavGraph() diff --git a/Owl/app/src/main/java/com/example/owl/ui/common/CourseListItem.kt b/Owl/app/src/main/java/com/example/owl/ui/common/CourseListItem.kt index a784baa057..cabf73702a 100644 --- a/Owl/app/src/main/java/com/example/owl/ui/common/CourseListItem.kt +++ b/Owl/app/src/main/java/com/example/owl/ui/common/CourseListItem.kt @@ -21,7 +21,7 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredSize +import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.wrapContentWidth import androidx.compose.foundation.shape.CircleShape import androidx.compose.material.Icon @@ -92,7 +92,7 @@ fun CourseListItem( imageVector = Icons.Rounded.OndemandVideo, tint = MaterialTheme.colors.primary, contentDescription = null, - modifier = Modifier.preferredSize(iconSize) + modifier = Modifier.size(iconSize) ) Text( text = stringResource( @@ -111,7 +111,7 @@ fun CourseListItem( url = course.instructor, contentDescription = null, modifier = Modifier - .preferredSize(28.dp) + .size(28.dp) .clip(CircleShape) ) } diff --git a/Owl/app/src/main/java/com/example/owl/ui/course/CourseDetails.kt b/Owl/app/src/main/java/com/example/owl/ui/course/CourseDetails.kt index c81ed4e271..d84b800eb3 100644 --- a/Owl/app/src/main/java/com/example/owl/ui/course/CourseDetails.kt +++ b/Owl/app/src/main/java/com/example/owl/ui/course/CourseDetails.kt @@ -19,6 +19,7 @@ package com.example.owl.ui.course import androidx.compose.animation.core.animateDpAsState import androidx.compose.foundation.Image import androidx.compose.foundation.clickable +import androidx.compose.foundation.gestures.Orientation.Vertical import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.BoxWithConstraints import androidx.compose.foundation.layout.Column @@ -28,10 +29,10 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredHeight -import androidx.compose.foundation.layout.preferredSize +import androidx.compose.foundation.layout.size import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyListState import androidx.compose.foundation.lazy.LazyRow @@ -59,12 +60,12 @@ import androidx.compose.material.primarySurface import androidx.compose.material.rememberSwipeableState import androidx.compose.material.swipeable import androidx.compose.runtime.Composable -import androidx.compose.runtime.Providers +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.getValue import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.gesture.scrollorientationlocking.Orientation import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.platform.LocalDensity @@ -93,6 +94,7 @@ import dev.chrisbanes.accompanist.insets.LocalWindowInsets import dev.chrisbanes.accompanist.insets.navigationBarsPadding import dev.chrisbanes.accompanist.insets.statusBarsPadding import dev.chrisbanes.accompanist.insets.toPaddingValues +import kotlinx.coroutines.launch private val FabSize = 56.dp private const val ExpandedSheetAlpha = 0.96f @@ -121,10 +123,15 @@ fun CourseDetails( val sheetState = rememberSwipeableState(SheetState.Closed) val fabSize = with(LocalDensity.current) { FabSize.toPx() } val dragRange = constraints.maxHeight - fabSize + val scope = rememberCoroutineScope() backHandler( - enabled = sheetState.value == SheetState.Open, - onBack = { sheetState.animateTo(SheetState.Closed) } + enabled = sheetState.currentValue == SheetState.Open, + onBack = { + scope.launch { + sheetState.animateTo(SheetState.Closed) + } + } ) Box( @@ -137,7 +144,7 @@ fun CourseDetails( -dragRange to SheetState.Open ), thresholds = { _, _ -> FractionalThreshold(0.5f) }, - orientation = Orientation.Vertical + orientation = Vertical ) ) { val openFraction = if (sheetState.offset.value.isNaN()) { @@ -152,7 +159,9 @@ fun CourseDetails( this@BoxWithConstraints.constraints.maxWidth.toFloat(), this@BoxWithConstraints.constraints.maxHeight.toFloat() ) { state -> - sheetState.animateTo(state) + scope.launch { + sheetState.animateTo(state) + } } } } @@ -205,7 +214,7 @@ private fun CourseDescriptionHeader( contentDescription = null, modifier = Modifier .padding(bottom = 4.dp) - .preferredSize(24.dp) + .size(24.dp) .align(Alignment.CenterVertically) ) Spacer(modifier = Modifier.weight(1f)) @@ -213,7 +222,7 @@ private fun CourseDescriptionHeader( OutlinedAvatar( url = course.instructor, modifier = Modifier - .preferredSize(40.dp) + .size(40.dp) .align(Alignment.BottomCenter) .offset(y = 20.dp) // overlap bottom of image ) @@ -244,8 +253,8 @@ private fun CourseDescriptionBody(course: Course) { .fillMaxWidth() .padding(horizontal = 16.dp) ) - Spacer(modifier = Modifier.preferredHeight(16.dp)) - Providers(LocalContentAlpha provides ContentAlpha.medium) { + Spacer(modifier = Modifier.height(16.dp)) + CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) { Text( text = stringResource(id = R.string.course_desc), style = MaterialTheme.typography.body1, @@ -264,7 +273,7 @@ private fun CourseDescriptionBody(course: Course) { .fillMaxWidth() .padding(16.dp) ) - Providers(LocalContentAlpha provides ContentAlpha.medium) { + CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) { Text( text = stringResource(id = R.string.needs), style = MaterialTheme.typography.body1, @@ -318,7 +327,7 @@ private fun RelatedCourses( titleStyle = MaterialTheme.typography.body2, modifier = Modifier .padding(end = 8.dp) - .preferredSize(288.dp, 80.dp), + .size(288.dp, 80.dp), iconSize = 14.dp ) } @@ -424,7 +433,7 @@ private fun Lessons( val fabAlpha = lerp(1f, 0f, 0f, 0.15f, openFraction) Box( modifier = Modifier - .preferredSize(FabSize) + .size(FabSize) .padding(start = 16.dp, top = 8.dp) // visually center contents .graphicsLayer { alpha = fabAlpha } ) { @@ -452,7 +461,7 @@ private fun Lesson(lesson: Lesson) { NetworkImage( url = lesson.imageUrl, contentDescription = null, - modifier = Modifier.preferredSize(112.dp, 64.dp) + modifier = Modifier.size(112.dp, 64.dp) ) Column( modifier = Modifier @@ -465,7 +474,7 @@ private fun Lesson(lesson: Lesson) { maxLines = 2, overflow = TextOverflow.Ellipsis ) - Providers(LocalContentAlpha provides ContentAlpha.medium) { + CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) { Row( modifier = Modifier.padding(top = 4.dp), verticalAlignment = Alignment.CenterVertically @@ -473,7 +482,7 @@ private fun Lesson(lesson: Lesson) { Icon( imageVector = Icons.Rounded.PlayCircleOutline, contentDescription = null, - modifier = Modifier.preferredSize(16.dp) + modifier = Modifier.size(16.dp) ) Text( modifier = Modifier.padding(start = 4.dp), diff --git a/Owl/app/src/main/java/com/example/owl/ui/courses/Courses.kt b/Owl/app/src/main/java/com/example/owl/ui/courses/Courses.kt index 5296a0a685..896fe5b375 100644 --- a/Owl/app/src/main/java/com/example/owl/ui/courses/Courses.kt +++ b/Owl/app/src/main/java/com/example/owl/ui/courses/Courses.kt @@ -19,8 +19,8 @@ package com.example.owl.ui.courses import androidx.annotation.DrawableRes import androidx.annotation.StringRes import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredHeight import androidx.compose.material.BottomNavigation import androidx.compose.material.BottomNavigationItem import androidx.compose.material.Icon @@ -65,7 +65,7 @@ fun Courses(selectCourse: (Long) -> Unit) { label = { Text(stringResource(tab.title).toUpperCase()) }, selected = tab == selectedTab, onClick = { setSelectedTab(tab) }, - alwaysShowLabels = false, + alwaysShowLabel = false, selectedContentColor = MaterialTheme.colors.secondary, unselectedContentColor = LocalContentColor.current, modifier = Modifier.navigationBarsPadding() @@ -88,7 +88,7 @@ fun Courses(selectCourse: (Long) -> Unit) { fun CoursesAppBar() { TopAppBar( elevation = 0.dp, - modifier = Modifier.preferredHeight(80.dp) + modifier = Modifier.height(80.dp) ) { Image( modifier = Modifier diff --git a/Owl/app/src/main/java/com/example/owl/ui/courses/FeaturedCourses.kt b/Owl/app/src/main/java/com/example/owl/ui/courses/FeaturedCourses.kt index 50c3805c62..89af2ce85d 100644 --- a/Owl/app/src/main/java/com/example/owl/ui/courses/FeaturedCourses.kt +++ b/Owl/app/src/main/java/com/example/owl/ui/courses/FeaturedCourses.kt @@ -18,10 +18,9 @@ package com.example.owl.ui.courses import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.ExperimentalLayout import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredSize +import androidx.compose.foundation.layout.size import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material.Icon @@ -75,7 +74,6 @@ fun FeaturedCourses( } } -@OptIn(ExperimentalLayout::class) @Composable fun FeaturedCourse( course: Course, @@ -117,7 +115,7 @@ fun FeaturedCourse( url = course.instructor, outlineColor = outlineColor, modifier = Modifier - .preferredSize(38.dp) + .size(38.dp) .constrainAs(avatar) { centerHorizontallyTo(parent) centerAround(image.bottom) @@ -151,7 +149,7 @@ fun FeaturedCourse( tint = MaterialTheme.colors.primary, contentDescription = null, modifier = Modifier - .preferredSize(16.dp) + .size(16.dp) .constrainAs(icon) { end.linkTo(center) centerVerticallyTo(steps) diff --git a/Owl/app/src/main/java/com/example/owl/ui/courses/MyCourses.kt b/Owl/app/src/main/java/com/example/owl/ui/courses/MyCourses.kt index 3f296186e0..5683d07963 100644 --- a/Owl/app/src/main/java/com/example/owl/ui/courses/MyCourses.kt +++ b/Owl/app/src/main/java/com/example/owl/ui/courses/MyCourses.kt @@ -18,9 +18,9 @@ package com.example.owl.ui.courses import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredHeight -import androidx.compose.foundation.layout.preferredWidth +import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.shape.RoundedCornerShape @@ -61,12 +61,12 @@ fun MyCourse( ) { Row(modifier = Modifier.padding(bottom = 8.dp)) { val stagger = if (index % 2 == 0) 72.dp else 16.dp - Spacer(modifier = Modifier.preferredWidth(stagger)) + Spacer(modifier = Modifier.width(stagger)) CourseListItem( course = course, onClick = { selectCourse(course.id) }, shape = RoundedCornerShape(topStart = 24.dp), - modifier = Modifier.preferredHeight(96.dp) + modifier = Modifier.height(96.dp) ) } } diff --git a/Owl/app/src/main/java/com/example/owl/ui/courses/SearchCourses.kt b/Owl/app/src/main/java/com/example/owl/ui/courses/SearchCourses.kt index ea7ee67c04..b0d1b77456 100644 --- a/Owl/app/src/main/java/com/example/owl/ui/courses/SearchCourses.kt +++ b/Owl/app/src/main/java/com/example/owl/ui/courses/SearchCourses.kt @@ -38,6 +38,7 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.SolidColor import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.TextFieldValue @@ -113,7 +114,7 @@ private fun AppBar( color = LocalContentColor.current ), maxLines = 1, - cursorColor = LocalContentColor.current, + cursorBrush = SolidColor(LocalContentColor.current), modifier = Modifier .weight(1f) .align(Alignment.CenterVertically) diff --git a/Owl/app/src/main/java/com/example/owl/ui/onboarding/Onboarding.kt b/Owl/app/src/main/java/com/example/owl/ui/onboarding/Onboarding.kt index 09b990fac8..856b536f2e 100644 --- a/Owl/app/src/main/java/com/example/owl/ui/onboarding/Onboarding.kt +++ b/Owl/app/src/main/java/com/example/owl/ui/onboarding/Onboarding.kt @@ -28,9 +28,9 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredHeight -import androidx.compose.foundation.layout.preferredSize +import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.foundation.rememberScrollState @@ -51,7 +51,7 @@ import androidx.compose.material.icons.filled.Settings import androidx.compose.material.icons.rounded.Explore import androidx.compose.material.primarySurface import androidx.compose.runtime.Composable -import androidx.compose.runtime.Providers +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -114,7 +114,7 @@ fun Onboarding(onboardingComplete: () -> Unit) { .weight(1f) .wrapContentHeight() ) - Spacer(Modifier.preferredHeight(56.dp)) // center grid accounting for FAB + Spacer(Modifier.height(56.dp)) // center grid accounting for FAB } } } @@ -196,7 +196,7 @@ private fun TopicChip(topic: Topic) { url = topic.imageUrl, contentDescription = null, modifier = Modifier - .preferredSize(width = 72.dp, height = 72.dp) + .size(width = 72.dp, height = 72.dp) .aspectRatio(1f) ) if (selectedAlpha > 0f) { @@ -227,13 +227,13 @@ private fun TopicChip(topic: Topic) { ) ) Row(verticalAlignment = Alignment.CenterVertically) { - Providers(LocalContentAlpha provides ContentAlpha.medium) { + CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) { Icon( painter = painterResource(R.drawable.ic_grain), contentDescription = null, modifier = Modifier .padding(start = 16.dp) - .preferredSize(12.dp) + .size(12.dp) ) Text( text = topic.courses.toString(), diff --git a/Owl/app/src/main/java/com/example/owl/ui/theme/Images.kt b/Owl/app/src/main/java/com/example/owl/ui/theme/Images.kt index da629ea256..fa82bf0727 100644 --- a/Owl/app/src/main/java/com/example/owl/ui/theme/Images.kt +++ b/Owl/app/src/main/java/com/example/owl/ui/theme/Images.kt @@ -26,4 +26,6 @@ import androidx.compose.runtime.staticCompositionLocalOf @Immutable data class Images(@DrawableRes val lockupLogo: Int) -internal val AmbientImages = staticCompositionLocalOf(null) +internal val LocalImages = staticCompositionLocalOf { + error("No LocalImages specified") +} diff --git a/Owl/app/src/main/java/com/example/owl/ui/theme/Theme.kt b/Owl/app/src/main/java/com/example/owl/ui/theme/Theme.kt index ffbfef6f08..6f14c4765f 100644 --- a/Owl/app/src/main/java/com/example/owl/ui/theme/Theme.kt +++ b/Owl/app/src/main/java/com/example/owl/ui/theme/Theme.kt @@ -24,7 +24,7 @@ import androidx.compose.material.Typography import androidx.compose.material.darkColors import androidx.compose.material.lightColors import androidx.compose.runtime.Composable -import androidx.compose.runtime.Providers +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.dp import com.example.owl.R @@ -126,9 +126,9 @@ private fun OwlTheme( ) { val elevation = if (darkTheme) DarkElevation else LightElevation val images = if (darkTheme) DarkImages else LightImages - Providers( + CompositionLocalProvider( LocalElevations provides elevation, - AmbientImages provides images + LocalImages provides images ) { MaterialTheme( colors = colors, @@ -178,5 +178,5 @@ object OwlTheme { */ val images: Images @Composable - get() = AmbientImages.current + get() = LocalImages.current } diff --git a/Owl/app/src/main/java/com/example/owl/ui/utils/NetworkImage.kt b/Owl/app/src/main/java/com/example/owl/ui/utils/NetworkImage.kt index 6a92aaf2f2..b943b59fd9 100644 --- a/Owl/app/src/main/java/com/example/owl/ui/utils/NetworkImage.kt +++ b/Owl/app/src/main/java/com/example/owl/ui/utils/NetworkImage.kt @@ -21,7 +21,7 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.material.MaterialTheme import androidx.compose.runtime.Composable -import androidx.compose.runtime.Providers +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -74,7 +74,7 @@ fun ProvideImageLoader(content: @Composable () -> Unit) { add(UnsplashSizingInterceptor) }.build() } - Providers(LocalImageLoader provides loader, content = content) + CompositionLocalProvider(LocalImageLoader provides loader, content = content) } /** diff --git a/Owl/build.gradle b/Owl/build.gradle index e6d90ac3b3..1d36228870 100644 --- a/Owl/build.gradle +++ b/Owl/build.gradle @@ -38,9 +38,8 @@ subprojects { jcenter() if (!Libs.AndroidX.Compose.snapshot.isEmpty()) { - maven { - url "https://androidx.dev/snapshots/builds/${Libs.AndroidX.Compose.snapshot}/artifacts/repository/" - } + maven { url "https://androidx.dev/snapshots/builds/${Libs.AndroidX.Compose.snapshot}/artifacts/repository/" } + maven { url "http://androidx.dev/storage/repository/androidx/constraintlayout" } } maven { url 'https://oss.sonatype.org/content/repositories/snapshots' } @@ -55,6 +54,13 @@ subprojects { } } + configurations.configureEach { + // androidx.test forces JUnit, 4.12, prefer 4.13 + resolutionStrategy { + force Libs.JUnit.junit + } + } + apply plugin: 'com.diffplug.spotless' spotless { kotlin { diff --git a/Owl/buildSrc/src/main/java/com/example/owl/buildsrc/Dependencies.kt b/Owl/buildSrc/src/main/java/com/example/owl/buildsrc/Dependencies.kt index 4e43012658..76d4b6bf6d 100644 --- a/Owl/buildSrc/src/main/java/com/example/owl/buildsrc/Dependencies.kt +++ b/Owl/buildSrc/src/main/java/com/example/owl/buildsrc/Dependencies.kt @@ -21,11 +21,10 @@ object Versions { } object Libs { - const val androidGradlePlugin = "com.android.tools.build:gradle:7.0.0-alpha05" - const val junit = "junit:junit:4.13" + const val androidGradlePlugin = "com.android.tools.build:gradle:7.0.0-alpha06" object Accompanist { - private const val version = "0.5.1" + private const val version = "0.5.2.compose-7141639-SNAPSHOT" const val coil = "dev.chrisbanes.accompanist:accompanist-coil:$version" const val insets = "dev.chrisbanes.accompanist:accompanist-insets:$version" } @@ -44,13 +43,18 @@ object Libs { const val test = "org.jetbrains.kotlinx:kotlinx-coroutines-test:$version" } + object JUnit { + private const val version = "4.13" + const val junit = "junit:junit:$version" + } + object AndroidX { const val coreKtx = "androidx.core:core-ktx:1.5.0-beta01" - const val navigation = "androidx.navigation:navigation-compose:1.0.0-alpha07" + const val navigation = "androidx.navigation:navigation-compose:1.0.0-SNAPSHOT" object Compose { - const val snapshot = "" - const val version = "1.0.0-alpha12" + const val snapshot = "7141639" + const val version = "1.0.0-SNAPSHOT" const val animation = "androidx.compose.animation:animation:$version" const val foundation = "androidx.compose.foundation:foundation:$version" @@ -65,11 +69,12 @@ object Libs { } object Activity { - const val activityCompose = "androidx.activity:activity-compose:1.3.0-alpha02" + const val activityCompose = "androidx.activity:activity-compose:1.3.0-SNAPSHOT" } object ConstraintLayout { - const val constraintLayoutCompose = "androidx.constraintlayout:constraintlayout-compose:1.0.0-alpha02" + const val constraintLayoutCompose = + "androidx.constraintlayout:constraintlayout-compose:1.0.0-SNAPSHOT" } object Test { From 8e4b4decfc3cfce82a9dbf8ac290916fcb72fd21 Mon Sep 17 00:00:00 2001 From: Yacine Rezgui Date: Thu, 18 Feb 2021 16:17:13 +0000 Subject: [PATCH 28/37] Revert initial revert on viewmodel initialization --- .../java/com/example/jetcaster/ui/home/discover/Discover.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/discover/Discover.kt b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/discover/Discover.kt index 7cdae25d7e..08a1715e0d 100644 --- a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/discover/Discover.kt +++ b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/discover/Discover.kt @@ -43,7 +43,7 @@ import com.example.jetcaster.ui.theme.Keyline1 fun Discover( modifier: Modifier = Modifier ) { - val viewModel = viewModel(DiscoverViewModel::class.java) + val viewModel: DiscoverViewModel = viewModel() val viewState by viewModel.state.collectAsState() val selectedCategory = viewState.selectedCategory From 2e5768ad906cf8e9eebd80fcf5a2544f06c354dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=20Alc=C3=A9rreca?= Date: Thu, 18 Feb 2021 16:34:26 +0000 Subject: [PATCH 29/37] Extracts FragmentAwareAndroidViewBinding to file --- .../FragmentAwareAndroidViewBinding.kt | 103 ++++++++++++++++++ .../example/compose/jetchat/NavActivity.kt | 64 ----------- .../compose/jetchat/buildsrc/dependencies.kt | 4 +- 3 files changed, 105 insertions(+), 66 deletions(-) create mode 100644 Jetchat/app/src/main/java/com/example/compose/jetchat/FragmentAwareAndroidViewBinding.kt diff --git a/Jetchat/app/src/main/java/com/example/compose/jetchat/FragmentAwareAndroidViewBinding.kt b/Jetchat/app/src/main/java/com/example/compose/jetchat/FragmentAwareAndroidViewBinding.kt new file mode 100644 index 0000000000..48efc2e072 --- /dev/null +++ b/Jetchat/app/src/main/java/com/example/compose/jetchat/FragmentAwareAndroidViewBinding.kt @@ -0,0 +1,103 @@ +/* + * Copyright 2020 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 + * + * https://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 com.example.compose.jetchat + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.mutableStateListOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.snapshots.SnapshotStateList +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.viewinterop.AndroidViewBinding +import androidx.core.view.forEach +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentActivity +import androidx.fragment.app.FragmentContainerView +import androidx.fragment.app.commit +import androidx.fragment.app.findFragment +import androidx.viewbinding.ViewBinding + +/** + * TODO: Fragments inflated via AndroidViewBinding don't work as expected + * https://issuetracker.google.com/179915946 + */ +@Composable +fun FragmentAwareAndroidViewBinding( + bindingBlock: (LayoutInflater, ViewGroup, Boolean) -> T, + modifier: Modifier = Modifier, + update: T.() -> Unit = {} +) { + val fragmentContainerViews = remember { mutableStateListOf() } + AndroidViewBinding(bindingBlock, modifier = modifier) { + fragmentContainerViews.clear() + val rootGroup = root as? ViewGroup + if (rootGroup != null) { + findFragmentContainerViews(rootGroup, fragmentContainerViews) + } + update() + } + val activity = LocalContext.current as FragmentActivity + fragmentContainerViews.forEach { container -> + DisposableEffect(container) { + // Find the right FragmentManager + val fragmentManager = try { + val parentFragment = container.findFragment() + parentFragment.childFragmentManager + } catch (e: Exception) { + activity.supportFragmentManager + } + // Now find the fragment inflated via the FragmentContainerView + val existingFragment = fragmentManager.findFragmentById(R.id.nav_host_fragment) + if (existingFragment != null) { + val fragmentView = existingFragment.requireView() + // Remove the Fragment from whatever old parent it had + // (this is most likely an old binding if it is non-null) + (fragmentView.parent as? ViewGroup)?.run { + removeView(fragmentView) + } + // Re-add it to the layout if it was moved to RESUMED before + // this Composable ran + container.addView(existingFragment.requireView()) + } + onDispose { + if (existingFragment != null && !fragmentManager.isStateSaved) { + // If the state isn't saved, that means that some state change + // has removed this Composable from the hierarchy + fragmentManager.commit { + remove(existingFragment) + } + } + } + } + } +} + +private fun findFragmentContainerViews( + viewGroup: ViewGroup, + list: SnapshotStateList +) { + viewGroup.forEach { + if (it is FragmentContainerView) { + list += it + } else if (it is ViewGroup) { + findFragmentContainerViews(it, list) + } + } +} diff --git a/Jetchat/app/src/main/java/com/example/compose/jetchat/NavActivity.kt b/Jetchat/app/src/main/java/com/example/compose/jetchat/NavActivity.kt index 07618007ee..3a2cd49b48 100644 --- a/Jetchat/app/src/main/java/com/example/compose/jetchat/NavActivity.kt +++ b/Jetchat/app/src/main/java/com/example/compose/jetchat/NavActivity.kt @@ -133,67 +133,3 @@ class NavActivity : AppCompatActivity() { return navHostFragment.navController } } - -@Composable -fun FragmentAwareAndroidViewBinding( - bindingBlock: (LayoutInflater, ViewGroup, Boolean) -> T, - modifier: Modifier = Modifier, - update: T.() -> Unit = {} -) { - val fragmentContainerViews = remember { mutableStateListOf() } - AndroidViewBinding(bindingBlock, modifier = modifier) { - fragmentContainerViews.clear() - val rootGroup = root as? ViewGroup - if (rootGroup != null) { - findFragmentContainerViews(rootGroup, fragmentContainerViews) - } - update() - } - val activity = LocalContext.current as FragmentActivity - fragmentContainerViews.forEach { container -> - DisposableEffect(container) { - // Find the right FragmentManager - val fragmentManager = try { - val parentFragment = container.findFragment() - parentFragment.childFragmentManager - } catch (e: Exception) { - activity.supportFragmentManager - } - // Now find the fragment inflated via the FragmentContainerView - val existingFragment = fragmentManager.findFragmentById(R.id.nav_host_fragment) - if (existingFragment != null) { - val fragmentView = existingFragment.requireView() - // Remove the Fragment from whatever old parent it had - // (this is most likely an old binding if it is non-null) - (fragmentView.parent as? ViewGroup)?.run { - removeView(fragmentView) - } - // Re-add it to the layout if it was moved to RESUMED before - // this Composable ran - container.addView(existingFragment.requireView()) - } - onDispose { - if (existingFragment != null && !fragmentManager.isStateSaved) { - // If the state isn't saved, that means that some state change - // has removed this Composable from the hierarchy - fragmentManager.commit { - remove(existingFragment) - } - } - } - } - } -} - -private fun findFragmentContainerViews( - viewGroup: ViewGroup, - list: SnapshotStateList -) { - viewGroup.forEach { - if (it is FragmentContainerView) { - list += it - } else if (it is ViewGroup) { - findFragmentContainerViews(it, list) - } - } -} diff --git a/Jetchat/buildSrc/src/main/java/com/example/compose/jetchat/buildsrc/dependencies.kt b/Jetchat/buildSrc/src/main/java/com/example/compose/jetchat/buildsrc/dependencies.kt index 355c242dc6..6b33ffa3b8 100644 --- a/Jetchat/buildSrc/src/main/java/com/example/compose/jetchat/buildsrc/dependencies.kt +++ b/Jetchat/buildSrc/src/main/java/com/example/compose/jetchat/buildsrc/dependencies.kt @@ -43,7 +43,7 @@ object Libs { } object Accompanist { - private const val version = "0.5.2.compose-7141639-SNAPSHOT" + private const val version = "0.5.2.compose-7154166-SNAPSHOT" const val insets = "dev.chrisbanes.accompanist:accompanist-insets:$version" } @@ -56,7 +56,7 @@ object Libs { } object Compose { - const val snapshot = "7141639" + const val snapshot = "7154166" const val version = "1.0.0-SNAPSHOT" const val foundation = "androidx.compose.foundation:foundation:$version" From 85ee0550b81d91caf642b04e0e41305151472855 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=20Alc=C3=A9rreca?= Date: Thu, 18 Feb 2021 16:42:14 +0000 Subject: [PATCH 30/37] spotless... --- .../com/example/compose/jetchat/NavActivity.kt | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/Jetchat/app/src/main/java/com/example/compose/jetchat/NavActivity.kt b/Jetchat/app/src/main/java/com/example/compose/jetchat/NavActivity.kt index 3a2cd49b48..bf554b1b84 100644 --- a/Jetchat/app/src/main/java/com/example/compose/jetchat/NavActivity.kt +++ b/Jetchat/app/src/main/java/com/example/compose/jetchat/NavActivity.kt @@ -17,35 +17,18 @@ package com.example.compose.jetchat import android.os.Bundle -import android.view.LayoutInflater -import android.view.ViewGroup import androidx.activity.compose.setContent import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity import androidx.compose.material.rememberScaffoldState -import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider -import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.livedata.observeAsState -import androidx.compose.runtime.mutableStateListOf -import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope -import androidx.compose.runtime.snapshots.SnapshotStateList -import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.viewinterop.AndroidViewBinding import androidx.core.os.bundleOf import androidx.core.view.WindowCompat -import androidx.core.view.forEach -import androidx.fragment.app.Fragment -import androidx.fragment.app.FragmentActivity -import androidx.fragment.app.FragmentContainerView -import androidx.fragment.app.commit -import androidx.fragment.app.findFragment import androidx.navigation.NavController import androidx.navigation.findNavController import androidx.navigation.fragment.NavHostFragment -import androidx.viewbinding.ViewBinding import com.example.compose.jetchat.components.JetchatScaffold import com.example.compose.jetchat.conversation.BackPressHandler import com.example.compose.jetchat.conversation.LocalBackPressedDispatcher From a0e7ad40373e890f86473bfa5b9b3351150cccf2 Mon Sep 17 00:00:00 2001 From: Nick Butcher Date: Thu, 18 Feb 2021 18:29:17 +0000 Subject: [PATCH 31/37] [Jetsnack] Correct creation of coroutines within composition. Change-Id: If7f0ce951d555ec6413e1d56fd54035c2c69a0d6 --- .../src/main/java/com/example/jetsnack/ui/home/Home.kt | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/Home.kt b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/Home.kt index d8e76bf65d..1adb917057 100644 --- a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/Home.kt +++ b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/Home.kt @@ -46,7 +46,6 @@ import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -75,7 +74,6 @@ import com.example.jetsnack.ui.home.cart.Cart import com.example.jetsnack.ui.home.search.Search import com.example.jetsnack.ui.theme.JetsnackTheme import dev.chrisbanes.accompanist.insets.navigationBarsPadding -import kotlinx.coroutines.launch @Composable fun Home(onSnackSelected: (Long) -> Unit) { @@ -189,13 +187,10 @@ private fun JetsnackBottomNavLayout( Animatable(if (i == selectedIndex) 1f else 0f) } } - val scope = rememberCoroutineScope() selectionFractions.forEachIndexed { index, selectionFraction -> val target = if (index == selectedIndex) 1f else 0f - if (selectionFraction.targetValue != target) { - scope.launch { - selectionFraction.animateTo(target, animSpec) - } + LaunchedEffect(target) { + selectionFraction.animateTo(target, animSpec) } } From 4e81ef56889bc2884054f814689cc9036ecbb3c5 Mon Sep 17 00:00:00 2001 From: Nick Butcher Date: Thu, 18 Feb 2021 20:02:31 +0000 Subject: [PATCH 32/37] [Jetsnack] Key bottom nav anim on anim spec. Change-Id: I3e42d88cb19ae83fd850f5c21690922955d4eae8 --- Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/Home.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/Home.kt b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/Home.kt index 1adb917057..7cbc2f1f0c 100644 --- a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/Home.kt +++ b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/Home.kt @@ -189,7 +189,7 @@ private fun JetsnackBottomNavLayout( } selectionFractions.forEachIndexed { index, selectionFraction -> val target = if (index == selectedIndex) 1f else 0f - LaunchedEffect(target) { + LaunchedEffect(target, animSpec) { selectionFraction.animateTo(target, animSpec) } } From a30b2c697ff7b551362301835f6f0cffa4b55102 Mon Sep 17 00:00:00 2001 From: Nick Butcher Date: Fri, 19 Feb 2021 11:32:37 +0000 Subject: [PATCH 33/37] [Owl] Encapsulate onboarding transition. Change-Id: Ic999a8118cb4390f11bc49f7ae2cd12a7b54b474 --- .../example/owl/ui/onboarding/Onboarding.kt | 52 +++++++++++++++---- .../com/example/owl/buildsrc/Dependencies.kt | 6 +-- 2 files changed, 44 insertions(+), 14 deletions(-) diff --git a/Owl/app/src/main/java/com/example/owl/ui/onboarding/Onboarding.kt b/Owl/app/src/main/java/com/example/owl/ui/onboarding/Onboarding.kt index 856b536f2e..c8012b2129 100644 --- a/Owl/app/src/main/java/com/example/owl/ui/onboarding/Onboarding.kt +++ b/Owl/app/src/main/java/com/example/owl/ui/onboarding/Onboarding.kt @@ -52,6 +52,7 @@ import androidx.compose.material.icons.rounded.Explore import androidx.compose.material.primarySurface import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.State import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -63,6 +64,7 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import com.example.owl.R import com.example.owl.model.Topic @@ -161,34 +163,60 @@ private fun TopicsGrid(modifier: Modifier = Modifier) { private enum class SelectionState { Unselected, Selected } +/** + * Class holding animating values when transitioning topic chip states. + */ +private class TopicChipTransition( + corerRadius: State, + selectedAlpha: State, + checkScale: State +) { + val corerRadius by corerRadius + val selectedAlpha by selectedAlpha + val checkScale by checkScale +} + @Composable -private fun TopicChip(topic: Topic) { - val (selected, onSelected) = remember { mutableStateOf(false) } +private fun topicChipTransition(topicSelected: Boolean): TopicChipTransition { val transition = updateTransition( - targetState = if (selected) SelectionState.Selected else SelectionState.Unselected + targetState = if (topicSelected) SelectionState.Selected else SelectionState.Unselected ) - val corerRadius by transition.animateDp { state -> + val corerRadius = transition.animateDp { state -> when (state) { SelectionState.Unselected -> 0.dp SelectionState.Selected -> 28.dp } } - val selectedAlpha by transition.animateFloat { state -> + val selectedAlpha = transition.animateFloat { state -> when (state) { SelectionState.Unselected -> 0f SelectionState.Selected -> 0.8f } } - val checkScale by transition.animateFloat { state -> + val checkScale = transition.animateFloat { state -> when (state) { SelectionState.Unselected -> 0.6f SelectionState.Selected -> 1f } } + return remember(transition) { + TopicChipTransition(corerRadius, selectedAlpha, checkScale) + } +} + +@Composable +private fun TopicChip(topic: Topic) { + val (selected, onSelected) = remember { mutableStateOf(false) } + val topicChipTransitionState = topicChipTransition(selected) + Surface( modifier = Modifier.padding(4.dp), elevation = OwlTheme.elevations.card, - shape = MaterialTheme.shapes.medium.copy(topStart = CornerSize(corerRadius)) + shape = MaterialTheme.shapes.medium.copy( + topStart = CornerSize( + topicChipTransitionState.corerRadius + ) + ) ) { Row(modifier = Modifier.toggleable(value = selected, onValueChange = onSelected)) { Box { @@ -199,18 +227,20 @@ private fun TopicChip(topic: Topic) { .size(width = 72.dp, height = 72.dp) .aspectRatio(1f) ) - if (selectedAlpha > 0f) { + if (topicChipTransitionState.selectedAlpha > 0f) { Surface( - color = pink500.copy(alpha = selectedAlpha), + color = pink500.copy(alpha = topicChipTransitionState.selectedAlpha), modifier = Modifier.matchParentSize() ) { Icon( imageVector = Icons.Filled.Done, contentDescription = null, - tint = MaterialTheme.colors.onPrimary.copy(alpha = selectedAlpha), + tint = MaterialTheme.colors.onPrimary.copy( + alpha = topicChipTransitionState.selectedAlpha + ), modifier = Modifier .wrapContentSize() - .scale(checkScale) + .scale(topicChipTransitionState.checkScale) ) } } diff --git a/Owl/buildSrc/src/main/java/com/example/owl/buildsrc/Dependencies.kt b/Owl/buildSrc/src/main/java/com/example/owl/buildsrc/Dependencies.kt index 76d4b6bf6d..a746bf35f1 100644 --- a/Owl/buildSrc/src/main/java/com/example/owl/buildsrc/Dependencies.kt +++ b/Owl/buildSrc/src/main/java/com/example/owl/buildsrc/Dependencies.kt @@ -21,10 +21,10 @@ object Versions { } object Libs { - const val androidGradlePlugin = "com.android.tools.build:gradle:7.0.0-alpha06" + const val androidGradlePlugin = "com.android.tools.build:gradle:7.0.0-alpha07" object Accompanist { - private const val version = "0.5.2.compose-7141639-SNAPSHOT" + private const val version = "0.5.2.compose-7154166-SNAPSHOT" const val coil = "dev.chrisbanes.accompanist:accompanist-coil:$version" const val insets = "dev.chrisbanes.accompanist:accompanist-insets:$version" } @@ -53,7 +53,7 @@ object Libs { const val navigation = "androidx.navigation:navigation-compose:1.0.0-SNAPSHOT" object Compose { - const val snapshot = "7141639" + const val snapshot = "7154166" const val version = "1.0.0-SNAPSHOT" const val animation = "androidx.compose.animation:animation:$version" From a18c2f70f96782953b44cb3e7f557010b604e324 Mon Sep 17 00:00:00 2001 From: Nick Butcher Date: Fri, 19 Feb 2021 12:14:56 +0000 Subject: [PATCH 34/37] [Owl] Spell gooder. Change-Id: Ia38ddea33c9f7d79cdc88d266013464784455bd9 --- .../main/java/com/example/owl/ui/onboarding/Onboarding.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Owl/app/src/main/java/com/example/owl/ui/onboarding/Onboarding.kt b/Owl/app/src/main/java/com/example/owl/ui/onboarding/Onboarding.kt index c8012b2129..5dbd2db512 100644 --- a/Owl/app/src/main/java/com/example/owl/ui/onboarding/Onboarding.kt +++ b/Owl/app/src/main/java/com/example/owl/ui/onboarding/Onboarding.kt @@ -167,11 +167,11 @@ private enum class SelectionState { Unselected, Selected } * Class holding animating values when transitioning topic chip states. */ private class TopicChipTransition( - corerRadius: State, + cornerRadius: State, selectedAlpha: State, checkScale: State ) { - val corerRadius by corerRadius + val cornerRadius by cornerRadius val selectedAlpha by selectedAlpha val checkScale by checkScale } @@ -214,7 +214,7 @@ private fun TopicChip(topic: Topic) { elevation = OwlTheme.elevations.card, shape = MaterialTheme.shapes.medium.copy( topStart = CornerSize( - topicChipTransitionState.corerRadius + topicChipTransitionState.cornerRadius ) ) ) { From 50b2502ea8dca9061ac6642364692f06469a15f4 Mon Sep 17 00:00:00 2001 From: Florina Muntenescu Date: Tue, 16 Feb 2021 12:40:37 +0000 Subject: [PATCH 35/37] [Jetsurvey] Update to beta01 snapshot --- Jetsurvey/app/build.gradle | 10 --- .../jetsurvey/ExampleInstrumentedTest.kt | 38 ---------- .../jetsurvey/signinsignup/SignInScreen.kt | 12 ++-- .../jetsurvey/signinsignup/SignInSignUp.kt | 31 ++++----- .../jetsurvey/signinsignup/SignUpScreen.kt | 16 ++--- .../jetsurvey/signinsignup/WelcomeScreen.kt | 10 +-- .../jetsurvey/survey/SurveyQuestions.kt | 10 +-- .../compose/jetsurvey/survey/SurveyScreen.kt | 69 ++++++++++--------- Jetsurvey/build.gradle | 8 +++ .../jetsurvey/buildsrc/dependencies.kt | 10 +-- 10 files changed, 87 insertions(+), 127 deletions(-) delete mode 100644 Jetsurvey/app/src/androidTest/java/com/example/compose/jetsurvey/ExampleInstrumentedTest.kt diff --git a/Jetsurvey/app/build.gradle b/Jetsurvey/app/build.gradle index 9d9f6d7cdd..43388d07d3 100644 --- a/Jetsurvey/app/build.gradle +++ b/Jetsurvey/app/build.gradle @@ -113,14 +113,4 @@ dependencies { implementation Libs.AndroidX.Compose.runtimeLivedata implementation Libs.Accompanist.coil - - // FIXME: only needed for Compose alpha12 - androidTestImplementation Libs.AndroidX.Activity.activityCompose - - androidTestImplementation Libs.junit - androidTestImplementation Libs.AndroidX.Test.core - androidTestImplementation Libs.AndroidX.Test.espressoCore - androidTestImplementation Libs.AndroidX.Test.rules - androidTestImplementation Libs.AndroidX.Test.Ext.junit - androidTestImplementation Libs.AndroidX.Compose.uiTest } diff --git a/Jetsurvey/app/src/androidTest/java/com/example/compose/jetsurvey/ExampleInstrumentedTest.kt b/Jetsurvey/app/src/androidTest/java/com/example/compose/jetsurvey/ExampleInstrumentedTest.kt deleted file mode 100644 index 9b7b530365..0000000000 --- a/Jetsurvey/app/src/androidTest/java/com/example/compose/jetsurvey/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2020 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 - * - * https://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 com.example.compose.jetsurvey - -import androidx.test.ext.junit.runners.AndroidJUnit4 -import androidx.test.platform.app.InstrumentationRegistry -import org.junit.Assert.assertEquals -import org.junit.Test -import org.junit.runner.RunWith - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.example.compose.jetsurvey", appContext.packageName) - } -} diff --git a/Jetsurvey/app/src/main/java/com/example/compose/jetsurvey/signinsignup/SignInScreen.kt b/Jetsurvey/app/src/main/java/com/example/compose/jetsurvey/signinsignup/SignInScreen.kt index da4769d303..610330dd3e 100644 --- a/Jetsurvey/app/src/main/java/com/example/compose/jetsurvey/signinsignup/SignInScreen.kt +++ b/Jetsurvey/app/src/main/java/com/example/compose/jetsurvey/signinsignup/SignInScreen.kt @@ -21,8 +21,8 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredHeight import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.material.Button import androidx.compose.material.ExperimentalMaterialApi @@ -72,7 +72,7 @@ fun SignIn(onNavigationEvent: (SignInEvent) -> Unit) { onBackPressed = { onNavigationEvent(SignInEvent.NavigateBack) } ) }, - bodyContent = { + content = { SignInSignUpScreen( onSignedInAsGuest = { onNavigationEvent(SignInEvent.SignInAsGuest) }, modifier = Modifier.fillMaxWidth() @@ -83,7 +83,7 @@ fun SignIn(onNavigationEvent: (SignInEvent) -> Unit) { onNavigationEvent(SignInEvent.SignIn(email, password)) } ) - Spacer(modifier = Modifier.preferredHeight(16.dp)) + Spacer(modifier = Modifier.height(16.dp)) TextButton( onClick = { scope.launch { @@ -120,7 +120,7 @@ fun SignInContent( val emailState = remember { EmailState() } Email(emailState, onImeAction = { focusRequester.requestFocus() }) - Spacer(modifier = Modifier.preferredHeight(16.dp)) + Spacer(modifier = Modifier.height(16.dp)) val passwordState = remember { PasswordState() } Password( @@ -129,7 +129,7 @@ fun SignInContent( modifier = Modifier.focusRequester(focusRequester), onImeAction = { onSignInSubmitted(emailState.text, passwordState.text) } ) - Spacer(modifier = Modifier.preferredHeight(16.dp)) + Spacer(modifier = Modifier.height(16.dp)) Button( onClick = { onSignInSubmitted(emailState.text, passwordState.text) }, modifier = Modifier @@ -156,7 +156,7 @@ fun ErrorSnackbar( snackbar = { data -> Snackbar( modifier = Modifier.padding(16.dp), - text = { + content = { Text( text = data.message, style = MaterialTheme.typography.body2 diff --git a/Jetsurvey/app/src/main/java/com/example/compose/jetsurvey/signinsignup/SignInSignUp.kt b/Jetsurvey/app/src/main/java/com/example/compose/jetsurvey/signinsignup/SignInSignUp.kt index 673f2ad9d0..dde485b5a2 100644 --- a/Jetsurvey/app/src/main/java/com/example/compose/jetsurvey/signinsignup/SignInSignUp.kt +++ b/Jetsurvey/app/src/main/java/com/example/compose/jetsurvey/signinsignup/SignInSignUp.kt @@ -22,9 +22,9 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredHeight -import androidx.compose.foundation.layout.preferredWidth +import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.text.KeyboardActions @@ -45,7 +45,7 @@ import androidx.compose.material.icons.filled.ChevronLeft import androidx.compose.material.icons.filled.Visibility import androidx.compose.material.icons.filled.VisibilityOff import androidx.compose.runtime.Composable -import androidx.compose.runtime.Providers +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.Alignment @@ -53,7 +53,6 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusState import androidx.compose.ui.focus.onFocusChanged import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.SoftwareKeyboardController import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.PasswordVisualTransformation import androidx.compose.ui.text.input.VisualTransformation @@ -70,7 +69,7 @@ fun SignInSignUpScreen( ) { LazyColumn(modifier = modifier) { item { - Spacer(modifier = Modifier.preferredHeight(44.dp)) + Spacer(modifier = Modifier.height(44.dp)) Box( modifier = Modifier .fillMaxWidth() @@ -78,7 +77,7 @@ fun SignInSignUpScreen( ) { content() } - Spacer(modifier = Modifier.preferredHeight(16.dp)) + Spacer(modifier = Modifier.height(16.dp)) OrSignInAsGuest( onSignedInAsGuest = onSignedInAsGuest, modifier = Modifier @@ -111,7 +110,7 @@ fun SignInSignUpTopAppBar(topAppBarText: String, onBackPressed: () -> Unit) { }, // We need to balance the navigation icon, so we add a spacer. actions = { - Spacer(modifier = Modifier.preferredWidth(68.dp)) + Spacer(modifier = Modifier.width(68.dp)) }, backgroundColor = MaterialTheme.colors.surface, elevation = 0.dp @@ -124,14 +123,13 @@ fun Email( imeAction: ImeAction = ImeAction.Next, onImeAction: () -> Unit = {} ) { - lateinit var softwareKeyboardController: SoftwareKeyboardController OutlinedTextField( value = emailState.text, onValueChange = { emailState.text = it }, label = { - Providers(LocalContentAlpha provides ContentAlpha.medium) { + CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) { Text( text = stringResource(id = R.string.email), style = MaterialTheme.typography.body2 @@ -148,13 +146,11 @@ fun Email( } }, textStyle = MaterialTheme.typography.body2, - isErrorValue = emailState.showErrors(), - onTextInputStarted = { softwareKeyboardController = it }, + isError = emailState.showErrors(), keyboardOptions = KeyboardOptions.Default.copy(imeAction = imeAction), keyboardActions = KeyboardActions( onDone = { onImeAction() - softwareKeyboardController.hideSoftwareKeyboard() } ) ) @@ -170,7 +166,6 @@ fun Password( imeAction: ImeAction = ImeAction.Done, onImeAction: () -> Unit = {} ) { - lateinit var softwareKeyboardController: SoftwareKeyboardController val showPassword = remember { mutableStateOf(false) } OutlinedTextField( value = passwordState.text, @@ -189,7 +184,7 @@ fun Password( }, textStyle = MaterialTheme.typography.body2, label = { - Providers(LocalContentAlpha provides ContentAlpha.medium) { + CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) { Text( text = label, style = MaterialTheme.typography.body2 @@ -218,13 +213,11 @@ fun Password( } else { PasswordVisualTransformation() }, - isErrorValue = passwordState.showErrors(), - onTextInputStarted = { softwareKeyboardController = it }, + isError = passwordState.showErrors(), keyboardOptions = KeyboardOptions.Default.copy(imeAction = imeAction), keyboardActions = KeyboardActions( onDone = { onImeAction() - softwareKeyboardController.hideSoftwareKeyboard() } ) ) @@ -238,7 +231,7 @@ fun Password( @Composable fun TextFieldError(textError: String) { Row(modifier = Modifier.fillMaxWidth()) { - Spacer(modifier = Modifier.preferredWidth(16.dp)) + Spacer(modifier = Modifier.width(16.dp)) Text( text = textError, modifier = Modifier.fillMaxWidth(), @@ -257,7 +250,7 @@ fun OrSignInAsGuest( horizontalAlignment = Alignment.CenterHorizontally ) { Surface { - Providers(LocalContentAlpha provides ContentAlpha.medium) { + CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) { Text( text = stringResource(id = R.string.or), style = MaterialTheme.typography.subtitle2 diff --git a/Jetsurvey/app/src/main/java/com/example/compose/jetsurvey/signinsignup/SignUpScreen.kt b/Jetsurvey/app/src/main/java/com/example/compose/jetsurvey/signinsignup/SignUpScreen.kt index 77c91cf21f..f0a983d7aa 100644 --- a/Jetsurvey/app/src/main/java/com/example/compose/jetsurvey/signinsignup/SignUpScreen.kt +++ b/Jetsurvey/app/src/main/java/com/example/compose/jetsurvey/signinsignup/SignUpScreen.kt @@ -19,7 +19,7 @@ package com.example.compose.jetsurvey.signinsignup import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.preferredHeight +import androidx.compose.foundation.layout.height import androidx.compose.material.Button import androidx.compose.material.ContentAlpha import androidx.compose.material.LocalContentAlpha @@ -27,7 +27,7 @@ import androidx.compose.material.MaterialTheme import androidx.compose.material.Scaffold import androidx.compose.material.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.Providers +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusRequester @@ -55,7 +55,7 @@ fun SignUp(onNavigationEvent: (SignUpEvent) -> Unit) { onBackPressed = { onNavigationEvent(SignUpEvent.NavigateBack) } ) }, - bodyContent = { + content = { SignInSignUpScreen( onSignedInAsGuest = { onNavigationEvent(SignUpEvent.SignInAsGuest) }, modifier = Modifier.fillMaxWidth() @@ -82,7 +82,7 @@ fun SignUpContent( val emailState = remember { EmailState() } Email(emailState, onImeAction = { passwordFocusRequest.requestFocus() }) - Spacer(modifier = Modifier.preferredHeight(16.dp)) + Spacer(modifier = Modifier.height(16.dp)) val passwordState = remember { PasswordState() } Password( label = stringResource(id = R.string.password), @@ -92,7 +92,7 @@ fun SignUpContent( modifier = Modifier.focusRequester(passwordFocusRequest) ) - Spacer(modifier = Modifier.preferredHeight(16.dp)) + Spacer(modifier = Modifier.height(16.dp)) val confirmPasswordState = remember { ConfirmPasswordState(passwordState = passwordState) } Password( label = stringResource(id = R.string.confirm_password), @@ -101,15 +101,15 @@ fun SignUpContent( modifier = Modifier.focusRequester(confirmationPasswordFocusRequest) ) - Spacer(modifier = Modifier.preferredHeight(16.dp)) - Providers(LocalContentAlpha provides ContentAlpha.medium) { + Spacer(modifier = Modifier.height(16.dp)) + CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) { Text( text = stringResource(id = R.string.terms_and_conditions), style = MaterialTheme.typography.caption ) } - Spacer(modifier = Modifier.preferredHeight(16.dp)) + Spacer(modifier = Modifier.height(16.dp)) Button( onClick = { onSignUpSubmitted(emailState.text, passwordState.text) }, modifier = Modifier.fillMaxWidth(), diff --git a/Jetsurvey/app/src/main/java/com/example/compose/jetsurvey/signinsignup/WelcomeScreen.kt b/Jetsurvey/app/src/main/java/com/example/compose/jetsurvey/signinsignup/WelcomeScreen.kt index e5c8bfab91..c8334fe0b5 100644 --- a/Jetsurvey/app/src/main/java/com/example/compose/jetsurvey/signinsignup/WelcomeScreen.kt +++ b/Jetsurvey/app/src/main/java/com/example/compose/jetsurvey/signinsignup/WelcomeScreen.kt @@ -21,9 +21,9 @@ import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredHeight import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.material.Button import androidx.compose.material.ContentAlpha @@ -32,7 +32,7 @@ import androidx.compose.material.MaterialTheme import androidx.compose.material.Surface import androidx.compose.material.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.Providers +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -88,7 +88,7 @@ fun WelcomeScreen(onEvent: (WelcomeEvent) -> Unit) { .weight(1f) .onGloballyPositioned { if (brandingBottom == 0f) { - brandingBottom = it.boundsInParent.bottom + brandingBottom = it.boundsInParent().bottom } } ) @@ -110,7 +110,7 @@ private fun Modifier.brandingPreferredHeight( return if (!showBranding) { this .wrapContentHeight(unbounded = true) - .preferredHeight(heightDp) + .height(heightDp) } else { this } @@ -162,7 +162,7 @@ private fun SignInCreateAccount( ) { val emailState = remember { EmailState() } Column(modifier = modifier, horizontalAlignment = Alignment.CenterHorizontally) { - Providers(LocalContentAlpha provides ContentAlpha.medium) { + CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) { Text( text = stringResource(id = R.string.sign_in_create_account), style = MaterialTheme.typography.subtitle2, diff --git a/Jetsurvey/app/src/main/java/com/example/compose/jetsurvey/survey/SurveyQuestions.kt b/Jetsurvey/app/src/main/java/com/example/compose/jetsurvey/survey/SurveyQuestions.kt index fc56325ea4..667b0f8462 100644 --- a/Jetsurvey/app/src/main/java/com/example/compose/jetsurvey/survey/SurveyQuestions.kt +++ b/Jetsurvey/app/src/main/java/com/example/compose/jetsurvey/survey/SurveyQuestions.kt @@ -28,8 +28,8 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredHeight import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.foundation.lazy.LazyColumn @@ -51,7 +51,7 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.AddAPhoto import androidx.compose.material.icons.filled.SwapHoriz import androidx.compose.runtime.Composable -import androidx.compose.runtime.Providers +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -79,7 +79,7 @@ fun Question( contentPadding = PaddingValues(start = 20.dp, end = 20.dp) ) { item { - Spacer(modifier = Modifier.preferredHeight(44.dp)) + Spacer(modifier = Modifier.height(44.dp)) val backgroundColor = if (MaterialTheme.colors.isLight) { MaterialTheme.colors.onSurface.copy(alpha = 0.04f) } else { @@ -101,9 +101,9 @@ fun Question( .padding(vertical = 24.dp, horizontal = 16.dp) ) } - Spacer(modifier = Modifier.preferredHeight(24.dp)) + Spacer(modifier = Modifier.height(24.dp)) if (question.description != null) { - Providers(LocalContentAlpha provides ContentAlpha.medium) { + CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) { Text( text = stringResource(id = question.description), style = MaterialTheme.typography.caption, diff --git a/Jetsurvey/app/src/main/java/com/example/compose/jetsurvey/survey/SurveyScreen.kt b/Jetsurvey/app/src/main/java/com/example/compose/jetsurvey/survey/SurveyScreen.kt index 254c3b70e4..e30203d504 100644 --- a/Jetsurvey/app/src/main/java/com/example/compose/jetsurvey/survey/SurveyScreen.kt +++ b/Jetsurvey/app/src/main/java/com/example/compose/jetsurvey/survey/SurveyScreen.kt @@ -16,14 +16,14 @@ package com.example.compose.jetsurvey.survey -import androidx.compose.foundation.layout.ConstraintLayout -import androidx.compose.foundation.layout.ExperimentalLayout +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.preferredHeight import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.material.Button @@ -40,15 +40,18 @@ import androidx.compose.material.Text import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Close import androidx.compose.runtime.Composable -import androidx.compose.runtime.Providers +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.withStyle +import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.example.compose.jetsurvey.R +import com.example.compose.jetsurvey.theme.JetsurveyTheme import com.example.compose.jetsurvey.theme.progressIndicatorBackground @Composable @@ -71,7 +74,7 @@ fun SurveyQuestionsScreen( onBackPressed = onBackPressed ) }, - bodyContent = { innerPadding -> + content = { innerPadding -> Question( question = questionState.question, answer = questionState.answer, @@ -104,7 +107,7 @@ fun SurveyResultScreen( ) { Surface(modifier = Modifier.fillMaxSize()) { Scaffold( - bodyContent = { innerPadding -> + content = { innerPadding -> val modifier = Modifier.padding(innerPadding) SurveyResult(result = result, modifier = modifier) }, @@ -126,7 +129,7 @@ fun SurveyResultScreen( private fun SurveyResult(result: SurveyState.Result, modifier: Modifier = Modifier) { LazyColumn(modifier = modifier.fillMaxSize()) { item { - Spacer(modifier = Modifier.preferredHeight(44.dp)) + Spacer(modifier = Modifier.height(44.dp)) Text( text = result.surveyResult.library, style = MaterialTheme.typography.h3, @@ -174,43 +177,47 @@ private fun TopAppBarTitle( ) } -@Suppress("DEPRECATION") // ConstraintLayout -@OptIn(ExperimentalLayout::class) +@Preview +@Composable +fun TAPPreview() { + JetsurveyTheme { + SurveyTopAppBar(questionIndex = 3, totalQuestionsCount = 1, onBackPressed = { }) + } +} + @Composable private fun SurveyTopAppBar( questionIndex: Int, totalQuestionsCount: Int, onBackPressed: () -> Unit ) { - ConstraintLayout(modifier = Modifier.fillMaxWidth()) { - val (button, text, progress) = createRefs() - TopAppBarTitle( - questionIndex = questionIndex, - totalQuestionsCount = totalQuestionsCount, - modifier = Modifier - .padding(vertical = 20.dp) - .constrainAs(text) { centerHorizontallyTo(parent) } - ) - - Providers(LocalContentAlpha provides ContentAlpha.medium) { - IconButton( - onClick = onBackPressed, + Column(modifier = Modifier.fillMaxWidth()) { + Box(modifier = Modifier.fillMaxWidth()) { + TopAppBarTitle( + questionIndex = questionIndex, + totalQuestionsCount = totalQuestionsCount, modifier = Modifier - .padding(horizontal = 12.dp) - .constrainAs(button) { end.linkTo(parent.end) } - ) { - Icon(Icons.Filled.Close, contentDescription = stringResource(id = R.string.close)) + .padding(vertical = 20.dp) + .align(Alignment.Center) + ) + + CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) { + IconButton( + onClick = onBackPressed, + modifier = Modifier.padding(horizontal = 12.dp) + ) { + Icon( + Icons.Filled.Close, + contentDescription = stringResource(id = R.string.close) + ) + } } } - LinearProgressIndicator( progress = (questionIndex + 1) / totalQuestionsCount.toFloat(), modifier = Modifier .fillMaxWidth() - .padding(horizontal = 20.dp) - .constrainAs(progress) { - bottom.linkTo(text.bottom) - }, + .padding(horizontal = 20.dp), backgroundColor = MaterialTheme.colors.progressIndicatorBackground ) } diff --git a/Jetsurvey/build.gradle b/Jetsurvey/build.gradle index 2a4c4aabc2..ec0a8069d7 100644 --- a/Jetsurvey/build.gradle +++ b/Jetsurvey/build.gradle @@ -41,6 +41,7 @@ subprojects { if (Libs.AndroidX.Compose.version.endsWith('SNAPSHOT')) { maven { url Libs.AndroidX.Compose.snapshotUrl } } + maven { url 'https://oss.sonatype.org/content/repositories/snapshots' } } apply plugin: 'com.diffplug.spotless' @@ -71,4 +72,11 @@ subprojects { jvmTarget = "1.8" } } + configurations.configureEach { + resolutionStrategy.eachDependency { details -> + if (details.requested.group.startsWith('androidx.compose')) { + details.useVersion Libs.AndroidX.Compose.version + } + } + } } diff --git a/Jetsurvey/buildSrc/src/main/java/com/example/compose/jetsurvey/buildsrc/dependencies.kt b/Jetsurvey/buildSrc/src/main/java/com/example/compose/jetsurvey/buildsrc/dependencies.kt index d6fd18c9be..312522a214 100644 --- a/Jetsurvey/buildSrc/src/main/java/com/example/compose/jetsurvey/buildsrc/dependencies.kt +++ b/Jetsurvey/buildSrc/src/main/java/com/example/compose/jetsurvey/buildsrc/dependencies.kt @@ -21,7 +21,7 @@ object Versions { } object Libs { - const val androidGradlePlugin = "com.android.tools.build:gradle:7.0.0-alpha05" + const val androidGradlePlugin = "com.android.tools.build:gradle:7.0.0-alpha06" const val jdkDesugar = "com.android.tools:desugar_jdk_libs:1.0.9" const val junit = "junit:junit:4.13" @@ -29,7 +29,7 @@ object Libs { const val material = "com.google.android.material:material:1.1.0" object Accompanist { - private const val version = "0.5.1" + private const val version = "0.5.2.compose-7141639-SNAPSHOT" const val coil = "dev.chrisbanes.accompanist:accompanist-coil:$version" } @@ -58,12 +58,12 @@ object Libs { } object Activity { - const val activityCompose = "androidx.activity:activity-compose:1.3.0-alpha02" + const val activityCompose = "androidx.activity:activity-compose:1.3.0-SNAPSHOT" } object Compose { - const val snapshot = "" - const val version = "1.0.0-alpha12" + const val snapshot = "7141639" + const val version = "1.0.0-SNAPSHOT" @get:JvmStatic val snapshotUrl: String From 5ecde53624a37d4b592b70f6a1138b23e9dbac7d Mon Sep 17 00:00:00 2001 From: Florina Muntenescu Date: Sun, 21 Feb 2021 22:39:13 +0000 Subject: [PATCH 36/37] [Jetsurvey] Removing a preview and upgrading to 7154166 snapshot --- .../example/compose/jetsurvey/survey/SurveyScreen.kt | 10 ---------- Jetsurvey/build.gradle | 1 + .../example/compose/jetsurvey/buildsrc/dependencies.kt | 4 ++-- 3 files changed, 3 insertions(+), 12 deletions(-) diff --git a/Jetsurvey/app/src/main/java/com/example/compose/jetsurvey/survey/SurveyScreen.kt b/Jetsurvey/app/src/main/java/com/example/compose/jetsurvey/survey/SurveyScreen.kt index e30203d504..a1ee63e264 100644 --- a/Jetsurvey/app/src/main/java/com/example/compose/jetsurvey/survey/SurveyScreen.kt +++ b/Jetsurvey/app/src/main/java/com/example/compose/jetsurvey/survey/SurveyScreen.kt @@ -48,10 +48,8 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.withStyle -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.example.compose.jetsurvey.R -import com.example.compose.jetsurvey.theme.JetsurveyTheme import com.example.compose.jetsurvey.theme.progressIndicatorBackground @Composable @@ -177,14 +175,6 @@ private fun TopAppBarTitle( ) } -@Preview -@Composable -fun TAPPreview() { - JetsurveyTheme { - SurveyTopAppBar(questionIndex = 3, totalQuestionsCount = 1, onBackPressed = { }) - } -} - @Composable private fun SurveyTopAppBar( questionIndex: Int, diff --git a/Jetsurvey/build.gradle b/Jetsurvey/build.gradle index ec0a8069d7..bec687a807 100644 --- a/Jetsurvey/build.gradle +++ b/Jetsurvey/build.gradle @@ -72,6 +72,7 @@ subprojects { jvmTarget = "1.8" } } + // Forcing to use the snapshot version configurations.configureEach { resolutionStrategy.eachDependency { details -> if (details.requested.group.startsWith('androidx.compose')) { diff --git a/Jetsurvey/buildSrc/src/main/java/com/example/compose/jetsurvey/buildsrc/dependencies.kt b/Jetsurvey/buildSrc/src/main/java/com/example/compose/jetsurvey/buildsrc/dependencies.kt index 312522a214..615f10b16f 100644 --- a/Jetsurvey/buildSrc/src/main/java/com/example/compose/jetsurvey/buildsrc/dependencies.kt +++ b/Jetsurvey/buildSrc/src/main/java/com/example/compose/jetsurvey/buildsrc/dependencies.kt @@ -29,7 +29,7 @@ object Libs { const val material = "com.google.android.material:material:1.1.0" object Accompanist { - private const val version = "0.5.2.compose-7141639-SNAPSHOT" + private const val version = "0.5.2.compose-7154166-SNAPSHOT" const val coil = "dev.chrisbanes.accompanist:accompanist-coil:$version" } @@ -62,7 +62,7 @@ object Libs { } object Compose { - const val snapshot = "7141639" + const val snapshot = "7154166" const val version = "1.0.0-SNAPSHOT" @get:JvmStatic From d3af51271f81e86cc76de00eeeef3a9d612ff038 Mon Sep 17 00:00:00 2001 From: Florina Muntenescu Date: Tue, 23 Feb 2021 15:26:04 +0000 Subject: [PATCH 37/37] [All] Update to beta01 --- .../com/example/crane/buildsrc/Dependencies.kt | 12 ++++++------ JetNews/app/build.gradle | 4 ++-- JetNews/build.gradle | 8 ++------ .../com/example/jetcaster/buildsrc/dependencies.kt | 14 +++++++------- .../compose/jetchat/buildsrc/dependencies.kt | 12 ++++++------ Jetsnack/build.gradle | 1 + .../com/example/jetsnack/buildsrc/Dependencies.kt | 14 +++++++------- .../compose/jetsurvey/buildsrc/dependencies.kt | 12 ++++++------ .../java/com/example/owl/buildsrc/Dependencies.kt | 14 +++++++------- .../example/compose/rally/buildsrc/dependencies.kt | 8 ++++---- 10 files changed, 48 insertions(+), 51 deletions(-) diff --git a/Crane/buildSrc/src/main/java/com/example/crane/buildsrc/Dependencies.kt b/Crane/buildSrc/src/main/java/com/example/crane/buildsrc/Dependencies.kt index 2dff85e066..a45ba29420 100644 --- a/Crane/buildSrc/src/main/java/com/example/crane/buildsrc/Dependencies.kt +++ b/Crane/buildSrc/src/main/java/com/example/crane/buildsrc/Dependencies.kt @@ -21,7 +21,7 @@ object Versions { } object Libs { - const val androidGradlePlugin = "com.android.tools.build:gradle:7.0.0-alpha06" + const val androidGradlePlugin = "com.android.tools.build:gradle:7.0.0-alpha08" const val ktLint = "com.pinterest:ktlint:${Versions.ktLint}" object GoogleMaps { @@ -30,7 +30,7 @@ object Libs { } object Accompanist { - private const val version = "0.5.2.compose-7141639-SNAPSHOT" + private const val version = "0.6.0" const val coil = "dev.chrisbanes.accompanist:accompanist-coil:$version" } @@ -49,12 +49,12 @@ object Libs { object AndroidX { object Activity { - const val activityCompose = "androidx.activity:activity-compose:1.3.0-SNAPSHOT" + const val activityCompose = "androidx.activity:activity-compose:1.3.0-alpha03" } object Compose { - const val snapshot = "7141639" - private const val version = "1.0.0-SNAPSHOT" + const val snapshot = "" + private const val version = "1.0.0-beta01" const val runtime = "androidx.compose.runtime:runtime:$version" const val runtimeLivedata = "androidx.compose.runtime:runtime-livedata:$version" @@ -68,7 +68,7 @@ object Libs { object Lifecycle { private const val version = "2.3.0" - const val viewModelCompose = "androidx.lifecycle:lifecycle-viewmodel-compose:1.0.0-SNAPSHOT" + const val viewModelCompose = "androidx.lifecycle:lifecycle-viewmodel-compose:1.0.0-alpha02" const val viewModelKtx = "androidx.lifecycle:lifecycle-viewmodel-ktx:$version" } diff --git a/JetNews/app/build.gradle b/JetNews/app/build.gradle index 7c2e070eff..b548e30698 100644 --- a/JetNews/app/build.gradle +++ b/JetNews/app/build.gradle @@ -93,11 +93,11 @@ dependencies { implementation 'androidx.appcompat:appcompat:1.3.0-beta01' implementation 'androidx.activity:activity-ktx:1.2.0' implementation 'androidx.core:core-ktx:1.5.0-beta01' - implementation "androidx.activity:activity-compose:1.3.0-SNAPSHOT" + implementation "androidx.activity:activity-compose:1.3.0-alpha03" implementation "androidx.lifecycle:lifecycle-viewmodel-savedstate:2.3.0" implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.0" - implementation "androidx.lifecycle:lifecycle-viewmodel-compose:1.0.0-SNAPSHOT" + implementation "androidx.lifecycle:lifecycle-viewmodel-compose:1.0.0-alpha02" androidTestImplementation 'androidx.test:rules:1.3.0' androidTestImplementation 'androidx.test:runner:1.3.0' diff --git a/JetNews/build.gradle b/JetNews/build.gradle index 9dedc23814..e080968c50 100644 --- a/JetNews/build.gradle +++ b/JetNews/build.gradle @@ -16,7 +16,7 @@ buildscript { ext.kotlin_version = '1.4.30' - ext.compose_version = '1.0.0-SNAPSHOT' + ext.compose_version = '1.0.0-beta01' ext.coroutines_version = '1.4.2' repositories { @@ -25,7 +25,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:7.0.0-alpha06' + classpath 'com.android.tools.build:gradle:7.0.0-alpha08' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } @@ -36,10 +36,6 @@ plugins { subprojects { repositories { - maven { - def snapshot = "7141639" - url "https://androidx.dev/snapshots/builds/$snapshot/artifacts/repository/" - } google() jcenter() } diff --git a/Jetcaster/buildSrc/src/main/java/com/example/jetcaster/buildsrc/dependencies.kt b/Jetcaster/buildSrc/src/main/java/com/example/jetcaster/buildsrc/dependencies.kt index a882ddc510..c14c062317 100644 --- a/Jetcaster/buildSrc/src/main/java/com/example/jetcaster/buildsrc/dependencies.kt +++ b/Jetcaster/buildSrc/src/main/java/com/example/jetcaster/buildsrc/dependencies.kt @@ -21,13 +21,13 @@ object Versions { } object Libs { - const val androidGradlePlugin = "com.android.tools.build:gradle:7.0.0-alpha06" + const val androidGradlePlugin = "com.android.tools.build:gradle:7.0.0-alpha08" const val jdkDesugar = "com.android.tools:desugar_jdk_libs:1.0.9" const val material = "com.google.android.material:material:1.1.0" object Accompanist { - private const val version = "0.5.2.compose-7141639-SNAPSHOT" + private const val version = "0.6.0" const val coil = "dev.chrisbanes.accompanist:accompanist-coil:$version" const val insets = "dev.chrisbanes.accompanist:accompanist-insets:$version" } @@ -64,16 +64,16 @@ object Libs { const val coreKtx = "androidx.core:core-ktx:1.5.0-beta01" object Activity { - const val activityCompose = "androidx.activity:activity-compose:1.3.0-SNAPSHOT" + const val activityCompose = "androidx.activity:activity-compose:1.3.0-alpha03" } object Constraint { - const val constraintLayoutCompose = "androidx.constraintlayout:constraintlayout-compose:1.0.0-SNAPSHOT" + const val constraintLayoutCompose = "androidx.constraintlayout:constraintlayout-compose:1.0.0-alpha03" } object Compose { - private const val snapshot = "7141639" - private const val version = "1.0.0-SNAPSHOT" + private const val snapshot = "" + private const val version = "1.0.0-beta01" @get:JvmStatic val snapshotUrl: String @@ -92,7 +92,7 @@ object Libs { object Lifecycle { private const val version = "2.3.0-beta01" - const val viewModelCompose = "androidx.lifecycle:lifecycle-viewmodel-compose:1.0.0-SNAPSHOT" + const val viewModelCompose = "androidx.lifecycle:lifecycle-viewmodel-compose:1.0.0-alpha02" const val viewmodel = "androidx.lifecycle:lifecycle-viewmodel-ktx:$version" } diff --git a/Jetchat/buildSrc/src/main/java/com/example/compose/jetchat/buildsrc/dependencies.kt b/Jetchat/buildSrc/src/main/java/com/example/compose/jetchat/buildsrc/dependencies.kt index 6b33ffa3b8..71ec0ec6ad 100644 --- a/Jetchat/buildSrc/src/main/java/com/example/compose/jetchat/buildsrc/dependencies.kt +++ b/Jetchat/buildSrc/src/main/java/com/example/compose/jetchat/buildsrc/dependencies.kt @@ -21,7 +21,7 @@ object Versions { } object Libs { - const val androidGradlePlugin = "com.android.tools.build:gradle:7.0.0-alpha06" + const val androidGradlePlugin = "com.android.tools.build:gradle:7.0.0-alpha08" const val jdkDesugar = "com.android.tools:desugar_jdk_libs:1.0.9" const val junit = "junit:junit:4.13" @@ -43,7 +43,7 @@ object Libs { } object Accompanist { - private const val version = "0.5.2.compose-7154166-SNAPSHOT" + private const val version = "0.6.0" const val insets = "dev.chrisbanes.accompanist:accompanist-insets:$version" } @@ -52,12 +52,12 @@ object Libs { const val coreKtx = "androidx.core:core-ktx:1.5.0-beta01" object Activity { - const val activityCompose = "androidx.activity:activity-compose:1.3.0-SNAPSHOT" + const val activityCompose = "androidx.activity:activity-compose:1.3.0-alpha03" } object Compose { - const val snapshot = "7154166" - const val version = "1.0.0-SNAPSHOT" + const val snapshot = "" + const val version = "1.0.0-beta01" const val foundation = "androidx.compose.foundation:foundation:$version" const val layout = "androidx.compose.foundation:foundation-layout:$version" @@ -96,7 +96,7 @@ object Libs { const val extensions = "androidx.lifecycle:lifecycle-extensions:$version" const val livedata = "androidx.lifecycle:lifecycle-livedata-ktx:$version" const val viewmodel = "androidx.lifecycle:lifecycle-viewmodel-ktx:$version" - const val viewModelCompose = "androidx.lifecycle:lifecycle-viewmodel-compose:1.0.0-SNAPSHOT" + const val viewModelCompose = "androidx.lifecycle:lifecycle-viewmodel-compose:1.0.0-alpha02" } } } diff --git a/Jetsnack/build.gradle b/Jetsnack/build.gradle index 08b130f99a..395d7653c2 100644 --- a/Jetsnack/build.gradle +++ b/Jetsnack/build.gradle @@ -35,6 +35,7 @@ plugins { subprojects { repositories { google() + mavenCentral() jcenter() if (!Libs.AndroidX.Compose.snapshot.isEmpty()) { diff --git a/Jetsnack/buildSrc/src/main/java/com/example/jetsnack/buildsrc/Dependencies.kt b/Jetsnack/buildSrc/src/main/java/com/example/jetsnack/buildsrc/Dependencies.kt index 23dc12ea58..7d5f850c0d 100644 --- a/Jetsnack/buildSrc/src/main/java/com/example/jetsnack/buildsrc/Dependencies.kt +++ b/Jetsnack/buildSrc/src/main/java/com/example/jetsnack/buildsrc/Dependencies.kt @@ -21,10 +21,10 @@ object Versions { } object Libs { - const val androidGradlePlugin = "com.android.tools.build:gradle:7.0.0-alpha06" + const val androidGradlePlugin = "com.android.tools.build:gradle:7.0.0-alpha08" object Accompanist { - private const val version = "0.5.2.compose-7141639-SNAPSHOT" + private const val version = "0.6.0" const val coil = "dev.chrisbanes.accompanist:accompanist-coil:$version" const val insets = "dev.chrisbanes.accompanist:accompanist-insets:$version" } @@ -47,8 +47,8 @@ object Libs { const val coreKtx = "androidx.core:core-ktx:1.5.0-beta01" object Compose { - const val snapshot = "7141639" - const val version = "1.0.0-SNAPSHOT" + const val snapshot = "" + const val version = "1.0.0-beta01" const val foundation = "androidx.compose.foundation:foundation:${version}" const val layout = "androidx.compose.foundation:foundation-layout:${version}" @@ -62,17 +62,17 @@ object Libs { } object Activity { - const val activityCompose = "androidx.activity:activity-compose:1.3.0-SNAPSHOT" + const val activityCompose = "androidx.activity:activity-compose:1.3.0-alpha03" } object Lifecycle { const val viewModelCompose = - "androidx.lifecycle:lifecycle-viewmodel-compose:1.0.0-SNAPSHOT" + "androidx.lifecycle:lifecycle-viewmodel-compose:1.0.0-alpha02" } object ConstraintLayout { const val constraintLayoutCompose = - "androidx.constraintlayout:constraintlayout-compose:1.0.0-SNAPSHOT" + "androidx.constraintlayout:constraintlayout-compose:1.0.0-alpha03" } } } diff --git a/Jetsurvey/buildSrc/src/main/java/com/example/compose/jetsurvey/buildsrc/dependencies.kt b/Jetsurvey/buildSrc/src/main/java/com/example/compose/jetsurvey/buildsrc/dependencies.kt index 615f10b16f..7bd47e016f 100644 --- a/Jetsurvey/buildSrc/src/main/java/com/example/compose/jetsurvey/buildsrc/dependencies.kt +++ b/Jetsurvey/buildSrc/src/main/java/com/example/compose/jetsurvey/buildsrc/dependencies.kt @@ -21,7 +21,7 @@ object Versions { } object Libs { - const val androidGradlePlugin = "com.android.tools.build:gradle:7.0.0-alpha06" + const val androidGradlePlugin = "com.android.tools.build:gradle:7.0.0-alpha08" const val jdkDesugar = "com.android.tools:desugar_jdk_libs:1.0.9" const val junit = "junit:junit:4.13" @@ -29,7 +29,7 @@ object Libs { const val material = "com.google.android.material:material:1.1.0" object Accompanist { - private const val version = "0.5.2.compose-7154166-SNAPSHOT" + private const val version = "0.6.0" const val coil = "dev.chrisbanes.accompanist:accompanist-coil:$version" } @@ -53,17 +53,17 @@ object Libs { object Lifecycle { private const val version = "2.3.0-beta01" - const val viewModelCompose = "androidx.lifecycle:lifecycle-viewmodel-compose:1.0.0-alpha01" + const val viewModelCompose = "androidx.lifecycle:lifecycle-viewmodel-compose:1.0.0-alpha02" const val viewmodel = "androidx.lifecycle:lifecycle-viewmodel-ktx:$version" } object Activity { - const val activityCompose = "androidx.activity:activity-compose:1.3.0-SNAPSHOT" + const val activityCompose = "androidx.activity:activity-compose:1.3.0-alpha03" } object Compose { - const val snapshot = "7154166" - const val version = "1.0.0-SNAPSHOT" + const val snapshot = "" + const val version = "1.0.0-beta01" @get:JvmStatic val snapshotUrl: String diff --git a/Owl/buildSrc/src/main/java/com/example/owl/buildsrc/Dependencies.kt b/Owl/buildSrc/src/main/java/com/example/owl/buildsrc/Dependencies.kt index a746bf35f1..2c91db9678 100644 --- a/Owl/buildSrc/src/main/java/com/example/owl/buildsrc/Dependencies.kt +++ b/Owl/buildSrc/src/main/java/com/example/owl/buildsrc/Dependencies.kt @@ -21,10 +21,10 @@ object Versions { } object Libs { - const val androidGradlePlugin = "com.android.tools.build:gradle:7.0.0-alpha07" + const val androidGradlePlugin = "com.android.tools.build:gradle:7.0.0-alpha08" object Accompanist { - private const val version = "0.5.2.compose-7154166-SNAPSHOT" + private const val version = "0.6.0" const val coil = "dev.chrisbanes.accompanist:accompanist-coil:$version" const val insets = "dev.chrisbanes.accompanist:accompanist-insets:$version" } @@ -50,11 +50,11 @@ object Libs { object AndroidX { const val coreKtx = "androidx.core:core-ktx:1.5.0-beta01" - const val navigation = "androidx.navigation:navigation-compose:1.0.0-SNAPSHOT" + const val navigation = "androidx.navigation:navigation-compose:1.0.0-alpha08" object Compose { - const val snapshot = "7154166" - const val version = "1.0.0-SNAPSHOT" + const val snapshot = "" + const val version = "1.0.0-beta01" const val animation = "androidx.compose.animation:animation:$version" const val foundation = "androidx.compose.foundation:foundation:$version" @@ -69,12 +69,12 @@ object Libs { } object Activity { - const val activityCompose = "androidx.activity:activity-compose:1.3.0-SNAPSHOT" + const val activityCompose = "androidx.activity:activity-compose:1.3.0-alpha03" } object ConstraintLayout { const val constraintLayoutCompose = - "androidx.constraintlayout:constraintlayout-compose:1.0.0-SNAPSHOT" + "androidx.constraintlayout:constraintlayout-compose:1.0.0-alpha03" } object Test { diff --git a/Rally/buildSrc/src/main/java/com/example/compose/rally/buildsrc/dependencies.kt b/Rally/buildSrc/src/main/java/com/example/compose/rally/buildsrc/dependencies.kt index 10cae51879..eb34d48ba7 100644 --- a/Rally/buildSrc/src/main/java/com/example/compose/rally/buildsrc/dependencies.kt +++ b/Rally/buildSrc/src/main/java/com/example/compose/rally/buildsrc/dependencies.kt @@ -21,7 +21,7 @@ object Versions { } object Libs { - const val androidGradlePlugin = "com.android.tools.build:gradle:7.0.0-alpha06" + const val androidGradlePlugin = "com.android.tools.build:gradle:7.0.0-alpha08" const val jdkDesugar = "com.android.tools:desugar_jdk_libs:1.0.9" const val material = "com.google.android.material:material:1.1.0" @@ -45,12 +45,12 @@ object Libs { const val coreKtx = "androidx.core:core-ktx:1.5.0-alpha02" object Activity { - const val activityCompose = "androidx.activity:activity-compose:1.3.0-SNAPSHOT" + const val activityCompose = "androidx.activity:activity-compose:1.3.0-alpha03" } object Compose { - const val snapshot = "7141639" - const val version = "1.0.0-SNAPSHOT" + const val snapshot = "" + const val version = "1.0.0-beta01" const val core = "androidx.compose.ui:ui:$version" const val foundation = "androidx.compose.foundation:foundation:$version"