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 ff857b1645..cc6b3e8a5f 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 @@ -25,7 +25,7 @@ import androidx.compose.runtime.savedinstancestate.rememberSavedInstanceState import com.example.owl.ui.course.CourseDetails import com.example.owl.ui.courses.Courses import com.example.owl.ui.onboarding.Onboarding -import com.example.owl.ui.utils.BackDispatcherAmbient +import com.example.owl.ui.utils.AmbientBackDispatcher import com.example.owl.ui.utils.Navigator import com.example.owl.ui.utils.ProvideDisplayInsets import com.example.owl.ui.utils.ProvideImageLoader @@ -40,7 +40,7 @@ fun OwlApp(backDispatcher: OnBackPressedDispatcher) { } val actions = remember(navigator) { Actions(navigator) } - Providers(BackDispatcherAmbient provides backDispatcher) { + Providers(AmbientBackDispatcher provides backDispatcher) { ProvideDisplayInsets { ProvideImageLoader { Crossfade(navigator.current) { destination -> 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 e6ab69fdf8..7a74b9ef2f 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 @@ -26,6 +26,7 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.preferredHeight import androidx.compose.foundation.layout.preferredSize +import androidx.compose.foundation.layout.wrapContentWidth import androidx.compose.foundation.shape.CircleShape import androidx.compose.material.MaterialTheme import androidx.compose.material.Surface @@ -104,6 +105,7 @@ fun CourseListItem( modifier = Modifier .padding(start = 8.dp) .weight(1f) + .wrapContentWidth(Alignment.Start) ) NetworkImage( url = course.instructor, 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 344a4be44c..43291465b8 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 @@ -37,8 +37,8 @@ import androidx.compose.foundation.layout.preferredHeight import androidx.compose.foundation.layout.preferredSize import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.AmbientEmphasisLevels import androidx.compose.material.Divider -import androidx.compose.material.EmphasisAmbient import androidx.compose.material.ExperimentalMaterialApi import androidx.compose.material.FractionalThreshold import androidx.compose.material.IconButton @@ -81,7 +81,7 @@ import com.example.owl.ui.common.OutlinedAvatar import com.example.owl.ui.theme.BlueTheme import com.example.owl.ui.theme.PinkTheme import com.example.owl.ui.theme.pink500 -import com.example.owl.ui.utils.InsetsAmbient +import com.example.owl.ui.utils.AmbientInsets import com.example.owl.ui.utils.NetworkImage import com.example.owl.ui.utils.backHandler import com.example.owl.ui.utils.lerp @@ -227,7 +227,7 @@ private fun CourseDescriptionBody(course: Course) { .padding(horizontal = 16.dp) ) Spacer(modifier = Modifier.preferredHeight(16.dp)) - ProvideEmphasis(EmphasisAmbient.current.medium) { + ProvideEmphasis(AmbientEmphasisLevels.current.medium) { Text( text = stringResource(id = R.string.course_desc), style = MaterialTheme.typography.body1, @@ -246,7 +246,7 @@ private fun CourseDescriptionBody(course: Course) { .fillMaxWidth() .padding(16.dp) ) - ProvideEmphasis(EmphasisAmbient.current.medium) { + ProvideEmphasis(AmbientEmphasisLevels.current.medium) { Text( text = stringResource(id = R.string.needs), style = MaterialTheme.typography.body1, @@ -320,7 +320,7 @@ private fun LessonsSheet( ) { // Use the fraction that the sheet is open to drive the transformation from FAB -> Sheet val fabSize = with(DensityAmbient.current) { FabSize.toPx() } - val fabSheetHeight = fabSize + InsetsAmbient.current.systemBars.bottom + val fabSheetHeight = fabSize + AmbientInsets.current.systemBars.bottom val offsetX = lerp(width - fabSize, 0f, 0f, 0.15f, openFraction) val offsetY = lerp(height - fabSheetHeight, 0f, openFraction) val tlCorner = lerp(fabSize, 0f, 0f, 0.15f, openFraction) @@ -388,7 +388,7 @@ private fun Lessons( } ScrollableColumn( scrollState = scroll, - contentPadding = InsetsAmbient.current.systemBars.toPaddingValues( + contentPadding = AmbientInsets.current.systemBars.toPaddingValues( top = false ) ) { @@ -442,7 +442,7 @@ private fun Lesson(lesson: Lesson) { maxLines = 2, overflow = TextOverflow.Ellipsis ) - ProvideEmphasis(EmphasisAmbient.current.medium) { + ProvideEmphasis(AmbientEmphasisLevels.current.medium) { Row( modifier = Modifier.padding(top = 4.dp), verticalAlignment = Alignment.CenterVertically 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 f4dbd3ae4b..d1786663e6 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 @@ -18,10 +18,10 @@ package com.example.owl.ui.courses import androidx.annotation.DrawableRes import androidx.annotation.StringRes +import androidx.compose.foundation.AmbientContentColor import androidx.compose.foundation.Icon import androidx.compose.foundation.Image import androidx.compose.foundation.Text -import androidx.compose.foundation.contentColor import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.preferredHeight import androidx.compose.material.BottomNavigation @@ -67,7 +67,7 @@ fun Courses(selectCourse: (Long) -> Unit) { onClick = { setSelectedTab(tab) }, alwaysShowLabels = false, selectedContentColor = MaterialTheme.colors.secondary, - unselectedContentColor = contentColor(), + unselectedContentColor = AmbientContentColor.current, modifier = Modifier.navigationBarsPadding() ) } 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 b1341298ca..f816e6ef47 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 @@ -16,13 +16,13 @@ package com.example.owl.ui.courses -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.preferredWidth -import androidx.compose.foundation.lazy.LazyColumnFor +import androidx.compose.foundation.lazy.ExperimentalLazyDsl +import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier @@ -32,19 +32,24 @@ import com.example.owl.model.Course import com.example.owl.model.courses import com.example.owl.ui.common.CourseListItem import com.example.owl.ui.theme.BlueTheme -import com.example.owl.ui.utils.statusBarsPadding +import com.example.owl.ui.utils.statusBarsHeight +@OptIn(ExperimentalLazyDsl::class) @Composable fun MyCourses( courses: List, selectCourse: (Long) -> Unit, modifier: Modifier = Modifier ) { - Column(modifier = modifier.statusBarsPadding()) { - // TODO appbar should scroll out - CoursesAppBar() - LazyColumnFor(courses) { course -> - MyCourse(course, selectCourse) + LazyColumn(modifier) { + item { + Spacer(Modifier.statusBarsHeight()) + } + item { + CoursesAppBar() + } + itemsIndexed(courses) { index, course -> + MyCourse(course, index, selectCourse) } } } @@ -52,10 +57,11 @@ fun MyCourses( @Composable fun MyCourse( course: Course, + index: Int, selectCourse: (Long) -> Unit ) { Row(modifier = Modifier.padding(bottom = 8.dp)) { - val stagger = if (course.id % 2L == 0L) 72.dp else 16.dp + val stagger = if (index % 2 == 0) 72.dp else 16.dp Spacer(modifier = Modifier.preferredWidth(stagger)) CourseListItem( course = course, 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 89723bf28c..74d2ea3b40 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 @@ -25,6 +25,7 @@ import androidx.compose.foundation.Text import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.wrapContentWidth import androidx.compose.material.IconButton import androidx.compose.material.MaterialTheme import androidx.compose.material.TopAppBar @@ -67,6 +68,7 @@ fun SearchCourses( end = 16.dp, bottom = 8.dp ) + .wrapContentWidth(Alignment.Start) ) } } 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 d444c03a79..f1ecdb78a0 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 @@ -38,7 +38,7 @@ import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.selection.toggleable import androidx.compose.foundation.shape.CornerSize -import androidx.compose.material.EmphasisAmbient +import androidx.compose.material.AmbientEmphasisLevels import androidx.compose.material.FloatingActionButton import androidx.compose.material.IconButton import androidx.compose.material.MaterialTheme @@ -94,7 +94,7 @@ fun Onboarding(onboardingComplete: () -> Unit) { .navigationBarsPadding() .padding(innerPadding) ) { - ProvideEmphasis(EmphasisAmbient.current.high) { + ProvideEmphasis(AmbientEmphasisLevels.current.high) { Text( text = stringResource(R.string.choose_topics_that_interest_you), style = MaterialTheme.typography.h4, @@ -129,7 +129,7 @@ private fun AppBar() { asset = vectorResource(id = OwlTheme.images.lockupLogo), modifier = Modifier.padding(16.dp) ) - ProvideEmphasis(emphasis = EmphasisAmbient.current.high) { + ProvideEmphasis(emphasis = AmbientEmphasisLevels.current.high) { IconButton( modifier = Modifier.padding(16.dp), onClick = { /* todo */ } @@ -221,7 +221,7 @@ private fun TopicChip(topic: Topic) { ) ) Row(verticalAlignment = Alignment.CenterVertically) { - ProvideEmphasis(emphasis = EmphasisAmbient.current.medium) { + ProvideEmphasis(emphasis = AmbientEmphasisLevels.current.medium) { Icon( asset = vectorResource(R.drawable.ic_grain), modifier = Modifier diff --git a/Owl/app/src/main/java/com/example/owl/ui/theme/Elevation.kt b/Owl/app/src/main/java/com/example/owl/ui/theme/Elevations.kt similarity index 88% rename from Owl/app/src/main/java/com/example/owl/ui/theme/Elevation.kt rename to Owl/app/src/main/java/com/example/owl/ui/theme/Elevations.kt index 4c141a1004..c82d8399b2 100644 --- a/Owl/app/src/main/java/com/example/owl/ui/theme/Elevation.kt +++ b/Owl/app/src/main/java/com/example/owl/ui/theme/Elevations.kt @@ -25,6 +25,6 @@ import androidx.compose.ui.unit.dp * Elevation values that can be themed. */ @Immutable -data class Elevation(val card: Dp = 0.dp) +data class Elevations(val card: Dp = 0.dp) -internal val ElevationAmbient = staticAmbientOf { Elevation() } +internal val AmbientElevations = staticAmbientOf { Elevations() } 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 a88afff8a2..2d7596f9a2 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,4 @@ import androidx.compose.runtime.staticAmbientOf @Immutable data class Images(@DrawableRes val lockupLogo: Int) -internal val ImageAmbient = staticAmbientOf() +internal val AmbientImages = staticAmbientOf() 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 f893c1b3c4..4705cc7cbf 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 @@ -110,9 +110,9 @@ fun PinkTheme( OwlTheme(darkTheme, colors, content) } -private val LightElevation = Elevation() +private val LightElevation = Elevations() -private val DarkElevation = Elevation(card = 1.dp) +private val DarkElevation = Elevations(card = 1.dp) private val LightImages = Images(lockupLogo = R.drawable.ic_lockup_blue) @@ -127,8 +127,8 @@ private fun OwlTheme( val elevation = if (darkTheme) DarkElevation else LightElevation val images = if (darkTheme) DarkImages else LightImages Providers( - ElevationAmbient provides elevation, - ImageAmbient provides images + AmbientElevations provides elevation, + AmbientImages provides images ) { MaterialTheme( colors = colors, @@ -140,7 +140,7 @@ private fun OwlTheme( } /** - * Alternate to [MaterialTheme] allowing us to add our own theme systems (e.g. [Elevation]) or to + * Alternate to [MaterialTheme] allowing us to add our own theme systems (e.g. [Elevations]) or to * extend [MaterialTheme]'s types e.g. return our own [Colors] extension */ object OwlTheme { @@ -167,16 +167,16 @@ object OwlTheme { get() = MaterialTheme.shapes /** - * Retrieves the current [Elevation] at the call site's position in the hierarchy. + * Retrieves the current [Elevations] at the call site's position in the hierarchy. */ @Composable - val elevations: Elevation - get() = ElevationAmbient.current + val elevations: Elevations + get() = AmbientElevations.current /** * Retrieves the current [Images] at the call site's position in the hierarchy. */ @Composable val images: Images - get() = ImageAmbient.current + get() = AmbientImages.current } diff --git a/Owl/app/src/main/java/com/example/owl/ui/utils/Insets.kt b/Owl/app/src/main/java/com/example/owl/ui/utils/Insets.kt index b2793b4f37..81f232fd35 100644 --- a/Owl/app/src/main/java/com/example/owl/ui/utils/Insets.kt +++ b/Owl/app/src/main/java/com/example/owl/ui/utils/Insets.kt @@ -118,10 +118,10 @@ class Insets { internal set } -val InsetsAmbient = staticAmbientOf { DisplayInsets() } +val AmbientInsets = staticAmbientOf { DisplayInsets() } /** - * Applies any [WindowInsetsCompat] values to [InsetsAmbient], which are then available + * Applies any [WindowInsetsCompat] values to [AmbientInsets], which are then available * within [content]. * * @param consumeWindowInsets Whether to consume any [WindowInsetsCompat]s which are dispatched to @@ -165,7 +165,7 @@ fun ProvideDisplayInsets( } } - Providers(InsetsAmbient provides displayInsets) { + Providers(AmbientInsets provides displayInsets) { content() } } @@ -192,7 +192,7 @@ private fun Insets.updateFrom(windowInsets: WindowInsetsCompat, type: Int) { */ fun Modifier.systemBarsPadding(enabled: Boolean = true) = composed { insetsPadding( - insets = InsetsAmbient.current.systemBars, + insets = AmbientInsets.current.systemBars, left = enabled, top = enabled, right = enabled, @@ -205,7 +205,7 @@ fun Modifier.systemBarsPadding(enabled: Boolean = true) = composed { * of the content. */ fun Modifier.statusBarsPadding() = composed { - insetsPadding(insets = InsetsAmbient.current.statusBars, top = true) + insetsPadding(insets = AmbientInsets.current.statusBars, top = true) } /** @@ -226,7 +226,7 @@ fun Modifier.navigationBarsPadding( right: Boolean = true ) = composed { insetsPadding( - insets = InsetsAmbient.current.navigationBars, + insets = AmbientInsets.current.navigationBars, left = left, right = right, bottom = bottom @@ -260,7 +260,7 @@ fun Modifier.navigationBarsPadding( */ fun Modifier.statusBarsHeight(additional: Dp = 0.dp) = composed { InsetsSizeModifier( - insets = InsetsAmbient.current.statusBars, + insets = AmbientInsets.current.statusBars, heightSide = VerticalSide.Top, additionalHeight = additional ) @@ -312,7 +312,7 @@ inline fun Modifier.statusBarsHeight() = statusBarsHeightPlus(0.dp) */ fun Modifier.statusBarsHeightPlus(additional: Dp) = composed { InsetsSizeModifier( - insets = InsetsAmbient.current.statusBars, + insets = AmbientInsets.current.statusBars, heightSide = VerticalSide.Top, additionalHeight = additional ) @@ -364,7 +364,7 @@ inline fun Modifier.navigationBarsHeight() = navigationBarsHeightPlus(0.dp) */ fun Modifier.navigationBarsHeightPlus(additional: Dp) = composed { InsetsSizeModifier( - insets = InsetsAmbient.current.navigationBars, + insets = AmbientInsets.current.navigationBars, heightSide = VerticalSide.Bottom, additionalHeight = additional ) @@ -418,7 +418,7 @@ fun Modifier.navigationBarsWidthPlus( additional: Dp ) = composed { InsetsSizeModifier( - insets = InsetsAmbient.current.navigationBars, + insets = AmbientInsets.current.navigationBars, widthSide = side, additionalWidth = additional ) diff --git a/Owl/app/src/main/java/com/example/owl/ui/utils/Navigation.kt b/Owl/app/src/main/java/com/example/owl/ui/utils/Navigation.kt index 3fe95907f9..44234e20a9 100644 --- a/Owl/app/src/main/java/com/example/owl/ui/utils/Navigation.kt +++ b/Owl/app/src/main/java/com/example/owl/ui/utils/Navigation.kt @@ -91,7 +91,7 @@ fun backHandler( backCallback.isEnabled = enabled } - val dispatcher = BackDispatcherAmbient.current + val dispatcher = AmbientBackDispatcher.current onCommit(backCallback) { dispatcher.addCallback(backCallback) onDispose { @@ -104,6 +104,6 @@ fun backHandler( * An [androidx.compose.runtime.Ambient] providing the current [OnBackPressedDispatcher]. You must * [provide][androidx.compose.runtime.Providers] a value before use. */ -internal val BackDispatcherAmbient = staticAmbientOf { +internal val AmbientBackDispatcher = staticAmbientOf { error("No Back Dispatcher provided") } 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 894dffbdd3..5d9ee0ef2e 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 @@ -51,7 +51,7 @@ fun NetworkImage( data = url, modifier = modifier, contentScale = contentScale, - imageLoader = ImageLoaderAmbient.current, + imageLoader = AmbientImageLoader.current, loading = { if (placeholderColor != null) { Spacer( @@ -64,7 +64,7 @@ fun NetworkImage( ) } -private val ImageLoaderAmbient = staticAmbientOf { +private val AmbientImageLoader = staticAmbientOf { error("No loader provided") } @@ -77,7 +77,7 @@ fun ProvideImageLoader(content: @Composable () -> Unit) { add(UnsplashSizingInterceptor) }.build() } - Providers(ImageLoaderAmbient provides loader, children = content) + Providers(AmbientImageLoader provides loader, children = content) } /** 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 0357ef70fc..f10d87c393 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 @@ -25,7 +25,7 @@ object Libs { const val junit = "junit:junit:4.13" object Accompanist { - private const val version = "0.3.0" + private const val version = "0.3.1.compose-6901934-SNAPSHOT" const val coil = "dev.chrisbanes.accompanist:accompanist-coil:$version" } @@ -47,8 +47,8 @@ object Libs { const val coreKtx = "androidx.core:core-ktx:1.5.0-alpha02" object Compose { - const val snapshot = "" - const val version = "1.0.0-alpha04" + const val snapshot = "6901934" + const val version = "1.0.0-SNAPSHOT" const val runtime = "androidx.compose.runtime:runtime:$version" const val foundation = "androidx.compose.foundation:foundation:$version"