Merge branch 'main' into fix/author-item-padding

pull/19/head
Simon Marquis 3 years ago committed by GitHub
commit 26984d5192
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -9,11 +9,9 @@ Please fill out either the individual or corporate Contributor License Agreement
(CLA).
* If you are an individual writing original source code and you're sure you
own the intellectual property, then you'll need to sign an [individual CLA]
(https://developers.google.com/open-source/cla/individual).
own the intellectual property, then you'll need to sign an [individual CLA](https://developers.google.com/open-source/cla/individual).
* If you work for a company that wants to allow you to contribute your work,
then you'll need to sign a [corporate CLA]
(https://developers.google.com/open-source/cla/corporate).
then you'll need to sign a [corporate CLA](https://developers.google.com/open-source/cla/corporate).
Follow either of the two links above to access the appropriate CLA and
instructions for how to sign and return it. Once we receive it, we'll be able to
@ -28,8 +26,7 @@ accept your pull requests.
1. Fork the desired repo, develop and test your code changes.
1. Ensure that your code adheres to the existing style in the sample to which
you are contributing. Refer to the
[Google Cloud Platform Samples Style Guide]
(https://github.com/GoogleCloudPlatform/Template/wiki/style.html) for the
[Google Cloud Platform Samples Style Guide](https://github.com/GoogleCloudPlatform/Template/wiki/style.html) for the
recommended coding standards for this organization.
1. Ensure that your code has an appropriate set of unit tests which all pass.
1. Submit a pull request.

@ -112,16 +112,15 @@ Find out more about the [UI architecture here](docs/ArchitectureLearningJourney.
# Baseline profiles
The baseline profile for this app is located at `app/src/main/baseline-prof.txt`.
The baseline profile for this app is located at [`app/src/main/baseline-prof.txt`](app/src/main/baseline-prof.txt).
It contains rules that enable AOT compilation of the critical user path taken during app launch.
For more information on baseline profiles, read [this document](https://developer.android.com/studio/profile/baselineprofiles).
| Note: The baseline profile needs to be re-generated for release builds that touched code which
| changes app startup.
> Note: The baseline profile needs to be re-generated for release builds that touched code which changes app startup.
To generate the baseline profile, select the `benchmark` build variant and run the
`BaselineProfileGenerator` benchmark test on an AOSP Android Emulator.
Then copy the resulting baseline profile from the emulator to `app/src/main/baseline-prof.txt`.
Then copy the resulting baseline profile from the emulator to [`app/src/main/baseline-prof.txt`](app/src/main/baseline-prof.txt).
# License

@ -35,4 +35,5 @@ dependencies {
implementation(project(":core-ui"))
implementation(libs.androidx.activity.compose)
implementation(libs.accompanist.flowlayout)
}

@ -17,7 +17,6 @@
package com.google.samples.apps.niacatalog.ui
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.add
import androidx.compose.foundation.layout.asPaddingValues
@ -37,6 +36,7 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp
import com.google.accompanist.flowlayout.FlowRow
import com.google.samples.apps.nowinandroid.core.ui.component.NiaDropdownMenuButton
import com.google.samples.apps.nowinandroid.core.ui.component.NiaFilledButton
import com.google.samples.apps.nowinandroid.core.ui.component.NiaFilterChip
@ -76,7 +76,7 @@ fun NiaCatalog() {
}
item { Text("Buttons", Modifier.padding(top = 16.dp)) }
item {
Row(horizontalArrangement = Arrangement.spacedBy(16.dp)) {
FlowRow(mainAxisSpacing = 16.dp) {
NiaFilledButton(onClick = {}) {
Text(text = "Enabled")
}
@ -90,7 +90,7 @@ fun NiaCatalog() {
}
item { Text("Disabled buttons", Modifier.padding(top = 16.dp)) }
item {
Row(horizontalArrangement = Arrangement.spacedBy(16.dp)) {
FlowRow(mainAxisSpacing = 16.dp) {
NiaFilledButton(
onClick = {},
enabled = false
@ -113,7 +113,7 @@ fun NiaCatalog() {
}
item { Text("Buttons with leading icons", Modifier.padding(top = 16.dp)) }
item {
Row(horizontalArrangement = Arrangement.spacedBy(16.dp)) {
FlowRow(mainAxisSpacing = 16.dp) {
NiaFilledButton(
onClick = {},
text = { Text(text = "Enabled") },
@ -139,7 +139,7 @@ fun NiaCatalog() {
}
item { Text("Disabled buttons with leading icons", Modifier.padding(top = 16.dp)) }
item {
Row(horizontalArrangement = Arrangement.spacedBy(16.dp)) {
FlowRow(mainAxisSpacing = 16.dp) {
NiaFilledButton(
onClick = {},
enabled = false,
@ -168,7 +168,7 @@ fun NiaCatalog() {
}
item { Text("Buttons with trailing icons", Modifier.padding(top = 16.dp)) }
item {
Row(horizontalArrangement = Arrangement.spacedBy(16.dp)) {
FlowRow(mainAxisSpacing = 16.dp) {
NiaFilledButton(
onClick = {},
text = { Text(text = "Enabled") },
@ -194,7 +194,7 @@ fun NiaCatalog() {
}
item { Text("Disabled buttons with trailing icons", Modifier.padding(top = 16.dp)) }
item {
Row(horizontalArrangement = Arrangement.spacedBy(16.dp)) {
FlowRow(mainAxisSpacing = 16.dp) {
NiaFilledButton(
onClick = {},
enabled = false,
@ -223,7 +223,7 @@ fun NiaCatalog() {
}
item { Text("Small buttons", Modifier.padding(top = 16.dp)) }
item {
Row(horizontalArrangement = Arrangement.spacedBy(16.dp)) {
FlowRow(mainAxisSpacing = 16.dp) {
NiaFilledButton(
onClick = {},
small = true
@ -246,7 +246,7 @@ fun NiaCatalog() {
}
item { Text("Disabled small buttons", Modifier.padding(top = 16.dp)) }
item {
Row(horizontalArrangement = Arrangement.spacedBy(16.dp)) {
FlowRow(mainAxisSpacing = 16.dp) {
NiaFilledButton(
onClick = {},
enabled = false,
@ -272,7 +272,7 @@ fun NiaCatalog() {
}
item { Text("Small buttons with leading icons", Modifier.padding(top = 16.dp)) }
item {
Row(horizontalArrangement = Arrangement.spacedBy(16.dp)) {
FlowRow(mainAxisSpacing = 16.dp) {
NiaFilledButton(
onClick = {},
small = true,
@ -306,7 +306,7 @@ fun NiaCatalog() {
)
}
item {
Row(horizontalArrangement = Arrangement.spacedBy(16.dp)) {
FlowRow(mainAxisSpacing = 16.dp) {
NiaFilledButton(
onClick = {},
enabled = false,
@ -338,7 +338,7 @@ fun NiaCatalog() {
}
item { Text("Small buttons with trailing icons", Modifier.padding(top = 16.dp)) }
item {
Row(horizontalArrangement = Arrangement.spacedBy(16.dp)) {
FlowRow(mainAxisSpacing = 16.dp) {
NiaFilledButton(
onClick = {},
small = true,
@ -372,7 +372,7 @@ fun NiaCatalog() {
)
}
item {
Row(horizontalArrangement = Arrangement.spacedBy(16.dp)) {
FlowRow(mainAxisSpacing = 16.dp) {
NiaFilledButton(
onClick = {},
enabled = false,
@ -413,7 +413,7 @@ fun NiaCatalog() {
}
item { Text("Chips", Modifier.padding(top = 16.dp)) }
item {
Row(horizontalArrangement = Arrangement.spacedBy(16.dp)) {
FlowRow(mainAxisSpacing = 16.dp) {
var firstChecked by remember { mutableStateOf(false) }
NiaFilterChip(
checked = firstChecked,
@ -437,7 +437,7 @@ fun NiaCatalog() {
}
item { Text("Toggle buttons", Modifier.padding(top = 16.dp)) }
item {
Row(horizontalArrangement = Arrangement.spacedBy(16.dp)) {
FlowRow(mainAxisSpacing = 16.dp) {
var firstChecked by remember { mutableStateOf(false) }
NiaToggleButton(
checked = firstChecked,
@ -498,7 +498,7 @@ fun NiaCatalog() {
}
item { Text("View toggle", Modifier.padding(top = 16.dp)) }
item {
Row(horizontalArrangement = Arrangement.spacedBy(16.dp)) {
FlowRow(mainAxisSpacing = 16.dp) {
var firstExpanded by remember { mutableStateOf(false) }
NiaViewToggleButton(
expanded = firstExpanded,
@ -517,7 +517,7 @@ fun NiaCatalog() {
}
item { Text("Tags", Modifier.padding(top = 16.dp)) }
item {
Row(horizontalArrangement = Arrangement.spacedBy(16.dp)) {
FlowRow(mainAxisSpacing = 16.dp) {
var firstFollowed by remember { mutableStateOf(false) }
NiaTopicTag(
followed = firstFollowed,

@ -17,4 +17,5 @@
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background"/>
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
<monochrome android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>

@ -1,2 +1,6 @@
# Proguard rules for the `benchmark` build type.
#
# Obsfuscation must be disabled for the build variant that generates Baseline Profile, otherwise
# wrong symbols would be generated. The generated Baseline Profile will be properly applied when generated
# without obfuscation and your app is being obfuscated.
-dontobfuscate

@ -73,7 +73,6 @@ HSPLandroidx/compose/animation/core/AnimationEndReason$EnumUnboxingSharedUtility
HSPLandroidx/compose/animation/core/AnimationEndReason$EnumUnboxingSharedUtility;->compareTo(II)I
HSPLandroidx/compose/animation/core/AnimationEndReason$EnumUnboxingSharedUtility;->ordinal(I)I
HSPLandroidx/compose/animation/core/AnimationEndReason$EnumUnboxingSharedUtility;->values(I)[I
HSPLandroidx/compose/animation/core/AnimationResult;-><init>(Landroidx/compose/animation/core/AnimationState;I)V
HSPLandroidx/compose/animation/core/AnimationScope;-><init>(Ljava/lang/Object;Landroidx/compose/animation/core/TwoWayConverter;Landroidx/compose/animation/core/AnimationVector;JLjava/lang/Object;JZLkotlin/jvm/functions/Function0;)V
HSPLandroidx/compose/animation/core/AnimationScope;->getValue()Ljava/lang/Object;
HSPLandroidx/compose/animation/core/AnimationScope;->setRunning$animation_core_release(Z)V
@ -115,6 +114,8 @@ HSPLandroidx/compose/animation/core/AnimationVector;->getSize$animation_core_rel
HSPLandroidx/compose/animation/core/AnimationVector;->newVector$animation_core_release()Landroidx/compose/animation/core/AnimationVector;
HSPLandroidx/compose/animation/core/AnimationVector;->reset$animation_core_release()V
HSPLandroidx/compose/animation/core/AnimationVector;->set$animation_core_release(IF)V
HSPLandroidx/compose/animation/core/AnimationVectorsKt;->copy(Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector;
HSPLandroidx/compose/animation/core/AnimationVectorsKt;->newInstance(Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector;
HSPLandroidx/compose/animation/core/Animations;->get(I)Landroidx/compose/animation/core/FloatAnimationSpec;
HSPLandroidx/compose/animation/core/ComplexDouble;-><init>(DD)V
HSPLandroidx/compose/animation/core/ComplexDouble;->equals(Ljava/lang/Object;)Z
@ -446,7 +447,6 @@ HSPLandroidx/compose/foundation/Background;->foldOut(Ljava/lang/Object;Lkotlin/j
HSPLandroidx/compose/foundation/Background;->hashCode()I
HSPLandroidx/compose/foundation/Background;->then(Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier;
HSPLandroidx/compose/foundation/Background;->toString()Ljava/lang/String;
HSPLandroidx/compose/foundation/BackgroundKt;->background$default(Landroidx/compose/ui/Modifier;Landroidx/compose/ui/graphics/Brush;Landroidx/compose/ui/graphics/Shape;FI)Landroidx/compose/ui/Modifier;
HSPLandroidx/compose/foundation/BackgroundKt;->background-bw27NRU$default(Landroidx/compose/ui/Modifier;JLandroidx/compose/ui/graphics/Shape;I)Landroidx/compose/ui/Modifier;
HSPLandroidx/compose/foundation/BackgroundKt;->background-bw27NRU(Landroidx/compose/ui/Modifier;JLandroidx/compose/ui/graphics/Shape;)Landroidx/compose/ui/Modifier;
HSPLandroidx/compose/foundation/BorderKt$border$2$1;-><init>(FLandroidx/compose/ui/graphics/Shape;Landroidx/compose/ui/node/Ref;Landroidx/compose/ui/graphics/Brush;)V
@ -1330,6 +1330,7 @@ HSPLandroidx/compose/foundation/layout/SizeModifier;->foldOut(Ljava/lang/Object;
HSPLandroidx/compose/foundation/layout/SizeModifier;->hashCode()I
HSPLandroidx/compose/foundation/layout/SizeModifier;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult;
HSPLandroidx/compose/foundation/layout/SizeModifier;->then(Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier;
HSPLandroidx/compose/foundation/layout/SpacerKt$$ExternalSyntheticOutline0;->m(Landroidx/compose/runtime/Composer;Landroidx/compose/ui/platform/ViewConfiguration;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;)Landroidx/compose/runtime/SkippableUpdater;
HSPLandroidx/compose/foundation/layout/SpacerKt;->Spacer(Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;I)V
HSPLandroidx/compose/foundation/layout/SpacerMeasurePolicy$measure$1$1;-><clinit>()V
HSPLandroidx/compose/foundation/layout/SpacerMeasurePolicy$measure$1$1;-><init>()V
@ -1388,14 +1389,12 @@ HSPLandroidx/compose/foundation/layout/WindowInsetsPaddingKt$ModifierLocalConsum
HSPLandroidx/compose/foundation/layout/WindowInsetsPaddingKt$ModifierLocalConsumedWindowInsets$1;-><init>()V
HSPLandroidx/compose/foundation/layout/WindowInsetsPaddingKt$ModifierLocalConsumedWindowInsets$1;->invoke()Ljava/lang/Object;
HSPLandroidx/compose/foundation/layout/WindowInsetsPaddingKt;-><clinit>()V
HSPLandroidx/compose/foundation/layout/WindowInsetsPaddingKt;->consumedWindowInsets(Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/layout/PaddingValues;)Landroidx/compose/ui/Modifier;
HSPLandroidx/compose/foundation/layout/WindowInsetsPaddingKt;->windowInsetsPadding(Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/layout/WindowInsets;)Landroidx/compose/ui/Modifier;
HSPLandroidx/compose/foundation/layout/WindowInsetsPadding_androidKt$safeDrawingPadding$$inlined$windowInsetsPadding$1;-><init>()V
HSPLandroidx/compose/foundation/layout/WindowInsetsPadding_androidKt$safeDrawingPadding$$inlined$windowInsetsPadding$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
HSPLandroidx/compose/foundation/layout/WindowInsetsSides;->hasAny-bkgdKaI$foundation_layout_release(II)Z
HSPLandroidx/compose/foundation/layout/WindowInsetsSides;->valueToString_impl$lambda-0$appendPlus(Ljava/lang/StringBuilder;Ljava/lang/String;)V
HSPLandroidx/compose/foundation/layout/WindowInsets_androidKt;->ValueInsets(Landroidx/core/graphics/Insets;Ljava/lang/String;)Landroidx/compose/foundation/layout/ValueInsets;
HSPLandroidx/compose/foundation/layout/WindowInsets_androidKt;->getSafeDrawing(Landroidx/compose/foundation/layout/WindowInsets$Companion;Landroidx/compose/runtime/Composer;)Landroidx/compose/foundation/layout/WindowInsets;
HSPLandroidx/compose/foundation/layout/WindowInsets_androidKt;->toInsetsValues(Landroidx/core/graphics/Insets;)Landroidx/compose/foundation/layout/InsetsValues;
HSPLandroidx/compose/foundation/layout/WrapContentModifier$measure$1;-><init>(Landroidx/compose/foundation/layout/WrapContentModifier;ILandroidx/compose/ui/layout/Placeable;ILandroidx/compose/ui/layout/MeasureScope;)V
HSPLandroidx/compose/foundation/layout/WrapContentModifier$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
HSPLandroidx/compose/foundation/layout/WrapContentModifier;-><init>(IZLkotlin/jvm/functions/Function2;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)V
@ -1781,6 +1780,7 @@ HSPLandroidx/compose/foundation/lazy/layout/DummyHandle;->cancel()V
HSPLandroidx/compose/foundation/lazy/layout/IntervalHolder;-><init>(IILjava/lang/Object;)V
HSPLandroidx/compose/foundation/lazy/layout/IntervalList;->getIntervals()Ljava/util/List;
HSPLandroidx/compose/foundation/lazy/layout/IntervalList;->getTotalSize()I
HSPLandroidx/compose/foundation/lazy/layout/IntervalListKt;->intervalIndexForItemIndex(Landroidx/compose/foundation/lazy/layout/IntervalList;I)I
HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory$CachedItemContent$createContentLambda$1$1$invoke$$inlined$onDispose$1;-><init>(Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory$CachedItemContent;)V
HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory$CachedItemContent$createContentLambda$1$1$invoke$$inlined$onDispose$1;->dispose()V
HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory$CachedItemContent$createContentLambda$1$1;-><init>(Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory$CachedItemContent;)V
@ -1839,7 +1839,6 @@ HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutPrefetcher;->schedulePrefe
HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutPrefetcher_androidKt$LazyLayoutPrefetcher$2;-><init>(Landroidx/compose/foundation/lazy/layout/LazyLayoutPrefetchState;Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory;Landroidx/compose/ui/layout/SubcomposeLayoutState;I)V
HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutPrefetcher_androidKt$LazyLayoutPrefetcher$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutPrefetcher_androidKt;->LazyLayoutPrefetcher(Landroidx/compose/foundation/lazy/layout/LazyLayoutPrefetchState;Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory;Landroidx/compose/ui/layout/SubcomposeLayoutState;Landroidx/compose/runtime/Composer;I)V
HSPLandroidx/compose/foundation/lazy/layout/Lazy_androidKt;->throwSubtypeNotRegistered(Ljava/lang/String;Lkotlin/reflect/KClass;)Ljava/lang/Void;
HSPLandroidx/compose/foundation/lazy/layout/MutableIntervalList;-><init>()V
HSPLandroidx/compose/foundation/lazy/layout/MutableIntervalList;->add(ILjava/lang/Object;)V
HSPLandroidx/compose/foundation/lazy/layout/MutableIntervalList;->getIntervals()Ljava/util/List;
@ -2734,6 +2733,7 @@ HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementati
HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/PersistentOrderedSet;-><init>(Ljava/lang/Object;Ljava/lang/Object;Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap;)V
HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/PersistentOrderedSet;->add(Ljava/lang/Object;)Landroidx/compose/runtime/external/kotlinx/collections/immutable/PersistentSet;
HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/PersistentOrderedSet;->getSize()I
HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/internal/EndOfChain;-><init>()V
HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/internal/ListImplementation;->checkElementIndex$runtime_release(II)V
HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/internal/MutabilityOwnership;-><init>()V
HSPLandroidx/compose/runtime/internal/ComposableLambdaImpl$invoke$1;-><init>(Landroidx/compose/runtime/internal/ComposableLambdaImpl;Ljava/lang/Object;I)V
@ -2873,6 +2873,8 @@ HSPLandroidx/compose/runtime/snapshots/SnapshotIdSet;->iterator()Ljava/util/Iter
HSPLandroidx/compose/runtime/snapshots/SnapshotIdSet;->or(Landroidx/compose/runtime/snapshots/SnapshotIdSet;)Landroidx/compose/runtime/snapshots/SnapshotIdSet;
HSPLandroidx/compose/runtime/snapshots/SnapshotIdSet;->set(I)Landroidx/compose/runtime/snapshots/SnapshotIdSet;
HSPLandroidx/compose/runtime/snapshots/SnapshotIdSet;->toString()Ljava/lang/String;
HSPLandroidx/compose/runtime/snapshots/SnapshotIdSetKt;->access$lowestBitOf(J)I
HSPLandroidx/compose/runtime/snapshots/SnapshotIdSetKt;->binarySearch([II)I
HSPLandroidx/compose/runtime/snapshots/SnapshotKt$advanceGlobalSnapshot$2;-><clinit>()V
HSPLandroidx/compose/runtime/snapshots/SnapshotKt$advanceGlobalSnapshot$2;-><init>()V
HSPLandroidx/compose/runtime/snapshots/SnapshotKt$advanceGlobalSnapshot$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
@ -3119,8 +3121,6 @@ HSPLandroidx/compose/ui/graphics/AndroidImageBitmap;-><init>(Landroid/graphics/B
HSPLandroidx/compose/ui/graphics/AndroidImageBitmap;->getHeight()I
HSPLandroidx/compose/ui/graphics/AndroidImageBitmap;->getWidth()I
HSPLandroidx/compose/ui/graphics/AndroidImageBitmap;->prepareToDraw()V
HSPLandroidx/compose/ui/graphics/AndroidImageBitmap_androidKt;->asAndroidBitmap(Landroidx/compose/ui/graphics/ImageBitmap;)Landroid/graphics/Bitmap;
HSPLandroidx/compose/ui/graphics/AndroidImageBitmap_androidKt;->toBitmapConfig-1JJdX4A(I)Landroid/graphics/Bitmap$Config;
HSPLandroidx/compose/ui/graphics/AndroidMatrixConversions_androidKt;->setFrom-tU-YjHk([FLandroid/graphics/Matrix;)V
HSPLandroidx/compose/ui/graphics/AndroidPaint;-><init>()V
HSPLandroidx/compose/ui/graphics/AndroidPaint;->asFrameworkPaint()Landroid/graphics/Paint;
@ -3185,12 +3185,14 @@ HSPLandroidx/compose/ui/graphics/BlockGraphicsLayerModifier;->hashCode()I
HSPLandroidx/compose/ui/graphics/BlockGraphicsLayerModifier;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult;
HSPLandroidx/compose/ui/graphics/BlockGraphicsLayerModifier;->then(Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier;
HSPLandroidx/compose/ui/graphics/BlockGraphicsLayerModifier;->toString()Ljava/lang/String;
HSPLandroidx/compose/ui/graphics/Brush;-><clinit>()V
HSPLandroidx/compose/ui/graphics/Brush;-><init>()V
HSPLandroidx/compose/ui/graphics/Brush;-><init>(Lkotlin/jvm/internal/DefaultConstructorMarker;)V
HSPLandroidx/compose/ui/graphics/Brush;->applyTo-Pq9zytI(JLandroidx/compose/ui/graphics/Paint;F)V
HSPLandroidx/compose/ui/graphics/Canvas$DefaultImpls;->clipPath-mtrdD-E$default(Landroidx/compose/ui/graphics/Canvas;Landroidx/compose/ui/graphics/Path;IILjava/lang/Object;)V
HSPLandroidx/compose/ui/graphics/Canvas$DefaultImpls;->drawRect(Landroidx/compose/ui/graphics/Canvas;Landroidx/compose/ui/geometry/Rect;Landroidx/compose/ui/graphics/Paint;)V
HSPLandroidx/compose/ui/graphics/CanvasHolder;-><init>()V
HSPLandroidx/compose/ui/graphics/CanvasKt;->Canvas(Landroidx/compose/ui/graphics/ImageBitmap;)Landroidx/compose/ui/graphics/Canvas;
HSPLandroidx/compose/ui/graphics/Color$Companion;-><init>(Lkotlin/jvm/internal/DefaultConstructorMarker;)V
HSPLandroidx/compose/ui/graphics/Color;-><clinit>()V
HSPLandroidx/compose/ui/graphics/Color;-><init>(J)V
@ -3328,15 +3330,6 @@ HSPLandroidx/compose/ui/graphics/colorspace/ColorSpace;->hashCode()I
HSPLandroidx/compose/ui/graphics/colorspace/ColorSpace;->isSrgb()Z
HSPLandroidx/compose/ui/graphics/colorspace/ColorSpace;->toString()Ljava/lang/String;
HSPLandroidx/compose/ui/graphics/colorspace/ColorSpace;->toXyz([F)[F
HSPLandroidx/compose/ui/graphics/colorspace/ColorSpaceKt;->adapt$default(Landroidx/compose/ui/graphics/colorspace/ColorSpace;Landroidx/compose/ui/graphics/colorspace/WhitePoint;Landroidx/compose/ui/graphics/colorspace/Adaptation;I)Landroidx/compose/ui/graphics/colorspace/ColorSpace;
HSPLandroidx/compose/ui/graphics/colorspace/ColorSpaceKt;->chromaticAdaptation([F[F[F)[F
HSPLandroidx/compose/ui/graphics/colorspace/ColorSpaceKt;->compare(Landroidx/compose/ui/graphics/colorspace/WhitePoint;Landroidx/compose/ui/graphics/colorspace/WhitePoint;)Z
HSPLandroidx/compose/ui/graphics/colorspace/ColorSpaceKt;->connect-YBCOT_4$default(Landroidx/compose/ui/graphics/colorspace/ColorSpace;Landroidx/compose/ui/graphics/colorspace/ColorSpace;II)Landroidx/compose/ui/graphics/colorspace/Connector;
HSPLandroidx/compose/ui/graphics/colorspace/ColorSpaceKt;->inverse3x3([F)[F
HSPLandroidx/compose/ui/graphics/colorspace/ColorSpaceKt;->mul3x3([F[F)[F
HSPLandroidx/compose/ui/graphics/colorspace/ColorSpaceKt;->mul3x3Diag([F[F)[F
HSPLandroidx/compose/ui/graphics/colorspace/ColorSpaceKt;->mul3x3Float3([F[F)[F
HSPLandroidx/compose/ui/graphics/colorspace/ColorSpaceKt;->rcpResponse(DDDDDD)D
HSPLandroidx/compose/ui/graphics/colorspace/ColorSpaces$ExtendedSrgb$1;-><clinit>()V
HSPLandroidx/compose/ui/graphics/colorspace/ColorSpaces$ExtendedSrgb$1;-><init>()V
HSPLandroidx/compose/ui/graphics/colorspace/ColorSpaces$ExtendedSrgb$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
@ -3800,6 +3793,7 @@ HSPLandroidx/compose/ui/graphics/vector/VectorPainterKt;->rememberVectorPainter(
HSPLandroidx/compose/ui/graphics/vector/VectorPath;-><init>(Ljava/lang/String;Ljava/util/List;ILandroidx/compose/ui/graphics/Brush;FLandroidx/compose/ui/graphics/Brush;FFIIFFFFLkotlin/jvm/internal/DefaultConstructorMarker;)V
HSPLandroidx/compose/ui/graphics/vector/VectorPath;->equals(Ljava/lang/Object;)Z
HSPLandroidx/compose/ui/graphics/vector/VectorPath;->hashCode()I
HSPLandroidx/compose/ui/graphics/vector/compat/AndroidVectorResources;-><clinit>()V
HSPLandroidx/compose/ui/graphics/vector/compat/XmlVectorParser_androidKt;->obtainBrushFromComplexColor(Landroidx/core/content/res/ComplexColorCompat;)Landroidx/compose/ui/graphics/Brush;
HSPLandroidx/compose/ui/input/nestedscroll/NestedScrollDispatcher$calculateNestedScrollScope$1;-><init>(Landroidx/compose/ui/input/nestedscroll/NestedScrollDispatcher;)V
HSPLandroidx/compose/ui/input/nestedscroll/NestedScrollDispatcher$calculateNestedScrollScope$1;->invoke()Ljava/lang/Object;
@ -3860,6 +3854,14 @@ HSPLandroidx/compose/ui/input/pointer/NodeParent;->dispatchMainEventPass(Ljava/u
HSPLandroidx/compose/ui/input/pointer/NodeParent;->removeDetachedPointerInputFilters()V
HSPLandroidx/compose/ui/input/pointer/PointerEvent;-><init>(Ljava/util/List;Landroidx/compose/ui/input/pointer/InternalPointerEvent;)V
HSPLandroidx/compose/ui/input/pointer/PointerEvent;->getMotionEvent$ui_release()Landroid/view/MotionEvent;
HSPLandroidx/compose/ui/input/pointer/PointerEventKt;->changedToDown(Landroidx/compose/ui/input/pointer/PointerInputChange;)Z
HSPLandroidx/compose/ui/input/pointer/PointerEventKt;->changedToDownIgnoreConsumed(Landroidx/compose/ui/input/pointer/PointerInputChange;)Z
HSPLandroidx/compose/ui/input/pointer/PointerEventKt;->changedToUp(Landroidx/compose/ui/input/pointer/PointerInputChange;)Z
HSPLandroidx/compose/ui/input/pointer/PointerEventKt;->changedToUpIgnoreConsumed(Landroidx/compose/ui/input/pointer/PointerInputChange;)Z
HSPLandroidx/compose/ui/input/pointer/PointerEventKt;->isOutOfBounds-O0kMr_c(Landroidx/compose/ui/input/pointer/PointerInputChange;J)Z
HSPLandroidx/compose/ui/input/pointer/PointerEventKt;->isOutOfBounds-jwHxaWs(Landroidx/compose/ui/input/pointer/PointerInputChange;JJ)Z
HSPLandroidx/compose/ui/input/pointer/PointerEventKt;->positionChangeInternal(Landroidx/compose/ui/input/pointer/PointerInputChange;Z)J
HSPLandroidx/compose/ui/input/pointer/PointerEventKt;->positionChangedIgnoreConsumed(Landroidx/compose/ui/input/pointer/PointerInputChange;)Z
HSPLandroidx/compose/ui/input/pointer/PointerEventPass;-><clinit>()V
HSPLandroidx/compose/ui/input/pointer/PointerEventPass;-><init>(Ljava/lang/String;I)V
HSPLandroidx/compose/ui/input/pointer/PointerEventPass;->valueOf(Ljava/lang/String;)Landroidx/compose/ui/input/pointer/PointerEventPass;
@ -3888,6 +3890,9 @@ HSPLandroidx/compose/ui/input/pointer/PointerInputEventProcessor;->process-BIzXf
HSPLandroidx/compose/ui/input/pointer/PointerInputFilter;-><init>()V
HSPLandroidx/compose/ui/input/pointer/PointerInputFilter;->onCancel()V
HSPLandroidx/compose/ui/input/pointer/PointerInputFilter;->onPointerEvent-H0pRuoY(Landroidx/compose/ui/input/pointer/PointerEvent;Landroidx/compose/ui/input/pointer/PointerEventPass;J)V
HSPLandroidx/compose/ui/input/pointer/PointerType;->equals-impl0(II)Z
HSPLandroidx/compose/ui/input/pointer/PointerType;->toString-impl(I)Ljava/lang/String;
HSPLandroidx/compose/ui/input/pointer/ProcessResult;->getDispatchedToAPointerInputModifier-impl(I)Z
HSPLandroidx/compose/ui/input/pointer/SuspendingPointerInputFilter$PointerEventHandlerCoroutine;-><init>(Landroidx/compose/ui/input/pointer/SuspendingPointerInputFilter;Lkotlin/coroutines/Continuation;)V
HSPLandroidx/compose/ui/input/pointer/SuspendingPointerInputFilter$PointerEventHandlerCoroutine;->awaitPointerEvent(Landroidx/compose/ui/input/pointer/PointerEventPass;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
HSPLandroidx/compose/ui/input/pointer/SuspendingPointerInputFilter$PointerEventHandlerCoroutine;->getContext()Lkotlin/coroutines/CoroutineContext;
@ -3997,6 +4002,8 @@ HSPLandroidx/compose/ui/layout/ContentScale$Companion$Inside$1;->computeScaleFac
HSPLandroidx/compose/ui/layout/ContentScale$Companion;-><clinit>()V
HSPLandroidx/compose/ui/layout/ContentScale$Companion;-><init>()V
HSPLandroidx/compose/ui/layout/ContentScale;->computeScaleFactor-H7hwNQA(JJ)J
HSPLandroidx/compose/ui/layout/ContentScaleKt;->computeFillHeight-iLBOSCw(JJ)F
HSPLandroidx/compose/ui/layout/ContentScaleKt;->computeFillWidth-iLBOSCw(JJ)F
HSPLandroidx/compose/ui/layout/HorizontalAlignmentLine;-><init>(Lkotlin/jvm/functions/Function2;)V
HSPLandroidx/compose/ui/layout/IntrinsicMeasurable;->getParentData()Ljava/lang/Object;
HSPLandroidx/compose/ui/layout/IntrinsicMeasureScope;->getLayoutDirection()Landroidx/compose/ui/unit/LayoutDirection;
@ -4008,10 +4015,6 @@ HSPLandroidx/compose/ui/layout/LayoutCoordinates;->localBoundingBoxOf(Landroidx/
HSPLandroidx/compose/ui/layout/LayoutCoordinates;->localPositionOf-R5De75A(Landroidx/compose/ui/layout/LayoutCoordinates;J)J
HSPLandroidx/compose/ui/layout/LayoutCoordinates;->localToRoot-MK-Hz9U(J)J
HSPLandroidx/compose/ui/layout/LayoutCoordinates;->localToWindow-MK-Hz9U(J)J
HSPLandroidx/compose/ui/layout/LayoutCoordinatesKt;->boundsInParent(Landroidx/compose/ui/layout/LayoutCoordinates;)Landroidx/compose/ui/geometry/Rect;
HSPLandroidx/compose/ui/layout/LayoutCoordinatesKt;->boundsInRoot(Landroidx/compose/ui/layout/LayoutCoordinates;)Landroidx/compose/ui/geometry/Rect;
HSPLandroidx/compose/ui/layout/LayoutCoordinatesKt;->findRoot(Landroidx/compose/ui/layout/LayoutCoordinates;)Landroidx/compose/ui/layout/LayoutCoordinates;
HSPLandroidx/compose/ui/layout/LayoutCoordinatesKt;->positionInRoot(Landroidx/compose/ui/layout/LayoutCoordinates;)J
HSPLandroidx/compose/ui/layout/LayoutId;-><init>(Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)V
HSPLandroidx/compose/ui/layout/LayoutId;->all(Lkotlin/jvm/functions/Function1;)Z
HSPLandroidx/compose/ui/layout/LayoutId;->equals(Ljava/lang/Object;)Z
@ -4305,7 +4308,6 @@ HSPLandroidx/compose/ui/node/HitTestResult;->sort(Ljava/util/Comparator;)V
HSPLandroidx/compose/ui/node/HitTestResult;->subList(II)Ljava/util/List;
HSPLandroidx/compose/ui/node/HitTestResult;->toArray()[Ljava/lang/Object;
HSPLandroidx/compose/ui/node/HitTestResult;->toArray([Ljava/lang/Object;)[Ljava/lang/Object;
HSPLandroidx/compose/ui/node/HitTestResultKt;->access$DistanceAndInLayer(FZ)J
HSPLandroidx/compose/ui/node/InnerPlaceable;-><clinit>()V
HSPLandroidx/compose/ui/node/InnerPlaceable;-><init>(Landroidx/compose/ui/node/LayoutNode;)V
HSPLandroidx/compose/ui/node/InnerPlaceable;->calculateAlignmentLine(Landroidx/compose/ui/layout/AlignmentLine;)I
@ -4949,7 +4951,6 @@ HSPLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$obtainImageV
HSPLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt;-><clinit>()V
HSPLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt;->ProvideAndroidCompositionLocals(Landroidx/compose/ui/platform/AndroidComposeView;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;I)V
HSPLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt;->access$noLocalProvidedFor(Ljava/lang/String;)Ljava/lang/Void;
HSPLandroidx/compose/ui/platform/AndroidFontResourceLoader;-><init>(Landroid/content/Context;)V
HSPLandroidx/compose/ui/platform/AndroidUiDispatcher$Companion$Main$2$dispatcher$1;-><init>(Lkotlin/coroutines/Continuation;)V
HSPLandroidx/compose/ui/platform/AndroidUiDispatcher$Companion$Main$2$dispatcher$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
HSPLandroidx/compose/ui/platform/AndroidUiDispatcher$Companion$Main$2$dispatcher$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
@ -5366,13 +5367,13 @@ HSPLandroidx/compose/ui/text/ParagraphIntrinsicInfo;-><init>(Landroidx/compose/u
HSPLandroidx/compose/ui/text/ParagraphIntrinsicInfo;->equals(Ljava/lang/Object;)Z
HSPLandroidx/compose/ui/text/ParagraphIntrinsicInfo;->hashCode()I
HSPLandroidx/compose/ui/text/ParagraphIntrinsicInfo;->toString()Ljava/lang/String;
HSPLandroidx/compose/ui/text/ParagraphStyle;-><init>(Landroidx/compose/ui/text/style/TextAlign;Landroidx/compose/ui/text/style/TextDirection;JLandroidx/compose/ui/text/style/TextIndent;Lkotlinx/coroutines/SupervisorKt;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
HSPLandroidx/compose/ui/text/ParagraphStyle;-><init>(Landroidx/compose/ui/text/style/TextAlign;Landroidx/compose/ui/text/style/TextDirection;JLandroidx/compose/ui/text/style/TextIndent;Lcoil/util/-FileSystems;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
HSPLandroidx/compose/ui/text/ParagraphStyle;->equals(Ljava/lang/Object;)Z
HSPLandroidx/compose/ui/text/ParagraphStyle;->hashCode()I
HSPLandroidx/compose/ui/text/ParagraphStyle;->merge(Landroidx/compose/ui/text/ParagraphStyle;)Landroidx/compose/ui/text/ParagraphStyle;
HSPLandroidx/compose/ui/text/ParagraphStyle;->toString()Ljava/lang/String;
HSPLandroidx/compose/ui/text/SpanStyle;-><init>(JJLandroidx/compose/ui/text/font/FontWeight;Landroidx/compose/ui/text/font/FontStyle;Landroidx/compose/ui/text/font/FontSynthesis;Landroidx/compose/ui/text/font/FontFamily;Ljava/lang/String;JLandroidx/compose/ui/text/style/BaselineShift;Landroidx/compose/ui/text/style/TextGeometricTransform;Landroidx/compose/ui/text/intl/LocaleList;JLandroidx/compose/ui/text/style/TextDecoration;Landroidx/compose/ui/graphics/Shadow;I)V
HSPLandroidx/compose/ui/text/SpanStyle;-><init>(JJLandroidx/compose/ui/text/font/FontWeight;Landroidx/compose/ui/text/font/FontStyle;Landroidx/compose/ui/text/font/FontSynthesis;Landroidx/compose/ui/text/font/FontFamily;Ljava/lang/String;JLandroidx/compose/ui/text/style/BaselineShift;Landroidx/compose/ui/text/style/TextGeometricTransform;Landroidx/compose/ui/text/intl/LocaleList;JLandroidx/compose/ui/text/style/TextDecoration;Landroidx/compose/ui/graphics/Shadow;Landroidx/compose/ui/text/PlatformSpanStyle;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
HSPLandroidx/compose/ui/text/SpanStyle;-><init>(JJLandroidx/compose/ui/text/font/FontWeight;Landroidx/compose/ui/text/font/FontStyle;Landroidx/compose/ui/text/font/FontSynthesis;Landroidx/compose/ui/text/font/FontFamily;Ljava/lang/String;JLandroidx/compose/ui/text/style/BaselineShift;Landroidx/compose/ui/text/style/TextGeometricTransform;Landroidx/compose/ui/text/intl/LocaleList;JLandroidx/compose/ui/text/style/TextDecoration;Landroidx/compose/ui/graphics/Shadow;Lcoil/util/-Logs;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
HSPLandroidx/compose/ui/text/SpanStyle;->equals(Ljava/lang/Object;)Z
HSPLandroidx/compose/ui/text/SpanStyle;->hashCode()I
HSPLandroidx/compose/ui/text/SpanStyle;->merge(Landroidx/compose/ui/text/SpanStyle;)Landroidx/compose/ui/text/SpanStyle;
@ -5405,8 +5406,8 @@ HSPLandroidx/compose/ui/text/TextRangeKt;->TextRange(II)J
HSPLandroidx/compose/ui/text/TextRangeKt;->constrain-8ffj60Q(JII)J
HSPLandroidx/compose/ui/text/TextStyle;-><clinit>()V
HSPLandroidx/compose/ui/text/TextStyle;-><init>(JJLandroidx/compose/ui/text/font/FontWeight;Landroidx/compose/ui/text/font/FontStyle;Landroidx/compose/ui/text/font/FontSynthesis;Landroidx/compose/ui/text/font/FontFamily;Ljava/lang/String;JLandroidx/compose/ui/text/style/BaselineShift;Landroidx/compose/ui/text/style/TextGeometricTransform;Landroidx/compose/ui/text/intl/LocaleList;JLandroidx/compose/ui/text/style/TextDecoration;Landroidx/compose/ui/graphics/Shadow;Landroidx/compose/ui/text/style/TextAlign;Landroidx/compose/ui/text/style/TextDirection;JLandroidx/compose/ui/text/style/TextIndent;I)V
HSPLandroidx/compose/ui/text/TextStyle;-><init>(JJLandroidx/compose/ui/text/font/FontWeight;Landroidx/compose/ui/text/font/FontStyle;Landroidx/compose/ui/text/font/FontSynthesis;Landroidx/compose/ui/text/font/FontFamily;Ljava/lang/String;JLandroidx/compose/ui/text/style/BaselineShift;Landroidx/compose/ui/text/style/TextGeometricTransform;Landroidx/compose/ui/text/intl/LocaleList;JLandroidx/compose/ui/text/style/TextDecoration;Landroidx/compose/ui/graphics/Shadow;Landroidx/compose/ui/text/style/TextAlign;Landroidx/compose/ui/text/style/TextDirection;JLandroidx/compose/ui/text/style/TextIndent;Lkotlinx/coroutines/SupervisorKt;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
HSPLandroidx/compose/ui/text/TextStyle;-><init>(Landroidx/compose/ui/text/SpanStyle;Landroidx/compose/ui/text/ParagraphStyle;Lkotlinx/coroutines/SupervisorKt;)V
HSPLandroidx/compose/ui/text/TextStyle;-><init>(JJLandroidx/compose/ui/text/font/FontWeight;Landroidx/compose/ui/text/font/FontStyle;Landroidx/compose/ui/text/font/FontSynthesis;Landroidx/compose/ui/text/font/FontFamily;Ljava/lang/String;JLandroidx/compose/ui/text/style/BaselineShift;Landroidx/compose/ui/text/style/TextGeometricTransform;Landroidx/compose/ui/text/intl/LocaleList;JLandroidx/compose/ui/text/style/TextDecoration;Landroidx/compose/ui/graphics/Shadow;Landroidx/compose/ui/text/style/TextAlign;Landroidx/compose/ui/text/style/TextDirection;JLandroidx/compose/ui/text/style/TextIndent;Lkotlinx/coroutines/EventLoop_commonKt;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
HSPLandroidx/compose/ui/text/TextStyle;-><init>(Landroidx/compose/ui/text/SpanStyle;Landroidx/compose/ui/text/ParagraphStyle;Lkotlinx/coroutines/EventLoop_commonKt;)V
HSPLandroidx/compose/ui/text/TextStyle;->copy-HL5avdY$default(Landroidx/compose/ui/text/TextStyle;JJLandroidx/compose/ui/text/font/FontWeight;Landroidx/compose/ui/text/font/FontStyle;Landroidx/compose/ui/text/font/FontSynthesis;Landroidx/compose/ui/text/font/FontFamily;Ljava/lang/String;JLandroidx/compose/ui/text/style/BaselineShift;Landroidx/compose/ui/text/style/TextGeometricTransform;Landroidx/compose/ui/text/intl/LocaleList;JLandroidx/compose/ui/text/style/TextDecoration;Landroidx/compose/ui/graphics/Shadow;Landroidx/compose/ui/text/style/TextAlign;Landroidx/compose/ui/text/style/TextDirection;JLandroidx/compose/ui/text/style/TextIndent;I)Landroidx/compose/ui/text/TextStyle;
HSPLandroidx/compose/ui/text/TextStyle;->equals(Ljava/lang/Object;)Z
HSPLandroidx/compose/ui/text/TextStyle;->hashCode()I
@ -5477,7 +5478,6 @@ HSPLandroidx/compose/ui/text/font/FontFamilyResolverImpl;-><init>(Landroidx/comp
HSPLandroidx/compose/ui/text/font/FontFamilyResolverImpl;->resolve(Landroidx/compose/ui/text/font/TypefaceRequest;)Landroidx/compose/runtime/State;
HSPLandroidx/compose/ui/text/font/FontFamilyResolverImpl;->resolve-DPcqOEQ(Landroidx/compose/ui/text/font/FontFamily;Landroidx/compose/ui/text/font/FontWeight;II)Landroidx/compose/runtime/State;
HSPLandroidx/compose/ui/text/font/FontFamilyResolverKt;-><clinit>()V
HSPLandroidx/compose/ui/text/font/FontFamilyResolver_androidKt;->createFontFamilyResolver(Landroid/content/Context;)Landroidx/compose/ui/text/font/FontFamily$Resolver;
HSPLandroidx/compose/ui/text/font/FontListFontFamily;->add(ILjava/lang/Object;)V
HSPLandroidx/compose/ui/text/font/FontListFontFamily;->add(Ljava/lang/Object;)Z
HSPLandroidx/compose/ui/text/font/FontListFontFamily;->addAll(ILjava/util/Collection;)Z
@ -5783,6 +5783,7 @@ HSPLandroidx/compose/ui/unit/Velocity;->minus-AH228Gc(JJ)J
HSPLandroidx/compose/ui/unit/Velocity;->plus-AH228Gc(JJ)J
HSPLandroidx/compose/ui/unit/Velocity;->toString()Ljava/lang/String;
HSPLandroidx/compose/ui/unit/VelocityKt;->Velocity(FF)J
HSPLandroidx/compose/ui/util/MathHelpersKt;->lerp(FFF)F
HSPLandroidx/lifecycle/LiveData$1;-><init>(Landroidx/lifecycle/LiveData;)V
HSPLandroidx/lifecycle/LiveData$1;->run()V
HSPLandroidx/lifecycle/LiveData$AlwaysActiveObserver;-><init>(Landroidx/lifecycle/LiveData;Landroidx/lifecycle/Observer;)V
@ -5854,7 +5855,6 @@ HSPLandroidx/navigation/NavDeepLinkRequest;-><init>(Landroid/content/Intent;)V
HSPLandroidx/navigation/NavDeepLinkRequest;-><init>(Landroid/net/Uri;Ljava/lang/String;Ljava/lang/String;)V
HSPLandroidx/navigation/NavDestination;-><clinit>()V
HSPLandroidx/navigation/NavDestination;-><init>(Landroidx/navigation/Navigator;)V
HSPLandroidx/navigation/NavDestination;->addArgument(Ljava/lang/String;Landroidx/navigation/NavArgument;)V
HSPLandroidx/navigation/NavDestination;->addInDefaultArgs(Landroid/os/Bundle;)Landroid/os/Bundle;
HSPLandroidx/navigation/NavDestination;->equals(Ljava/lang/Object;)Z
HSPLandroidx/navigation/NavDestination;->getArguments()Ljava/util/Map;
@ -6047,6 +6047,8 @@ HSPLkotlinx/coroutines/CancellableContinuationImpl;->resumedState(Lkotlinx/corou
HSPLkotlinx/coroutines/CancellableContinuationImpl;->takeState$kotlinx_coroutines_core()Ljava/lang/Object;
HSPLkotlinx/coroutines/CancellableContinuationImpl;->tryResume(Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;
HSPLkotlinx/coroutines/CancellableContinuationImpl;->tryResumeImpl(Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Lkotlinx/coroutines/internal/Symbol;
HSPLkotlinx/coroutines/CancellableContinuationKt;->disposeOnCancellation(Lkotlinx/coroutines/CancellableContinuation;Lkotlinx/coroutines/DisposableHandle;)V
HSPLkotlinx/coroutines/CancellableContinuationKt;->getOrCreateCancellableContinuation(Lkotlin/coroutines/Continuation;)Lkotlinx/coroutines/CancellableContinuationImpl;
HSPLkotlinx/coroutines/CancelledContinuation;-><init>(Lkotlin/coroutines/Continuation;Ljava/lang/Throwable;Z)V
HSPLkotlinx/coroutines/ChildContinuation;-><init>(Lkotlinx/coroutines/CancellableContinuationImpl;)V
HSPLkotlinx/coroutines/ChildContinuation;->invoke(Ljava/lang/Throwable;)V
@ -6057,8 +6059,6 @@ HSPLkotlinx/coroutines/CompletedContinuation;-><init>(Ljava/lang/Object;Lkotlinx
HSPLkotlinx/coroutines/CompletedExceptionally;-><init>(Ljava/lang/Throwable;Z)V
HSPLkotlinx/coroutines/CompletedExceptionally;->getHandled()Z
HSPLkotlinx/coroutines/CompletionHandlerBase;-><init>()V
HSPLkotlinx/coroutines/CompletionStateKt;->recoverResult(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
HSPLkotlinx/coroutines/CompletionStateKt;->toState(Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;
HSPLkotlinx/coroutines/CoroutineContextKt;->newCoroutineContext(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext;
HSPLkotlinx/coroutines/CoroutineDispatcher$Key$1;-><init>()V
HSPLkotlinx/coroutines/CoroutineDispatcher$Key;-><init>(Lkotlin/jvm/internal/DefaultConstructorMarker;)V
@ -6077,11 +6077,15 @@ HSPLkotlinx/coroutines/DefaultExecutor;-><init>()V
HSPLkotlinx/coroutines/DefaultExecutor;->getThread()Ljava/lang/Thread;
HSPLkotlinx/coroutines/DefaultExecutor;->isShutdownRequested()Z
HSPLkotlinx/coroutines/DefaultExecutor;->run()V
HSPLkotlinx/coroutines/DelayKt;->delay(JLkotlin/coroutines/Continuation;)Ljava/lang/Object;
HSPLkotlinx/coroutines/DelayKt;->getDelay(Lkotlin/coroutines/CoroutineContext;)Lkotlinx/coroutines/Delay;
HSPLkotlinx/coroutines/DispatchedTask;-><init>(I)V
HSPLkotlinx/coroutines/DispatchedTask;->getExceptionalResult$kotlinx_coroutines_core(Ljava/lang/Object;)Ljava/lang/Throwable;
HSPLkotlinx/coroutines/DispatchedTask;->getSuccessfulResult$kotlinx_coroutines_core(Ljava/lang/Object;)Ljava/lang/Object;
HSPLkotlinx/coroutines/DispatchedTask;->handleFatalException(Ljava/lang/Throwable;Ljava/lang/Throwable;)V
HSPLkotlinx/coroutines/DispatchedTask;->run()V
HSPLkotlinx/coroutines/DispatchedTaskKt;->isCancellableMode(I)Z
HSPLkotlinx/coroutines/DispatchedTaskKt;->resume(Lkotlinx/coroutines/DispatchedTask;Lkotlin/coroutines/Continuation;Z)V
HSPLkotlinx/coroutines/DisposeOnCancel;-><init>(Lkotlinx/coroutines/DisposableHandle;)V
HSPLkotlinx/coroutines/Empty;-><init>(Z)V
HSPLkotlinx/coroutines/Empty;->getList()Lkotlinx/coroutines/NodeList;
@ -6325,11 +6329,6 @@ HSPLkotlinx/coroutines/internal/ScopeCoroutine;-><init>(Lkotlin/coroutines/Corou
HSPLkotlinx/coroutines/internal/ScopeCoroutine;->afterResume(Ljava/lang/Object;)V
HSPLkotlinx/coroutines/internal/ScopeCoroutine;->isScopedCoroutine()Z
HSPLkotlinx/coroutines/internal/Symbol;-><init>(Ljava/lang/String;)V
HSPLkotlinx/coroutines/internal/SystemPropsKt;->systemProp$default(Ljava/lang/String;IIIILjava/lang/Object;)I
HSPLkotlinx/coroutines/internal/SystemPropsKt;->systemProp$default(Ljava/lang/String;JJJILjava/lang/Object;)J
HSPLkotlinx/coroutines/internal/SystemPropsKt;->systemProp(Ljava/lang/String;)Ljava/lang/String;
HSPLkotlinx/coroutines/internal/SystemPropsKt;->systemProp(Ljava/lang/String;III)I
HSPLkotlinx/coroutines/internal/SystemPropsKt;->systemProp(Ljava/lang/String;JJJ)J
HSPLkotlinx/coroutines/internal/ThreadContextKt$countAll$1;-><init>()V
HSPLkotlinx/coroutines/internal/ThreadContextKt$countAll$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
HSPLkotlinx/coroutines/internal/ThreadContextKt$findOne$1;-><init>()V
@ -6358,7 +6357,6 @@ HSPLkotlinx/coroutines/sync/MutexImpl;-><init>(Z)V
HSPLkotlinx/coroutines/sync/MutexImpl;->lock(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
HSPLkotlinx/coroutines/sync/MutexImpl;->tryLock(Ljava/lang/Object;)Z
HSPLkotlinx/coroutines/sync/MutexImpl;->unlock(Ljava/lang/Object;)V
Landroidx/compose/animation/AndroidFlingSpline$$ExternalSyntheticOutline0;
Landroidx/compose/animation/AndroidFlingSpline$$ExternalSyntheticOutline1;
Landroidx/compose/animation/AndroidFlingSpline$FlingResult$$ExternalSyntheticOutline0;
Landroidx/compose/animation/AndroidFlingSpline$FlingResult;
@ -6392,7 +6390,6 @@ Landroidx/compose/animation/core/AnimateAsStateKt$animateValueAsState$3;
Landroidx/compose/animation/core/AnimateAsStateKt;
Landroidx/compose/animation/core/Animation;
Landroidx/compose/animation/core/AnimationEndReason$EnumUnboxingSharedUtility;
Landroidx/compose/animation/core/AnimationResult;
Landroidx/compose/animation/core/AnimationScope;
Landroidx/compose/animation/core/AnimationSpec;
Landroidx/compose/animation/core/AnimationState;
@ -6400,6 +6397,7 @@ Landroidx/compose/animation/core/AnimationVector1D;
Landroidx/compose/animation/core/AnimationVector2D;
Landroidx/compose/animation/core/AnimationVector4D;
Landroidx/compose/animation/core/AnimationVector;
Landroidx/compose/animation/core/AnimationVectorsKt;
Landroidx/compose/animation/core/Animations;
Landroidx/compose/animation/core/ComplexDouble;
Landroidx/compose/animation/core/ComplexDoubleKt;
@ -6797,6 +6795,7 @@ Landroidx/compose/foundation/layout/SizeKt$createWrapContentWidthModifier$2;
Landroidx/compose/foundation/layout/SizeKt;
Landroidx/compose/foundation/layout/SizeModifier$measure$1;
Landroidx/compose/foundation/layout/SizeModifier;
Landroidx/compose/foundation/layout/SpacerKt$$ExternalSyntheticOutline0;
Landroidx/compose/foundation/layout/SpacerKt;
Landroidx/compose/foundation/layout/SpacerMeasurePolicy$measure$1$1;
Landroidx/compose/foundation/layout/SpacerMeasurePolicy;
@ -6815,7 +6814,6 @@ Landroidx/compose/foundation/layout/WindowInsetsPaddingKt$ModifierLocalConsumedW
Landroidx/compose/foundation/layout/WindowInsetsPaddingKt;
Landroidx/compose/foundation/layout/WindowInsetsPadding_androidKt$safeDrawingPadding$$inlined$windowInsetsPadding$1;
Landroidx/compose/foundation/layout/WindowInsetsSides;
Landroidx/compose/foundation/layout/WindowInsets_androidKt;
Landroidx/compose/foundation/layout/WrapContentModifier$measure$1;
Landroidx/compose/foundation/layout/WrapContentModifier;
Landroidx/compose/foundation/lazy/EmptyLazyListLayoutInfo;
@ -6961,6 +6959,7 @@ Landroidx/compose/foundation/lazy/layout/DefaultLazyKey;
Landroidx/compose/foundation/lazy/layout/DummyHandle;
Landroidx/compose/foundation/lazy/layout/IntervalHolder;
Landroidx/compose/foundation/lazy/layout/IntervalList;
Landroidx/compose/foundation/lazy/layout/IntervalListKt;
Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory$CachedItemContent$createContentLambda$1$1$invoke$$inlined$onDispose$1;
Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory$CachedItemContent$createContentLambda$1$1;
Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory$CachedItemContent$createContentLambda$1;
@ -6981,7 +6980,6 @@ Landroidx/compose/foundation/lazy/layout/LazyLayoutPrefetcher$PrefetchRequest;
Landroidx/compose/foundation/lazy/layout/LazyLayoutPrefetcher;
Landroidx/compose/foundation/lazy/layout/LazyLayoutPrefetcher_androidKt$LazyLayoutPrefetcher$2;
Landroidx/compose/foundation/lazy/layout/LazyLayoutPrefetcher_androidKt;
Landroidx/compose/foundation/lazy/layout/Lazy_androidKt;
Landroidx/compose/foundation/lazy/layout/MutableIntervalList;
Landroidx/compose/foundation/lazy/layout/PinnableParent$PinnedItemsHandle;
Landroidx/compose/foundation/lazy/layout/PinnableParent;
@ -7323,6 +7321,7 @@ Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations
Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/PersistentOrderedSet;
Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/PersistentOrderedSetIterator;
Landroidx/compose/runtime/external/kotlinx/collections/immutable/internal/DeltaCounter;
Landroidx/compose/runtime/external/kotlinx/collections/immutable/internal/EndOfChain;
Landroidx/compose/runtime/external/kotlinx/collections/immutable/internal/ListImplementation;
Landroidx/compose/runtime/external/kotlinx/collections/immutable/internal/MutabilityOwnership;
Landroidx/compose/runtime/internal/ComposableLambda;
@ -7383,6 +7382,7 @@ Landroidx/compose/runtime/snapshots/SnapshotApplyResult;
Landroidx/compose/runtime/snapshots/SnapshotDoubleIndexHeap;
Landroidx/compose/runtime/snapshots/SnapshotIdSet$iterator$1;
Landroidx/compose/runtime/snapshots/SnapshotIdSet;
Landroidx/compose/runtime/snapshots/SnapshotIdSetKt;
Landroidx/compose/runtime/snapshots/SnapshotKt$advanceGlobalSnapshot$2;
Landroidx/compose/runtime/snapshots/SnapshotKt$emptyLambda$1;
Landroidx/compose/runtime/snapshots/SnapshotKt$mergedReadObserver$1;
@ -7423,11 +7423,13 @@ Landroidx/compose/runtime/snapshots/TransparentObserverSnapshot;
Landroidx/compose/ui/geometry/CornerRadius$Companion;
Landroidx/compose/ui/geometry/CornerRadius;
Landroidx/compose/ui/geometry/CornerRadiusKt;
Landroidx/compose/ui/geometry/GeometryUtilsKt;
Landroidx/compose/ui/geometry/MutableRect;
Landroidx/compose/ui/geometry/Offset$Companion;
Landroidx/compose/ui/geometry/Offset;
Landroidx/compose/ui/geometry/OffsetKt;
Landroidx/compose/ui/geometry/Rect;
Landroidx/compose/ui/geometry/RectKt;
Landroidx/compose/ui/geometry/RoundRect;
Landroidx/compose/ui/geometry/RoundRectKt;
Landroidx/compose/ui/geometry/Size$Companion;
@ -7436,30 +7438,31 @@ Landroidx/compose/ui/geometry/SizeKt;
Landroidx/compose/ui/graphics/AndroidCanvas;
Landroidx/compose/ui/graphics/AndroidCanvas_androidKt;
Landroidx/compose/ui/graphics/AndroidImageBitmap;
Landroidx/compose/ui/graphics/AndroidImageBitmap_androidKt;
Landroidx/compose/ui/graphics/AndroidMatrixConversions_androidKt;
Landroidx/compose/ui/graphics/AndroidPaint;
Landroidx/compose/ui/graphics/AndroidPaint_androidKt$WhenMappings;
Landroidx/compose/ui/graphics/AndroidPath;
Landroidx/compose/ui/graphics/AndroidPathEffect;
Landroidx/compose/ui/graphics/AndroidPathMeasure;
Landroidx/compose/ui/graphics/AndroidShader_androidKt;
Landroidx/compose/ui/graphics/Api26Bitmap;
Landroidx/compose/ui/graphics/BlendMode;
Landroidx/compose/ui/graphics/BlendModeColorFilterHelper;
Landroidx/compose/ui/graphics/BlockGraphicsLayerModifier$measure$1;
Landroidx/compose/ui/graphics/BlockGraphicsLayerModifier;
Landroidx/compose/ui/graphics/Brush$Companion;
Landroidx/compose/ui/graphics/Brush;
Landroidx/compose/ui/graphics/BrushKt$ShaderBrush$1;
Landroidx/compose/ui/graphics/Canvas$DefaultImpls;
Landroidx/compose/ui/graphics/Canvas;
Landroidx/compose/ui/graphics/CanvasHolder;
Landroidx/compose/ui/graphics/CanvasKt;
Landroidx/compose/ui/graphics/CanvasUtils;
Landroidx/compose/ui/graphics/CanvasZHelper;
Landroidx/compose/ui/graphics/Color$Companion;
Landroidx/compose/ui/graphics/Color;
Landroidx/compose/ui/graphics/ColorFilter;
Landroidx/compose/ui/graphics/ColorKt;
Landroidx/compose/ui/graphics/FilterQuality;
Landroidx/compose/ui/graphics/Float16$Companion;
Landroidx/compose/ui/graphics/Float16;
Landroidx/compose/ui/graphics/GraphicsLayerModifierKt;
@ -7478,8 +7481,6 @@ Landroidx/compose/ui/graphics/Path$DefaultImpls;
Landroidx/compose/ui/graphics/Path;
Landroidx/compose/ui/graphics/PathFillType;
Landroidx/compose/ui/graphics/PathMeasure;
Landroidx/compose/ui/graphics/PathOperation;
Landroidx/compose/ui/graphics/RadialGradient;
Landroidx/compose/ui/graphics/RectangleShapeKt$RectangleShape$1;
Landroidx/compose/ui/graphics/RectangleShapeKt;
Landroidx/compose/ui/graphics/RenderEffect;
@ -7494,7 +7495,6 @@ Landroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;
Landroidx/compose/ui/graphics/SolidColor;
Landroidx/compose/ui/graphics/StrokeCap;
Landroidx/compose/ui/graphics/StrokeJoin;
Landroidx/compose/ui/graphics/TileMode;
Landroidx/compose/ui/graphics/TileModeVerificationHelper;
Landroidx/compose/ui/graphics/TransformOrigin$Companion;
Landroidx/compose/ui/graphics/TransformOrigin;
@ -7504,7 +7504,6 @@ Landroidx/compose/ui/graphics/colorspace/Adaptation;
Landroidx/compose/ui/graphics/colorspace/ColorModel$Companion;
Landroidx/compose/ui/graphics/colorspace/ColorModel;
Landroidx/compose/ui/graphics/colorspace/ColorSpace;
Landroidx/compose/ui/graphics/colorspace/ColorSpaceKt;
Landroidx/compose/ui/graphics/colorspace/ColorSpaces$ExtendedSrgb$1;
Landroidx/compose/ui/graphics/colorspace/ColorSpaces$ExtendedSrgb$2;
Landroidx/compose/ui/graphics/colorspace/ColorSpaces;
@ -7647,6 +7646,7 @@ Landroidx/compose/ui/graphics/vector/VectorProperty$TrimPathOffset;
Landroidx/compose/ui/graphics/vector/VectorProperty$TrimPathStart;
Landroidx/compose/ui/graphics/vector/VectorProperty;
Landroidx/compose/ui/graphics/vector/compat/AndroidVectorParser;
Landroidx/compose/ui/graphics/vector/compat/AndroidVectorResources;
Landroidx/compose/ui/graphics/vector/compat/XmlVectorParser_androidKt;
Landroidx/compose/ui/text/AnnotatedString$Range;
Landroidx/compose/ui/text/AnnotatedString;
@ -7665,7 +7665,6 @@ Landroidx/compose/ui/text/ParagraphStyle;
Landroidx/compose/ui/text/ParagraphStyleKt;
Landroidx/compose/ui/text/Placeholder;
Landroidx/compose/ui/text/PlaceholderVerticalAlign;
Landroidx/compose/ui/text/PlatformSpanStyle;
Landroidx/compose/ui/text/SaversKt$AnnotatedStringSaver$1;
Landroidx/compose/ui/text/SaversKt$AnnotatedStringSaver$2;
Landroidx/compose/ui/text/SaversKt$AnnotationRangeListSaver$1;
@ -7722,6 +7721,7 @@ Landroidx/compose/ui/text/android/LayoutIntrinsics$minIntrinsicWidth$2;
Landroidx/compose/ui/text/android/LayoutIntrinsics;
Landroidx/compose/ui/text/android/LayoutIntrinsicsKt$$ExternalSyntheticLambda0;
Landroidx/compose/ui/text/android/Paint29;
Landroidx/compose/ui/text/android/PaintExtensionsKt;
Landroidx/compose/ui/text/android/StaticLayoutFactory23;
Landroidx/compose/ui/text/android/StaticLayoutFactory26;
Landroidx/compose/ui/text/android/StaticLayoutFactory28;
@ -7747,7 +7747,6 @@ Landroidx/compose/ui/text/caches/LruCache;
Landroidx/compose/ui/text/caches/SimpleArrayMap;
Landroidx/compose/ui/text/font/AndroidFontLoader;
Landroidx/compose/ui/text/font/AndroidFontResolveInterceptor;
Landroidx/compose/ui/text/font/AndroidFontUtils_androidKt;
Landroidx/compose/ui/text/font/AsyncTypefaceCache;
Landroidx/compose/ui/text/font/DefaultFontFamily;
Landroidx/compose/ui/text/font/Font$ResourceLoader;
@ -7758,7 +7757,6 @@ Landroidx/compose/ui/text/font/FontFamilyResolverImpl$createDefaultTypeface$1;
Landroidx/compose/ui/text/font/FontFamilyResolverImpl$resolve$result$1;
Landroidx/compose/ui/text/font/FontFamilyResolverImpl;
Landroidx/compose/ui/text/font/FontFamilyResolverKt;
Landroidx/compose/ui/text/font/FontFamilyResolver_androidKt;
Landroidx/compose/ui/text/font/FontListFontFamily;
Landroidx/compose/ui/text/font/FontListFontFamilyTypefaceAdapter$special$$inlined$CoroutineExceptionHandler$1;
Landroidx/compose/ui/text/font/FontListFontFamilyTypefaceAdapter;
@ -7774,8 +7772,8 @@ Landroidx/compose/ui/text/font/PlatformResolveInterceptor$Companion$Default$1;
Landroidx/compose/ui/text/font/PlatformResolveInterceptor$Companion;
Landroidx/compose/ui/text/font/PlatformResolveInterceptor;
Landroidx/compose/ui/text/font/PlatformTypefaces;
Landroidx/compose/ui/text/font/PlatformTypefacesApi28;
Landroidx/compose/ui/text/font/PlatformTypefacesApi;
Landroidx/compose/ui/text/font/PlatformTypefacesKt;
Landroidx/compose/ui/text/font/SystemFontFamily;
Landroidx/compose/ui/text/font/TypefaceRequest;
Landroidx/compose/ui/text/font/TypefaceRequestCache$runCached$currentTypefaceResult$1;
@ -7793,7 +7791,6 @@ Landroidx/compose/ui/text/input/PlatformTextInputService;
Landroidx/compose/ui/text/input/TextFieldValue$Companion$Saver$1;
Landroidx/compose/ui/text/input/TextFieldValue$Companion$Saver$2;
Landroidx/compose/ui/text/input/TextFieldValue;
Landroidx/compose/ui/text/input/TextFieldValueKt;
Landroidx/compose/ui/text/input/TextInputService;
Landroidx/compose/ui/text/input/TextInputServiceAndroid$TextInputCommand;
Landroidx/compose/ui/text/input/TextInputServiceAndroid$baseInputConnection$2;
@ -7852,6 +7849,7 @@ Landroidx/compose/ui/unit/TextUnitType;
Landroidx/compose/ui/unit/Velocity$Companion;
Landroidx/compose/ui/unit/Velocity;
Landroidx/compose/ui/unit/VelocityKt;
Landroidx/compose/ui/util/MathHelpersKt;
Landroidx/navigation/ActivityNavigator$hostActivity$1;
Landroidx/navigation/ActivityNavigator;
Landroidx/navigation/FloatingWindow;

@ -16,13 +16,9 @@
package com.google.samples.apps.nowinandroid.navigation
import android.app.Activity
import android.view.View
import androidx.compose.material3.windowsizeclass.WindowSizeClass
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalView
import androidx.core.view.doOnPreDraw
import androidx.navigation.NavHostController
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.rememberNavController
@ -67,23 +63,4 @@ fun NiaNavHost(
onBackClick = { navController.popBackStack() }
)
}
// Reporting the app fully drawn to get accurate TTFD readings for the baseline profile.
// https://developer.android.com/topic/performance/vitals/launch-time#retrieve-TTFD
ReportFullyDrawn(ForYouDestination.route)
}
/**
* Calling [Activity#reportFullyDrawn] in compose UI.
*/
@Composable
private fun ReportFullyDrawn(destination: String) {
// Holding on to the local view and calling `reportFullyDrawn` in an `onPreDraw` listener.
// Compose currently doesn't offer a way to otherwise report fully drawn,
// so this is a viable approach.
val localView: View = LocalView.current
(localView.context as? Activity)?.run {
localView.doOnPreDraw {
reportFullyDrawn()
}
}
}

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2022 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
http://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.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:pathData="M0,0h108v108h-108z"
android:fillColor="#FFFFFF"/>
</vector>

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2022 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
http://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.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:pathData="M108,0L108,108L0,108L0,0L108,0ZM68.25,64.93L64.32,71.73C61.31,70.36 57.94,69.59 54.33,69.59C50.73,69.59 47.35,70.36 44.34,71.73L40.41,64.93C40.19,64.54 39.69,64.41 39.31,64.63C38.92,64.85 38.79,65.35 39.01,65.73L42.89,72.44C36.22,76.07 31.67,82.81 31,90.77L77.67,90.77C77,82.8 72.44,76.06 65.77,72.44L69.66,65.73C69.88,65.35 69.74,64.85 69.36,64.63C68.97,64.41 68.48,64.54 68.25,64.93ZM62.39,46.2L60.69,46.2C59.98,46.2 59.4,46.74 59.34,47.43L59.33,47.56L59.33,51.64L58.15,51.64C57.72,51.64 57.36,51.96 57.31,52.38L57.3,52.48L57.3,53.5C57.3,53.93 57.62,54.29 58.04,54.34L58.15,54.35L61.54,54.35L61.65,54.34C62.03,54.3 62.34,53.99 62.38,53.61L62.39,53.5L62.39,46.2ZM47.42,46.2L45.72,46.2L45.72,53.5C45.72,53.93 46.04,54.29 46.46,54.34L46.57,54.35L49.97,54.35C50.43,54.35 50.81,53.97 50.81,53.5L50.81,52.48C50.81,52.02 50.43,51.64 49.97,51.64L48.78,51.64L48.78,47.56C48.78,46.81 48.17,46.2 47.42,46.2ZM45.72,43.15L44.19,43.15C43.35,43.15 42.67,43.83 42.67,44.68C42.67,45.52 43.35,46.2 44.19,46.2L45.72,46.2L45.72,43.15ZM63.92,43.15L62.39,43.15L62.39,46.2L63.92,46.2C64.76,46.2 65.44,45.52 65.44,44.68C65.44,43.83 64.76,43.15 63.92,43.15ZM49.97,35L46.57,35C46.1,35 45.72,35.38 45.72,35.85L45.72,43.15L47.42,43.15C48.17,43.15 48.78,42.54 48.78,41.79L48.78,37.72L49.97,37.72C50.43,37.72 50.81,37.34 50.81,36.87L50.81,35.85C50.81,35.38 50.43,35 49.97,35ZM61.54,35L58.15,35C57.72,35 57.36,35.32 57.31,35.74L57.3,35.85L57.3,36.87C57.3,37.3 57.62,37.66 58.04,37.71L58.15,37.72L59.33,37.72L59.33,41.79C59.33,42.5 59.87,43.08 60.56,43.14L60.69,43.15L62.39,43.15L62.39,35.85C62.39,35.38 62.01,35 61.54,35Z"
android:fillColor="#000000"
android:fillType="nonZero"/>
<path
android:pathData="M65.08,84.13C64.01,84.13 63.13,83.26 63.13,82.18C63.13,81.11 64,80.24 65.08,80.24C66.15,80.24 67.02,81.11 67.02,82.18C67.02,83.26 66.15,84.13 65.08,84.13Z"
android:fillColor="#000000"
android:fillType="nonZero"/>
<path
android:pathData="M43.6,84.13C42.53,84.13 41.65,83.26 41.65,82.18C41.65,81.11 42.52,80.24 43.6,80.24C44.66,80.24 45.54,81.11 45.54,82.18C45.54,83.26 44.67,84.13 43.6,84.13Z"
android:fillColor="#000000"
android:fillType="nonZero"/>
</vector>

@ -17,4 +17,5 @@
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background"/>
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
<monochrome android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>

@ -12,7 +12,7 @@ By setting up convention plugins in `build-logic`, we can avoid duplicated build
messy `subproject` configurations, without the pitfalls of the `buildSrc` directory.
`build-logic` is an included build, as configured in the root
[`settings.gradle`](../settings.gradle).
[`settings.gradle.kts`](../settings.gradle.kts).
Inside `build-logic` is a `convention` module, which defines a set of plugins that all normal
modules can use to configure themselves.

@ -49,13 +49,13 @@ fun Project.configureKotlinAndroid(
allWarningsAsErrors = properties["warningsAsErrors"] as? Boolean ?: false
freeCompilerArgs = freeCompilerArgs + listOf(
"-Xopt-in=kotlin.RequiresOptIn",
"-opt-in=kotlin.RequiresOptIn",
// Enable experimental coroutines APIs, including Flow
"-Xopt-in=kotlinx.coroutines.ExperimentalCoroutinesApi",
"-Xopt-in=kotlinx.coroutines.FlowPreview",
"-Xopt-in=kotlin.Experimental",
"-opt-in=kotlinx.coroutines.ExperimentalCoroutinesApi",
"-opt-in=kotlinx.coroutines.FlowPreview",
"-opt-in=kotlin.Experimental",
// Enable experimental kotlinx serialization APIs
"-Xopt-in=kotlinx.serialization.ExperimentalSerializationApi"
"-opt-in=kotlinx.serialization.ExperimentalSerializationApi"
)
// Set JVM target to 1.8

@ -13,6 +13,8 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// TODO: Remove once https://youtrack.jetbrains.com/issue/KTIJ-19369 is fixed
@Suppress("DSL_SCOPE_VIOLATION")
plugins {
id("nowinandroid.android.library")
id("nowinandroid.android.library.jacoco")

@ -19,6 +19,8 @@ import com.google.protobuf.gradle.generateProtoTasks
import com.google.protobuf.gradle.protobuf
import com.google.protobuf.gradle.protoc
// TODO: Remove once https://youtrack.jetbrains.com/issue/KTIJ-19369 is fixed
@Suppress("DSL_SCOPE_VIOLATION")
plugins {
id("nowinandroid.android.library")
id("nowinandroid.android.library.jacoco")

@ -13,6 +13,8 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// TODO: Remove once https://youtrack.jetbrains.com/issue/KTIJ-19369 is fixed
@Suppress("DSL_SCOPE_VIOLATION")
plugins {
id("nowinandroid.android.library")
id("nowinandroid.android.library.jacoco")

@ -13,6 +13,8 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// TODO: Remove once https://youtrack.jetbrains.com/issue/KTIJ-19369 is fixed
@Suppress("DSL_SCOPE_VIOLATION")
plugins {
id("nowinandroid.android.library")
id("nowinandroid.android.library.jacoco")

@ -141,7 +141,6 @@ fun NewsResourceHeaderImage(
},
modifier = Modifier
.fillMaxWidth()
.clip(RoundedCornerShape(topEnd = 24.dp, topStart = 24.dp))
.height(180.dp),
contentScale = ContentScale.Crop,
model = headerImageUrl,

@ -47,7 +47,7 @@ The following diagram shows the events which occur and how data flows from the r
![Diagram showing how news resources are displayed on the For You screen](images/architecture-2-example.png "Diagram showing how news resources are displayed on the For You screen")
Here's what's happening in each step. The easiest way to find the associated code is to load the project into Android Studio and search for the text in the Code column (handy shortcut: tap SHIFT twice).
Here's what's happening in each step. The easiest way to find the associated code is to load the project into Android Studio and search for the text in the Code column (handy shortcut: tap <kbd>SHIFT</kbd> twice).
<table>
@ -276,18 +276,18 @@ View models receive streams of data as cold [flows](https://kotlin.github.io/kot
**Example: Displaying followed topics and authors**
The `FollowingViewModel` exposes `uiState` as a `StateFlow<FollowingUiState>`. This hot flow is created by combining four data streams:
The `InterestsViewModel` exposes `uiState` as a `StateFlow<InterestsUiState>`. This hot flow is created by combining four data streams:
* List of authors (getAuthorsStream)
* List of authors (`getAuthorsStream`)
* List of author IDs which the current user is following
* List of topics
* List of topic IDs which the current user is following
The list of `Author`s is mapped to a new list of `FollowableAuthor`s. `FollowableAuthor` is a wrapper for `Author` which also indicates whether the current user is following that author. The same transformation is applied for the list of `Topic`s.
The two new lists are used to create a `FollowingUiState.Interests` state which is exposed to the UI.
The two new lists are used to create a `InterestsUiState.Interests` state which is exposed to the UI.
### Processing user interactions
@ -296,7 +296,7 @@ User actions are communicated from UI elements to view models using regular meth
**Example: Following a topic**
The `FollowingScreen` takes a lambda expression named `followTopic` which is supplied from `FollowingViewModel.followTopic`. Each time the user taps on a topic to follow this method is called. The view model then processes this action by informing the topics repository.
The `InterestsScreen` takes a lambda expression named `followTopic` which is supplied from `InterestsViewModel.followTopic`. Each time the user taps on a topic to follow this method is called. The view model then processes this action by informing the topics repository.
## Further reading

@ -155,10 +155,10 @@ private fun AuthorHeader(author: Author) {
) {
AsyncImage(
modifier = Modifier
.padding(bottom = 12.dp)
.size(216.dp)
.align(Alignment.CenterHorizontally)
.clip(CircleShape)
.padding(bottom = 12.dp),
.clip(CircleShape),
contentScale = ContentScale.Crop,
model = author.imageUrl,
contentDescription = "Author profile picture",
@ -216,6 +216,7 @@ private fun AuthorToolbar(
}
val selected = uiState.isFollowed
NiaFilterChip(
modifier = Modifier.padding(horizontal = 16.dp),
checked = selected,
onCheckedChange = onFollowClick,
) {

@ -67,8 +67,8 @@ class ForYouScreenTest {
windowSizeClass = WindowSizeClass.calculateFromSize(
DpSize(maxWidth, maxHeight)
),
interestsSelectionState = ForYouInterestsSelectionState.Loading,
feedState = ForYouFeedState.Loading,
interestsSelectionState = ForYouInterestsSelectionUiState.Loading,
feedState = ForYouFeedUiState.Loading,
onAuthorCheckedChanged = { _, _ -> },
onTopicCheckedChanged = { _, _ -> },
saveFollowedTopics = {},
@ -92,7 +92,8 @@ class ForYouScreenTest {
windowSizeClass = WindowSizeClass.calculateFromSize(
DpSize(maxWidth, maxHeight)
),
interestsSelectionState = ForYouInterestsSelectionState.WithInterestsSelection(
interestsSelectionState =
ForYouInterestsSelectionUiState.WithInterestsSelection(
topics = listOf(
FollowableTopic(
topic = Topic(
@ -153,7 +154,7 @@ class ForYouScreenTest {
),
)
),
feedState = ForYouFeedState.Success(
feedState = ForYouFeedUiState.Success(
feed = emptyList()
),
onAuthorCheckedChanged = { _, _ -> },
@ -200,7 +201,8 @@ class ForYouScreenTest {
windowSizeClass = WindowSizeClass.calculateFromSize(
DpSize(maxWidth, maxHeight)
),
interestsSelectionState = ForYouInterestsSelectionState.WithInterestsSelection(
interestsSelectionState =
ForYouInterestsSelectionUiState.WithInterestsSelection(
topics = listOf(
FollowableTopic(
topic = Topic(
@ -261,7 +263,7 @@ class ForYouScreenTest {
),
),
),
feedState = ForYouFeedState.Success(
feedState = ForYouFeedUiState.Success(
feed = emptyList()
),
onAuthorCheckedChanged = { _, _ -> },
@ -314,7 +316,8 @@ class ForYouScreenTest {
windowSizeClass = WindowSizeClass.calculateFromSize(
DpSize(maxWidth, maxHeight)
),
interestsSelectionState = ForYouInterestsSelectionState.WithInterestsSelection(
interestsSelectionState =
ForYouInterestsSelectionUiState.WithInterestsSelection(
topics = listOf(
FollowableTopic(
topic = Topic(
@ -375,7 +378,7 @@ class ForYouScreenTest {
),
),
),
feedState = ForYouFeedState.Success(
feedState = ForYouFeedUiState.Success(
feed = emptyList()
),
onAuthorCheckedChanged = { _, _ -> },
@ -428,7 +431,8 @@ class ForYouScreenTest {
windowSizeClass = WindowSizeClass.calculateFromSize(
DpSize(maxWidth, maxHeight)
),
interestsSelectionState = ForYouInterestsSelectionState.WithInterestsSelection(
interestsSelectionState =
ForYouInterestsSelectionUiState.WithInterestsSelection(
topics = listOf(
FollowableTopic(
topic = Topic(
@ -489,7 +493,7 @@ class ForYouScreenTest {
),
),
),
feedState = ForYouFeedState.Loading,
feedState = ForYouFeedUiState.Loading,
onAuthorCheckedChanged = { _, _ -> },
onTopicCheckedChanged = { _, _ -> },
saveFollowedTopics = {},
@ -523,8 +527,8 @@ class ForYouScreenTest {
windowSizeClass = WindowSizeClass.calculateFromSize(
DpSize(maxWidth, maxHeight)
),
interestsSelectionState = ForYouInterestsSelectionState.NoInterestsSelection,
feedState = ForYouFeedState.Loading,
interestsSelectionState = ForYouInterestsSelectionUiState.NoInterestsSelection,
feedState = ForYouFeedUiState.Loading,
onAuthorCheckedChanged = { _, _ -> },
onTopicCheckedChanged = { _, _ -> },
saveFollowedTopics = {},
@ -643,8 +647,8 @@ class ForYouScreenTest {
ForYouScreen(
windowSizeClass = windowSizeClass,
interestsSelectionState = ForYouInterestsSelectionState.NoInterestsSelection,
feedState = ForYouFeedState.Success(
interestsSelectionState = ForYouInterestsSelectionUiState.NoInterestsSelection,
feedState = ForYouFeedUiState.Success(
feed = saveableNewsResources
),
onAuthorCheckedChanged = { _, _ -> },
@ -669,7 +673,10 @@ class ForYouScreenTest {
)
val firstFeedItem = composeTestRule
.onNodeWithText("Thanks for helping us reach 1M YouTube Subscribers", substring = true)
.onNodeWithText(
"Thanks for helping us reach 1M YouTube Subscribers",
substring = true
)
.assertHasClickAction()
.fetchSemanticsNode()

@ -16,6 +16,7 @@
package com.google.samples.apps.nowinandroid.feature.foryou
import androidx.compose.foundation.background
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
@ -30,7 +31,10 @@ import androidx.compose.foundation.lazy.LazyRow
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.selection.toggleable
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Person
import androidx.compose.material.ripple.rememberRipple
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
@ -104,15 +108,29 @@ fun AuthorItem(
stateDescription = "$followDescription ${author.name}"
}
) {
Box(modifier = Modifier.fillMaxWidth()) {
AsyncImage(
modifier = Modifier
Box(
modifier = Modifier.fillMaxWidth(),
contentAlignment = Alignment.Center,
) {
val authorImageModifier = Modifier
.size(48.dp)
.clip(CircleShape),
.clip(CircleShape)
if (author.imageUrl.isEmpty()) {
Icon(
modifier = authorImageModifier
.background(MaterialTheme.colorScheme.surface)
.padding(4.dp),
imageVector = Icons.Filled.Person,
contentDescription = null // decorative image
)
} else {
AsyncImage(
modifier = authorImageModifier,
model = author.imageUrl,
contentScale = ContentScale.Fit,
contentDescription = null
)
}
FollowButton(
following = following,
backgroundColor = MaterialTheme.colorScheme.surface,

@ -21,11 +21,11 @@ import com.google.samples.apps.nowinandroid.core.model.data.SaveableNewsResource
/**
* A sealed hierarchy describing the state of the feed on the for you screen.
*/
sealed interface ForYouFeedState {
sealed interface ForYouFeedUiState {
/**
* The feed is still loading.
*/
object Loading : ForYouFeedState
object Loading : ForYouFeedUiState
/**
* The feed is loaded with the given list of news resources.
@ -35,5 +35,5 @@ sealed interface ForYouFeedState {
* The list of news resources contained in this [PopulatedFeed].
*/
val feed: List<SaveableNewsResource>
) : ForYouFeedState
) : ForYouFeedUiState
}

@ -22,16 +22,16 @@ import com.google.samples.apps.nowinandroid.core.model.data.FollowableTopic
/**
* A sealed hierarchy describing the interests selection state for the for you screen.
*/
sealed interface ForYouInterestsSelectionState {
sealed interface ForYouInterestsSelectionUiState {
/**
* The interests selection state is loading.
*/
object Loading : ForYouInterestsSelectionState
object Loading : ForYouInterestsSelectionUiState
/**
* There is no interests selection state.
*/
object NoInterestsSelection : ForYouInterestsSelectionState
object NoInterestsSelection : ForYouInterestsSelectionUiState
/**
* There is a interests selection state, with the given lists of topics and authors.
@ -39,7 +39,7 @@ sealed interface ForYouInterestsSelectionState {
data class WithInterestsSelection(
val topics: List<FollowableTopic>,
val authors: List<FollowableAuthor>
) : ForYouInterestsSelectionState {
) : ForYouInterestsSelectionUiState {
/**
* True if the current in-progress selection can be saved.
*/

@ -50,8 +50,6 @@ import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Search
import androidx.compose.material.icons.outlined.AccountCircle
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
@ -90,6 +88,7 @@ import com.google.samples.apps.nowinandroid.core.model.data.SaveableNewsResource
import com.google.samples.apps.nowinandroid.core.model.data.Topic
import com.google.samples.apps.nowinandroid.core.ui.LoadingWheel
import com.google.samples.apps.nowinandroid.core.ui.NewsResourceCardExpanded
import com.google.samples.apps.nowinandroid.core.ui.component.NiaFilledButton
import com.google.samples.apps.nowinandroid.core.ui.component.NiaGradientBackground
import com.google.samples.apps.nowinandroid.core.ui.component.NiaToggleButton
import com.google.samples.apps.nowinandroid.core.ui.component.NiaTopAppBar
@ -123,8 +122,8 @@ fun ForYouRoute(
@Composable
fun ForYouScreen(
windowSizeClass: WindowSizeClass,
interestsSelectionState: ForYouInterestsSelectionState,
feedState: ForYouFeedState,
interestsSelectionState: ForYouInterestsSelectionUiState,
feedState: ForYouFeedUiState,
onTopicCheckedChanged: (String, Boolean) -> Unit,
onAuthorCheckedChanged: (String, Boolean) -> Unit,
saveFollowedTopics: () -> Unit,
@ -183,7 +182,7 @@ fun ForYouScreen(
// Avoid showing a second loading wheel if we already are for the interests
// selection
showLoadingUIIfLoading =
interestsSelectionState !is ForYouInterestsSelectionState.Loading,
interestsSelectionState !is ForYouInterestsSelectionUiState.Loading,
numberOfColumns = numberOfColumns,
onNewsResourcesCheckedChanged = onNewsResourcesCheckedChanged
)
@ -212,14 +211,14 @@ fun ForYouScreen(
* states.
*/
private fun LazyListScope.InterestsSelection(
interestsSelectionState: ForYouInterestsSelectionState,
interestsSelectionState: ForYouInterestsSelectionUiState,
showLoadingUIIfLoading: Boolean,
onAuthorCheckedChanged: (String, Boolean) -> Unit,
onTopicCheckedChanged: (String, Boolean) -> Unit,
saveFollowedTopics: () -> Unit
) {
when (interestsSelectionState) {
ForYouInterestsSelectionState.Loading -> {
ForYouInterestsSelectionUiState.Loading -> {
if (showLoadingUIIfLoading) {
item {
LoadingWheel(
@ -231,8 +230,8 @@ private fun LazyListScope.InterestsSelection(
}
}
}
ForYouInterestsSelectionState.NoInterestsSelection -> Unit
is ForYouInterestsSelectionState.WithInterestsSelection -> {
ForYouInterestsSelectionUiState.NoInterestsSelection -> Unit
is ForYouInterestsSelectionUiState.WithInterestsSelection -> {
item {
Text(
text = stringResource(R.string.onboarding_guidance_title),
@ -275,19 +274,15 @@ private fun LazyListScope.InterestsSelection(
horizontalArrangement = Arrangement.Center,
modifier = Modifier.fillMaxWidth()
) {
Button(
NiaFilledButton(
onClick = saveFollowedTopics,
enabled = interestsSelectionState.canSaveInterests,
modifier = Modifier
.padding(horizontal = 40.dp)
.width(364.dp),
colors = ButtonDefaults.buttonColors(
containerColor = MaterialTheme.colorScheme.onBackground
)
.width(364.dp)
) {
Text(
text = stringResource(R.string.done),
color = MaterialTheme.colorScheme.onPrimary
text = stringResource(R.string.done)
)
}
}
@ -298,7 +293,7 @@ private fun LazyListScope.InterestsSelection(
@Composable
private fun TopicSelection(
interestsSelectionState: ForYouInterestsSelectionState.WithInterestsSelection,
interestsSelectionState: ForYouInterestsSelectionUiState.WithInterestsSelection,
onTopicCheckedChanged: (String, Boolean) -> Unit,
modifier: Modifier = Modifier
) {
@ -412,13 +407,13 @@ fun TopicIcon(
* states.
*/
private fun LazyListScope.Feed(
feedState: ForYouFeedState,
feedState: ForYouFeedUiState,
showLoadingUIIfLoading: Boolean,
@IntRange(from = 1) numberOfColumns: Int,
onNewsResourcesCheckedChanged: (String, Boolean) -> Unit
) {
when (feedState) {
ForYouFeedState.Loading -> {
ForYouFeedUiState.Loading -> {
if (showLoadingUIIfLoading) {
item {
LoadingWheel(
@ -430,7 +425,7 @@ private fun LazyListScope.Feed(
}
}
}
is ForYouFeedState.Success -> {
is ForYouFeedUiState.Success -> {
items(
feedState.feed.chunked(numberOfColumns)
) { saveableNewsResources ->
@ -496,8 +491,8 @@ fun ForYouScreenLoading() {
NiaTheme {
ForYouScreen(
windowSizeClass = WindowSizeClass.calculateFromSize(DpSize(maxWidth, maxHeight)),
interestsSelectionState = ForYouInterestsSelectionState.Loading,
feedState = ForYouFeedState.Loading,
interestsSelectionState = ForYouInterestsSelectionUiState.Loading,
feedState = ForYouFeedUiState.Loading,
onTopicCheckedChanged = { _, _ -> },
onAuthorCheckedChanged = { _, _ -> },
saveFollowedTopics = {},
@ -517,7 +512,7 @@ fun ForYouScreenTopicSelection() {
NiaTheme {
ForYouScreen(
windowSizeClass = WindowSizeClass.calculateFromSize(DpSize(maxWidth, maxHeight)),
interestsSelectionState = ForYouInterestsSelectionState.WithInterestsSelection(
interestsSelectionState = ForYouInterestsSelectionUiState.WithInterestsSelection(
topics = listOf(
FollowableTopic(
topic = Topic(
@ -589,7 +584,7 @@ fun ForYouScreenTopicSelection() {
)
)
),
feedState = ForYouFeedState.Success(
feedState = ForYouFeedUiState.Success(
feed = saveableNewsResource,
),
onAuthorCheckedChanged = { _, _ -> },
@ -611,8 +606,8 @@ fun PopulatedFeed() {
NiaTheme {
ForYouScreen(
windowSizeClass = WindowSizeClass.calculateFromSize(DpSize(maxWidth, maxHeight)),
interestsSelectionState = ForYouInterestsSelectionState.NoInterestsSelection,
feedState = ForYouFeedState.Success(
interestsSelectionState = ForYouInterestsSelectionUiState.NoInterestsSelection,
feedState = ForYouFeedUiState.Success(
feed = saveableNewsResource
),
onTopicCheckedChanged = { _, _ -> },

@ -103,7 +103,7 @@ class ForYouViewModel @Inject constructor(
mutableStateOf<Set<String>>(emptySet())
}
val feedState: StateFlow<ForYouFeedState> =
val feedState: StateFlow<ForYouFeedUiState> =
combine(
followedInterestsState,
snapshotFlow { inProgressTopicSelection },
@ -114,7 +114,7 @@ class ForYouViewModel @Inject constructor(
when (followedInterestsUserState) {
// If we don't know the current selection state, emit loading.
Unknown -> flowOf<ForYouFeedState>(ForYouFeedState.Loading)
Unknown -> flowOf<ForYouFeedUiState>(ForYouFeedUiState.Loading)
// If the user has followed topics, use those followed topics to populate the feed
is FollowedInterests -> {
newsRepository.getNewsResourcesStream(
@ -126,7 +126,7 @@ class ForYouViewModel @Inject constructor(
// on the in-progress interests selections, if there are any.
None -> {
if (inProgressTopicSelection.isEmpty() && inProgressAuthorSelection.isEmpty()) {
flowOf<ForYouFeedState>(ForYouFeedState.Success(emptyList()))
flowOf<ForYouFeedUiState>(ForYouFeedUiState.Success(emptyList()))
} else {
newsRepository.getNewsResourcesStream(
filterTopicIds = inProgressTopicSelection,
@ -143,10 +143,10 @@ class ForYouViewModel @Inject constructor(
.stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(5_000),
initialValue = ForYouFeedState.Loading
initialValue = ForYouFeedUiState.Loading
)
val interestsSelectionState: StateFlow<ForYouInterestsSelectionState> =
val interestsSelectionState: StateFlow<ForYouInterestsSelectionUiState> =
combine(
followedInterestsState,
topicsRepository.getTopicsStream(),
@ -157,8 +157,8 @@ class ForYouViewModel @Inject constructor(
inProgressAuthorSelection ->
when (followedInterestsUserState) {
Unknown -> ForYouInterestsSelectionState.Loading
is FollowedInterests -> ForYouInterestsSelectionState.NoInterestsSelection
Unknown -> ForYouInterestsSelectionUiState.Loading
is FollowedInterests -> ForYouInterestsSelectionUiState.NoInterestsSelection
None -> {
val topics = availableTopics.map { topic ->
FollowableTopic(
@ -174,9 +174,9 @@ class ForYouViewModel @Inject constructor(
}
if (topics.isEmpty() && authors.isEmpty()) {
ForYouInterestsSelectionState.Loading
ForYouInterestsSelectionUiState.Loading
} else {
ForYouInterestsSelectionState.WithInterestsSelection(
ForYouInterestsSelectionUiState.WithInterestsSelection(
topics = topics,
authors = authors
)
@ -187,7 +187,7 @@ class ForYouViewModel @Inject constructor(
.stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(5_000),
initialValue = ForYouInterestsSelectionState.Loading
initialValue = ForYouInterestsSelectionUiState.Loading
)
fun updateTopicSelection(topicId: String, isChecked: Boolean) {
@ -245,7 +245,7 @@ class ForYouViewModel @Inject constructor(
private fun Flow<List<NewsResource>>.mapToFeedState(
savedNewsResources: Set<String>
): Flow<ForYouFeedState> =
): Flow<ForYouFeedUiState> =
filterNot { it.isEmpty() }
.map { newsResources ->
newsResources.map { newsResource ->
@ -255,5 +255,5 @@ private fun Flow<List<NewsResource>>.mapToFeedState(
)
}
}
.map<List<SaveableNewsResource>, ForYouFeedState>(ForYouFeedState::Success)
.onStart { emit(ForYouFeedState.Loading) }
.map<List<SaveableNewsResource>, ForYouFeedUiState>(ForYouFeedUiState::Success)
.onStart { emit(ForYouFeedUiState.Loading) }

@ -58,12 +58,12 @@ class ForYouViewModelTest {
}
/**
* A pairing of [ForYouInterestsSelectionState] and [ForYouFeedState] for ease of testing
* A pairing of [ForYouInterestsSelectionUiState] and [ForYouFeedUiState] for ease of testing
* state updates as a single flow.
*/
private data class ForYouUiState(
val interestsSelectionState: ForYouInterestsSelectionState,
val feedState: ForYouFeedState,
val interestsSelectionState: ForYouInterestsSelectionUiState,
val feedState: ForYouFeedUiState,
)
private val ForYouViewModel.uiState
@ -79,8 +79,8 @@ class ForYouViewModelTest {
viewModel.uiState.test {
assertEquals(
ForYouUiState(
ForYouInterestsSelectionState.Loading,
ForYouFeedState.Loading
ForYouInterestsSelectionUiState.Loading,
ForYouFeedUiState.Loading
),
awaitItem()
)
@ -93,8 +93,8 @@ class ForYouViewModelTest {
viewModel.uiState.test {
assertEquals(
ForYouUiState(
ForYouInterestsSelectionState.Loading,
ForYouFeedState.Loading
ForYouInterestsSelectionUiState.Loading,
ForYouFeedUiState.Loading
),
awaitItem()
)
@ -109,8 +109,8 @@ class ForYouViewModelTest {
viewModel.uiState.test {
assertEquals(
ForYouUiState(
ForYouInterestsSelectionState.Loading,
ForYouFeedState.Loading
ForYouInterestsSelectionUiState.Loading,
ForYouFeedUiState.Loading
),
awaitItem()
)
@ -125,8 +125,8 @@ class ForYouViewModelTest {
viewModel.uiState.test {
assertEquals(
ForYouUiState(
ForYouInterestsSelectionState.Loading,
ForYouFeedState.Loading
ForYouInterestsSelectionUiState.Loading,
ForYouFeedUiState.Loading
),
awaitItem()
)
@ -141,8 +141,8 @@ class ForYouViewModelTest {
viewModel.uiState.test {
assertEquals(
ForYouUiState(
ForYouInterestsSelectionState.Loading,
ForYouFeedState.Loading
ForYouInterestsSelectionUiState.Loading,
ForYouFeedUiState.Loading
),
awaitItem()
)
@ -166,7 +166,7 @@ class ForYouViewModelTest {
assertEquals(
ForYouUiState(
interestsSelectionState =
ForYouInterestsSelectionState.WithInterestsSelection(
ForYouInterestsSelectionUiState.WithInterestsSelection(
topics = listOf(
FollowableTopic(
topic = Topic(
@ -238,7 +238,7 @@ class ForYouViewModelTest {
)
),
),
feedState = ForYouFeedState.Success(
feedState = ForYouFeedUiState.Success(
feed = emptyList()
)
),
@ -263,7 +263,7 @@ class ForYouViewModelTest {
assertEquals(
ForYouUiState(
interestsSelectionState =
ForYouInterestsSelectionState.WithInterestsSelection(
ForYouInterestsSelectionUiState.WithInterestsSelection(
topics = listOf(
FollowableTopic(
topic = Topic(
@ -335,7 +335,7 @@ class ForYouViewModelTest {
)
),
),
feedState = ForYouFeedState.Success(
feedState = ForYouFeedUiState.Success(
feed = emptyList()
)
),
@ -359,8 +359,8 @@ class ForYouViewModelTest {
assertEquals(
ForYouUiState(
interestsSelectionState =
ForYouInterestsSelectionState.NoInterestsSelection,
feedState = ForYouFeedState.Loading
ForYouInterestsSelectionUiState.NoInterestsSelection,
feedState = ForYouFeedUiState.Loading
),
awaitItem()
)
@ -370,8 +370,8 @@ class ForYouViewModelTest {
assertEquals(
ForYouUiState(
interestsSelectionState =
ForYouInterestsSelectionState.NoInterestsSelection,
feedState = ForYouFeedState.Success(
ForYouInterestsSelectionUiState.NoInterestsSelection,
feedState = ForYouFeedUiState.Success(
feed = sampleNewsResources.map {
SaveableNewsResource(
newsResource = it,
@ -400,8 +400,8 @@ class ForYouViewModelTest {
assertEquals(
ForYouUiState(
interestsSelectionState =
ForYouInterestsSelectionState.NoInterestsSelection,
feedState = ForYouFeedState.Loading
ForYouInterestsSelectionUiState.NoInterestsSelection,
feedState = ForYouFeedUiState.Loading
),
awaitItem()
)
@ -411,8 +411,8 @@ class ForYouViewModelTest {
assertEquals(
ForYouUiState(
interestsSelectionState =
ForYouInterestsSelectionState.NoInterestsSelection,
feedState = ForYouFeedState.Success(
ForYouInterestsSelectionUiState.NoInterestsSelection,
feedState = ForYouFeedUiState.Success(
feed = sampleNewsResources.map {
SaveableNewsResource(
newsResource = it,
@ -445,7 +445,7 @@ class ForYouViewModelTest {
assertEquals(
ForYouUiState(
interestsSelectionState =
ForYouInterestsSelectionState.WithInterestsSelection(
ForYouInterestsSelectionUiState.WithInterestsSelection(
topics = listOf(
FollowableTopic(
topic = Topic(
@ -517,7 +517,7 @@ class ForYouViewModelTest {
)
),
),
feedState = ForYouFeedState.Success(
feedState = ForYouFeedUiState.Success(
feed = emptyList(),
)
),
@ -526,7 +526,7 @@ class ForYouViewModelTest {
assertEquals(
ForYouUiState(
interestsSelectionState =
ForYouInterestsSelectionState.WithInterestsSelection(
ForYouInterestsSelectionUiState.WithInterestsSelection(
topics = listOf(
FollowableTopic(
topic = Topic(
@ -598,14 +598,14 @@ class ForYouViewModelTest {
)
),
),
feedState = ForYouFeedState.Loading
feedState = ForYouFeedUiState.Loading
),
awaitItem()
)
assertEquals(
ForYouUiState(
interestsSelectionState =
ForYouInterestsSelectionState.WithInterestsSelection(
ForYouInterestsSelectionUiState.WithInterestsSelection(
topics = listOf(
FollowableTopic(
topic = Topic(
@ -677,7 +677,7 @@ class ForYouViewModelTest {
)
),
),
feedState = ForYouFeedState.Success(
feedState = ForYouFeedUiState.Success(
feed = listOf(
SaveableNewsResource(
newsResource = sampleNewsResources[1],
@ -714,7 +714,7 @@ class ForYouViewModelTest {
assertEquals(
ForYouUiState(
interestsSelectionState =
ForYouInterestsSelectionState.WithInterestsSelection(
ForYouInterestsSelectionUiState.WithInterestsSelection(
topics = listOf(
FollowableTopic(
topic = Topic(
@ -786,7 +786,7 @@ class ForYouViewModelTest {
)
),
),
feedState = ForYouFeedState.Success(
feedState = ForYouFeedUiState.Success(
feed = emptyList(),
)
),
@ -795,7 +795,7 @@ class ForYouViewModelTest {
assertEquals(
ForYouUiState(
interestsSelectionState =
ForYouInterestsSelectionState.WithInterestsSelection(
ForYouInterestsSelectionUiState.WithInterestsSelection(
topics = listOf(
FollowableTopic(
topic = Topic(
@ -867,14 +867,14 @@ class ForYouViewModelTest {
)
),
),
feedState = ForYouFeedState.Loading
feedState = ForYouFeedUiState.Loading
),
awaitItem()
)
assertEquals(
ForYouUiState(
interestsSelectionState =
ForYouInterestsSelectionState.WithInterestsSelection(
ForYouInterestsSelectionUiState.WithInterestsSelection(
topics = listOf(
FollowableTopic(
topic = Topic(
@ -946,7 +946,7 @@ class ForYouViewModelTest {
)
),
),
feedState = ForYouFeedState.Success(
feedState = ForYouFeedUiState.Success(
feed = listOf(
SaveableNewsResource(
newsResource = sampleNewsResources[1],
@ -981,7 +981,7 @@ class ForYouViewModelTest {
assertEquals(
ForYouUiState(
interestsSelectionState =
ForYouInterestsSelectionState.WithInterestsSelection(
ForYouInterestsSelectionUiState.WithInterestsSelection(
topics = listOf(
FollowableTopic(
topic = Topic(
@ -1053,7 +1053,7 @@ class ForYouViewModelTest {
)
),
),
feedState = ForYouFeedState.Success(
feedState = ForYouFeedUiState.Success(
feed = emptyList()
)
),
@ -1079,7 +1079,7 @@ class ForYouViewModelTest {
assertEquals(
ForYouUiState(
interestsSelectionState =
ForYouInterestsSelectionState.WithInterestsSelection(
ForYouInterestsSelectionUiState.WithInterestsSelection(
topics = listOf(
FollowableTopic(
topic = Topic(
@ -1151,7 +1151,7 @@ class ForYouViewModelTest {
)
),
),
feedState = ForYouFeedState.Success(
feedState = ForYouFeedUiState.Success(
feed = emptyList()
)
),
@ -1181,8 +1181,8 @@ class ForYouViewModelTest {
assertEquals(
ForYouUiState(
interestsSelectionState =
ForYouInterestsSelectionState.NoInterestsSelection,
feedState = ForYouFeedState.Success(
ForYouInterestsSelectionUiState.NoInterestsSelection,
feedState = ForYouFeedUiState.Success(
feed = listOf(
SaveableNewsResource(
newsResource = sampleNewsResources[1],
@ -1223,8 +1223,8 @@ class ForYouViewModelTest {
assertEquals(
ForYouUiState(
interestsSelectionState =
ForYouInterestsSelectionState.NoInterestsSelection,
feedState = ForYouFeedState.Success(
ForYouInterestsSelectionUiState.NoInterestsSelection,
feedState = ForYouFeedUiState.Success(
feed = listOf(
SaveableNewsResource(
newsResource = sampleNewsResources[0],
@ -1262,8 +1262,8 @@ class ForYouViewModelTest {
assertEquals(
ForYouUiState(
interestsSelectionState =
ForYouInterestsSelectionState.NoInterestsSelection,
feedState = ForYouFeedState.Success(
ForYouInterestsSelectionUiState.NoInterestsSelection,
feedState = ForYouFeedUiState.Success(
feed = listOf(
SaveableNewsResource(
newsResource = sampleNewsResources[1],
@ -1305,7 +1305,7 @@ class ForYouViewModelTest {
assertEquals(
ForYouUiState(
interestsSelectionState =
ForYouInterestsSelectionState.WithInterestsSelection(
ForYouInterestsSelectionUiState.WithInterestsSelection(
topics = listOf(
FollowableTopic(
topic = Topic(
@ -1377,7 +1377,7 @@ class ForYouViewModelTest {
)
)
),
feedState = ForYouFeedState.Success(
feedState = ForYouFeedUiState.Success(
feed = emptyList()
)
),
@ -1409,7 +1409,7 @@ class ForYouViewModelTest {
assertEquals(
ForYouUiState(
interestsSelectionState =
ForYouInterestsSelectionState.WithInterestsSelection(
ForYouInterestsSelectionUiState.WithInterestsSelection(
topics = listOf(
FollowableTopic(
topic = Topic(
@ -1481,7 +1481,7 @@ class ForYouViewModelTest {
)
)
),
feedState = ForYouFeedState.Success(
feedState = ForYouFeedUiState.Success(
feed = emptyList()
)
),
@ -1506,8 +1506,8 @@ class ForYouViewModelTest {
assertEquals(
ForYouUiState(
interestsSelectionState =
ForYouInterestsSelectionState.NoInterestsSelection,
feedState = ForYouFeedState.Success(
ForYouInterestsSelectionUiState.NoInterestsSelection,
feedState = ForYouFeedUiState.Success(
feed = listOf(
SaveableNewsResource(
newsResource = sampleNewsResources[1],

@ -16,6 +16,7 @@
package com.google.samples.apps.nowinandroid.feature.interests
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
@ -23,8 +24,8 @@ import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.material.icons.Icons.Filled
import androidx.compose.material.icons.filled.Android
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Person
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
@ -32,7 +33,6 @@ import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
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.tooling.preview.Preview
import androidx.compose.ui.unit.Dp
@ -105,10 +105,11 @@ private fun InterestContent(name: String, description: String, modifier: Modifie
private fun InterestsIcon(topicImageUrl: String, modifier: Modifier = Modifier) {
if (topicImageUrl.isEmpty()) {
Icon(
imageVector = Filled.Android,
tint = Color.Magenta,
contentDescription = null,
modifier = modifier
.background(MaterialTheme.colorScheme.surface)
.padding(4.dp),
imageVector = Icons.Filled.Person,
contentDescription = null, // decorative image
)
} else {
AsyncImage(

@ -1,20 +1,20 @@
[versions]
accompanist = "0.21.4-beta"
accompanist = "0.24.8-beta"
androidDesugarJdkLibs = "1.1.5"
androidGradlePlugin = "7.1.2"
androidxActivity = "1.4.0"
androidxAppCompat = "1.3.0"
androidxCompose = "1.2.0-alpha08"
androidxComposeMaterial3 = "1.0.0-alpha10"
androidxCompose = "1.2.0-beta01"
androidxComposeMaterial3 = "1.0.0-alpha11"
androidxCore = "1.7.0"
androidxCustomView = "1.0.0-alpha01"
androidxDataStore = "1.0.0"
androidxEspresso = "3.3.0"
androidxHiltNavigationCompose = "1.0.0-rc01"
androidxHiltNavigationCompose = "1.0.0"
androidxLifecycle = "2.5.0-beta01"
androidxMacroBenchmark = "1.1.0-rc01"
androidxMacroBenchmark = "1.1.0-rc02"
androidxNavigation = "2.4.0-rc01"
androidxProfileinstaller = "1.2.0-alpha02"
androidxProfileinstaller = "1.2.0-beta01"
androidxSavedState = "1.1.0"
androidxStartup = "1.1.1"
androidxWindowManager = "1.0.0"
@ -27,12 +27,12 @@ hilt = "2.41"
hiltExt = "1.0.0"
jacoco = "0.8.7"
junit4 = "4.13"
kotlin = "1.6.20"
kotlin = "1.6.21"
kotlinxCoroutines = "1.6.0"
kotlinxCoroutinesTest = "1.6.0"
kotlinxDatetime = "0.3.1"
kotlinxSerializationJson = "1.3.1"
ksp = "1.6.20-1.0.5"
ksp = "1.6.21-1.0.5"
ktlint = "0.43.0"
material3 = "1.5.0-alpha05"
okhttp = "4.9.3"

Loading…
Cancel
Save