From ec6e902c0ff2e376e268fe1bcf54afd156014029 Mon Sep 17 00:00:00 2001 From: mlykotom Date: Tue, 6 Dec 2022 10:28:25 +0100 Subject: [PATCH 01/37] Waiting for topic selection Change-Id: I44226a7c5e693ee92eed27070c09cd4e0751e674 --- .../google/samples/apps/nowinandroid/foryou/ForYouActions.kt | 5 +++-- .../samples/apps/nowinandroid/feature/foryou/ForYouScreen.kt | 5 ++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ForYouActions.kt b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ForYouActions.kt index 96ee040cc..bba1218c1 100644 --- a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ForYouActions.kt +++ b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ForYouActions.kt @@ -27,8 +27,9 @@ fun MacrobenchmarkScope.forYouWaitForContent() { device.wait(Until.gone(By.res("forYou:loadingWheel")), 5_000) // Sometimes, the loading wheel is gone, but the content is not loaded yet // So we'll wait here for authors to be sure - val obj = device.findObject(By.res("forYou:authors")) - obj.wait(untilHasChildren(), 30_000) + val obj = device.findObject(By.res("forYou:topicSelection")) + // Timeout here is quite big, because sometimes data loading takes a long time! + obj.wait(untilHasChildren(), 60_000) } fun MacrobenchmarkScope.forYouScrollFeedDownUp() { diff --git a/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreen.kt b/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreen.kt index 1420a7e47..8fe21dbab 100644 --- a/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreen.kt +++ b/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreen.kt @@ -282,7 +282,9 @@ private fun TopicSelection( modifier: Modifier = Modifier ) = trace("TopicSelection") { val lazyGridState = rememberLazyGridState() - TrackScrollJank(scrollableState = lazyGridState, stateName = "forYou:TopicSelection") + val topicSelectionTestTag = "forYou:topicSelection" + + TrackScrollJank(scrollableState = lazyGridState, stateName = topicSelectionTestTag) LazyHorizontalGrid( state = lazyGridState, @@ -302,6 +304,7 @@ private fun TopicSelection( // The maximum of these two bounds is therefore a valid upper bound in all cases. .heightIn(max = max(240.dp, with(LocalDensity.current) { 240.sp.toDp() })) .fillMaxWidth() + .testTag(topicSelectionTestTag) ) { items(onboardingUiState.topics) { SingleTopicButton( From 039ec8e959a34316835b190b4f3a73f502054e7b Mon Sep 17 00:00:00 2001 From: mlykotom Date: Tue, 6 Dec 2022 10:45:03 +0100 Subject: [PATCH 02/37] Select topics to be able to scroll Change-Id: Ib7a2a3e87ab3b5d8da6c0fc1b77855f46ef5236a --- .../BaselineProfileGenerator.kt | 2 + .../apps/nowinandroid/foryou/ForYouActions.kt | 41 ++++++++++++++++++- 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/baselineprofile/BaselineProfileGenerator.kt b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/baselineprofile/BaselineProfileGenerator.kt index f9399d4c3..58380d437 100644 --- a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/baselineprofile/BaselineProfileGenerator.kt +++ b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/baselineprofile/BaselineProfileGenerator.kt @@ -21,6 +21,7 @@ import androidx.benchmark.macro.junit4.BaselineProfileRule import androidx.test.uiautomator.By import com.google.samples.apps.nowinandroid.PACKAGE_NAME import com.google.samples.apps.nowinandroid.foryou.forYouScrollFeedDownUp +import com.google.samples.apps.nowinandroid.foryou.forYouSelectTopics import com.google.samples.apps.nowinandroid.foryou.forYouWaitForContent import com.google.samples.apps.nowinandroid.interests.interestsScrollPeopleDownUp import com.google.samples.apps.nowinandroid.interests.interestsScrollTopicsDownUp @@ -46,6 +47,7 @@ class BaselineProfileGenerator { // Scroll the feed critical user journey forYouWaitForContent() + forYouSelectTopics(true) forYouScrollFeedDownUp() // Navigate to saved screen diff --git a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ForYouActions.kt b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ForYouActions.kt index bba1218c1..8d66efc9c 100644 --- a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ForYouActions.kt +++ b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ForYouActions.kt @@ -23,15 +23,52 @@ import androidx.test.uiautomator.untilHasChildren import com.google.samples.apps.nowinandroid.flingElementDownUp fun MacrobenchmarkScope.forYouWaitForContent() { - // Wait until content is loaded by checking if authors are loaded + // Wait until content is loaded by checking if topics are loaded device.wait(Until.gone(By.res("forYou:loadingWheel")), 5_000) // Sometimes, the loading wheel is gone, but the content is not loaded yet - // So we'll wait here for authors to be sure + // So we'll wait here for topics to be sure val obj = device.findObject(By.res("forYou:topicSelection")) // Timeout here is quite big, because sometimes data loading takes a long time! obj.wait(untilHasChildren(), 60_000) } +/** + * Selects some topics, which will show the feed content for them. + * [recheckTopicsIfChecked] Topics may be already checked from the previous iteration. + */ +fun MacrobenchmarkScope.forYouSelectTopics(recheckTopicsIfChecked: Boolean = false) { + val topics = device.findObject(By.res("forYou:topicSelection")) + + // Set gesture margin from sides not to trigger system gesture navigation + val horizontalMargin = 10 * topics.visibleBounds.width() / 100 + topics.setGestureMargins(horizontalMargin, 0, horizontalMargin, 0) + + // Select some topics to show some feed content + repeat(3) { index -> + val topic = topics.children[index % topics.childCount] + + when { + // Topic wasn't checked, so just do that + !topic.isChecked -> { + topic.click() + device.waitForIdle() + } + + // Topic was checked already and we want to recheck it, so just do it twice + recheckTopicsIfChecked -> { + repeat(2) { + topic.click() + device.waitForIdle() + } + } + + else -> { + // Topic is checked, but we don't recheck it + } + } + } +} + fun MacrobenchmarkScope.forYouScrollFeedDownUp() { val feedList = device.findObject(By.res("forYou:feed")) device.flingElementDownUp(feedList) From 0018144827c9f1bfe83918044537ed091a18f71c Mon Sep 17 00:00:00 2001 From: mlykotom Date: Tue, 6 Dec 2022 11:21:05 +0100 Subject: [PATCH 03/37] LoadingWheel testTag for every loading wheel Change-Id: I7728e1717925abdfb607e93f3d48226910d42c0d --- .../google/samples/apps/nowinandroid/foryou/ForYouActions.kt | 2 +- .../nowinandroid/core/designsystem/component/LoadingWheel.kt | 2 ++ .../samples/apps/nowinandroid/feature/foryou/ForYouScreen.kt | 3 +-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ForYouActions.kt b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ForYouActions.kt index 8d66efc9c..ef037e355 100644 --- a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ForYouActions.kt +++ b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ForYouActions.kt @@ -24,7 +24,7 @@ import com.google.samples.apps.nowinandroid.flingElementDownUp fun MacrobenchmarkScope.forYouWaitForContent() { // Wait until content is loaded by checking if topics are loaded - device.wait(Until.gone(By.res("forYou:loadingWheel")), 5_000) + device.wait(Until.gone(By.res("loadingWheel")), 5_000) // Sometimes, the loading wheel is gone, but the content is not loaded yet // So we'll wait here for topics to be sure val obj = device.findObject(By.res("forYou:topicSelection")) diff --git a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/LoadingWheel.kt b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/LoadingWheel.kt index c32637b69..836558021 100644 --- a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/LoadingWheel.kt +++ b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/LoadingWheel.kt @@ -43,6 +43,7 @@ import androidx.compose.ui.graphics.StrokeCap import androidx.compose.ui.graphics.drawscope.rotate import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.platform.LocalInspectionMode +import androidx.compose.ui.platform.testTag import androidx.compose.ui.semantics.contentDescription import androidx.compose.ui.semantics.semantics import androidx.compose.ui.unit.dp @@ -109,6 +110,7 @@ fun NiaLoadingWheel( .padding(8.dp) .graphicsLayer { rotationZ = rotationAnim } .semantics { contentDescription = contentDesc } + .testTag("loadingWheel"), ) { repeat(NUM_OF_LINES) { index -> rotate(degrees = index * 30f) { diff --git a/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreen.kt b/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreen.kt index 8fe21dbab..caf3dad0f 100644 --- a/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreen.kt +++ b/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreen.kt @@ -204,8 +204,7 @@ internal fun ForYouScreen( ) { NiaOverlayLoadingWheel( modifier = Modifier - .align(Alignment.Center) - .testTag("forYou:loadingWheel"), + .align(Alignment.Center), contentDesc = loadingContentDescription ) } From 90674c0c079caa4be449708ea3d69a4bc8f8e2d5 Mon Sep 17 00:00:00 2001 From: mlykotom Date: Tue, 6 Dec 2022 11:21:24 +0100 Subject: [PATCH 04/37] Add niaTopAppBar testTag Change-Id: I02a207675e106137fe005140965c96f1b50f98ce --- .../nowinandroid/core/designsystem/component/TopAppBar.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/TopAppBar.kt b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/TopAppBar.kt index 2175a1684..c7bb74ccf 100644 --- a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/TopAppBar.kt +++ b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/TopAppBar.kt @@ -28,6 +28,7 @@ import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import com.google.samples.apps.nowinandroid.core.designsystem.icon.NiaIcons @@ -66,7 +67,7 @@ fun NiaTopAppBar( } }, colors = colors, - modifier = modifier + modifier = modifier.testTag("niaTopAppBar"), ) } @@ -95,7 +96,7 @@ fun NiaTopAppBar( } }, colors = colors, - modifier = modifier, + modifier = modifier.testTag("niaTopAppBar"), ) } From db5fe96c4ccf247190db8316ee7632ffb3c024cb Mon Sep 17 00:00:00 2001 From: mlykotom Date: Tue, 6 Dec 2022 11:21:45 +0100 Subject: [PATCH 05/37] Fix interests actions Change-Id: I3583d6c7c904f0cf1bf21892721551f41d89796f --- .../baselineprofile/BaselineProfileGenerator.kt | 12 ++---------- .../nowinandroid/interests/InterestsActions.kt | 15 ++++++++++----- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/baselineprofile/BaselineProfileGenerator.kt b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/baselineprofile/BaselineProfileGenerator.kt index 58380d437..334ab5418 100644 --- a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/baselineprofile/BaselineProfileGenerator.kt +++ b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/baselineprofile/BaselineProfileGenerator.kt @@ -23,7 +23,7 @@ import com.google.samples.apps.nowinandroid.PACKAGE_NAME import com.google.samples.apps.nowinandroid.foryou.forYouScrollFeedDownUp import com.google.samples.apps.nowinandroid.foryou.forYouSelectTopics import com.google.samples.apps.nowinandroid.foryou.forYouWaitForContent -import com.google.samples.apps.nowinandroid.interests.interestsScrollPeopleDownUp +import com.google.samples.apps.nowinandroid.interests.goToInterestsScreen import com.google.samples.apps.nowinandroid.interests.interestsScrollTopicsDownUp import org.junit.Rule import org.junit.Test @@ -57,15 +57,7 @@ class BaselineProfileGenerator { // bookmarksScrollFeedDownUp() // Navigate to interests screen - device.findObject(By.text("Interests")).click() - device.waitForIdle() - + goToInterestsScreen() interestsScrollTopicsDownUp() - - // Navigate to people tab - device.findObject(By.text("People")).click() - device.waitForIdle() - - interestsScrollPeopleDownUp() } } diff --git a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/interests/InterestsActions.kt b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/interests/InterestsActions.kt index b68dfea26..e595ae4e4 100644 --- a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/interests/InterestsActions.kt +++ b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/interests/InterestsActions.kt @@ -21,16 +21,21 @@ import androidx.test.uiautomator.By import androidx.test.uiautomator.Until import com.google.samples.apps.nowinandroid.flingElementDownUp +fun MacrobenchmarkScope.goToInterestsScreen() { + device.findObject(By.text("Interests")).click() + device.waitForIdle() + // Wait until interests are shown on screen + val topAppBar = device.findObject(By.res("niaTopAppBar")) + topAppBar.wait(Until.hasObject(By.text("Interests")), 2_000) + // Wait until content is loaded by checking if interests are loaded + device.wait(Until.gone(By.res("loadingWheel")), 5_000) +} + fun MacrobenchmarkScope.interestsScrollTopicsDownUp() { val topicsList = device.findObject(By.res("interests:topics")) device.flingElementDownUp(topicsList) } -fun MacrobenchmarkScope.interestsScrollPeopleDownUp() { - val peopleList = device.findObject(By.res("interests:people")) - device.flingElementDownUp(peopleList) -} - fun MacrobenchmarkScope.interestsWaitForTopics() { device.wait(Until.hasObject(By.text("Accessibility")), 30_000) } From 5687c8d33a7f12fc30ff7cbeae2ee381519ec6c8 Mon Sep 17 00:00:00 2001 From: mlykotom Date: Tue, 6 Dec 2022 11:22:02 +0100 Subject: [PATCH 06/37] Fix bookmarks actions Change-Id: I415d651414d68a312498d5faff799d72145a53ed --- .../baselineprofile/BaselineProfileGenerator.kt | 5 ++--- .../apps/nowinandroid/bookmarks/BookmarksActions.kt | 9 +++++++++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/baselineprofile/BaselineProfileGenerator.kt b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/baselineprofile/BaselineProfileGenerator.kt index 334ab5418..3dfafd647 100644 --- a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/baselineprofile/BaselineProfileGenerator.kt +++ b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/baselineprofile/BaselineProfileGenerator.kt @@ -18,8 +18,8 @@ package com.google.samples.apps.nowinandroid.baselineprofile import androidx.benchmark.macro.ExperimentalBaselineProfilesApi import androidx.benchmark.macro.junit4.BaselineProfileRule -import androidx.test.uiautomator.By import com.google.samples.apps.nowinandroid.PACKAGE_NAME +import com.google.samples.apps.nowinandroid.bookmarks.goToBookmarksScreen import com.google.samples.apps.nowinandroid.foryou.forYouScrollFeedDownUp import com.google.samples.apps.nowinandroid.foryou.forYouSelectTopics import com.google.samples.apps.nowinandroid.foryou.forYouWaitForContent @@ -51,8 +51,7 @@ class BaselineProfileGenerator { forYouScrollFeedDownUp() // Navigate to saved screen - device.findObject(By.text("Saved")).click() - device.waitForIdle() + goToBookmarksScreen() // TODO: we need to implement adding stuff to bookmarks before able to scroll it // bookmarksScrollFeedDownUp() diff --git a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/bookmarks/BookmarksActions.kt b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/bookmarks/BookmarksActions.kt index b2e99d8cc..83ad48398 100644 --- a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/bookmarks/BookmarksActions.kt +++ b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/bookmarks/BookmarksActions.kt @@ -18,8 +18,17 @@ package com.google.samples.apps.nowinandroid.bookmarks import androidx.benchmark.macro.MacrobenchmarkScope import androidx.test.uiautomator.By +import androidx.test.uiautomator.Until import com.google.samples.apps.nowinandroid.flingElementDownUp +fun MacrobenchmarkScope.goToBookmarksScreen() { + device.findObject(By.text("Saved")).click() + device.waitForIdle() + // Wait until saved title are shown on screen + val topAppBar = device.findObject(By.res("niaTopAppBar")) + topAppBar.wait(Until.hasObject(By.text("Saved")), 2_000) +} + fun MacrobenchmarkScope.bookmarksScrollFeedDownUp() { val feedList = device.findObject(By.res("bookmarks:feed")) device.flingElementDownUp(feedList) From 034a6c40437cf6d20722dd87132d39ad442d5793 Mon Sep 17 00:00:00 2001 From: mlykotom Date: Tue, 6 Dec 2022 11:22:07 +0100 Subject: [PATCH 07/37] Fix checking for selected topic Change-Id: If86541613daf44e552df4309243309f80086230a --- .../samples/apps/nowinandroid/foryou/ForYouActions.kt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ForYouActions.kt b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ForYouActions.kt index ef037e355..25009223e 100644 --- a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ForYouActions.kt +++ b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ForYouActions.kt @@ -45,11 +45,14 @@ fun MacrobenchmarkScope.forYouSelectTopics(recheckTopicsIfChecked: Boolean = fal // Select some topics to show some feed content repeat(3) { index -> - val topic = topics.children[index % topics.childCount] + // Selecting topics that are in the first column + val topic = topics.children[(2 * index) % topics.childCount] + // Find the checkable element to figure out whether it's checked or not + val topicCheckIcon = topic.findObject(By.checkable(true)) when { // Topic wasn't checked, so just do that - !topic.isChecked -> { + !topicCheckIcon.isChecked -> { topic.click() device.waitForIdle() } From 1b9ed220beb6623e3401dd4c680969960ce8d98b Mon Sep 17 00:00:00 2001 From: mlykotom Date: Tue, 6 Dec 2022 11:41:23 +0100 Subject: [PATCH 08/37] Regenerate profile without people Change-Id: Ia412617ac2e4212b7b9b3a3fa6f39541e53584c4 --- app/src/main/baseline-prof.txt | 2437 +++++++++++--------------------- 1 file changed, 830 insertions(+), 1607 deletions(-) diff --git a/app/src/main/baseline-prof.txt b/app/src/main/baseline-prof.txt index ea15a06b9..9aae59d60 100644 --- a/app/src/main/baseline-prof.txt +++ b/app/src/main/baseline-prof.txt @@ -1,99 +1,128 @@ +HPLandroidx/compose/animation/FlingCalculator$FlingInfo;->(FFJ)V HPLandroidx/compose/animation/FlingCalculator;->flingInfo(F)Landroidx/compose/animation/FlingCalculator$FlingInfo; +HPLandroidx/compose/animation/FlingCalculator;->getSplineDeceleration(F)D +HPLandroidx/compose/animation/SplineBasedFloatDecayAnimationSpec;->getValueFromNanos(FFJ)F HPLandroidx/compose/animation/SplineBasedFloatDecayAnimationSpec;->getVelocityFromNanos(FJ)F +HPLandroidx/compose/animation/core/DecayAnimation;->getValueFromNanos(J)Ljava/lang/Object; +HPLandroidx/compose/animation/core/DecayAnimation;->getVelocityVectorFromNanos(J)Landroidx/compose/animation/core/AnimationVector; +HPLandroidx/compose/animation/core/VectorConvertersKt$DpToVector$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/animation/core/VectorizedFloatDecaySpec;->getValueFromNanos(JLandroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector; HPLandroidx/compose/animation/core/VectorizedFloatDecaySpec;->getVelocityFromNanos(JLandroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector; HPLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->consumePostScroll-OMhpSzk(JJI)V HPLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->consumePreScroll-OzD1aCk(J)J -HPLandroidx/compose/foundation/ClickableKt$clickable$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +HPLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->isEnabled()Z +HPLandroidx/compose/foundation/ScrollKt$scroll$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/gestures/DefaultFlingBehavior$performFling$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HPLandroidx/compose/foundation/gestures/DefaultScrollableState$scrollScope$1;->scrollBy(F)F HPLandroidx/compose/foundation/gestures/ScrollingLogic$doFlingAnimation$2$outerScopeScroll$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/gestures/ScrollingLogic$doFlingAnimation$2$scope$1;->scrollBy(F)F HPLandroidx/compose/foundation/gestures/ScrollingLogic;->dispatchScroll-3eAAhYA(Landroidx/compose/foundation/gestures/ScrollScope;JI)J -HPLandroidx/compose/foundation/lazy/LazyListScopeImpl$item$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -HPLandroidx/compose/foundation/lazy/LazyListState$scrollableState$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HPLandroidx/compose/foundation/gestures/ScrollingLogic;->toFloat-k-4lQ0M(J)F +HPLandroidx/compose/foundation/gestures/ScrollingLogic;->toOffset-tuRUvjQ(F)J +HPLandroidx/compose/foundation/lazy/LazyListKt$rememberLazyListMeasurePolicy$1$1$measuredItemProvider$1;->createItem-HK0c1C0(ILjava/lang/Object;Ljava/util/List;)Landroidx/compose/foundation/lazy/LazyMeasuredItem; +HPLandroidx/compose/foundation/lazy/LazyListKt$rememberLazyListMeasurePolicy$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +HPLandroidx/compose/foundation/lazy/LazyMeasuredItem;->(ILjava/util/List;ZLandroidx/compose/ui/Alignment$Horizontal;Landroidx/compose/ui/Alignment$Vertical;Landroidx/compose/ui/unit/LayoutDirection;ZIILandroidx/compose/foundation/lazy/LazyListItemPlacementAnimator;IJLjava/lang/Object;)V +HPLandroidx/compose/foundation/lazy/LazyMeasuredItem;->position(III)Landroidx/compose/foundation/lazy/LazyListPositionedItem; +HPLandroidx/compose/foundation/lazy/grid/LazyGridScopeImpl$DefaultSpan$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/lazy/grid/LazyGridState$scrollableState$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HPLandroidx/compose/foundation/lazy/grid/LazyGridState;->isVertical$foundation_release()Z +HPLandroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory;->getContentType(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/lazy/layout/LazyLayoutItemReusePolicy;->getSlotsToRetain(Landroidx/compose/ui/layout/SubcomposeSlotReusePolicy$SlotIdsSet;)V HPLandroidx/compose/foundation/lazy/layout/LazyLayoutPrefetcher;->run()V HPLandroidx/compose/material/ripple/RippleHostView;->updateRippleProperties-biQXAtU(JIJF)V +HPLandroidx/compose/material3/AndroidMenu_androidKt;->DropdownMenu-ILWXrKs(ZLkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;JLandroidx/compose/ui/window/PopupProperties;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;II)V +HPLandroidx/compose/material3/ButtonKt;->TextButton(Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;ZLandroidx/compose/ui/graphics/Shape;Landroidx/compose/material3/ButtonColors;Landroidx/compose/material3/ButtonElevation;Landroidx/compose/foundation/BorderStroke;Landroidx/compose/foundation/layout/PaddingValues;Landroidx/compose/foundation/interaction/MutableInteractionSource;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;II)V +HPLandroidx/compose/material3/CardElevation;->animateElevation(ZLandroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/runtime/Composer;I)Landroidx/compose/animation/core/AnimationState; +HPLandroidx/compose/material3/CardKt$Card$4;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +HPLandroidx/compose/material3/CardKt;->Card(Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;ZLandroidx/compose/ui/graphics/Shape;Landroidx/compose/material3/CardColors;Landroidx/compose/material3/CardElevation;Landroidx/compose/foundation/BorderStroke;Landroidx/compose/foundation/interaction/MutableInteractionSource;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;II)V HPLandroidx/compose/runtime/ComposerImpl$deactivateToEndGroup$2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/runtime/ComposerImpl$deactivateToEndGroup$2$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -HPLandroidx/compose/runtime/SlotWriter;->(Landroidx/compose/runtime/SlotTable;)V HPLandroidx/compose/runtime/SlotWriter;->slot(II)Ljava/lang/Object; +HPLandroidx/compose/ui/ComposedModifierKt$materialize$result$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +HPLandroidx/compose/ui/geometry/MutableRect;->intersect(FFFF)V +HPLandroidx/compose/ui/geometry/MutableRect;->isEmpty()Z HPLandroidx/compose/ui/geometry/Offset;->minus-MK-Hz9U(JJ)J -HPLandroidx/compose/ui/graphics/painter/BitmapPainter;->(Landroidx/compose/ui/graphics/ImageBitmap;JJ)V -HPLandroidx/compose/ui/graphics/painter/BitmapPainter;->onDraw(Landroidx/compose/ui/graphics/drawscope/DrawScope;)V +HPLandroidx/compose/ui/geometry/Offset;->times-tuRUvjQ(FJ)J +HPLandroidx/compose/ui/graphics/Matrix;->map-impl([FLandroidx/compose/ui/geometry/MutableRect;)V +HPLandroidx/compose/ui/graphics/RectHelper_androidKt;->toAndroidRect(Landroidx/compose/ui/geometry/Rect;)Landroid/graphics/Rect; HPLandroidx/compose/ui/input/pointer/MotionEventAdapter;->convertToPointerInputEvent$ui_release(Landroid/view/MotionEvent;Landroidx/compose/ui/input/pointer/PositionCalculator;)Landroidx/compose/ui/input/pointer/PointerInputEvent; HPLandroidx/compose/ui/input/pointer/Node;->buildCache(Ljava/util/Map;Landroidx/compose/ui/layout/LayoutCoordinates;Landroidx/compose/ui/input/pointer/InternalPointerEvent;Z)Z -HPLandroidx/compose/ui/input/pointer/Node;->dispatchFinalEventPass(Landroidx/compose/ui/input/pointer/InternalPointerEvent;)Z HPLandroidx/compose/ui/input/pointer/Node;->dispatchMainEventPass(Ljava/util/Map;Landroidx/compose/ui/layout/LayoutCoordinates;Landroidx/compose/ui/input/pointer/InternalPointerEvent;Z)Z HPLandroidx/compose/ui/input/pointer/PointerInputChange;->(JJJZFJJZZIJ)V HPLandroidx/compose/ui/input/pointer/PointerInputChangeEventProducer;->produce(Landroidx/compose/ui/input/pointer/PointerInputEvent;Landroidx/compose/ui/input/pointer/PositionCalculator;)Landroidx/compose/ui/input/pointer/InternalPointerEvent; HPLandroidx/compose/ui/input/pointer/PointerInputEventProcessor;->process-BIzXfog(Landroidx/compose/ui/input/pointer/PointerInputEvent;Landroidx/compose/ui/input/pointer/PositionCalculator;Z)I HPLandroidx/compose/ui/input/pointer/SuspendingPointerInputFilter;->dispatchPointerEvent(Landroidx/compose/ui/input/pointer/PointerEvent;Landroidx/compose/ui/input/pointer/PointerEventPass;)V -HPLandroidx/compose/ui/layout/SubcomposeLayoutState;->precompose(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState$precompose$1; -HPLandroidx/compose/ui/node/BackwardsCompatNode;->onPointerEvent-H0pRuoY(Landroidx/compose/ui/input/pointer/PointerEvent;Landroidx/compose/ui/input/pointer/PointerEventPass;J)V -HPLandroidx/compose/ui/node/InnerNodeCoordinator;->hitTestChild-YqVAtuI(Landroidx/compose/ui/node/NodeCoordinator$HitTestSource;JLandroidx/compose/ui/node/HitTestResult;ZZ)V +HPLandroidx/compose/ui/layout/LayoutCoordinatesKt;->boundsInRoot(Landroidx/compose/ui/node/NodeCoordinator;)Landroidx/compose/ui/geometry/Rect; +HPLandroidx/compose/ui/layout/LayoutCoordinatesKt;->findRootCoordinates(Landroidx/compose/ui/node/NodeCoordinator;)Landroidx/compose/ui/layout/LayoutCoordinates; +HPLandroidx/compose/ui/node/LayoutNode;->(IZ)V HPLandroidx/compose/ui/node/LayoutNode;->forceRemeasure()V HPLandroidx/compose/ui/node/LayoutNode;->move$ui_release(III)V HPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->measureAndLayout-0kLqBqw(Landroidx/compose/ui/node/LayoutNode;J)V -HPLandroidx/compose/ui/node/NodeCoordinator;->ancestorToLocal-R5De75A(Landroidx/compose/ui/node/NodeCoordinator;J)J +HPLandroidx/compose/ui/node/NodeCoordinator;->findCommonAncestor$ui_release(Landroidx/compose/ui/node/NodeCoordinator;)Landroidx/compose/ui/node/NodeCoordinator; HPLandroidx/compose/ui/node/NodeCoordinator;->fromParentPosition-MK-Hz9U(J)J +HPLandroidx/compose/ui/node/NodeCoordinator;->getParentLayoutCoordinates()Landroidx/compose/ui/node/NodeCoordinator; HPLandroidx/compose/ui/node/NodeCoordinator;->hitTest-YqVAtuI(Landroidx/compose/ui/node/NodeCoordinator$HitTestSource;JLandroidx/compose/ui/node/HitTestResult;ZZ)V -HPLandroidx/compose/ui/node/PointerInputModifierNodeKt;->isAttached(Landroidx/compose/ui/node/PointerInputModifierNode;)Z +HPLandroidx/compose/ui/node/NodeCoordinator;->isTransparent()Z HPLandroidx/compose/ui/platform/AndroidComposeView;->handleMotionEvent-8iAsVTc(Landroid/view/MotionEvent;)I +HPLandroidx/compose/ui/platform/AndroidComposeView;->localToScreen-MK-Hz9U(J)J HPLandroidx/compose/ui/platform/AndroidComposeView;->measureAndLayout-0kLqBqw(Landroidx/compose/ui/node/LayoutNode;J)V -HPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat_androidKt;->access$excludeLineAndPageGranularities(Landroidx/compose/ui/semantics/SemanticsNode;)Z -HPLandroidx/compose/ui/platform/LayerMatrixCache;->calculateInverseMatrix-bWbORWo(Ljava/lang/Object;)[F +HPLandroidx/compose/ui/platform/AndroidComposeView;->recalculateWindowPosition()V +HPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$Api24Impl;->addSetProgressAction(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;Landroidx/compose/ui/semantics/SemanticsNode;)V +HPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$MyNodeProvider;->createAccessibilityNodeInfo(I)Landroid/view/accessibility/AccessibilityNodeInfo; +HPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getIterableTextForAccessibility(Landroidx/compose/ui/semantics/SemanticsNode;)Ljava/lang/String; +HPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat_androidKt;->getAllUncoveredSemanticsNodesToMap$findAllSemanticNodesRecursive(Landroid/graphics/Region;Landroidx/compose/ui/semantics/SemanticsNode;Ljava/util/LinkedHashMap;Landroidx/compose/ui/semantics/SemanticsNode;)V +HPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat_androidKt;->isTextField(Landroidx/compose/ui/semantics/SemanticsNode;)Z +HPLandroidx/compose/ui/platform/CalculateMatrixToWindowApi29;->calculateMatrixToWindow-EL8BTi8(Landroid/view/View;[F)V +HPLandroidx/compose/ui/platform/RenderNodeLayer;->mapBounds(Landroidx/compose/ui/geometry/MutableRect;Z)V +HPLandroidx/compose/ui/platform/accessibility/CollectionInfoKt;->setCollectionInfo(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;Landroidx/compose/ui/semantics/SemanticsNode;)V +HPLandroidx/compose/ui/platform/accessibility/CollectionInfoKt;->setCollectionItemInfo(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;Landroidx/compose/ui/semantics/SemanticsNode;)V +HPLandroidx/compose/ui/semantics/NodeLocationHolder;->(Landroidx/compose/ui/node/LayoutNode;Landroidx/compose/ui/node/LayoutNode;)V +HPLandroidx/compose/ui/semantics/NodeLocationHolder;->compareTo(Landroidx/compose/ui/semantics/NodeLocationHolder;)I +HPLandroidx/compose/ui/semantics/SemanticsNode$emitFakeNodes$fakeNode$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HPLandroidx/compose/ui/semantics/SemanticsNode;->(Landroidx/compose/ui/node/SemanticsModifierNode;Z)V +HPLandroidx/compose/ui/semantics/SemanticsNode;->fakeSemanticsNode-ypyhhiA(Landroidx/compose/ui/semantics/Role;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/semantics/SemanticsNode; +HPLandroidx/compose/ui/semantics/SemanticsNode;->findCoordinatorToGetBounds$ui_release()Landroidx/compose/ui/node/NodeCoordinator; +HPLandroidx/compose/ui/semantics/SemanticsNode;->getConfig()Landroidx/compose/ui/semantics/SemanticsConfiguration; +HPLandroidx/compose/ui/semantics/SemanticsNode;->getParent()Landroidx/compose/ui/semantics/SemanticsNode; +HPLandroidx/compose/ui/semantics/SemanticsNodeKt;->getOuterMergingSemantics(Landroidx/compose/ui/node/LayoutNode;)Landroidx/compose/ui/node/SemanticsModifierNode; +HPLandroidx/compose/ui/semantics/SemanticsSortKt;->findCoordinatorToGetBounds(Landroidx/compose/ui/node/LayoutNode;)Landroidx/compose/ui/node/NodeCoordinator; +HPLandroidx/compose/ui/semantics/SemanticsSortKt;->findOneLayerOfSemanticsWrappersSortedByBounds(Landroidx/compose/ui/node/LayoutNode;Ljava/util/List;)V HPLandroidx/compose/ui/text/platform/AndroidAccessibilitySpannableString_androidKt;->toAccessibilitySpannableString(Landroidx/compose/ui/text/AnnotatedString;Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/text/font/FontFamily$Resolver;)Landroid/text/SpannableString; +HPLandroidx/compose/ui/unit/Density;->toSize-XkaWNTQ(J)J +HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->(Landroid/view/accessibility/AccessibilityNodeInfo;)V +HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->addAction(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;)V +HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->extrasIntList(Ljava/lang/String;)Ljava/util/ArrayList; +HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->getText()Ljava/lang/CharSequence; +HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setStateDescription(Ljava/lang/CharSequence;)V HPLandroidx/emoji2/text/MetadataRepo;->(Landroid/graphics/Typeface;Landroidx/emoji2/text/flatbuffer/MetadataList;)V HPLandroidx/emoji2/text/flatbuffer/Table;->__reset(ILjava/nio/ByteBuffer;)V -HPLcoil/compose/AsyncImagePainter;->toPainter(Landroid/graphics/drawable/Drawable;)Landroidx/compose/ui/graphics/painter/Painter; -HPLcoil/memory/MemoryCacheService;->newResult(Lcoil/intercept/RealInterceptorChain;Lcoil/request/ImageRequest;Lcoil/memory/MemoryCache$Key;Lcoil/memory/MemoryCache$Value;)Lcoil/request/SuccessResult; +HPLcoil/network/CacheResponse;->(Lokio/RealBufferedSource;)V HPLcom/caverock/androidsvg/NumberParser;->parseNumber(IILjava/lang/String;)F HPLcom/caverock/androidsvg/SVG$Style;->getDefaultStyle()Lcom/caverock/androidsvg/SVG$Style; -HPLcom/caverock/androidsvg/SVGAndroidRenderer$RendererState;->(Lcom/caverock/androidsvg/SVGAndroidRenderer$RendererState;)V -HPLcom/caverock/androidsvg/SVGAndroidRenderer;->decodePaintReference(ZLcom/caverock/androidsvg/SVG$Box;Lcom/caverock/androidsvg/SVG$PaintReference;)V -HPLcom/caverock/androidsvg/SVGAndroidRenderer;->render(Lcom/caverock/androidsvg/SVG$SvgObject;)V -HPLcom/caverock/androidsvg/SVGAndroidRenderer;->updateStyle(Lcom/caverock/androidsvg/SVGAndroidRenderer$RendererState;Lcom/caverock/androidsvg/SVG$Style;)V -HPLcom/caverock/androidsvg/SVGAndroidRenderer;->updateStyleForElement(Lcom/caverock/androidsvg/SVGAndroidRenderer$RendererState;Lcom/caverock/androidsvg/SVG$SvgElementBase;)V -HPLcom/caverock/androidsvg/SVGParser;->parseAttributesStyle(Lcom/caverock/androidsvg/SVG$SvgElementBase;Lorg/xml/sax/Attributes;)V -HPLcom/caverock/androidsvg/SVGParser;->processStyleProperty(Lcom/caverock/androidsvg/SVG$Style;Ljava/lang/String;Ljava/lang/String;)V -HPLcom/caverock/androidsvg/SVGParser;->startElement(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lorg/xml/sax/Attributes;)V -HPLcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl$12;->call()Ljava/lang/Object; -HPLcom/google/samples/apps/nowinandroid/core/database/model/PopulatedNewsResourceKt;->asExternalModel(Lcom/google/samples/apps/nowinandroid/core/database/model/PopulatedNewsResource;)Lcom/google/samples/apps/nowinandroid/core/model/data/NewsResource; +HPLcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl;->__fetchRelationshiptopicsAscomGoogleSamplesAppsNowinandroidCoreDatabaseModelTopicEntity(Landroidx/collection/ArrayMap;)V +HPLcom/google/samples/apps/nowinandroid/core/designsystem/component/ButtonKt$NiaTextButton$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +HPLcom/google/samples/apps/nowinandroid/core/designsystem/component/ButtonKt;->access$NiaButtonContent(Landroidx/compose/foundation/layout/RowScope;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;I)V HPLcom/google/samples/apps/nowinandroid/core/designsystem/component/TagKt;->NiaTopicTag(ZZLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;ZLkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;III)V -HPLcom/google/samples/apps/nowinandroid/core/network/model/util/InstantSerializer;->deserialize(Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; +HPLcom/google/samples/apps/nowinandroid/core/ui/NewsFeedKt$newsFeed$$inlined$items$default$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HPLcom/google/samples/apps/nowinandroid/core/ui/NewsFeedKt$newsFeed$$inlined$items$default$4;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLcom/google/samples/apps/nowinandroid/core/ui/NewsResourceCardKt$NewsResourceCardExpanded$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +HPLcom/google/samples/apps/nowinandroid/core/ui/NewsResourceCardKt;->NewsResourceTopics(Ljava/util/List;Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;II)V HPLcom/google/samples/apps/nowinandroid/feature/interests/InterestsItemKt;->InterestContent(Ljava/lang/String;Ljava/lang/String;Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;II)V -HPLcom/google/samples/apps/nowinandroid/feature/interests/InterestsItemKt;->InterestsIcon(Ljava/lang/String;Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;II)V HPLcom/google/samples/apps/nowinandroid/feature/interests/InterestsItemKt;->InterestsItem-eKw1uXw(Ljava/lang/String;ZLjava/lang/String;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;Landroidx/compose/ui/Modifier;Ljava/lang/String;FLandroidx/compose/runtime/Composer;II)V -HPLcom/google/samples/apps/nowinandroid/feature/interests/TabContentKt$AuthorsTabContent$1$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -HPLj$/time/LocalDateTime;->b0(Lj$/time/h;Lj$/time/l;)Lj$/time/LocalDateTime; -HPLj$/time/OffsetDateTime;->parse(Ljava/lang/CharSequence;)Lj$/time/OffsetDateTime; -HPLj$/time/OffsetDateTime;->w(Lj$/time/temporal/TemporalAccessor;)Lj$/time/OffsetDateTime; -HPLj$/time/chrono/ChronoLocalDateTime;->v(Lj$/time/ZoneOffset;)J -HPLj$/time/chrono/a;->D(Ljava/util/HashMap;Lj$/time/format/E;)Lj$/time/chrono/b; -HPLj$/time/format/D;->p(Lj$/time/temporal/TemporalAccessor;)V +HPLj$/time/chrono/r;->Z(Ljava/util/HashMap;Lj$/time/format/E;)Lj$/time/chrono/b; +HPLj$/time/format/D;->d(Lj$/time/temporal/t;)Ljava/lang/Object; HPLj$/time/format/DateTimeFormatter;->f(Ljava/lang/CharSequence;)Lj$/time/temporal/TemporalAccessor; -HPLj$/time/format/f;->B(Lj$/time/format/x;Ljava/lang/CharSequence;I)I -HPLj$/time/format/l;->B(Lj$/time/format/x;Ljava/lang/CharSequence;I)I -HPLj$/time/format/x;->(Lj$/time/format/DateTimeFormatter;)V -HPLj$/time/format/x;->o(Lj$/time/temporal/q;JII)I -HPLj$/time/format/x;->t(Lj$/time/format/E;Ljava/util/Set;)Lj$/time/temporal/TemporalAccessor; -HPLj$/time/h;->f0(III)Lj$/time/h; -HPLj$/time/l;->b0(IIII)Lj$/time/l; -HPLkotlin/text/StringsKt__StringsJVMKt;->concatToString([CII)Ljava/lang/String; -HPLkotlinx/datetime/Instant$Companion;->parse(Ljava/lang/String;)Lkotlinx/datetime/Instant; -HPLkotlinx/serialization/encoding/AbstractDecoder;->decodeSerializableElement(Lkotlinx/serialization/descriptors/SerialDescriptor;ILkotlinx/serialization/DeserializationStrategy;Ljava/lang/Object;)Ljava/lang/Object; -HPLkotlinx/serialization/internal/ArrayListSerializer;->(Lkotlinx/serialization/KSerializer;)V -HPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;->getElementIndex(Ljava/lang/String;)I +HPLj$/time/format/x;->r()V HPLkotlinx/serialization/json/internal/AbstractJsonLexer;->peekNextToken()B HPLkotlinx/serialization/json/internal/AbstractJsonLexer;->skipWhitespaces()I -HPLkotlinx/serialization/json/internal/ArrayAsSequence;->charAt(I)C -HPLkotlinx/serialization/json/internal/ReaderJsonLexer;->tryConsumeComma()Z -HPLkotlinx/serialization/json/internal/StreamingJsonDecoder;->(Lkotlinx/serialization/json/Json;ILkotlinx/serialization/json/internal/AbstractJsonLexer;Lkotlinx/serialization/descriptors/SerialDescriptor;Lkotlinx/serialization/json/internal/StreamingJsonDecoder$DiscriminatorHolder;)V -HPLkotlinx/serialization/json/internal/StreamingJsonDecoder;->decodeSerializableElement(Lkotlinx/serialization/descriptors/SerialDescriptor;ILkotlinx/serialization/DeserializationStrategy;Ljava/lang/Object;)Ljava/lang/Object; -HPLkotlinx/serialization/json/internal/StreamingJsonDecoder;->decodeSerializableValue(Lkotlinx/serialization/DeserializationStrategy;)Ljava/lang/Object; +HPLkotlinx/serialization/json/internal/ReaderJsonLexer;->canConsumeValue()Z +HPLkotlinx/serialization/json/internal/ReaderJsonLexer;->prefetchOrEof(I)I +HPLokhttp3/internal/http2/Hpack$Reader;->readByteString()Lokio/ByteString; +HPLokhttp3/internal/http2/Http2Connection$ReaderRunnable;->data(IILokio/BufferedSource;Z)V +HPLokhttp3/internal/http2/Http2ExchangeCodec;->writeRequestHeaders(Lokhttp3/Request;)V +HPLokio/Buffer;->indexOf(BJJ)J +HPLokio/InputStreamSource;->read(Lokio/Buffer;J)J +HPLokio/RealBufferedSource;->request(J)Z HSPLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda0;->(Landroidx/activity/ComponentActivity;)V HSPLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda1;->(Landroidx/activity/ComponentActivity;)V HSPLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda2;->(Landroidx/activity/ComponentActivity;)V @@ -145,11 +174,11 @@ HSPLandroidx/activity/compose/LocalOnBackPressedDispatcherOwner;->()V HSPLandroidx/activity/contextaware/ContextAwareHelper;->()V HSPLandroidx/activity/result/ActivityResult$$ExternalSyntheticOutline0;->m(Ljava/lang/String;)Ljava/lang/StringBuilder; HSPLandroidx/activity/result/ActivityResultRegistry;->()V -HSPLandroidx/appcompat/R$styleable;->()V -HSPLandroidx/appcompat/R$styleable;->checkScrollableContainerConstraints-K40F9xA(JLandroidx/compose/foundation/gestures/Orientation;)V +HSPLandroidx/appcompat/R$bool;->stringResource(ILandroidx/compose/runtime/Composer;I)Ljava/lang/String; +HSPLandroidx/appcompat/R$style;->build(Lkotlin/collections/builders/SetBuilder;)Lkotlin/collections/builders/SetBuilder; +HSPLandroidx/appcompat/resources/R$drawable;->get(Landroid/view/View;)Landroidx/lifecycle/LifecycleOwner; HSPLandroidx/appcompat/view/SupportMenuInflater$$ExternalSyntheticOutline0;->m(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; HSPLandroidx/appcompat/widget/AppCompatTextHelper$Api28Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/Typeface;IZ)Landroid/graphics/Typeface; -HSPLandroidx/appcompat/widget/TooltipCompatHandler$$ExternalSyntheticLambda1;->(ILjava/lang/Object;)V HSPLandroidx/arch/core/executor/ArchTaskExecutor$2;->()V HSPLandroidx/arch/core/executor/ArchTaskExecutor$2;->execute(Ljava/lang/Runnable;)V HSPLandroidx/arch/core/executor/ArchTaskExecutor;->()V @@ -194,8 +223,6 @@ HSPLandroidx/collection/ArrayMap;->keySet()Ljava/util/Set; HSPLandroidx/collection/ArraySet;->()V HSPLandroidx/collection/ArraySet;->()V HSPLandroidx/collection/ArraySet;->(I)V -HSPLandroidx/collection/ContainerHelpers;->()V -HSPLandroidx/collection/ContainerHelpers;->binarySearch(II[I)I HSPLandroidx/collection/IndexBasedArrayIterator;->(I)V HSPLandroidx/collection/IndexBasedArrayIterator;->hasNext()Z HSPLandroidx/collection/IndexBasedArrayIterator;->next()Ljava/lang/Object; @@ -219,8 +246,6 @@ HSPLandroidx/collection/SparseArrayCompat;->valueAt(I)Ljava/lang/Object; HSPLandroidx/collection/SparseArrayKt$valueIterator$1;->(Landroidx/collection/SparseArrayCompat;)V HSPLandroidx/collection/SparseArrayKt$valueIterator$1;->hasNext()Z HSPLandroidx/collection/SparseArrayKt$valueIterator$1;->next()Ljava/lang/Object; -HSPLandroidx/collection/SparseArrayKt;->lerp(FFF)F -HSPLandroidx/collection/SparseArrayKt;->valueIterator(Landroidx/collection/SparseArrayCompat;)Landroidx/collection/SparseArrayKt$valueIterator$1; HSPLandroidx/compose/animation/AnimatedEnterExitMeasurePolicy$measure$1;->(Ljava/util/ArrayList;)V HSPLandroidx/compose/animation/AnimatedEnterExitMeasurePolicy$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/animation/AnimatedEnterExitMeasurePolicy;->(Landroidx/compose/animation/AnimatedVisibilityScopeImpl;)V @@ -249,6 +274,8 @@ HSPLandroidx/compose/animation/ColorVectorConverterKt$ColorToVector$1$1;-> HSPLandroidx/compose/animation/ColorVectorConverterKt$ColorToVector$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/animation/ColorVectorConverterKt$ColorToVector$1$2;->(Landroidx/compose/ui/graphics/colorspace/ColorSpace;)V HSPLandroidx/compose/animation/ColorVectorConverterKt$ColorToVector$1$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLandroidx/compose/animation/ColorVectorConverterKt;->()V +HSPLandroidx/compose/animation/ColorVectorConverterKt;->access$multiplyColumn(IFFF[F)F HSPLandroidx/compose/animation/CrossfadeKt$$ExternalSyntheticOutline0;->m(Landroidx/compose/runtime/ComposerImpl;ZZZZ)V HSPLandroidx/compose/animation/CrossfadeKt$Crossfade$2;->(Ljava/lang/Object;Landroidx/compose/ui/Modifier;Landroidx/compose/animation/core/FiniteAnimationSpec;Lkotlin/jvm/functions/Function3;II)V HSPLandroidx/compose/animation/CrossfadeKt$Crossfade$3;->()V @@ -298,7 +325,6 @@ HSPLandroidx/compose/animation/Fade;->(FLandroidx/compose/animation/core/F HSPLandroidx/compose/animation/FlingCalculator;->(FLandroidx/compose/ui/unit/Density;)V HSPLandroidx/compose/animation/FlingCalculatorKt;->()V HSPLandroidx/compose/animation/LayoutModifierWithPassThroughIntrinsics;->()V -HSPLandroidx/compose/animation/Scale;->()V HSPLandroidx/compose/animation/SingleValueAnimationKt;->()V HSPLandroidx/compose/animation/SingleValueAnimationKt;->animateColorAsState-KTwxG1Y(JLandroidx/compose/animation/core/FiniteAnimationSpec;Landroidx/compose/runtime/Composer;)Landroidx/compose/animation/core/AnimationState; HSPLandroidx/compose/animation/Slide;->(Landroidx/compose/animation/core/FiniteAnimationSpec;Lkotlin/jvm/functions/Function1;)V @@ -350,11 +376,9 @@ HSPLandroidx/compose/animation/core/AnimationScope;->(Ljava/lang/Object;La HSPLandroidx/compose/animation/core/AnimationScope;->getValue()Ljava/lang/Object; HSPLandroidx/compose/animation/core/AnimationSpecKt;->spring$default(FLjava/lang/Object;I)Landroidx/compose/animation/core/SpringSpec; HSPLandroidx/compose/animation/core/AnimationSpecKt;->tween$default(IILandroidx/compose/animation/core/Easing;I)Landroidx/compose/animation/core/TweenSpec; -HSPLandroidx/compose/animation/core/AnimationSpecKt;->tween(IILandroidx/compose/animation/core/Easing;)Landroidx/compose/animation/core/TweenSpec; HSPLandroidx/compose/animation/core/AnimationState;->(Landroidx/compose/animation/core/TwoWayConverter;Ljava/lang/Object;Landroidx/compose/animation/core/AnimationVector;I)V HSPLandroidx/compose/animation/core/AnimationState;->(Landroidx/compose/animation/core/TwoWayConverter;Ljava/lang/Object;Landroidx/compose/animation/core/AnimationVector;JJZ)V HSPLandroidx/compose/animation/core/AnimationState;->getValue()Ljava/lang/Object; -HSPLandroidx/compose/animation/core/AnimationStateKt;->createZeroVectorFrom(Landroidx/compose/animation/core/TwoWayConverter;Ljava/lang/Object;)Landroidx/compose/animation/core/AnimationVector; HSPLandroidx/compose/animation/core/AnimationVector1D;->(F)V HSPLandroidx/compose/animation/core/AnimationVector1D;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/animation/core/AnimationVector1D;->get$animation_core_release(I)F @@ -501,7 +525,7 @@ HSPLandroidx/compose/animation/core/TransitionKt$updateTransition$1$1$invoke$$in HSPLandroidx/compose/animation/core/TransitionKt$updateTransition$1$1;->(Landroidx/compose/animation/core/Transition;)V HSPLandroidx/compose/animation/core/TransitionKt$updateTransition$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/animation/core/TransitionKt;->createDeferredAnimation(Landroidx/compose/animation/core/Transition;Landroidx/compose/animation/core/TwoWayConverterImpl;Ljava/lang/String;Landroidx/compose/runtime/Composer;)Landroidx/compose/animation/core/Transition$DeferredAnimation; -HSPLandroidx/compose/animation/core/TransitionKt;->createTransitionAnimation(Landroidx/compose/animation/core/Transition;Ljava/lang/Object;Ljava/lang/Object;Landroidx/compose/animation/core/FiniteAnimationSpec;Landroidx/compose/animation/core/TwoWayConverter;Ljava/lang/String;Landroidx/compose/runtime/Composer;I)Landroidx/compose/animation/core/Transition$TransitionAnimationState; +HSPLandroidx/compose/animation/core/TransitionKt;->createTransitionAnimation(Landroidx/compose/animation/core/Transition;Ljava/lang/Object;Ljava/lang/Object;Landroidx/compose/animation/core/FiniteAnimationSpec;Landroidx/compose/animation/core/TwoWayConverterImpl;Ljava/lang/String;Landroidx/compose/runtime/Composer;I)Landroidx/compose/animation/core/Transition$TransitionAnimationState; HSPLandroidx/compose/animation/core/TransitionKt;->updateTransition(Ljava/lang/Object;Ljava/lang/String;Landroidx/compose/runtime/Composer;II)Landroidx/compose/animation/core/Transition; HSPLandroidx/compose/animation/core/TweenSpec;->(IILandroidx/compose/animation/core/Easing;)V HSPLandroidx/compose/animation/core/TweenSpec;->(ILandroidx/compose/animation/core/Easing;I)V @@ -629,7 +653,6 @@ HSPLandroidx/compose/foundation/Api31Impl;->getDistance(Landroid/widget/EdgeEffe HSPLandroidx/compose/foundation/Background;->(Landroidx/compose/ui/graphics/Color;Landroidx/compose/ui/graphics/Shape;)V HSPLandroidx/compose/foundation/Background;->draw(Landroidx/compose/ui/graphics/drawscope/ContentDrawScope;)V HSPLandroidx/compose/foundation/Background;->equals(Ljava/lang/Object;)Z -HSPLandroidx/compose/foundation/BackgroundKt;->background-bw27NRU$default(Landroidx/compose/ui/Modifier;J)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/CanvasKt;->Canvas(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;I)V HSPLandroidx/compose/foundation/ClickableKt$PressedInteractionSourceDisposableEffect$1$invoke$$inlined$onDispose$1;->(Landroidx/compose/runtime/MutableState;Ljava/util/Map;Landroidx/compose/foundation/interaction/MutableInteractionSource;)V @@ -749,13 +772,13 @@ HSPLandroidx/compose/foundation/OverscrollConfigurationKt$LocalOverscrollConfigu HSPLandroidx/compose/foundation/OverscrollConfigurationKt$LocalOverscrollConfiguration$1;->()V HSPLandroidx/compose/foundation/OverscrollConfigurationKt$LocalOverscrollConfiguration$1;->invoke()Ljava/lang/Object; HSPLandroidx/compose/foundation/OverscrollConfigurationKt;->()V -HSPLandroidx/compose/foundation/OverscrollKt;->hasFontAttributes(Landroidx/compose/ui/text/SpanStyle;)Z HSPLandroidx/compose/foundation/OverscrollKt;->overscroll(Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/OverscrollEffect;)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/foundation/PinnableParentConsumer;->(Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/foundation/PinnableParentConsumer;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/foundation/PinnableParentConsumer;->onModifierLocalsUpdated(Landroidx/compose/ui/modifier/ModifierLocalReadScope;)V HSPLandroidx/compose/foundation/gestures/AndroidConfig;->()V HSPLandroidx/compose/foundation/gestures/AndroidConfig;->()V +HSPLandroidx/compose/foundation/gestures/AndroidScrollable_androidKt;->hasFontAttributes(Landroidx/compose/ui/text/SpanStyle;)Z HSPLandroidx/compose/foundation/gestures/ContentInViewModifier$modifier$1;->(Landroidx/compose/foundation/gestures/ContentInViewModifier;)V HSPLandroidx/compose/foundation/gestures/ContentInViewModifier;->(Lkotlinx/coroutines/CoroutineScope;Landroidx/compose/foundation/gestures/Orientation;Landroidx/compose/foundation/gestures/ScrollableState;Z)V HSPLandroidx/compose/foundation/gestures/ContentInViewModifier;->onPlaced(Landroidx/compose/ui/node/NodeCoordinator;)V @@ -878,7 +901,7 @@ HSPLandroidx/compose/foundation/layout/Arrangement;->()V HSPLandroidx/compose/foundation/layout/Arrangement;->placeCenter$foundation_layout_release(I[I[IZ)V HSPLandroidx/compose/foundation/layout/Arrangement;->placeLeftOrTop$foundation_layout_release([I[IZ)V HSPLandroidx/compose/foundation/layout/Arrangement;->placeRightOrBottom$foundation_layout_release(I[I[IZ)V -HSPLandroidx/compose/foundation/layout/BoxChildData;->(Landroidx/compose/ui/BiasAlignment;)V +HSPLandroidx/compose/foundation/layout/BoxChildData;->()V HSPLandroidx/compose/foundation/layout/BoxChildData;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/foundation/layout/BoxChildData;->modifyParentData(Landroidx/compose/ui/unit/Density;Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/foundation/layout/BoxKt$EmptyBoxMeasurePolicy$1$measure$1;->()V @@ -1080,104 +1103,6 @@ HSPLandroidx/compose/foundation/layout/WindowInsetsSizeKt;->windowInsetsBottomHe HSPLandroidx/compose/foundation/layout/WrapContentModifier;->(IZLkotlin/jvm/functions/Function2;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/foundation/lazy/AwaitFirstLayoutModifier;->()V HSPLandroidx/compose/foundation/lazy/AwaitFirstLayoutModifier;->onGloballyPositioned(Landroidx/compose/ui/node/NodeCoordinator;)V -HSPLandroidx/compose/foundation/lazy/DataIndex;->(I)V -HSPLandroidx/compose/foundation/lazy/EmptyLazyListLayoutInfo;->()V -HSPLandroidx/compose/foundation/lazy/EmptyLazyListLayoutInfo;->()V -HSPLandroidx/compose/foundation/lazy/LazyDslKt;->LazyRow(Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/lazy/LazyListState;Landroidx/compose/foundation/layout/PaddingValues;ZLandroidx/compose/foundation/layout/Arrangement$Horizontal;Landroidx/compose/ui/Alignment$Vertical;Landroidx/compose/foundation/gestures/FlingBehavior;ZLkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V -HSPLandroidx/compose/foundation/lazy/LazyItemScopeImpl;->()V -HSPLandroidx/compose/foundation/lazy/LazyListBeyondBoundsInfo;->()V -HSPLandroidx/compose/foundation/lazy/LazyListBeyondBoundsModifierLocal;->(Landroidx/compose/foundation/lazy/LazyListState;Landroidx/compose/foundation/lazy/LazyListBeyondBoundsInfo;ZLandroidx/compose/ui/unit/LayoutDirection;Landroidx/compose/foundation/gestures/Orientation;)V -HSPLandroidx/compose/foundation/lazy/LazyListBeyondBoundsModifierLocal;->getKey()Landroidx/compose/ui/modifier/ProvidableModifierLocal; -HSPLandroidx/compose/foundation/lazy/LazyListBeyondBoundsModifierLocal;->getValue()Ljava/lang/Object; -HSPLandroidx/compose/foundation/lazy/LazyListIntervalContent;->(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V -HSPLandroidx/compose/foundation/lazy/LazyListIntervalContent;->getKey()Lkotlin/jvm/functions/Function1; -HSPLandroidx/compose/foundation/lazy/LazyListIntervalContent;->getType()Lkotlin/jvm/functions/Function1; -HSPLandroidx/compose/foundation/lazy/LazyListItemPlacementAnimator;->(Lkotlinx/coroutines/CoroutineScope;Z)V -HSPLandroidx/compose/foundation/lazy/LazyListItemProviderImpl$1;->(Landroidx/compose/foundation/lazy/LazyItemScopeImpl;)V -HSPLandroidx/compose/foundation/lazy/LazyListItemProviderImpl$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -HSPLandroidx/compose/foundation/lazy/LazyListItemProviderImpl;->(Landroidx/compose/foundation/lazy/layout/MutableIntervalList;Lkotlin/ranges/IntRange;Landroidx/compose/foundation/lazy/LazyItemScopeImpl;)V -HSPLandroidx/compose/foundation/lazy/LazyListItemProviderImpl;->Item(ILandroidx/compose/runtime/Composer;I)V -HSPLandroidx/compose/foundation/lazy/LazyListItemProviderImpl;->getContentType(I)Ljava/lang/Object; -HSPLandroidx/compose/foundation/lazy/LazyListItemProviderImpl;->getItemCount()I -HSPLandroidx/compose/foundation/lazy/LazyListItemProviderImpl;->getKey(I)Ljava/lang/Object; -HSPLandroidx/compose/foundation/lazy/LazyListItemProviderImpl;->getKeyToIndexMap()Ljava/util/Map; -HSPLandroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProvider$1$1;->(Landroidx/compose/runtime/DerivedSnapshotState;)V -HSPLandroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProvider$1$1;->Item(ILandroidx/compose/runtime/Composer;I)V -HSPLandroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProvider$1$1;->getContentType(I)Ljava/lang/Object; -HSPLandroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProvider$1$1;->getHeaderIndexes()Ljava/util/List; -HSPLandroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProvider$1$1;->getItemCount()I -HSPLandroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProvider$1$1;->getItemScope()Landroidx/compose/foundation/lazy/LazyItemScopeImpl; -HSPLandroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProvider$1$1;->getKey(I)Ljava/lang/Object; -HSPLandroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProvider$1$1;->getKeyToIndexMap()Ljava/util/Map; -HSPLandroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProvider$1$itemProviderState$1;->(Landroidx/compose/runtime/MutableState;Landroidx/compose/runtime/MutableState;Landroidx/compose/foundation/lazy/LazyItemScopeImpl;)V -HSPLandroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProvider$1$itemProviderState$1;->invoke()Ljava/lang/Object; -HSPLandroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProvider$nearestItemsRangeState$1$1;->(Landroidx/compose/foundation/lazy/LazyListState;)V -HSPLandroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProvider$nearestItemsRangeState$1$1;->invoke()Ljava/lang/Object; -HSPLandroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProvider$nearestItemsRangeState$2;->()V -HSPLandroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProvider$nearestItemsRangeState$2;->()V -HSPLandroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProvider$nearestItemsRangeState$2;->invoke()Ljava/lang/Object; -HSPLandroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProvider$nearestItemsRangeState$3;->()V -HSPLandroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProvider$nearestItemsRangeState$3;->()V -HSPLandroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProvider$nearestItemsRangeState$3;->invoke()Ljava/lang/Object; -HSPLandroidx/compose/foundation/lazy/LazyListKt$ScrollPositionUpdater$1;->(Landroidx/compose/foundation/lazy/LazyListItemProvider;Landroidx/compose/foundation/lazy/LazyListState;I)V -HSPLandroidx/compose/foundation/lazy/LazyListKt$rememberLazyListMeasurePolicy$1$1$2;->(Landroidx/compose/foundation/lazy/layout/LazyLayoutMeasureScope;JII)V -HSPLandroidx/compose/foundation/lazy/LazyListKt$rememberLazyListMeasurePolicy$1$1$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -HSPLandroidx/compose/foundation/lazy/LazyListKt$rememberLazyListMeasurePolicy$1$1$measuredItemProvider$1;->(IILandroidx/compose/foundation/lazy/layout/LazyLayoutMeasureScope;ZLandroidx/compose/ui/Alignment$Horizontal;Landroidx/compose/ui/Alignment$Vertical;ZIILandroidx/compose/foundation/lazy/LazyListItemPlacementAnimator;J)V -HSPLandroidx/compose/foundation/lazy/LazyListKt$rememberLazyListMeasurePolicy$1$1$measuredItemProvider$1;->createItem-HK0c1C0(ILjava/lang/Object;Ljava/util/List;)Landroidx/compose/foundation/lazy/LazyMeasuredItem; -HSPLandroidx/compose/foundation/lazy/LazyListKt$rememberLazyListMeasurePolicy$1$1;->(ZLandroidx/compose/foundation/layout/PaddingValues;ZLandroidx/compose/foundation/lazy/LazyListState;Landroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProvider$1$1;Landroidx/compose/foundation/layout/Arrangement$Vertical;Landroidx/compose/foundation/layout/Arrangement$Horizontal;Landroidx/compose/foundation/lazy/LazyListItemPlacementAnimator;Landroidx/compose/foundation/lazy/LazyListBeyondBoundsInfo;Landroidx/compose/ui/Alignment$Horizontal;Landroidx/compose/ui/Alignment$Vertical;Landroidx/compose/foundation/OverscrollEffect;)V -HSPLandroidx/compose/foundation/lazy/LazyListKt$rememberLazyListMeasurePolicy$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -HSPLandroidx/compose/foundation/lazy/LazyListKt;->LazyList(Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/lazy/LazyListState;Landroidx/compose/foundation/layout/PaddingValues;ZZLandroidx/compose/foundation/gestures/FlingBehavior;ZLandroidx/compose/ui/Alignment$Horizontal;Landroidx/compose/foundation/layout/Arrangement$Vertical;Landroidx/compose/ui/Alignment$Vertical;Landroidx/compose/foundation/layout/Arrangement$Horizontal;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;III)V -HSPLandroidx/compose/foundation/lazy/LazyListKt;->ScrollPositionUpdater(Landroidx/compose/foundation/lazy/LazyListItemProvider;Landroidx/compose/foundation/lazy/LazyListState;Landroidx/compose/runtime/Composer;I)V -HSPLandroidx/compose/foundation/lazy/LazyListMeasureKt$measureLazyList$1;->()V -HSPLandroidx/compose/foundation/lazy/LazyListMeasureKt$measureLazyList$1;->()V -HSPLandroidx/compose/foundation/lazy/LazyListMeasureKt$measureLazyList$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -HSPLandroidx/compose/foundation/lazy/LazyListMeasureKt$measureLazyList$3;->(Ljava/util/ArrayList;Landroidx/compose/foundation/lazy/LazyListPositionedItem;)V -HSPLandroidx/compose/foundation/lazy/LazyListMeasureKt$measureLazyList$3;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -HSPLandroidx/compose/foundation/lazy/LazyListMeasureResult;->(Landroidx/compose/foundation/lazy/LazyMeasuredItem;IZFLandroidx/compose/ui/layout/MeasureResult;Ljava/util/List;ILandroidx/compose/foundation/gestures/Orientation;)V -HSPLandroidx/compose/foundation/lazy/LazyListMeasureResult;->getAlignmentLines()Ljava/util/Map; -HSPLandroidx/compose/foundation/lazy/LazyListMeasureResult;->getHeight()I -HSPLandroidx/compose/foundation/lazy/LazyListMeasureResult;->getWidth()I -HSPLandroidx/compose/foundation/lazy/LazyListMeasureResult;->placeChildren()V -HSPLandroidx/compose/foundation/lazy/LazyListPinningModifier$Companion$EmptyPinnedItemsHandle$1;->()V -HSPLandroidx/compose/foundation/lazy/LazyListPinningModifier;->()V -HSPLandroidx/compose/foundation/lazy/LazyListPinningModifier;->(Landroidx/compose/foundation/lazy/LazyListState;Landroidx/compose/foundation/lazy/LazyListBeyondBoundsInfo;)V -HSPLandroidx/compose/foundation/lazy/LazyListPinningModifier;->getKey()Landroidx/compose/ui/modifier/ProvidableModifierLocal; -HSPLandroidx/compose/foundation/lazy/LazyListPinningModifier;->getValue()Ljava/lang/Object; -HSPLandroidx/compose/foundation/lazy/LazyListPinningModifier;->onModifierLocalsUpdated(Landroidx/compose/ui/modifier/ModifierLocalReadScope;)V -HSPLandroidx/compose/foundation/lazy/LazyListPlaceableWrapper;->(JLandroidx/compose/ui/layout/Placeable;Ljava/lang/Object;)V -HSPLandroidx/compose/foundation/lazy/LazyListPositionedItem;->(IILjava/lang/Object;IIIIZLjava/util/ArrayList;Landroidx/compose/foundation/lazy/LazyListItemPlacementAnimator;J)V -HSPLandroidx/compose/foundation/lazy/LazyListPositionedItem;->getAnimationSpec(I)Landroidx/compose/animation/core/FiniteAnimationSpec; -HSPLandroidx/compose/foundation/lazy/LazyListPositionedItem;->getOffset-Bjo55l4(I)J -HSPLandroidx/compose/foundation/lazy/LazyListPositionedItem;->place(Landroidx/compose/ui/layout/Placeable$PlacementScope;)V -HSPLandroidx/compose/foundation/lazy/LazyListScopeImpl;->()V -HSPLandroidx/compose/foundation/lazy/LazyListScopeImpl;->items(ILkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V -HSPLandroidx/compose/foundation/lazy/LazyListScrollPosition;->(II)V -HSPLandroidx/compose/foundation/lazy/LazyListScrollPosition;->update-AhXoVpI(II)V -HSPLandroidx/compose/foundation/lazy/LazyListState$Companion$Saver$1;->()V -HSPLandroidx/compose/foundation/lazy/LazyListState$Companion$Saver$1;->()V -HSPLandroidx/compose/foundation/lazy/LazyListState$Companion$Saver$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -HSPLandroidx/compose/foundation/lazy/LazyListState$Companion$Saver$2;->()V -HSPLandroidx/compose/foundation/lazy/LazyListState$Companion$Saver$2;->()V -HSPLandroidx/compose/foundation/lazy/LazyListState$remeasurementModifier$1;->(Landroidx/compose/foundation/lazy/LazyListState;)V -HSPLandroidx/compose/foundation/lazy/LazyListState$remeasurementModifier$1;->onRemeasurementAvailable(Landroidx/compose/ui/layout/Remeasurement;)V -HSPLandroidx/compose/foundation/lazy/LazyListState$scrollableState$1;->(Landroidx/compose/foundation/lazy/LazyListState;)V -HSPLandroidx/compose/foundation/lazy/LazyListState;->()V -HSPLandroidx/compose/foundation/lazy/LazyListState;->(II)V -HSPLandroidx/compose/foundation/lazy/LazyListState;->getFirstVisibleItemIndex()I -HSPLandroidx/compose/foundation/lazy/LazyListState;->isScrollInProgress()Z -HSPLandroidx/compose/foundation/lazy/LazyListState;->updateScrollPositionIfTheFirstItemWasMoved$foundation_release(Landroidx/compose/foundation/lazy/LazyListItemProvider;)V -HSPLandroidx/compose/foundation/lazy/LazyListStateKt$rememberLazyListState$1$1;->(II)V -HSPLandroidx/compose/foundation/lazy/LazyListStateKt$rememberLazyListState$1$1;->invoke()Ljava/lang/Object; -HSPLandroidx/compose/foundation/lazy/LazyListStateKt;->rememberLazyListState(Landroidx/compose/runtime/Composer;)Landroidx/compose/foundation/lazy/LazyListState; -HSPLandroidx/compose/foundation/lazy/LazyMeasuredItem;->(ILjava/util/List;ZLandroidx/compose/ui/Alignment$Horizontal;Landroidx/compose/ui/Alignment$Vertical;Landroidx/compose/ui/unit/LayoutDirection;ZIILandroidx/compose/foundation/lazy/LazyListItemPlacementAnimator;IJLjava/lang/Object;)V -HSPLandroidx/compose/foundation/lazy/LazyMeasuredItem;->position(III)Landroidx/compose/foundation/lazy/LazyListPositionedItem; -HSPLandroidx/compose/foundation/lazy/LazyMeasuredItemProvider;->(JZLandroidx/compose/foundation/lazy/LazyListItemProvider;Landroidx/compose/foundation/lazy/layout/LazyLayoutMeasureScope;Landroidx/compose/foundation/lazy/LazyListKt$rememberLazyListMeasurePolicy$1$1$measuredItemProvider$1;)V -HSPLandroidx/compose/foundation/lazy/LazyMeasuredItemProvider;->getAndMeasure-ZjPyQlc(I)Landroidx/compose/foundation/lazy/LazyMeasuredItem; -HSPLandroidx/compose/foundation/lazy/LazySemanticsKt$rememberLazyListSemanticState$1$1$scrollAxisRange$1;->(Landroidx/compose/foundation/lazy/LazyListState;)V -HSPLandroidx/compose/foundation/lazy/LazySemanticsKt$rememberLazyListSemanticState$1$1$scrollAxisRange$2;->(Landroidx/compose/foundation/lazy/LazyListState;Landroidx/compose/foundation/lazy/layout/LazyLayoutItemProvider;)V -HSPLandroidx/compose/foundation/lazy/LazySemanticsKt$rememberLazyListSemanticState$1$1;->(ZLandroidx/compose/foundation/lazy/LazyListState;Landroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProvider$1$1;Z)V -HSPLandroidx/compose/foundation/lazy/LazySemanticsKt$rememberLazyListSemanticState$1$1;->collectionInfo()Landroidx/compose/ui/semantics/CollectionInfo; -HSPLandroidx/compose/foundation/lazy/LazySemanticsKt$rememberLazyListSemanticState$1$1;->scrollAxisRange()Landroidx/compose/ui/semantics/ScrollAxisRange; HSPLandroidx/compose/foundation/lazy/grid/ComposableSingletons$LazyGridItemProviderKt$lambda-1$1;->()V HSPLandroidx/compose/foundation/lazy/grid/ComposableSingletons$LazyGridItemProviderKt$lambda-1$1;->()V HSPLandroidx/compose/foundation/lazy/grid/ComposableSingletons$LazyGridItemProviderKt$lambda-1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; @@ -1243,9 +1168,6 @@ HSPLandroidx/compose/foundation/lazy/grid/LazyGridKt$rememberLazyGridMeasurePoli HSPLandroidx/compose/foundation/lazy/grid/LazyGridKt$rememberLazyGridMeasurePolicy$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/foundation/lazy/grid/LazyGridKt;->LazyGrid(Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/lazy/grid/LazyGridState;Lkotlin/jvm/functions/Function2;Landroidx/compose/foundation/layout/PaddingValues;ZZLandroidx/compose/foundation/gestures/FlingBehavior;ZLandroidx/compose/foundation/layout/Arrangement$Vertical;Landroidx/compose/foundation/layout/Arrangement$Horizontal;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;III)V HSPLandroidx/compose/foundation/lazy/grid/LazyGridKt;->ScrollPositionUpdater(Landroidx/compose/foundation/lazy/grid/LazyGridItemProvider;Landroidx/compose/foundation/lazy/grid/LazyGridState;Landroidx/compose/runtime/Composer;I)V -HSPLandroidx/compose/foundation/lazy/grid/LazyGridMeasureKt$measureLazyGrid$1;->()V -HSPLandroidx/compose/foundation/lazy/grid/LazyGridMeasureKt$measureLazyGrid$1;->()V -HSPLandroidx/compose/foundation/lazy/grid/LazyGridMeasureKt$measureLazyGrid$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/foundation/lazy/grid/LazyGridMeasureKt$measureLazyGrid$3;->(Ljava/util/ArrayList;)V HSPLandroidx/compose/foundation/lazy/grid/LazyGridMeasureKt$measureLazyGrid$3;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/foundation/lazy/grid/LazyGridMeasureResult;->(Landroidx/compose/foundation/lazy/grid/LazyMeasuredLine;IZFLandroidx/compose/ui/layout/MeasureResult;Ljava/util/List;ILandroidx/compose/foundation/gestures/Orientation;)V @@ -1441,7 +1363,6 @@ HSPLandroidx/compose/foundation/selection/ToggleableKt$toggleable$2;->invoke(Lja HSPLandroidx/compose/foundation/selection/ToggleableKt$toggleable$4$1;->(Lkotlin/jvm/functions/Function1;Z)V HSPLandroidx/compose/foundation/selection/ToggleableKt$triStateToggleable$4$1;->(Landroidx/compose/ui/state/ToggleableState;)V HSPLandroidx/compose/foundation/selection/ToggleableKt$triStateToggleable$4$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -HSPLandroidx/compose/foundation/selection/ToggleableKt;->toggleable-O2vRcR0(Landroidx/compose/ui/Modifier;ZLandroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/foundation/Indication;ZLandroidx/compose/ui/semantics/Role;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/foundation/shape/CornerBasedShape;->(Landroidx/compose/foundation/shape/CornerSize;Landroidx/compose/foundation/shape/CornerSize;Landroidx/compose/foundation/shape/CornerSize;Landroidx/compose/foundation/shape/CornerSize;)V HSPLandroidx/compose/foundation/shape/CornerBasedShape;->createOutline-Pq9zytI(JLandroidx/compose/ui/unit/LayoutDirection;Landroidx/compose/ui/unit/Density;)Landroidx/compose/ui/graphics/Outline; HSPLandroidx/compose/foundation/shape/DpCornerSize;->(F)V @@ -1522,13 +1443,12 @@ HSPLandroidx/compose/material/ripple/RippleHostView;->refreshDrawableState()V HSPLandroidx/compose/material/ripple/RippleIndicationInstance;->(Landroidx/compose/runtime/MutableState;Z)V HSPLandroidx/compose/material/ripple/RippleIndicationInstance;->drawStateLayer-H2RKhps(Landroidx/compose/ui/graphics/drawscope/DrawScope;FJ)V HSPLandroidx/compose/material/ripple/RippleKt;->()V -HSPLandroidx/compose/material/ripple/RippleKt;->rememberRipple-9IZ8Weo(ZFJLandroidx/compose/runtime/Composer;II)Landroidx/compose/material/ripple/PlatformRipple; +HSPLandroidx/compose/material/ripple/RippleKt;->rememberRipple-9IZ8Weo(ZFLandroidx/compose/runtime/Composer;II)Landroidx/compose/material/ripple/PlatformRipple; HSPLandroidx/compose/material/ripple/RippleThemeKt$LocalRippleTheme$1;->()V HSPLandroidx/compose/material/ripple/RippleThemeKt$LocalRippleTheme$1;->()V HSPLandroidx/compose/material/ripple/RippleThemeKt;->()V HSPLandroidx/compose/material/ripple/StateLayer;->(Landroidx/compose/runtime/MutableState;Z)V HSPLandroidx/compose/material3/AlertDialogKt$AlertDialogContent$1$$ExternalSyntheticOutline0;->m(JLandroidx/compose/runtime/DynamicProvidableCompositionLocal;)Landroidx/compose/runtime/ProvidedValue; -HSPLandroidx/compose/material3/AppBarKt$$ExternalSyntheticOutline0;->m(Landroidx/compose/runtime/ComposerImpl;Landroidx/compose/ui/layout/MeasurePolicy;Landroidx/compose/ui/node/ComposeUiNode$Companion$SetMeasurePolicy$1;Landroidx/compose/runtime/ComposerImpl;Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/node/ComposeUiNode$Companion$SetDensity$1;Landroidx/compose/runtime/ComposerImpl;Landroidx/compose/ui/unit/LayoutDirection;Landroidx/compose/ui/node/ComposeUiNode$Companion$SetLayoutDirection$1;Landroidx/compose/runtime/ComposerImpl;Landroidx/compose/ui/platform/ViewConfiguration;Landroidx/compose/ui/node/ComposeUiNode$Companion$SetViewConfiguration$1;Landroidx/compose/runtime/ComposerImpl;)Landroidx/compose/runtime/SkippableUpdater; HSPLandroidx/compose/material3/AppBarKt$SingleRowTopAppBar$1$1;->(Landroidx/compose/material3/TopAppBarScrollBehavior;F)V HSPLandroidx/compose/material3/AppBarKt$SingleRowTopAppBar$1$1;->invoke()Ljava/lang/Object; HSPLandroidx/compose/material3/AppBarKt$SingleRowTopAppBar$2;->(Landroidx/compose/foundation/layout/WindowInsets;Landroidx/compose/material3/TopAppBarColors;Lkotlin/jvm/functions/Function2;Landroidx/compose/ui/text/TextStyle;ZLkotlin/jvm/functions/Function2;Landroidx/compose/runtime/internal/ComposableLambdaImpl;ILandroidx/compose/material3/TopAppBarScrollBehavior;)V @@ -1649,7 +1569,6 @@ HSPLandroidx/compose/material3/ComposableSingletons$SnackbarHostKt;->()V HSPLandroidx/compose/material3/ContentColorKt$LocalContentColor$1;->()V HSPLandroidx/compose/material3/ContentColorKt$LocalContentColor$1;->()V HSPLandroidx/compose/material3/ContentColorKt;->()V -HSPLandroidx/compose/material3/DynamicTonalPaletteKt;->dynamicTonalPalette(Landroid/content/Context;)Landroidx/compose/material3/TonalPalette; HSPLandroidx/compose/material3/FabPosition;->(I)V HSPLandroidx/compose/material3/FadeInFadeOutState;->()V HSPLandroidx/compose/material3/IconButtonColors;->(JJJJ)V @@ -1683,7 +1602,6 @@ HSPLandroidx/compose/material3/MinimumTouchTargetModifier;->(J)V HSPLandroidx/compose/material3/MinimumTouchTargetModifier;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; HSPLandroidx/compose/material3/NavigationBarDefaults;->()V HSPLandroidx/compose/material3/NavigationBarItemColors;->(JJJJJ)V -HSPLandroidx/compose/material3/NavigationBarItemDefaults;->colors-zjMxDiM(JJJJJLandroidx/compose/runtime/Composer;II)Landroidx/compose/material3/NavigationBarItemColors; HSPLandroidx/compose/material3/NavigationBarKt$NavigationBar$1;->(Landroidx/compose/foundation/layout/WindowInsets;Lkotlin/jvm/functions/Function3;I)V HSPLandroidx/compose/material3/NavigationBarKt$NavigationBar$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/material3/NavigationBarKt$NavigationBar$2;->(Landroidx/compose/ui/Modifier;JJFLandroidx/compose/foundation/layout/WindowInsets;Lkotlin/jvm/functions/Function3;II)V @@ -1930,7 +1848,6 @@ HSPLandroidx/compose/runtime/ComposerImpl;->getRecomposeScope()Landroidx/compose HSPLandroidx/compose/runtime/ComposerImpl;->getSkipping()Z HSPLandroidx/compose/runtime/ComposerImpl;->nextSlot()Ljava/lang/Object; HSPLandroidx/compose/runtime/ComposerImpl;->realizeDowns$1()V -HSPLandroidx/compose/runtime/ComposerImpl;->realizeOperationLocation(Z)V HSPLandroidx/compose/runtime/ComposerImpl;->realizeUps()V HSPLandroidx/compose/runtime/ComposerImpl;->recompose$runtime_release(Landroidx/compose/runtime/collection/IdentityArrayMap;)Z HSPLandroidx/compose/runtime/ComposerImpl;->recomposeToGroupEnd()V @@ -2193,6 +2110,7 @@ HSPLandroidx/compose/runtime/SlotWriter$groupSlots$1;->(IILandroidx/compos HSPLandroidx/compose/runtime/SlotWriter$groupSlots$1;->hasNext()Z HSPLandroidx/compose/runtime/SlotWriter$groupSlots$1;->next()Ljava/lang/Object; HSPLandroidx/compose/runtime/SlotWriter;->()V +HSPLandroidx/compose/runtime/SlotWriter;->(Landroidx/compose/runtime/SlotTable;)V HSPLandroidx/compose/runtime/SlotWriter;->advanceBy(I)V HSPLandroidx/compose/runtime/SlotWriter;->anchor(I)Landroidx/compose/runtime/Anchor; HSPLandroidx/compose/runtime/SlotWriter;->anchorIndex(Landroidx/compose/runtime/Anchor;)I @@ -2217,7 +2135,6 @@ HSPLandroidx/compose/runtime/SlotWriter;->recalculateMarks()V HSPLandroidx/compose/runtime/SlotWriter;->removeGroup()Z HSPLandroidx/compose/runtime/SlotWriter;->removeGroups(II)Z HSPLandroidx/compose/runtime/SlotWriter;->removeSlots(III)V -HSPLandroidx/compose/runtime/SlotWriter;->set(ILjava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/runtime/SlotWriter;->skipGroup()I HSPLandroidx/compose/runtime/SlotWriter;->skipToGroupEnd()V HSPLandroidx/compose/runtime/SlotWriter;->slotIndex([II)I @@ -2234,13 +2151,6 @@ HSPLandroidx/compose/runtime/SnapshotMutableStateImpl;->getFirstStateRecord()Lan HSPLandroidx/compose/runtime/SnapshotMutableStateImpl;->getValue()Ljava/lang/Object; HSPLandroidx/compose/runtime/SnapshotMutableStateImpl;->prependStateRecord(Landroidx/compose/runtime/snapshots/StateRecord;)V HSPLandroidx/compose/runtime/SnapshotMutableStateImpl;->setValue(Ljava/lang/Object;)V -HSPLandroidx/compose/runtime/SnapshotStateKt;->collectAsState(Lkotlinx/coroutines/flow/Flow;Ljava/lang/Object;Lkotlin/coroutines/CoroutineContext;Landroidx/compose/runtime/Composer;II)Landroidx/compose/runtime/MutableState; -HSPLandroidx/compose/runtime/SnapshotStateKt;->derivedStateOf(Lkotlin/jvm/functions/Function0;)Landroidx/compose/runtime/DerivedSnapshotState; -HSPLandroidx/compose/runtime/SnapshotStateKt;->mutableStateOf$default(Ljava/lang/Object;)Landroidx/compose/runtime/ParcelableSnapshotMutableState; -HSPLandroidx/compose/runtime/SnapshotStateKt;->mutableStateOf(Ljava/lang/Object;Landroidx/compose/runtime/SnapshotMutationPolicy;)Landroidx/compose/runtime/ParcelableSnapshotMutableState; -HSPLandroidx/compose/runtime/SnapshotStateKt;->observeDerivedStateRecalculations(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;)V -HSPLandroidx/compose/runtime/SnapshotStateKt;->rememberUpdatedState(Ljava/lang/Object;Landroidx/compose/runtime/Composer;I)Landroidx/compose/runtime/MutableState; -HSPLandroidx/compose/runtime/SnapshotStateKt;->snapshotFlow(Lkotlin/jvm/functions/Function0;)Lkotlinx/coroutines/flow/SafeFlow; HSPLandroidx/compose/runtime/SnapshotStateKt__DerivedStateKt;->()V HSPLandroidx/compose/runtime/SnapshotStateKt__ProduceStateKt$produceState$3;->(Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/MutableState;Lkotlin/coroutines/Continuation;)V HSPLandroidx/compose/runtime/SnapshotStateKt__ProduceStateKt$produceState$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; @@ -2274,6 +2184,7 @@ HSPLandroidx/compose/runtime/StaticValueHolder;->getValue()Ljava/lang/Object; HSPLandroidx/compose/runtime/StructuralEqualityPolicy;->()V HSPLandroidx/compose/runtime/StructuralEqualityPolicy;->()V HSPLandroidx/compose/runtime/StructuralEqualityPolicy;->equivalent(Ljava/lang/Object;Ljava/lang/Object;)Z +HSPLandroidx/compose/runtime/Updater;->set-impl(Landroidx/compose/runtime/Composer;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)V HSPLandroidx/compose/runtime/collection/IdentityArrayIntMap;->()V HSPLandroidx/compose/runtime/collection/IdentityArrayIntMap;->add(ILjava/lang/Object;)I HSPLandroidx/compose/runtime/collection/IdentityArrayMap;->()V @@ -2375,6 +2286,7 @@ HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementati HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNodeBaseIterator;->()V HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNodeEntriesIterator;->()V HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNodeEntriesIterator;->next()Ljava/lang/Object; +HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNodeKt;->access$insertEntryAtIndex([Ljava/lang/Object;ILjava/lang/Object;Ljava/lang/Object;)[Ljava/lang/Object; HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/Links;->()V HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/Links;->(Ljava/lang/Object;Ljava/lang/Object;)V HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/PersistentOrderedSet;->()V @@ -2408,7 +2320,6 @@ HSPLandroidx/compose/runtime/internal/ThreadMap;->newWith(JLjava/lang/Object;)La HSPLandroidx/compose/runtime/internal/ThreadMapKt;->()V HSPLandroidx/compose/runtime/saveable/ListSaverKt$listSaver$1;->(Lkotlin/jvm/functions/Function2;)V HSPLandroidx/compose/runtime/saveable/ListSaverKt$listSaver$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -HSPLandroidx/compose/runtime/saveable/ListSaverKt;->listSaver(Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;)Landroidx/compose/runtime/saveable/SaverKt$Saver$1; HSPLandroidx/compose/runtime/saveable/RememberSaveableKt$rememberSaveable$1$invoke$$inlined$onDispose$1;->(Landroidx/compose/runtime/saveable/SaveableStateRegistry$Entry;)V HSPLandroidx/compose/runtime/saveable/RememberSaveableKt$rememberSaveable$1$invoke$$inlined$onDispose$1;->dispose()V HSPLandroidx/compose/runtime/saveable/RememberSaveableKt$rememberSaveable$1$valueProvider$1$1$1;->(Landroidx/compose/runtime/saveable/SaveableStateRegistry;)V @@ -2543,14 +2454,12 @@ HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->access$validateOpen(Landroid HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->addRange(IILandroidx/compose/runtime/snapshots/SnapshotIdSet;)Landroidx/compose/runtime/snapshots/SnapshotIdSet; HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->advanceGlobalSnapshot(Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->createTransparentSnapshotWithNoParentReadObserver(Landroidx/compose/runtime/snapshots/Snapshot;Lkotlin/jvm/functions/Function1;Z)Landroidx/compose/runtime/snapshots/Snapshot; -HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->current(Landroidx/compose/runtime/snapshots/StateRecord;)Landroidx/compose/runtime/snapshots/StateRecord; HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->current(Landroidx/compose/runtime/snapshots/StateRecord;Landroidx/compose/runtime/snapshots/Snapshot;)Landroidx/compose/runtime/snapshots/StateRecord; HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->mergedReadObserver(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Z)Lkotlin/jvm/functions/Function1; HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->newOverwritableRecord(Landroidx/compose/runtime/snapshots/StateRecord;Landroidx/compose/runtime/snapshots/StateObject;)Landroidx/compose/runtime/snapshots/StateRecord; HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->newWritableRecord(Landroidx/compose/runtime/snapshots/StateRecord;Landroidx/compose/runtime/snapshots/StateObject;Landroidx/compose/runtime/snapshots/Snapshot;)Landroidx/compose/runtime/snapshots/StateRecord; HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->notifyWrite(Landroidx/compose/runtime/snapshots/Snapshot;Landroidx/compose/runtime/snapshots/StateObject;)V HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->overwritableRecord(Landroidx/compose/runtime/SnapshotMutableStateImpl$StateStateRecord;Landroidx/compose/runtime/snapshots/StateObject;Landroidx/compose/runtime/snapshots/Snapshot;Landroidx/compose/runtime/SnapshotMutableStateImpl$StateStateRecord;)Landroidx/compose/runtime/snapshots/StateRecord; -HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->readable(Landroidx/compose/runtime/snapshots/StateRecord;Landroidx/compose/runtime/snapshots/StateObject;)Landroidx/compose/runtime/snapshots/StateRecord; HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->releasePinningLocked(I)V HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->takeNewGlobalSnapshot(Landroidx/compose/runtime/snapshots/Snapshot;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->writableRecord(Landroidx/compose/runtime/snapshots/StateRecord;Landroidx/compose/runtime/snapshots/StateObject;Landroidx/compose/runtime/snapshots/Snapshot;)Landroidx/compose/runtime/snapshots/StateRecord; @@ -2589,7 +2498,6 @@ HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$observeReads$1$1;-> HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$readObserver$1;->(Landroidx/compose/runtime/snapshots/SnapshotStateObserver;)V HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$readObserver$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver;->(Landroidx/compose/ui/platform/AndroidComposeView$snapshotObserver$1;)V -HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver;->ensureMap(Lkotlin/jvm/functions/Function1;)Landroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap; HSPLandroidx/compose/runtime/snapshots/StateListIterator;->(Landroidx/compose/runtime/snapshots/SnapshotStateList;I)V HSPLandroidx/compose/runtime/snapshots/StateListIterator;->hasNext()Z HSPLandroidx/compose/runtime/snapshots/StateListIterator;->next()Ljava/lang/Object; @@ -2638,7 +2546,6 @@ HSPLandroidx/compose/ui/ComposedModifierKt$materialize$1;->()V HSPLandroidx/compose/ui/ComposedModifierKt$materialize$1;->()V HSPLandroidx/compose/ui/ComposedModifierKt$materialize$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/ui/ComposedModifierKt$materialize$result$1;->(Landroidx/compose/runtime/Composer;)V -HSPLandroidx/compose/ui/ComposedModifierKt$materialize$result$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/ui/ComposedModifierKt;->composed(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function3;)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/ui/ComposedModifierKt;->materialize(Landroidx/compose/runtime/Composer;Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/ui/Modifier$Companion;->()V @@ -2793,9 +2700,6 @@ HSPLandroidx/compose/ui/geometry/CornerRadius;->()V HSPLandroidx/compose/ui/geometry/CornerRadius;->getX-impl(J)F HSPLandroidx/compose/ui/geometry/CornerRadius;->getY-impl(J)F HSPLandroidx/compose/ui/geometry/CornerRadiusKt;->CornerRadius(FF)J -HSPLandroidx/compose/ui/geometry/MutableRect;->()V -HSPLandroidx/compose/ui/geometry/MutableRect;->intersect(FFFF)V -HSPLandroidx/compose/ui/geometry/MutableRect;->isEmpty()Z HSPLandroidx/compose/ui/geometry/Offset;->()V HSPLandroidx/compose/ui/geometry/Offset;->(J)V HSPLandroidx/compose/ui/geometry/Offset;->equals(Ljava/lang/Object;)Z @@ -2822,7 +2726,6 @@ HSPLandroidx/compose/ui/geometry/SizeKt;->Size(FF)J HSPLandroidx/compose/ui/geometry/SizeKt;->getCenter-uvyYCjk(J)J HSPLandroidx/compose/ui/graphics/AndroidBlendMode_androidKt;->toAndroidBlendMode-s9anfk8(I)Landroid/graphics/BlendMode; HSPLandroidx/compose/ui/graphics/AndroidCanvas;->()V -HSPLandroidx/compose/ui/graphics/AndroidCanvas;->clipRect-N_I0leg(FFFFI)V HSPLandroidx/compose/ui/graphics/AndroidCanvas;->concat-58bKbWc([F)V HSPLandroidx/compose/ui/graphics/AndroidCanvas;->disableZ()V HSPLandroidx/compose/ui/graphics/AndroidCanvas;->drawCircle-9KIMszo(FJLandroidx/compose/ui/graphics/Paint;)V @@ -2875,6 +2778,7 @@ HSPLandroidx/compose/ui/graphics/AndroidPath;->relativeCubicTo(FFFFFF)V HSPLandroidx/compose/ui/graphics/AndroidPath;->relativeLineTo(FF)V HSPLandroidx/compose/ui/graphics/AndroidPath;->relativeMoveTo(FF)V HSPLandroidx/compose/ui/graphics/AndroidPath;->reset()V +HSPLandroidx/compose/ui/graphics/AndroidPath_androidKt;->()V HSPLandroidx/compose/ui/graphics/AndroidPath_androidKt;->Path()Landroidx/compose/ui/graphics/AndroidPath; HSPLandroidx/compose/ui/graphics/Api26Bitmap$$ExternalSyntheticApiModelOutline0;->m(IILandroid/graphics/Bitmap$Config;ZLandroid/graphics/ColorSpace;)Landroid/graphics/Bitmap; HSPLandroidx/compose/ui/graphics/Api26Bitmap;->createBitmap-x__-hDU$ui_graphics_release(IIIZLandroidx/compose/ui/graphics/colorspace/ColorSpace;)Landroid/graphics/Bitmap; @@ -2893,7 +2797,6 @@ HSPLandroidx/compose/ui/graphics/Brush$Companion;->()V HSPLandroidx/compose/ui/graphics/Brush$Companion;->linearGradient-mHitzGk$default([Lkotlin/Pair;JJ)Landroidx/compose/ui/graphics/LinearGradient; HSPLandroidx/compose/ui/graphics/Brush;->()V HSPLandroidx/compose/ui/graphics/Brush;->()V -HSPLandroidx/compose/ui/graphics/Canvas;->clipRect-mtrdD-E(Landroidx/compose/ui/geometry/Rect;I)V HSPLandroidx/compose/ui/graphics/CanvasHolder;->()V HSPLandroidx/compose/ui/graphics/CanvasUtils;->enableZ(Landroid/graphics/Canvas;Z)V HSPLandroidx/compose/ui/graphics/CanvasZHelper$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/Canvas;)V @@ -2931,7 +2834,6 @@ HSPLandroidx/compose/ui/graphics/LinearGradient;->(Ljava/util/ArrayList;Lj HSPLandroidx/compose/ui/graphics/LinearGradient;->createShader-uvyYCjk(J)Landroid/graphics/Shader; HSPLandroidx/compose/ui/graphics/Matrix;->constructor-impl$default()[F HSPLandroidx/compose/ui/graphics/Matrix;->map-MK-Hz9U([FJ)J -HSPLandroidx/compose/ui/graphics/Matrix;->map-impl([FLandroidx/compose/ui/geometry/MutableRect;)V HSPLandroidx/compose/ui/graphics/Matrix;->reset-impl([F)V HSPLandroidx/compose/ui/graphics/Matrix;->translate-impl$default([FFF)V HSPLandroidx/compose/ui/graphics/Outline$Rectangle;->(Landroidx/compose/ui/geometry/Rect;)V @@ -2994,7 +2896,6 @@ HSPLandroidx/compose/ui/graphics/colorspace/ColorSpace;->(Ljava/lang/Strin HSPLandroidx/compose/ui/graphics/colorspace/ColorSpace;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/ui/graphics/colorspace/ColorSpace;->isSrgb()Z HSPLandroidx/compose/ui/graphics/colorspace/ColorSpaceKt;->adapt$default(Landroidx/compose/ui/graphics/colorspace/ColorSpace;)Landroidx/compose/ui/graphics/colorspace/ColorSpace; -HSPLandroidx/compose/ui/graphics/colorspace/ColorSpaceKt;->asExternalModel(Lcom/google/samples/apps/nowinandroid/core/database/model/TopicEntity;)Lcom/google/samples/apps/nowinandroid/core/model/data/Topic; 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;I)Landroidx/compose/ui/graphics/colorspace/Connector; @@ -3077,9 +2978,6 @@ HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScopeKt$asDrawTransform$1;- HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScopeKt$asDrawTransform$1;->transform-58bKbWc([F)V HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScopeKt$asDrawTransform$1;->translate(FF)V HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScopeKt;->()V -HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScopeKt;->navigationContentColor-WaAFU9c(Landroidx/compose/runtime/Composer;)J -HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScopeKt;->navigationIndicatorColor-WaAFU9c(Landroidx/compose/runtime/Composer;)J -HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScopeKt;->navigationSelectedItemColor-WaAFU9c(Landroidx/compose/runtime/Composer;)J HSPLandroidx/compose/ui/graphics/drawscope/DrawScope;->drawCircle-VaOC9Bg$default(Landroidx/compose/ui/graphics/drawscope/DrawScope;JFJLandroidx/compose/ui/graphics/drawscope/DrawStyle;I)V HSPLandroidx/compose/ui/graphics/drawscope/DrawScope;->drawImage-AZ2fEMs$default(Landroidx/compose/ui/graphics/drawscope/DrawScope;Landroidx/compose/ui/graphics/ImageBitmap;JJJJFLandroidx/compose/ui/graphics/drawscope/DrawStyle;Landroidx/compose/ui/graphics/ColorFilter;III)V HSPLandroidx/compose/ui/graphics/drawscope/DrawScope;->drawPath-GBMwjPU$default(Landroidx/compose/ui/graphics/drawscope/DrawScope;Landroidx/compose/ui/graphics/Path;Landroidx/compose/ui/graphics/Brush;FLandroidx/compose/ui/graphics/drawscope/Stroke;I)V @@ -3270,6 +3168,7 @@ HSPLandroidx/compose/ui/graphics/vector/compat/AndroidVectorParser;->updateConfi HSPLandroidx/compose/ui/graphics/vector/compat/AndroidVectorResources;->()V HSPLandroidx/compose/ui/graphics/vector/compat/XmlVectorParser_androidKt;->obtainBrushFromComplexColor(Landroidx/core/content/res/ComplexColorCompat;)Landroidx/compose/ui/graphics/Brush; HSPLandroidx/compose/ui/hapticfeedback/PlatformHapticFeedback;->(Landroid/view/View;)V +HSPLandroidx/compose/ui/hapticfeedback/PlatformHapticFeedback;->asExternalModel(Lcom/google/samples/apps/nowinandroid/core/database/model/TopicEntity;)Lcom/google/samples/apps/nowinandroid/core/model/data/Topic; HSPLandroidx/compose/ui/input/InputMode;->(I)V HSPLandroidx/compose/ui/input/InputMode;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/ui/input/InputModeManagerImpl;->(ILandroidx/compose/ui/platform/AndroidComposeView$_inputModeManager$1;)V @@ -3307,9 +3206,6 @@ HSPLandroidx/compose/ui/input/pointer/MotionEventAdapter;->()V HSPLandroidx/compose/ui/input/pointer/NodeParent;->()V HSPLandroidx/compose/ui/input/pointer/PointerEvent;->(Ljava/util/List;)V HSPLandroidx/compose/ui/input/pointer/PointerEvent;->(Ljava/util/List;Landroidx/compose/ui/input/pointer/InternalPointerEvent;)V -HSPLandroidx/compose/ui/input/pointer/PointerEventKt;->()V -HSPLandroidx/compose/ui/input/pointer/PointerEventKt;->()V -HSPLandroidx/compose/ui/input/pointer/PointerEventKt;->onFrame(Landroidx/metrics/performance/FrameData;)V HSPLandroidx/compose/ui/input/pointer/PointerEventPass;->()V HSPLandroidx/compose/ui/input/pointer/PointerEventPass;->(ILjava/lang/String;)V HSPLandroidx/compose/ui/input/pointer/PointerInputChangeEventProducer;->()V @@ -3370,8 +3266,6 @@ HSPLandroidx/compose/ui/layout/ContentScale$Companion$Inside$1;->()V HSPLandroidx/compose/ui/layout/ContentScale$Companion;->()V HSPLandroidx/compose/ui/layout/FixedScale;->()V HSPLandroidx/compose/ui/layout/HorizontalAlignmentLine;->(Lkotlin/jvm/functions/Function2;)V -HSPLandroidx/compose/ui/layout/LayoutCoordinatesKt;->boundsInRoot(Landroidx/compose/ui/node/NodeCoordinator;)Landroidx/compose/ui/geometry/Rect; -HSPLandroidx/compose/ui/layout/LayoutCoordinatesKt;->findRootCoordinates(Landroidx/compose/ui/node/NodeCoordinator;)Landroidx/compose/ui/layout/LayoutCoordinates; HSPLandroidx/compose/ui/layout/LayoutId;->(Ljava/lang/String;)V HSPLandroidx/compose/ui/layout/LayoutId;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/ui/layout/LayoutId;->getLayoutId()Ljava/lang/Object; @@ -3515,7 +3409,6 @@ HSPLandroidx/compose/ui/node/BackwardsCompatNode;->measure-3p2s80s(Landroidx/com HSPLandroidx/compose/ui/node/BackwardsCompatNode;->modifyParentData(Landroidx/compose/ui/unit/Density;Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/ui/node/BackwardsCompatNode;->onAttach()V HSPLandroidx/compose/ui/node/BackwardsCompatNode;->onDetach()V -HSPLandroidx/compose/ui/node/BackwardsCompatNode;->onGloballyPositioned(Landroidx/compose/ui/node/NodeCoordinator;)V HSPLandroidx/compose/ui/node/BackwardsCompatNode;->onMeasureResultChanged()V HSPLandroidx/compose/ui/node/BackwardsCompatNode;->onPlaced(Landroidx/compose/ui/node/NodeCoordinator;)V HSPLandroidx/compose/ui/node/BackwardsCompatNode;->onRemeasured-ozmzZPI(J)V @@ -3590,7 +3483,6 @@ HSPLandroidx/compose/ui/node/LayoutNode$WhenMappings;->()V HSPLandroidx/compose/ui/node/LayoutNode$_foldedChildren$1;->(Landroidx/compose/ui/node/LayoutNode;)V HSPLandroidx/compose/ui/node/LayoutNode$_foldedChildren$1;->invoke()Ljava/lang/Object; HSPLandroidx/compose/ui/node/LayoutNode;->()V -HSPLandroidx/compose/ui/node/LayoutNode;->(IZ)V HSPLandroidx/compose/ui/node/LayoutNode;->(IZI)V HSPLandroidx/compose/ui/node/LayoutNode;->attach$ui_release(Landroidx/compose/ui/node/Owner;)V HSPLandroidx/compose/ui/node/LayoutNode;->clearSubtreeIntrinsicsUsage$ui_release()V @@ -3601,6 +3493,7 @@ HSPLandroidx/compose/ui/node/LayoutNode;->getChildMeasurables$ui_release()Ljava/ HSPLandroidx/compose/ui/node/LayoutNode;->getChildren$ui_release()Ljava/util/List; HSPLandroidx/compose/ui/node/LayoutNode;->getFoldedChildren$ui_release()Ljava/util/List; HSPLandroidx/compose/ui/node/LayoutNode;->getZSortedChildren()Landroidx/compose/runtime/collection/MutableVector; +HSPLandroidx/compose/ui/node/LayoutNode;->get_children$ui_release()Landroidx/compose/runtime/collection/MutableVector; HSPLandroidx/compose/ui/node/LayoutNode;->insertAt$ui_release(ILandroidx/compose/ui/node/LayoutNode;)V HSPLandroidx/compose/ui/node/LayoutNode;->invalidateLayer$ui_release()V HSPLandroidx/compose/ui/node/LayoutNode;->invalidateLayers$ui_release()V @@ -3711,11 +3604,8 @@ HSPLandroidx/compose/ui/node/NodeCoordinator$updateLayerParameters$1;->(Lk HSPLandroidx/compose/ui/node/NodeCoordinator$updateLayerParameters$1;->invoke()Ljava/lang/Object; HSPLandroidx/compose/ui/node/NodeCoordinator;->()V HSPLandroidx/compose/ui/node/NodeCoordinator;->(Landroidx/compose/ui/node/LayoutNode;)V -HSPLandroidx/compose/ui/node/NodeCoordinator;->ancestorToLocal(Landroidx/compose/ui/node/NodeCoordinator;Landroidx/compose/ui/geometry/MutableRect;Z)V -HSPLandroidx/compose/ui/node/NodeCoordinator;->calculateMinimumTouchTargetPadding-E7KxVPU(J)J HSPLandroidx/compose/ui/node/NodeCoordinator;->draw(Landroidx/compose/ui/graphics/Canvas;)V HSPLandroidx/compose/ui/node/NodeCoordinator;->drawContainedDrawModifiers(Landroidx/compose/ui/graphics/Canvas;)V -HSPLandroidx/compose/ui/node/NodeCoordinator;->findCommonAncestor$ui_release(Landroidx/compose/ui/node/NodeCoordinator;)Landroidx/compose/ui/node/NodeCoordinator; HSPLandroidx/compose/ui/node/NodeCoordinator;->getChild()Landroidx/compose/ui/node/LookaheadCapablePlaceable; HSPLandroidx/compose/ui/node/NodeCoordinator;->getCoordinates()Landroidx/compose/ui/layout/LayoutCoordinates; HSPLandroidx/compose/ui/node/NodeCoordinator;->getDensity()F @@ -3724,20 +3614,16 @@ HSPLandroidx/compose/ui/node/NodeCoordinator;->getHasMeasureResult()Z HSPLandroidx/compose/ui/node/NodeCoordinator;->getLayoutDirection()Landroidx/compose/ui/unit/LayoutDirection; HSPLandroidx/compose/ui/node/NodeCoordinator;->getLayoutNode()Landroidx/compose/ui/node/LayoutNode; HSPLandroidx/compose/ui/node/NodeCoordinator;->getMeasureResult$ui_release()Landroidx/compose/ui/layout/MeasureResult; -HSPLandroidx/compose/ui/node/NodeCoordinator;->getMinimumTouchTargetSize-NH-jbRc()J HSPLandroidx/compose/ui/node/NodeCoordinator;->getParent()Landroidx/compose/ui/node/LookaheadCapablePlaceable; HSPLandroidx/compose/ui/node/NodeCoordinator;->getParentData()Ljava/lang/Object; -HSPLandroidx/compose/ui/node/NodeCoordinator;->getParentLayoutCoordinates()Landroidx/compose/ui/node/NodeCoordinator; HSPLandroidx/compose/ui/node/NodeCoordinator;->getPosition-nOcc-ac()J HSPLandroidx/compose/ui/node/NodeCoordinator;->getSize-YbymL2g()J HSPLandroidx/compose/ui/node/NodeCoordinator;->headNode(Z)Landroidx/compose/ui/Modifier$Node; HSPLandroidx/compose/ui/node/NodeCoordinator;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -HSPLandroidx/compose/ui/node/NodeCoordinator;->isTransparent()Z HSPLandroidx/compose/ui/node/NodeCoordinator;->isValid()Z HSPLandroidx/compose/ui/node/NodeCoordinator;->onLayerBlockUpdated(Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/ui/node/NodeCoordinator;->onLayoutModifierNodeChanged()V HSPLandroidx/compose/ui/node/NodeCoordinator;->onMeasured()V -HSPLandroidx/compose/ui/node/NodeCoordinator;->onPlaced$1()V HSPLandroidx/compose/ui/node/NodeCoordinator;->placeAt-f8xVGno(JFLkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/ui/node/NodeCoordinator;->replace$ui_release()V HSPLandroidx/compose/ui/node/NodeCoordinator;->setMeasureResult$ui_release(Landroidx/compose/ui/layout/MeasureResult;)V @@ -3749,7 +3635,6 @@ HSPLandroidx/compose/ui/node/OnPositionedDispatcher$Companion$DepthComparator;-> HSPLandroidx/compose/ui/node/OnPositionedDispatcher$Companion$DepthComparator;->()V HSPLandroidx/compose/ui/node/OnPositionedDispatcher$Companion$DepthComparator;->compare(Ljava/lang/Object;Ljava/lang/Object;)I HSPLandroidx/compose/ui/node/OnPositionedDispatcher;->()V -HSPLandroidx/compose/ui/node/OnPositionedDispatcher;->dispatchHierarchy(Landroidx/compose/ui/node/LayoutNode;)V HSPLandroidx/compose/ui/node/OwnerSnapshotObserver$onCommitAffectingLayout$1;->()V HSPLandroidx/compose/ui/node/OwnerSnapshotObserver$onCommitAffectingLayout$1;->()V HSPLandroidx/compose/ui/node/OwnerSnapshotObserver$onCommitAffectingLayoutModifier$1;->()V @@ -3813,14 +3698,12 @@ HSPLandroidx/compose/ui/platform/AndroidComposeView$snapshotObserver$1;->( HSPLandroidx/compose/ui/platform/AndroidComposeView$snapshotObserver$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/ui/platform/AndroidComposeView;->()V HSPLandroidx/compose/ui/platform/AndroidComposeView;->(Landroid/content/Context;)V -HSPLandroidx/compose/ui/platform/AndroidComposeView;->clearChildInvalidObservations(Landroid/view/ViewGroup;)V HSPLandroidx/compose/ui/platform/AndroidComposeView;->convertMeasureSpec(I)Lkotlin/Pair; HSPLandroidx/compose/ui/platform/AndroidComposeView;->createLayer(Landroidx/compose/ui/node/NodeCoordinator$invalidateParentLayer$1;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/node/OwnedLayer; HSPLandroidx/compose/ui/platform/AndroidComposeView;->dispatchDraw(Landroid/graphics/Canvas;)V HSPLandroidx/compose/ui/platform/AndroidComposeView;->forceMeasureTheSubtree(Landroidx/compose/ui/node/LayoutNode;)V HSPLandroidx/compose/ui/platform/AndroidComposeView;->getAccessibilityManager()Landroidx/compose/ui/platform/AccessibilityManager; HSPLandroidx/compose/ui/platform/AndroidComposeView;->getAccessibilityManager()Landroidx/compose/ui/platform/AndroidAccessibilityManager; -HSPLandroidx/compose/ui/platform/AndroidComposeView;->getAndroidViewsHandler$ui_release()Landroidx/compose/ui/platform/AndroidViewsHandler; HSPLandroidx/compose/ui/platform/AndroidComposeView;->getAutofill()Landroidx/compose/ui/autofill/Autofill; HSPLandroidx/compose/ui/platform/AndroidComposeView;->getAutofillTree()Landroidx/compose/ui/autofill/AutofillTree; HSPLandroidx/compose/ui/platform/AndroidComposeView;->getClipboardManager()Landroidx/compose/ui/platform/AndroidClipboardManager; @@ -3847,7 +3730,6 @@ HSPLandroidx/compose/ui/platform/AndroidComposeView;->getViewTreeOwners()Landroi HSPLandroidx/compose/ui/platform/AndroidComposeView;->getWindowInfo()Landroidx/compose/ui/platform/WindowInfo; HSPLandroidx/compose/ui/platform/AndroidComposeView;->invalidateLayers(Landroidx/compose/ui/node/LayoutNode;)V HSPLandroidx/compose/ui/platform/AndroidComposeView;->invalidateLayoutNodeMeasurement(Landroidx/compose/ui/node/LayoutNode;)V -HSPLandroidx/compose/ui/platform/AndroidComposeView;->localToScreen-MK-Hz9U(J)J HSPLandroidx/compose/ui/platform/AndroidComposeView;->measureAndLayout(Z)V HSPLandroidx/compose/ui/platform/AndroidComposeView;->notifyLayerIsDirty$ui_release(Landroidx/compose/ui/node/OwnedLayer;Z)V HSPLandroidx/compose/ui/platform/AndroidComposeView;->onAttach(Landroidx/compose/ui/node/LayoutNode;)V @@ -3864,7 +3746,6 @@ HSPLandroidx/compose/ui/platform/AndroidComposeView;->onResume(Landroidx/lifecyc HSPLandroidx/compose/ui/platform/AndroidComposeView;->onRtlPropertiesChanged(I)V HSPLandroidx/compose/ui/platform/AndroidComposeView;->onSemanticsChange()V HSPLandroidx/compose/ui/platform/AndroidComposeView;->onWindowFocusChanged(Z)V -HSPLandroidx/compose/ui/platform/AndroidComposeView;->recalculateWindowPosition()V HSPLandroidx/compose/ui/platform/AndroidComposeView;->registerOnEndApplyChangesListener(Lkotlin/jvm/functions/Function0;)V HSPLandroidx/compose/ui/platform/AndroidComposeView;->registerOnLayoutCompletedListener(Landroidx/compose/ui/node/BackwardsCompatNode$initializeModifier$4;)V HSPLandroidx/compose/ui/platform/AndroidComposeView;->requestOnPositionedCallback(Landroidx/compose/ui/node/LayoutNode;)V @@ -3878,24 +3759,14 @@ HSPLandroidx/compose/ui/platform/AndroidComposeView;->updatePositionCacheAndDisp HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$$ExternalSyntheticLambda0;->(Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;)V HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$1;->(Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;)V HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$1;->onViewAttachedToWindow(Landroid/view/View;)V -HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$Api24Impl;->addSetProgressAction(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;Landroidx/compose/ui/semantics/SemanticsNode;)V HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$MyNodeProvider;->(Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;)V -HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$MyNodeProvider;->createAccessibilityNodeInfo(I)Landroid/view/accessibility/AccessibilityNodeInfo; HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$SemanticsNodeCopy;->(Landroidx/compose/ui/semantics/SemanticsNode;Ljava/util/Map;)V HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$boundsUpdatesEventLoop$1;->(Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;Lkotlin/coroutines/Continuation;)V HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$sendScrollEventIfNeededLambda$1;->(Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;)V HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->()V HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->(Landroidx/compose/ui/platform/AndroidComposeView;)V HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->boundsUpdatesEventLoop(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getAccessibilityNodeProvider(Landroid/view/View;)Landroidx/core/view/accessibility/AccessibilityNodeProviderCompat; -HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getCurrentSemanticsNodes()Ljava/util/Map; -HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getIterableTextForAccessibility(Landroidx/compose/ui/semantics/SemanticsNode;)Ljava/lang/String; -HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getTextForTextField(Landroidx/compose/ui/semantics/SemanticsConfiguration;)Landroidx/compose/ui/text/AnnotatedString; HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->isAccessibilityEnabled()Z -HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->trimToSize(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; -HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat_androidKt;->access$enabled(Landroidx/compose/ui/semantics/SemanticsNode;)Z -HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat_androidKt;->getAllUncoveredSemanticsNodesToMap$findAllSemanticNodesRecursive(Landroid/graphics/Region;Landroidx/compose/ui/semantics/SemanticsNode;Ljava/util/LinkedHashMap;Landroidx/compose/ui/semantics/SemanticsNode;)V -HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat_androidKt;->isTextField(Landroidx/compose/ui/semantics/SemanticsNode;)Z HSPLandroidx/compose/ui/platform/AndroidComposeViewForceDarkModeQ$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/View;)V HSPLandroidx/compose/ui/platform/AndroidComposeViewForceDarkModeQ;->()V HSPLandroidx/compose/ui/platform/AndroidComposeViewForceDarkModeQ;->()V @@ -3954,21 +3825,13 @@ HSPLandroidx/compose/ui/platform/AndroidUiFrameClock;->minusKey(Lkotlin/coroutin HSPLandroidx/compose/ui/platform/AndroidUiFrameClock;->withFrameNanos(Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLandroidx/compose/ui/platform/AndroidUriHandler;->(Landroid/content/Context;)V HSPLandroidx/compose/ui/platform/AndroidViewConfiguration;->(Landroid/view/ViewConfiguration;)V -HSPLandroidx/compose/ui/platform/AndroidViewsHandler;->(Landroid/content/Context;)V -HSPLandroidx/compose/ui/platform/AndroidViewsHandler;->getLayoutNodeToHolder()Ljava/util/HashMap; -HSPLandroidx/compose/ui/platform/AndroidViewsHandler;->onLayout(ZIIII)V -HSPLandroidx/compose/ui/platform/AndroidViewsHandler;->onMeasure(II)V -HSPLandroidx/compose/ui/platform/AndroidViewsHandler;->requestLayout()V -HSPLandroidx/compose/ui/platform/CalculateMatrixToWindowApi29$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/View;Landroid/graphics/Matrix;)V HSPLandroidx/compose/ui/platform/CalculateMatrixToWindowApi29;->()V -HSPLandroidx/compose/ui/platform/CalculateMatrixToWindowApi29;->calculateMatrixToWindow-EL8BTi8(Landroid/view/View;[F)V HSPLandroidx/compose/ui/platform/ComposableSingletons$Wrapper_androidKt$lambda-1$1;->()V HSPLandroidx/compose/ui/platform/ComposableSingletons$Wrapper_androidKt$lambda-1$1;->()V HSPLandroidx/compose/ui/platform/ComposableSingletons$Wrapper_androidKt;->()V HSPLandroidx/compose/ui/platform/ComposeView$Content$1;->(Landroidx/compose/ui/platform/ComposeView;I)V HSPLandroidx/compose/ui/platform/ComposeView;->(Landroid/content/Context;)V HSPLandroidx/compose/ui/platform/ComposeView;->Content(Landroidx/compose/runtime/Composer;I)V -HSPLandroidx/compose/ui/platform/ComposeView;->getAccessibilityClassName()Ljava/lang/CharSequence; HSPLandroidx/compose/ui/platform/ComposeView;->getShouldCreateCompositionOnAttachedToWindow()Z HSPLandroidx/compose/ui/platform/ComposeView;->setContent(Lkotlin/jvm/functions/Function2;)V HSPLandroidx/compose/ui/platform/CompositionLocalsKt$LocalAccessibilityManager$1;->()V @@ -4037,7 +3900,6 @@ HSPLandroidx/compose/ui/platform/InspectionModeKt$LocalInspectionMode$1;-> HSPLandroidx/compose/ui/platform/InspectionModeKt$LocalInspectionMode$1;->invoke()Ljava/lang/Object; HSPLandroidx/compose/ui/platform/InspectionModeKt;->()V HSPLandroidx/compose/ui/platform/InspectorValueInfo;->(Lkotlin/jvm/functions/Function1;)V -HSPLandroidx/compose/ui/platform/InvertMatrixKt;->invertTo-JiSxe2E([F[F)Z HSPLandroidx/compose/ui/platform/LayerMatrixCache;->(Lkotlin/jvm/functions/Function2;)V HSPLandroidx/compose/ui/platform/LayerMatrixCache;->calculateMatrix-GrdbGEg(Ljava/lang/Object;)[F HSPLandroidx/compose/ui/platform/LayerMatrixCache;->invalidate()V @@ -4095,14 +3957,12 @@ HSPLandroidx/compose/ui/platform/RenderNodeLayer$Companion$getMatrix$1;->invoke( HSPLandroidx/compose/ui/platform/RenderNodeLayer;->(Landroidx/compose/ui/platform/AndroidComposeView;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/node/NodeCoordinator$invalidateParentLayer$1;)V HSPLandroidx/compose/ui/platform/RenderNodeLayer;->drawLayer(Landroidx/compose/ui/graphics/Canvas;)V HSPLandroidx/compose/ui/platform/RenderNodeLayer;->invalidate()V -HSPLandroidx/compose/ui/platform/RenderNodeLayer;->mapBounds(Landroidx/compose/ui/geometry/MutableRect;Z)V HSPLandroidx/compose/ui/platform/RenderNodeLayer;->mapOffset-8S9VItk(JZ)J HSPLandroidx/compose/ui/platform/RenderNodeLayer;->move--gyyYBs(J)V HSPLandroidx/compose/ui/platform/RenderNodeLayer;->resize-ozmzZPI(J)V HSPLandroidx/compose/ui/platform/RenderNodeLayer;->setDirty(Z)V HSPLandroidx/compose/ui/platform/RenderNodeLayer;->updateDisplayList()V HSPLandroidx/compose/ui/platform/RenderNodeLayer;->updateLayerProperties-NHXXZp8(FFFFFFFFFFJLandroidx/compose/ui/graphics/Shape;ZJJLandroidx/compose/ui/unit/LayoutDirection;Landroidx/compose/ui/unit/Density;)V -HSPLandroidx/compose/ui/platform/SemanticsNodeWithAdjustedBounds;->(Landroidx/compose/ui/semantics/SemanticsNode;Landroid/graphics/Rect;)V HSPLandroidx/compose/ui/platform/TestTagKt$testTag$1;->(Ljava/lang/String;)V HSPLandroidx/compose/ui/platform/TestTagKt$testTag$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/ui/platform/TestTagKt;->testTag(Landroidx/compose/ui/Modifier;Ljava/lang/String;)Landroidx/compose/ui/Modifier; @@ -4175,9 +4035,6 @@ HSPLandroidx/compose/ui/platform/WrapperVerificationHelperMethods;->()V HSPLandroidx/compose/ui/platform/WrapperVerificationHelperMethods;->attributeSourceResourceMap(Landroid/view/View;)Ljava/util/Map; HSPLandroidx/compose/ui/platform/Wrapper_androidKt;->()V HSPLandroidx/compose/ui/platform/Wrapper_androidKt;->setContent(Landroidx/compose/ui/platform/AbstractComposeView;Landroidx/compose/runtime/CompositionContext;Landroidx/compose/runtime/internal/ComposableLambdaImpl;)Landroidx/compose/runtime/Composition; -HSPLandroidx/compose/ui/platform/accessibility/CollectionInfoKt;->hasCollectionInfo(Landroidx/compose/ui/semantics/SemanticsNode;)Z -HSPLandroidx/compose/ui/platform/accessibility/CollectionInfoKt;->setCollectionInfo(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;Landroidx/compose/ui/semantics/SemanticsNode;)V -HSPLandroidx/compose/ui/platform/accessibility/CollectionInfoKt;->setCollectionItemInfo(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;Landroidx/compose/ui/semantics/SemanticsNode;)V HSPLandroidx/compose/ui/res/ImageVectorCache$ImageVectorEntry;->(Landroidx/compose/ui/graphics/vector/ImageVector;I)V HSPLandroidx/compose/ui/res/ImageVectorCache$Key;->(ILandroid/content/res/Resources$Theme;)V HSPLandroidx/compose/ui/res/ImageVectorCache$Key;->equals(Ljava/lang/Object;)Z @@ -4188,9 +4045,6 @@ HSPLandroidx/compose/ui/res/Resources_androidKt;->resources(Landroidx/compose/ru HSPLandroidx/compose/ui/semantics/AccessibilityAction;->(Ljava/lang/String;Lkotlin/Function;)V HSPLandroidx/compose/ui/semantics/AccessibilityAction;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/ui/semantics/CollectionInfo;->(II)V -HSPLandroidx/compose/ui/semantics/NodeLocationHolder;->(Landroidx/compose/ui/node/LayoutNode;Landroidx/compose/ui/node/LayoutNode;)V -HSPLandroidx/compose/ui/semantics/NodeLocationHolder;->compareTo(Landroidx/compose/ui/semantics/NodeLocationHolder;)I -HSPLandroidx/compose/ui/semantics/NodeLocationHolder;->compareTo(Ljava/lang/Object;)I HSPLandroidx/compose/ui/semantics/Role;->(I)V HSPLandroidx/compose/ui/semantics/Role;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/ui/semantics/ScrollAxisRange;->(Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Z)V @@ -4199,29 +4053,17 @@ HSPLandroidx/compose/ui/semantics/SemanticsConfiguration;->()V HSPLandroidx/compose/ui/semantics/SemanticsConfiguration;->contains(Landroidx/compose/ui/semantics/SemanticsPropertyKey;)Z HSPLandroidx/compose/ui/semantics/SemanticsConfiguration;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/ui/semantics/SemanticsConfiguration;->set(Landroidx/compose/ui/semantics/SemanticsPropertyKey;Ljava/lang/Object;)V -HSPLandroidx/compose/ui/semantics/SemanticsConfigurationKt;->getOrNull(Landroidx/compose/ui/semantics/SemanticsConfiguration;Landroidx/compose/ui/semantics/SemanticsPropertyKey;)Ljava/lang/Object; HSPLandroidx/compose/ui/semantics/SemanticsModifierCore;->()V HSPLandroidx/compose/ui/semantics/SemanticsModifierCore;->(ZZLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/ui/semantics/SemanticsModifierCore;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/ui/semantics/SemanticsModifierCore;->getSemanticsConfiguration()Landroidx/compose/ui/semantics/SemanticsConfiguration; HSPLandroidx/compose/ui/semantics/SemanticsModifierKt;->clearAndSetSemantics(Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/ui/semantics/SemanticsModifierKt;->semantics(Landroidx/compose/ui/Modifier;ZLkotlin/jvm/functions/Function1;)Landroidx/compose/ui/Modifier; -HSPLandroidx/compose/ui/semantics/SemanticsNode$emitFakeNodes$fakeNode$1;->(Landroidx/compose/ui/semantics/Role;)V -HSPLandroidx/compose/ui/semantics/SemanticsNode$emitFakeNodes$fakeNode$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -HSPLandroidx/compose/ui/semantics/SemanticsNode$fakeSemanticsNode$fakeNode$1;->(Lkotlin/jvm/functions/Function1;)V -HSPLandroidx/compose/ui/semantics/SemanticsNode$fakeSemanticsNode$fakeNode$1;->getSemanticsConfiguration()Landroidx/compose/ui/semantics/SemanticsConfiguration; -HSPLandroidx/compose/ui/semantics/SemanticsNode;->(Landroidx/compose/ui/node/SemanticsModifierNode;Z)V HSPLandroidx/compose/ui/semantics/SemanticsNode;->(Landroidx/compose/ui/node/SemanticsModifierNode;ZLandroidx/compose/ui/node/LayoutNode;)V -HSPLandroidx/compose/ui/semantics/SemanticsNode;->fakeSemanticsNode-ypyhhiA(Landroidx/compose/ui/semantics/Role;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/semantics/SemanticsNode; -HSPLandroidx/compose/ui/semantics/SemanticsNode;->findCoordinatorToGetBounds$ui_release()Landroidx/compose/ui/node/NodeCoordinator; -HSPLandroidx/compose/ui/semantics/SemanticsNode;->getBoundsInRoot()Landroidx/compose/ui/geometry/Rect; HSPLandroidx/compose/ui/semantics/SemanticsNode;->getChildren(Z)Ljava/util/List; -HSPLandroidx/compose/ui/semantics/SemanticsNode;->getConfig()Landroidx/compose/ui/semantics/SemanticsConfiguration; -HSPLandroidx/compose/ui/semantics/SemanticsNode;->getParent()Landroidx/compose/ui/semantics/SemanticsNode; HSPLandroidx/compose/ui/semantics/SemanticsNode;->isMergingSemanticsOfDescendants()Z HSPLandroidx/compose/ui/semantics/SemanticsNode;->unmergedChildren$ui_release(ZZ)Ljava/util/List; HSPLandroidx/compose/ui/semantics/SemanticsNodeKt;->findOneLayerOfSemanticsWrappers(Landroidx/compose/ui/node/LayoutNode;Ljava/util/List;)V -HSPLandroidx/compose/ui/semantics/SemanticsNodeKt;->getOuterMergingSemantics(Landroidx/compose/ui/node/LayoutNode;)Landroidx/compose/ui/node/SemanticsModifierNode; HSPLandroidx/compose/ui/semantics/SemanticsNodeKt;->getOuterSemantics(Landroidx/compose/ui/node/LayoutNode;)Landroidx/compose/ui/node/SemanticsModifierNode; HSPLandroidx/compose/ui/semantics/SemanticsOwner;->(Landroidx/compose/ui/node/LayoutNode;)V HSPLandroidx/compose/ui/semantics/SemanticsOwner;->getUnmergedRootSemanticsNode()Landroidx/compose/ui/semantics/SemanticsNode; @@ -4248,7 +4090,6 @@ HSPLandroidx/compose/ui/semantics/SemanticsPropertiesAndroid;->()V HSPLandroidx/compose/ui/semantics/SemanticsPropertiesKt$ActionPropertyKey$1;->()V HSPLandroidx/compose/ui/semantics/SemanticsPropertiesKt$ActionPropertyKey$1;->()V HSPLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->()V -HSPLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->onClick(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Ljava/lang/String;Landroidx/compose/foundation/ClickableKt$genericClickableWithoutGesture$clickSemantics$1$1;)V HSPLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->setContentDescription(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Ljava/lang/String;)V HSPLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->setRole-kuIjeqM(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;I)V HSPLandroidx/compose/ui/semantics/SemanticsProperties_androidKt;->()V @@ -4256,9 +4097,6 @@ HSPLandroidx/compose/ui/semantics/SemanticsPropertyKey$1;->()V HSPLandroidx/compose/ui/semantics/SemanticsPropertyKey$1;->()V HSPLandroidx/compose/ui/semantics/SemanticsPropertyKey;->(Ljava/lang/String;Lkotlin/jvm/functions/Function2;)V HSPLandroidx/compose/ui/semantics/SemanticsPropertyKey;->setValue(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Lkotlin/reflect/KProperty;Ljava/lang/Object;)V -HSPLandroidx/compose/ui/semantics/SemanticsSortKt;->findCoordinatorToGetBounds(Landroidx/compose/ui/node/LayoutNode;)Landroidx/compose/ui/node/NodeCoordinator; -HSPLandroidx/compose/ui/semantics/SemanticsSortKt;->findNodeByPredicateTraversal(Landroidx/compose/ui/node/LayoutNode;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/node/LayoutNode; -HSPLandroidx/compose/ui/semantics/SemanticsSortKt;->findOneLayerOfSemanticsWrappersSortedByBounds(Landroidx/compose/ui/node/LayoutNode;Ljava/util/List;)V HSPLandroidx/compose/ui/state/ToggleableState;->()V HSPLandroidx/compose/ui/state/ToggleableState;->(ILjava/lang/String;)V HSPLandroidx/compose/ui/text/AndroidParagraph$wordBoundary$2;->(Landroidx/compose/ui/text/AndroidParagraph;)V @@ -4322,7 +4160,6 @@ HSPLandroidx/compose/ui/text/android/LayoutIntrinsics$maxIntrinsicWidth$2;->invoke()Ljava/lang/Object; HSPLandroidx/compose/ui/text/android/LayoutIntrinsics$minIntrinsicWidth$2;->(Ljava/lang/CharSequence;Landroidx/compose/ui/text/platform/AndroidTextPaint;)V HSPLandroidx/compose/ui/text/android/LayoutIntrinsics;->(ILandroidx/compose/ui/text/platform/AndroidTextPaint;Ljava/lang/CharSequence;)V -HSPLandroidx/compose/ui/text/android/SpannedExtensionsKt;->hasSpan(Landroid/text/Spanned;Ljava/lang/Class;)Z HSPLandroidx/compose/ui/text/android/StaticLayoutFactory23;->()V HSPLandroidx/compose/ui/text/android/StaticLayoutFactory23;->create(Landroidx/compose/ui/text/android/StaticLayoutParams;)Landroid/text/StaticLayout; HSPLandroidx/compose/ui/text/android/StaticLayoutFactory26$$ExternalSyntheticApiModelOutline0;->m(Landroid/text/StaticLayout$Builder;I)V @@ -4351,7 +4188,6 @@ HSPLandroidx/compose/ui/text/android/style/LetterSpacingSpanPx;->updateDrawState HSPLandroidx/compose/ui/text/android/style/LetterSpacingSpanPx;->updateMeasureState(Landroid/text/TextPaint;)V HSPLandroidx/compose/ui/text/android/style/LineHeightSpan;->(F)V HSPLandroidx/compose/ui/text/android/style/LineHeightSpan;->chooseHeight(Ljava/lang/CharSequence;IIIILandroid/graphics/Paint$FontMetricsInt;)V -HSPLandroidx/compose/ui/text/caches/ContainerHelpersKt;->()V HSPLandroidx/compose/ui/text/caches/LruCache;->()V HSPLandroidx/compose/ui/text/caches/LruCache;->get(Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/ui/text/caches/LruCache;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; @@ -4387,10 +4223,6 @@ HSPLandroidx/compose/ui/text/font/PlatformResolveInterceptor$Companion$Default$1 HSPLandroidx/compose/ui/text/font/PlatformResolveInterceptor$Companion;->()V HSPLandroidx/compose/ui/text/font/PlatformResolveInterceptor$Companion;->()V HSPLandroidx/compose/ui/text/font/PlatformResolveInterceptor;->()V -HSPLandroidx/compose/ui/text/font/PlatformTypefacesApi28;->()V -HSPLandroidx/compose/ui/text/font/PlatformTypefacesApi28;->createAndroidTypefaceApi28-RetOiIg(Ljava/lang/String;Landroidx/compose/ui/text/font/FontWeight;I)Landroid/graphics/Typeface; -HSPLandroidx/compose/ui/text/font/PlatformTypefacesApi28;->createDefault-FO1MlWM(Landroidx/compose/ui/text/font/FontWeight;I)Landroid/graphics/Typeface; -HSPLandroidx/compose/ui/text/font/PlatformTypefacesApi28;->createNamed-RetOiIg(Landroidx/compose/ui/text/font/GenericFontFamily;Landroidx/compose/ui/text/font/FontWeight;I)Landroid/graphics/Typeface; HSPLandroidx/compose/ui/text/font/SystemFontFamily;->()V HSPLandroidx/compose/ui/text/font/TypefaceRequest;->(Landroidx/compose/ui/text/font/FontFamily;Landroidx/compose/ui/text/font/FontWeight;IILjava/lang/Object;)V HSPLandroidx/compose/ui/text/font/TypefaceRequest;->equals(Ljava/lang/Object;)Z @@ -4471,6 +4303,9 @@ HSPLandroidx/compose/ui/text/style/TextGeometricTransform;->(FF)V HSPLandroidx/compose/ui/text/style/TextGeometricTransform;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/ui/text/style/TextIndent;->()V HSPLandroidx/compose/ui/text/style/TextIndent;->(JJ)V +HSPLandroidx/compose/ui/unit/AndroidDensity_androidKt;->Density(Landroid/content/Context;)Landroidx/compose/ui/unit/DensityImpl; +HSPLandroidx/compose/ui/unit/AndroidDensity_androidKt;->getSafeDrawing(Landroidx/compose/runtime/Composer;)Landroidx/compose/foundation/layout/UnionInsets; +HSPLandroidx/compose/ui/unit/AndroidDensity_androidKt;->toInsetsValues(Landroidx/core/graphics/Insets;)Landroidx/compose/foundation/layout/InsetsValues; HSPLandroidx/compose/ui/unit/Constraints$Companion;->bitsNeedForSize(I)I HSPLandroidx/compose/ui/unit/Constraints$Companion;->createConstraints-Zbe2FdA$ui_unit_release(IIII)J HSPLandroidx/compose/ui/unit/Constraints$Companion;->fixed-JhjzzOo(II)J @@ -4496,7 +4331,6 @@ HSPLandroidx/compose/ui/unit/Density;->toDp-u2uoSUM(I)F HSPLandroidx/compose/ui/unit/Density;->toDpSize-k-rfVVM(J)J HSPLandroidx/compose/ui/unit/Density;->toPx--R2X_6o(J)F HSPLandroidx/compose/ui/unit/Density;->toPx-0680j_4(F)F -HSPLandroidx/compose/ui/unit/Density;->toSize-XkaWNTQ(J)J HSPLandroidx/compose/ui/unit/DensityImpl;->(FF)V HSPLandroidx/compose/ui/unit/DensityImpl;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/ui/unit/DensityImpl;->getDensity()F @@ -4538,8 +4372,8 @@ HSPLandroidx/compose/ui/unit/TextUnitKt;->isUnspecified--R2X_6o(J)Z HSPLandroidx/compose/ui/unit/TextUnitKt;->pack(FJ)J HSPLandroidx/compose/ui/unit/TextUnitType;->(J)V HSPLandroidx/compose/ui/unit/TextUnitType;->equals-impl0(JJ)Z -HSPLandroidx/compose/ui/window/PopupLayoutHelperImpl;->()V -HSPLandroidx/compose/ui/window/PopupLayoutHelperImpl;->access$multiplyColumn(IFFF[F)F +HSPLandroidx/compose/ui/util/MathHelpersKt;->lerp(FFF)F +HSPLandroidx/core/R$id;->ceilToIntPx(F)I HSPLandroidx/core/app/ComponentActivity;->()V HSPLandroidx/core/app/ComponentActivity;->onCreate(Landroid/os/Bundle;)V HSPLandroidx/core/app/CoreComponentFactory;->()V @@ -4550,6 +4384,8 @@ HSPLandroidx/core/app/CoreComponentFactory;->instantiateProvider(Ljava/lang/Clas HSPLandroidx/core/app/CoreComponentFactory;->instantiateService(Ljava/lang/ClassLoader;Ljava/lang/String;Landroid/content/Intent;)Landroid/app/Service; HSPLandroidx/core/content/ContextCompat$Api23Impl;->getSystemService(Landroid/content/Context;Ljava/lang/Class;)Ljava/lang/Object; HSPLandroidx/core/content/ContextCompat;->()V +HSPLandroidx/core/content/PermissionChecker;->createZeroVectorFrom(Landroidx/compose/animation/core/TwoWayConverter;Ljava/lang/Object;)Landroidx/compose/animation/core/AnimationVector; +HSPLandroidx/core/content/res/CamUtils;->()V HSPLandroidx/core/content/res/ComplexColorCompat;->(Landroid/graphics/Shader;Landroid/content/res/ColorStateList;I)V HSPLandroidx/core/content/res/TypedArrayUtils;->getNamedComplexColor(Landroid/content/res/TypedArray;Lorg/xmlpull/v1/XmlPullParser;Landroid/content/res/Resources$Theme;Ljava/lang/String;I)Landroidx/core/content/res/ComplexColorCompat; HSPLandroidx/core/content/res/TypedArrayUtils;->getNamedFloat(Landroid/content/res/TypedArray;Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;IF)F @@ -4561,28 +4397,12 @@ HSPLandroidx/core/graphics/Insets;->(IIII)V HSPLandroidx/core/graphics/Insets;->equals(Ljava/lang/Object;)Z HSPLandroidx/core/graphics/Insets;->of(IIII)Landroidx/core/graphics/Insets; HSPLandroidx/core/graphics/Insets;->toCompatInsets(Landroid/graphics/Insets;)Landroidx/core/graphics/Insets; -HSPLandroidx/core/graphics/TypefaceCompat;->()V -HSPLandroidx/core/graphics/TypefaceCompatApi29Impl;->()V -HSPLandroidx/core/graphics/TypefaceCompatApi29Impl;->createFromFontInfo(Landroid/content/Context;[Landroidx/core/provider/FontsContractCompat$FontInfo;I)Landroid/graphics/Typeface; -HSPLandroidx/core/graphics/TypefaceCompatApi29Impl;->findBaseFont(Landroid/graphics/fonts/FontFamily;I)Landroid/graphics/fonts/Font; -HSPLandroidx/core/graphics/TypefaceCompatApi29Impl;->getMatchScore(Landroid/graphics/fonts/FontStyle;Landroid/graphics/fonts/FontStyle;)I -HSPLandroidx/core/graphics/TypefaceCompatBaseImpl;->()V +HSPLandroidx/core/math/MathUtils;->systemProp$default(Ljava/lang/String;IIII)I +HSPLandroidx/core/math/MathUtils;->systemProp(Ljava/lang/String;JJJ)J HSPLandroidx/core/net/ConnectivityManagerCompat$Api16Impl;->isActiveNetworkMetered(Landroid/net/ConnectivityManager;)Z HSPLandroidx/core/os/BuildCompat;->isAtLeastS()Z HSPLandroidx/core/os/BuildCompat;->isAtLeastT()Z HSPLandroidx/core/os/HandlerCompat;->createAsync(Landroid/os/Looper;)Landroid/os/Handler; -HSPLandroidx/core/os/TraceCompat$Api18Impl;->beginSection(Ljava/lang/String;)V -HSPLandroidx/core/os/TraceCompat$Api18Impl;->endSection()V -HSPLandroidx/core/os/TraceCompat;->()V -HSPLandroidx/core/provider/CalleeHandler;->access$insertEntryAtIndex([Ljava/lang/Object;ILjava/lang/Object;Ljava/lang/Object;)[Ljava/lang/Object; -HSPLandroidx/core/provider/FontProvider$$ExternalSyntheticLambda0;->()V -HSPLandroidx/core/provider/FontProvider$Api16Impl;->query(Landroid/content/ContentResolver;Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)Landroid/database/Cursor; -HSPLandroidx/core/provider/FontProvider;->()V -HSPLandroidx/core/provider/FontProvider;->getFontFamilyResult(Landroid/content/Context;Landroidx/core/provider/FontRequest;)Landroidx/core/provider/FontsContractCompat$FontFamilyResult; -HSPLandroidx/core/provider/FontRequest$$ExternalSyntheticOutline0;->m(Ljava/lang/StringBuilder;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; -HSPLandroidx/core/provider/FontRequest;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)V -HSPLandroidx/core/provider/FontsContractCompat$FontFamilyResult;->(I[Landroidx/core/provider/FontsContractCompat$FontInfo;)V -HSPLandroidx/core/provider/FontsContractCompat$FontInfo;->(Landroid/net/Uri;IIZI)V HSPLandroidx/core/splashscreen/SplashScreen$Impl$$ExternalSyntheticLambda0;->()V HSPLandroidx/core/splashscreen/SplashScreen$Impl31$hierarchyListener$1;->(Landroidx/core/splashscreen/SplashScreen$Impl31;Landroid/app/Activity;)V HSPLandroidx/core/splashscreen/SplashScreen$Impl31$setKeepOnScreenCondition$1;->(Landroidx/core/splashscreen/SplashScreen$Impl31;Landroid/view/View;)V @@ -4592,23 +4412,15 @@ HSPLandroidx/core/splashscreen/SplashScreen$Impl31;->install()V HSPLandroidx/core/splashscreen/SplashScreen$Impl31;->setKeepOnScreenCondition(Lcom/google/samples/apps/nowinandroid/MainActivity$onCreate$2;)V HSPLandroidx/core/splashscreen/SplashScreen$Impl;->(Landroid/app/Activity;)V HSPLandroidx/core/splashscreen/SplashScreen$Impl;->setPostSplashScreenTheme(Landroid/content/res/Resources$Theme;Landroid/util/TypedValue;)V -HSPLandroidx/core/util/DebugUtils;->buffer$default(Lkotlinx/coroutines/flow/Flow;I)Lkotlinx/coroutines/flow/Flow; -HSPLandroidx/core/util/DebugUtils;->distinctUntilChanged(Lkotlinx/coroutines/flow/Flow;)Lkotlinx/coroutines/flow/Flow; -HSPLandroidx/core/util/DebugUtils;->first(Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -HSPLandroidx/core/util/DebugUtils;->first(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -HSPLandroidx/core/util/DebugUtils;->firstOrNull(Lcom/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSource$getChangeListVersions$$inlined$map$1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -HSPLandroidx/core/util/DebugUtils;->stateIn(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/CoroutineScope;Lkotlinx/coroutines/flow/SharingStarted;Ljava/lang/Object;)Lkotlinx/coroutines/flow/ReadonlyStateFlow; -HSPLandroidx/core/util/Preconditions;->access$lowestBitOf(J)I -HSPLandroidx/core/util/Preconditions;->binarySearch([II)I -HSPLandroidx/core/util/Preconditions;->checkNotNull(Ljava/lang/Object;Ljava/lang/String;)V +HSPLandroidx/core/util/DebugUtils;->access$lowestBitOf(J)I +HSPLandroidx/core/util/DebugUtils;->binarySearch([II)I HSPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->(Landroidx/core/view/AccessibilityDelegateCompat;)V -HSPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->getAccessibilityNodeProvider(Landroid/view/View;)Landroid/view/accessibility/AccessibilityNodeProvider; -HSPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->onInitializeAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V -HSPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->sendAccessibilityEventUnchecked(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V HSPLandroidx/core/view/AccessibilityDelegateCompat;->()V HSPLandroidx/core/view/AccessibilityDelegateCompat;->()V HSPLandroidx/core/view/AccessibilityDelegateCompat;->(Landroid/view/View$AccessibilityDelegate;)V -HSPLandroidx/core/view/AccessibilityDelegateCompat;->onInitializeAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V +HSPLandroidx/core/view/DisplayCutoutCompat$Api30Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/DisplayCutout;)Landroid/graphics/Insets; +HSPLandroidx/core/view/DisplayCutoutCompat$Api30Impl;->getWaterfallInsets(Landroid/view/DisplayCutout;)Landroid/graphics/Insets; +HSPLandroidx/core/view/DisplayCutoutCompat;->(Landroid/view/DisplayCutout;)V HSPLandroidx/core/view/MenuHostHelper;->(Ljava/lang/Runnable;)V HSPLandroidx/core/view/OneShotPreDrawListener;->(Landroid/view/View;Ljava/lang/Runnable;)V HSPLandroidx/core/view/OneShotPreDrawListener;->add(Landroid/view/View;Ljava/lang/Runnable;)V @@ -4616,7 +4428,6 @@ HSPLandroidx/core/view/OneShotPreDrawListener;->onPreDraw()Z HSPLandroidx/core/view/OneShotPreDrawListener;->removeListener()V HSPLandroidx/core/view/ViewCompat$$ExternalSyntheticLambda0;->()V HSPLandroidx/core/view/ViewCompat$AccessibilityPaneVisibilityManager;->()V -HSPLandroidx/core/view/ViewCompat$Api16Impl;->getParentForAccessibility(Landroid/view/View;)Landroid/view/ViewParent; HSPLandroidx/core/view/ViewCompat$Api19Impl;->isAttachedToWindow(Landroid/view/View;)Z HSPLandroidx/core/view/ViewCompat$Api21Impl$1;->(Landroid/view/View;Landroidx/core/view/OnApplyWindowInsetsListener;)V HSPLandroidx/core/view/ViewCompat$Api21Impl$1;->onApplyWindowInsets(Landroid/view/View;Landroid/view/WindowInsets;)Landroid/view/WindowInsets; @@ -4673,21 +4484,6 @@ HSPLandroidx/core/view/WindowInsetsControllerCompat$Impl30;->setAppearanceLightN HSPLandroidx/core/view/WindowInsetsControllerCompat$Impl30;->setAppearanceLightStatusBars(Z)V HSPLandroidx/core/view/WindowInsetsControllerCompat$Impl;->()V HSPLandroidx/core/view/WindowInsetsControllerCompat;->(Landroid/view/Window;)V -HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/accessibility/AccessibilityNodeInfo;Z)V -HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$$ExternalSyntheticApiModelOutline1;->m(Landroid/view/accessibility/AccessibilityNodeInfo;Ljava/lang/CharSequence;)V -HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$$ExternalSyntheticApiModelOutline2;->m(Landroid/view/accessibility/AccessibilityNodeInfo;Ljava/lang/CharSequence;)V -HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$$ExternalSyntheticApiModelOutline4;->m(Landroid/view/accessibility/AccessibilityNodeInfo;)Ljava/lang/CharSequence; -HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$$ExternalSyntheticApiModelOutline5;->m(Landroid/view/accessibility/AccessibilityNodeInfo;)Ljava/lang/CharSequence; -HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;->()V -HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;->(Ljava/lang/Object;ILjava/lang/String;Ljava/lang/Class;)V -HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->(Landroid/view/accessibility/AccessibilityNodeInfo;)V -HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->addAction(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;)V -HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->extrasIntList(Ljava/lang/String;)Ljava/util/ArrayList; -HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->getHintText()Ljava/lang/CharSequence; -HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->getStateDescription()Ljava/lang/CharSequence; -HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->getText()Ljava/lang/CharSequence; -HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setClassName(Ljava/lang/String;)V -HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setStateDescription(Ljava/lang/CharSequence;)V HSPLandroidx/core/view/accessibility/AccessibilityNodeProviderCompat;->(Landroid/view/accessibility/AccessibilityNodeProvider;)V HSPLandroidx/customview/poolingcontainer/PoolingContainer;->getPoolingContainerListenerHolder(Landroid/view/View;)Landroidx/customview/poolingcontainer/PoolingContainerListenerHolder; HSPLandroidx/customview/poolingcontainer/PoolingContainerListenerHolder;->()V @@ -4770,49 +4566,24 @@ HSPLandroidx/datastore/core/State;->()V HSPLandroidx/datastore/core/UnInitialized;->()V HSPLandroidx/datastore/core/UnInitialized;->()V HSPLandroidx/datastore/core/handlers/NoOpCorruptionHandler;->()V -HSPLandroidx/emoji2/text/ConcurrencyHelpers$$ExternalSyntheticLambda0;->(Ljava/lang/String;)V -HSPLandroidx/emoji2/text/ConcurrencyHelpers$$ExternalSyntheticLambda0;->newThread(Ljava/lang/Runnable;)Ljava/lang/Thread; HSPLandroidx/emoji2/text/ConcurrencyHelpers$Handler28Impl;->createAsync(Landroid/os/Looper;)Landroid/os/Handler; -HSPLandroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigHelper;->()V -HSPLandroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigHelper_API19;->()V -HSPLandroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigHelper_API28;->()V -HSPLandroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigHelper_API28;->getSigningSignatures(Landroid/content/pm/PackageManager;Ljava/lang/String;)[Landroid/content/pm/Signature; -HSPLandroidx/emoji2/text/DefaultEmojiCompatConfig;->create(Landroid/content/Context;)Landroidx/emoji2/text/FontRequestEmojiCompatConfig; HSPLandroidx/emoji2/text/DefaultGlyphChecker;->()V HSPLandroidx/emoji2/text/DefaultGlyphChecker;->()V -HSPLandroidx/emoji2/text/EmojiCompat$CompatInternal19$1;->(Landroidx/emoji2/text/EmojiCompat$CompatInternal19;)V HSPLandroidx/emoji2/text/EmojiCompat$CompatInternal19;->(Landroidx/emoji2/text/EmojiCompat;)V HSPLandroidx/emoji2/text/EmojiCompat$CompatInternal;->(Landroidx/emoji2/text/EmojiCompat;)V HSPLandroidx/emoji2/text/EmojiCompat$Config;->(Landroidx/emoji2/text/EmojiCompat$MetadataRepoLoader;)V -HSPLandroidx/emoji2/text/EmojiCompat$MetadataRepoLoaderCallback;->()V HSPLandroidx/emoji2/text/EmojiCompat;->()V HSPLandroidx/emoji2/text/EmojiCompat;->(Landroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultConfig;)V -HSPLandroidx/emoji2/text/EmojiCompat;->get()Landroidx/emoji2/text/EmojiCompat; HSPLandroidx/emoji2/text/EmojiCompat;->getLoadState()I -HSPLandroidx/emoji2/text/EmojiCompat;->load()V HSPLandroidx/emoji2/text/EmojiCompatInitializer$1;->(Landroidx/emoji2/text/EmojiCompatInitializer;Landroidx/lifecycle/Lifecycle;)V HSPLandroidx/emoji2/text/EmojiCompatInitializer$1;->onResume(Landroidx/lifecycle/LifecycleOwner;)V HSPLandroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultConfig;->(Landroid/content/Context;)V -HSPLandroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultLoader$$ExternalSyntheticLambda0;->(Landroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultLoader;Landroidx/emoji2/text/EmojiCompat$MetadataRepoLoaderCallback;Ljava/util/concurrent/ThreadPoolExecutor;)V -HSPLandroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultLoader$$ExternalSyntheticLambda0;->run()V -HSPLandroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultLoader$1;->(Landroidx/emoji2/text/EmojiCompat$MetadataRepoLoaderCallback;Ljava/util/concurrent/ThreadPoolExecutor;)V HSPLandroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultLoader;->(Landroid/content/Context;)V -HSPLandroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultLoader;->load(Landroidx/emoji2/text/EmojiCompat$MetadataRepoLoaderCallback;)V HSPLandroidx/emoji2/text/EmojiCompatInitializer$LoadEmojiCompatRunnable;->()V -HSPLandroidx/emoji2/text/EmojiCompatInitializer$LoadEmojiCompatRunnable;->run()V HSPLandroidx/emoji2/text/EmojiCompatInitializer;->()V HSPLandroidx/emoji2/text/EmojiCompatInitializer;->create(Landroid/content/Context;)Ljava/lang/Boolean; HSPLandroidx/emoji2/text/EmojiCompatInitializer;->create(Landroid/content/Context;)Ljava/lang/Object; HSPLandroidx/emoji2/text/EmojiCompatInitializer;->dependencies()Ljava/util/List; -HSPLandroidx/emoji2/text/FontRequestEmojiCompatConfig$FontProviderHelper;->()V -HSPLandroidx/emoji2/text/FontRequestEmojiCompatConfig$FontRequestMetadataLoader$$ExternalSyntheticLambda0;->(Landroidx/emoji2/text/FontRequestEmojiCompatConfig$FontRequestMetadataLoader;)V -HSPLandroidx/emoji2/text/FontRequestEmojiCompatConfig$FontRequestMetadataLoader$$ExternalSyntheticLambda0;->run()V -HSPLandroidx/emoji2/text/FontRequestEmojiCompatConfig$FontRequestMetadataLoader;->(Landroid/content/Context;Landroidx/core/provider/FontRequest;)V -HSPLandroidx/emoji2/text/FontRequestEmojiCompatConfig$FontRequestMetadataLoader;->load(Landroidx/emoji2/text/EmojiCompat$MetadataRepoLoaderCallback;)V -HSPLandroidx/emoji2/text/FontRequestEmojiCompatConfig$FontRequestMetadataLoader;->loadInternal()V -HSPLandroidx/emoji2/text/FontRequestEmojiCompatConfig$FontRequestMetadataLoader;->retrieveFontInfo()Landroidx/core/provider/FontsContractCompat$FontInfo; -HSPLandroidx/emoji2/text/FontRequestEmojiCompatConfig;->()V -HSPLandroidx/emoji2/text/FontRequestEmojiCompatConfig;->(Landroid/content/Context;Landroidx/core/provider/FontRequest;)V HSPLandroidx/hilt/navigation/compose/HiltViewModelKt;->createHiltViewModelFactory(Landroidx/lifecycle/ViewModelStoreOwner;Landroidx/compose/runtime/Composer;)Ldagger/hilt/android/internal/lifecycle/HiltViewModelFactory; HSPLandroidx/hilt/work/HiltWorkerFactory;->(Ljava/util/Map;)V HSPLandroidx/hilt/work/HiltWorkerFactory;->createWorker(Landroid/content/Context;Ljava/lang/String;Landroidx/work/WorkerParameters;)Landroidx/work/ListenableWorker; @@ -4862,7 +4633,6 @@ HSPLandroidx/lifecycle/LifecycleCoroutineScopeImpl;->onStateChanged(Landroidx/li HSPLandroidx/lifecycle/LifecycleDispatcher$DispatcherActivityCallback;->()V HSPLandroidx/lifecycle/LifecycleDispatcher$DispatcherActivityCallback;->onActivityCreated(Landroid/app/Activity;Landroid/os/Bundle;)V HSPLandroidx/lifecycle/LifecycleDispatcher;->()V -HSPLandroidx/lifecycle/LifecycleKt;->stringResource(ILandroidx/compose/runtime/Composer;I)Ljava/lang/String; HSPLandroidx/lifecycle/LifecycleRegistry$ObserverWithState;->(Landroidx/lifecycle/LifecycleObserver;Landroidx/lifecycle/Lifecycle$State;)V HSPLandroidx/lifecycle/LifecycleRegistry$ObserverWithState;->dispatchEvent(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V HSPLandroidx/lifecycle/LifecycleRegistry;->(Landroidx/lifecycle/LifecycleOwner;)V @@ -4979,6 +4749,7 @@ HSPLandroidx/lifecycle/Transformations$1;->(Landroidx/lifecycle/MediatorLi HSPLandroidx/lifecycle/Transformations$1;->onChanged(Ljava/lang/Object;)V HSPLandroidx/lifecycle/ViewModel;->()V HSPLandroidx/lifecycle/ViewModel;->setTagIfAbsent(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object; +HSPLandroidx/lifecycle/ViewModelKt;->getViewModelScope(Landroidx/lifecycle/ViewModel;)Lkotlinx/coroutines/CoroutineScope; HSPLandroidx/lifecycle/ViewModelLazy;->(Lkotlin/jvm/internal/ClassReference;Lcom/google/samples/apps/nowinandroid/MainActivity$special$$inlined$viewModels$default$2;Lcom/google/samples/apps/nowinandroid/MainActivity$special$$inlined$viewModels$default$1;Lcom/google/samples/apps/nowinandroid/MainActivity$special$$inlined$viewModels$default$3;)V HSPLandroidx/lifecycle/ViewModelLazy;->getValue()Ljava/lang/Object; HSPLandroidx/lifecycle/ViewModelProvider$AndroidViewModelFactory$Companion$ApplicationKeyImpl;->()V @@ -4995,7 +4766,6 @@ HSPLandroidx/lifecycle/ViewModelProvider;->(Landroidx/lifecycle/ViewModelS HSPLandroidx/lifecycle/ViewModelProvider;->get(Ljava/lang/Class;)Landroidx/lifecycle/ViewModel; HSPLandroidx/lifecycle/ViewModelProvider;->get(Ljava/lang/Class;Ljava/lang/String;)Landroidx/lifecycle/ViewModel; HSPLandroidx/lifecycle/ViewModelStore;->()V -HSPLandroidx/lifecycle/ViewTreeViewModelStoreOwner;->get(Landroid/view/View;)Landroidx/lifecycle/ViewModelStoreOwner; HSPLandroidx/lifecycle/compose/FlowExtKt$collectAsStateWithLifecycle$1$1$1;->(Landroidx/compose/runtime/ProduceStateScope;)V HSPLandroidx/lifecycle/compose/FlowExtKt$collectAsStateWithLifecycle$1$1$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLandroidx/lifecycle/compose/FlowExtKt$collectAsStateWithLifecycle$1$1;->(Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/flow/Flow;Landroidx/compose/runtime/ProduceStateScope;Lkotlin/coroutines/Continuation;)V @@ -5007,6 +4777,7 @@ HSPLandroidx/lifecycle/compose/FlowExtKt$collectAsStateWithLifecycle$1;->create( HSPLandroidx/lifecycle/compose/FlowExtKt$collectAsStateWithLifecycle$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/lifecycle/compose/FlowExtKt$collectAsStateWithLifecycle$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/lifecycle/compose/FlowExtKt;->collectAsStateWithLifecycle(Lkotlinx/coroutines/flow/ReadonlyStateFlow;Landroidx/compose/runtime/Composer;)Landroidx/compose/runtime/MutableState; +HSPLandroidx/lifecycle/runtime/R$id;->hasSpan(Landroid/text/Spanned;Ljava/lang/Class;)Z HSPLandroidx/lifecycle/viewmodel/CreationExtras$Empty;->()V HSPLandroidx/lifecycle/viewmodel/CreationExtras$Empty;->()V HSPLandroidx/lifecycle/viewmodel/CreationExtras;->()V @@ -5052,15 +4823,13 @@ HSPLandroidx/metrics/performance/PerformanceMetricsState;->cleanupSingleFrameSta HSPLandroidx/metrics/performance/PerformanceMetricsState;->getIntervalStates$metrics_performance_release(JJLjava/util/ArrayList;)V HSPLandroidx/metrics/performance/PerformanceMetricsState;->markStateForRemoval(Ljava/lang/String;Ljava/util/ArrayList;J)V HSPLandroidx/metrics/performance/PerformanceMetricsState;->putState(Ljava/lang/String;Ljava/lang/String;)V -HSPLandroidx/metrics/performance/R$id;->createCoroutineUnintercepted(Ljava/lang/Object;Lkotlin/coroutines/Continuation;Lkotlin/jvm/functions/Function2;)Lkotlin/coroutines/Continuation; -HSPLandroidx/metrics/performance/R$id;->intercepted(Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLandroidx/metrics/performance/StateInfo;->()V HSPLandroidx/metrics/performance/StateInfo;->(Ljava/lang/String;Ljava/lang/String;)V HSPLandroidx/metrics/performance/StateInfo;->toString()Ljava/lang/String; HSPLandroidx/navigation/ActivityNavigator$hostActivity$1;->()V HSPLandroidx/navigation/ActivityNavigator$hostActivity$1;->()V HSPLandroidx/navigation/ActivityNavigator;->(Landroid/content/Context;)V -HSPLandroidx/navigation/NamedNavArgument;->(Ljava/lang/String;Landroidx/navigation/NavArgument;)V +HSPLandroidx/navigation/NamedNavArgument;->(Landroidx/navigation/NavArgument;)V HSPLandroidx/navigation/NavArgument$Builder;->()V HSPLandroidx/navigation/NavArgument;->(Landroidx/navigation/NavType;)V HSPLandroidx/navigation/NavArgument;->equals(Ljava/lang/Object;)Z @@ -5213,6 +4982,7 @@ HSPLandroidx/navigation/compose/NavHostKt;->NavHost(Landroidx/navigation/NavHost HSPLandroidx/navigation/compose/NavHostKt;->NavHost(Landroidx/navigation/NavHostController;Ljava/lang/String;Landroidx/compose/ui/Modifier;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V HSPLandroidx/profileinstaller/ProfileInstallerInitializer$$ExternalSyntheticLambda0;->(Landroidx/profileinstaller/ProfileInstallerInitializer;Landroid/content/Context;)V HSPLandroidx/profileinstaller/ProfileInstallerInitializer$$ExternalSyntheticLambda0;->run()V +HSPLandroidx/profileinstaller/ProfileInstallerInitializer$$ExternalSyntheticLambda1;->(Landroid/content/Context;)V HSPLandroidx/profileinstaller/ProfileInstallerInitializer$Choreographer16Impl$$ExternalSyntheticLambda0;->(Ljava/lang/Runnable;)V HSPLandroidx/profileinstaller/ProfileInstallerInitializer$Choreographer16Impl$$ExternalSyntheticLambda0;->doFrame(J)V HSPLandroidx/profileinstaller/ProfileInstallerInitializer$Choreographer16Impl;->postFrameCallback(Ljava/lang/Runnable;)V @@ -5225,7 +4995,6 @@ HSPLandroidx/room/CoroutinesRoom$Companion$createFlow$1$1$1;->(Landroidx/r HSPLandroidx/room/CoroutinesRoom$Companion$createFlow$1$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLandroidx/room/CoroutinesRoom$Companion$createFlow$1$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/room/CoroutinesRoom$Companion$createFlow$1$1$observer$1;->([Ljava/lang/String;Lkotlinx/coroutines/channels/AbstractChannel;)V -HSPLandroidx/room/CoroutinesRoom$Companion$createFlow$1$1$observer$1;->onInvalidated(Ljava/util/Set;)V HSPLandroidx/room/CoroutinesRoom$Companion$createFlow$1$1;->(ZLandroidx/room/RoomDatabase;Lkotlinx/coroutines/flow/FlowCollector;[Ljava/lang/String;Ljava/util/concurrent/Callable;Lkotlin/coroutines/Continuation;)V HSPLandroidx/room/CoroutinesRoom$Companion$createFlow$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLandroidx/room/CoroutinesRoom$Companion$createFlow$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; @@ -5245,7 +5014,6 @@ HSPLandroidx/room/DatabaseConfiguration;->(Landroid/content/Context;Ljava/ HSPLandroidx/room/EntityDeletionOrUpdateAdapter;->(Landroidx/room/RoomDatabase;)V HSPLandroidx/room/EntityInsertionAdapter;->(Landroidx/room/RoomDatabase;)V HSPLandroidx/room/EntityInsertionAdapter;->insert(Ljava/lang/Object;)V -HSPLandroidx/room/EntityInsertionAdapter;->insert(Ljava/util/List;)V HSPLandroidx/room/EntityInsertionAdapter;->insertAndReturnIdsList(Ljava/util/List;)Lkotlin/collections/builders/ListBuilder; HSPLandroidx/room/EntityUpsertionAdapter;->(Landroidx/room/EntityInsertionAdapter;Landroidx/room/EntityDeletionOrUpdateAdapter;)V HSPLandroidx/room/EntityUpsertionAdapter;->upsert(Ljava/util/List;)V @@ -5292,7 +5060,7 @@ HSPLandroidx/room/RoomDatabase;->isOpen()Z HSPLandroidx/room/RoomDatabase;->query(Landroidx/sqlite/db/SupportSQLiteQuery;Landroid/os/CancellationSignal;)Landroid/database/Cursor; HSPLandroidx/room/RoomDatabase;->setTransactionSuccessful()V HSPLandroidx/room/RoomDatabase;->unwrapOpenHelper(Ljava/lang/Class;Landroidx/sqlite/db/SupportSQLiteOpenHelper;)Ljava/lang/Object; -HSPLandroidx/room/RoomOpenHelper$Delegate;->(I)V +HSPLandroidx/room/RoomOpenHelper$Delegate;->()V HSPLandroidx/room/RoomOpenHelper;->(Landroidx/room/DatabaseConfiguration;Landroidx/room/RoomOpenHelper$Delegate;Ljava/lang/String;Ljava/lang/String;)V HSPLandroidx/room/RoomOpenHelper;->onConfigure(Landroidx/sqlite/db/framework/FrameworkSQLiteDatabase;)V HSPLandroidx/room/RoomOpenHelper;->onCreate(Landroidx/sqlite/db/framework/FrameworkSQLiteDatabase;)V @@ -5331,7 +5099,14 @@ HSPLandroidx/room/util/CursorUtil;->getColumnIndex(Landroid/database/Cursor;Ljav HSPLandroidx/room/util/CursorUtil;->getColumnIndexOrThrow(Landroid/database/Cursor;Ljava/lang/String;)I HSPLandroidx/room/util/DBUtil;->query(Landroidx/room/RoomDatabase;Landroidx/room/RoomSQLiteQuery;Z)Landroid/database/Cursor; HSPLandroidx/room/util/StringUtil;->appendPlaceholders(ILjava/lang/StringBuilder;)V -HSPLandroidx/savedstate/R$id;->Density(Landroid/content/Context;)Landroidx/compose/ui/unit/DensityImpl; +HSPLandroidx/savedstate/R$id;->Constraints$default(III)J +HSPLandroidx/savedstate/R$id;->Constraints(IIII)J +HSPLandroidx/savedstate/R$id;->colors-zjMxDiM(JJJJJLandroidx/compose/runtime/Composer;II)Landroidx/compose/material3/NavigationBarItemColors; +HSPLandroidx/savedstate/R$id;->constrain-4WqzIAM(JJ)J +HSPLandroidx/savedstate/R$id;->constrain-N9IONVI(JJ)J +HSPLandroidx/savedstate/R$id;->constrainHeight-K40F9xA(JI)I +HSPLandroidx/savedstate/R$id;->constrainWidth-K40F9xA(JI)I +HSPLandroidx/savedstate/R$id;->offset-NN6Ew-U(IIJ)J HSPLandroidx/savedstate/Recreator;->(Landroidx/savedstate/SavedStateRegistryOwner;)V HSPLandroidx/savedstate/Recreator;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V HSPLandroidx/savedstate/SavedStateRegistry$$ExternalSyntheticLambda0;->(Landroidx/savedstate/SavedStateRegistry;)V @@ -5410,7 +5185,7 @@ HSPLandroidx/startup/AppInitializer;->doInitialize(Ljava/lang/Class;Ljava/util/H HSPLandroidx/startup/AppInitializer;->getInstance(Landroid/content/Context;)Landroidx/startup/AppInitializer; HSPLandroidx/startup/InitializationProvider;->()V HSPLandroidx/startup/InitializationProvider;->onCreate()Z -HSPLandroidx/startup/R$string;->ceilToIntPx(F)I +HSPLandroidx/startup/StartupLogger;->dynamicTonalPalette(Landroid/content/Context;)Landroidx/compose/material3/TonalPalette; HSPLandroidx/tracing/Trace;->beginAsyncSection()V HSPLandroidx/tracing/Trace;->endAsyncSection(ILjava/lang/String;)V HSPLandroidx/tracing/Trace;->isEnabled()Z @@ -5487,7 +5262,6 @@ HSPLandroidx/work/OverwritingInputMerger;->()V HSPLandroidx/work/OverwritingInputMerger;->merge(Ljava/util/ArrayList;)Landroidx/work/Data; HSPLandroidx/work/WorkInfo$State;->()V HSPLandroidx/work/WorkInfo$State;->(ILjava/lang/String;)V -HSPLandroidx/work/WorkInfo$State;->isFinished()Z HSPLandroidx/work/WorkInfo;->(Ljava/util/UUID;Landroidx/work/WorkInfo$State;Landroidx/work/Data;Ljava/util/List;Landroidx/work/Data;I)V HSPLandroidx/work/WorkInfo;->equals(Ljava/lang/Object;)Z HSPLandroidx/work/WorkManager;->()V @@ -5544,8 +5318,6 @@ HSPLandroidx/work/impl/WorkDatabaseMigrations;->()V HSPLandroidx/work/impl/WorkDatabasePathHelper;->()V HSPLandroidx/work/impl/WorkDatabasePathHelper;->migrateDatabase(Landroid/content/Context;)V HSPLandroidx/work/impl/WorkDatabase_Impl$1;->(Landroidx/work/impl/WorkDatabase_Impl;)V -HSPLandroidx/work/impl/WorkDatabase_Impl$1;->createAllTables(Landroidx/sqlite/db/framework/FrameworkSQLiteDatabase;)V -HSPLandroidx/work/impl/WorkDatabase_Impl$1;->onCreate(Landroidx/sqlite/db/framework/FrameworkSQLiteDatabase;)V HSPLandroidx/work/impl/WorkDatabase_Impl$1;->onOpen(Landroidx/sqlite/db/framework/FrameworkSQLiteDatabase;)V HSPLandroidx/work/impl/WorkDatabase_Impl;->()V HSPLandroidx/work/impl/WorkDatabase_Impl;->createInvalidationTracker()Landroidx/room/InvalidationTracker; @@ -5594,7 +5366,6 @@ HSPLandroidx/work/impl/background/systemjob/SystemJobInfoConverter;->(Land HSPLandroidx/work/impl/background/systemjob/SystemJobScheduler;->()V HSPLandroidx/work/impl/background/systemjob/SystemJobScheduler;->(Landroid/content/Context;Landroidx/work/impl/WorkManagerImpl;)V HSPLandroidx/work/impl/background/systemjob/SystemJobScheduler;->cancel(Ljava/lang/String;)V -HSPLandroidx/work/impl/background/systemjob/SystemJobScheduler;->cancelJobById(Landroid/app/job/JobScheduler;I)V HSPLandroidx/work/impl/background/systemjob/SystemJobScheduler;->getPendingJobs(Landroid/content/Context;Landroid/app/job/JobScheduler;)Ljava/util/ArrayList; HSPLandroidx/work/impl/background/systemjob/SystemJobScheduler;->hasLimitedSchedulingSlots()Z HSPLandroidx/work/impl/background/systemjob/SystemJobScheduler;->schedule([Landroidx/work/impl/model/WorkSpec;)V @@ -5606,7 +5377,6 @@ HSPLandroidx/work/impl/background/systemjob/SystemJobService;->onCreate()V HSPLandroidx/work/impl/background/systemjob/SystemJobService;->onDestroy()V HSPLandroidx/work/impl/background/systemjob/SystemJobService;->onExecuted(Ljava/lang/String;Z)V HSPLandroidx/work/impl/background/systemjob/SystemJobService;->onStartJob(Landroid/app/job/JobParameters;)Z -HSPLandroidx/work/impl/background/systemjob/SystemJobService;->onStopJob(Landroid/app/job/JobParameters;)Z HSPLandroidx/work/impl/constraints/NetworkState;->(ZZZZ)V HSPLandroidx/work/impl/constraints/NetworkState;->equals(Ljava/lang/Object;)Z HSPLandroidx/work/impl/constraints/NetworkState;->toString()Ljava/lang/String; @@ -5672,11 +5442,9 @@ HSPLandroidx/work/impl/model/SystemIdInfoDao_Impl$1;->(Landroidx/room/Room HSPLandroidx/work/impl/model/SystemIdInfoDao_Impl$1;->bind(Landroidx/sqlite/db/SupportSQLiteStatement;Ljava/lang/Object;)V HSPLandroidx/work/impl/model/SystemIdInfoDao_Impl$1;->createQuery()Ljava/lang/String; HSPLandroidx/work/impl/model/SystemIdInfoDao_Impl$2;->(Landroidx/room/RoomDatabase;)V -HSPLandroidx/work/impl/model/SystemIdInfoDao_Impl$2;->createQuery()Ljava/lang/String; HSPLandroidx/work/impl/model/SystemIdInfoDao_Impl;->(Landroidx/room/RoomDatabase;)V HSPLandroidx/work/impl/model/SystemIdInfoDao_Impl;->getSystemIdInfo(Ljava/lang/String;)Landroidx/work/impl/model/SystemIdInfo; HSPLandroidx/work/impl/model/SystemIdInfoDao_Impl;->insertSystemIdInfo(Landroidx/work/impl/model/SystemIdInfo;)V -HSPLandroidx/work/impl/model/SystemIdInfoDao_Impl;->removeSystemIdInfo(Ljava/lang/String;)V HSPLandroidx/work/impl/model/WorkName;->(Ljava/lang/String;Ljava/lang/String;)V HSPLandroidx/work/impl/model/WorkNameDao_Impl$1;->(Landroidx/room/RoomDatabase;)V HSPLandroidx/work/impl/model/WorkNameDao_Impl$1;->bind(Landroidx/sqlite/db/SupportSQLiteStatement;Ljava/lang/Object;)V @@ -5700,7 +5468,6 @@ HSPLandroidx/work/impl/model/WorkSpec;->calculateNextRunTime()J HSPLandroidx/work/impl/model/WorkSpec;->hasConstraints()Z HSPLandroidx/work/impl/model/WorkSpec;->hashCode()I HSPLandroidx/work/impl/model/WorkSpec;->isPeriodic()Z -HSPLandroidx/work/impl/model/WorkSpec;->toString()Ljava/lang/String; HSPLandroidx/work/impl/model/WorkSpecDao_Impl$13;->(Landroidx/work/impl/model/WorkSpecDao_Impl;Landroidx/room/RoomSQLiteQuery;)V HSPLandroidx/work/impl/model/WorkSpecDao_Impl$13;->call()Ljava/lang/Object; HSPLandroidx/work/impl/model/WorkSpecDao_Impl$1;->(Landroidx/room/RoomDatabase;)V @@ -5791,7 +5558,6 @@ HSPLandroidx/work/impl/utils/futures/AbstractFuture$Waiter;->(I)V HSPLandroidx/work/impl/utils/futures/AbstractFuture;->()V HSPLandroidx/work/impl/utils/futures/AbstractFuture;->()V HSPLandroidx/work/impl/utils/futures/AbstractFuture;->addListener(Ljava/lang/Runnable;Ljava/util/concurrent/Executor;)V -HSPLandroidx/work/impl/utils/futures/AbstractFuture;->cancel(Z)Z HSPLandroidx/work/impl/utils/futures/AbstractFuture;->complete(Landroidx/work/impl/utils/futures/AbstractFuture;)V HSPLandroidx/work/impl/utils/futures/AbstractFuture;->executeListener(Ljava/lang/Runnable;Ljava/util/concurrent/Executor;)V HSPLandroidx/work/impl/utils/futures/AbstractFuture;->get()Ljava/lang/Object; @@ -5816,8 +5582,6 @@ HSPLcoil/ComponentRegistry$Builder;->add(Lcoil/map/Mapper;Ljava/lang/Class;)V HSPLcoil/ComponentRegistry$Builder;->build()Lcoil/ComponentRegistry; HSPLcoil/ComponentRegistry;->(Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;)V HSPLcoil/EventListener$Companion$NONE$1;->()V -HSPLcoil/EventListener$Companion$NONE$1;->decodeStart()V -HSPLcoil/EventListener$Companion$NONE$1;->fetchEnd()V HSPLcoil/EventListener$Companion$NONE$1;->fetchStart()V HSPLcoil/EventListener$Companion$NONE$1;->keyEnd()V HSPLcoil/EventListener$Companion$NONE$1;->keyStart()V @@ -5857,6 +5621,7 @@ HSPLcoil/RealImageLoader;->access$executeMain(Lcoil/RealImageLoader;Lcoil/reques HSPLcoil/RealImageLoader;->execute(Lcoil/request/ImageRequest;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLcoil/RealImageLoader;->getComponents()Lcoil/ComponentRegistry; HSPLcoil/RealImageLoader;->getMemoryCache()Lcoil/memory/MemoryCache; +HSPLcoil/base/R$id;->yield(Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; HSPLcoil/compose/AsyncImageKt$AsyncImage$2;->(Ljava/lang/Object;Ljava/lang/String;Lcoil/ImageLoader;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Alignment;Landroidx/compose/ui/layout/ContentScale;FLandroidx/compose/ui/graphics/ColorFilter;IIII)V HSPLcoil/compose/AsyncImageKt$Content$$inlined$Layout$1;->(Landroidx/compose/ui/node/LayoutNode$Companion$Constructor$1;)V HSPLcoil/compose/AsyncImageKt$Content$$inlined$Layout$1;->invoke()Ljava/lang/Object; @@ -5871,7 +5636,6 @@ HSPLcoil/compose/AsyncImageKt;->AsyncImage-Q4Kwu38(Ljava/lang/Object;Ljava/lang/ HSPLcoil/compose/AsyncImageKt;->Content(Landroidx/compose/ui/Modifier;Landroidx/compose/ui/graphics/painter/Painter;Ljava/lang/String;Landroidx/compose/ui/Alignment;Landroidx/compose/ui/layout/ContentScale;FLandroidx/compose/ui/graphics/ColorFilter;Landroidx/compose/runtime/Composer;I)V HSPLcoil/compose/AsyncImagePainter$Companion$DefaultTransform$1;->()V HSPLcoil/compose/AsyncImagePainter$Companion$DefaultTransform$1;->()V -HSPLcoil/compose/AsyncImagePainter$Companion$DefaultTransform$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLcoil/compose/AsyncImagePainter$State$Empty;->()V HSPLcoil/compose/AsyncImagePainter$State$Empty;->()V HSPLcoil/compose/AsyncImagePainter$State$Empty;->getPainter()Landroidx/compose/ui/graphics/painter/Painter; @@ -5911,7 +5675,6 @@ HSPLcoil/compose/ContentPainterModifier$measure$1;->invoke(Ljava/lang/Object;)Lj HSPLcoil/compose/ContentPainterModifier;->(Landroidx/compose/ui/graphics/painter/Painter;Landroidx/compose/ui/Alignment;Landroidx/compose/ui/layout/ContentScale;FLandroidx/compose/ui/graphics/ColorFilter;)V HSPLcoil/compose/ContentPainterModifier;->calculateScaledSize-E7KxVPU(J)J HSPLcoil/compose/ContentPainterModifier;->draw(Landroidx/compose/ui/graphics/drawscope/ContentDrawScope;)V -HSPLcoil/compose/ContentPainterModifier;->equals(Ljava/lang/Object;)Z HSPLcoil/compose/ContentPainterModifier;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; HSPLcoil/compose/ContentPainterModifier;->modifyConstraints-ZezNO4M(J)J HSPLcoil/compose/ImageLoaderProvidableCompositionLocal$1;->()V @@ -5919,108 +5682,52 @@ HSPLcoil/compose/ImageLoaderProvidableCompositionLocal$1;->()V HSPLcoil/compose/ImageLoaderProvidableCompositionLocal$1;->invoke()Ljava/lang/Object; HSPLcoil/compose/ImageLoaderProvidableCompositionLocal;->getCurrent(Landroidx/compose/runtime/StaticProvidableCompositionLocal;Landroidx/compose/runtime/Composer;)Lcoil/ImageLoader; HSPLcoil/compose/LocalImageLoaderKt;->()V -HSPLcoil/compose/SingletonAsyncImageKt;->AsyncImage-3HmZ8SU(Ljava/lang/Object;Ljava/lang/String;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Alignment;Landroidx/compose/ui/layout/ContentScale;FLandroidx/compose/ui/graphics/ColorFilter;ILandroidx/compose/runtime/Composer;II)V HSPLcoil/compose/SingletonAsyncImageKt;->AsyncImage-ylYTKUw(Ljava/lang/Object;Ljava/lang/String;Landroidx/compose/ui/Modifier;Landroidx/compose/ui/graphics/painter/Painter;Landroidx/compose/ui/graphics/painter/Painter;Landroidx/compose/ui/graphics/painter/Painter;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Alignment;Landroidx/compose/ui/layout/ContentScale;FLandroidx/compose/ui/graphics/ColorFilter;ILandroidx/compose/runtime/Composer;III)V HSPLcoil/compose/UtilsKt$transformOf$1;->(Landroidx/compose/ui/graphics/painter/Painter;Landroidx/compose/ui/graphics/painter/Painter;Landroidx/compose/ui/graphics/painter/Painter;)V HSPLcoil/compose/UtilsKt$transformOf$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLcoil/compose/UtilsKt;->()V HSPLcoil/compose/UtilsKt;->requestOf(Ljava/lang/Object;Landroidx/compose/runtime/Composer;)Lcoil/request/ImageRequest; -HSPLcoil/decode/BitmapFactoryDecoder$ExceptionCatchingSource;->(Lokio/BufferedSource;)V -HSPLcoil/decode/BitmapFactoryDecoder$ExceptionCatchingSource;->read(Lokio/Buffer;J)J HSPLcoil/decode/BitmapFactoryDecoder$Factory;->(II)V -HSPLcoil/decode/BitmapFactoryDecoder$Factory;->create(Lcoil/fetch/SourceResult;Lcoil/request/Options;)Lcoil/decode/Decoder; -HSPLcoil/decode/BitmapFactoryDecoder$decode$1;->(Lcoil/decode/BitmapFactoryDecoder;Lkotlin/coroutines/Continuation;)V -HSPLcoil/decode/BitmapFactoryDecoder$decode$2$1;->(Lcoil/decode/BitmapFactoryDecoder;)V -HSPLcoil/decode/BitmapFactoryDecoder$decode$2$1;->invoke()Ljava/lang/Object; -HSPLcoil/decode/BitmapFactoryDecoder;->(Lcoil/decode/ImageSource;Lcoil/request/Options;Lkotlinx/coroutines/sync/SemaphoreImpl;I)V -HSPLcoil/decode/BitmapFactoryDecoder;->access$decode(Lcoil/decode/BitmapFactoryDecoder;Landroid/graphics/BitmapFactory$Options;)Lcoil/decode/DecodeResult; -HSPLcoil/decode/BitmapFactoryDecoder;->decode(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -HSPLcoil/decode/ExifUtils;->()V -HSPLcoil/decode/ExifUtilsKt;->()V -HSPLcoil/decode/FileImageSource;->(Lokio/Path;Lokio/FileSystem;Ljava/lang/String;Ljava/io/Closeable;)V -HSPLcoil/decode/FileImageSource;->source()Lokio/BufferedSource; -HSPLcoil/decode/ImageSource;->()V -HSPLcoil/decode/ImageSources;->set-impl(Landroidx/compose/runtime/Composer;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)V -HSPLcoil/decode/ImageSources;->yield(Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; -HSPLcoil/decode/SvgDecodeUtils;->()V HSPLcoil/decode/SvgDecoder$Factory;->(I)V -HSPLcoil/decode/SvgDecoder$Factory;->create(Lcoil/fetch/SourceResult;Lcoil/request/Options;)Lcoil/decode/Decoder; HSPLcoil/disk/DiskCache$Builder;->()V HSPLcoil/disk/DiskCache$Builder;->build()Lcoil/disk/RealDiskCache; -HSPLcoil/disk/DiskLruCache$Editor;->(Lcoil/disk/DiskLruCache;Lcoil/disk/DiskLruCache$Entry;)V -HSPLcoil/disk/DiskLruCache$Editor;->complete(Z)V -HSPLcoil/disk/DiskLruCache$Editor;->file(I)Lokio/Path; -HSPLcoil/disk/DiskLruCache$Entry;->(Lcoil/disk/DiskLruCache;Ljava/lang/String;)V -HSPLcoil/disk/DiskLruCache$Entry;->snapshot()Lcoil/disk/DiskLruCache$Snapshot; -HSPLcoil/disk/DiskLruCache$Snapshot;->(Lcoil/disk/DiskLruCache;Lcoil/disk/DiskLruCache$Entry;)V -HSPLcoil/disk/DiskLruCache$Snapshot;->file(I)Lokio/Path; HSPLcoil/disk/DiskLruCache$fileSystem$1;->(Lokio/JvmSystemFileSystem;)V HSPLcoil/disk/DiskLruCache$fileSystem$1;->sink(Lokio/Path;)Lokio/Sink; HSPLcoil/disk/DiskLruCache$newJournalWriter$faultHidingSink$1;->(Lcoil/disk/DiskLruCache;)V HSPLcoil/disk/DiskLruCache;->()V HSPLcoil/disk/DiskLruCache;->(Lokio/JvmSystemFileSystem;Lokio/Path;Lkotlinx/coroutines/scheduling/DefaultIoScheduler;J)V -HSPLcoil/disk/DiskLruCache;->access$completeEdit(Lcoil/disk/DiskLruCache;Lcoil/disk/DiskLruCache$Editor;Z)V HSPLcoil/disk/DiskLruCache;->checkNotClosed()V -HSPLcoil/disk/DiskLruCache;->edit(Ljava/lang/String;)Lcoil/disk/DiskLruCache$Editor; HSPLcoil/disk/DiskLruCache;->get(Ljava/lang/String;)Lcoil/disk/DiskLruCache$Snapshot; HSPLcoil/disk/DiskLruCache;->initialize()V HSPLcoil/disk/DiskLruCache;->newJournalWriter()Lokio/RealBufferedSink; HSPLcoil/disk/DiskLruCache;->validateKey(Ljava/lang/String;)V HSPLcoil/disk/DiskLruCache;->writeJournal()V HSPLcoil/disk/FaultHidingSink;->(Lokio/Sink;Lcoil/disk/DiskLruCache$newJournalWriter$faultHidingSink$1;)V -HSPLcoil/disk/FaultHidingSink;->flush()V -HSPLcoil/disk/FaultHidingSink;->write(Lokio/Buffer;J)V -HSPLcoil/disk/RealDiskCache$RealEditor;->(Lcoil/disk/DiskLruCache$Editor;)V -HSPLcoil/disk/RealDiskCache$RealEditor;->commitAndGet()Lcoil/disk/RealDiskCache$RealSnapshot; -HSPLcoil/disk/RealDiskCache$RealEditor;->getData()Lokio/Path; -HSPLcoil/disk/RealDiskCache$RealEditor;->getMetadata()Lokio/Path; -HSPLcoil/disk/RealDiskCache$RealSnapshot;->(Lcoil/disk/DiskLruCache$Snapshot;)V -HSPLcoil/disk/RealDiskCache$RealSnapshot;->getData()Lokio/Path; -HSPLcoil/disk/RealDiskCache$RealSnapshot;->getMetadata()Lokio/Path; HSPLcoil/disk/RealDiskCache;->(JLokio/Path;Lokio/JvmSystemFileSystem;Lkotlinx/coroutines/scheduling/DefaultIoScheduler;)V -HSPLcoil/disk/RealDiskCache;->edit(Ljava/lang/String;)Lcoil/disk/RealDiskCache$RealEditor; HSPLcoil/disk/RealDiskCache;->get(Ljava/lang/String;)Lcoil/disk/RealDiskCache$RealSnapshot; -HSPLcoil/disk/RealDiskCache;->getFileSystem()Lokio/FileSystem; HSPLcoil/fetch/AssetUriFetcher$Factory;->()V HSPLcoil/fetch/BitmapFetcher$Factory;->()V HSPLcoil/fetch/ByteBufferFetcher$Factory;->()V HSPLcoil/fetch/ContentUriFetcher$Factory;->()V HSPLcoil/fetch/DrawableFetcher$Factory;->()V -HSPLcoil/fetch/FetchResult;->()V HSPLcoil/fetch/FileFetcher$Factory;->()V HSPLcoil/fetch/HttpUriFetcher$Factory;->(Lkotlin/SynchronizedLazyImpl;Lkotlin/SynchronizedLazyImpl;Z)V HSPLcoil/fetch/HttpUriFetcher$Factory;->create(Ljava/lang/Object;Lcoil/request/Options;)Lcoil/fetch/Fetcher; HSPLcoil/fetch/HttpUriFetcher$executeNetworkRequest$1;->(Lcoil/fetch/HttpUriFetcher;Lkotlin/coroutines/Continuation;)V -HSPLcoil/fetch/HttpUriFetcher$executeNetworkRequest$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HSPLcoil/fetch/HttpUriFetcher$fetch$1;->(Lcoil/fetch/HttpUriFetcher;Lkotlin/coroutines/Continuation;)V -HSPLcoil/fetch/HttpUriFetcher$fetch$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HSPLcoil/fetch/HttpUriFetcher;->()V HSPLcoil/fetch/HttpUriFetcher;->(Ljava/lang/String;Lcoil/request/Options;Lkotlin/Lazy;Lkotlin/Lazy;Z)V HSPLcoil/fetch/HttpUriFetcher;->executeNetworkRequest(Lokhttp3/Request;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLcoil/fetch/HttpUriFetcher;->fetch(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -HSPLcoil/fetch/HttpUriFetcher;->getFileSystem()Lokio/FileSystem; -HSPLcoil/fetch/HttpUriFetcher;->getMimeType$coil_base_release(Ljava/lang/String;Lokhttp3/MediaType;)Ljava/lang/String; HSPLcoil/fetch/HttpUriFetcher;->newRequest()Lokhttp3/Request; -HSPLcoil/fetch/HttpUriFetcher;->toCacheResponse(Lcoil/disk/DiskCache$Snapshot;)Lcoil/network/CacheResponse; -HSPLcoil/fetch/HttpUriFetcher;->toImageSource(Lcoil/disk/DiskCache$Snapshot;)Lcoil/decode/FileImageSource; -HSPLcoil/fetch/HttpUriFetcher;->writeToDiskCache(Lcoil/disk/DiskCache$Snapshot;Lokhttp3/Request;Lokhttp3/Response;Lcoil/network/CacheResponse;)Lcoil/disk/DiskCache$Snapshot; HSPLcoil/fetch/ResourceUriFetcher$Factory;->()V -HSPLcoil/fetch/SourceResult;->(Lcoil/decode/ImageSource;Ljava/lang/String;I)V -HSPLcoil/intercept/EngineInterceptor$decode$1;->(Lcoil/intercept/EngineInterceptor;Lkotlin/coroutines/Continuation;)V HSPLcoil/intercept/EngineInterceptor$execute$1;->(Lcoil/intercept/EngineInterceptor;Lkotlin/coroutines/Continuation;)V -HSPLcoil/intercept/EngineInterceptor$execute$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; -HSPLcoil/intercept/EngineInterceptor$execute$executeResult$1;->(Lcoil/intercept/EngineInterceptor;Lkotlin/jvm/internal/Ref$ObjectRef;Lkotlin/jvm/internal/Ref$ObjectRef;Lcoil/request/ImageRequest;Ljava/lang/Object;Lkotlin/jvm/internal/Ref$ObjectRef;Lcoil/EventListener;Lkotlin/coroutines/Continuation;)V -HSPLcoil/intercept/EngineInterceptor$execute$executeResult$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; -HSPLcoil/intercept/EngineInterceptor$execute$executeResult$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -HSPLcoil/intercept/EngineInterceptor$execute$executeResult$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HSPLcoil/intercept/EngineInterceptor$fetch$1;->(Lcoil/intercept/EngineInterceptor;Lkotlin/coroutines/Continuation;)V -HSPLcoil/intercept/EngineInterceptor$fetch$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HSPLcoil/intercept/EngineInterceptor$intercept$1;->(Lcoil/intercept/EngineInterceptor;Lkotlin/coroutines/Continuation;)V HSPLcoil/intercept/EngineInterceptor$intercept$2;->(Lcoil/intercept/EngineInterceptor;Lcoil/request/ImageRequest;Ljava/lang/Object;Lcoil/request/Options;Lcoil/EventListener;Lcoil/memory/MemoryCache$Key;Lcoil/intercept/Interceptor$Chain;Lkotlin/coroutines/Continuation;)V HSPLcoil/intercept/EngineInterceptor$intercept$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLcoil/intercept/EngineInterceptor$intercept$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HSPLcoil/intercept/EngineInterceptor;->(Lcoil/ImageLoader;Lcoil/request/RequestService;)V -HSPLcoil/intercept/EngineInterceptor;->access$decode(Lcoil/intercept/EngineInterceptor;Lcoil/fetch/SourceResult;Lcoil/ComponentRegistry;Lcoil/request/ImageRequest;Ljava/lang/Object;Lcoil/request/Options;Lcoil/EventListener;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLcoil/intercept/EngineInterceptor;->access$execute(Lcoil/intercept/EngineInterceptor;Lcoil/request/ImageRequest;Ljava/lang/Object;Lcoil/request/Options;Lcoil/EventListener;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLcoil/intercept/EngineInterceptor;->fetch(Lcoil/ComponentRegistry;Lcoil/request/ImageRequest;Ljava/lang/Object;Lcoil/request/Options;Lcoil/EventListener;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLcoil/intercept/EngineInterceptor;->intercept(Lcoil/intercept/RealInterceptorChain;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; @@ -6053,15 +5760,10 @@ HSPLcoil/memory/RealStrongMemoryCache;->(ILcoil/memory/WeakMemoryCache;)V HSPLcoil/memory/RealStrongMemoryCache;->get(Lcoil/memory/MemoryCache$Key;)Lcoil/memory/MemoryCache$Value; HSPLcoil/memory/RealWeakMemoryCache;->()V HSPLcoil/memory/RealWeakMemoryCache;->get(Lcoil/memory/MemoryCache$Key;)Lcoil/memory/MemoryCache$Value; -HSPLcoil/network/CacheResponse$cacheControl$2;->(Lcoil/network/CacheResponse;)V -HSPLcoil/network/CacheResponse$contentType$2;->(Lcoil/network/CacheResponse;)V -HSPLcoil/network/CacheResponse$contentType$2;->invoke()Ljava/lang/Object; -HSPLcoil/network/CacheResponse;->(Lokhttp3/Response;)V -HSPLcoil/network/CacheResponse;->(Lokio/RealBufferedSource;)V -HSPLcoil/network/CacheResponse;->writeTo(Lokio/RealBufferedSink;)V HSPLcoil/network/CacheStrategy$Factory;->(Lokhttp3/Request;Lcoil/network/CacheResponse;)V HSPLcoil/network/CacheStrategy$Factory;->compute()Lcoil/network/CacheStrategy; HSPLcoil/network/CacheStrategy;->(Lokhttp3/Request;Lcoil/network/CacheResponse;)V +HSPLcoil/network/EmptyNetworkObserver;->listSaver(Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;)Landroidx/compose/runtime/saveable/SaverKt$Saver$1; HSPLcoil/network/RealNetworkObserver$networkCallback$1;->(Lcoil/network/RealNetworkObserver;)V HSPLcoil/network/RealNetworkObserver$networkCallback$1;->onAvailable(Landroid/net/Network;)V HSPLcoil/network/RealNetworkObserver;->(Landroid/net/ConnectivityManager;Lcoil/network/NetworkObserver$Listener;)V @@ -6070,11 +5772,8 @@ HSPLcoil/network/RealNetworkObserver;->isOnline()Z HSPLcoil/request/BaseRequestDelegate;->(Landroidx/lifecycle/Lifecycle;Lkotlinx/coroutines/Job;)V HSPLcoil/request/BaseRequestDelegate;->start()V HSPLcoil/request/CachePolicy$EnumUnboxingLocalUtility;->getReadEnabled(I)Z -HSPLcoil/request/CachePolicy$EnumUnboxingLocalUtility;->getWriteEnabled(I)Z HSPLcoil/request/DefaultRequestOptions;->(I)V -HSPLcoil/request/DefaultRequestOptions;->equals(Ljava/lang/Object;)Z HSPLcoil/request/DefinedRequestOptions;->(Landroidx/lifecycle/Lifecycle;Lcoil/size/SizeResolver;ILkotlinx/coroutines/CoroutineDispatcher;Lkotlinx/coroutines/CoroutineDispatcher;Lkotlinx/coroutines/CoroutineDispatcher;Lkotlinx/coroutines/CoroutineDispatcher;Lcoil/transition/Transition$Factory;ILandroid/graphics/Bitmap$Config;Ljava/lang/Boolean;Ljava/lang/Boolean;III)V -HSPLcoil/request/DefinedRequestOptions;->equals(Ljava/lang/Object;)Z HSPLcoil/request/ImageRequest$Builder;->(Landroid/content/Context;)V HSPLcoil/request/ImageRequest$Builder;->(Lcoil/request/ImageRequest;Landroid/content/Context;)V HSPLcoil/request/ImageRequest$Builder;->build()Lcoil/request/ImageRequest; @@ -6088,7 +5787,6 @@ HSPLcoil/request/Parameters$Builder;->(Lcoil/request/Parameters;)V HSPLcoil/request/Parameters;->()V HSPLcoil/request/Parameters;->()V HSPLcoil/request/Parameters;->(Ljava/util/Map;)V -HSPLcoil/request/Parameters;->equals(Ljava/lang/Object;)Z HSPLcoil/request/RequestDelegate;->()V HSPLcoil/request/RequestDelegate;->(I)V HSPLcoil/request/RequestDelegate;->assertActive()V @@ -6097,7 +5795,6 @@ HSPLcoil/request/RequestService;->isConfigValidForHardware(Lcoil/request/ImageRe HSPLcoil/request/RequestService;->options(Lcoil/request/ImageRequest;Lcoil/size/Size;)Lcoil/request/Options; HSPLcoil/request/Tags;->()V HSPLcoil/request/Tags;->(Ljava/util/Map;)V -HSPLcoil/request/Tags;->equals(Ljava/lang/Object;)Z HSPLcoil/size/Dimension$Pixels;->(I)V HSPLcoil/size/Dimension$Pixels;->equals(Ljava/lang/Object;)Z HSPLcoil/size/Dimension$Undefined;->()V @@ -6107,7 +5804,6 @@ HSPLcoil/size/DisplaySizeResolver;->(Landroid/content/Context;)V HSPLcoil/size/Size;->()V HSPLcoil/size/Size;->(Lcoil/size/Dimension;Lcoil/size/Dimension;)V HSPLcoil/transition/NoneTransition$Factory;->()V -HSPLcoil/transition/NoneTransition$Factory;->equals(Ljava/lang/Object;)Z HSPLcoil/transition/Transition$Factory;->()V HSPLcoil/util/-Bitmaps;->isHardware(Landroid/graphics/Bitmap$Config;)Z HSPLcoil/util/-Collections;->toImmutableList(Ljava/util/ArrayList;)Ljava/util/List; @@ -6117,9 +5813,7 @@ HSPLcoil/util/-Requests;->()V HSPLcoil/util/-Requests;->getAllowInexactSize(Lcoil/request/ImageRequest;)Z HSPLcoil/util/-Requests;->getDrawableCompat(Lcoil/request/ImageRequest;Landroid/graphics/drawable/Drawable;Ljava/lang/Integer;Landroid/graphics/drawable/Drawable;)Landroid/graphics/drawable/Drawable; HSPLcoil/util/-Utils;->()V -HSPLcoil/util/-Utils;->closeQuietly(Ljava/io/Closeable;)V HSPLcoil/util/ContinuationCallback;->(Lokhttp3/Call;Lkotlinx/coroutines/CancellableContinuationImpl;)V -HSPLcoil/util/ContinuationCallback;->onResponse(Lokhttp3/Response;)V HSPLcoil/util/HardwareBitmapService;->()V HSPLcoil/util/ImageLoaderOptions;->()V HSPLcoil/util/ImmutableHardwareBitmapService;->(Z)V @@ -6181,7 +5875,8 @@ HSPLcom/google/protobuf/GeneratedMessageInfoFactory;->messageInfoFor(Ljava/lang/ HSPLcom/google/protobuf/GeneratedMessageLite$Builder;->(Lcom/google/samples/apps/nowinandroid/core/datastore/UserPreferences;)V HSPLcom/google/protobuf/GeneratedMessageLite$Builder;->buildPartial()Lcom/google/protobuf/GeneratedMessageLite; HSPLcom/google/protobuf/GeneratedMessageLite$Builder;->copyOnWrite()V -HSPLcom/google/protobuf/GeneratedMessageLite$Builder;->mergeFrom(Lcom/google/protobuf/GeneratedMessageLite;)Lcom/google/protobuf/GeneratedMessageLite$Builder; +HSPLcom/google/protobuf/GeneratedMessageLite$Builder;->mergeFrom(Lcom/google/protobuf/GeneratedMessageLite;)V +HSPLcom/google/protobuf/GeneratedMessageLite$Builder;->mergeFromInstance(Lcom/google/protobuf/GeneratedMessageLite;Ljava/lang/Object;)V HSPLcom/google/protobuf/GeneratedMessageLite$MethodToInvoke;->()V HSPLcom/google/protobuf/GeneratedMessageLite$MethodToInvoke;->(ILjava/lang/String;)V HSPLcom/google/protobuf/GeneratedMessageLite;->()V @@ -6347,7 +6042,6 @@ HSPLcom/google/samples/apps/nowinandroid/DaggerNiaApplication_HiltComponents_Sin HSPLcom/google/samples/apps/nowinandroid/DaggerNiaApplication_HiltComponents_SingletonC$SingletonCImpl;->(Ldagger/hilt/android/internal/modules/ApplicationContextModule;)V HSPLcom/google/samples/apps/nowinandroid/DaggerNiaApplication_HiltComponents_SingletonC$SingletonCImpl;->access$1500(Lcom/google/samples/apps/nowinandroid/DaggerNiaApplication_HiltComponents_SingletonC$SingletonCImpl;)Lcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepository; HSPLcom/google/samples/apps/nowinandroid/DaggerNiaApplication_HiltComponents_SingletonC$SingletonCImpl;->access$1600(Lcom/google/samples/apps/nowinandroid/DaggerNiaApplication_HiltComponents_SingletonC$SingletonCImpl;)Lcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstUserDataRepository; -HSPLcom/google/samples/apps/nowinandroid/DaggerNiaApplication_HiltComponents_SingletonC$SingletonCImpl;->fakeNiaNetworkDataSource()Lcom/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSource; HSPLcom/google/samples/apps/nowinandroid/DaggerNiaApplication_HiltComponents_SingletonC$SingletonCImpl;->hiltWorkerFactory()Landroidx/hilt/work/HiltWorkerFactory; HSPLcom/google/samples/apps/nowinandroid/DaggerNiaApplication_HiltComponents_SingletonC$SingletonCImpl;->injectNiaApplication()V HSPLcom/google/samples/apps/nowinandroid/DaggerNiaApplication_HiltComponents_SingletonC$SingletonCImpl;->retainedComponentBuilder()Lcom/google/samples/apps/nowinandroid/DaggerNiaApplication_HiltComponents_SingletonC$ActivityRetainedCBuilder; @@ -6355,7 +6049,7 @@ HSPLcom/google/samples/apps/nowinandroid/DaggerNiaApplication_HiltComponents_Sin HSPLcom/google/samples/apps/nowinandroid/DaggerNiaApplication_HiltComponents_SingletonC$ViewModelCImpl$SwitchingProvider;->(Lcom/google/samples/apps/nowinandroid/DaggerNiaApplication_HiltComponents_SingletonC$SingletonCImpl;Lcom/google/samples/apps/nowinandroid/DaggerNiaApplication_HiltComponents_SingletonC$ViewModelCImpl;I)V HSPLcom/google/samples/apps/nowinandroid/DaggerNiaApplication_HiltComponents_SingletonC$ViewModelCImpl$SwitchingProvider;->get()Ljava/lang/Object; HSPLcom/google/samples/apps/nowinandroid/DaggerNiaApplication_HiltComponents_SingletonC$ViewModelCImpl;->(Lcom/google/samples/apps/nowinandroid/DaggerNiaApplication_HiltComponents_SingletonC$SingletonCImpl;Lcom/google/samples/apps/nowinandroid/DaggerNiaApplication_HiltComponents_SingletonC$ActivityRetainedCImpl;Landroidx/lifecycle/SavedStateHandle;)V -HSPLcom/google/samples/apps/nowinandroid/DaggerNiaApplication_HiltComponents_SingletonC$ViewModelCImpl;->access$2000(Lcom/google/samples/apps/nowinandroid/DaggerNiaApplication_HiltComponents_SingletonC$ViewModelCImpl;)Lcom/google/samples/apps/nowinandroid/core/domain/GetSaveableNewsResourcesUseCase; +HSPLcom/google/samples/apps/nowinandroid/DaggerNiaApplication_HiltComponents_SingletonC$ViewModelCImpl;->access$1800(Lcom/google/samples/apps/nowinandroid/DaggerNiaApplication_HiltComponents_SingletonC$ViewModelCImpl;)Lcom/google/samples/apps/nowinandroid/core/domain/GetSaveableNewsResourcesUseCase; HSPLcom/google/samples/apps/nowinandroid/DaggerNiaApplication_HiltComponents_SingletonC$ViewModelCImpl;->getHiltViewModelMap()Ljava/util/Map; HSPLcom/google/samples/apps/nowinandroid/Hilt_MainActivity$1;->(Lcom/google/samples/apps/nowinandroid/Hilt_MainActivity;)V HSPLcom/google/samples/apps/nowinandroid/Hilt_MainActivity$1;->onContextAvailable()V @@ -6423,30 +6117,6 @@ HSPLcom/google/samples/apps/nowinandroid/core/data/SyncUtilitiesKt$suspendRunCat HSPLcom/google/samples/apps/nowinandroid/core/data/SyncUtilitiesKt$suspendRunCatching$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HSPLcom/google/samples/apps/nowinandroid/core/data/SyncUtilitiesKt;->changeListSync(Lcom/google/samples/apps/nowinandroid/sync/workers/SyncWorker;Lkotlin/coroutines/Continuation;Lkotlin/jvm/internal/PropertyReference1Impl;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; HSPLcom/google/samples/apps/nowinandroid/core/data/SyncUtilitiesKt;->suspendRunCatching(Lcom/google/samples/apps/nowinandroid/core/data/SyncUtilitiesKt$changeListSync$2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -HSPLcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstAuthorsRepository$getAuthors$$inlined$map$1$2$1;->(Lcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstAuthorsRepository$getAuthors$$inlined$map$1$2;Lkotlin/coroutines/Continuation;)V -HSPLcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstAuthorsRepository$getAuthors$$inlined$map$1$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; -HSPLcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstAuthorsRepository$getAuthors$$inlined$map$1$2;->(Lkotlinx/coroutines/flow/FlowCollector;)V -HSPLcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstAuthorsRepository$getAuthors$$inlined$map$1$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -HSPLcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstAuthorsRepository$getAuthors$$inlined$map$1;->(Lkotlinx/coroutines/flow/Flow;)V -HSPLcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstAuthorsRepository$getAuthors$$inlined$map$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -HSPLcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstAuthorsRepository$syncWith$2;->()V -HSPLcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstAuthorsRepository$syncWith$2;->()V -HSPLcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstAuthorsRepository$syncWith$2;->get(Ljava/lang/Object;)Ljava/lang/Object; -HSPLcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstAuthorsRepository$syncWith$3;->(Lcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstAuthorsRepository;Lkotlin/coroutines/Continuation;)V -HSPLcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstAuthorsRepository$syncWith$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; -HSPLcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstAuthorsRepository$syncWith$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -HSPLcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstAuthorsRepository$syncWith$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; -HSPLcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstAuthorsRepository$syncWith$4;->()V -HSPLcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstAuthorsRepository$syncWith$4;->()V -HSPLcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstAuthorsRepository$syncWith$4;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -HSPLcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstAuthorsRepository$syncWith$5;->(Lcom/google/samples/apps/nowinandroid/core/database/dao/AuthorDao;)V -HSPLcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstAuthorsRepository$syncWith$5;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -HSPLcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstAuthorsRepository$syncWith$6;->(Lcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstAuthorsRepository;Lkotlin/coroutines/Continuation;)V -HSPLcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstAuthorsRepository$syncWith$6;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; -HSPLcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstAuthorsRepository$syncWith$6;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -HSPLcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstAuthorsRepository$syncWith$6;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; -HSPLcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstAuthorsRepository;->(Lcom/google/samples/apps/nowinandroid/core/database/dao/AuthorDao;Lcom/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSource;)V -HSPLcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstAuthorsRepository;->syncWith(Lcom/google/samples/apps/nowinandroid/sync/workers/SyncWorker;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepository$syncWith$2;->()V HSPLcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepository$syncWith$2;->()V HSPLcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepository$syncWith$2;->get(Ljava/lang/Object;)Ljava/lang/Object; @@ -6463,7 +6133,7 @@ HSPLcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRe HSPLcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepository$syncWith$6;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepository$syncWith$6;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepository$syncWith$6;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; -HSPLcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepository;->(Lcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao;Lcom/google/samples/apps/nowinandroid/core/database/dao/AuthorDao;Lcom/google/samples/apps/nowinandroid/core/database/dao/TopicDao;Lcom/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSource;)V +HSPLcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepository;->(Lcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao;Lcom/google/samples/apps/nowinandroid/core/database/dao/TopicDao;Lcom/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSource;)V HSPLcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepository;->syncWith(Lcom/google/samples/apps/nowinandroid/sync/workers/SyncWorker;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstTopicsRepository$getTopics$$inlined$map$1$2$1;->(Lcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstTopicsRepository$getTopics$$inlined$map$1$2;Lkotlin/coroutines/Continuation;)V HSPLcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstTopicsRepository$getTopics$$inlined$map$1$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; @@ -6500,10 +6170,11 @@ HSPLcom/google/samples/apps/nowinandroid/core/data/util/ConnectivityManagerNetwo HSPLcom/google/samples/apps/nowinandroid/core/data/util/ConnectivityManagerNetworkMonitor$isOnline$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HSPLcom/google/samples/apps/nowinandroid/core/data/util/ConnectivityManagerNetworkMonitor;->(Landroid/content/Context;)V HSPLcom/google/samples/apps/nowinandroid/core/data/util/ConnectivityManagerNetworkMonitor;->access$isCurrentlyConnected(Lcom/google/samples/apps/nowinandroid/core/data/util/ConnectivityManagerNetworkMonitor;Landroid/net/ConnectivityManager;)Z -HSPLcom/google/samples/apps/nowinandroid/core/database/DatabaseMigrations$Schema10to11;->()V +HSPLcom/google/samples/apps/nowinandroid/core/database/DatabaseMigrations$Schema11to12;->()V HSPLcom/google/samples/apps/nowinandroid/core/database/DatabaseMigrations$Schema2to3;->()V HSPLcom/google/samples/apps/nowinandroid/core/database/NiaDatabase;->()V HSPLcom/google/samples/apps/nowinandroid/core/database/NiaDatabase_AutoMigration_10_11_Impl;->()V +HSPLcom/google/samples/apps/nowinandroid/core/database/NiaDatabase_AutoMigration_11_12_Impl;->()V HSPLcom/google/samples/apps/nowinandroid/core/database/NiaDatabase_AutoMigration_1_2_Impl;->()V HSPLcom/google/samples/apps/nowinandroid/core/database/NiaDatabase_AutoMigration_2_3_Impl;->()V HSPLcom/google/samples/apps/nowinandroid/core/database/NiaDatabase_AutoMigration_3_4_Impl;->()V @@ -6518,7 +6189,6 @@ HSPLcom/google/samples/apps/nowinandroid/core/database/NiaDatabase_Impl$1;->crea HSPLcom/google/samples/apps/nowinandroid/core/database/NiaDatabase_Impl$1;->onCreate(Landroidx/sqlite/db/framework/FrameworkSQLiteDatabase;)V HSPLcom/google/samples/apps/nowinandroid/core/database/NiaDatabase_Impl$1;->onOpen(Landroidx/sqlite/db/framework/FrameworkSQLiteDatabase;)V HSPLcom/google/samples/apps/nowinandroid/core/database/NiaDatabase_Impl;->()V -HSPLcom/google/samples/apps/nowinandroid/core/database/NiaDatabase_Impl;->authorDao()Lcom/google/samples/apps/nowinandroid/core/database/dao/AuthorDao; HSPLcom/google/samples/apps/nowinandroid/core/database/NiaDatabase_Impl;->createInvalidationTracker()Landroidx/room/InvalidationTracker; HSPLcom/google/samples/apps/nowinandroid/core/database/NiaDatabase_Impl;->createOpenHelper(Landroidx/room/DatabaseConfiguration;)Landroidx/sqlite/db/SupportSQLiteOpenHelper; HSPLcom/google/samples/apps/nowinandroid/core/database/NiaDatabase_Impl;->getAutoMigrations(Ljava/util/LinkedHashMap;)Ljava/util/List; @@ -6526,50 +6196,23 @@ HSPLcom/google/samples/apps/nowinandroid/core/database/NiaDatabase_Impl;->getReq HSPLcom/google/samples/apps/nowinandroid/core/database/NiaDatabase_Impl;->getRequiredTypeConverters()Ljava/util/Map; HSPLcom/google/samples/apps/nowinandroid/core/database/NiaDatabase_Impl;->newsResourceDao()Lcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao; HSPLcom/google/samples/apps/nowinandroid/core/database/NiaDatabase_Impl;->topicDao()Lcom/google/samples/apps/nowinandroid/core/database/dao/TopicDao; -HSPLcom/google/samples/apps/nowinandroid/core/database/dao/AuthorDao_Impl$10;->(Lcom/google/samples/apps/nowinandroid/core/database/dao/AuthorDao_Impl;Ljava/util/List;)V -HSPLcom/google/samples/apps/nowinandroid/core/database/dao/AuthorDao_Impl$10;->call()Ljava/lang/Object; -HSPLcom/google/samples/apps/nowinandroid/core/database/dao/AuthorDao_Impl$1;->(Landroidx/room/RoomDatabase;)V -HSPLcom/google/samples/apps/nowinandroid/core/database/dao/AuthorDao_Impl$1;->bind(Landroidx/sqlite/db/SupportSQLiteStatement;Ljava/lang/Object;)V -HSPLcom/google/samples/apps/nowinandroid/core/database/dao/AuthorDao_Impl$1;->createQuery()Ljava/lang/String; -HSPLcom/google/samples/apps/nowinandroid/core/database/dao/AuthorDao_Impl$2;->(Landroidx/room/RoomDatabase;)V -HSPLcom/google/samples/apps/nowinandroid/core/database/dao/AuthorDao_Impl$3;->(Landroidx/room/RoomDatabase;)V -HSPLcom/google/samples/apps/nowinandroid/core/database/dao/AuthorDao_Impl$3;->bind(Landroidx/sqlite/db/SupportSQLiteStatement;Ljava/lang/Object;)V -HSPLcom/google/samples/apps/nowinandroid/core/database/dao/AuthorDao_Impl$3;->createQuery()Ljava/lang/String; -HSPLcom/google/samples/apps/nowinandroid/core/database/dao/AuthorDao_Impl$4;->(Landroidx/room/RoomDatabase;)V -HSPLcom/google/samples/apps/nowinandroid/core/database/dao/AuthorDao_Impl$5;->(Lcom/google/samples/apps/nowinandroid/core/database/dao/AuthorDao_Impl;Ljava/util/ArrayList;)V -HSPLcom/google/samples/apps/nowinandroid/core/database/dao/AuthorDao_Impl$5;->call()Ljava/lang/Object; -HSPLcom/google/samples/apps/nowinandroid/core/database/dao/AuthorDao_Impl$7;->(Lcom/google/samples/apps/nowinandroid/core/database/dao/AuthorDao_Impl;Ljava/util/ArrayList;)V -HSPLcom/google/samples/apps/nowinandroid/core/database/dao/AuthorDao_Impl$7;->call()Ljava/lang/Object; -HSPLcom/google/samples/apps/nowinandroid/core/database/dao/AuthorDao_Impl$9;->(Lcom/google/samples/apps/nowinandroid/core/database/dao/AuthorDao_Impl;Landroidx/room/RoomSQLiteQuery;)V -HSPLcom/google/samples/apps/nowinandroid/core/database/dao/AuthorDao_Impl$9;->call()Ljava/lang/Object; -HSPLcom/google/samples/apps/nowinandroid/core/database/dao/AuthorDao_Impl;->(Landroidx/room/RoomDatabase;)V -HSPLcom/google/samples/apps/nowinandroid/core/database/dao/AuthorDao_Impl;->deleteAuthors(Ljava/util/List;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -HSPLcom/google/samples/apps/nowinandroid/core/database/dao/AuthorDao_Impl;->getAuthorEntities()Lkotlinx/coroutines/flow/SafeFlow; -HSPLcom/google/samples/apps/nowinandroid/core/database/dao/AuthorDao_Impl;->insertOrIgnoreAuthors(Ljava/util/ArrayList;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -HSPLcom/google/samples/apps/nowinandroid/core/database/dao/AuthorDao_Impl;->upsertAuthors(Ljava/util/ArrayList;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -HSPLcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl$11;->(Lcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl;Ljava/util/ArrayList;)V -HSPLcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl$11;->call()Ljava/lang/Object; -HSPLcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl$14;->(Lcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl;Ljava/util/List;)V -HSPLcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl$14;->call()Ljava/lang/Object; +HSPLcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl$12;->(Lcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl;Ljava/util/List;)V +HSPLcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl$12;->call()Ljava/lang/Object; HSPLcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl$1;->(Lcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl;Landroidx/room/RoomDatabase;)V HSPLcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl$2;->(Landroidx/room/RoomDatabase;)V HSPLcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl$2;->bind(Landroidx/sqlite/db/SupportSQLiteStatement;Ljava/lang/Object;)V HSPLcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl$2;->createQuery()Ljava/lang/String; -HSPLcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl$3;->(Landroidx/room/RoomDatabase;)V -HSPLcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl$3;->bind(Landroidx/sqlite/db/SupportSQLiteStatement;Ljava/lang/Object;)V -HSPLcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl$3;->createQuery()Ljava/lang/String; +HSPLcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl$3;->(Lcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl;Landroidx/room/RoomDatabase;)V HSPLcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl$4;->(Lcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl;Landroidx/room/RoomDatabase;)V +HSPLcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl$4;->bind(Landroidx/sqlite/db/SupportSQLiteStatement;Ljava/lang/Object;)V +HSPLcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl$4;->createQuery()Ljava/lang/String; HSPLcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl$5;->(Lcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl;Landroidx/room/RoomDatabase;)V -HSPLcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl$5;->bind(Landroidx/sqlite/db/SupportSQLiteStatement;Ljava/lang/Object;)V -HSPLcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl$5;->createQuery()Ljava/lang/String; -HSPLcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl$6;->(Lcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl;Landroidx/room/RoomDatabase;)V -HSPLcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl$8;->(Lcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl;Ljava/util/ArrayList;)V -HSPLcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl$8;->call()Ljava/lang/Object; +HSPLcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl$7;->(Lcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl;Ljava/util/ArrayList;)V +HSPLcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl$7;->call()Ljava/lang/Object; HSPLcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl$9;->(Lcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl;Ljava/util/ArrayList;)V HSPLcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl$9;->call()Ljava/lang/Object; HSPLcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl;->(Landroidx/room/RoomDatabase;)V HSPLcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl;->deleteNewsResources(Ljava/util/List;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -HSPLcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl;->insertOrIgnoreAuthorCrossRefEntities(Ljava/util/ArrayList;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl;->insertOrIgnoreTopicCrossRefEntities(Ljava/util/ArrayList;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl;->upsertNewsResources(Ljava/util/ArrayList;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLcom/google/samples/apps/nowinandroid/core/database/dao/TopicDao_Impl$11;->(Lcom/google/samples/apps/nowinandroid/core/database/dao/TopicDao_Impl;Ljava/util/List;)V @@ -6593,10 +6236,6 @@ HSPLcom/google/samples/apps/nowinandroid/core/database/dao/TopicDao_Impl;->delet HSPLcom/google/samples/apps/nowinandroid/core/database/dao/TopicDao_Impl;->getTopicEntities()Lkotlinx/coroutines/flow/SafeFlow; HSPLcom/google/samples/apps/nowinandroid/core/database/dao/TopicDao_Impl;->insertOrIgnoreTopics(Ljava/util/ArrayList;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLcom/google/samples/apps/nowinandroid/core/database/dao/TopicDao_Impl;->upsertTopics(Ljava/util/ArrayList;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -HSPLcom/google/samples/apps/nowinandroid/core/database/model/AuthorEntity;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V -HSPLcom/google/samples/apps/nowinandroid/core/database/model/AuthorEntityKt;->asExternalModel(Lcom/google/samples/apps/nowinandroid/core/database/model/AuthorEntity;)Lcom/google/samples/apps/nowinandroid/core/model/data/Author; -HSPLcom/google/samples/apps/nowinandroid/core/database/model/NewsResourceAuthorCrossRef;->(Ljava/lang/String;Ljava/lang/String;)V -HSPLcom/google/samples/apps/nowinandroid/core/database/model/NewsResourceAuthorCrossRef;->hashCode()I HSPLcom/google/samples/apps/nowinandroid/core/database/model/NewsResourceEntity;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlinx/datetime/Instant;Lcom/google/samples/apps/nowinandroid/core/model/data/NewsResourceType;)V HSPLcom/google/samples/apps/nowinandroid/core/database/model/NewsResourceTopicCrossRef;->(Ljava/lang/String;Ljava/lang/String;)V HSPLcom/google/samples/apps/nowinandroid/core/database/model/NewsResourceTopicCrossRef;->hashCode()I @@ -6604,8 +6243,7 @@ HSPLcom/google/samples/apps/nowinandroid/core/database/model/TopicEntity;->()V HSPLcom/google/samples/apps/nowinandroid/core/database/util/InstantConverter;->instantToLong(Lkotlinx/datetime/Instant;)Ljava/lang/Long; HSPLcom/google/samples/apps/nowinandroid/core/database/util/NewsResourceTypeConverter;->()V -HSPLcom/google/samples/apps/nowinandroid/core/datastore/ChangeListVersions;->(III)V -HSPLcom/google/samples/apps/nowinandroid/core/datastore/ChangeListVersions;->copy$default(Lcom/google/samples/apps/nowinandroid/core/datastore/ChangeListVersions;IIII)Lcom/google/samples/apps/nowinandroid/core/datastore/ChangeListVersions; +HSPLcom/google/samples/apps/nowinandroid/core/datastore/ChangeListVersions;->(II)V HSPLcom/google/samples/apps/nowinandroid/core/datastore/DarkThemeConfigProto;->()V HSPLcom/google/samples/apps/nowinandroid/core/datastore/DarkThemeConfigProto;->(IILjava/lang/String;)V HSPLcom/google/samples/apps/nowinandroid/core/datastore/DarkThemeConfigProto;->values()[Lcom/google/samples/apps/nowinandroid/core/datastore/DarkThemeConfigProto; @@ -6654,10 +6292,8 @@ HSPLcom/google/samples/apps/nowinandroid/core/datastore/UserPreferences;->access HSPLcom/google/samples/apps/nowinandroid/core/datastore/UserPreferences;->access$2500(Lcom/google/samples/apps/nowinandroid/core/datastore/UserPreferences;)V HSPLcom/google/samples/apps/nowinandroid/core/datastore/UserPreferences;->access$400(Lcom/google/samples/apps/nowinandroid/core/datastore/UserPreferences;)V HSPLcom/google/samples/apps/nowinandroid/core/datastore/UserPreferences;->access$500(Lcom/google/samples/apps/nowinandroid/core/datastore/UserPreferences;I)V -HSPLcom/google/samples/apps/nowinandroid/core/datastore/UserPreferences;->access$700(Lcom/google/samples/apps/nowinandroid/core/datastore/UserPreferences;I)V HSPLcom/google/samples/apps/nowinandroid/core/datastore/UserPreferences;->access$900(Lcom/google/samples/apps/nowinandroid/core/datastore/UserPreferences;I)V HSPLcom/google/samples/apps/nowinandroid/core/datastore/UserPreferences;->dynamicMethod(Lcom/google/protobuf/GeneratedMessageLite$MethodToInvoke;)Ljava/lang/Object; -HSPLcom/google/samples/apps/nowinandroid/core/datastore/UserPreferences;->getAuthorChangeListVersion()I HSPLcom/google/samples/apps/nowinandroid/core/datastore/UserPreferences;->getBookmarkedNewsResourceIdsMap()Ljava/util/Map; HSPLcom/google/samples/apps/nowinandroid/core/datastore/UserPreferences;->getDarkThemeConfig()Lcom/google/samples/apps/nowinandroid/core/datastore/DarkThemeConfigProto; HSPLcom/google/samples/apps/nowinandroid/core/datastore/UserPreferences;->getDefaultInstance()Lcom/google/samples/apps/nowinandroid/core/datastore/UserPreferences; @@ -6665,7 +6301,6 @@ HSPLcom/google/samples/apps/nowinandroid/core/datastore/UserPreferences;->getDep HSPLcom/google/samples/apps/nowinandroid/core/datastore/UserPreferences;->getDeprecatedFollowedTopicIdsList()Ljava/util/List; HSPLcom/google/samples/apps/nowinandroid/core/datastore/UserPreferences;->getDeprecatedIntFollowedAuthorIdsList()Ljava/util/List; HSPLcom/google/samples/apps/nowinandroid/core/datastore/UserPreferences;->getDeprecatedIntFollowedTopicIdsList()Ljava/util/List; -HSPLcom/google/samples/apps/nowinandroid/core/datastore/UserPreferences;->getFollowedAuthorIdsMap()Ljava/util/Map; HSPLcom/google/samples/apps/nowinandroid/core/datastore/UserPreferences;->getFollowedTopicIdsMap()Ljava/util/Map; HSPLcom/google/samples/apps/nowinandroid/core/datastore/UserPreferences;->getHasDoneIntToStringIdMigration()Z HSPLcom/google/samples/apps/nowinandroid/core/datastore/UserPreferences;->getNewsResourceChangeListVersion()I @@ -6722,6 +6357,9 @@ HSPLcom/google/samples/apps/nowinandroid/core/designsystem/component/NavigationK HSPLcom/google/samples/apps/nowinandroid/core/designsystem/component/NavigationKt;->NiaNavigationBarItem(Landroidx/compose/foundation/layout/RowScope;ZLkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function2;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function2;ZLkotlin/jvm/functions/Function2;ZLandroidx/compose/runtime/Composer;II)V HSPLcom/google/samples/apps/nowinandroid/core/designsystem/component/NiaButtonDefaults;->()V HSPLcom/google/samples/apps/nowinandroid/core/designsystem/component/NiaButtonDefaults;->buttonContentPadding(ZZZ)Landroidx/compose/foundation/layout/PaddingValuesImpl; +HSPLcom/google/samples/apps/nowinandroid/core/designsystem/component/NiaNavigationDefaults;->navigationContentColor-WaAFU9c(Landroidx/compose/runtime/Composer;)J +HSPLcom/google/samples/apps/nowinandroid/core/designsystem/component/NiaNavigationDefaults;->navigationIndicatorColor-WaAFU9c(Landroidx/compose/runtime/Composer;)J +HSPLcom/google/samples/apps/nowinandroid/core/designsystem/component/NiaNavigationDefaults;->navigationSelectedItemColor-WaAFU9c(Landroidx/compose/runtime/Composer;)J HSPLcom/google/samples/apps/nowinandroid/core/designsystem/component/NiaToggleButtonDefaults;->()V HSPLcom/google/samples/apps/nowinandroid/core/designsystem/component/ToggleButtonKt$NiaToggleButton$1$1;->(Lkotlin/jvm/functions/Function1;Z)V HSPLcom/google/samples/apps/nowinandroid/core/designsystem/component/ToggleButtonKt$NiaToggleButton$2$1;->(Lkotlin/jvm/functions/Function1;Z)V @@ -6770,19 +6408,8 @@ HSPLcom/google/samples/apps/nowinandroid/core/domain/GetFollowableTopicsUseCase; HSPLcom/google/samples/apps/nowinandroid/core/domain/GetFollowableTopicsUseCase;->invoke$enumunboxing$(I)Lkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$unsafeFlow$1; HSPLcom/google/samples/apps/nowinandroid/core/domain/GetSaveableNewsResourcesUseCase$special$$inlined$map$1;->(Lcom/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSource$special$$inlined$map$1;)V HSPLcom/google/samples/apps/nowinandroid/core/domain/GetSaveableNewsResourcesUseCase;->(Lcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepository;Lcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstUserDataRepository;)V -HSPLcom/google/samples/apps/nowinandroid/core/domain/GetSortedFollowableAuthorsUseCase$invoke$1$invokeSuspend$$inlined$sortedBy$1;->()V -HSPLcom/google/samples/apps/nowinandroid/core/domain/GetSortedFollowableAuthorsUseCase$invoke$1$invokeSuspend$$inlined$sortedBy$1;->compare(Ljava/lang/Object;Ljava/lang/Object;)I -HSPLcom/google/samples/apps/nowinandroid/core/domain/GetSortedFollowableAuthorsUseCase$invoke$1;->(Lkotlin/coroutines/Continuation;)V -HSPLcom/google/samples/apps/nowinandroid/core/domain/GetSortedFollowableAuthorsUseCase$invoke$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -HSPLcom/google/samples/apps/nowinandroid/core/domain/GetSortedFollowableAuthorsUseCase$invoke$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; -HSPLcom/google/samples/apps/nowinandroid/core/domain/GetSortedFollowableAuthorsUseCase;->(Lcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstAuthorsRepository;Lcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstUserDataRepository;)V -HSPLcom/google/samples/apps/nowinandroid/core/domain/GetSortedFollowableAuthorsUseCase;->invoke()Lkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$unsafeFlow$1; -HSPLcom/google/samples/apps/nowinandroid/core/domain/model/FollowableAuthor;->(Lcom/google/samples/apps/nowinandroid/core/model/data/Author;Z)V -HSPLcom/google/samples/apps/nowinandroid/core/domain/model/FollowableAuthor;->equals(Ljava/lang/Object;)Z HSPLcom/google/samples/apps/nowinandroid/core/domain/model/FollowableTopic;->(Lcom/google/samples/apps/nowinandroid/core/model/data/Topic;Z)V HSPLcom/google/samples/apps/nowinandroid/core/domain/model/FollowableTopic;->equals(Ljava/lang/Object;)Z -HSPLcom/google/samples/apps/nowinandroid/core/model/data/Author;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V -HSPLcom/google/samples/apps/nowinandroid/core/model/data/Author;->equals(Ljava/lang/Object;)Z HSPLcom/google/samples/apps/nowinandroid/core/model/data/DarkThemeConfig;->()V HSPLcom/google/samples/apps/nowinandroid/core/model/data/DarkThemeConfig;->(ILjava/lang/String;)V HSPLcom/google/samples/apps/nowinandroid/core/model/data/NewsResourceType;->()V @@ -6793,18 +6420,10 @@ HSPLcom/google/samples/apps/nowinandroid/core/model/data/ThemeBrand;->() HSPLcom/google/samples/apps/nowinandroid/core/model/data/ThemeBrand;->(ILjava/lang/String;)V HSPLcom/google/samples/apps/nowinandroid/core/model/data/Topic;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V HSPLcom/google/samples/apps/nowinandroid/core/model/data/Topic;->equals(Ljava/lang/Object;)Z -HSPLcom/google/samples/apps/nowinandroid/core/model/data/UserData;->(Ljava/util/Set;Ljava/util/Set;Ljava/util/Set;Lcom/google/samples/apps/nowinandroid/core/model/data/ThemeBrand;Lcom/google/samples/apps/nowinandroid/core/model/data/DarkThemeConfig;Z)V +HSPLcom/google/samples/apps/nowinandroid/core/model/data/UserData;->(Ljava/util/Set;Ljava/util/Set;Lcom/google/samples/apps/nowinandroid/core/model/data/ThemeBrand;Lcom/google/samples/apps/nowinandroid/core/model/data/DarkThemeConfig;Z)V HSPLcom/google/samples/apps/nowinandroid/core/model/data/UserData;->equals(Ljava/lang/Object;)Z HSPLcom/google/samples/apps/nowinandroid/core/network/di/NetworkModule$providesFakeAssetManager$1;->(Landroid/content/res/AssetManager;)V HSPLcom/google/samples/apps/nowinandroid/core/network/di/NetworkModule$providesFakeAssetManager$1;->open(Ljava/lang/String;)Ljava/io/InputStream; -HSPLcom/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSource$getAuthorChangeList$1;->(Lcom/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSource;Lkotlin/coroutines/Continuation;)V -HSPLcom/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSource$getAuthorChangeList$2;->()V -HSPLcom/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSource$getAuthorChangeList$2;->()V -HSPLcom/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSource$getAuthorChangeList$2;->get(Ljava/lang/Object;)Ljava/lang/Object; -HSPLcom/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSource$getAuthors$2;->(Lcom/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSource;Lkotlin/coroutines/Continuation;)V -HSPLcom/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSource$getAuthors$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; -HSPLcom/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSource$getAuthors$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -HSPLcom/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSource$getAuthors$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HSPLcom/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSource$getNewsResourceChangeList$1;->(Lcom/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSource;Lkotlin/coroutines/Continuation;)V HSPLcom/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSource$getNewsResourceChangeList$2;->()V HSPLcom/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSource$getNewsResourceChangeList$2;->()V @@ -6822,31 +6441,23 @@ HSPLcom/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSou HSPLcom/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSource$getTopics$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLcom/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSource$getTopics$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HSPLcom/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSource;->(Lkotlinx/coroutines/scheduling/DefaultIoScheduler;Lkotlinx/serialization/json/Json;Lcom/google/samples/apps/nowinandroid/core/network/fake/FakeAssetManager;)V -HSPLcom/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSource;->getAuthorChangeList(Lkotlin/coroutines/Continuation;)Ljava/io/Serializable; -HSPLcom/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSource;->getAuthors(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLcom/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSource;->getNewsResourceChangeList(Lkotlin/coroutines/Continuation;)Ljava/io/Serializable; HSPLcom/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSource;->getNewsResources(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLcom/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSource;->getTopicChangeList(Lkotlin/coroutines/Continuation;)Ljava/io/Serializable; HSPLcom/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSource;->getTopics(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLcom/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSourceKt;->access$mapToChangeList(Ljava/util/List;Lkotlin/jvm/internal/PropertyReference1Impl;)Ljava/util/ArrayList; -HSPLcom/google/samples/apps/nowinandroid/core/network/model/NetworkAuthor$$serializer;->()V -HSPLcom/google/samples/apps/nowinandroid/core/network/model/NetworkAuthor$$serializer;->()V -HSPLcom/google/samples/apps/nowinandroid/core/network/model/NetworkAuthor$$serializer;->deserialize(Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; -HSPLcom/google/samples/apps/nowinandroid/core/network/model/NetworkAuthor$$serializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; -HSPLcom/google/samples/apps/nowinandroid/core/network/model/NetworkAuthor$Companion;->()V -HSPLcom/google/samples/apps/nowinandroid/core/network/model/NetworkAuthor$Companion;->serializer()Lkotlinx/serialization/KSerializer; -HSPLcom/google/samples/apps/nowinandroid/core/network/model/NetworkAuthor;->()V -HSPLcom/google/samples/apps/nowinandroid/core/network/model/NetworkAuthor;->(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V HSPLcom/google/samples/apps/nowinandroid/core/network/model/NetworkChangeList$Companion;->()V HSPLcom/google/samples/apps/nowinandroid/core/network/model/NetworkChangeList;->()V HSPLcom/google/samples/apps/nowinandroid/core/network/model/NetworkChangeList;->(Ljava/lang/String;I)V HSPLcom/google/samples/apps/nowinandroid/core/network/model/NetworkNewsResource$$serializer;->()V HSPLcom/google/samples/apps/nowinandroid/core/network/model/NetworkNewsResource$$serializer;->()V +HSPLcom/google/samples/apps/nowinandroid/core/network/model/NetworkNewsResource$$serializer;->childSerializers()[Lkotlinx/serialization/KSerializer; HSPLcom/google/samples/apps/nowinandroid/core/network/model/NetworkNewsResource$$serializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; +HSPLcom/google/samples/apps/nowinandroid/core/network/model/NetworkNewsResource$$serializer;->typeParametersSerializers()V HSPLcom/google/samples/apps/nowinandroid/core/network/model/NetworkNewsResource$Companion;->()V HSPLcom/google/samples/apps/nowinandroid/core/network/model/NetworkNewsResource$Companion;->serializer()Lkotlinx/serialization/KSerializer; HSPLcom/google/samples/apps/nowinandroid/core/network/model/NetworkNewsResource;->()V -HSPLcom/google/samples/apps/nowinandroid/core/network/model/NetworkNewsResource;->(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlinx/datetime/Instant;Lcom/google/samples/apps/nowinandroid/core/model/data/NewsResourceType;Ljava/util/List;Ljava/util/List;)V +HSPLcom/google/samples/apps/nowinandroid/core/network/model/NetworkNewsResource;->(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlinx/datetime/Instant;Lcom/google/samples/apps/nowinandroid/core/model/data/NewsResourceType;Ljava/util/List;)V HSPLcom/google/samples/apps/nowinandroid/core/network/model/NetworkTopic$$serializer;->()V HSPLcom/google/samples/apps/nowinandroid/core/network/model/NetworkTopic$$serializer;->()V HSPLcom/google/samples/apps/nowinandroid/core/network/model/NetworkTopic$$serializer;->deserialize(Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; @@ -6857,9 +6468,12 @@ HSPLcom/google/samples/apps/nowinandroid/core/network/model/NetworkTopic;->(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)V HSPLcom/google/samples/apps/nowinandroid/core/network/model/util/InstantSerializer;->()V HSPLcom/google/samples/apps/nowinandroid/core/network/model/util/InstantSerializer;->()V +HSPLcom/google/samples/apps/nowinandroid/core/network/model/util/InstantSerializer;->deserialize(Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; +HSPLcom/google/samples/apps/nowinandroid/core/network/model/util/InstantSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; HSPLcom/google/samples/apps/nowinandroid/core/network/model/util/NewsResourceTypeSerializer;->()V HSPLcom/google/samples/apps/nowinandroid/core/network/model/util/NewsResourceTypeSerializer;->()V HSPLcom/google/samples/apps/nowinandroid/core/network/model/util/NewsResourceTypeSerializer;->deserialize(Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; +HSPLcom/google/samples/apps/nowinandroid/core/network/model/util/NewsResourceTypeSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; HSPLcom/google/samples/apps/nowinandroid/core/ui/JankStatsExtensionsKt$TrackDisposableJank$1;->(Lkotlin/jvm/functions/Function2;Landroidx/metrics/performance/PerformanceMetricsState$Holder;)V HSPLcom/google/samples/apps/nowinandroid/core/ui/JankStatsExtensionsKt$TrackDisposableJank$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLcom/google/samples/apps/nowinandroid/core/ui/JankStatsExtensionsKt$TrackJank$1;->(Lkotlin/jvm/functions/Function3;Landroidx/metrics/performance/PerformanceMetricsState$Holder;Lkotlin/coroutines/Continuation;)V @@ -6884,27 +6498,12 @@ HSPLcom/google/samples/apps/nowinandroid/core/ui/NewsFeedUiState$Loading;->()V HSPLcom/google/samples/apps/nowinandroid/core/ui/NewsFeedUiState$Success;->(Ljava/util/List;)V HSPLcom/google/samples/apps/nowinandroid/core/ui/NewsFeedUiState$Success;->equals(Ljava/lang/Object;)Z -HSPLcom/google/samples/apps/nowinandroid/feature/author/navigation/AuthorNavigationKt$authorScreen$2;->(Lkotlin/jvm/functions/Function0;)V +HSPLcom/google/samples/apps/nowinandroid/di/JankStatsModule$providesOnFrameListener$1;->()V +HSPLcom/google/samples/apps/nowinandroid/di/JankStatsModule$providesOnFrameListener$1;->()V +HSPLcom/google/samples/apps/nowinandroid/di/JankStatsModule$providesOnFrameListener$1;->onFrame(Landroidx/metrics/performance/FrameData;)V HSPLcom/google/samples/apps/nowinandroid/feature/bookmarks/navigation/ComposableSingletons$BookmarksNavigationKt$lambda-1$1;->()V HSPLcom/google/samples/apps/nowinandroid/feature/bookmarks/navigation/ComposableSingletons$BookmarksNavigationKt$lambda-1$1;->()V HSPLcom/google/samples/apps/nowinandroid/feature/bookmarks/navigation/ComposableSingletons$BookmarksNavigationKt;->()V -HSPLcom/google/samples/apps/nowinandroid/feature/foryou/AuthorsCarouselKt$AuthorItem$2$1;->(Lkotlin/jvm/functions/Function1;)V -HSPLcom/google/samples/apps/nowinandroid/feature/foryou/AuthorsCarouselKt$AuthorItem$3;->(Ljava/lang/String;Lcom/google/samples/apps/nowinandroid/core/model/data/Author;Ljava/lang/String;)V -HSPLcom/google/samples/apps/nowinandroid/feature/foryou/AuthorsCarouselKt$AuthorItem$3;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -HSPLcom/google/samples/apps/nowinandroid/feature/foryou/AuthorsCarouselKt$AuthorItem$4$1$1$1;->(J)V -HSPLcom/google/samples/apps/nowinandroid/feature/foryou/AuthorsCarouselKt$AuthorItem$4$1$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -HSPLcom/google/samples/apps/nowinandroid/feature/foryou/AuthorsCarouselKt$AuthorItem$5;->(Lcom/google/samples/apps/nowinandroid/core/model/data/Author;ZLkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;II)V -HSPLcom/google/samples/apps/nowinandroid/feature/foryou/AuthorsCarouselKt$AuthorsCarousel$1$2$1;->(Lkotlin/jvm/functions/Function2;Lcom/google/samples/apps/nowinandroid/core/domain/model/FollowableAuthor;)V -HSPLcom/google/samples/apps/nowinandroid/feature/foryou/AuthorsCarouselKt$AuthorsCarousel$1$invoke$$inlined$items$default$2;->(Ljava/util/List;)V -HSPLcom/google/samples/apps/nowinandroid/feature/foryou/AuthorsCarouselKt$AuthorsCarousel$1$invoke$$inlined$items$default$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -HSPLcom/google/samples/apps/nowinandroid/feature/foryou/AuthorsCarouselKt$AuthorsCarousel$1$invoke$$inlined$items$default$3;->(Ljava/util/List;)V -HSPLcom/google/samples/apps/nowinandroid/feature/foryou/AuthorsCarouselKt$AuthorsCarousel$1$invoke$$inlined$items$default$3;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -HSPLcom/google/samples/apps/nowinandroid/feature/foryou/AuthorsCarouselKt$AuthorsCarousel$1$invoke$$inlined$items$default$4;->(Ljava/util/List;Lkotlin/jvm/functions/Function2;)V -HSPLcom/google/samples/apps/nowinandroid/feature/foryou/AuthorsCarouselKt$AuthorsCarousel$1$invoke$$inlined$items$default$4;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -HSPLcom/google/samples/apps/nowinandroid/feature/foryou/AuthorsCarouselKt$AuthorsCarousel$1;->(Ljava/util/List;Lkotlin/jvm/functions/Function2;)V -HSPLcom/google/samples/apps/nowinandroid/feature/foryou/AuthorsCarouselKt$AuthorsCarousel$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -HSPLcom/google/samples/apps/nowinandroid/feature/foryou/AuthorsCarouselKt;->AuthorItem(Lcom/google/samples/apps/nowinandroid/core/model/data/Author;ZLkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;II)V -HSPLcom/google/samples/apps/nowinandroid/feature/foryou/AuthorsCarouselKt;->AuthorsCarousel(Ljava/util/List;Lkotlin/jvm/functions/Function2;Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;II)V HSPLcom/google/samples/apps/nowinandroid/feature/foryou/ComposableSingletons$ForYouScreenKt$lambda-1$1;->()V HSPLcom/google/samples/apps/nowinandroid/feature/foryou/ComposableSingletons$ForYouScreenKt$lambda-1$1;->()V HSPLcom/google/samples/apps/nowinandroid/feature/foryou/ComposableSingletons$ForYouScreenKt$lambda-1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; @@ -6938,9 +6537,8 @@ HSPLcom/google/samples/apps/nowinandroid/feature/foryou/ComposableSingletons$For HSPLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenKt$ForYouRoute$1;->(Lcom/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel;)V HSPLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenKt$ForYouRoute$2;->(Lcom/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel;)V HSPLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenKt$ForYouRoute$3;->(Lcom/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel;)V -HSPLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenKt$ForYouRoute$4;->(Lcom/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel;)V -HSPLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenKt$ForYouRoute$5;->(Landroidx/compose/ui/Modifier;Lcom/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel;II)V -HSPLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenKt$ForYouRoute$5;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +HSPLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenKt$ForYouRoute$4;->(Landroidx/compose/ui/Modifier;Lcom/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel;II)V +HSPLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenKt$ForYouRoute$4;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenKt$ForYouScreen$1$invokeSuspend$$inlined$doOnPreDraw$1;->(Landroid/view/View;Landroid/app/Activity;)V HSPLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenKt$ForYouScreen$1$invokeSuspend$$inlined$doOnPreDraw$1;->run()V HSPLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenKt$ForYouScreen$1;->(Landroid/view/View;Lkotlin/coroutines/Continuation;)V @@ -6954,7 +6552,7 @@ HSPLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenKt$ForYouScr HSPLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenKt$ForYouScreen$2$2;->()V HSPLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenKt$ForYouScreen$2$2;->()V HSPLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenKt$ForYouScreen$2$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -HSPLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenKt$ForYouScreen$2;->(Lcom/google/samples/apps/nowinandroid/feature/foryou/OnboardingUiState;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function0;Lcom/google/samples/apps/nowinandroid/core/ui/NewsFeedUiState;Lkotlin/jvm/functions/Function2;)V +HSPLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenKt$ForYouScreen$2;->(Lcom/google/samples/apps/nowinandroid/feature/foryou/OnboardingUiState;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function0;Lcom/google/samples/apps/nowinandroid/core/ui/NewsFeedUiState;Lkotlin/jvm/functions/Function2;)V HSPLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenKt$ForYouScreen$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenKt$ForYouScreen$3;->()V HSPLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenKt$ForYouScreen$3;->()V @@ -6980,15 +6578,15 @@ HSPLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenKt$TopicSele HSPLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenKt$onboarding$1;->()V HSPLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenKt$onboarding$1;->()V HSPLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenKt$onboarding$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -HSPLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenKt$onboarding$2;->(Landroidx/compose/ui/Modifier;Lcom/google/samples/apps/nowinandroid/feature/foryou/OnboardingUiState;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function0;)V +HSPLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenKt$onboarding$2;->(Landroidx/compose/ui/Modifier;Lcom/google/samples/apps/nowinandroid/feature/foryou/OnboardingUiState;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function0;)V HSPLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenKt$onboarding$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenKt;->ForYouRoute(Landroidx/compose/ui/Modifier;Lcom/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel;Landroidx/compose/runtime/Composer;II)V -HSPLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenKt;->ForYouScreen(ZLcom/google/samples/apps/nowinandroid/feature/foryou/OnboardingUiState;Lcom/google/samples/apps/nowinandroid/core/ui/NewsFeedUiState;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function2;Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;II)V +HSPLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenKt;->ForYouScreen(ZLcom/google/samples/apps/nowinandroid/feature/foryou/OnboardingUiState;Lcom/google/samples/apps/nowinandroid/core/ui/NewsFeedUiState;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function2;Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;II)V HSPLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenKt;->TopicIcon(Ljava/lang/String;Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;II)V HSPLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenKt;->access$SingleTopicButton(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;I)V HSPLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenKt;->access$TopicSelection(Lcom/google/samples/apps/nowinandroid/feature/foryou/OnboardingUiState$Shown;Lkotlin/jvm/functions/Function2;Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;II)V HSPLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel$onboardingUiState$1;->(Lkotlin/coroutines/Continuation;)V -HSPLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel$onboardingUiState$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +HSPLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel$onboardingUiState$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel$onboardingUiState$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HSPLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel$special$$inlined$flatMapLatest$1;->(Lkotlin/coroutines/Continuation;)V HSPLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel$special$$inlined$flatMapLatest$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; @@ -7004,25 +6602,24 @@ HSPLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel$special$ HSPLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel$special$$inlined$map$2$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel$special$$inlined$map$2;->(Lcom/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSource$special$$inlined$map$1;Lcom/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel;)V HSPLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel$special$$inlined$map$2;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -HSPLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel;->(Lcom/google/samples/apps/nowinandroid/sync/status/WorkManagerSyncStatusMonitor;Lcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstUserDataRepository;Lcom/google/samples/apps/nowinandroid/core/domain/GetSaveableNewsResourcesUseCase;Lcom/google/samples/apps/nowinandroid/core/domain/GetSortedFollowableAuthorsUseCase;Lcom/google/samples/apps/nowinandroid/core/domain/GetFollowableTopicsUseCase;)V +HSPLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel;->(Lcom/google/samples/apps/nowinandroid/sync/status/WorkManagerSyncStatusMonitor;Lcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstUserDataRepository;Lcom/google/samples/apps/nowinandroid/core/domain/GetSaveableNewsResourcesUseCase;Lcom/google/samples/apps/nowinandroid/core/domain/GetFollowableTopicsUseCase;)V HSPLcom/google/samples/apps/nowinandroid/feature/foryou/OnboardingUiState$LoadFailed;->()V HSPLcom/google/samples/apps/nowinandroid/feature/foryou/OnboardingUiState$LoadFailed;->()V HSPLcom/google/samples/apps/nowinandroid/feature/foryou/OnboardingUiState$Loading;->()V HSPLcom/google/samples/apps/nowinandroid/feature/foryou/OnboardingUiState$Loading;->()V HSPLcom/google/samples/apps/nowinandroid/feature/foryou/OnboardingUiState$NotShown;->()V HSPLcom/google/samples/apps/nowinandroid/feature/foryou/OnboardingUiState$NotShown;->()V -HSPLcom/google/samples/apps/nowinandroid/feature/foryou/OnboardingUiState$Shown;->(Ljava/util/List;Ljava/util/List;)V +HSPLcom/google/samples/apps/nowinandroid/feature/foryou/OnboardingUiState$Shown;->(Ljava/util/List;)V HSPLcom/google/samples/apps/nowinandroid/feature/foryou/OnboardingUiState$Shown;->equals(Ljava/lang/Object;)Z HSPLcom/google/samples/apps/nowinandroid/feature/foryou/navigation/ComposableSingletons$ForYouNavigationKt$lambda-1$1;->()V HSPLcom/google/samples/apps/nowinandroid/feature/foryou/navigation/ComposableSingletons$ForYouNavigationKt$lambda-1$1;->()V HSPLcom/google/samples/apps/nowinandroid/feature/foryou/navigation/ComposableSingletons$ForYouNavigationKt$lambda-1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLcom/google/samples/apps/nowinandroid/feature/foryou/navigation/ComposableSingletons$ForYouNavigationKt;->()V -HSPLcom/google/samples/apps/nowinandroid/feature/interests/navigation/InterestsNavigationKt$interestsGraph$1$1;->(Lcom/google/samples/apps/nowinandroid/navigation/NiaNavHostKt$NiaNavHost$1$2;Lcom/google/samples/apps/nowinandroid/navigation/NiaNavHostKt$NiaNavHost$1$1;)V +HSPLcom/google/samples/apps/nowinandroid/feature/interests/navigation/InterestsNavigationKt$interestsGraph$1$1;->(Lcom/google/samples/apps/nowinandroid/navigation/NiaNavHostKt$NiaNavHost$1$1;)V HSPLcom/google/samples/apps/nowinandroid/feature/topic/navigation/TopicNavigationKt$topicScreen$2;->(Lkotlin/jvm/functions/Function0;)V HSPLcom/google/samples/apps/nowinandroid/navigation/NiaNavHostKt$NiaNavHost$1$1;->(Landroidx/navigation/NavHostController;)V -HSPLcom/google/samples/apps/nowinandroid/navigation/NiaNavHostKt$NiaNavHost$1$2;->(Landroidx/navigation/NavHostController;)V -HSPLcom/google/samples/apps/nowinandroid/navigation/NiaNavHostKt$NiaNavHost$1$3;->(Lkotlin/jvm/functions/Function0;)V -HSPLcom/google/samples/apps/nowinandroid/navigation/NiaNavHostKt$NiaNavHost$1$3;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLcom/google/samples/apps/nowinandroid/navigation/NiaNavHostKt$NiaNavHost$1$2;->(Lkotlin/jvm/functions/Function0;)V +HSPLcom/google/samples/apps/nowinandroid/navigation/NiaNavHostKt$NiaNavHost$1$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLcom/google/samples/apps/nowinandroid/navigation/NiaNavHostKt$NiaNavHost$1;->(Landroidx/navigation/NavHostController;Lkotlin/jvm/functions/Function0;)V HSPLcom/google/samples/apps/nowinandroid/navigation/NiaNavHostKt$NiaNavHost$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLcom/google/samples/apps/nowinandroid/navigation/NiaNavHostKt;->NiaNavHost(Landroidx/navigation/NavHostController;Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;Ljava/lang/String;Landroidx/compose/runtime/Composer;II)V @@ -7050,13 +6647,10 @@ HSPLcom/google/samples/apps/nowinandroid/sync/workers/SyncWorker$doWork$2$1$sync HSPLcom/google/samples/apps/nowinandroid/sync/workers/SyncWorker$doWork$2$1$syncedSuccessfully$2;->(Lcom/google/samples/apps/nowinandroid/sync/workers/SyncWorker;Lkotlin/coroutines/Continuation;)V HSPLcom/google/samples/apps/nowinandroid/sync/workers/SyncWorker$doWork$2$1$syncedSuccessfully$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLcom/google/samples/apps/nowinandroid/sync/workers/SyncWorker$doWork$2$1$syncedSuccessfully$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; -HSPLcom/google/samples/apps/nowinandroid/sync/workers/SyncWorker$doWork$2$1$syncedSuccessfully$3;->(Lcom/google/samples/apps/nowinandroid/sync/workers/SyncWorker;Lkotlin/coroutines/Continuation;)V -HSPLcom/google/samples/apps/nowinandroid/sync/workers/SyncWorker$doWork$2$1$syncedSuccessfully$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; -HSPLcom/google/samples/apps/nowinandroid/sync/workers/SyncWorker$doWork$2$1$syncedSuccessfully$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HSPLcom/google/samples/apps/nowinandroid/sync/workers/SyncWorker$doWork$2;->(Lcom/google/samples/apps/nowinandroid/sync/workers/SyncWorker;Lkotlin/coroutines/Continuation;)V HSPLcom/google/samples/apps/nowinandroid/sync/workers/SyncWorker$doWork$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLcom/google/samples/apps/nowinandroid/sync/workers/SyncWorker$doWork$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; -HSPLcom/google/samples/apps/nowinandroid/sync/workers/SyncWorker;->(Landroid/content/Context;Landroidx/work/WorkerParameters;Lcom/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSource;Lcom/google/samples/apps/nowinandroid/core/data/repository/TopicsRepository;Lcom/google/samples/apps/nowinandroid/core/data/repository/NewsRepository;Lcom/google/samples/apps/nowinandroid/core/data/repository/AuthorsRepository;Lkotlinx/coroutines/CoroutineDispatcher;)V +HSPLcom/google/samples/apps/nowinandroid/sync/workers/SyncWorker;->(Landroid/content/Context;Landroidx/work/WorkerParameters;Lcom/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSource;Lcom/google/samples/apps/nowinandroid/core/data/repository/TopicsRepository;Lcom/google/samples/apps/nowinandroid/core/data/repository/NewsRepository;Lkotlinx/coroutines/CoroutineDispatcher;)V HSPLcom/google/samples/apps/nowinandroid/sync/workers/SyncWorker;->doWork(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLcom/google/samples/apps/nowinandroid/ui/ComposableSingletons$NiaAppKt$lambda-1$1;->()V HSPLcom/google/samples/apps/nowinandroid/ui/ComposableSingletons$NiaAppKt$lambda-1$1;->()V @@ -7090,11 +6684,11 @@ HSPLcom/google/samples/apps/nowinandroid/ui/NiaAppKt$NiaBottomBar$1$1$2;-> HSPLcom/google/samples/apps/nowinandroid/ui/NiaAppKt$NiaBottomBar$1$1$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLcom/google/samples/apps/nowinandroid/ui/NiaAppKt$NiaBottomBar$1$1$3;->(Lcom/google/samples/apps/nowinandroid/navigation/TopLevelDestination;)V HSPLcom/google/samples/apps/nowinandroid/ui/NiaAppKt$NiaBottomBar$1$1$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -HSPLcom/google/samples/apps/nowinandroid/ui/NiaAppKt$NiaBottomBar$1;->(ILandroidx/navigation/NavDestination;Ljava/util/List;Lkotlin/jvm/functions/Function1;)V +HSPLcom/google/samples/apps/nowinandroid/ui/NiaAppKt$NiaBottomBar$1;->(Ljava/util/List;Landroidx/navigation/NavDestination;Lkotlin/jvm/functions/Function1;I)V HSPLcom/google/samples/apps/nowinandroid/ui/NiaAppKt$NiaBottomBar$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLcom/google/samples/apps/nowinandroid/ui/NiaAppKt$WhenMappings;->()V HSPLcom/google/samples/apps/nowinandroid/ui/NiaAppKt;->NiaApp(Landroidx/compose/material3/windowsizeclass/WindowSizeClass;Lcom/google/samples/apps/nowinandroid/core/data/util/NetworkMonitor;Lcom/google/samples/apps/nowinandroid/ui/NiaAppState;Landroidx/compose/runtime/Composer;II)V -HSPLcom/google/samples/apps/nowinandroid/ui/NiaAppKt;->access$NiaBottomBar(Ljava/util/List;Lkotlin/jvm/functions/Function1;Landroidx/navigation/NavDestination;Landroidx/compose/runtime/Composer;I)V +HSPLcom/google/samples/apps/nowinandroid/ui/NiaAppKt;->access$NiaBottomBar(Ljava/util/List;Lkotlin/jvm/functions/Function1;Landroidx/navigation/NavDestination;Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;II)V HSPLcom/google/samples/apps/nowinandroid/ui/NiaAppKt;->access$isTopLevelDestinationInHierarchy(Landroidx/navigation/NavDestination;Lcom/google/samples/apps/nowinandroid/navigation/TopLevelDestination;)Z HSPLcom/google/samples/apps/nowinandroid/ui/NiaAppState$special$$inlined$map$1$2$1;->(Lcom/google/samples/apps/nowinandroid/ui/NiaAppState$special$$inlined$map$1$2;Lkotlin/coroutines/Continuation;)V HSPLcom/google/samples/apps/nowinandroid/ui/NiaAppState$special$$inlined$map$1$2;->(Lkotlinx/coroutines/flow/FlowCollector;)V @@ -7167,6 +6761,7 @@ HSPLj$/time/LocalDateTime;->()V HSPLj$/time/LocalDateTime;->(Lj$/time/h;Lj$/time/l;)V HSPLj$/time/LocalDateTime;->H(Lj$/time/ZoneId;)Lj$/time/chrono/ChronoZonedDateTime; HSPLj$/time/LocalDateTime;->atZone(Lj$/time/ZoneId;)Lj$/time/ZonedDateTime; +HSPLj$/time/LocalDateTime;->b0(Lj$/time/h;Lj$/time/l;)Lj$/time/LocalDateTime; HSPLj$/time/LocalDateTime;->h0()Lj$/time/h; HSPLj$/time/LocalDateTime;->j(Lj$/time/temporal/q;)Z HSPLj$/time/LocalDateTime;->l()Lj$/time/l; @@ -7174,7 +6769,9 @@ HSPLj$/time/LocalDateTime;->n()Lj$/time/chrono/b; HSPLj$/time/OffsetDateTime;->()V HSPLj$/time/OffsetDateTime;->(Lj$/time/LocalDateTime;Lj$/time/ZoneOffset;)V HSPLj$/time/OffsetDateTime;->B(Lj$/time/LocalDateTime;Lj$/time/ZoneOffset;)Lj$/time/OffsetDateTime; +HSPLj$/time/OffsetDateTime;->parse(Ljava/lang/CharSequence;)Lj$/time/OffsetDateTime; HSPLj$/time/OffsetDateTime;->toInstant()Lj$/time/Instant; +HSPLj$/time/OffsetDateTime;->w(Lj$/time/temporal/TemporalAccessor;)Lj$/time/OffsetDateTime; HSPLj$/time/ZoneId;->()V HSPLj$/time/ZoneId;->()V HSPLj$/time/ZoneOffset;->()V @@ -7187,9 +6784,11 @@ HSPLj$/time/ZonedDateTime;->K(Lj$/time/LocalDateTime;Lj$/time/ZoneId;Lj$/time/Zo HSPLj$/time/ZonedDateTime;->l()Lj$/time/l; HSPLj$/time/ZonedDateTime;->n()Lj$/time/chrono/b; HSPLj$/time/ZonedDateTime;->o()Lj$/time/ZoneOffset; +HSPLj$/time/chrono/ChronoLocalDateTime;->v(Lj$/time/ZoneOffset;)J HSPLj$/time/chrono/ChronoZonedDateTime;->Y()J HSPLj$/time/chrono/a;->()V HSPLj$/time/chrono/a;->()V +HSPLj$/time/chrono/a;->D(Ljava/util/HashMap;Lj$/time/format/E;)Lj$/time/chrono/b; HSPLj$/time/chrono/a;->equals(Ljava/lang/Object;)Z HSPLj$/time/chrono/b;->j(Lj$/time/temporal/q;)Z HSPLj$/time/chrono/r;->()V @@ -7212,7 +6811,9 @@ HSPLj$/time/format/C;->()V HSPLj$/time/format/C;->a(C)I HSPLj$/time/format/D;->()V HSPLj$/time/format/D;->A(Lj$/time/chrono/b;)V +HSPLj$/time/format/D;->p(Lj$/time/temporal/TemporalAccessor;)V HSPLj$/time/format/D;->r()V +HSPLj$/time/format/D;->u(JJJJ)V HSPLj$/time/format/D;->z(Lj$/time/l;Lj$/time/s;)V HSPLj$/time/format/DateTimeFormatter;->()V HSPLj$/time/format/DateTimeFormatter;->(Lj$/time/format/f;Ljava/util/Locale;Lj$/time/format/C;Lj$/time/format/E;Ljava/util/Set;Lj$/time/chrono/k;Lj$/time/ZoneId;)V @@ -7233,6 +6834,7 @@ HSPLj$/time/format/e;->(C)V HSPLj$/time/format/e;->B(Lj$/time/format/x;Ljava/lang/CharSequence;I)I HSPLj$/time/format/f;->(Ljava/util/ArrayList;Z)V HSPLj$/time/format/f;->([Lj$/time/format/g;Z)V +HSPLj$/time/format/f;->B(Lj$/time/format/x;Ljava/lang/CharSequence;I)I HSPLj$/time/format/f;->a()Lj$/time/format/f; HSPLj$/time/format/h;->(Lj$/time/temporal/a;IIZ)V HSPLj$/time/format/h;->(Lj$/time/temporal/q;IIZI)V @@ -7247,6 +6849,7 @@ HSPLj$/time/format/k;->e()Lj$/time/format/k; HSPLj$/time/format/k;->f(I)Lj$/time/format/k; HSPLj$/time/format/l;->()V HSPLj$/time/format/l;->(Ljava/lang/String;Ljava/lang/String;)V +HSPLj$/time/format/l;->B(Lj$/time/format/x;Ljava/lang/CharSequence;I)I HSPLj$/time/format/r;->()V HSPLj$/time/format/r;->(Ljava/lang/String;I)V HSPLj$/time/format/r;->B(Lj$/time/format/x;Ljava/lang/CharSequence;I)I @@ -7276,14 +6879,17 @@ HSPLj$/time/format/w;->s()V HSPLj$/time/format/w;->t()V HSPLj$/time/format/w;->v(Lj$/time/format/E;Lj$/time/chrono/r;)Lj$/time/format/DateTimeFormatter; HSPLj$/time/format/w;->w(Ljava/util/Locale;Lj$/time/format/E;Lj$/time/chrono/r;)Lj$/time/format/DateTimeFormatter; +HSPLj$/time/format/x;->(Lj$/time/format/DateTimeFormatter;)V HSPLj$/time/format/x;->e()Lj$/time/format/D; HSPLj$/time/format/x;->f(Z)V HSPLj$/time/format/x;->g()Lj$/time/format/C; HSPLj$/time/format/x;->h()Lj$/time/chrono/k; HSPLj$/time/format/x;->l()Z HSPLj$/time/format/x;->m(Z)V +HSPLj$/time/format/x;->o(Lj$/time/temporal/q;JII)I HSPLj$/time/format/x;->q(Z)V HSPLj$/time/format/x;->s(Ljava/lang/CharSequence;ILjava/lang/CharSequence;II)Z +HSPLj$/time/format/x;->t(Lj$/time/format/E;Ljava/util/Set;)Lj$/time/temporal/TemporalAccessor; HSPLj$/time/h;->()V HSPLj$/time/h;->(III)V HSPLj$/time/h;->B(III)Lj$/time/h; @@ -7291,6 +6897,7 @@ HSPLj$/time/h;->K(Lj$/time/temporal/TemporalAccessor;)Lj$/time/h; HSPLj$/time/h;->M()J HSPLj$/time/h;->N(Lj$/time/l;)Lj$/time/chrono/ChronoLocalDateTime; HSPLj$/time/h;->d(Lj$/time/temporal/t;)Ljava/lang/Object; +HSPLj$/time/h;->f0(III)Lj$/time/h; HSPLj$/time/h;->g()Lj$/time/chrono/k; HSPLj$/time/h;->j(Lj$/time/temporal/q;)Z HSPLj$/time/h;->y()Z @@ -7300,6 +6907,7 @@ HSPLj$/time/l;->()V HSPLj$/time/l;->(IIII)V HSPLj$/time/l;->B(IIII)Lj$/time/l; HSPLj$/time/l;->W()I +HSPLj$/time/l;->b0(IIII)Lj$/time/l; HSPLj$/time/l;->j(Lj$/time/temporal/q;)Z HSPLj$/time/l;->l0()I HSPLj$/time/s;->()V @@ -7372,8 +6980,10 @@ HSPLkotlin/ResultKt;->createFailure(Ljava/lang/Throwable;)Lkotlin/Result$Failure HSPLkotlin/ResultKt;->throwOnFailure(Ljava/lang/Object;)V HSPLkotlin/SafePublicationLazyImpl;->()V HSPLkotlin/SafePublicationLazyImpl;->(Lkotlin/jvm/functions/Function0;)V +HSPLkotlin/SafePublicationLazyImpl;->getValue()Ljava/lang/Object; HSPLkotlin/SynchronizedLazyImpl;->(Lkotlin/jvm/functions/Function0;)V HSPLkotlin/SynchronizedLazyImpl;->getValue()Ljava/lang/Object; +HSPLkotlin/TuplesKt;->toCanonicalHost(Ljava/lang/String;)Ljava/lang/String; HSPLkotlin/UNINITIALIZED_VALUE;->()V HSPLkotlin/UNINITIALIZED_VALUE;->()V HSPLkotlin/Unit;->()V @@ -7444,6 +7054,7 @@ HSPLkotlin/collections/CollectionsKt__IteratorsJVMKt;->collectionSizeOrDefault(L HSPLkotlin/collections/CollectionsKt__IteratorsJVMKt;->flatten(Ljava/util/Collection;)Ljava/util/ArrayList; HSPLkotlin/collections/CollectionsKt__MutableCollectionsJVMKt;->sort(Ljava/util/List;)V HSPLkotlin/collections/CollectionsKt__ReversedViewsKt;->addAll(Ljava/lang/Iterable;Ljava/util/Collection;)V +HSPLkotlin/collections/CollectionsKt__ReversedViewsKt;->removeLast(Ljava/util/ArrayList;)V HSPLkotlin/collections/CollectionsKt___CollectionsKt$asSequence$$inlined$Sequence$1;->(Ljava/lang/Iterable;)V HSPLkotlin/collections/CollectionsKt___CollectionsKt$asSequence$$inlined$Sequence$1;->iterator()Ljava/util/Iterator; HSPLkotlin/collections/CollectionsKt___CollectionsKt;->asSequence(Ljava/lang/Iterable;)Lkotlin/collections/CollectionsKt___CollectionsKt$asSequence$$inlined$Sequence$1; @@ -7477,7 +7088,6 @@ HSPLkotlin/collections/EmptyMap;->()V HSPLkotlin/collections/EmptyMap;->()V HSPLkotlin/collections/EmptyMap;->containsKey(Ljava/lang/Object;)Z HSPLkotlin/collections/EmptyMap;->entrySet()Ljava/util/Set; -HSPLkotlin/collections/EmptyMap;->equals(Ljava/lang/Object;)Z HSPLkotlin/collections/EmptyMap;->get(Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlin/collections/EmptyMap;->hashCode()I HSPLkotlin/collections/EmptyMap;->isEmpty()Z @@ -7488,7 +7098,6 @@ HSPLkotlin/collections/EmptySet;->()V HSPLkotlin/collections/EmptySet;->contains(Ljava/lang/Object;)Z HSPLkotlin/collections/EmptySet;->equals(Ljava/lang/Object;)Z HSPLkotlin/collections/EmptySet;->hashCode()I -HSPLkotlin/collections/EmptySet;->isEmpty()Z HSPLkotlin/collections/EmptySet;->iterator()Ljava/util/Iterator; HSPLkotlin/collections/EmptySet;->size()I HSPLkotlin/collections/IndexedValue;->(ILjava/lang/Object;)V @@ -7502,10 +7111,6 @@ HSPLkotlin/collections/MapsKt___MapsJvmKt;->toMap(Ljava/util/ArrayList;Ljava/uti HSPLkotlin/collections/MapsKt___MapsJvmKt;->toMap(Ljava/util/Map;)Ljava/util/Map; HSPLkotlin/collections/MapsKt___MapsJvmKt;->toMutableMap(Ljava/util/Map;)Ljava/util/LinkedHashMap; HSPLkotlin/collections/SetsKt;->plus(Ljava/util/Set;Ljava/lang/Object;)Ljava/util/LinkedHashSet; -HSPLkotlin/collections/SetsKt__SetsKt;->build(Lkotlin/collections/builders/SetBuilder;)Lkotlin/collections/builders/SetBuilder; -HSPLkotlin/collections/SetsKt__SetsKt;->get(Landroid/view/View;)Landroidx/lifecycle/LifecycleOwner; -HSPLkotlin/collections/SetsKt__SetsKt;->setOf(Ljava/lang/Object;)Ljava/util/Set; -HSPLkotlin/collections/SetsKt__SetsKt;->setOf([Ljava/lang/Object;)Ljava/util/Set; HSPLkotlin/collections/builders/ListBuilder;->()V HSPLkotlin/collections/builders/ListBuilder;->(I)V HSPLkotlin/collections/builders/ListBuilder;->([Ljava/lang/Object;IIZLkotlin/collections/builders/ListBuilder;Lkotlin/collections/builders/ListBuilder;)V @@ -7534,7 +7139,6 @@ HSPLkotlin/collections/builders/SetBuilder;->contains(Ljava/lang/Object;)Z HSPLkotlin/collections/builders/SetBuilder;->getSize()I HSPLkotlin/collections/builders/SetBuilder;->isEmpty()Z HSPLkotlin/collections/builders/SetBuilder;->iterator()Ljava/util/Iterator; -HSPLkotlin/comparisons/ComparisonsKt___ComparisonsJvmKt;->compareValues(Ljava/lang/Comparable;Ljava/lang/Comparable;)I HSPLkotlin/comparisons/NaturalOrderComparator;->()V HSPLkotlin/comparisons/NaturalOrderComparator;->()V HSPLkotlin/comparisons/NaturalOrderComparator;->compare(Ljava/lang/Object;Ljava/lang/Object;)I @@ -7552,7 +7156,6 @@ HSPLkotlin/coroutines/CombinedContext;->plus(Lkotlin/coroutines/CoroutineContext HSPLkotlin/coroutines/ContinuationInterceptor$Key;->()V HSPLkotlin/coroutines/ContinuationInterceptor$Key;->()V HSPLkotlin/coroutines/CoroutineContext$DefaultImpls;->plus(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext; -HSPLkotlin/coroutines/CoroutineContext$Element$DefaultImpls;->get(Lkotlin/coroutines/CoroutineContext$Element;Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; HSPLkotlin/coroutines/CoroutineContext$Element$DefaultImpls;->minusKey(Lkotlin/coroutines/CoroutineContext$Element;Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext; HSPLkotlin/coroutines/CoroutineContext$plus$1;->()V HSPLkotlin/coroutines/CoroutineContext$plus$1;->()V @@ -7567,6 +7170,8 @@ HSPLkotlin/coroutines/SafeContinuation;->(Lkotlin/coroutines/intrinsics/Co HSPLkotlin/coroutines/SafeContinuation;->resumeWith(Ljava/lang/Object;)V HSPLkotlin/coroutines/intrinsics/CoroutineSingletons;->()V HSPLkotlin/coroutines/intrinsics/CoroutineSingletons;->(ILjava/lang/String;)V +HSPLkotlin/coroutines/intrinsics/IntrinsicsKt__IntrinsicsKt;->createCoroutineUnintercepted(Ljava/lang/Object;Lkotlin/coroutines/Continuation;Lkotlin/jvm/functions/Function2;)Lkotlin/coroutines/Continuation; +HSPLkotlin/coroutines/intrinsics/IntrinsicsKt__IntrinsicsKt;->intercepted(Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLkotlin/coroutines/jvm/internal/BaseContinuationImpl;->(Lkotlin/coroutines/Continuation;)V HSPLkotlin/coroutines/jvm/internal/BaseContinuationImpl;->releaseIntercepted()V HSPLkotlin/coroutines/jvm/internal/BaseContinuationImpl;->resumeWith(Ljava/lang/Object;)V @@ -7583,6 +7188,7 @@ HSPLkotlin/coroutines/jvm/internal/SuspendLambda;->(ILkotlin/coroutines/Co HSPLkotlin/coroutines/jvm/internal/SuspendLambda;->getArity()I HSPLkotlin/internal/PlatformImplementations;->()V HSPLkotlin/internal/PlatformImplementationsKt;->()V +HSPLkotlin/internal/ProgressionUtilKt;->getOrNull(Landroidx/compose/ui/semantics/SemanticsConfiguration;Landroidx/compose/ui/semantics/SemanticsPropertyKey;)Ljava/lang/Object; HSPLkotlin/internal/ProgressionUtilKt;->getProgressionLastElement(III)I HSPLkotlin/internal/jdk7/JDK7PlatformImplementations;->()V HSPLkotlin/internal/jdk8/JDK8PlatformImplementations$ReflectSdkVersion;->()V @@ -7636,8 +7242,6 @@ HSPLkotlin/jvm/internal/Ref$IntRef;->()V HSPLkotlin/jvm/internal/Ref$ObjectRef;->()V HSPLkotlin/jvm/internal/Reflection;->()V HSPLkotlin/jvm/internal/Reflection;->getOrCreateKotlinClass(Ljava/lang/Class;)Lkotlin/jvm/internal/ClassReference; -HSPLkotlin/jvm/internal/Reflection;->typeOf(Ljava/lang/Class;)Lkotlin/jvm/internal/TypeReference; -HSPLkotlin/jvm/internal/Reflection;->typeOf(Ljava/lang/Class;Lkotlin/reflect/KTypeProjection;)Lkotlin/jvm/internal/TypeReference; HSPLkotlin/jvm/internal/ReflectionFactory;->()V HSPLkotlin/jvm/internal/SpreadBuilder;->()V HSPLkotlin/jvm/internal/SpreadBuilder;->addSpread(Ljava/lang/Object;)V @@ -7719,6 +7323,7 @@ HSPLkotlin/text/CharsKt__CharKt;->equals(CCZ)Z HSPLkotlin/text/CharsKt__CharKt;->isWhitespace(C)Z HSPLkotlin/text/Charsets;->()V HSPLkotlin/text/Regex;->(Ljava/lang/String;)V +HSPLkotlin/text/StringsKt__StringsJVMKt;->concatToString([CII)Ljava/lang/String; HSPLkotlin/text/StringsKt__StringsJVMKt;->endsWith(Ljava/lang/String;Ljava/lang/String;Z)Z HSPLkotlin/text/StringsKt__StringsJVMKt;->equals(Ljava/lang/String;Ljava/lang/String;)Z HSPLkotlin/text/StringsKt__StringsJVMKt;->isBlank(Ljava/lang/CharSequence;)Z @@ -7735,15 +7340,15 @@ HSPLkotlin/text/StringsKt__StringsKt;->indexOf$StringsKt__StringsKt(Ljava/lang/C HSPLkotlin/text/StringsKt__StringsKt;->indexOf$default(Ljava/lang/CharSequence;CIZI)I HSPLkotlin/text/StringsKt__StringsKt;->indexOf$default(Ljava/lang/CharSequence;Ljava/lang/String;IZI)I HSPLkotlin/text/StringsKt__StringsKt;->indexOf(ILjava/lang/CharSequence;Ljava/lang/String;Z)I +HSPLkotlin/text/StringsKt__StringsKt;->indexOfAny(ILjava/lang/CharSequence;Z[C)I HSPLkotlin/text/StringsKt__StringsKt;->lastIndexOf$default(Ljava/lang/CharSequence;CII)I HSPLkotlin/text/StringsKt__StringsKt;->removePrefix(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; HSPLkotlin/text/StringsKt__StringsKt;->substringAfterLast(Ljava/lang/String;CLjava/lang/String;)Ljava/lang/String; -HSPLkotlin/text/StringsKt__StringsKt;->substringBefore$default(Ljava/lang/String;C)Ljava/lang/String; HSPLkotlin/text/StringsKt__StringsKt;->trim(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; -HSPLkotlin/text/UStringsKt;->getViewModelScope(Landroidx/lifecycle/ViewModel;)Lkotlinx/coroutines/CoroutineScope; HSPLkotlin/time/Duration;->()V HSPLkotlin/time/DurationJvmKt;->()V HSPLkotlin/time/DurationKt;->durationOfMillis(J)J +HSPLkotlin/time/DurationUnitKt__DurationUnitKt;->checkScrollableContainerConstraints-K40F9xA(JLandroidx/compose/foundation/gestures/Orientation;)V HSPLkotlinx/coroutines/AbstractCoroutine;->(Lkotlin/coroutines/CoroutineContext;Z)V HSPLkotlinx/coroutines/AbstractCoroutine;->afterResume(Ljava/lang/Object;)V HSPLkotlinx/coroutines/AbstractCoroutine;->cancellationExceptionMessage()Ljava/lang/String; @@ -7794,7 +7399,6 @@ HSPLkotlinx/coroutines/CancellableContinuationImpl;->resumeImpl(Ljava/lang/Objec HSPLkotlinx/coroutines/CancellableContinuationImpl;->resumeWith(Ljava/lang/Object;)V HSPLkotlinx/coroutines/CancellableContinuationImpl;->resumedState(Lkotlinx/coroutines/NotCompleted;Ljava/lang/Object;ILkotlin/jvm/functions/Function1;Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlinx/coroutines/CancellableContinuationImpl;->takeState$kotlinx_coroutines_core()Ljava/lang/Object; -HSPLkotlinx/coroutines/CancellableContinuationImpl;->tryResume(Ljava/lang/Object;Ljava/lang/Object;)Lkotlinx/coroutines/internal/Symbol; HSPLkotlinx/coroutines/CancellableContinuationImpl;->tryResume(Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Lkotlinx/coroutines/internal/Symbol; HSPLkotlinx/coroutines/CancellableContinuationImpl;->tryResumeImpl(Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Lkotlinx/coroutines/internal/Symbol; HSPLkotlinx/coroutines/CancellableContinuationImplKt;->()V @@ -7893,14 +7497,8 @@ HSPLkotlinx/coroutines/ExecutorCoroutineDispatcherImpl;->equals(Ljava/lang/Objec HSPLkotlinx/coroutines/GlobalScope;->()V HSPLkotlinx/coroutines/GlobalScope;->()V HSPLkotlinx/coroutines/GlobalScope;->getCoroutineContext()Lkotlin/coroutines/CoroutineContext; -HSPLkotlinx/coroutines/InterruptibleKt$runInterruptible$2;->(Lkotlin/jvm/functions/Function0;Lkotlin/coroutines/Continuation;)V -HSPLkotlinx/coroutines/InterruptibleKt$runInterruptible$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; -HSPLkotlinx/coroutines/InterruptibleKt$runInterruptible$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -HSPLkotlinx/coroutines/InterruptibleKt$runInterruptible$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlinx/coroutines/InvokeOnCancel;->(Lkotlin/jvm/functions/Function1;)V HSPLkotlinx/coroutines/InvokeOnCancel;->invoke(Ljava/lang/Throwable;)V -HSPLkotlinx/coroutines/InvokeOnCancelling;->()V -HSPLkotlinx/coroutines/InvokeOnCancelling;->(Lkotlin/jvm/functions/Function1;)V HSPLkotlinx/coroutines/InvokeOnCompletion;->(Lkotlin/jvm/functions/Function1;)V HSPLkotlinx/coroutines/Job$DefaultImpls;->invokeOnCompletion$default(Lkotlinx/coroutines/Job;ZLkotlinx/coroutines/JobNode;I)Lkotlinx/coroutines/DisposableHandle; HSPLkotlinx/coroutines/Job$Key;->()V @@ -7912,9 +7510,22 @@ HSPLkotlinx/coroutines/JobCancellingNode;->()V HSPLkotlinx/coroutines/JobImpl;->(Lkotlinx/coroutines/Job;)V HSPLkotlinx/coroutines/JobImpl;->getHandlesException$kotlinx_coroutines_core()Z HSPLkotlinx/coroutines/JobImpl;->getOnCancelComplete$kotlinx_coroutines_core()Z +HSPLkotlinx/coroutines/JobKt;->()V +HSPLkotlinx/coroutines/JobKt;->()V +HSPLkotlinx/coroutines/JobKt;->binarySearch(II[I)I +HSPLkotlinx/coroutines/JobKt;->createAndroidTypefaceApi28-RetOiIg(Ljava/lang/String;Landroidx/compose/ui/text/font/FontWeight;I)Landroid/graphics/Typeface; +HSPLkotlinx/coroutines/JobKt;->createDefault-FO1MlWM(Landroidx/compose/ui/text/font/FontWeight;I)Landroid/graphics/Typeface; +HSPLkotlinx/coroutines/JobKt;->createNamed-RetOiIg(Landroidx/compose/ui/text/font/GenericFontFamily;Landroidx/compose/ui/text/font/FontWeight;I)Landroid/graphics/Typeface; HSPLkotlinx/coroutines/JobKt;->ensureActive(Lkotlin/coroutines/CoroutineContext;)V HSPLkotlinx/coroutines/JobKt;->getJob(Lkotlin/coroutines/CoroutineContext;)Lkotlinx/coroutines/Job; HSPLkotlinx/coroutines/JobKt;->isActive(Lkotlin/coroutines/CoroutineContext;)Z +HSPLkotlinx/coroutines/JobKt__FutureKt;->collectAsState(Lkotlinx/coroutines/flow/Flow;Ljava/lang/Object;Lkotlin/coroutines/CoroutineContext;Landroidx/compose/runtime/Composer;II)Landroidx/compose/runtime/MutableState; +HSPLkotlinx/coroutines/JobKt__FutureKt;->derivedStateOf(Lkotlin/jvm/functions/Function0;)Landroidx/compose/runtime/DerivedSnapshotState; +HSPLkotlinx/coroutines/JobKt__FutureKt;->mutableStateOf$default(Ljava/lang/Object;)Landroidx/compose/runtime/ParcelableSnapshotMutableState; +HSPLkotlinx/coroutines/JobKt__FutureKt;->mutableStateOf(Ljava/lang/Object;Landroidx/compose/runtime/SnapshotMutationPolicy;)Landroidx/compose/runtime/ParcelableSnapshotMutableState; +HSPLkotlinx/coroutines/JobKt__FutureKt;->observeDerivedStateRecalculations(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;)V +HSPLkotlinx/coroutines/JobKt__FutureKt;->rememberUpdatedState(Ljava/lang/Object;Landroidx/compose/runtime/Composer;I)Landroidx/compose/runtime/MutableState; +HSPLkotlinx/coroutines/JobKt__FutureKt;->snapshotFlow(Lkotlin/jvm/functions/Function0;)Lkotlinx/coroutines/flow/SafeFlow; HSPLkotlinx/coroutines/JobNode;->()V HSPLkotlinx/coroutines/JobNode;->dispose()V HSPLkotlinx/coroutines/JobNode;->getJob()Lkotlinx/coroutines/JobSupport; @@ -7981,6 +7592,7 @@ HSPLkotlinx/coroutines/JobSupport;->tryMakeCompleting(Ljava/lang/Object;Ljava/la HSPLkotlinx/coroutines/JobSupport;->tryWaitForChild(Lkotlinx/coroutines/JobSupport$Finishing;Lkotlinx/coroutines/ChildHandleNode;Ljava/lang/Object;)Z HSPLkotlinx/coroutines/JobSupportKt;->()V HSPLkotlinx/coroutines/JobSupportKt;->unboxState(Ljava/lang/Object;)Ljava/lang/Object; +HSPLkotlinx/coroutines/JobSupportKt;->valueIterator(Landroidx/collection/SparseArrayCompat;)Landroidx/collection/SparseArrayKt$valueIterator$1; HSPLkotlinx/coroutines/MainCoroutineDispatcher;->()V HSPLkotlinx/coroutines/NodeList;->()V HSPLkotlinx/coroutines/NodeList;->getList()Lkotlinx/coroutines/NodeList; @@ -7988,28 +7600,15 @@ HSPLkotlinx/coroutines/NodeList;->isActive()Z HSPLkotlinx/coroutines/NonDisposableHandle;->()V HSPLkotlinx/coroutines/NonDisposableHandle;->()V HSPLkotlinx/coroutines/NonDisposableHandle;->dispose()V -HSPLkotlinx/coroutines/RemoveOnCancel;->(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;)V HSPLkotlinx/coroutines/ResumeAwaitOnCompletion;->(Lkotlinx/coroutines/JobSupport$AwaitContinuation;)V HSPLkotlinx/coroutines/ResumeAwaitOnCompletion;->invoke(Ljava/lang/Throwable;)V HSPLkotlinx/coroutines/ResumeOnCompletion;->(Lkotlinx/coroutines/CancellableContinuationImpl;)V HSPLkotlinx/coroutines/ResumeOnCompletion;->invoke(Ljava/lang/Throwable;)V HSPLkotlinx/coroutines/StandaloneCoroutine;->(Lkotlin/coroutines/CoroutineContext;Z)V HSPLkotlinx/coroutines/SupervisorJobImpl;->(Lkotlinx/coroutines/Job;)V -HSPLkotlinx/coroutines/SupervisorKt;->Constraints$default(III)J -HSPLkotlinx/coroutines/SupervisorKt;->Constraints(IIII)J HSPLkotlinx/coroutines/SupervisorKt;->SupervisorJob$default()Lkotlinx/coroutines/SupervisorJobImpl; -HSPLkotlinx/coroutines/SupervisorKt;->constrain-4WqzIAM(JJ)J -HSPLkotlinx/coroutines/SupervisorKt;->constrain-N9IONVI(JJ)J -HSPLkotlinx/coroutines/SupervisorKt;->constrainHeight-K40F9xA(JI)I -HSPLkotlinx/coroutines/SupervisorKt;->constrainWidth-K40F9xA(JI)I -HSPLkotlinx/coroutines/SupervisorKt;->getSafeDrawing(Landroidx/compose/runtime/Composer;)Landroidx/compose/foundation/layout/UnionInsets; -HSPLkotlinx/coroutines/SupervisorKt;->offset-NN6Ew-U(IIJ)J -HSPLkotlinx/coroutines/SupervisorKt;->toInsetsValues(Landroidx/core/graphics/Insets;)Landroidx/compose/foundation/layout/InsetsValues; HSPLkotlinx/coroutines/ThreadLocalEventLoop;->()V HSPLkotlinx/coroutines/ThreadLocalEventLoop;->getEventLoop$kotlinx_coroutines_core()Lkotlinx/coroutines/EventLoop; -HSPLkotlinx/coroutines/ThreadState;->()V -HSPLkotlinx/coroutines/ThreadState;->(Lkotlinx/coroutines/Job;)V -HSPLkotlinx/coroutines/ThreadState;->setup()V HSPLkotlinx/coroutines/Unconfined;->()V HSPLkotlinx/coroutines/Unconfined;->()V HSPLkotlinx/coroutines/UndispatchedCoroutine;->(Lkotlin/coroutines/Continuation;Lkotlin/coroutines/CoroutineContext;)V @@ -8068,7 +7667,6 @@ HSPLkotlinx/coroutines/channels/AbstractSendChannel$SendBuffered;->getPollResult HSPLkotlinx/coroutines/channels/AbstractSendChannel$SendBuffered;->tryResumeSend()Lkotlinx/coroutines/internal/Symbol; HSPLkotlinx/coroutines/channels/AbstractSendChannel;->()V HSPLkotlinx/coroutines/channels/AbstractSendChannel;->(Lkotlin/jvm/functions/Function1;)V -HSPLkotlinx/coroutines/channels/AbstractSendChannel;->enqueueSend(Lkotlinx/coroutines/channels/SendElement;)Ljava/lang/Object; HSPLkotlinx/coroutines/channels/AbstractSendChannel;->getClosedForSend()Lkotlinx/coroutines/channels/Closed; HSPLkotlinx/coroutines/channels/AbstractSendChannel;->invokeOnClose(Lkotlinx/coroutines/channels/ProduceKt$awaitClose$4$1;)V HSPLkotlinx/coroutines/channels/AbstractSendChannel;->offerInternal(Ljava/lang/Object;)Ljava/lang/Object; @@ -8119,13 +7717,7 @@ HSPLkotlinx/coroutines/channels/Receive;->getOfferResult()Ljava/lang/Object; HSPLkotlinx/coroutines/channels/Receive;->resumeOnCancellationFun(Ljava/lang/Object;)Lkotlin/jvm/functions/Function1; HSPLkotlinx/coroutines/channels/RendezvousChannel;->(Lkotlin/jvm/functions/Function1;)V HSPLkotlinx/coroutines/channels/RendezvousChannel;->isBufferAlwaysEmpty()Z -HSPLkotlinx/coroutines/channels/RendezvousChannel;->isBufferAlwaysFull()Z -HSPLkotlinx/coroutines/channels/RendezvousChannel;->isBufferFull()Z HSPLkotlinx/coroutines/channels/Send;->()V -HSPLkotlinx/coroutines/channels/SendElement;->(Ljava/lang/Object;Lkotlinx/coroutines/CancellableContinuationImpl;)V -HSPLkotlinx/coroutines/channels/SendElement;->completeResumeSend()V -HSPLkotlinx/coroutines/channels/SendElement;->getPollResult()Ljava/lang/Object; -HSPLkotlinx/coroutines/channels/SendElement;->tryResumeSend()Lkotlinx/coroutines/internal/Symbol; HSPLkotlinx/coroutines/flow/AbstractFlow$collect$1;->(Lkotlinx/coroutines/flow/AbstractFlow;Lkotlin/coroutines/Continuation;)V HSPLkotlinx/coroutines/flow/AbstractFlow;->()V HSPLkotlinx/coroutines/flow/AbstractFlow;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; @@ -8139,6 +7731,12 @@ HSPLkotlinx/coroutines/flow/DistinctFlowImpl$collect$2;->(Lkotlinx/corouti HSPLkotlinx/coroutines/flow/DistinctFlowImpl$collect$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/DistinctFlowImpl;->(Lkotlinx/coroutines/flow/Flow;)V HSPLkotlinx/coroutines/flow/DistinctFlowImpl;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +HSPLkotlinx/coroutines/flow/FlowKt;->buffer$default(Lkotlinx/coroutines/flow/Flow;I)Lkotlinx/coroutines/flow/Flow; +HSPLkotlinx/coroutines/flow/FlowKt;->distinctUntilChanged(Lkotlinx/coroutines/flow/Flow;)Lkotlinx/coroutines/flow/Flow; +HSPLkotlinx/coroutines/flow/FlowKt;->first(Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +HSPLkotlinx/coroutines/flow/FlowKt;->first(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +HSPLkotlinx/coroutines/flow/FlowKt;->firstOrNull(Lcom/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSource$getChangeListVersions$$inlined$map$1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +HSPLkotlinx/coroutines/flow/FlowKt;->stateIn(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/CoroutineScope;Lkotlinx/coroutines/flow/SharingStarted;Ljava/lang/Object;)Lkotlinx/coroutines/flow/ReadonlyStateFlow; HSPLkotlinx/coroutines/flow/FlowKt__BuildersKt$flowOf$$inlined$unsafeFlow$2;->(Ljava/lang/Object;)V HSPLkotlinx/coroutines/flow/FlowKt__BuildersKt$flowOf$$inlined$unsafeFlow$2;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/FlowKt__ChannelsKt$emitAllImpl$1;->(Lkotlin/coroutines/Continuation;)V @@ -8182,11 +7780,6 @@ HSPLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1;->invokeSuspend(Ljav HSPLkotlinx/coroutines/flow/FlowKt__TransformKt$onEach$$inlined$unsafeTransform$1$2$1;->(Lkotlinx/coroutines/flow/FlowKt__TransformKt$onEach$$inlined$unsafeTransform$1$2;Lkotlin/coroutines/Continuation;)V HSPLkotlinx/coroutines/flow/FlowKt__TransformKt$onEach$$inlined$unsafeTransform$1$2;->(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/jvm/functions/Function2;)V HSPLkotlinx/coroutines/flow/FlowKt__TransformKt$onEach$$inlined$unsafeTransform$1$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -HSPLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$combineUnsafe$FlowKt__ZipKt$1$2;->(Lkotlin/coroutines/Continuation;Lkotlin/jvm/functions/Function4;)V -HSPLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$combineUnsafe$FlowKt__ZipKt$1$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -HSPLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$combineUnsafe$FlowKt__ZipKt$1$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; -HSPLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$combineUnsafe$FlowKt__ZipKt$1;->([Lkotlinx/coroutines/flow/Flow;Lcom/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel$onboardingUiState$1;)V -HSPLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$combineUnsafe$FlowKt__ZipKt$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$unsafeFlow$1;->(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function3;)V HSPLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$unsafeFlow$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$1$1;->(Lkotlin/jvm/functions/Function3;Lkotlin/coroutines/Continuation;)V @@ -8309,7 +7902,6 @@ HSPLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2;->(Lkotli HSPLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; -HSPLkotlinx/coroutines/flow/internal/CombineKt;->combineInternal(Lkotlin/coroutines/Continuation;Lkotlin/jvm/functions/Function3;Lkotlinx/coroutines/flow/FlowCollector;[Lkotlinx/coroutines/flow/Flow;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/internal/DownstreamExceptionContext;->(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Throwable;)V HSPLkotlinx/coroutines/flow/internal/FlowCoroutine;->(Lkotlin/coroutines/Continuation;Lkotlin/coroutines/CoroutineContext;)V HSPLkotlinx/coroutines/flow/internal/NoOpContinuation;->()V @@ -8400,9 +7992,6 @@ HSPLkotlinx/coroutines/internal/ScopeCoroutine;->isScopedCoroutine()Z HSPLkotlinx/coroutines/internal/Segment;->()V HSPLkotlinx/coroutines/internal/Segment;->(JLkotlinx/coroutines/internal/Segment;I)V HSPLkotlinx/coroutines/internal/Symbol;->(Ljava/lang/String;)V -HSPLkotlinx/coroutines/internal/SystemPropsKt;->systemProp$default(Ljava/lang/String;IIII)I -HSPLkotlinx/coroutines/internal/SystemPropsKt;->systemProp(Ljava/lang/String;JJJ)J -HSPLkotlinx/coroutines/internal/SystemPropsKt;->toAndroidRect(Landroidx/compose/ui/geometry/Rect;)Landroid/graphics/Rect; HSPLkotlinx/coroutines/internal/SystemPropsKt__SystemPropsKt;->()V HSPLkotlinx/coroutines/internal/ThreadContextKt$countAll$1;->()V HSPLkotlinx/coroutines/internal/ThreadContextKt$countAll$1;->()V @@ -8477,10 +8066,10 @@ HSPLkotlinx/coroutines/sync/MutexKt;->Mutex$default()Lkotlinx/coroutines/sync/Mu HSPLkotlinx/coroutines/sync/SemaphoreImpl$onCancellationRelease$1;->(Lkotlinx/coroutines/sync/SemaphoreImpl;)V HSPLkotlinx/coroutines/sync/SemaphoreImpl;->()V HSPLkotlinx/coroutines/sync/SemaphoreImpl;->(II)V -HSPLkotlinx/coroutines/sync/SemaphoreImpl;->acquire(Lcoil/decode/BitmapFactoryDecoder$decode$1;)Ljava/lang/Object; HSPLkotlinx/coroutines/sync/SemaphoreKt;->()V HSPLkotlinx/coroutines/sync/SemaphoreSegment;->(JLkotlinx/coroutines/sync/SemaphoreSegment;I)V HSPLkotlinx/datetime/Instant$Companion;->()V +HSPLkotlinx/datetime/Instant$Companion;->parse(Ljava/lang/String;)Lkotlinx/datetime/Instant; HSPLkotlinx/datetime/Instant;->()V HSPLkotlinx/datetime/Instant;->(Lj$/time/Instant;)V HSPLkotlinx/serialization/SerializersCacheKt$PARAMETRIZED_SERIALIZERS_CACHE$1;->()V @@ -8519,6 +8108,8 @@ HSPLkotlinx/serialization/descriptors/PrimitiveKind$STRING;->()V HSPLkotlinx/serialization/descriptors/PrimitiveKind;->()V HSPLkotlinx/serialization/descriptors/SerialDescriptorsKt;->PrimitiveSerialDescriptor(Ljava/lang/String;Lkotlinx/serialization/descriptors/PrimitiveKind$STRING;)Lkotlinx/serialization/internal/PrimitiveSerialDescriptor; HSPLkotlinx/serialization/descriptors/SerialKind;->()V +HSPLkotlinx/serialization/descriptors/SerialKind;->hashCode()I +HSPLkotlinx/serialization/descriptors/SerialKind;->toString()Ljava/lang/String; HSPLkotlinx/serialization/descriptors/StructureKind$CLASS;->()V HSPLkotlinx/serialization/descriptors/StructureKind$CLASS;->()V HSPLkotlinx/serialization/descriptors/StructureKind$LIST;->()V @@ -8528,9 +8119,13 @@ HSPLkotlinx/serialization/descriptors/StructureKind$MAP;->()V HSPLkotlinx/serialization/descriptors/StructureKind;->(I)V HSPLkotlinx/serialization/encoding/AbstractDecoder;->()V HSPLkotlinx/serialization/encoding/AbstractDecoder;->decodeSequentially()V +HSPLkotlinx/serialization/encoding/AbstractDecoder;->decodeStringElement(Lkotlinx/serialization/descriptors/SerialDescriptor;I)Ljava/lang/String; HSPLkotlinx/serialization/internal/AbstractCollectionSerializer;->()V HSPLkotlinx/serialization/internal/AbstractCollectionSerializer;->deserialize(Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; +HSPLkotlinx/serialization/internal/AbstractCollectionSerializer;->merge(Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; HSPLkotlinx/serialization/internal/ArrayListClassDesc;->(Lkotlinx/serialization/descriptors/SerialDescriptor;)V +HSPLkotlinx/serialization/internal/ArrayListClassDesc;->getSerialName()Ljava/lang/String; +HSPLkotlinx/serialization/internal/ArrayListSerializer;->(Lkotlinx/serialization/KSerializer;)V HSPLkotlinx/serialization/internal/ArrayListSerializer;->builder()Ljava/lang/Object; HSPLkotlinx/serialization/internal/ArrayListSerializer;->builderSize(Ljava/lang/Object;)I HSPLkotlinx/serialization/internal/ArrayListSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; @@ -8593,18 +8188,28 @@ HSPLkotlinx/serialization/internal/ObjectSerializer;->(Lkotlin/Unit;)V HSPLkotlinx/serialization/internal/ParametrizedCacheEntry;->()V HSPLkotlinx/serialization/internal/PlatformKt;->constructSerializerForGivenTypeArgs(Lkotlin/reflect/KClass;[Lkotlinx/serialization/KSerializer;)Lkotlinx/serialization/KSerializer; HSPLkotlinx/serialization/internal/Platform_commonKt;->()V +HSPLkotlinx/serialization/internal/Platform_commonKt;->compactArray(Ljava/util/List;)[Lkotlinx/serialization/descriptors/SerialDescriptor; HSPLkotlinx/serialization/internal/Platform_commonKt;->kclass(Lkotlin/reflect/KType;)Lkotlin/reflect/KClass; HSPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor$_hashCode$2;->(Lkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;)V +HSPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor$_hashCode$2;->invoke()Ljava/lang/Object; HSPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor$childSerializers$2;->(Lkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;)V +HSPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor$childSerializers$2;->invoke()Ljava/lang/Object; HSPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor$typeParameterDescriptors$2;->(Lkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;)V +HSPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor$typeParameterDescriptors$2;->invoke()Ljava/lang/Object; HSPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;->(Ljava/lang/String;Lkotlinx/serialization/internal/GeneratedSerializer;I)V HSPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;->addElement(Ljava/lang/String;Z)V +HSPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;->getElementAnnotations(I)Ljava/util/List; +HSPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;->getElementDescriptor(I)Lkotlinx/serialization/descriptors/SerialDescriptor; +HSPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;->getElementIndex(Ljava/lang/String;)I HSPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;->getElementsCount()I HSPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;->getKind()Lkotlinx/serialization/descriptors/SerialKind; HSPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;->getSerialName()Ljava/lang/String; +HSPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;->hashCode()I +HSPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptorKt;->hashCodeImpl(Lkotlinx/serialization/descriptors/SerialDescriptor;[Lkotlinx/serialization/descriptors/SerialDescriptor;)I HSPLkotlinx/serialization/internal/PrimitiveArrayDescriptor;->(Lkotlinx/serialization/descriptors/SerialDescriptor;)V HSPLkotlinx/serialization/internal/PrimitiveArraySerializer;->(Lkotlinx/serialization/KSerializer;)V HSPLkotlinx/serialization/internal/PrimitiveSerialDescriptor;->(Ljava/lang/String;Lkotlinx/serialization/descriptors/PrimitiveKind;)V +HSPLkotlinx/serialization/internal/PrimitiveSerialDescriptor;->getKind()Lkotlinx/serialization/descriptors/SerialKind; HSPLkotlinx/serialization/internal/PrimitiveSerialDescriptor;->getSerialName()Ljava/lang/String; HSPLkotlinx/serialization/internal/PrimitivesKt;->()V HSPLkotlinx/serialization/internal/PrimitivesKt;->capitalize(Ljava/lang/String;)Ljava/lang/String; @@ -8652,40 +8257,45 @@ HSPLkotlinx/serialization/json/internal/AbstractJsonLexer;->decodedString(II)Lja HSPLkotlinx/serialization/json/internal/AbstractJsonLexer;->isValidValueStart(C)Z HSPLkotlinx/serialization/json/internal/AbstractJsonLexerKt;->charToTokenClass(C)B HSPLkotlinx/serialization/json/internal/ArrayAsSequence;->([C)V +HSPLkotlinx/serialization/json/internal/ArrayAsSequence;->charAt(I)C HSPLkotlinx/serialization/json/internal/ArrayAsSequence;->length()I HSPLkotlinx/serialization/json/internal/CharMappings;->()V HSPLkotlinx/serialization/json/internal/CharMappings;->initC2ESC(CI)V HSPLkotlinx/serialization/json/internal/DescriptorSchemaCache$Key;->()V HSPLkotlinx/serialization/json/internal/DescriptorSchemaCache;->()V +HSPLkotlinx/serialization/json/internal/DescriptorSchemaCache;->get(Lkotlinx/serialization/descriptors/SerialDescriptor;)Ljava/lang/Object; HSPLkotlinx/serialization/json/internal/JavaStreamSerialReader;->(Ljava/io/InputStream;)V HSPLkotlinx/serialization/json/internal/JavaStreamSerialReader;->read([CII)I HSPLkotlinx/serialization/json/internal/JsonNamesMapKt;->()V +HSPLkotlinx/serialization/json/internal/JsonNamesMapKt;->buildAlternativeNamesMap(Lkotlinx/serialization/descriptors/SerialDescriptor;)Ljava/util/Map; HSPLkotlinx/serialization/json/internal/JsonPath;->()V HSPLkotlinx/serialization/json/internal/ReaderJsonLexer;->(Lkotlinx/serialization/json/internal/JavaStreamSerialReader;)V HSPLkotlinx/serialization/json/internal/ReaderJsonLexer;->appendRange(II)V HSPLkotlinx/serialization/json/internal/ReaderJsonLexer;->consumeNextToken()B +HSPLkotlinx/serialization/json/internal/ReaderJsonLexer;->ensureHaveChars()V HSPLkotlinx/serialization/json/internal/ReaderJsonLexer;->getSource()Ljava/lang/CharSequence; HSPLkotlinx/serialization/json/internal/ReaderJsonLexer;->preload(I)V HSPLkotlinx/serialization/json/internal/ReaderJsonLexer;->substring(II)Ljava/lang/String; +HSPLkotlinx/serialization/json/internal/ReaderJsonLexer;->tryConsumeComma()Z +HSPLkotlinx/serialization/json/internal/StreamingJsonDecoder;->(Lkotlinx/serialization/json/Json;ILkotlinx/serialization/json/internal/AbstractJsonLexer;Lkotlinx/serialization/descriptors/SerialDescriptor;Lkotlinx/serialization/json/internal/StreamingJsonDecoder$DiscriminatorHolder;)V +HSPLkotlinx/serialization/json/internal/StreamingJsonDecoder;->decodeSerializableElement(Lkotlinx/serialization/descriptors/SerialDescriptor;ILkotlinx/serialization/DeserializationStrategy;Ljava/lang/Object;)Ljava/lang/Object; +HSPLkotlinx/serialization/json/internal/StreamingJsonDecoder;->decodeSerializableValue(Lkotlinx/serialization/DeserializationStrategy;)Ljava/lang/Object; HSPLkotlinx/serialization/json/internal/StreamingJsonDecoder;->decodeString()Ljava/lang/String; HSPLkotlinx/serialization/json/internal/WriteMode$EnumUnboxingLocalUtility;->getBegin(I)C HSPLkotlinx/serialization/json/internal/WriteMode$EnumUnboxingLocalUtility;->getEnd(I)C HSPLkotlinx/serialization/modules/SerialModuleImpl;->()V HSPLkotlinx/serialization/modules/SerializersModuleKt;->()V HSPLokhttp3/Address;->(Ljava/lang/String;ILokhttp3/Dns;Ljavax/net/SocketFactory;Ljavax/net/ssl/SSLSocketFactory;Ljavax/net/ssl/HostnameVerifier;Lokhttp3/CertificatePinner;Lokhttp3/Authenticator;Ljava/util/List;Ljava/util/List;Ljava/net/ProxySelector;)V -HSPLokhttp3/Address;->equalsNonHost$okhttp(Lokhttp3/Address;)Z HSPLokhttp3/Address;->hashCode()I HSPLokhttp3/Authenticator$Companion$AuthenticatorNone;->()V HSPLokhttp3/Authenticator;->()V HSPLokhttp3/CacheControl$Builder;->()V HSPLokhttp3/CacheControl$Builder;->build()Lokhttp3/CacheControl; -HSPLokhttp3/CacheControl$Companion;->indexOfElement(ILjava/lang/String;Ljava/lang/String;)I HSPLokhttp3/CacheControl$Companion;->parse(Lokhttp3/Headers;)Lokhttp3/CacheControl; HSPLokhttp3/CacheControl;->()V HSPLokhttp3/CacheControl;->(ZZIIZZZIIZZZLjava/lang/String;)V HSPLokhttp3/CertificatePinner;->()V HSPLokhttp3/CertificatePinner;->(Ljava/util/Set;Lokhttp3/internal/tls/CertificateChainCleaner;)V -HSPLokhttp3/CertificatePinner;->equals(Ljava/lang/Object;)Z HSPLokhttp3/CertificatePinner;->hashCode()I HSPLokhttp3/CipherSuite$Companion$ORDER_BY_NAME$1;->()V HSPLokhttp3/CipherSuite$Companion$ORDER_BY_NAME$1;->compare(Ljava/lang/Object;Ljava/lang/Object;)I @@ -8706,7 +8316,6 @@ HSPLokhttp3/ConnectionSpec$Builder;->tlsVersions([Lokhttp3/TlsVersion;)V HSPLokhttp3/ConnectionSpec;->()V HSPLokhttp3/ConnectionSpec;->(ZZ[Ljava/lang/String;[Ljava/lang/String;)V HSPLokhttp3/ConnectionSpec;->cipherSuites()Ljava/util/List; -HSPLokhttp3/ConnectionSpec;->equals(Ljava/lang/Object;)Z HSPLokhttp3/ConnectionSpec;->hashCode()I HSPLokhttp3/ConnectionSpec;->isCompatible(Ljavax/net/ssl/SSLSocket;)Z HSPLokhttp3/ConnectionSpec;->tlsVersions()Ljava/util/List; @@ -8714,7 +8323,6 @@ HSPLokhttp3/CookieJar$Companion$NoCookies;->()V HSPLokhttp3/CookieJar$Companion$NoCookies;->loadForRequest(Lokhttp3/HttpUrl;)V HSPLokhttp3/CookieJar;->()V HSPLokhttp3/Dispatcher;->()V -HSPLokhttp3/Dispatcher;->finished$okhttp(Lokhttp3/internal/connection/RealCall$AsyncCall;)V HSPLokhttp3/Dispatcher;->promoteAndExecute()V HSPLokhttp3/Dns$Companion$DnsSystem;->()V HSPLokhttp3/Dns$Companion$DnsSystem;->lookup(Ljava/lang/String;)Ljava/util/List; @@ -8722,10 +8330,6 @@ HSPLokhttp3/Dns;->()V HSPLokhttp3/EventListener$Companion$NONE$1;->()V HSPLokhttp3/EventListener;->()V HSPLokhttp3/EventListener;->()V -HSPLokhttp3/Handshake$Companion$handshake$1;->(Ljava/util/List;)V -HSPLokhttp3/Handshake$Companion;->get(Ljavax/net/ssl/SSLSession;)Lokhttp3/Handshake; -HSPLokhttp3/Handshake$peerCertificates$2;->(Lkotlin/jvm/functions/Function0;)V -HSPLokhttp3/Handshake;->(Lokhttp3/TlsVersion;Lokhttp3/CipherSuite;Ljava/util/List;Lkotlin/jvm/functions/Function0;)V HSPLokhttp3/Headers$Builder;->()V HSPLokhttp3/Headers$Builder;->addLenient$okhttp(Ljava/lang/String;Ljava/lang/String;)V HSPLokhttp3/Headers$Builder;->build()Lokhttp3/Headers; @@ -8734,7 +8338,6 @@ HSPLokhttp3/Headers$Companion;->checkName(Ljava/lang/String;)V HSPLokhttp3/Headers$Companion;->checkValue(Ljava/lang/String;Ljava/lang/String;)V HSPLokhttp3/Headers$Companion;->of([Ljava/lang/String;)Lokhttp3/Headers; HSPLokhttp3/Headers;->([Ljava/lang/String;)V -HSPLokhttp3/Headers;->equals(Ljava/lang/Object;)Z HSPLokhttp3/Headers;->get(Ljava/lang/String;)Ljava/lang/String; HSPLokhttp3/Headers;->name(I)Ljava/lang/String; HSPLokhttp3/Headers;->newBuilder()Lokhttp3/Headers$Builder; @@ -8754,20 +8357,15 @@ HSPLokhttp3/HttpUrl$Companion;->toQueryString$okhttp(Ljava/util/List;Ljava/lang/ HSPLokhttp3/HttpUrl;->()V HSPLokhttp3/HttpUrl;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/util/ArrayList;Ljava/util/ArrayList;Ljava/lang/String;Ljava/lang/String;)V HSPLokhttp3/HttpUrl;->encodedPassword()Ljava/lang/String; -HSPLokhttp3/HttpUrl;->encodedPath()Ljava/lang/String; HSPLokhttp3/HttpUrl;->encodedPathSegments()Ljava/util/ArrayList; HSPLokhttp3/HttpUrl;->encodedQuery()Ljava/lang/String; HSPLokhttp3/HttpUrl;->encodedUsername()Ljava/lang/String; HSPLokhttp3/HttpUrl;->hashCode()I HSPLokhttp3/HttpUrl;->redact()Ljava/lang/String; HSPLokhttp3/HttpUrl;->uri()Ljava/net/URI; -HSPLokhttp3/MediaType$Companion;->get(Ljava/lang/String;)Lokhttp3/MediaType; -HSPLokhttp3/MediaType;->()V -HSPLokhttp3/MediaType;->(Ljava/lang/String;)V HSPLokhttp3/OkHttpClient;->()V HSPLokhttp3/OkHttpClient;->()V HSPLokhttp3/OkHttpClient;->newCall(Lokhttp3/Request;)Lokhttp3/internal/connection/RealCall; -HSPLokhttp3/Protocol$Companion;->get(Ljava/lang/String;)Lokhttp3/Protocol; HSPLokhttp3/Protocol;->()V HSPLokhttp3/Protocol;->(ILjava/lang/String;Ljava/lang/String;)V HSPLokhttp3/Request$Builder;->()V @@ -8778,116 +8376,60 @@ HSPLokhttp3/Request;->(Lokhttp3/HttpUrl;Ljava/lang/String;Lokhttp3/Headers HSPLokhttp3/Request;->cacheControl()Lokhttp3/CacheControl; HSPLokhttp3/RequestBody$Companion$toRequestBody$2;->(IILokhttp3/MediaType;[B)V HSPLokhttp3/RequestBody;->()V -HSPLokhttp3/Response$Builder;->()V -HSPLokhttp3/Response$Builder;->(Lokhttp3/Response;)V -HSPLokhttp3/Response$Builder;->build()Lokhttp3/Response; -HSPLokhttp3/Response$Builder;->checkSupportResponse(Ljava/lang/String;Lokhttp3/Response;)V -HSPLokhttp3/Response;->(Lokhttp3/Request;Lokhttp3/Protocol;Ljava/lang/String;ILokhttp3/Handshake;Lokhttp3/Headers;Lokhttp3/ResponseBody;Lokhttp3/Response;Lokhttp3/Response;Lokhttp3/Response;JJLokhttp3/internal/connection/Exchange;)V -HSPLokhttp3/Response;->cacheControl()Lokhttp3/CacheControl; -HSPLokhttp3/Response;->close()V -HSPLokhttp3/Response;->header$default(Lokhttp3/Response;Ljava/lang/String;)Ljava/lang/String; HSPLokhttp3/ResponseBody$Companion$asResponseBody$1;->(JLokhttp3/MediaType;Lokio/Buffer;)V HSPLokhttp3/ResponseBody;->()V -HSPLokhttp3/ResponseBody;->close()V HSPLokhttp3/Route;->(Lokhttp3/Address;Ljava/net/Proxy;Ljava/net/InetSocketAddress;)V HSPLokhttp3/Route;->hashCode()I HSPLokhttp3/TlsVersion$Companion;->forJavaName(Ljava/lang/String;)Lokhttp3/TlsVersion; HSPLokhttp3/TlsVersion;->()V HSPLokhttp3/TlsVersion;->(ILjava/lang/String;Ljava/lang/String;)V -HSPLokhttp3/internal/HostnamesKt;->toCanonicalHost(Ljava/lang/String;)Ljava/lang/String; HSPLokhttp3/internal/Util$$ExternalSyntheticLambda0;->(Ljava/lang/String;Z)V HSPLokhttp3/internal/Util$$ExternalSyntheticLambda0;->newThread(Ljava/lang/Runnable;)Ljava/lang/Thread; HSPLokhttp3/internal/Util$$ExternalSyntheticLambda1;->(Lokhttp3/EventListener$Companion$NONE$1;)V HSPLokhttp3/internal/Util;->()V -HSPLokhttp3/internal/Util;->closeQuietly(Ljava/io/Closeable;)V -HSPLokhttp3/internal/Util;->closeQuietly(Ljava/net/Socket;)V HSPLokhttp3/internal/Util;->delimiterOffset(IILjava/lang/String;Ljava/lang/String;)I HSPLokhttp3/internal/Util;->delimiterOffset(Ljava/lang/String;CII)I -HSPLokhttp3/internal/Util;->format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String; HSPLokhttp3/internal/Util;->hasIntersection([Ljava/lang/String;[Ljava/lang/String;Ljava/util/Comparator;)Z -HSPLokhttp3/internal/Util;->headersContentLength(Lokhttp3/Response;)J HSPLokhttp3/internal/Util;->immutableListOf([Ljava/lang/Object;)Ljava/util/List; HSPLokhttp3/internal/Util;->indexOfFirstNonAsciiWhitespace(IILjava/lang/String;)I HSPLokhttp3/internal/Util;->indexOfLastNonAsciiWhitespace(IILjava/lang/String;)I HSPLokhttp3/internal/Util;->intersect([Ljava/lang/String;[Ljava/lang/String;Ljava/util/Comparator;)[Ljava/lang/String; HSPLokhttp3/internal/Util;->parseHexDigit(C)I -HSPLokhttp3/internal/Util;->readMedium(Lokio/BufferedSource;)I -HSPLokhttp3/internal/Util;->toHeaders(Ljava/util/List;)Lokhttp3/Headers; HSPLokhttp3/internal/Util;->toHostHeader(Lokhttp3/HttpUrl;Z)Ljava/lang/String; HSPLokhttp3/internal/Util;->toImmutableList(Ljava/util/List;)Ljava/util/List; -HSPLokhttp3/internal/Util;->toNonNegativeInt(ILjava/lang/String;)I HSPLokhttp3/internal/cache/CacheInterceptor$Companion;->()V -HSPLokhttp3/internal/cache/CacheInterceptor$Companion;->access$stripBody(Lokhttp3/Response;)Lokhttp3/Response; HSPLokhttp3/internal/cache/CacheInterceptor;->()V HSPLokhttp3/internal/cache/CacheInterceptor;->()V HSPLokhttp3/internal/cache/CacheInterceptor;->intercept(Lokhttp3/internal/http/RealInterceptorChain;)Lokhttp3/Response; HSPLokhttp3/internal/cache/CacheStrategy;->(Lokhttp3/Request;Lokhttp3/Response;)V HSPLokhttp3/internal/concurrent/Task;->(Ljava/lang/String;Z)V -HSPLokhttp3/internal/concurrent/TaskQueue$execute$1;->(Ljava/lang/String;Lokhttp3/internal/http2/Http2Connection$ReaderRunnable;)V -HSPLokhttp3/internal/concurrent/TaskQueue$execute$1;->runOnce()J HSPLokhttp3/internal/concurrent/TaskQueue;->(Lokhttp3/internal/concurrent/TaskRunner;Ljava/lang/String;)V -HSPLokhttp3/internal/concurrent/TaskQueue;->cancelAllAndDecide$okhttp()Z -HSPLokhttp3/internal/concurrent/TaskQueue;->schedule(Lokhttp3/internal/concurrent/Task;J)V -HSPLokhttp3/internal/concurrent/TaskQueue;->scheduleAndDecide$okhttp(Lokhttp3/internal/concurrent/Task;JZ)Z -HSPLokhttp3/internal/concurrent/TaskQueue;->shutdown()V HSPLokhttp3/internal/concurrent/TaskRunner$RealBackend;->(Lokhttp3/internal/Util$$ExternalSyntheticLambda0;)V -HSPLokhttp3/internal/concurrent/TaskRunner$RealBackend;->coordinatorNotify(Lokhttp3/internal/concurrent/TaskRunner;)V -HSPLokhttp3/internal/concurrent/TaskRunner$RealBackend;->coordinatorWait(Lokhttp3/internal/concurrent/TaskRunner;J)V -HSPLokhttp3/internal/concurrent/TaskRunner$RealBackend;->execute(Ljava/lang/Runnable;)V -HSPLokhttp3/internal/concurrent/TaskRunner$RealBackend;->nanoTime()J HSPLokhttp3/internal/concurrent/TaskRunner$runnable$1;->(Lokhttp3/internal/concurrent/TaskRunner;)V -HSPLokhttp3/internal/concurrent/TaskRunner$runnable$1;->run()V HSPLokhttp3/internal/concurrent/TaskRunner;->()V HSPLokhttp3/internal/concurrent/TaskRunner;->(Lokhttp3/internal/concurrent/TaskRunner$RealBackend;)V -HSPLokhttp3/internal/concurrent/TaskRunner;->access$runTask(Lokhttp3/internal/concurrent/TaskRunner;Lokhttp3/internal/concurrent/Task;)V -HSPLokhttp3/internal/concurrent/TaskRunner;->afterRun(Lokhttp3/internal/concurrent/Task;J)V -HSPLokhttp3/internal/concurrent/TaskRunner;->awaitTaskToRun()Lokhttp3/internal/concurrent/Task; -HSPLokhttp3/internal/concurrent/TaskRunner;->kickCoordinator$okhttp(Lokhttp3/internal/concurrent/TaskQueue;)V HSPLokhttp3/internal/concurrent/TaskRunner;->newQueue()Lokhttp3/internal/concurrent/TaskQueue; HSPLokhttp3/internal/connection/ConnectInterceptor;->()V HSPLokhttp3/internal/connection/ConnectInterceptor;->()V HSPLokhttp3/internal/connection/ConnectInterceptor;->intercept(Lokhttp3/internal/http/RealInterceptorChain;)Lokhttp3/Response; HSPLokhttp3/internal/connection/ConnectionSpecSelector;->(Ljava/util/List;)V HSPLokhttp3/internal/connection/ConnectionSpecSelector;->configureSecureSocket(Ljavax/net/ssl/SSLSocket;)Lokhttp3/ConnectionSpec; -HSPLokhttp3/internal/connection/Exchange$ResponseBodySource;->(Lokhttp3/internal/connection/Exchange;Lokio/Source;J)V -HSPLokhttp3/internal/connection/Exchange$ResponseBodySource;->close()V -HSPLokhttp3/internal/connection/Exchange$ResponseBodySource;->complete(Ljava/io/IOException;)Ljava/io/IOException; -HSPLokhttp3/internal/connection/Exchange$ResponseBodySource;->read(Lokio/Buffer;J)J -HSPLokhttp3/internal/connection/Exchange;->(Lokhttp3/internal/connection/RealCall;Lokhttp3/EventListener;Lokhttp3/internal/connection/ExchangeFinder;Lokhttp3/internal/http/ExchangeCodec;)V -HSPLokhttp3/internal/connection/Exchange;->bodyComplete(ZZLjava/io/IOException;)Ljava/io/IOException; -HSPLokhttp3/internal/connection/Exchange;->readResponseHeaders(Z)Lokhttp3/Response$Builder; HSPLokhttp3/internal/connection/ExchangeFinder;->(Lokhttp3/internal/connection/RealConnectionPool;Lokhttp3/Address;Lokhttp3/internal/connection/RealCall;Lokhttp3/EventListener;)V HSPLokhttp3/internal/connection/ExchangeFinder;->findHealthyConnection(IIIZZ)Lokhttp3/internal/connection/RealConnection; -HSPLokhttp3/internal/connection/ExchangeFinder;->sameHostAndPort(Lokhttp3/HttpUrl;)Z HSPLokhttp3/internal/connection/RealCall$AsyncCall;->(Lokhttp3/internal/connection/RealCall;Lcoil/util/ContinuationCallback;)V HSPLokhttp3/internal/connection/RealCall$AsyncCall;->run()V -HSPLokhttp3/internal/connection/RealCall$CallReference;->(Lokhttp3/internal/connection/RealCall;Ljava/lang/Object;)V HSPLokhttp3/internal/connection/RealCall$timeout$1;->(Lokhttp3/internal/connection/RealCall;)V HSPLokhttp3/internal/connection/RealCall;->(Lokhttp3/OkHttpClient;Lokhttp3/Request;Z)V -HSPLokhttp3/internal/connection/RealCall;->acquireConnectionNoEvents(Lokhttp3/internal/connection/RealConnection;)V -HSPLokhttp3/internal/connection/RealCall;->callDone(Ljava/io/IOException;)Ljava/io/IOException; HSPLokhttp3/internal/connection/RealCall;->enqueue(Lcoil/util/ContinuationCallback;)V -HSPLokhttp3/internal/connection/RealCall;->exitNetworkInterceptorExchange$okhttp(Z)V HSPLokhttp3/internal/connection/RealCall;->getResponseWithInterceptorChain$okhttp()Lokhttp3/Response; -HSPLokhttp3/internal/connection/RealCall;->messageDone$okhttp(Lokhttp3/internal/connection/Exchange;ZZLjava/io/IOException;)Ljava/io/IOException; -HSPLokhttp3/internal/connection/RealCall;->noMoreExchanges$okhttp(Ljava/io/IOException;)Ljava/io/IOException; -HSPLokhttp3/internal/connection/RealCall;->releaseConnectionNoEvents$okhttp()Ljava/net/Socket; HSPLokhttp3/internal/connection/RealConnection$WhenMappings;->()V -HSPLokhttp3/internal/connection/RealConnection$connectTls$1;->(Lokhttp3/CertificatePinner;Lokhttp3/Handshake;Lokhttp3/Address;)V HSPLokhttp3/internal/connection/RealConnection;->(Lokhttp3/internal/connection/RealConnectionPool;Lokhttp3/Route;)V HSPLokhttp3/internal/connection/RealConnection;->connect(IIIZLokhttp3/internal/connection/RealCall;Lokhttp3/EventListener;)V HSPLokhttp3/internal/connection/RealConnection;->connectSocket(IILokhttp3/internal/connection/RealCall;Lokhttp3/EventListener;)V HSPLokhttp3/internal/connection/RealConnection;->establishProtocol(Lokhttp3/internal/connection/ConnectionSpecSelector;Lokhttp3/internal/connection/RealCall;Lokhttp3/EventListener;)V -HSPLokhttp3/internal/connection/RealConnection;->isEligible$okhttp(Lokhttp3/Address;Ljava/util/List;)Z -HSPLokhttp3/internal/connection/RealConnection;->isHealthy(Z)Z -HSPLokhttp3/internal/connection/RealConnection;->newCodec$okhttp(Lokhttp3/OkHttpClient;Lokhttp3/internal/http/RealInterceptorChain;)Lokhttp3/internal/http/ExchangeCodec; -HSPLokhttp3/internal/connection/RealConnection;->onSettings(Lokhttp3/internal/http2/Http2Connection;Lokhttp3/internal/http2/Settings;)V -HSPLokhttp3/internal/connection/RealConnection;->startHttp2()V HSPLokhttp3/internal/connection/RealConnectionPool$cleanupTask$1;->(Lokhttp3/internal/connection/RealConnectionPool;Ljava/lang/String;)V -HSPLokhttp3/internal/connection/RealConnectionPool$cleanupTask$1;->runOnce()J HSPLokhttp3/internal/connection/RealConnectionPool;->(Lokhttp3/internal/concurrent/TaskRunner;Ljava/util/concurrent/TimeUnit;)V HSPLokhttp3/internal/connection/RealConnectionPool;->callAcquirePooledConnection(Lokhttp3/Address;Lokhttp3/internal/connection/RealCall;Ljava/util/List;Z)Z -HSPLokhttp3/internal/connection/RealConnectionPool;->pruneAndGetAllocationCount(Lokhttp3/internal/connection/RealConnection;J)I HSPLokhttp3/internal/connection/RouteDatabase;->()V HSPLokhttp3/internal/connection/RouteSelector$Selection;->(Ljava/util/ArrayList;)V HSPLokhttp3/internal/connection/RouteSelector$Selection;->hasNext()Z @@ -8896,127 +8438,23 @@ HSPLokhttp3/internal/connection/RouteSelector;->hasNext()Z HSPLokhttp3/internal/http/BridgeInterceptor;->(Lokhttp3/CookieJar;)V HSPLokhttp3/internal/http/BridgeInterceptor;->intercept(Lokhttp3/internal/http/RealInterceptorChain;)Lokhttp3/Response; HSPLokhttp3/internal/http/CallServerInterceptor;->(Z)V -HSPLokhttp3/internal/http/CallServerInterceptor;->intercept(Lokhttp3/internal/http/RealInterceptorChain;)Lokhttp3/Response; -HSPLokhttp3/internal/http/HttpHeaders;->()V -HSPLokhttp3/internal/http/HttpHeaders;->promisesBody(Lokhttp3/Response;)Z -HSPLokhttp3/internal/http/HttpHeaders;->receiveHeaders(Lokhttp3/CookieJar;Lokhttp3/HttpUrl;Lokhttp3/Headers;)V -HSPLokhttp3/internal/http/HttpMethod;->permitsRequestBody(Ljava/lang/String;)Z HSPLokhttp3/internal/http/RealInterceptorChain;->(Lokhttp3/internal/connection/RealCall;Ljava/util/List;ILokhttp3/internal/connection/Exchange;Lokhttp3/Request;III)V HSPLokhttp3/internal/http/RealInterceptorChain;->copy$okhttp$default(Lokhttp3/internal/http/RealInterceptorChain;ILokhttp3/internal/connection/Exchange;Lokhttp3/Request;I)Lokhttp3/internal/http/RealInterceptorChain; HSPLokhttp3/internal/http/RealInterceptorChain;->proceed(Lokhttp3/Request;)Lokhttp3/Response; -HSPLokhttp3/internal/http/RealResponseBody;->(Ljava/lang/String;JLokio/RealBufferedSource;)V -HSPLokhttp3/internal/http/RealResponseBody;->source()Lokio/BufferedSource; HSPLokhttp3/internal/http/RetryAndFollowUpInterceptor;->(Lokhttp3/OkHttpClient;)V -HSPLokhttp3/internal/http/RetryAndFollowUpInterceptor;->followUpRequest(Lokhttp3/Response;Lokhttp3/internal/connection/Exchange;)Lokhttp3/Request; HSPLokhttp3/internal/http/RetryAndFollowUpInterceptor;->intercept(Lokhttp3/internal/http/RealInterceptorChain;)Lokhttp3/Response; -HSPLokhttp3/internal/http/StatusLine$Companion;->parse(Ljava/lang/String;)Lokhttp3/internal/http/StatusLine; -HSPLokhttp3/internal/http/StatusLine;->(Lokhttp3/Protocol;ILjava/lang/String;)V -HSPLokhttp3/internal/http2/ErrorCode;->()V -HSPLokhttp3/internal/http2/ErrorCode;->(IILjava/lang/String;)V -HSPLokhttp3/internal/http2/Header;->()V -HSPLokhttp3/internal/http2/Header;->(Ljava/lang/String;Ljava/lang/String;)V -HSPLokhttp3/internal/http2/Header;->(Lokio/ByteString;Ljava/lang/String;)V -HSPLokhttp3/internal/http2/Header;->(Lokio/ByteString;Lokio/ByteString;)V -HSPLokhttp3/internal/http2/Hpack$Reader;->(Lokhttp3/internal/http2/Http2Reader$ContinuationSource;)V -HSPLokhttp3/internal/http2/Hpack$Reader;->evictToRecoverBytes(I)I -HSPLokhttp3/internal/http2/Hpack$Reader;->getName(I)Lokio/ByteString; -HSPLokhttp3/internal/http2/Hpack$Reader;->insertIntoDynamicTable(Lokhttp3/internal/http2/Header;)V -HSPLokhttp3/internal/http2/Hpack$Reader;->readByteString()Lokio/ByteString; -HSPLokhttp3/internal/http2/Hpack$Reader;->readInt(II)I -HSPLokhttp3/internal/http2/Hpack$Writer;->(Lokio/Buffer;)V -HSPLokhttp3/internal/http2/Hpack$Writer;->evictToRecoverBytes(I)V -HSPLokhttp3/internal/http2/Hpack$Writer;->insertIntoDynamicTable(Lokhttp3/internal/http2/Header;)V -HSPLokhttp3/internal/http2/Hpack$Writer;->writeByteString(Lokio/ByteString;)V -HSPLokhttp3/internal/http2/Hpack$Writer;->writeHeaders(Ljava/util/ArrayList;)V -HSPLokhttp3/internal/http2/Hpack$Writer;->writeInt(III)V -HSPLokhttp3/internal/http2/Hpack;->()V -HSPLokhttp3/internal/http2/Hpack;->checkLowercase(Lokio/ByteString;)V -HSPLokhttp3/internal/http2/Http2;->()V -HSPLokhttp3/internal/http2/Http2;->()V -HSPLokhttp3/internal/http2/Http2Connection$Builder;->(Lokhttp3/internal/concurrent/TaskRunner;)V HSPLokhttp3/internal/http2/Http2Connection$Listener$Companion$REFUSE_INCOMING_STREAMS$1;->()V HSPLokhttp3/internal/http2/Http2Connection$Listener;->()V HSPLokhttp3/internal/http2/Http2Connection$Listener;->()V -HSPLokhttp3/internal/http2/Http2Connection$ReaderRunnable$applyAndAckSettings$lambda-7$lambda-6$$inlined$execute$default$1;->(Ljava/lang/String;Lokhttp3/internal/http2/Http2Connection;Lkotlin/jvm/internal/Ref$ObjectRef;)V -HSPLokhttp3/internal/http2/Http2Connection$ReaderRunnable$applyAndAckSettings$lambda-7$lambda-6$$inlined$execute$default$1;->runOnce()J -HSPLokhttp3/internal/http2/Http2Connection$ReaderRunnable$settings$$inlined$execute$default$1;->(Ljava/lang/String;Lokhttp3/internal/http2/Http2Connection$ReaderRunnable;Lokhttp3/internal/http2/Settings;)V -HSPLokhttp3/internal/http2/Http2Connection$ReaderRunnable$settings$$inlined$execute$default$1;->runOnce()J -HSPLokhttp3/internal/http2/Http2Connection$ReaderRunnable;->(Lokhttp3/internal/http2/Http2Connection;Lokhttp3/internal/http2/Http2Reader;)V -HSPLokhttp3/internal/http2/Http2Connection$ReaderRunnable;->ackSettings()V -HSPLokhttp3/internal/http2/Http2Connection$ReaderRunnable;->data(IILokio/BufferedSource;Z)V -HSPLokhttp3/internal/http2/Http2Connection$ReaderRunnable;->headers(ILjava/util/List;Z)V -HSPLokhttp3/internal/http2/Http2Connection$ReaderRunnable;->invoke()Ljava/lang/Object; -HSPLokhttp3/internal/http2/Http2Connection$ReaderRunnable;->settings(Lokhttp3/internal/http2/Settings;)V -HSPLokhttp3/internal/http2/Http2Connection$ReaderRunnable;->windowUpdate(JI)V -HSPLokhttp3/internal/http2/Http2Connection;->()V -HSPLokhttp3/internal/http2/Http2Connection;->(Lokhttp3/internal/http2/Http2Connection$Builder;)V -HSPLokhttp3/internal/http2/Http2Connection;->close$okhttp(Lokhttp3/internal/http2/ErrorCode;Lokhttp3/internal/http2/ErrorCode;Ljava/io/IOException;)V -HSPLokhttp3/internal/http2/Http2Connection;->flush()V -HSPLokhttp3/internal/http2/Http2Connection;->getStream(I)Lokhttp3/internal/http2/Http2Stream; -HSPLokhttp3/internal/http2/Http2Connection;->removeStream$okhttp(I)Lokhttp3/internal/http2/Http2Stream; -HSPLokhttp3/internal/http2/Http2Connection;->shutdown(Lokhttp3/internal/http2/ErrorCode;)V -HSPLokhttp3/internal/http2/Http2Connection;->updateConnectionFlowControl$okhttp(J)V -HSPLokhttp3/internal/http2/Http2ExchangeCodec;->()V -HSPLokhttp3/internal/http2/Http2ExchangeCodec;->(Lokhttp3/OkHttpClient;Lokhttp3/internal/connection/RealConnection;Lokhttp3/internal/http/RealInterceptorChain;Lokhttp3/internal/http2/Http2Connection;)V -HSPLokhttp3/internal/http2/Http2ExchangeCodec;->finishRequest()V -HSPLokhttp3/internal/http2/Http2ExchangeCodec;->getConnection()Lokhttp3/internal/connection/RealConnection; -HSPLokhttp3/internal/http2/Http2ExchangeCodec;->openResponseBodySource(Lokhttp3/Response;)Lokio/Source; -HSPLokhttp3/internal/http2/Http2ExchangeCodec;->readResponseHeaders(Z)Lokhttp3/Response$Builder; -HSPLokhttp3/internal/http2/Http2ExchangeCodec;->reportedContentLength(Lokhttp3/Response;)J -HSPLokhttp3/internal/http2/Http2ExchangeCodec;->writeRequestHeaders(Lokhttp3/Request;)V -HSPLokhttp3/internal/http2/Http2Reader$Companion;->lengthWithoutPadding(III)I -HSPLokhttp3/internal/http2/Http2Reader$ContinuationSource;->(Lokio/BufferedSource;)V -HSPLokhttp3/internal/http2/Http2Reader$ContinuationSource;->read(Lokio/Buffer;J)J -HSPLokhttp3/internal/http2/Http2Reader;->()V -HSPLokhttp3/internal/http2/Http2Reader;->(Lokio/BufferedSource;Z)V -HSPLokhttp3/internal/http2/Http2Reader;->close()V -HSPLokhttp3/internal/http2/Http2Reader;->nextFrame(ZLokhttp3/internal/http2/Http2Reader$Handler;)Z -HSPLokhttp3/internal/http2/Http2Reader;->readConnectionPreface(Lokhttp3/internal/http2/Http2Reader$Handler;)V -HSPLokhttp3/internal/http2/Http2Reader;->readHeaderBlock(IIII)Ljava/util/List; -HSPLokhttp3/internal/http2/Http2Stream$FramingSink;->(Lokhttp3/internal/http2/Http2Stream;Z)V -HSPLokhttp3/internal/http2/Http2Stream$FramingSink;->close()V -HSPLokhttp3/internal/http2/Http2Stream$FramingSource;->(Lokhttp3/internal/http2/Http2Stream;JZ)V -HSPLokhttp3/internal/http2/Http2Stream$FramingSource;->close()V -HSPLokhttp3/internal/http2/Http2Stream$FramingSource;->read(Lokio/Buffer;J)J -HSPLokhttp3/internal/http2/Http2Stream$FramingSource;->updateConnectionFlowControl(J)V -HSPLokhttp3/internal/http2/Http2Stream$StreamTimeout;->(Lokhttp3/internal/http2/Http2Stream;)V -HSPLokhttp3/internal/http2/Http2Stream$StreamTimeout;->exitAndThrowIfTimedOut()V -HSPLokhttp3/internal/http2/Http2Stream;->(ILokhttp3/internal/http2/Http2Connection;ZZLokhttp3/Headers;)V -HSPLokhttp3/internal/http2/Http2Stream;->cancelStreamIfNecessary$okhttp()V -HSPLokhttp3/internal/http2/Http2Stream;->getSink()Lokhttp3/internal/http2/Http2Stream$FramingSink; -HSPLokhttp3/internal/http2/Http2Stream;->isLocallyInitiated()Z -HSPLokhttp3/internal/http2/Http2Stream;->isOpen()Z -HSPLokhttp3/internal/http2/Http2Stream;->receiveHeaders(Lokhttp3/Headers;Z)V -HSPLokhttp3/internal/http2/Http2Stream;->waitForIo$okhttp()V -HSPLokhttp3/internal/http2/Http2Writer;->()V -HSPLokhttp3/internal/http2/Http2Writer;->(Lokio/BufferedSink;Z)V -HSPLokhttp3/internal/http2/Http2Writer;->applyAndAckSettings(Lokhttp3/internal/http2/Settings;)V -HSPLokhttp3/internal/http2/Http2Writer;->close()V -HSPLokhttp3/internal/http2/Http2Writer;->frameHeader(IIII)V -HSPLokhttp3/internal/http2/Http2Writer;->goAway(ILokhttp3/internal/http2/ErrorCode;[B)V -HSPLokhttp3/internal/http2/Http2Writer;->windowUpdate(JI)V -HSPLokhttp3/internal/http2/Huffman$Node;->()V -HSPLokhttp3/internal/http2/Huffman$Node;->(II)V -HSPLokhttp3/internal/http2/Huffman;->()V -HSPLokhttp3/internal/http2/Huffman;->addCode(III)V -HSPLokhttp3/internal/http2/PushObserver$Companion$PushObserverCancel;->()V -HSPLokhttp3/internal/http2/PushObserver;->()V -HSPLokhttp3/internal/http2/Settings;->()V -HSPLokhttp3/internal/http2/Settings;->getInitialWindowSize()I -HSPLokhttp3/internal/http2/Settings;->merge(Lokhttp3/internal/http2/Settings;)V -HSPLokhttp3/internal/http2/Settings;->set(II)V HSPLokhttp3/internal/platform/Android10Platform;->()V HSPLokhttp3/internal/platform/Android10Platform;->()V HSPLokhttp3/internal/platform/Android10Platform;->buildCertificateChainCleaner(Ljavax/net/ssl/X509TrustManager;)Lokhttp3/internal/tls/CertificateChainCleaner; HSPLokhttp3/internal/platform/Android10Platform;->configureTlsExtensions(Ljavax/net/ssl/SSLSocket;Ljava/lang/String;Ljava/util/List;)V -HSPLokhttp3/internal/platform/Android10Platform;->getSelectedProtocol(Ljavax/net/ssl/SSLSocket;)Ljava/lang/String; -HSPLokhttp3/internal/platform/Jdk9Platform$$ExternalSyntheticApiModelOutline1;->m(Ljavax/net/ssl/SSLSocket;)Ljava/lang/String; HSPLokhttp3/internal/platform/Platform$Companion;->()V HSPLokhttp3/internal/platform/Platform$Companion;->alpnProtocolNames(Ljava/util/List;)Ljava/util/ArrayList; HSPLokhttp3/internal/platform/Platform$Companion;->isAndroid()Z HSPLokhttp3/internal/platform/Platform;->()V HSPLokhttp3/internal/platform/Platform;->()V -HSPLokhttp3/internal/platform/Platform;->afterHandshake(Ljavax/net/ssl/SSLSocket;)V HSPLokhttp3/internal/platform/Platform;->connectSocket(Ljava/net/Socket;Ljava/net/InetSocketAddress;I)V HSPLokhttp3/internal/platform/Platform;->getStackTraceForCloseable()Ljava/lang/Object; HSPLokhttp3/internal/platform/Platform;->newSSLContext()Ljavax/net/ssl/SSLContext; @@ -9024,11 +8462,9 @@ HSPLokhttp3/internal/platform/Platform;->newSslSocketFactory(Ljavax/net/ssl/X509 HSPLokhttp3/internal/platform/Platform;->platformTrustManager()Ljavax/net/ssl/X509TrustManager; HSPLokhttp3/internal/platform/android/Android10SocketAdapter;->()V HSPLokhttp3/internal/platform/android/Android10SocketAdapter;->configureTlsExtensions(Ljavax/net/ssl/SSLSocket;Ljava/lang/String;Ljava/util/List;)V -HSPLokhttp3/internal/platform/android/Android10SocketAdapter;->getSelectedProtocol(Ljavax/net/ssl/SSLSocket;)Ljava/lang/String; HSPLokhttp3/internal/platform/android/Android10SocketAdapter;->isSupported()Z HSPLokhttp3/internal/platform/android/Android10SocketAdapter;->matchesSocket(Ljavax/net/ssl/SSLSocket;)Z HSPLokhttp3/internal/platform/android/AndroidCertificateChainCleaner;->(Ljavax/net/ssl/X509TrustManager;Landroid/net/http/X509TrustManagerExtensions;)V -HSPLokhttp3/internal/platform/android/AndroidCertificateChainCleaner;->equals(Ljava/lang/Object;)Z HSPLokhttp3/internal/platform/android/AndroidCertificateChainCleaner;->hashCode()I HSPLokhttp3/internal/platform/android/AndroidLog;->()V HSPLokhttp3/internal/platform/android/AndroidLogHandler;->()V @@ -9044,30 +8480,15 @@ HSPLokhttp3/internal/platform/android/DeferredSocketAdapter;->isSupported()Z HSPLokhttp3/internal/tls/CertificateChainCleaner;->()V HSPLokhttp3/internal/tls/OkHostnameVerifier;->()V HSPLokhttp3/internal/tls/OkHostnameVerifier;->()V -HSPLokhttp3/internal/tls/OkHostnameVerifier;->getSubjectAltNames(Ljava/security/cert/X509Certificate;I)Ljava/util/List; -HSPLokhttp3/internal/tls/OkHostnameVerifier;->isAscii(Ljava/lang/String;)Z -HSPLokhttp3/internal/tls/OkHostnameVerifier;->verify(Ljava/lang/String;Ljava/security/cert/X509Certificate;)Z -HSPLokhttp3/internal/tls/OkHostnameVerifier;->verify(Ljava/lang/String;Ljavax/net/ssl/SSLSession;)Z -HSPLokio/AsyncTimeout$Companion;->awaitTimeout$okio()Lokio/AsyncTimeout; -HSPLokio/AsyncTimeout$Watchdog;->()V -HSPLokio/AsyncTimeout$Watchdog;->run()V HSPLokio/AsyncTimeout$sink$1;->(Lokio/SocketAsyncTimeout;Lokio/OutputStreamSink;)V -HSPLokio/AsyncTimeout$sink$1;->close()V -HSPLokio/AsyncTimeout$sink$1;->flush()V -HSPLokio/AsyncTimeout$sink$1;->write(Lokio/Buffer;J)V HSPLokio/AsyncTimeout$source$1;->(Lokio/SocketAsyncTimeout;Lokio/InputStreamSource;)V -HSPLokio/AsyncTimeout$source$1;->close()V -HSPLokio/AsyncTimeout$source$1;->read(Lokio/Buffer;J)J HSPLokio/AsyncTimeout;->()V HSPLokio/AsyncTimeout;->()V HSPLokio/AsyncTimeout;->enter()V -HSPLokio/AsyncTimeout;->exit()Z HSPLokio/Buffer;->()V HSPLokio/Buffer;->completeSegmentByteCount()J -HSPLokio/Buffer;->copyTo(JJLokio/Buffer;)V HSPLokio/Buffer;->exhausted()Z HSPLokio/Buffer;->getByte(J)B -HSPLokio/Buffer;->indexOf(BJJ)J HSPLokio/Buffer;->indexOfElement(Lokio/ByteString;)J HSPLokio/Buffer;->rangeEquals(JLokio/ByteString;)Z HSPLokio/Buffer;->read(Lokio/Buffer;J)J @@ -9077,10 +8498,7 @@ HSPLokio/Buffer;->readByteArray(J)[B HSPLokio/Buffer;->readByteString()Lokio/ByteString; HSPLokio/Buffer;->readByteString(J)Lokio/ByteString; HSPLokio/Buffer;->readInt()I -HSPLokio/Buffer;->readShort()S HSPLokio/Buffer;->readString(JLjava/nio/charset/Charset;)Ljava/lang/String; -HSPLokio/Buffer;->readUtf8(J)Ljava/lang/String; -HSPLokio/Buffer;->skip(J)V HSPLokio/Buffer;->writableSegment$okio(I)Lokio/Segment; HSPLokio/Buffer;->write(Lokio/Buffer;J)V HSPLokio/Buffer;->write(Lokio/ByteString;)V @@ -9089,7 +8507,6 @@ HSPLokio/Buffer;->writeAll(Lokio/Source;)V HSPLokio/Buffer;->writeByte(I)V HSPLokio/Buffer;->writeDecimalLong(J)Lokio/Buffer; HSPLokio/Buffer;->writeInt(I)V -HSPLokio/Buffer;->writeShort(I)V HSPLokio/Buffer;->writeUtf8(IILjava/lang/String;)V HSPLokio/Buffer;->writeUtf8(Ljava/lang/String;)V HSPLokio/Buffer;->writeUtf8CodePoint(I)V @@ -9103,7 +8520,6 @@ HSPLokio/ByteString;->compareTo(Lokio/ByteString;)I HSPLokio/ByteString;->digest$okio(Ljava/lang/String;)Lokio/ByteString; HSPLokio/ByteString;->equals(Ljava/lang/Object;)Z HSPLokio/ByteString;->getSize$okio()I -HSPLokio/ByteString;->hashCode()I HSPLokio/ByteString;->hex()Ljava/lang/String; HSPLokio/ByteString;->indexOf$default(Lokio/ByteString;Lokio/ByteString;)I HSPLokio/ByteString;->indexOf(I[B)I @@ -9115,7 +8531,6 @@ HSPLokio/ByteString;->rangeEquals(ILokio/ByteString;I)Z HSPLokio/ByteString;->rangeEquals(I[BII)Z HSPLokio/ByteString;->substring$default(Lokio/ByteString;III)Lokio/ByteString; HSPLokio/ByteString;->substring(II)Lokio/ByteString; -HSPLokio/ByteString;->toAsciiLowercase()Lokio/ByteString; HSPLokio/ByteString;->utf8()Ljava/lang/String; HSPLokio/ByteString;->write$okio(Lokio/Buffer;I)V HSPLokio/FileMetadata;->(ZZLokio/Path;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/Long;)V @@ -9124,26 +8539,17 @@ HSPLokio/FileSystem;->()V HSPLokio/FileSystem;->()V HSPLokio/FileSystem;->delete$1(Lokio/Path;)V HSPLokio/FileSystem;->exists(Lokio/Path;)Z -HSPLokio/FileSystem;->metadata(Lokio/Path;)Lokio/FileMetadata; HSPLokio/ForwardingFileSystem;->(Lokio/JvmSystemFileSystem;)V HSPLokio/ForwardingFileSystem;->atomicMove(Lokio/Path;Lokio/Path;)V HSPLokio/ForwardingFileSystem;->delete(Lokio/Path;)V HSPLokio/ForwardingFileSystem;->metadataOrNull(Lokio/Path;)Lokio/FileMetadata; HSPLokio/ForwardingSink;->(Lokio/Sink;)V -HSPLokio/ForwardingSink;->flush()V -HSPLokio/ForwardingSink;->write(Lokio/Buffer;J)V -HSPLokio/ForwardingSource;->(Lokio/Source;)V -HSPLokio/ForwardingSource;->close()V -HSPLokio/ForwardingSource;->read(Lokio/Buffer;J)J HSPLokio/InputStreamSource;->(Ljava/io/InputStream;Lokio/Timeout;)V -HSPLokio/InputStreamSource;->close()V -HSPLokio/InputStreamSource;->read(Lokio/Buffer;J)J HSPLokio/JvmSystemFileSystem;->()V HSPLokio/JvmSystemFileSystem;->appendingSink(Lokio/Path;)Lokio/Sink; HSPLokio/JvmSystemFileSystem;->createDirectory(Lokio/Path;)V HSPLokio/JvmSystemFileSystem;->delete(Lokio/Path;)V HSPLokio/JvmSystemFileSystem;->sink(Lokio/Path;)Lokio/Sink; -HSPLokio/JvmSystemFileSystem;->source(Lokio/Path;)Lokio/Source; HSPLokio/NioSystemFileSystem;->()V HSPLokio/NioSystemFileSystem;->atomicMove(Lokio/Path;Lokio/Path;)V HSPLokio/NioSystemFileSystem;->metadataOrNull(Lokio/Path;)Lokio/FileMetadata; @@ -9153,10 +8559,11 @@ HSPLokio/Okio;->buffer(Lokio/Source;)Lokio/RealBufferedSource; HSPLokio/Okio;->sink(Ljava/net/Socket;)Lokio/AsyncTimeout$sink$1; HSPLokio/Okio;->source(Ljava/net/Socket;)Lokio/AsyncTimeout$source$1; HSPLokio/Okio__JvmOkioKt;->()V +HSPLokio/Okio__OkioKt;->compareValues(Ljava/lang/Comparable;Ljava/lang/Comparable;)I +HSPLokio/Okio__OkioKt;->get(Landroid/view/View;)Landroidx/lifecycle/ViewModelStoreOwner; HSPLokio/Options$Companion;->buildTrieRecursive(JLokio/Buffer;ILjava/util/ArrayList;IILjava/util/ArrayList;)V HSPLokio/OutputStreamSink;->(Ljava/io/OutputStream;Lokio/Timeout;)V HSPLokio/OutputStreamSink;->close()V -HSPLokio/OutputStreamSink;->flush()V HSPLokio/OutputStreamSink;->write(Lokio/Buffer;J)V HSPLokio/Path$Companion;->()V HSPLokio/Path$Companion;->get$default(Ljava/io/File;)Lokio/Path; @@ -9169,50 +8576,23 @@ HSPLokio/Path;->toFile()Ljava/io/File; HSPLokio/Path;->toNioPath()Ljava/nio/file/Path; HSPLokio/Path;->toString()Ljava/lang/String; HSPLokio/Path;->volumeLetter()Ljava/lang/Character; -HSPLokio/PeekSource;->(Lokio/BufferedSource;)V -HSPLokio/PeekSource;->read(Lokio/Buffer;J)J HSPLokio/RealBufferedSink;->(Lokio/Sink;)V HSPLokio/RealBufferedSink;->close()V HSPLokio/RealBufferedSink;->emitCompleteSegments()Lokio/BufferedSink; -HSPLokio/RealBufferedSink;->flush()V -HSPLokio/RealBufferedSink;->write(Lokio/Buffer;J)V -HSPLokio/RealBufferedSink;->write(Lokio/ByteString;)Lokio/BufferedSink; HSPLokio/RealBufferedSink;->writeByte(I)Lokio/BufferedSink; HSPLokio/RealBufferedSink;->writeDecimalLong(J)Lokio/BufferedSink; -HSPLokio/RealBufferedSink;->writeInt(I)Lokio/BufferedSink; -HSPLokio/RealBufferedSink;->writeShort(I)Lokio/BufferedSink; HSPLokio/RealBufferedSink;->writeUtf8(Ljava/lang/String;)Lokio/BufferedSink; -HSPLokio/RealBufferedSource$inputStream$1;->(Lokio/RealBufferedSource;)V -HSPLokio/RealBufferedSource$inputStream$1;->read([BII)I HSPLokio/RealBufferedSource;->(Lokio/Source;)V -HSPLokio/RealBufferedSource;->close()V -HSPLokio/RealBufferedSource;->exhausted()Z -HSPLokio/RealBufferedSource;->getBuffer()Lokio/Buffer; -HSPLokio/RealBufferedSource;->indexOf(BJJ)J -HSPLokio/RealBufferedSource;->rangeEquals(JLokio/ByteString;)Z -HSPLokio/RealBufferedSource;->read(Lokio/Buffer;J)J -HSPLokio/RealBufferedSource;->readAll(Lokio/RealBufferedSink;)J -HSPLokio/RealBufferedSource;->readByte()B -HSPLokio/RealBufferedSource;->readByteString(J)Lokio/ByteString; -HSPLokio/RealBufferedSource;->readInt()I -HSPLokio/RealBufferedSource;->readShort()S -HSPLokio/RealBufferedSource;->readUtf8LineStrict()Ljava/lang/String; -HSPLokio/RealBufferedSource;->readUtf8LineStrict(J)Ljava/lang/String; -HSPLokio/RealBufferedSource;->request(J)Z -HSPLokio/RealBufferedSource;->require(J)V -HSPLokio/RealBufferedSource;->skip(J)V HSPLokio/Segment;->()V HSPLokio/Segment;->([BIIZ)V HSPLokio/Segment;->pop()Lokio/Segment; HSPLokio/Segment;->push(Lokio/Segment;)V -HSPLokio/Segment;->sharedCopy()Lokio/Segment; HSPLokio/Segment;->writeTo(Lokio/Segment;I)V HSPLokio/SegmentPool;->()V HSPLokio/SegmentPool;->recycle(Lokio/Segment;)V HSPLokio/SegmentPool;->take()Lokio/Segment; HSPLokio/SocketAsyncTimeout;->(Ljava/net/Socket;)V HSPLokio/Timeout$Companion$NONE$1;->()V -HSPLokio/Timeout$Companion$NONE$1;->throwIfReached()V HSPLokio/Timeout;->()V HSPLokio/Timeout;->()V HSPLokio/Timeout;->throwIfReached()V @@ -9225,7 +8605,6 @@ HSPLokio/internal/ResourceFileSystem$roots$2;->(Ljava/lang/ClassLoader;)V HSPLokio/internal/ResourceFileSystem;->()V HSPLokio/internal/ResourceFileSystem;->(Ljava/lang/ClassLoader;)V HSPLokio/internal/_BufferKt;->()V -HSPLokio/internal/_BufferKt;->readUtf8Line(Lokio/Buffer;J)Ljava/lang/String; HSPLokio/internal/_ByteStringKt;->()V HSPLokio/internal/_ByteStringKt;->access$decodeHexDigit(C)I HSPLokio/internal/_PathKt;->()V @@ -9265,10 +8644,11 @@ Landroidx/activity/contextaware/ContextAwareHelper; Landroidx/activity/contextaware/OnContextAvailableListener; Landroidx/activity/result/ActivityResult$$ExternalSyntheticOutline0; Landroidx/activity/result/ActivityResultRegistry; -Landroidx/appcompat/R$styleable; +Landroidx/appcompat/R$bool; +Landroidx/appcompat/R$style; +Landroidx/appcompat/resources/R$drawable; Landroidx/appcompat/view/SupportMenuInflater$$ExternalSyntheticOutline0; Landroidx/appcompat/widget/AppCompatTextHelper$Api28Impl$$ExternalSyntheticApiModelOutline0; -Landroidx/appcompat/widget/TooltipCompatHandler$$ExternalSyntheticLambda1; Landroidx/arch/core/executor/ArchTaskExecutor$2; Landroidx/arch/core/executor/ArchTaskExecutor; Landroidx/arch/core/executor/DefaultTaskExecutor$$ExternalSyntheticApiModelOutline0; @@ -9287,13 +8667,11 @@ Landroidx/collection/ArrayMap$KeyIterator; Landroidx/collection/ArrayMap$KeySet; Landroidx/collection/ArrayMap; Landroidx/collection/ArraySet; -Landroidx/collection/ContainerHelpers; Landroidx/collection/IndexBasedArrayIterator; Landroidx/collection/LruCache; Landroidx/collection/SimpleArrayMap; Landroidx/collection/SparseArrayCompat; Landroidx/collection/SparseArrayKt$valueIterator$1; -Landroidx/collection/SparseArrayKt; Landroidx/compose/animation/AnimatedEnterExitMeasurePolicy$measure$1; Landroidx/compose/animation/AnimatedEnterExitMeasurePolicy; Landroidx/compose/animation/AnimatedVisibilityKt$$ExternalSyntheticOutline0; @@ -9309,6 +8687,7 @@ Landroidx/compose/animation/AnimatedVisibilityScope; Landroidx/compose/animation/AnimatedVisibilityScopeImpl; Landroidx/compose/animation/ColorVectorConverterKt$ColorToVector$1$1; Landroidx/compose/animation/ColorVectorConverterKt$ColorToVector$1$2; +Landroidx/compose/animation/ColorVectorConverterKt; Landroidx/compose/animation/CrossfadeKt$$ExternalSyntheticOutline0; Landroidx/compose/animation/CrossfadeKt$Crossfade$2; Landroidx/compose/animation/CrossfadeKt$Crossfade$3; @@ -9336,7 +8715,6 @@ Landroidx/compose/animation/Fade; Landroidx/compose/animation/FlingCalculator; Landroidx/compose/animation/FlingCalculatorKt; Landroidx/compose/animation/LayoutModifierWithPassThroughIntrinsics; -Landroidx/compose/animation/Scale; Landroidx/compose/animation/SingleValueAnimationKt; Landroidx/compose/animation/Slide; Landroidx/compose/animation/SlideModifier$measure$1$slideOffset$1; @@ -9362,7 +8740,6 @@ Landroidx/compose/animation/core/AnimationScope; Landroidx/compose/animation/core/AnimationSpec; Landroidx/compose/animation/core/AnimationSpecKt; Landroidx/compose/animation/core/AnimationState; -Landroidx/compose/animation/core/AnimationStateKt; Landroidx/compose/animation/core/AnimationVector1D; Landroidx/compose/animation/core/AnimationVector2D; Landroidx/compose/animation/core/AnimationVector4D; @@ -9519,7 +8896,6 @@ Landroidx/compose/foundation/FocusableKt; Landroidx/compose/foundation/FocusedBoundsKt$ModifierLocalFocusedBoundsObserver$1; Landroidx/compose/foundation/FocusedBoundsKt$onFocusedBoundsChanged$2; Landroidx/compose/foundation/FocusedBoundsKt; -Landroidx/compose/foundation/FocusedBoundsModifier; Landroidx/compose/foundation/FocusedBoundsObserverModifier; Landroidx/compose/foundation/HoverableKt$hoverable$2$1$1$invoke$$inlined$onDispose$1; Landroidx/compose/foundation/HoverableKt$hoverable$2$1$1; @@ -9544,6 +8920,7 @@ Landroidx/compose/foundation/OverscrollEffect; Landroidx/compose/foundation/OverscrollKt; Landroidx/compose/foundation/PinnableParentConsumer; Landroidx/compose/foundation/gestures/AndroidConfig; +Landroidx/compose/foundation/gestures/AndroidScrollable_androidKt; Landroidx/compose/foundation/gestures/ContentInViewModifier$modifier$1; Landroidx/compose/foundation/gestures/ContentInViewModifier; Landroidx/compose/foundation/gestures/DefaultFlingBehavior; @@ -9691,54 +9068,6 @@ Landroidx/compose/foundation/layout/WindowInsetsSizeKt$windowInsetsBottomHeight$ Landroidx/compose/foundation/layout/WindowInsetsSizeKt; Landroidx/compose/foundation/layout/WrapContentModifier; Landroidx/compose/foundation/lazy/AwaitFirstLayoutModifier; -Landroidx/compose/foundation/lazy/DataIndex; -Landroidx/compose/foundation/lazy/EmptyLazyListLayoutInfo; -Landroidx/compose/foundation/lazy/LazyDslKt; -Landroidx/compose/foundation/lazy/LazyItemScope; -Landroidx/compose/foundation/lazy/LazyItemScopeImpl; -Landroidx/compose/foundation/lazy/LazyListBeyondBoundsInfo$Interval; -Landroidx/compose/foundation/lazy/LazyListBeyondBoundsInfo; -Landroidx/compose/foundation/lazy/LazyListBeyondBoundsModifierLocal; -Landroidx/compose/foundation/lazy/LazyListIntervalContent; -Landroidx/compose/foundation/lazy/LazyListItemInfo; -Landroidx/compose/foundation/lazy/LazyListItemPlacementAnimator; -Landroidx/compose/foundation/lazy/LazyListItemProvider; -Landroidx/compose/foundation/lazy/LazyListItemProviderImpl$1; -Landroidx/compose/foundation/lazy/LazyListItemProviderImpl; -Landroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProvider$1$1; -Landroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProvider$1$itemProviderState$1; -Landroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProvider$nearestItemsRangeState$1$1; -Landroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProvider$nearestItemsRangeState$2; -Landroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProvider$nearestItemsRangeState$3; -Landroidx/compose/foundation/lazy/LazyListKt$ScrollPositionUpdater$1; -Landroidx/compose/foundation/lazy/LazyListKt$rememberLazyListMeasurePolicy$1$1$2; -Landroidx/compose/foundation/lazy/LazyListKt$rememberLazyListMeasurePolicy$1$1$measuredItemProvider$1; -Landroidx/compose/foundation/lazy/LazyListKt$rememberLazyListMeasurePolicy$1$1; -Landroidx/compose/foundation/lazy/LazyListKt; -Landroidx/compose/foundation/lazy/LazyListLayoutInfo; -Landroidx/compose/foundation/lazy/LazyListMeasureKt$measureLazyList$1; -Landroidx/compose/foundation/lazy/LazyListMeasureKt$measureLazyList$3; -Landroidx/compose/foundation/lazy/LazyListMeasureResult; -Landroidx/compose/foundation/lazy/LazyListPinningModifier$Companion$EmptyPinnedItemsHandle$1; -Landroidx/compose/foundation/lazy/LazyListPinningModifier; -Landroidx/compose/foundation/lazy/LazyListPlaceableWrapper; -Landroidx/compose/foundation/lazy/LazyListPositionedItem; -Landroidx/compose/foundation/lazy/LazyListScope; -Landroidx/compose/foundation/lazy/LazyListScopeImpl; -Landroidx/compose/foundation/lazy/LazyListScrollPosition; -Landroidx/compose/foundation/lazy/LazyListState$Companion$Saver$1; -Landroidx/compose/foundation/lazy/LazyListState$Companion$Saver$2; -Landroidx/compose/foundation/lazy/LazyListState$remeasurementModifier$1; -Landroidx/compose/foundation/lazy/LazyListState$scrollableState$1; -Landroidx/compose/foundation/lazy/LazyListState; -Landroidx/compose/foundation/lazy/LazyListStateKt$rememberLazyListState$1$1; -Landroidx/compose/foundation/lazy/LazyListStateKt; -Landroidx/compose/foundation/lazy/LazyMeasuredItem; -Landroidx/compose/foundation/lazy/LazyMeasuredItemProvider; -Landroidx/compose/foundation/lazy/LazySemanticsKt$rememberLazyListSemanticState$1$1$scrollAxisRange$1; -Landroidx/compose/foundation/lazy/LazySemanticsKt$rememberLazyListSemanticState$1$1$scrollAxisRange$2; -Landroidx/compose/foundation/lazy/LazySemanticsKt$rememberLazyListSemanticState$1$1; -Landroidx/compose/foundation/lazy/MeasuredItemFactory; Landroidx/compose/foundation/lazy/grid/ComposableSingletons$LazyGridItemProviderKt$lambda-1$1; Landroidx/compose/foundation/lazy/grid/ComposableSingletons$LazyGridItemProviderKt; Landroidx/compose/foundation/lazy/grid/EmptyLazyGridLayoutInfo; @@ -9771,7 +9100,6 @@ Landroidx/compose/foundation/lazy/grid/LazyGridKt$rememberLazyGridMeasurePolicy$ Landroidx/compose/foundation/lazy/grid/LazyGridKt$rememberLazyGridMeasurePolicy$1$1; Landroidx/compose/foundation/lazy/grid/LazyGridKt; Landroidx/compose/foundation/lazy/grid/LazyGridLayoutInfo; -Landroidx/compose/foundation/lazy/grid/LazyGridMeasureKt$measureLazyGrid$1; Landroidx/compose/foundation/lazy/grid/LazyGridMeasureKt$measureLazyGrid$3; Landroidx/compose/foundation/lazy/grid/LazyGridMeasureResult; Landroidx/compose/foundation/lazy/grid/LazyGridPlaceableWrapper; @@ -9856,7 +9184,6 @@ Landroidx/compose/foundation/lazy/layout/LazySaveableStateHolderKt$LazySaveableS Landroidx/compose/foundation/lazy/layout/LazySaveableStateHolderKt$LazySaveableStateHolderProvider$holder$1; Landroidx/compose/foundation/lazy/layout/LazySaveableStateHolderKt; Landroidx/compose/foundation/lazy/layout/MutableIntervalList; -Landroidx/compose/foundation/lazy/layout/PinnableParent$PinnedItemsHandle; Landroidx/compose/foundation/lazy/layout/PinnableParent; Landroidx/compose/foundation/lazy/layout/PinnableParentKt$ModifierLocalPinnableParent$1; Landroidx/compose/foundation/lazy/layout/PinnableParentKt; @@ -9882,7 +9209,6 @@ Landroidx/compose/foundation/selection/SelectableKt; Landroidx/compose/foundation/selection/ToggleableKt$toggleable$2; Landroidx/compose/foundation/selection/ToggleableKt$toggleable$4$1; Landroidx/compose/foundation/selection/ToggleableKt$triStateToggleable$4$1; -Landroidx/compose/foundation/selection/ToggleableKt; Landroidx/compose/foundation/shape/CornerBasedShape; Landroidx/compose/foundation/shape/CornerSize; Landroidx/compose/foundation/shape/DpCornerSize; @@ -9945,7 +9271,6 @@ Landroidx/compose/material/ripple/RippleThemeKt$LocalRippleTheme$1; Landroidx/compose/material/ripple/RippleThemeKt; Landroidx/compose/material/ripple/StateLayer; Landroidx/compose/material3/AlertDialogKt$AlertDialogContent$1$$ExternalSyntheticOutline0; -Landroidx/compose/material3/AppBarKt$$ExternalSyntheticOutline0; Landroidx/compose/material3/AppBarKt$SingleRowTopAppBar$1$1; Landroidx/compose/material3/AppBarKt$SingleRowTopAppBar$2; Landroidx/compose/material3/AppBarKt$SingleRowTopAppBar$3; @@ -9992,7 +9317,6 @@ Landroidx/compose/material3/ComposableSingletons$SnackbarHostKt$lambda-1$1; Landroidx/compose/material3/ComposableSingletons$SnackbarHostKt; Landroidx/compose/material3/ContentColorKt$LocalContentColor$1; Landroidx/compose/material3/ContentColorKt; -Landroidx/compose/material3/DynamicTonalPaletteKt; Landroidx/compose/material3/FabPosition; Landroidx/compose/material3/FadeInFadeOutState; Landroidx/compose/material3/IconButtonColors; @@ -10013,7 +9337,6 @@ Landroidx/compose/material3/MinimumTouchTargetModifier$measure$1; Landroidx/compose/material3/MinimumTouchTargetModifier; Landroidx/compose/material3/NavigationBarDefaults; Landroidx/compose/material3/NavigationBarItemColors; -Landroidx/compose/material3/NavigationBarItemDefaults; Landroidx/compose/material3/NavigationBarKt$NavigationBar$1; Landroidx/compose/material3/NavigationBarKt$NavigationBar$2; Landroidx/compose/material3/NavigationBarKt$NavigationBarItem$2$1; @@ -10200,7 +9523,6 @@ Landroidx/compose/runtime/SlotWriter; Landroidx/compose/runtime/SnapshotMutableStateImpl$StateStateRecord; Landroidx/compose/runtime/SnapshotMutableStateImpl; Landroidx/compose/runtime/SnapshotMutationPolicy; -Landroidx/compose/runtime/SnapshotStateKt; Landroidx/compose/runtime/SnapshotStateKt__DerivedStateKt; Landroidx/compose/runtime/SnapshotStateKt__ProduceStateKt$produceState$3; Landroidx/compose/runtime/SnapshotStateKt__ProduceStateKt$produceState$5; @@ -10215,6 +9537,7 @@ Landroidx/compose/runtime/State; Landroidx/compose/runtime/StaticProvidableCompositionLocal; Landroidx/compose/runtime/StaticValueHolder; Landroidx/compose/runtime/StructuralEqualityPolicy; +Landroidx/compose/runtime/Updater; Landroidx/compose/runtime/collection/IdentityArrayIntMap; Landroidx/compose/runtime/collection/IdentityArrayMap; Landroidx/compose/runtime/collection/IdentityArraySet; @@ -10243,10 +9566,12 @@ Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode; Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNodeBaseIterator; Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNodeEntriesIterator; +Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNodeKt; Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/Links; Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/PersistentOrderedSet; 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$$ExternalSyntheticOutline0; Landroidx/compose/runtime/external/kotlinx/collections/immutable/internal/ListImplementation; Landroidx/compose/runtime/external/kotlinx/collections/immutable/internal/MutabilityOwnership; Landroidx/compose/runtime/internal/ComposableLambdaImpl$invoke$1; @@ -10256,7 +9581,6 @@ Landroidx/compose/runtime/internal/ComposableLambdaKt; Landroidx/compose/runtime/internal/ThreadMap; Landroidx/compose/runtime/internal/ThreadMapKt; Landroidx/compose/runtime/saveable/ListSaverKt$listSaver$1; -Landroidx/compose/runtime/saveable/ListSaverKt; Landroidx/compose/runtime/saveable/RememberSaveableKt$rememberSaveable$1$invoke$$inlined$onDispose$1; Landroidx/compose/runtime/saveable/RememberSaveableKt$rememberSaveable$1$valueProvider$1$1$1; Landroidx/compose/runtime/saveable/RememberSaveableKt$rememberSaveable$1$valueProvider$1; @@ -10415,7 +9739,6 @@ Landroidx/compose/ui/focus/FocusStateImpl; Landroidx/compose/ui/focus/FocusTransactionsKt; Landroidx/compose/ui/geometry/CornerRadius; Landroidx/compose/ui/geometry/CornerRadiusKt; -Landroidx/compose/ui/geometry/MutableRect; Landroidx/compose/ui/geometry/Offset; Landroidx/compose/ui/geometry/OffsetKt; Landroidx/compose/ui/geometry/Rect; @@ -10616,7 +9939,6 @@ Landroidx/compose/ui/input/pointer/MotionEventAdapter; Landroidx/compose/ui/input/pointer/Node; Landroidx/compose/ui/input/pointer/NodeParent; Landroidx/compose/ui/input/pointer/PointerEvent; -Landroidx/compose/ui/input/pointer/PointerEventKt; Landroidx/compose/ui/input/pointer/PointerEventPass; Landroidx/compose/ui/input/pointer/PointerIconService; Landroidx/compose/ui/input/pointer/PointerInputChangeEventProducer; @@ -10661,7 +9983,6 @@ Landroidx/compose/ui/layout/IntermediateLayoutModifier; Landroidx/compose/ui/layout/IntrinsicMeasurable; Landroidx/compose/ui/layout/IntrinsicMeasureScope; Landroidx/compose/ui/layout/LayoutCoordinates; -Landroidx/compose/ui/layout/LayoutCoordinatesKt; Landroidx/compose/ui/layout/LayoutId; Landroidx/compose/ui/layout/LayoutIdKt; Landroidx/compose/ui/layout/LayoutIdParentData; @@ -10676,7 +9997,6 @@ Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState$createMeasurePolicy$1 Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState$createMeasurePolicy$1; Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState$subcompose$2$1$1; Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState; -Landroidx/compose/ui/layout/LookaheadLayoutCoordinatesImpl; Landroidx/compose/ui/layout/LookaheadOnPlacedModifier; Landroidx/compose/ui/layout/Measurable; Landroidx/compose/ui/layout/MeasurePolicy; @@ -10843,13 +10163,11 @@ Landroidx/compose/ui/platform/AndroidComposeView$snapshotObserver$1; Landroidx/compose/ui/platform/AndroidComposeView; Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$$ExternalSyntheticLambda0; Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$1; -Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$Api24Impl; Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$MyNodeProvider; Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$SemanticsNodeCopy; Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$boundsUpdatesEventLoop$1; Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$sendScrollEventIfNeededLambda$1; Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat; -Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat_androidKt; Landroidx/compose/ui/platform/AndroidComposeViewForceDarkModeQ$$ExternalSyntheticApiModelOutline0; Landroidx/compose/ui/platform/AndroidComposeViewForceDarkModeQ; Landroidx/compose/ui/platform/AndroidComposeViewVerificationHelperMethodsO$$ExternalSyntheticApiModelOutline0; @@ -10881,9 +10199,7 @@ Landroidx/compose/ui/platform/AndroidUiFrameClock$withFrameNanos$2$callback$1; Landroidx/compose/ui/platform/AndroidUiFrameClock; Landroidx/compose/ui/platform/AndroidUriHandler; Landroidx/compose/ui/platform/AndroidViewConfiguration; -Landroidx/compose/ui/platform/AndroidViewsHandler; Landroidx/compose/ui/platform/CalculateMatrixToWindow; -Landroidx/compose/ui/platform/CalculateMatrixToWindowApi29$$ExternalSyntheticApiModelOutline0; Landroidx/compose/ui/platform/CalculateMatrixToWindowApi29; Landroidx/compose/ui/platform/ClipboardManager; Landroidx/compose/ui/platform/ComposableSingletons$Wrapper_androidKt$lambda-1$1; @@ -10927,7 +10243,6 @@ Landroidx/compose/ui/platform/InspectableValueKt; Landroidx/compose/ui/platform/InspectionModeKt$LocalInspectionMode$1; Landroidx/compose/ui/platform/InspectionModeKt; Landroidx/compose/ui/platform/InspectorValueInfo; -Landroidx/compose/ui/platform/InvertMatrixKt; Landroidx/compose/ui/platform/LayerMatrixCache; Landroidx/compose/ui/platform/MotionDurationScaleImpl; Landroidx/compose/ui/platform/OutlineResolver; @@ -10937,7 +10252,6 @@ Landroidx/compose/ui/platform/RenderNodeApi29VerificationHelper$$ExternalSynthet Landroidx/compose/ui/platform/RenderNodeApi29VerificationHelper; Landroidx/compose/ui/platform/RenderNodeLayer$Companion$getMatrix$1; Landroidx/compose/ui/platform/RenderNodeLayer; -Landroidx/compose/ui/platform/SemanticsNodeWithAdjustedBounds; Landroidx/compose/ui/platform/TestTagKt$testTag$1; Landroidx/compose/ui/platform/TestTagKt; Landroidx/compose/ui/platform/TextToolbar; @@ -10977,7 +10291,6 @@ Landroidx/compose/ui/platform/WrapperRenderNodeLayerHelperMethods; Landroidx/compose/ui/platform/WrapperVerificationHelperMethods$$ExternalSyntheticApiModelOutline0; Landroidx/compose/ui/platform/WrapperVerificationHelperMethods; Landroidx/compose/ui/platform/Wrapper_androidKt; -Landroidx/compose/ui/platform/accessibility/CollectionInfoKt; Landroidx/compose/ui/res/ImageVectorCache$ImageVectorEntry; Landroidx/compose/ui/res/ImageVectorCache$Key; Landroidx/compose/ui/res/ImageVectorCache; @@ -10985,20 +10298,13 @@ Landroidx/compose/ui/res/PainterResources_androidKt; Landroidx/compose/ui/res/Resources_androidKt; Landroidx/compose/ui/semantics/AccessibilityAction; Landroidx/compose/ui/semantics/CollectionInfo; -Landroidx/compose/ui/semantics/CollectionItemInfo; -Landroidx/compose/ui/semantics/LiveRegionMode; -Landroidx/compose/ui/semantics/NodeLocationHolder; -Landroidx/compose/ui/semantics/ProgressBarRangeInfo; Landroidx/compose/ui/semantics/Role; Landroidx/compose/ui/semantics/ScrollAxisRange; Landroidx/compose/ui/semantics/SemanticsActions; Landroidx/compose/ui/semantics/SemanticsConfiguration; -Landroidx/compose/ui/semantics/SemanticsConfigurationKt; Landroidx/compose/ui/semantics/SemanticsModifier; Landroidx/compose/ui/semantics/SemanticsModifierCore; Landroidx/compose/ui/semantics/SemanticsModifierKt; -Landroidx/compose/ui/semantics/SemanticsNode$emitFakeNodes$fakeNode$1; -Landroidx/compose/ui/semantics/SemanticsNode$fakeSemanticsNode$fakeNode$1; Landroidx/compose/ui/semantics/SemanticsNode; Landroidx/compose/ui/semantics/SemanticsNodeKt; Landroidx/compose/ui/semantics/SemanticsOwner; @@ -11019,7 +10325,6 @@ Landroidx/compose/ui/semantics/SemanticsProperties_androidKt; Landroidx/compose/ui/semantics/SemanticsPropertyKey$1; Landroidx/compose/ui/semantics/SemanticsPropertyKey; Landroidx/compose/ui/semantics/SemanticsPropertyReceiver; -Landroidx/compose/ui/semantics/SemanticsSortKt; Landroidx/compose/ui/state/ToggleableState; Landroidx/compose/ui/text/AndroidParagraph$wordBoundary$2; Landroidx/compose/ui/text/AndroidParagraph; @@ -11050,7 +10355,6 @@ Landroidx/compose/ui/text/android/LayoutIntrinsics$boringMetrics$2; Landroidx/compose/ui/text/android/LayoutIntrinsics$maxIntrinsicWidth$2; Landroidx/compose/ui/text/android/LayoutIntrinsics$minIntrinsicWidth$2; Landroidx/compose/ui/text/android/LayoutIntrinsics; -Landroidx/compose/ui/text/android/SpannedExtensionsKt; Landroidx/compose/ui/text/android/StaticLayoutFactory23; Landroidx/compose/ui/text/android/StaticLayoutFactory26$$ExternalSyntheticApiModelOutline0; Landroidx/compose/ui/text/android/StaticLayoutFactory26; @@ -11071,7 +10375,6 @@ Landroidx/compose/ui/text/android/style/LetterSpacingSpanPx; Landroidx/compose/ui/text/android/style/LineHeightSpan; Landroidx/compose/ui/text/android/style/LineHeightStyleSpan; Landroidx/compose/ui/text/android/style/PlaceholderSpan; -Landroidx/compose/ui/text/caches/ContainerHelpersKt; Landroidx/compose/ui/text/caches/LruCache; Landroidx/compose/ui/text/caches/SimpleArrayMap; Landroidx/compose/ui/text/font/AndroidFontLoader; @@ -11099,7 +10402,6 @@ 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/SystemFontFamily; Landroidx/compose/ui/text/font/TypefaceRequest; Landroidx/compose/ui/text/font/TypefaceRequestCache$runCached$currentTypefaceResult$1; @@ -11147,6 +10449,7 @@ Landroidx/compose/ui/text/style/TextForegroundStyle$merge$2; Landroidx/compose/ui/text/style/TextForegroundStyle; Landroidx/compose/ui/text/style/TextGeometricTransform; Landroidx/compose/ui/text/style/TextIndent; +Landroidx/compose/ui/unit/AndroidDensity_androidKt; Landroidx/compose/ui/unit/Constraints$Companion; Landroidx/compose/ui/unit/Constraints; Landroidx/compose/ui/unit/Density; @@ -11165,34 +10468,23 @@ Landroidx/compose/ui/unit/LayoutDirection; Landroidx/compose/ui/unit/TextUnit; Landroidx/compose/ui/unit/TextUnitKt; Landroidx/compose/ui/unit/TextUnitType; -Landroidx/compose/ui/viewinterop/AndroidViewHolder; +Landroidx/compose/ui/util/MathHelpersKt; Landroidx/compose/ui/window/DialogWindowProvider; -Landroidx/compose/ui/window/PopupLayoutHelper; -Landroidx/compose/ui/window/PopupLayoutHelperImpl; +Landroidx/core/R$id; Landroidx/core/app/ComponentActivity; Landroidx/core/app/CoreComponentFactory$CompatWrapped; Landroidx/core/app/CoreComponentFactory; Landroidx/core/content/ContextCompat$Api23Impl; Landroidx/core/content/ContextCompat; +Landroidx/core/content/PermissionChecker; +Landroidx/core/content/res/CamUtils; Landroidx/core/content/res/ComplexColorCompat; Landroidx/core/content/res/TypedArrayUtils; Landroidx/core/graphics/Insets; -Landroidx/core/graphics/TypefaceCompat; -Landroidx/core/graphics/TypefaceCompatApi29Impl; -Landroidx/core/graphics/TypefaceCompatBaseImpl; +Landroidx/core/math/MathUtils; Landroidx/core/net/ConnectivityManagerCompat$Api16Impl; Landroidx/core/os/BuildCompat; Landroidx/core/os/HandlerCompat; -Landroidx/core/os/TraceCompat$Api18Impl; -Landroidx/core/os/TraceCompat; -Landroidx/core/provider/CalleeHandler; -Landroidx/core/provider/FontProvider$$ExternalSyntheticLambda0; -Landroidx/core/provider/FontProvider$Api16Impl; -Landroidx/core/provider/FontProvider; -Landroidx/core/provider/FontRequest$$ExternalSyntheticOutline0; -Landroidx/core/provider/FontRequest; -Landroidx/core/provider/FontsContractCompat$FontFamilyResult; -Landroidx/core/provider/FontsContractCompat$FontInfo; Landroidx/core/splashscreen/SplashScreen$Impl$$ExternalSyntheticLambda0; Landroidx/core/splashscreen/SplashScreen$Impl31$hierarchyListener$1; Landroidx/core/splashscreen/SplashScreen$Impl31$setKeepOnScreenCondition$1; @@ -11201,19 +10493,18 @@ Landroidx/core/splashscreen/SplashScreen$Impl; Landroidx/core/splashscreen/SplashScreen$KeepOnScreenCondition; Landroidx/core/util/Consumer; Landroidx/core/util/DebugUtils; -Landroidx/core/util/Preconditions; Landroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter; Landroidx/core/view/AccessibilityDelegateCompat; +Landroidx/core/view/DisplayCutoutCompat$Api30Impl$$ExternalSyntheticApiModelOutline0; +Landroidx/core/view/DisplayCutoutCompat$Api30Impl; +Landroidx/core/view/DisplayCutoutCompat; Landroidx/core/view/KeyEventDispatcher$Component; Landroidx/core/view/MenuHostHelper; -Landroidx/core/view/NestedScrollingParent2; -Landroidx/core/view/NestedScrollingParent3; Landroidx/core/view/OnApplyWindowInsetsListener; Landroidx/core/view/OnReceiveContentViewBehavior; Landroidx/core/view/OneShotPreDrawListener; Landroidx/core/view/ViewCompat$$ExternalSyntheticLambda0; Landroidx/core/view/ViewCompat$AccessibilityPaneVisibilityManager; -Landroidx/core/view/ViewCompat$Api16Impl; Landroidx/core/view/ViewCompat$Api19Impl; Landroidx/core/view/ViewCompat$Api21Impl$1; Landroidx/core/view/ViewCompat$Api21Impl; @@ -11244,22 +10535,7 @@ Landroidx/core/view/WindowInsetsControllerCompat$Impl30$$ExternalSyntheticApiMod Landroidx/core/view/WindowInsetsControllerCompat$Impl30; Landroidx/core/view/WindowInsetsControllerCompat$Impl; Landroidx/core/view/WindowInsetsControllerCompat; -Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$$ExternalSyntheticApiModelOutline0; -Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$$ExternalSyntheticApiModelOutline1; -Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$$ExternalSyntheticApiModelOutline2; -Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$$ExternalSyntheticApiModelOutline4; -Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$$ExternalSyntheticApiModelOutline5; -Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat; -Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat; Landroidx/core/view/accessibility/AccessibilityNodeProviderCompat; -Landroidx/core/view/accessibility/AccessibilityViewCommand$CommandArguments; -Landroidx/core/view/accessibility/AccessibilityViewCommand$MoveAtGranularityArguments; -Landroidx/core/view/accessibility/AccessibilityViewCommand$MoveHtmlArguments; -Landroidx/core/view/accessibility/AccessibilityViewCommand$MoveWindowArguments; -Landroidx/core/view/accessibility/AccessibilityViewCommand$ScrollToPositionArguments; -Landroidx/core/view/accessibility/AccessibilityViewCommand$SetProgressArguments; -Landroidx/core/view/accessibility/AccessibilityViewCommand$SetSelectionArguments; -Landroidx/core/view/accessibility/AccessibilityViewCommand$SetTextArguments; Landroidx/customview/poolingcontainer/PoolingContainer; Landroidx/customview/poolingcontainer/PoolingContainerListener; Landroidx/customview/poolingcontainer/PoolingContainerListenerHolder; @@ -11307,32 +10583,19 @@ Landroidx/datastore/core/SingleProcessDataStore; Landroidx/datastore/core/State; Landroidx/datastore/core/UnInitialized; Landroidx/datastore/core/handlers/NoOpCorruptionHandler; -Landroidx/emoji2/text/ConcurrencyHelpers$$ExternalSyntheticLambda0; Landroidx/emoji2/text/ConcurrencyHelpers$Handler28Impl; -Landroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigHelper; -Landroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigHelper_API19; -Landroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigHelper_API28; -Landroidx/emoji2/text/DefaultEmojiCompatConfig; Landroidx/emoji2/text/DefaultGlyphChecker; -Landroidx/emoji2/text/EmojiCompat$CompatInternal19$1; Landroidx/emoji2/text/EmojiCompat$CompatInternal19; Landroidx/emoji2/text/EmojiCompat$CompatInternal; Landroidx/emoji2/text/EmojiCompat$Config; Landroidx/emoji2/text/EmojiCompat$GlyphChecker; Landroidx/emoji2/text/EmojiCompat$MetadataRepoLoader; -Landroidx/emoji2/text/EmojiCompat$MetadataRepoLoaderCallback; Landroidx/emoji2/text/EmojiCompat; Landroidx/emoji2/text/EmojiCompatInitializer$1; Landroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultConfig; -Landroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultLoader$$ExternalSyntheticLambda0; -Landroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultLoader$1; Landroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultLoader; Landroidx/emoji2/text/EmojiCompatInitializer$LoadEmojiCompatRunnable; Landroidx/emoji2/text/EmojiCompatInitializer; -Landroidx/emoji2/text/FontRequestEmojiCompatConfig$FontProviderHelper; -Landroidx/emoji2/text/FontRequestEmojiCompatConfig$FontRequestMetadataLoader$$ExternalSyntheticLambda0; -Landroidx/emoji2/text/FontRequestEmojiCompatConfig$FontRequestMetadataLoader; -Landroidx/emoji2/text/FontRequestEmojiCompatConfig; Landroidx/hilt/navigation/compose/HiltViewModelKt; Landroidx/hilt/work/HiltWorkerFactory; Landroidx/hilt/work/WorkerAssistedFactory; @@ -11360,7 +10623,6 @@ Landroidx/lifecycle/LifecycleCoroutineScopeImpl; Landroidx/lifecycle/LifecycleDispatcher$DispatcherActivityCallback; Landroidx/lifecycle/LifecycleDispatcher; Landroidx/lifecycle/LifecycleEventObserver; -Landroidx/lifecycle/LifecycleKt; Landroidx/lifecycle/LifecycleObserver; Landroidx/lifecycle/LifecycleOwner; Landroidx/lifecycle/LifecycleRegistry$ObserverWithState; @@ -11410,6 +10672,7 @@ Landroidx/lifecycle/SavedStateViewModelFactory; Landroidx/lifecycle/SavedStateViewModelFactoryKt; Landroidx/lifecycle/Transformations$1; Landroidx/lifecycle/ViewModel; +Landroidx/lifecycle/ViewModelKt; Landroidx/lifecycle/ViewModelLazy; Landroidx/lifecycle/ViewModelProvider$AndroidViewModelFactory$Companion$ApplicationKeyImpl; Landroidx/lifecycle/ViewModelProvider$AndroidViewModelFactory; @@ -11420,11 +10683,11 @@ Landroidx/lifecycle/ViewModelProvider$OnRequeryFactory; Landroidx/lifecycle/ViewModelProvider; Landroidx/lifecycle/ViewModelStore; Landroidx/lifecycle/ViewModelStoreOwner; -Landroidx/lifecycle/ViewTreeViewModelStoreOwner; Landroidx/lifecycle/compose/FlowExtKt$collectAsStateWithLifecycle$1$1$1; Landroidx/lifecycle/compose/FlowExtKt$collectAsStateWithLifecycle$1$1; Landroidx/lifecycle/compose/FlowExtKt$collectAsStateWithLifecycle$1; Landroidx/lifecycle/compose/FlowExtKt; +Landroidx/lifecycle/runtime/R$id; Landroidx/lifecycle/viewmodel/CreationExtras$Empty; Landroidx/lifecycle/viewmodel/CreationExtras; Landroidx/lifecycle/viewmodel/InitializerViewModelFactory; @@ -11451,7 +10714,6 @@ Landroidx/metrics/performance/OnFrameListenerDelegate; Landroidx/metrics/performance/PerformanceMetricsState$Holder; Landroidx/metrics/performance/PerformanceMetricsState$StateData; Landroidx/metrics/performance/PerformanceMetricsState; -Landroidx/metrics/performance/R$id; Landroidx/metrics/performance/StateInfo; Landroidx/navigation/ActivityNavigator$hostActivity$1; Landroidx/navigation/ActivityNavigator; @@ -11531,6 +10793,7 @@ Landroidx/navigation/compose/NavHostKt$NavHost$lambda-4$$inlined$map$1$2; Landroidx/navigation/compose/NavHostKt$NavHost$lambda-4$$inlined$map$1; Landroidx/navigation/compose/NavHostKt; Landroidx/profileinstaller/ProfileInstallerInitializer$$ExternalSyntheticLambda0; +Landroidx/profileinstaller/ProfileInstallerInitializer$$ExternalSyntheticLambda1; Landroidx/profileinstaller/ProfileInstallerInitializer$Choreographer16Impl$$ExternalSyntheticLambda0; Landroidx/profileinstaller/ProfileInstallerInitializer$Choreographer16Impl; Landroidx/profileinstaller/ProfileInstallerInitializer$Handler28Impl; @@ -11616,7 +10879,7 @@ Landroidx/sqlite/util/ProcessLock; Landroidx/startup/AppInitializer; Landroidx/startup/InitializationProvider; Landroidx/startup/Initializer; -Landroidx/startup/R$string; +Landroidx/startup/StartupLogger; Landroidx/tracing/Trace; Landroidx/tracing/TraceApi29Impl$$ExternalSyntheticApiModelOutline0; Landroidx/tracing/TraceApi29Impl$$ExternalSyntheticApiModelOutline1; @@ -11821,6 +11084,7 @@ Lcoil/RealImageLoader$executeMain$1; Lcoil/RealImageLoader$executeMain$result$1; Lcoil/RealImageLoader$special$$inlined$CoroutineExceptionHandler$1; Lcoil/RealImageLoader; +Lcoil/base/R$id; Lcoil/compose/AsyncImageKt$AsyncImage$2; Lcoil/compose/AsyncImageKt$Content$$inlined$Layout$1; Lcoil/compose/AsyncImageKt$Content$1$measure$1; @@ -11851,39 +11115,22 @@ Lcoil/compose/LocalImageLoaderKt; Lcoil/compose/SingletonAsyncImageKt; Lcoil/compose/UtilsKt$transformOf$1; Lcoil/compose/UtilsKt; -Lcoil/decode/BitmapFactoryDecoder$ExceptionCatchingSource; Lcoil/decode/BitmapFactoryDecoder$Factory; -Lcoil/decode/BitmapFactoryDecoder$decode$1; -Lcoil/decode/BitmapFactoryDecoder$decode$2$1; -Lcoil/decode/BitmapFactoryDecoder; Lcoil/decode/Decoder$Factory; -Lcoil/decode/Decoder; -Lcoil/decode/ExifUtils; -Lcoil/decode/ExifUtilsKt; -Lcoil/decode/FileImageSource; -Lcoil/decode/ImageSource; -Lcoil/decode/ImageSources; -Lcoil/decode/SvgDecodeUtils; Lcoil/decode/SvgDecoder$Factory; Lcoil/disk/DiskCache$Builder; -Lcoil/disk/DiskCache$Snapshot; Lcoil/disk/DiskCache; -Lcoil/disk/DiskLruCache$Editor; Lcoil/disk/DiskLruCache$Entry; -Lcoil/disk/DiskLruCache$Snapshot; Lcoil/disk/DiskLruCache$fileSystem$1; Lcoil/disk/DiskLruCache$newJournalWriter$faultHidingSink$1; Lcoil/disk/DiskLruCache; Lcoil/disk/FaultHidingSink; -Lcoil/disk/RealDiskCache$RealEditor; -Lcoil/disk/RealDiskCache$RealSnapshot; Lcoil/disk/RealDiskCache; Lcoil/fetch/AssetUriFetcher$Factory; Lcoil/fetch/BitmapFetcher$Factory; Lcoil/fetch/ByteBufferFetcher$Factory; Lcoil/fetch/ContentUriFetcher$Factory; Lcoil/fetch/DrawableFetcher$Factory; -Lcoil/fetch/FetchResult; Lcoil/fetch/Fetcher$Factory; Lcoil/fetch/Fetcher; Lcoil/fetch/FileFetcher$Factory; @@ -11892,10 +11139,7 @@ Lcoil/fetch/HttpUriFetcher$executeNetworkRequest$1; Lcoil/fetch/HttpUriFetcher$fetch$1; Lcoil/fetch/HttpUriFetcher; Lcoil/fetch/ResourceUriFetcher$Factory; -Lcoil/fetch/SourceResult; -Lcoil/intercept/EngineInterceptor$decode$1; Lcoil/intercept/EngineInterceptor$execute$1; -Lcoil/intercept/EngineInterceptor$execute$executeResult$1; Lcoil/intercept/EngineInterceptor$fetch$1; Lcoil/intercept/EngineInterceptor$intercept$1; Lcoil/intercept/EngineInterceptor$intercept$2; @@ -11925,11 +11169,9 @@ Lcoil/memory/RealStrongMemoryCache; Lcoil/memory/RealWeakMemoryCache; Lcoil/memory/StrongMemoryCache; Lcoil/memory/WeakMemoryCache; -Lcoil/network/CacheResponse$cacheControl$2; -Lcoil/network/CacheResponse$contentType$2; -Lcoil/network/CacheResponse; Lcoil/network/CacheStrategy$Factory; Lcoil/network/CacheStrategy; +Lcoil/network/EmptyNetworkObserver; Lcoil/network/NetworkObserver$Listener; Lcoil/network/NetworkObserver; Lcoil/network/RealNetworkObserver$networkCallback$1; @@ -11970,7 +11212,6 @@ Lcoil/util/ImageLoaderOptions; Lcoil/util/ImmutableHardwareBitmapService; Lcoil/util/SingletonDiskCache; Lcoil/util/SystemCallbacks; -Lcom/caverock/androidsvg/CSSParser$Source$EnumUnboxingLocalUtility; Lcom/google/accompanist/systemuicontroller/AndroidSystemUiController; Lcom/google/accompanist/systemuicontroller/SystemUiController; Lcom/google/accompanist/systemuicontroller/SystemUiControllerKt; @@ -12095,17 +11336,7 @@ Lcom/google/samples/apps/nowinandroid/core/data/SyncUtilitiesKt$changeListSync$2 Lcom/google/samples/apps/nowinandroid/core/data/SyncUtilitiesKt$suspendRunCatching$1; Lcom/google/samples/apps/nowinandroid/core/data/SyncUtilitiesKt; Lcom/google/samples/apps/nowinandroid/core/data/Synchronizer; -Lcom/google/samples/apps/nowinandroid/core/data/repository/AuthorsRepository; Lcom/google/samples/apps/nowinandroid/core/data/repository/NewsRepository; -Lcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstAuthorsRepository$getAuthors$$inlined$map$1$2$1; -Lcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstAuthorsRepository$getAuthors$$inlined$map$1$2; -Lcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstAuthorsRepository$getAuthors$$inlined$map$1; -Lcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstAuthorsRepository$syncWith$2; -Lcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstAuthorsRepository$syncWith$3; -Lcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstAuthorsRepository$syncWith$4; -Lcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstAuthorsRepository$syncWith$5; -Lcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstAuthorsRepository$syncWith$6; -Lcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstAuthorsRepository; Lcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepository$syncWith$2; Lcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepository$syncWith$3; Lcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepository$syncWith$4; @@ -12128,10 +11359,11 @@ Lcom/google/samples/apps/nowinandroid/core/data/util/ConnectivityManagerNetworkM Lcom/google/samples/apps/nowinandroid/core/data/util/ConnectivityManagerNetworkMonitor$isOnline$1; Lcom/google/samples/apps/nowinandroid/core/data/util/ConnectivityManagerNetworkMonitor; Lcom/google/samples/apps/nowinandroid/core/data/util/NetworkMonitor; -Lcom/google/samples/apps/nowinandroid/core/database/DatabaseMigrations$Schema10to11; +Lcom/google/samples/apps/nowinandroid/core/database/DatabaseMigrations$Schema11to12; Lcom/google/samples/apps/nowinandroid/core/database/DatabaseMigrations$Schema2to3; Lcom/google/samples/apps/nowinandroid/core/database/NiaDatabase; Lcom/google/samples/apps/nowinandroid/core/database/NiaDatabase_AutoMigration_10_11_Impl; +Lcom/google/samples/apps/nowinandroid/core/database/NiaDatabase_AutoMigration_11_12_Impl; Lcom/google/samples/apps/nowinandroid/core/database/NiaDatabase_AutoMigration_1_2_Impl; Lcom/google/samples/apps/nowinandroid/core/database/NiaDatabase_AutoMigration_2_3_Impl; Lcom/google/samples/apps/nowinandroid/core/database/NiaDatabase_AutoMigration_3_4_Impl; @@ -12143,26 +11375,14 @@ Lcom/google/samples/apps/nowinandroid/core/database/NiaDatabase_AutoMigration_8_ Lcom/google/samples/apps/nowinandroid/core/database/NiaDatabase_AutoMigration_9_10_Impl; Lcom/google/samples/apps/nowinandroid/core/database/NiaDatabase_Impl$1; Lcom/google/samples/apps/nowinandroid/core/database/NiaDatabase_Impl; -Lcom/google/samples/apps/nowinandroid/core/database/dao/AuthorDao; -Lcom/google/samples/apps/nowinandroid/core/database/dao/AuthorDao_Impl$10; -Lcom/google/samples/apps/nowinandroid/core/database/dao/AuthorDao_Impl$1; -Lcom/google/samples/apps/nowinandroid/core/database/dao/AuthorDao_Impl$2; -Lcom/google/samples/apps/nowinandroid/core/database/dao/AuthorDao_Impl$3; -Lcom/google/samples/apps/nowinandroid/core/database/dao/AuthorDao_Impl$4; -Lcom/google/samples/apps/nowinandroid/core/database/dao/AuthorDao_Impl$5; -Lcom/google/samples/apps/nowinandroid/core/database/dao/AuthorDao_Impl$7; -Lcom/google/samples/apps/nowinandroid/core/database/dao/AuthorDao_Impl$9; -Lcom/google/samples/apps/nowinandroid/core/database/dao/AuthorDao_Impl; Lcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao; -Lcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl$11; -Lcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl$14; +Lcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl$12; Lcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl$1; Lcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl$2; Lcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl$3; Lcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl$4; Lcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl$5; -Lcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl$6; -Lcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl$8; +Lcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl$7; Lcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl$9; Lcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl; Lcom/google/samples/apps/nowinandroid/core/database/dao/TopicDao; @@ -12175,9 +11395,6 @@ Lcom/google/samples/apps/nowinandroid/core/database/dao/TopicDao_Impl$5; Lcom/google/samples/apps/nowinandroid/core/database/dao/TopicDao_Impl$7; Lcom/google/samples/apps/nowinandroid/core/database/dao/TopicDao_Impl$9; Lcom/google/samples/apps/nowinandroid/core/database/dao/TopicDao_Impl; -Lcom/google/samples/apps/nowinandroid/core/database/model/AuthorEntity; -Lcom/google/samples/apps/nowinandroid/core/database/model/AuthorEntityKt; -Lcom/google/samples/apps/nowinandroid/core/database/model/NewsResourceAuthorCrossRef; Lcom/google/samples/apps/nowinandroid/core/database/model/NewsResourceEntity; Lcom/google/samples/apps/nowinandroid/core/database/model/NewsResourceTopicCrossRef; Lcom/google/samples/apps/nowinandroid/core/database/model/TopicEntity; @@ -12230,6 +11447,7 @@ Lcom/google/samples/apps/nowinandroid/core/designsystem/component/NavigationKt$N Lcom/google/samples/apps/nowinandroid/core/designsystem/component/NavigationKt$NiaNavigationBarItem$1; Lcom/google/samples/apps/nowinandroid/core/designsystem/component/NavigationKt; Lcom/google/samples/apps/nowinandroid/core/designsystem/component/NiaButtonDefaults; +Lcom/google/samples/apps/nowinandroid/core/designsystem/component/NiaNavigationDefaults; Lcom/google/samples/apps/nowinandroid/core/designsystem/component/NiaToggleButtonDefaults; Lcom/google/samples/apps/nowinandroid/core/designsystem/component/ToggleButtonKt$NiaToggleButton$1$1; Lcom/google/samples/apps/nowinandroid/core/designsystem/component/ToggleButtonKt$NiaToggleButton$2$1; @@ -12262,12 +11480,7 @@ Lcom/google/samples/apps/nowinandroid/core/domain/GetFollowableTopicsUseCase$inv Lcom/google/samples/apps/nowinandroid/core/domain/GetFollowableTopicsUseCase; Lcom/google/samples/apps/nowinandroid/core/domain/GetSaveableNewsResourcesUseCase$special$$inlined$map$1; Lcom/google/samples/apps/nowinandroid/core/domain/GetSaveableNewsResourcesUseCase; -Lcom/google/samples/apps/nowinandroid/core/domain/GetSortedFollowableAuthorsUseCase$invoke$1$invokeSuspend$$inlined$sortedBy$1; -Lcom/google/samples/apps/nowinandroid/core/domain/GetSortedFollowableAuthorsUseCase$invoke$1; -Lcom/google/samples/apps/nowinandroid/core/domain/GetSortedFollowableAuthorsUseCase; -Lcom/google/samples/apps/nowinandroid/core/domain/model/FollowableAuthor; Lcom/google/samples/apps/nowinandroid/core/domain/model/FollowableTopic; -Lcom/google/samples/apps/nowinandroid/core/model/data/Author; Lcom/google/samples/apps/nowinandroid/core/model/data/DarkThemeConfig; Lcom/google/samples/apps/nowinandroid/core/model/data/NewsResourceType; Lcom/google/samples/apps/nowinandroid/core/model/data/NewsResourceTypeKt; @@ -12277,9 +11490,6 @@ Lcom/google/samples/apps/nowinandroid/core/model/data/UserData; Lcom/google/samples/apps/nowinandroid/core/network/NiaNetworkDataSource; Lcom/google/samples/apps/nowinandroid/core/network/di/NetworkModule$providesFakeAssetManager$1; Lcom/google/samples/apps/nowinandroid/core/network/fake/FakeAssetManager; -Lcom/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSource$getAuthorChangeList$1; -Lcom/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSource$getAuthorChangeList$2; -Lcom/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSource$getAuthors$2; Lcom/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSource$getNewsResourceChangeList$1; Lcom/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSource$getNewsResourceChangeList$2; Lcom/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSource$getNewsResources$2; @@ -12288,9 +11498,6 @@ Lcom/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSource Lcom/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSource$getTopics$2; Lcom/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSource; Lcom/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSourceKt; -Lcom/google/samples/apps/nowinandroid/core/network/model/NetworkAuthor$$serializer; -Lcom/google/samples/apps/nowinandroid/core/network/model/NetworkAuthor$Companion; -Lcom/google/samples/apps/nowinandroid/core/network/model/NetworkAuthor; Lcom/google/samples/apps/nowinandroid/core/network/model/NetworkChangeList$Companion; Lcom/google/samples/apps/nowinandroid/core/network/model/NetworkChangeList; Lcom/google/samples/apps/nowinandroid/core/network/model/NetworkNewsResource$$serializer; @@ -12314,19 +11521,9 @@ Lcom/google/samples/apps/nowinandroid/core/ui/NewsFeedKt; Lcom/google/samples/apps/nowinandroid/core/ui/NewsFeedUiState$Loading; Lcom/google/samples/apps/nowinandroid/core/ui/NewsFeedUiState$Success; Lcom/google/samples/apps/nowinandroid/core/ui/NewsFeedUiState; -Lcom/google/samples/apps/nowinandroid/feature/author/navigation/AuthorNavigationKt$authorScreen$2; +Lcom/google/samples/apps/nowinandroid/di/JankStatsModule$providesOnFrameListener$1; Lcom/google/samples/apps/nowinandroid/feature/bookmarks/navigation/ComposableSingletons$BookmarksNavigationKt$lambda-1$1; Lcom/google/samples/apps/nowinandroid/feature/bookmarks/navigation/ComposableSingletons$BookmarksNavigationKt; -Lcom/google/samples/apps/nowinandroid/feature/foryou/AuthorsCarouselKt$AuthorItem$2$1; -Lcom/google/samples/apps/nowinandroid/feature/foryou/AuthorsCarouselKt$AuthorItem$3; -Lcom/google/samples/apps/nowinandroid/feature/foryou/AuthorsCarouselKt$AuthorItem$4$1$1$1; -Lcom/google/samples/apps/nowinandroid/feature/foryou/AuthorsCarouselKt$AuthorItem$5; -Lcom/google/samples/apps/nowinandroid/feature/foryou/AuthorsCarouselKt$AuthorsCarousel$1$2$1; -Lcom/google/samples/apps/nowinandroid/feature/foryou/AuthorsCarouselKt$AuthorsCarousel$1$invoke$$inlined$items$default$2; -Lcom/google/samples/apps/nowinandroid/feature/foryou/AuthorsCarouselKt$AuthorsCarousel$1$invoke$$inlined$items$default$3; -Lcom/google/samples/apps/nowinandroid/feature/foryou/AuthorsCarouselKt$AuthorsCarousel$1$invoke$$inlined$items$default$4; -Lcom/google/samples/apps/nowinandroid/feature/foryou/AuthorsCarouselKt$AuthorsCarousel$1; -Lcom/google/samples/apps/nowinandroid/feature/foryou/AuthorsCarouselKt; Lcom/google/samples/apps/nowinandroid/feature/foryou/ComposableSingletons$ForYouScreenKt$lambda-1$1; Lcom/google/samples/apps/nowinandroid/feature/foryou/ComposableSingletons$ForYouScreenKt$lambda-10$1; Lcom/google/samples/apps/nowinandroid/feature/foryou/ComposableSingletons$ForYouScreenKt$lambda-11$1; @@ -12345,7 +11542,6 @@ Lcom/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenKt$ForYouRoute$ Lcom/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenKt$ForYouRoute$2; Lcom/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenKt$ForYouRoute$3; Lcom/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenKt$ForYouRoute$4; -Lcom/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenKt$ForYouRoute$5; Lcom/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenKt$ForYouScreen$1$invokeSuspend$$inlined$doOnPreDraw$1; Lcom/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenKt$ForYouScreen$1; Lcom/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenKt$ForYouScreen$2$1$1; @@ -12387,7 +11583,6 @@ Lcom/google/samples/apps/nowinandroid/feature/interests/navigation/InterestsNavi Lcom/google/samples/apps/nowinandroid/feature/topic/navigation/TopicNavigationKt$topicScreen$2; Lcom/google/samples/apps/nowinandroid/navigation/NiaNavHostKt$NiaNavHost$1$1; Lcom/google/samples/apps/nowinandroid/navigation/NiaNavHostKt$NiaNavHost$1$2; -Lcom/google/samples/apps/nowinandroid/navigation/NiaNavHostKt$NiaNavHost$1$3; Lcom/google/samples/apps/nowinandroid/navigation/NiaNavHostKt$NiaNavHost$1; Lcom/google/samples/apps/nowinandroid/navigation/NiaNavHostKt; Lcom/google/samples/apps/nowinandroid/navigation/TopLevelDestination; @@ -12402,7 +11597,6 @@ Lcom/google/samples/apps/nowinandroid/sync/workers/HiltWorkerFactoryEntryPoint; Lcom/google/samples/apps/nowinandroid/sync/workers/SyncWorker$doWork$1; Lcom/google/samples/apps/nowinandroid/sync/workers/SyncWorker$doWork$2$1$syncedSuccessfully$1; Lcom/google/samples/apps/nowinandroid/sync/workers/SyncWorker$doWork$2$1$syncedSuccessfully$2; -Lcom/google/samples/apps/nowinandroid/sync/workers/SyncWorker$doWork$2$1$syncedSuccessfully$3; Lcom/google/samples/apps/nowinandroid/sync/workers/SyncWorker$doWork$2; Lcom/google/samples/apps/nowinandroid/sync/workers/SyncWorker; Lcom/google/samples/apps/nowinandroid/ui/ComposableSingletons$NiaAppKt$lambda-1$1; @@ -12551,6 +11745,7 @@ Lkotlin/Result; Lkotlin/ResultKt; Lkotlin/SafePublicationLazyImpl; Lkotlin/SynchronizedLazyImpl; +Lkotlin/TuplesKt; Lkotlin/UByte; Lkotlin/UByteArray; Lkotlin/UInt; @@ -12589,7 +11784,6 @@ Lkotlin/collections/IntIterator; Lkotlin/collections/MapsKt__MapsJVMKt; Lkotlin/collections/MapsKt___MapsJvmKt; Lkotlin/collections/SetsKt; -Lkotlin/collections/SetsKt__SetsKt; Lkotlin/collections/builders/ListBuilder; Lkotlin/collections/builders/ListBuilderKt; Lkotlin/collections/builders/MapBuilder$Companion; @@ -12597,7 +11791,6 @@ Lkotlin/collections/builders/MapBuilder$Itr; Lkotlin/collections/builders/MapBuilder$KeysItr; Lkotlin/collections/builders/MapBuilder; Lkotlin/collections/builders/SetBuilder; -Lkotlin/comparisons/ComparisonsKt___ComparisonsJvmKt; Lkotlin/comparisons/NaturalOrderComparator; Lkotlin/coroutines/AbstractCoroutineContextElement; Lkotlin/coroutines/AbstractCoroutineContextKey; @@ -12614,6 +11807,7 @@ Lkotlin/coroutines/CoroutineContext; Lkotlin/coroutines/EmptyCoroutineContext; Lkotlin/coroutines/SafeContinuation; Lkotlin/coroutines/intrinsics/CoroutineSingletons; +Lkotlin/coroutines/intrinsics/IntrinsicsKt__IntrinsicsKt; Lkotlin/coroutines/jvm/internal/BaseContinuationImpl; Lkotlin/coroutines/jvm/internal/CompletedContinuation; Lkotlin/coroutines/jvm/internal/ContinuationImpl; @@ -12735,10 +11929,10 @@ Lkotlin/text/StringsKt__StringBuilderKt; Lkotlin/text/StringsKt__StringNumberConversionsKt; Lkotlin/text/StringsKt__StringsJVMKt; Lkotlin/text/StringsKt__StringsKt; -Lkotlin/text/UStringsKt; Lkotlin/time/Duration; Lkotlin/time/DurationJvmKt; Lkotlin/time/DurationKt; +Lkotlin/time/DurationUnitKt__DurationUnitKt; Lkotlinx/coroutines/AbstractCoroutine; Lkotlinx/coroutines/Active; Lkotlinx/coroutines/AwaitAll$AwaitAllNode; @@ -12803,7 +11997,6 @@ Lkotlinx/coroutines/GlobalScope; Lkotlinx/coroutines/InactiveNodeList; Lkotlinx/coroutines/Incomplete; Lkotlinx/coroutines/IncompleteStateBox; -Lkotlinx/coroutines/InterruptibleKt$runInterruptible$2; Lkotlinx/coroutines/InvokeOnCancel; Lkotlinx/coroutines/InvokeOnCancelling; Lkotlinx/coroutines/InvokeOnCompletion; @@ -12814,6 +12007,7 @@ Lkotlinx/coroutines/JobCancellationException; Lkotlinx/coroutines/JobCancellingNode; Lkotlinx/coroutines/JobImpl; Lkotlinx/coroutines/JobKt; +Lkotlinx/coroutines/JobKt__FutureKt; Lkotlinx/coroutines/JobNode; Lkotlinx/coroutines/JobSupport$AwaitContinuation; Lkotlinx/coroutines/JobSupport$ChildCompletion; @@ -12826,7 +12020,6 @@ Lkotlinx/coroutines/NodeList; Lkotlinx/coroutines/NonDisposableHandle; Lkotlinx/coroutines/NotCompleted; Lkotlinx/coroutines/ParentJob; -Lkotlinx/coroutines/RemoveOnCancel; Lkotlinx/coroutines/ResumeAwaitOnCompletion; Lkotlinx/coroutines/ResumeOnCompletion; Lkotlinx/coroutines/StandaloneCoroutine; @@ -12834,7 +12027,6 @@ Lkotlinx/coroutines/SupervisorJobImpl; Lkotlinx/coroutines/SupervisorKt; Lkotlinx/coroutines/ThreadContextElement; Lkotlinx/coroutines/ThreadLocalEventLoop; -Lkotlinx/coroutines/ThreadState; Lkotlinx/coroutines/TimeoutCancellationException; Lkotlinx/coroutines/Unconfined; Lkotlinx/coroutines/UndispatchedCoroutine; @@ -12881,7 +12073,6 @@ Lkotlinx/coroutines/channels/ReceiveOrClosed; Lkotlinx/coroutines/channels/RendezvousChannel; Lkotlinx/coroutines/channels/Send; Lkotlinx/coroutines/channels/SendChannel; -Lkotlinx/coroutines/channels/SendElement; Lkotlinx/coroutines/flow/AbstractFlow$collect$1; Lkotlinx/coroutines/flow/AbstractFlow; Lkotlinx/coroutines/flow/CallbackFlowBuilder$collectTo$1; @@ -12892,6 +12083,7 @@ Lkotlinx/coroutines/flow/DistinctFlowImpl$collect$2; Lkotlinx/coroutines/flow/DistinctFlowImpl; Lkotlinx/coroutines/flow/Flow; Lkotlinx/coroutines/flow/FlowCollector; +Lkotlinx/coroutines/flow/FlowKt; Lkotlinx/coroutines/flow/FlowKt__BuildersKt$flowOf$$inlined$unsafeFlow$2; Lkotlinx/coroutines/flow/FlowKt__ChannelsKt$emitAllImpl$1; Lkotlinx/coroutines/flow/FlowKt__ChannelsKt; @@ -12913,8 +12105,6 @@ Lkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1$2; Lkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1; Lkotlinx/coroutines/flow/FlowKt__TransformKt$onEach$$inlined$unsafeTransform$1$2$1; Lkotlinx/coroutines/flow/FlowKt__TransformKt$onEach$$inlined$unsafeTransform$1$2; -Lkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$combineUnsafe$FlowKt__ZipKt$1$2; -Lkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$combineUnsafe$FlowKt__ZipKt$1; Lkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$unsafeFlow$1; Lkotlinx/coroutines/flow/FlowKt__ZipKt$combine$1$1; Lkotlinx/coroutines/flow/FlowKt__ZipKt$nullArrayFactory$1; @@ -12963,7 +12153,6 @@ Lkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1$1$emit$1; Lkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1$1; Lkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1; Lkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2; -Lkotlinx/coroutines/flow/internal/CombineKt; Lkotlinx/coroutines/flow/internal/DownstreamExceptionContext; Lkotlinx/coroutines/flow/internal/FlowCoroutine; Lkotlinx/coroutines/flow/internal/FusibleFlow; @@ -13002,7 +12191,6 @@ Lkotlinx/coroutines/internal/ResizableAtomicArray; Lkotlinx/coroutines/internal/ScopeCoroutine; Lkotlinx/coroutines/internal/Segment; Lkotlinx/coroutines/internal/Symbol; -Lkotlinx/coroutines/internal/SystemPropsKt; Lkotlinx/coroutines/internal/SystemPropsKt__SystemPropsKt; Lkotlinx/coroutines/internal/ThreadContextKt$countAll$1; Lkotlinx/coroutines/internal/ThreadContextKt; @@ -13113,6 +12301,7 @@ Lkotlinx/serialization/internal/PluginGeneratedSerialDescriptor$_hashCode$2; Lkotlinx/serialization/internal/PluginGeneratedSerialDescriptor$childSerializers$2; Lkotlinx/serialization/internal/PluginGeneratedSerialDescriptor$typeParameterDescriptors$2; Lkotlinx/serialization/internal/PluginGeneratedSerialDescriptor; +Lkotlinx/serialization/internal/PluginGeneratedSerialDescriptorKt; Lkotlinx/serialization/internal/PrimitiveArrayDescriptor; Lkotlinx/serialization/internal/PrimitiveArraySerializer; Lkotlinx/serialization/internal/PrimitiveSerialDescriptor; @@ -13135,6 +12324,7 @@ Lkotlinx/serialization/json/Json; Lkotlinx/serialization/json/JsonConfiguration; Lkotlinx/serialization/json/JsonDecoder; Lkotlinx/serialization/json/JsonImpl; +Lkotlinx/serialization/json/JsonNames; Lkotlinx/serialization/json/JvmStreamsKt; Lkotlinx/serialization/json/internal/AbstractJsonLexer; Lkotlinx/serialization/json/internal/AbstractJsonLexerKt; @@ -13148,7 +12338,6 @@ Lkotlinx/serialization/json/internal/JsonExceptionsKt; Lkotlinx/serialization/json/internal/JsonNamesMapKt; Lkotlinx/serialization/json/internal/JsonPath$Tombstone; Lkotlinx/serialization/json/internal/JsonPath; -Lkotlinx/serialization/json/internal/PolymorphicKt; Lkotlinx/serialization/json/internal/ReaderJsonLexer; Lkotlinx/serialization/json/internal/SerialReader; Lkotlinx/serialization/json/internal/StreamingJsonDecoder$DiscriminatorHolder; @@ -13181,10 +12370,6 @@ Lokhttp3/Dns; Lokhttp3/EventListener$Companion$NONE$1; Lokhttp3/EventListener$Factory; Lokhttp3/EventListener; -Lokhttp3/Handshake$Companion$handshake$1; -Lokhttp3/Handshake$Companion; -Lokhttp3/Handshake$peerCertificates$2; -Lokhttp3/Handshake; Lokhttp3/Headers$Builder; Lokhttp3/Headers$Companion; Lokhttp3/Headers; @@ -13192,23 +12377,17 @@ Lokhttp3/HttpUrl$Builder; Lokhttp3/HttpUrl$Companion; Lokhttp3/HttpUrl; Lokhttp3/Interceptor; -Lokhttp3/MediaType$Companion; -Lokhttp3/MediaType; Lokhttp3/OkHttpClient; -Lokhttp3/Protocol$Companion; Lokhttp3/Protocol; Lokhttp3/Request$Builder; Lokhttp3/Request; Lokhttp3/RequestBody$Companion$toRequestBody$2; Lokhttp3/RequestBody; -Lokhttp3/Response$Builder; -Lokhttp3/Response; Lokhttp3/ResponseBody$Companion$asResponseBody$1; Lokhttp3/ResponseBody; Lokhttp3/Route; Lokhttp3/TlsVersion$Companion; Lokhttp3/TlsVersion; -Lokhttp3/internal/HostnamesKt; Lokhttp3/internal/Util$$ExternalSyntheticLambda0; Lokhttp3/internal/Util$$ExternalSyntheticLambda1; Lokhttp3/internal/Util; @@ -13216,7 +12395,6 @@ Lokhttp3/internal/cache/CacheInterceptor$Companion; Lokhttp3/internal/cache/CacheInterceptor; Lokhttp3/internal/cache/CacheStrategy; Lokhttp3/internal/concurrent/Task; -Lokhttp3/internal/concurrent/TaskQueue$execute$1; Lokhttp3/internal/concurrent/TaskQueue; Lokhttp3/internal/concurrent/TaskRunner$Backend; Lokhttp3/internal/concurrent/TaskRunner$RealBackend; @@ -13224,15 +12402,11 @@ Lokhttp3/internal/concurrent/TaskRunner$runnable$1; Lokhttp3/internal/concurrent/TaskRunner; Lokhttp3/internal/connection/ConnectInterceptor; Lokhttp3/internal/connection/ConnectionSpecSelector; -Lokhttp3/internal/connection/Exchange$ResponseBodySource; -Lokhttp3/internal/connection/Exchange; Lokhttp3/internal/connection/ExchangeFinder; Lokhttp3/internal/connection/RealCall$AsyncCall; -Lokhttp3/internal/connection/RealCall$CallReference; Lokhttp3/internal/connection/RealCall$timeout$1; Lokhttp3/internal/connection/RealCall; Lokhttp3/internal/connection/RealConnection$WhenMappings; -Lokhttp3/internal/connection/RealConnection$connectTls$1; Lokhttp3/internal/connection/RealConnection; Lokhttp3/internal/connection/RealConnectionPool$cleanupTask$1; Lokhttp3/internal/connection/RealConnectionPool; @@ -13242,44 +12416,12 @@ Lokhttp3/internal/connection/RouteSelector$Selection; Lokhttp3/internal/connection/RouteSelector; Lokhttp3/internal/http/BridgeInterceptor; Lokhttp3/internal/http/CallServerInterceptor; -Lokhttp3/internal/http/ExchangeCodec; -Lokhttp3/internal/http/HttpHeaders; -Lokhttp3/internal/http/HttpMethod; Lokhttp3/internal/http/RealInterceptorChain; -Lokhttp3/internal/http/RealResponseBody; Lokhttp3/internal/http/RetryAndFollowUpInterceptor; -Lokhttp3/internal/http/StatusLine$Companion; -Lokhttp3/internal/http/StatusLine; -Lokhttp3/internal/http2/ErrorCode; -Lokhttp3/internal/http2/Header; -Lokhttp3/internal/http2/Hpack$Reader; -Lokhttp3/internal/http2/Hpack$Writer; -Lokhttp3/internal/http2/Hpack; Lokhttp3/internal/http2/Http2; -Lokhttp3/internal/http2/Http2Connection$Builder; Lokhttp3/internal/http2/Http2Connection$Listener$Companion$REFUSE_INCOMING_STREAMS$1; Lokhttp3/internal/http2/Http2Connection$Listener; -Lokhttp3/internal/http2/Http2Connection$ReaderRunnable$applyAndAckSettings$lambda-7$lambda-6$$inlined$execute$default$1; -Lokhttp3/internal/http2/Http2Connection$ReaderRunnable$settings$$inlined$execute$default$1; -Lokhttp3/internal/http2/Http2Connection$ReaderRunnable; -Lokhttp3/internal/http2/Http2Connection; -Lokhttp3/internal/http2/Http2ExchangeCodec; -Lokhttp3/internal/http2/Http2Reader$Companion; -Lokhttp3/internal/http2/Http2Reader$ContinuationSource; -Lokhttp3/internal/http2/Http2Reader$Handler; -Lokhttp3/internal/http2/Http2Reader; -Lokhttp3/internal/http2/Http2Stream$FramingSink; -Lokhttp3/internal/http2/Http2Stream$FramingSource; -Lokhttp3/internal/http2/Http2Stream$StreamTimeout; -Lokhttp3/internal/http2/Http2Stream; -Lokhttp3/internal/http2/Http2Writer; -Lokhttp3/internal/http2/Huffman$Node; -Lokhttp3/internal/http2/Huffman; -Lokhttp3/internal/http2/PushObserver$Companion$PushObserverCancel; -Lokhttp3/internal/http2/PushObserver; -Lokhttp3/internal/http2/Settings; Lokhttp3/internal/platform/Android10Platform; -Lokhttp3/internal/platform/Jdk9Platform$$ExternalSyntheticApiModelOutline1; Lokhttp3/internal/platform/Platform$Companion; Lokhttp3/internal/platform/Platform; Lokhttp3/internal/platform/android/Android10SocketAdapter; @@ -13297,8 +12439,6 @@ Lokhttp3/internal/platform/android/DeferredSocketAdapter; Lokhttp3/internal/platform/android/SocketAdapter; Lokhttp3/internal/tls/CertificateChainCleaner; Lokhttp3/internal/tls/OkHostnameVerifier; -Lokio/AsyncTimeout$Companion; -Lokio/AsyncTimeout$Watchdog; Lokio/AsyncTimeout$sink$1; Lokio/AsyncTimeout$source$1; Lokio/AsyncTimeout; @@ -13311,19 +12451,17 @@ Lokio/FileMetadata; Lokio/FileSystem; Lokio/ForwardingFileSystem; Lokio/ForwardingSink; -Lokio/ForwardingSource; Lokio/InputStreamSource; Lokio/JvmSystemFileSystem; Lokio/NioSystemFileSystem; Lokio/Okio; Lokio/Okio__JvmOkioKt; +Lokio/Okio__OkioKt; Lokio/Options$Companion; Lokio/OutputStreamSink; Lokio/Path$Companion; Lokio/Path; -Lokio/PeekSource; Lokio/RealBufferedSink; -Lokio/RealBufferedSource$inputStream$1; Lokio/RealBufferedSource; Lokio/Segment; Lokio/SegmentPool; @@ -13341,12 +12479,11 @@ Lokio/internal/_ByteStringKt; Lokio/internal/_PathKt; PLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda1;->saveState()Landroid/os/Bundle; PLandroidx/activity/ComponentActivity;->onSaveInstanceState(Landroid/os/Bundle;)V -PLandroidx/activity/ComponentActivity;->onTrimMemory(I)V PLandroidx/activity/OnBackPressedDispatcher$Api33Impl;->registerOnBackInvokedCallback(Ljava/lang/Object;ILjava/lang/Object;)V PLandroidx/activity/OnBackPressedDispatcher$Api33Impl;->unregisterOnBackInvokedCallback(Ljava/lang/Object;Ljava/lang/Object;)V PLandroidx/activity/OnBackPressedDispatcher$LifecycleOnBackPressedCancellable;->cancel()V PLandroidx/activity/OnBackPressedDispatcher$OnBackPressedCancellable;->cancel()V -PLandroidx/appcompat/widget/TooltipCompatHandler$$ExternalSyntheticLambda1;->run()V +PLandroidx/appcompat/R$style;->setOf([Ljava/lang/Object;)Ljava/util/Set; PLandroidx/arch/core/internal/SafeIterableMap$DescendingIterator;->(Landroidx/arch/core/internal/SafeIterableMap$Entry;Landroidx/arch/core/internal/SafeIterableMap$Entry;)V PLandroidx/arch/core/internal/SafeIterableMap$DescendingIterator;->forward(Landroidx/arch/core/internal/SafeIterableMap$Entry;)Landroidx/arch/core/internal/SafeIterableMap$Entry; PLandroidx/arch/core/internal/SafeIterableMap$ListIterator;->supportRemove(Landroidx/arch/core/internal/SafeIterableMap$Entry;)V @@ -13361,31 +12498,24 @@ PLandroidx/compose/animation/AndroidFlingSpline;->flingPosition(F)Landroidx/comp PLandroidx/compose/animation/CrossfadeKt$Crossfade$4$1;->(Landroidx/compose/animation/core/Transition;)V PLandroidx/compose/animation/CrossfadeKt$Crossfade$4$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/animation/CrossfadeKt$Crossfade$7;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLandroidx/compose/animation/FlingCalculator$FlingInfo;->(FFJ)V -PLandroidx/compose/animation/FlingCalculator;->getSplineDeceleration(F)D PLandroidx/compose/animation/SplineBasedFloatDecayAnimationSpec;->getAbsVelocityThreshold()V PLandroidx/compose/animation/SplineBasedFloatDecayAnimationSpec;->getDurationNanos(F)J PLandroidx/compose/animation/SplineBasedFloatDecayAnimationSpec;->getTargetValue(FF)F -PLandroidx/compose/animation/SplineBasedFloatDecayAnimationSpec;->getValueFromNanos(FFJ)F -PLandroidx/compose/animation/core/AnimateAsStateKt;->animateDpAsState-Kz89ssw(FLandroidx/compose/animation/core/TweenSpec;Landroidx/compose/runtime/Composer;I)Landroidx/compose/animation/core/AnimationState; -PLandroidx/compose/animation/core/AnimationStateKt;->AnimationState$default(FFI)Landroidx/compose/animation/core/AnimationState; +PLandroidx/compose/animation/core/AnimationEndReason$EnumUnboxingSharedUtility;->compareTo(II)I PLandroidx/compose/animation/core/DecayAnimation;->(Landroidx/compose/animation/core/DecayAnimationSpec;Landroidx/compose/animation/core/TwoWayConverter;Ljava/lang/Object;Landroidx/compose/animation/core/AnimationVector;)V PLandroidx/compose/animation/core/DecayAnimation;->getDurationNanos()J PLandroidx/compose/animation/core/DecayAnimation;->getTargetValue()Ljava/lang/Object; PLandroidx/compose/animation/core/DecayAnimation;->getTypeConverter()Landroidx/compose/animation/core/TwoWayConverter; -PLandroidx/compose/animation/core/DecayAnimation;->getValueFromNanos(J)Ljava/lang/Object; -PLandroidx/compose/animation/core/DecayAnimation;->getVelocityVectorFromNanos(J)Landroidx/compose/animation/core/AnimationVector; PLandroidx/compose/animation/core/DecayAnimation;->isInfinite()Z PLandroidx/compose/animation/core/DecayAnimationSpecImpl;->vectorize(Landroidx/compose/animation/core/TwoWayConverter;)Landroidx/compose/animation/core/VectorizedFloatDecaySpec; PLandroidx/compose/animation/core/InfiniteTransitionKt$animateValue$2$invoke$$inlined$onDispose$1;->dispose()V PLandroidx/compose/animation/core/SuspendAnimationKt$animate$6$1;->invoke()Ljava/lang/Object; +PLandroidx/compose/animation/core/SuspendAnimationKt$animate$7;->(Landroidx/compose/animation/core/AnimationState;)V PLandroidx/compose/animation/core/SuspendAnimationKt;->animateDecay$default(Landroidx/compose/animation/core/AnimationState;Landroidx/compose/animation/core/DecayAnimationSpec;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; -PLandroidx/compose/animation/core/Transition$updateTarget$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/animation/core/TransitionKt$createChildTransitionInternal$1$1$invoke$$inlined$onDispose$1;->dispose()V PLandroidx/compose/animation/core/TransitionKt$createDeferredAnimation$1$invoke$$inlined$onDispose$1;->dispose()V PLandroidx/compose/animation/core/TransitionKt$createTransitionAnimation$1$1$invoke$$inlined$onDispose$1;->dispose()V PLandroidx/compose/animation/core/TransitionKt$updateTransition$1$1$invoke$$inlined$onDispose$1;->dispose()V -PLandroidx/compose/animation/core/VectorConvertersKt$DpToVector$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/animation/core/VectorizedFloatDecaySpec;->(Landroidx/compose/animation/core/FloatDecayAnimationSpec;)V PLandroidx/compose/animation/core/VectorizedFloatDecaySpec;->getAbsVelocityThreshold()F PLandroidx/compose/animation/core/VectorizedFloatDecaySpec;->getDurationNanos(Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)J @@ -13393,21 +12523,11 @@ PLandroidx/compose/animation/core/VectorizedFloatDecaySpec;->getTargetValue(Land PLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->consumePostFling-sF-c-tU(J)Lkotlin/Unit; PLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->consumePreFling-QWom1Mo(J)Landroidx/compose/ui/unit/Velocity; PLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->drawBottom(Landroidx/compose/ui/graphics/drawscope/DrawScope;Landroid/widget/EdgeEffect;Landroid/graphics/Canvas;)Z -PLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->isEnabled()Z PLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->isInProgress()Z -PLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->pullBottom-0a9Yr6o(JJ)F PLandroidx/compose/foundation/Api31Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/widget/EdgeEffect;FF)F PLandroidx/compose/foundation/Api31Impl;->onPullDistance(Landroid/widget/EdgeEffect;FF)F -PLandroidx/compose/foundation/BorderKt$border$2$1;->(FLandroidx/compose/ui/graphics/Shape;Landroidx/compose/ui/node/Ref;Landroidx/compose/ui/graphics/Brush;)V -PLandroidx/compose/foundation/BorderKt$border$2$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLandroidx/compose/foundation/BorderKt$border$2;->(FLandroidx/compose/ui/graphics/Brush;Landroidx/compose/ui/graphics/Shape;)V -PLandroidx/compose/foundation/BorderKt$border$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLandroidx/compose/foundation/BorderKt$drawRoundRectBorder$1;->(ZLandroidx/compose/ui/graphics/Brush;JFFJJLandroidx/compose/ui/graphics/drawscope/Stroke;)V -PLandroidx/compose/foundation/BorderKt$drawRoundRectBorder$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLandroidx/compose/foundation/BorderKt;->shrink-Kibmq7A(FJ)J -PLandroidx/compose/foundation/BorderStroke;->(FLandroidx/compose/ui/graphics/SolidColor;)V -PLandroidx/compose/foundation/BorderStroke;->equals(Ljava/lang/Object;)Z PLandroidx/compose/foundation/ClickableKt$clickable$2;->(ZLjava/lang/String;Landroidx/compose/ui/semantics/Role;Lkotlin/jvm/functions/Function0;)V +PLandroidx/compose/foundation/ClickableKt$clickable$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/foundation/ClickableKt$clickable$4$delayPressInteraction$1$1;->invoke()Ljava/lang/Object; PLandroidx/compose/foundation/ClickableKt$clickable$4$gesture$1$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/foundation/ClickableKt$clickable$4$gesture$1$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; @@ -13440,13 +12560,10 @@ PLandroidx/compose/foundation/ScrollKt$rememberScrollState$1$1;->(I)V PLandroidx/compose/foundation/ScrollKt$rememberScrollState$1$1;->invoke()Ljava/lang/Object; PLandroidx/compose/foundation/ScrollKt$scroll$2$semantics$1$1;->(Lkotlinx/coroutines/CoroutineScope;ZLandroidx/compose/foundation/ScrollState;)V PLandroidx/compose/foundation/ScrollKt$scroll$2$semantics$1$accessibilityScrollState$1;->(Landroidx/compose/foundation/ScrollState;)V -PLandroidx/compose/foundation/ScrollKt$scroll$2$semantics$1$accessibilityScrollState$1;->invoke()Ljava/lang/Object; PLandroidx/compose/foundation/ScrollKt$scroll$2$semantics$1$accessibilityScrollState$2;->(Landroidx/compose/foundation/ScrollState;)V -PLandroidx/compose/foundation/ScrollKt$scroll$2$semantics$1$accessibilityScrollState$2;->invoke()Ljava/lang/Object; PLandroidx/compose/foundation/ScrollKt$scroll$2$semantics$1;->(ZZZLandroidx/compose/foundation/ScrollState;Lkotlinx/coroutines/CoroutineScope;)V PLandroidx/compose/foundation/ScrollKt$scroll$2$semantics$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/foundation/ScrollKt$scroll$2;->(Landroidx/compose/foundation/ScrollState;Landroidx/compose/foundation/gestures/FlingBehavior;ZZZ)V -PLandroidx/compose/foundation/ScrollKt$scroll$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/foundation/ScrollKt;->rememberScrollState(Landroidx/compose/runtime/Composer;)Landroidx/compose/foundation/ScrollState; PLandroidx/compose/foundation/ScrollState$Companion$Saver$1;->()V PLandroidx/compose/foundation/ScrollState$Companion$Saver$1;->()V @@ -13475,7 +12592,6 @@ PLandroidx/compose/foundation/gestures/DefaultScrollableState$scroll$2;->( PLandroidx/compose/foundation/gestures/DefaultScrollableState$scroll$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/compose/foundation/gestures/DefaultScrollableState$scroll$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/foundation/gestures/DefaultScrollableState$scroll$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; -PLandroidx/compose/foundation/gestures/DefaultScrollableState$scrollScope$1;->scrollBy(F)F PLandroidx/compose/foundation/gestures/DefaultScrollableState;->scroll(Landroidx/compose/foundation/MutatePriority;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLandroidx/compose/foundation/gestures/DragEvent$DragDelta;->(J)V PLandroidx/compose/foundation/gestures/DragEvent$DragStarted;->(J)V @@ -13543,8 +12659,6 @@ PLandroidx/compose/foundation/gestures/ScrollingLogic$onDragStopped$1;->(L PLandroidx/compose/foundation/gestures/ScrollingLogic$onDragStopped$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/foundation/gestures/ScrollingLogic;->doFlingAnimation-QWom1Mo(JLkotlin/coroutines/Continuation;)Ljava/lang/Object; PLandroidx/compose/foundation/gestures/ScrollingLogic;->onDragStopped-sF-c-tU(JLkotlin/coroutines/Continuation;)Ljava/lang/Object; -PLandroidx/compose/foundation/gestures/ScrollingLogic;->toFloat-k-4lQ0M(J)F -PLandroidx/compose/foundation/gestures/ScrollingLogic;->toOffset-tuRUvjQ(F)J PLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2$1$1$1;->(Lkotlin/jvm/functions/Function3;Landroidx/compose/foundation/gestures/PressGestureScopeImpl;Landroidx/compose/ui/input/pointer/PointerInputChange;Lkotlin/coroutines/Continuation;)V PLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2$1$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2$1$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; @@ -13556,88 +12670,143 @@ PLandroidx/compose/foundation/interaction/DragInteraction$Stop;->(Landroid PLandroidx/compose/foundation/interaction/MutableInteractionSourceImpl;->emit(Landroidx/compose/foundation/interaction/Interaction;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLandroidx/compose/foundation/interaction/PressInteraction$Press;->(J)V PLandroidx/compose/foundation/interaction/PressInteraction$Release;->(Landroidx/compose/foundation/interaction/PressInteraction$Press;)V -PLandroidx/compose/foundation/layout/AddedInsets;->getTop(Landroidx/compose/ui/unit/Density;)I PLandroidx/compose/foundation/layout/Arrangement$Center$1;->arrange(Landroidx/compose/ui/unit/Density;I[I[I)V -PLandroidx/compose/foundation/layout/Arrangement$SpaceBetween$1;->arrange(ILandroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;[I[I)V -PLandroidx/compose/foundation/layout/Arrangement$SpaceBetween$1;->getSpacing-D9Ej5fM()F PLandroidx/compose/foundation/layout/Arrangement$Vertical;->getSpacing-D9Ej5fM()F -PLandroidx/compose/foundation/layout/Arrangement;->placeSpaceBetween$foundation_layout_release(I[I[IZ)V PLandroidx/compose/foundation/layout/ColumnKt$columnMeasurePolicy$1$1;->(Landroidx/compose/foundation/layout/Arrangement$Vertical;)V PLandroidx/compose/foundation/layout/ColumnKt$columnMeasurePolicy$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/io/Serializable;)Ljava/lang/Object; PLandroidx/compose/foundation/layout/ColumnScopeInstance;->()V PLandroidx/compose/foundation/layout/ColumnScopeInstance;->()V -PLandroidx/compose/foundation/layout/DerivedHeightModifier$measure$2;->(Landroidx/compose/ui/layout/Placeable;)V -PLandroidx/compose/foundation/layout/DerivedHeightModifier$measure$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLandroidx/compose/foundation/layout/HorizontalAlignModifier;->(Landroidx/compose/ui/BiasAlignment$Horizontal;)V -PLandroidx/compose/foundation/layout/HorizontalAlignModifier;->equals(Ljava/lang/Object;)Z -PLandroidx/compose/foundation/layout/HorizontalAlignModifier;->modifyParentData(Landroidx/compose/ui/unit/Density;Ljava/lang/Object;)Ljava/lang/Object; -PLandroidx/compose/foundation/layout/IntrinsicMeasureBlocks$VerticalMaxHeight$1$1;->()V -PLandroidx/compose/foundation/layout/IntrinsicMeasureBlocks$VerticalMaxHeight$1$1;->()V -PLandroidx/compose/foundation/layout/IntrinsicMeasureBlocks$VerticalMaxHeight$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLandroidx/compose/foundation/layout/IntrinsicMeasureBlocks$VerticalMaxHeight$1$2;->()V -PLandroidx/compose/foundation/layout/IntrinsicMeasureBlocks$VerticalMaxHeight$1$2;->()V -PLandroidx/compose/foundation/layout/IntrinsicMeasureBlocks$VerticalMaxHeight$1;->()V -PLandroidx/compose/foundation/layout/IntrinsicMeasureBlocks$VerticalMaxHeight$1;->()V -PLandroidx/compose/foundation/layout/IntrinsicMeasureBlocks$VerticalMaxHeight$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLandroidx/compose/foundation/layout/OffsetModifier$measure$1;->(Landroidx/compose/foundation/layout/OffsetModifier;Landroidx/compose/ui/layout/Placeable;Landroidx/compose/ui/layout/MeasureScope;)V -PLandroidx/compose/foundation/layout/OffsetModifier$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLandroidx/compose/foundation/layout/OffsetModifier;->(FF)V -PLandroidx/compose/foundation/layout/OffsetModifier;->equals(Ljava/lang/Object;)Z -PLandroidx/compose/foundation/layout/OffsetModifier;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; PLandroidx/compose/foundation/layout/PaddingKt;->PaddingValues-a9UjIt4$default(FFI)Landroidx/compose/foundation/layout/PaddingValuesImpl; -PLandroidx/compose/foundation/layout/PaddingValuesInsets;->getTop(Landroidx/compose/ui/unit/Density;)I -PLandroidx/compose/foundation/layout/RowColumnImplKt$rowColumnMeasurePolicy$1;->maxIntrinsicHeight(Landroidx/compose/ui/node/NodeCoordinator;Ljava/util/List;I)I -PLandroidx/compose/foundation/layout/RowColumnImplKt;->access$intrinsicSize(Ljava/util/List;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;IIII)I PLandroidx/compose/foundation/layout/SizeKt$createWrapContentSizeModifier$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLandroidx/compose/foundation/layout/SizeKt;->defaultMinSize-VpY3zN4$default(FFI)Landroidx/compose/ui/Modifier; PLandroidx/compose/foundation/layout/SizeKt;->wrapContentSize$default(Landroidx/compose/ui/Modifier;Landroidx/compose/ui/BiasAlignment;I)Landroidx/compose/ui/Modifier; -PLandroidx/compose/foundation/layout/UnionInsets;->getTop(Landroidx/compose/ui/unit/Density;)I PLandroidx/compose/foundation/layout/UnspecifiedConstraintsModifier;->equals(Ljava/lang/Object;)Z -PLandroidx/compose/foundation/layout/WindowInsetsSizeKt$windowInsetsTopHeight$2;->()V -PLandroidx/compose/foundation/layout/WindowInsetsSizeKt$windowInsetsTopHeight$2;->()V -PLandroidx/compose/foundation/layout/WindowInsetsSizeKt$windowInsetsTopHeight$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/foundation/layout/WrapContentModifier$measure$1;->(Landroidx/compose/foundation/layout/WrapContentModifier;ILandroidx/compose/ui/layout/Placeable;ILandroidx/compose/ui/layout/MeasureScope;)V PLandroidx/compose/foundation/layout/WrapContentModifier$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLandroidx/compose/foundation/layout/WrapContentModifier;->equals(Ljava/lang/Object;)Z PLandroidx/compose/foundation/layout/WrapContentModifier;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; PLandroidx/compose/foundation/lazy/AwaitFirstLayoutModifier$waitForFirstLayout$1;->(Landroidx/compose/foundation/lazy/AwaitFirstLayoutModifier;Lkotlin/coroutines/Continuation;)V PLandroidx/compose/foundation/lazy/AwaitFirstLayoutModifier;->waitForFirstLayout(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +PLandroidx/compose/foundation/lazy/DataIndex;->(I)V PLandroidx/compose/foundation/lazy/DataIndex;->equals(Ljava/lang/Object;)Z +PLandroidx/compose/foundation/lazy/EmptyLazyListLayoutInfo;->()V +PLandroidx/compose/foundation/lazy/EmptyLazyListLayoutInfo;->()V PLandroidx/compose/foundation/lazy/LazyDslKt;->LazyColumn(Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/lazy/LazyListState;Landroidx/compose/foundation/layout/PaddingValues;ZLandroidx/compose/foundation/layout/Arrangement$Vertical;Landroidx/compose/ui/Alignment$Horizontal;Landroidx/compose/foundation/gestures/FlingBehavior;ZLkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V -PLandroidx/compose/foundation/lazy/LazyListKt$ScrollPositionUpdater$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/foundation/lazy/LazyItemScopeImpl;->()V +PLandroidx/compose/foundation/lazy/LazyListBeyondBoundsInfo;->()V +PLandroidx/compose/foundation/lazy/LazyListBeyondBoundsModifierLocal;->(Landroidx/compose/foundation/lazy/LazyListState;Landroidx/compose/foundation/lazy/LazyListBeyondBoundsInfo;ZLandroidx/compose/ui/unit/LayoutDirection;Landroidx/compose/foundation/gestures/Orientation;)V +PLandroidx/compose/foundation/lazy/LazyListBeyondBoundsModifierLocal;->getKey()Landroidx/compose/ui/modifier/ProvidableModifierLocal; +PLandroidx/compose/foundation/lazy/LazyListBeyondBoundsModifierLocal;->getValue()Ljava/lang/Object; +PLandroidx/compose/foundation/lazy/LazyListIntervalContent;->(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V +PLandroidx/compose/foundation/lazy/LazyListIntervalContent;->getKey()Lkotlin/jvm/functions/Function1; +PLandroidx/compose/foundation/lazy/LazyListIntervalContent;->getType()Lkotlin/jvm/functions/Function1; +PLandroidx/compose/foundation/lazy/LazyListItemPlacementAnimator;->(Lkotlinx/coroutines/CoroutineScope;Z)V +PLandroidx/compose/foundation/lazy/LazyListItemProviderImpl$1;->(Landroidx/compose/foundation/lazy/LazyItemScopeImpl;)V +PLandroidx/compose/foundation/lazy/LazyListItemProviderImpl$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/foundation/lazy/LazyListItemProviderImpl;->(Landroidx/compose/foundation/lazy/layout/MutableIntervalList;Lkotlin/ranges/IntRange;Landroidx/compose/foundation/lazy/LazyItemScopeImpl;)V +PLandroidx/compose/foundation/lazy/LazyListItemProviderImpl;->Item(ILandroidx/compose/runtime/Composer;I)V +PLandroidx/compose/foundation/lazy/LazyListItemProviderImpl;->getContentType(I)Ljava/lang/Object; +PLandroidx/compose/foundation/lazy/LazyListItemProviderImpl;->getItemCount()I +PLandroidx/compose/foundation/lazy/LazyListItemProviderImpl;->getKey(I)Ljava/lang/Object; +PLandroidx/compose/foundation/lazy/LazyListItemProviderImpl;->getKeyToIndexMap()Ljava/util/Map; +PLandroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProvider$1$1;->(Landroidx/compose/runtime/DerivedSnapshotState;)V +PLandroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProvider$1$1;->Item(ILandroidx/compose/runtime/Composer;I)V +PLandroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProvider$1$1;->getContentType(I)Ljava/lang/Object; +PLandroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProvider$1$1;->getHeaderIndexes()Ljava/util/List; +PLandroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProvider$1$1;->getItemCount()I +PLandroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProvider$1$1;->getItemScope()Landroidx/compose/foundation/lazy/LazyItemScopeImpl; +PLandroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProvider$1$1;->getKey(I)Ljava/lang/Object; +PLandroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProvider$1$1;->getKeyToIndexMap()Ljava/util/Map; +PLandroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProvider$1$itemProviderState$1;->(Landroidx/compose/runtime/MutableState;Landroidx/compose/runtime/MutableState;Landroidx/compose/foundation/lazy/LazyItemScopeImpl;)V +PLandroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProvider$1$itemProviderState$1;->invoke()Ljava/lang/Object; +PLandroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProvider$nearestItemsRangeState$1$1;->(Landroidx/compose/foundation/lazy/LazyListState;)V +PLandroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProvider$nearestItemsRangeState$1$1;->invoke()Ljava/lang/Object; +PLandroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProvider$nearestItemsRangeState$2;->()V +PLandroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProvider$nearestItemsRangeState$2;->()V +PLandroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProvider$nearestItemsRangeState$2;->invoke()Ljava/lang/Object; +PLandroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProvider$nearestItemsRangeState$3;->()V +PLandroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProvider$nearestItemsRangeState$3;->()V +PLandroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProvider$nearestItemsRangeState$3;->invoke()Ljava/lang/Object; +PLandroidx/compose/foundation/lazy/LazyListKt$ScrollPositionUpdater$1;->(Landroidx/compose/foundation/lazy/LazyListItemProvider;Landroidx/compose/foundation/lazy/LazyListState;I)V +PLandroidx/compose/foundation/lazy/LazyListKt$rememberLazyListMeasurePolicy$1$1$2;->(Landroidx/compose/foundation/lazy/layout/LazyLayoutMeasureScope;JII)V +PLandroidx/compose/foundation/lazy/LazyListKt$rememberLazyListMeasurePolicy$1$1$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/foundation/lazy/LazyListKt$rememberLazyListMeasurePolicy$1$1$measuredItemProvider$1;->(IILandroidx/compose/foundation/lazy/layout/LazyLayoutMeasureScope;ZLandroidx/compose/ui/Alignment$Horizontal;Landroidx/compose/ui/Alignment$Vertical;ZIILandroidx/compose/foundation/lazy/LazyListItemPlacementAnimator;J)V +PLandroidx/compose/foundation/lazy/LazyListKt$rememberLazyListMeasurePolicy$1$1;->(ZLandroidx/compose/foundation/layout/PaddingValues;ZLandroidx/compose/foundation/lazy/LazyListState;Landroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProvider$1$1;Landroidx/compose/foundation/layout/Arrangement$Vertical;Landroidx/compose/foundation/layout/Arrangement$Horizontal;Landroidx/compose/foundation/lazy/LazyListItemPlacementAnimator;Landroidx/compose/foundation/lazy/LazyListBeyondBoundsInfo;Landroidx/compose/ui/Alignment$Horizontal;Landroidx/compose/ui/Alignment$Vertical;Landroidx/compose/foundation/OverscrollEffect;)V +PLandroidx/compose/foundation/lazy/LazyListKt;->LazyList(Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/lazy/LazyListState;Landroidx/compose/foundation/layout/PaddingValues;ZZLandroidx/compose/foundation/gestures/FlingBehavior;ZLandroidx/compose/ui/Alignment$Horizontal;Landroidx/compose/foundation/layout/Arrangement$Vertical;Landroidx/compose/ui/Alignment$Vertical;Landroidx/compose/foundation/layout/Arrangement$Horizontal;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;III)V +PLandroidx/compose/foundation/lazy/LazyListKt;->ScrollPositionUpdater(Landroidx/compose/foundation/lazy/LazyListItemProvider;Landroidx/compose/foundation/lazy/LazyListState;Landroidx/compose/runtime/Composer;I)V +PLandroidx/compose/foundation/lazy/LazyListMeasureKt$measureLazyList$3;->(Ljava/util/ArrayList;Landroidx/compose/foundation/lazy/LazyListPositionedItem;)V +PLandroidx/compose/foundation/lazy/LazyListMeasureKt$measureLazyList$3;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/foundation/lazy/LazyListMeasureResult;->(Landroidx/compose/foundation/lazy/LazyMeasuredItem;IZFLandroidx/compose/ui/layout/MeasureResult;Ljava/util/List;ILandroidx/compose/foundation/gestures/Orientation;)V +PLandroidx/compose/foundation/lazy/LazyListMeasureResult;->getAlignmentLines()Ljava/util/Map; +PLandroidx/compose/foundation/lazy/LazyListMeasureResult;->getHeight()I PLandroidx/compose/foundation/lazy/LazyListMeasureResult;->getTotalItemsCount()I PLandroidx/compose/foundation/lazy/LazyListMeasureResult;->getVisibleItemsInfo()Ljava/util/List; +PLandroidx/compose/foundation/lazy/LazyListMeasureResult;->getWidth()I +PLandroidx/compose/foundation/lazy/LazyListMeasureResult;->placeChildren()V +PLandroidx/compose/foundation/lazy/LazyListPinningModifier$Companion$EmptyPinnedItemsHandle$1;->()V +PLandroidx/compose/foundation/lazy/LazyListPinningModifier;->()V +PLandroidx/compose/foundation/lazy/LazyListPinningModifier;->(Landroidx/compose/foundation/lazy/LazyListState;Landroidx/compose/foundation/lazy/LazyListBeyondBoundsInfo;)V +PLandroidx/compose/foundation/lazy/LazyListPinningModifier;->getKey()Landroidx/compose/ui/modifier/ProvidableModifierLocal; +PLandroidx/compose/foundation/lazy/LazyListPinningModifier;->getValue()Ljava/lang/Object; +PLandroidx/compose/foundation/lazy/LazyListPinningModifier;->onModifierLocalsUpdated(Landroidx/compose/ui/modifier/ModifierLocalReadScope;)V +PLandroidx/compose/foundation/lazy/LazyListPlaceableWrapper;->(JLandroidx/compose/ui/layout/Placeable;Ljava/lang/Object;)V +PLandroidx/compose/foundation/lazy/LazyListPositionedItem;->(IILjava/lang/Object;IIIIZLjava/util/ArrayList;Landroidx/compose/foundation/lazy/LazyListItemPlacementAnimator;J)V +PLandroidx/compose/foundation/lazy/LazyListPositionedItem;->getAnimationSpec(I)Landroidx/compose/animation/core/FiniteAnimationSpec; PLandroidx/compose/foundation/lazy/LazyListPositionedItem;->getIndex()I +PLandroidx/compose/foundation/lazy/LazyListPositionedItem;->getOffset-Bjo55l4(I)J +PLandroidx/compose/foundation/lazy/LazyListPositionedItem;->place(Landroidx/compose/ui/layout/Placeable$PlacementScope;)V PLandroidx/compose/foundation/lazy/LazyListScope;->item$default(Landroidx/compose/foundation/lazy/LazyListScope;Ljava/lang/String;Landroidx/compose/runtime/internal/ComposableLambdaImpl;I)V PLandroidx/compose/foundation/lazy/LazyListScopeImpl$item$1;->(Ljava/lang/Object;)V PLandroidx/compose/foundation/lazy/LazyListScopeImpl$item$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/foundation/lazy/LazyListScopeImpl$item$2;->(Ljava/lang/Object;)V PLandroidx/compose/foundation/lazy/LazyListScopeImpl$item$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/foundation/lazy/LazyListScopeImpl$item$3;->(Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V +PLandroidx/compose/foundation/lazy/LazyListScopeImpl$item$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/foundation/lazy/LazyListScopeImpl;->()V PLandroidx/compose/foundation/lazy/LazyListScopeImpl;->item(Ljava/lang/Object;Ljava/lang/Object;Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V -PLandroidx/compose/foundation/lazy/LazyListState$Companion$Saver$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/foundation/lazy/LazyListScrollPosition;->(II)V +PLandroidx/compose/foundation/lazy/LazyListScrollPosition;->update-AhXoVpI(II)V +PLandroidx/compose/foundation/lazy/LazyListState$Companion$Saver$1;->()V +PLandroidx/compose/foundation/lazy/LazyListState$Companion$Saver$1;->()V +PLandroidx/compose/foundation/lazy/LazyListState$Companion$Saver$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/foundation/lazy/LazyListState$Companion$Saver$2;->()V +PLandroidx/compose/foundation/lazy/LazyListState$Companion$Saver$2;->()V +PLandroidx/compose/foundation/lazy/LazyListState$remeasurementModifier$1;->(Landroidx/compose/foundation/lazy/LazyListState;)V +PLandroidx/compose/foundation/lazy/LazyListState$remeasurementModifier$1;->onRemeasurementAvailable(Landroidx/compose/ui/layout/Remeasurement;)V PLandroidx/compose/foundation/lazy/LazyListState$scroll$1;->(Landroidx/compose/foundation/lazy/LazyListState;Lkotlin/coroutines/Continuation;)V PLandroidx/compose/foundation/lazy/LazyListState$scroll$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/foundation/lazy/LazyListState$scrollableState$1;->(Landroidx/compose/foundation/lazy/LazyListState;)V +PLandroidx/compose/foundation/lazy/LazyListState$scrollableState$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/foundation/lazy/LazyListState;->()V +PLandroidx/compose/foundation/lazy/LazyListState;->(II)V +PLandroidx/compose/foundation/lazy/LazyListState;->getFirstVisibleItemIndex()I +PLandroidx/compose/foundation/lazy/LazyListState;->isScrollInProgress()Z PLandroidx/compose/foundation/lazy/LazyListState;->scroll(Landroidx/compose/foundation/MutatePriority;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +PLandroidx/compose/foundation/lazy/LazyListState;->updateScrollPositionIfTheFirstItemWasMoved$foundation_release(Landroidx/compose/foundation/lazy/LazyListItemProvider;)V +PLandroidx/compose/foundation/lazy/LazyListStateKt$rememberLazyListState$1$1;->(II)V +PLandroidx/compose/foundation/lazy/LazyListStateKt$rememberLazyListState$1$1;->invoke()Ljava/lang/Object; +PLandroidx/compose/foundation/lazy/LazyListStateKt;->rememberLazyListState(Landroidx/compose/runtime/Composer;)Landroidx/compose/foundation/lazy/LazyListState; +PLandroidx/compose/foundation/lazy/LazyMeasuredItemProvider;->(JZLandroidx/compose/foundation/lazy/LazyListItemProvider;Landroidx/compose/foundation/lazy/layout/LazyLayoutMeasureScope;Landroidx/compose/foundation/lazy/LazyListKt$rememberLazyListMeasurePolicy$1$1$measuredItemProvider$1;)V +PLandroidx/compose/foundation/lazy/LazyMeasuredItemProvider;->getAndMeasure-ZjPyQlc(I)Landroidx/compose/foundation/lazy/LazyMeasuredItem; +PLandroidx/compose/foundation/lazy/LazySemanticsKt$rememberLazyListSemanticState$1$1$scrollAxisRange$1;->(Landroidx/compose/foundation/lazy/LazyListState;)V PLandroidx/compose/foundation/lazy/LazySemanticsKt$rememberLazyListSemanticState$1$1$scrollAxisRange$1;->invoke()Ljava/lang/Object; +PLandroidx/compose/foundation/lazy/LazySemanticsKt$rememberLazyListSemanticState$1$1$scrollAxisRange$2;->(Landroidx/compose/foundation/lazy/LazyListState;Landroidx/compose/foundation/lazy/layout/LazyLayoutItemProvider;)V PLandroidx/compose/foundation/lazy/LazySemanticsKt$rememberLazyListSemanticState$1$1$scrollAxisRange$2;->invoke()Ljava/lang/Object; +PLandroidx/compose/foundation/lazy/LazySemanticsKt$rememberLazyListSemanticState$1$1;->(ZLandroidx/compose/foundation/lazy/LazyListState;Landroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProvider$1$1;Z)V +PLandroidx/compose/foundation/lazy/LazySemanticsKt$rememberLazyListSemanticState$1$1;->collectionInfo()Landroidx/compose/ui/semantics/CollectionInfo; +PLandroidx/compose/foundation/lazy/LazySemanticsKt$rememberLazyListSemanticState$1$1;->scrollAxisRange()Landroidx/compose/ui/semantics/ScrollAxisRange; PLandroidx/compose/foundation/lazy/grid/ItemIndex;->equals(Ljava/lang/Object;)Z PLandroidx/compose/foundation/lazy/grid/LazyGridKt$rememberLazyGridMeasurePolicy$1$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/foundation/lazy/grid/LazyGridMeasureResult;->getTotalItemsCount()I PLandroidx/compose/foundation/lazy/grid/LazyGridMeasureResult;->getVisibleItemsInfo()Ljava/util/List; PLandroidx/compose/foundation/lazy/grid/LazyGridPositionedItem;->getIndex()I PLandroidx/compose/foundation/lazy/grid/LazyGridPositionedItem;->getRow()I -PLandroidx/compose/foundation/lazy/grid/LazyGridScopeImpl$DefaultSpan$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/foundation/lazy/grid/LazyGridState$Companion$Saver$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/foundation/lazy/grid/LazyGridState$scroll$1;->(Landroidx/compose/foundation/lazy/grid/LazyGridState;Lkotlin/coroutines/Continuation;)V PLandroidx/compose/foundation/lazy/grid/LazyGridState$scroll$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; -PLandroidx/compose/foundation/lazy/grid/LazyGridState;->isVertical$foundation_release()Z PLandroidx/compose/foundation/lazy/grid/LazyGridState;->scroll(Landroidx/compose/foundation/MutatePriority;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLandroidx/compose/foundation/lazy/grid/LazySemanticsKt$rememberLazyGridSemanticState$1$1$scrollAxisRange$1;->invoke()Ljava/lang/Object; PLandroidx/compose/foundation/lazy/grid/LazySemanticsKt$rememberLazyGridSemanticState$1$1$scrollAxisRange$2;->invoke()Ljava/lang/Object; PLandroidx/compose/foundation/lazy/grid/LineIndex;->(I)V PLandroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory$CachedItemContent$createContentLambda$1$2$invoke$$inlined$onDispose$1;->dispose()V -PLandroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory;->getContentType(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/foundation/lazy/layout/LazyLayoutItemReusePolicy;->areCompatible(Ljava/lang/Object;Ljava/lang/Object;)Z PLandroidx/compose/foundation/lazy/layout/LazyLayoutPrefetcher$PrefetchRequest;->(IJ)V PLandroidx/compose/foundation/lazy/layout/LazyLayoutPrefetcher$PrefetchRequest;->cancel()V @@ -13645,9 +12814,7 @@ PLandroidx/compose/foundation/lazy/layout/LazyLayoutPrefetcher;->doFrame(J)V PLandroidx/compose/foundation/lazy/layout/LazyLayoutPrefetcher;->onForgotten()V PLandroidx/compose/foundation/lazy/layout/LazyLayoutPrefetcher;->schedulePrefetch-0kLqBqw(JI)Landroidx/compose/foundation/lazy/layout/LazyLayoutPrefetcher$PrefetchRequest; PLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder$SaveableStateProvider$1$invoke$$inlined$onDispose$1;->dispose()V -PLandroidx/compose/foundation/selection/ToggleableKt$toggleable$4$1;->invoke()Ljava/lang/Object; PLandroidx/compose/foundation/shape/DpCornerSize;->equals(Ljava/lang/Object;)Z -PLandroidx/compose/foundation/text/TextController$measurePolicy$1;->maxIntrinsicHeight(Landroidx/compose/ui/node/NodeCoordinator;Ljava/util/List;I)I PLandroidx/compose/material/ripple/AndroidRippleIndicationInstance$onInvalidateRipple$1;->invoke()Ljava/lang/Object; PLandroidx/compose/material/ripple/AndroidRippleIndicationInstance;->addRipple(Landroidx/compose/foundation/interaction/PressInteraction$Press;Lkotlinx/coroutines/CoroutineScope;)V PLandroidx/compose/material/ripple/AndroidRippleIndicationInstance;->removeRipple(Landroidx/compose/foundation/interaction/PressInteraction$Press;)V @@ -13669,14 +12836,12 @@ PLandroidx/compose/material/ripple/UnprojectedRipple;->(Z)V PLandroidx/compose/material/ripple/UnprojectedRipple;->getDirtyBounds()Landroid/graphics/Rect; PLandroidx/compose/material/ripple/UnprojectedRipple;->isProjected()Z PLandroidx/compose/material3/AndroidMenu_androidKt$DropdownMenu$2;->(ZLkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;JLandroidx/compose/ui/window/PopupProperties;Lkotlin/jvm/functions/Function3;II)V -PLandroidx/compose/material3/AndroidMenu_androidKt;->DropdownMenu-ILWXrKs(ZLkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;JLandroidx/compose/ui/window/PopupProperties;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;II)V PLandroidx/compose/material3/ButtonColors;->equals(Ljava/lang/Object;)Z PLandroidx/compose/material3/ButtonDefaults;->textButtonColors-ro_MJ88(JJJJLandroidx/compose/runtime/Composer;II)Landroidx/compose/material3/ButtonColors; PLandroidx/compose/material3/ButtonElevation$animateElevation$3;->(Landroidx/compose/animation/core/Animatable;Landroidx/compose/material3/ButtonElevation;FLandroidx/compose/foundation/interaction/Interaction;Lkotlin/coroutines/Continuation;)V PLandroidx/compose/material3/ButtonElevation$animateElevation$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/compose/material3/ButtonElevation$animateElevation$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/material3/ButtonKt$Button$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLandroidx/compose/material3/ButtonKt;->TextButton(Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;ZLandroidx/compose/ui/graphics/Shape;Landroidx/compose/material3/ButtonColors;Landroidx/compose/material3/ButtonElevation;Landroidx/compose/foundation/BorderStroke;Landroidx/compose/foundation/layout/PaddingValues;Landroidx/compose/foundation/interaction/MutableInteractionSource;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;II)V PLandroidx/compose/material3/CardColors;->(JJJJ)V PLandroidx/compose/material3/CardColors;->equals(Ljava/lang/Object;)Z PLandroidx/compose/material3/CardDefaults;->cardColors-ro_MJ88(JLandroidx/compose/runtime/Composer;II)Landroidx/compose/material3/CardColors; @@ -13688,102 +12853,18 @@ PLandroidx/compose/material3/CardElevation$animateElevation$2;->(ZLandroid PLandroidx/compose/material3/CardElevation$animateElevation$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/compose/material3/CardElevation$animateElevation$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/material3/CardElevation;->(FFFFFF)V -PLandroidx/compose/material3/CardElevation;->animateElevation(ZLandroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/runtime/Composer;I)Landroidx/compose/animation/core/AnimationState; PLandroidx/compose/material3/CardKt$Card$4;->(Lkotlin/jvm/functions/Function3;I)V -PLandroidx/compose/material3/CardKt$Card$4;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/material3/CardKt$Card$5;->(Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;ZLandroidx/compose/ui/graphics/Shape;Landroidx/compose/material3/CardColors;Landroidx/compose/material3/CardElevation;Landroidx/compose/foundation/BorderStroke;Landroidx/compose/foundation/interaction/MutableInteractionSource;Lkotlin/jvm/functions/Function3;II)V -PLandroidx/compose/material3/CardKt;->Card(Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;ZLandroidx/compose/ui/graphics/Shape;Landroidx/compose/material3/CardColors;Landroidx/compose/material3/CardElevation;Landroidx/compose/foundation/BorderStroke;Landroidx/compose/foundation/interaction/MutableInteractionSource;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;II)V -PLandroidx/compose/material3/ChipKt$ChipContent$1;->(FLandroidx/compose/foundation/layout/PaddingValues;Lkotlin/jvm/functions/Function2;ILkotlin/jvm/functions/Function2;JLkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;J)V -PLandroidx/compose/material3/ChipKt$ChipContent$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLandroidx/compose/material3/ChipKt$FilterChip$2;->(ZLkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function2;Landroidx/compose/ui/Modifier;ZLkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Landroidx/compose/ui/graphics/Shape;Landroidx/compose/material3/SelectableChipColors;Landroidx/compose/material3/SelectableChipElevation;Landroidx/compose/material3/SelectableChipBorder;Landroidx/compose/foundation/interaction/MutableInteractionSource;III)V -PLandroidx/compose/material3/ChipKt$SelectableChip$1;->()V -PLandroidx/compose/material3/ChipKt$SelectableChip$1;->()V -PLandroidx/compose/material3/ChipKt$SelectableChip$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLandroidx/compose/material3/ChipKt$SelectableChip$2;->(Landroidx/compose/material3/SelectableChipColors;ZZIILkotlin/jvm/functions/Function2;Landroidx/compose/ui/text/TextStyle;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;FLandroidx/compose/foundation/layout/PaddingValues;)V -PLandroidx/compose/material3/ChipKt$SelectableChip$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLandroidx/compose/material3/ChipKt$SelectableChip$3;->(ZLandroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function0;ZLkotlin/jvm/functions/Function2;Landroidx/compose/ui/text/TextStyle;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Landroidx/compose/ui/graphics/Shape;Landroidx/compose/material3/SelectableChipColors;Landroidx/compose/material3/SelectableChipElevation;Landroidx/compose/foundation/BorderStroke;FLandroidx/compose/foundation/layout/PaddingValues;Landroidx/compose/foundation/interaction/MutableInteractionSource;II)V -PLandroidx/compose/material3/ChipKt;->()V -PLandroidx/compose/material3/ChipKt;->FilterChip(ZLkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function2;Landroidx/compose/ui/Modifier;ZLkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Landroidx/compose/ui/graphics/Shape;Landroidx/compose/material3/SelectableChipColors;Landroidx/compose/material3/SelectableChipElevation;Landroidx/compose/material3/SelectableChipBorder;Landroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/runtime/Composer;III)V -PLandroidx/compose/material3/ChipKt;->SelectableChip-u0RnIRE(ZLandroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function0;ZLkotlin/jvm/functions/Function2;Landroidx/compose/ui/text/TextStyle;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Landroidx/compose/ui/graphics/Shape;Landroidx/compose/material3/SelectableChipColors;Landroidx/compose/material3/SelectableChipElevation;Landroidx/compose/foundation/BorderStroke;FLandroidx/compose/foundation/layout/PaddingValues;Landroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/runtime/Composer;II)V -PLandroidx/compose/material3/ChipKt;->access$ChipContent-fe0OD_I(Lkotlin/jvm/functions/Function2;Landroidx/compose/ui/text/TextStyle;JLkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;JJFLandroidx/compose/foundation/layout/PaddingValues;Landroidx/compose/runtime/Composer;I)V -PLandroidx/compose/material3/ComposableSingletons$TabRowKt$lambda-1$1;->()V -PLandroidx/compose/material3/ComposableSingletons$TabRowKt$lambda-1$1;->()V -PLandroidx/compose/material3/ComposableSingletons$TabRowKt$lambda-1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLandroidx/compose/material3/ComposableSingletons$TabRowKt$lambda-2$1;->()V -PLandroidx/compose/material3/ComposableSingletons$TabRowKt$lambda-2$1;->()V -PLandroidx/compose/material3/ComposableSingletons$TabRowKt;->()V -PLandroidx/compose/material3/DividerDefaults;->()V -PLandroidx/compose/material3/DividerKt$Divider$1;->(Landroidx/compose/ui/Modifier;FJII)V -PLandroidx/compose/material3/DividerKt;->Divider-9IZ8Weo(Landroidx/compose/ui/Modifier;FJLandroidx/compose/runtime/Composer;II)V PLandroidx/compose/material3/ElevationKt;->()V PLandroidx/compose/material3/ElevationKt;->animateElevation-rAjV9yQ(Landroidx/compose/animation/core/Animatable;FLandroidx/compose/foundation/interaction/Interaction;Landroidx/compose/foundation/interaction/Interaction;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -PLandroidx/compose/material3/FilterChipDefaults;->()V -PLandroidx/compose/material3/FilterChipDefaults;->filterChipBorder-gHcDVlo(JJJJFFLandroidx/compose/runtime/Composer;II)Landroidx/compose/material3/SelectableChipBorder; -PLandroidx/compose/material3/FilterChipDefaults;->filterChipColors-XqyqHi0(JJJJJJJJJLandroidx/compose/runtime/Composer;III)Landroidx/compose/material3/SelectableChipColors; PLandroidx/compose/material3/IconKt$Icon$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/material3/MappedInteractionSource$special$$inlined$map$1$2$1;->(Landroidx/compose/material3/MappedInteractionSource$special$$inlined$map$1$2;Lkotlin/coroutines/Continuation;)V PLandroidx/compose/material3/MappedInteractionSource$special$$inlined$map$1$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -PLandroidx/compose/material3/MaterialTheme;->getColorScheme(Landroidx/compose/runtime/Composer;)Landroidx/compose/material3/ColorScheme; PLandroidx/compose/material3/MinimumTouchTargetModifier;->equals(Ljava/lang/Object;)Z -PLandroidx/compose/material3/SelectableChipBorder;->(JJJJFF)V -PLandroidx/compose/material3/SelectableChipColors;->(JJJJJJJJJJJJJ)V -PLandroidx/compose/material3/SelectableChipElevation$animateElevation$1$1$1;->(Landroidx/compose/runtime/snapshots/SnapshotStateList;)V -PLandroidx/compose/material3/SelectableChipElevation$animateElevation$1$1;->(Landroidx/compose/foundation/interaction/InteractionSource;Landroidx/compose/runtime/snapshots/SnapshotStateList;Lkotlin/coroutines/Continuation;)V -PLandroidx/compose/material3/SelectableChipElevation$animateElevation$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; -PLandroidx/compose/material3/SelectableChipElevation$animateElevation$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; -PLandroidx/compose/material3/SelectableChipElevation$animateElevation$3;->(Landroidx/compose/animation/core/Animatable;Landroidx/compose/material3/SelectableChipElevation;FLandroidx/compose/foundation/interaction/Interaction;Lkotlin/coroutines/Continuation;)V -PLandroidx/compose/material3/SelectableChipElevation$animateElevation$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; -PLandroidx/compose/material3/SelectableChipElevation$animateElevation$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; -PLandroidx/compose/material3/SelectableChipElevation;->(FFFFFF)V -PLandroidx/compose/material3/SelectableChipElevation;->animateElevation(ZLandroidx/compose/foundation/interaction/InteractionSource;Landroidx/compose/runtime/Composer;I)Landroidx/compose/animation/core/AnimationState; -PLandroidx/compose/material3/TabKt$Tab$2;->(ILandroidx/compose/runtime/internal/ComposableLambdaImpl;Lkotlin/jvm/functions/Function2;)V -PLandroidx/compose/material3/TabKt$Tab$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLandroidx/compose/material3/TabKt$Tab$3;->(ZLkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;ZLkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;JJLandroidx/compose/foundation/interaction/MutableInteractionSource;II)V -PLandroidx/compose/material3/TabKt$Tab$5;->(Landroidx/compose/ui/Modifier;ZLandroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/material/ripple/PlatformRipple;ZLkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function3;I)V -PLandroidx/compose/material3/TabKt$Tab$5;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLandroidx/compose/material3/TabKt$Tab$styledText$1$1;->(ILkotlin/jvm/functions/Function2;)V -PLandroidx/compose/material3/TabKt$Tab$styledText$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLandroidx/compose/material3/TabKt$TabBaselineLayout$2$measure$1;->(Landroidx/compose/ui/layout/Placeable;Landroidx/compose/ui/layout/Placeable;Landroidx/compose/ui/layout/MeasureScope;IILjava/lang/Integer;Ljava/lang/Integer;)V -PLandroidx/compose/material3/TabKt$TabBaselineLayout$2$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLandroidx/compose/material3/TabKt$TabBaselineLayout$2;->(Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;)V -PLandroidx/compose/material3/TabKt$TabBaselineLayout$2;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/layout/MeasureResult; -PLandroidx/compose/material3/TabKt$TabTransition$1;->(JJZLkotlin/jvm/functions/Function2;I)V -PLandroidx/compose/material3/TabKt$TabTransition$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLandroidx/compose/material3/TabKt$TabTransition$color$2;->()V -PLandroidx/compose/material3/TabKt$TabTransition$color$2;->()V -PLandroidx/compose/material3/TabKt$TabTransition$color$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLandroidx/compose/material3/TabKt;->()V -PLandroidx/compose/material3/TabKt;->Tab-bogVsAg(ZLkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;ZJJLandroidx/compose/foundation/interaction/MutableInteractionSource;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;II)V -PLandroidx/compose/material3/TabKt;->Tab-wqdebIU(ZLkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;ZLkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;JJLandroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/runtime/Composer;II)V -PLandroidx/compose/material3/TabKt;->TabTransition-Klgx-Pg(JJZLkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;I)V -PLandroidx/compose/material3/TabKt;->access$TabBaselineLayout(Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;I)V -PLandroidx/compose/material3/TabPosition;->(FF)V -PLandroidx/compose/material3/TabRowDefaults$tabIndicatorOffset$2;->(Landroidx/compose/material3/TabPosition;)V -PLandroidx/compose/material3/TabRowDefaults$tabIndicatorOffset$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLandroidx/compose/material3/TabRowDefaults;->()V -PLandroidx/compose/material3/TabRowDefaults;->()V -PLandroidx/compose/material3/TabRowDefaults;->Indicator-9IZ8Weo(Landroidx/compose/ui/Modifier;FJLandroidx/compose/runtime/Composer;II)V -PLandroidx/compose/material3/TabRowKt$TabRow$2$1$1$1$3;->(Lkotlin/jvm/functions/Function3;Ljava/util/List;I)V -PLandroidx/compose/material3/TabRowKt$TabRow$2$1$1$1$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLandroidx/compose/material3/TabRowKt$TabRow$2$1$1$1;->(Ljava/util/ArrayList;Landroidx/compose/ui/layout/SubcomposeMeasureScope;Lkotlin/jvm/functions/Function2;IJILkotlin/jvm/functions/Function3;Ljava/util/ArrayList;II)V -PLandroidx/compose/material3/TabRowKt$TabRow$2$1$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLandroidx/compose/material3/TabRowKt$TabRow$2$1$1;->(Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function3;I)V -PLandroidx/compose/material3/TabRowKt$TabRow$2$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLandroidx/compose/material3/TabRowKt$TabRow$2;->(Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function3;I)V -PLandroidx/compose/material3/TabRowKt$TabRow$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLandroidx/compose/material3/TabRowKt$TabRow$3;->(ILandroidx/compose/ui/Modifier;JJLkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;II)V -PLandroidx/compose/material3/TabRowKt;->()V -PLandroidx/compose/material3/TabRowKt;->TabRow-pAZo6Ak(ILandroidx/compose/ui/Modifier;JJLkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;II)V -PLandroidx/compose/material3/TabSlots;->()V -PLandroidx/compose/material3/TabSlots;->(ILjava/lang/String;)V PLandroidx/compose/material3/TopAppBarColors;->equals(Ljava/lang/Object;)Z -PLandroidx/compose/material3/tokens/DividerTokens;->()V PLandroidx/compose/material3/tokens/FilledCardTokens;->()V -PLandroidx/compose/material3/tokens/FilterChipTokens;->()V -PLandroidx/compose/material3/tokens/PrimaryNavigationTabTokens;->()V PLandroidx/compose/runtime/ComposerImpl$deactivateToEndGroup$2$1;->(IILjava/lang/Object;)V PLandroidx/compose/runtime/ComposerImpl$deactivateToEndGroup$2$2;->(IILjava/lang/Object;)V -PLandroidx/compose/runtime/ComposerKt$$ExternalSyntheticOutline0;->m(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; PLandroidx/compose/runtime/CompositionContext;->unregisterComposer$runtime_release(Landroidx/compose/runtime/Composer;)V PLandroidx/compose/runtime/JoinedKey;->(Ljava/lang/Integer;Ljava/lang/Object;)V PLandroidx/compose/runtime/JoinedKey;->equals(Ljava/lang/Object;)Z @@ -13801,31 +12882,29 @@ PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementation PLandroidx/compose/runtime/saveable/SaveableStateHolderImpl$RegistryHolder;->saveTo(Ljava/util/Map;)V PLandroidx/compose/runtime/saveable/SaveableStateHolderImpl$SaveableStateProvider$1$1$invoke$$inlined$onDispose$1;->dispose()V PLandroidx/compose/runtime/saveable/SaveableStateHolderImpl;->removeState(Ljava/lang/Object;)V -PLandroidx/compose/runtime/snapshots/NestedReadonlySnapshot$readObserver$1$1$1;->(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V -PLandroidx/compose/runtime/snapshots/NestedReadonlySnapshot$readObserver$1$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/runtime/snapshots/Snapshot$Companion$registerApplyObserver$2;->dispose()V PLandroidx/compose/runtime/snapshots/SnapshotStateList;->iterator()Ljava/util/Iterator; PLandroidx/compose/runtime/snapshots/SnapshotStateList;->remove(I)Ljava/lang/Object; PLandroidx/compose/runtime/snapshots/SnapshotStateList;->remove(Ljava/lang/Object;)Z PLandroidx/compose/runtime/snapshots/StateListIterator;->remove()V PLandroidx/compose/ui/TempListUtilsKt;->fastJoinToString$default(Ljava/util/List;)Ljava/lang/String; +PLandroidx/compose/ui/ZIndexModifier;->equals(Ljava/lang/Object;)Z PLandroidx/compose/ui/autofill/AutofillCallback;->unregister(Landroidx/compose/ui/autofill/AndroidAutofill;)V -PLandroidx/compose/ui/draw/CacheDrawScope;->getDensity()F +PLandroidx/compose/ui/geometry/MutableRect;->()V PLandroidx/compose/ui/geometry/Offset;->copy-dBAh8RU$default(JI)J PLandroidx/compose/ui/geometry/Offset;->equals-impl0(JJ)Z PLandroidx/compose/ui/geometry/Offset;->plus-MK-Hz9U(JJ)J -PLandroidx/compose/ui/geometry/Offset;->times-tuRUvjQ(FJ)J PLandroidx/compose/ui/geometry/OffsetKt;->isFinite-k-4lQ0M(J)Z PLandroidx/compose/ui/geometry/Rect;->equals(Ljava/lang/Object;)Z PLandroidx/compose/ui/geometry/Rect;->getCenter-F1C5BW0()J PLandroidx/compose/ui/graphics/AndroidPaint;->setStrokeJoin-Ww9F2mQ(I)V PLandroidx/compose/ui/graphics/AndroidPaint;->setStrokeMiterLimit(F)V -PLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->drawRoundRect-ZuiqVtQ(Landroidx/compose/ui/graphics/Brush;JJJFLandroidx/compose/ui/graphics/drawscope/DrawStyle;Landroidx/compose/ui/graphics/ColorFilter;I)V -PLandroidx/compose/ui/graphics/drawscope/DrawScope;->drawRoundRect-ZuiqVtQ$default(Landroidx/compose/ui/graphics/drawscope/DrawScope;Landroidx/compose/ui/graphics/Brush;JJJLandroidx/compose/ui/graphics/drawscope/Stroke;I)V PLandroidx/compose/ui/graphics/drawscope/Stroke;->(FFIII)V PLandroidx/compose/ui/graphics/drawscope/Stroke;->equals(Ljava/lang/Object;)Z +PLandroidx/compose/ui/graphics/painter/BitmapPainter;->(Landroidx/compose/ui/graphics/ImageBitmap;JJ)V PLandroidx/compose/ui/graphics/painter/BitmapPainter;->applyColorFilter(Landroidx/compose/ui/graphics/ColorFilter;)Z PLandroidx/compose/ui/graphics/painter/BitmapPainter;->getIntrinsicSize-NH-jbRc()J +PLandroidx/compose/ui/graphics/painter/BitmapPainter;->onDraw(Landroidx/compose/ui/graphics/drawscope/DrawScope;)V PLandroidx/compose/ui/input/nestedscroll/NestedScrollDispatcher$dispatchPostFling$1;->(Landroidx/compose/ui/input/nestedscroll/NestedScrollDispatcher;Lkotlin/coroutines/Continuation;)V PLandroidx/compose/ui/input/nestedscroll/NestedScrollDispatcher$dispatchPreFling$1;->(Landroidx/compose/ui/input/nestedscroll/NestedScrollDispatcher;Lkotlin/coroutines/Continuation;)V PLandroidx/compose/ui/input/nestedscroll/NestedScrollDispatcher;->dispatchPostFling-RZ2iAVY(JJLkotlin/coroutines/Continuation;)Ljava/lang/Object; @@ -13840,6 +12919,7 @@ PLandroidx/compose/ui/input/pointer/InternalPointerEvent;->(Ljava/util/Lin PLandroidx/compose/ui/input/pointer/InternalPointerEvent;->issuesEnterExitEvent-0FcD4WY(J)Z PLandroidx/compose/ui/input/pointer/Node;->(Landroidx/compose/ui/node/PointerInputModifierNode;)V PLandroidx/compose/ui/input/pointer/Node;->cleanUpHits(Landroidx/compose/ui/input/pointer/InternalPointerEvent;)V +PLandroidx/compose/ui/input/pointer/Node;->dispatchFinalEventPass(Landroidx/compose/ui/input/pointer/InternalPointerEvent;)Z PLandroidx/compose/ui/input/pointer/NodeParent;->buildCache(Ljava/util/Map;Landroidx/compose/ui/layout/LayoutCoordinates;Landroidx/compose/ui/input/pointer/InternalPointerEvent;Z)Z PLandroidx/compose/ui/input/pointer/NodeParent;->cleanUpHits(Landroidx/compose/ui/input/pointer/InternalPointerEvent;)V PLandroidx/compose/ui/input/pointer/NodeParent;->removeDetachedPointerInputFilters()V @@ -13877,30 +12957,16 @@ PLandroidx/compose/ui/input/pointer/util/VelocityTracker;->calculateVelocity-9Ux PLandroidx/compose/ui/input/pointer/util/VelocityTrackerKt;->addPointerInputChange(Landroidx/compose/ui/input/pointer/util/VelocityTracker;Landroidx/compose/ui/input/pointer/PointerInputChange;)V PLandroidx/compose/ui/input/pointer/util/VelocityTrackerKt;->polyFitLeastSquares(Ljava/util/ArrayList;Ljava/util/ArrayList;)Landroidx/compose/ui/input/pointer/util/PolynomialFit; PLandroidx/compose/ui/layout/ContentScale$Companion$Crop$1;->computeScaleFactor-H7hwNQA(JJ)J -PLandroidx/compose/ui/layout/DefaultIntrinsicMeasurable;->(Landroidx/compose/ui/layout/IntrinsicMeasurable;II)V -PLandroidx/compose/ui/layout/DefaultIntrinsicMeasurable;->getParentData()Ljava/lang/Object; -PLandroidx/compose/ui/layout/DefaultIntrinsicMeasurable;->measure-BRTryo0(J)Landroidx/compose/ui/layout/Placeable; -PLandroidx/compose/ui/layout/FixedSizeIntrinsicsPlaceable;->(II)V -PLandroidx/compose/ui/layout/FixedSizeIntrinsicsPlaceable;->get(Landroidx/compose/ui/layout/AlignmentLine;)I -PLandroidx/compose/ui/layout/IntrinsicsMeasureScope;->(Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;)V -PLandroidx/compose/ui/layout/IntrinsicsMeasureScope;->roundToPx--R2X_6o(J)I -PLandroidx/compose/ui/layout/IntrinsicsMeasureScope;->roundToPx-0680j_4(F)I -PLandroidx/compose/ui/layout/LayoutModifier;->maxIntrinsicHeight(Landroidx/compose/ui/layout/IntrinsicMeasureScope;Landroidx/compose/ui/layout/IntrinsicMeasurable;I)I PLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$precompose$1;->(Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState;Ljava/lang/Object;)V PLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$precompose$1;->dispose()V PLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$precompose$1;->getPlaceablesCount()I PLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$precompose$1;->premeasure-0kLqBqw(JI)V -PLandroidx/compose/ui/layout/MeasurePolicy;->maxIntrinsicHeight(Landroidx/compose/ui/node/NodeCoordinator;Ljava/util/List;I)I -PLandroidx/compose/ui/layout/MeasuringIntrinsics$DefaultIntrinsicMeasurable;->(Landroidx/compose/ui/layout/IntrinsicMeasurable;II)V -PLandroidx/compose/ui/layout/MeasuringIntrinsics$DefaultIntrinsicMeasurable;->measure-BRTryo0(J)Landroidx/compose/ui/layout/Placeable; -PLandroidx/compose/ui/layout/MeasuringIntrinsics$EmptyPlaceable;->(II)V +PLandroidx/compose/ui/layout/SubcomposeLayoutState;->precompose(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState$precompose$1; PLandroidx/compose/ui/layout/SubcomposeSlotReusePolicy$SlotIdsSet;->clear()V PLandroidx/compose/ui/layout/SubcomposeSlotReusePolicy$SlotIdsSet;->contains(Ljava/lang/Object;)Z PLandroidx/compose/ui/layout/SubcomposeSlotReusePolicy$SlotIdsSet;->iterator()Ljava/util/Iterator; -PLandroidx/compose/ui/node/BackwardsCompatNode;->getDensity()Landroidx/compose/ui/unit/Density; -PLandroidx/compose/ui/node/BackwardsCompatNode;->getLayoutDirection()Landroidx/compose/ui/unit/LayoutDirection; PLandroidx/compose/ui/node/BackwardsCompatNode;->interceptOutOfBoundsChildEvents()V -PLandroidx/compose/ui/node/BackwardsCompatNode;->maxIntrinsicHeight(Landroidx/compose/ui/layout/IntrinsicMeasureScope;Landroidx/compose/ui/layout/IntrinsicMeasurable;I)I +PLandroidx/compose/ui/node/BackwardsCompatNode;->onPointerEvent-H0pRuoY(Landroidx/compose/ui/input/pointer/PointerEvent;Landroidx/compose/ui/input/pointer/PointerEventPass;J)V PLandroidx/compose/ui/node/BackwardsCompatNode;->sharePointerInputWithSiblings()V PLandroidx/compose/ui/node/DistanceAndInLayer;->compareTo-S_HNhKs(JJ)I PLandroidx/compose/ui/node/DistanceAndInLayer;->isInLayer-impl(J)Z @@ -13910,21 +12976,19 @@ PLandroidx/compose/ui/node/HitTestResult;->hitInMinimumTouchTarget(Ljava/lang/Ob PLandroidx/compose/ui/node/HitTestResult;->isEmpty()Z PLandroidx/compose/ui/node/HitTestResult;->resizeToHitDepth()V PLandroidx/compose/ui/node/HitTestResult;->size()I -PLandroidx/compose/ui/node/InnerNodeCoordinator;->maxIntrinsicHeight(I)I +PLandroidx/compose/ui/node/HitTestResultKt;->access$DistanceAndInLayer(FZ)J +PLandroidx/compose/ui/node/InnerNodeCoordinator;->hitTestChild-YqVAtuI(Landroidx/compose/ui/node/NodeCoordinator$HitTestSource;JLandroidx/compose/ui/node/HitTestResult;ZZ)V PLandroidx/compose/ui/node/IntStack;->(I)V PLandroidx/compose/ui/node/IntStack;->pop()I PLandroidx/compose/ui/node/IntStack;->pushDiagonal(III)V PLandroidx/compose/ui/node/IntStack;->pushRange(IIII)V PLandroidx/compose/ui/node/IntStack;->quickSort(II)V PLandroidx/compose/ui/node/IntStack;->swapDiagonal(II)V -PLandroidx/compose/ui/node/IntrinsicsPolicy;->measurePolicyFromState()Landroidx/compose/ui/layout/MeasurePolicy; PLandroidx/compose/ui/node/LayoutModifierNode;->forceRemeasure()V -PLandroidx/compose/ui/node/LayoutModifierNodeCoordinator;->maxIntrinsicHeight(I)I PLandroidx/compose/ui/node/LayoutNode;->hitTest-M_7yMNQ$ui_release(JLandroidx/compose/ui/node/HitTestResult;ZZ)V +PLandroidx/compose/ui/node/LayoutNode;->isPlacedInLookahead()Ljava/lang/Boolean; PLandroidx/compose/ui/node/LayoutNode;->markSubtreeAsNotPlaced()V -PLandroidx/compose/ui/node/LayoutNodeDrawScope;->drawRoundRect-ZuiqVtQ(Landroidx/compose/ui/graphics/Brush;JJJFLandroidx/compose/ui/graphics/drawscope/DrawStyle;Landroidx/compose/ui/graphics/ColorFilter;I)V -PLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->maxIntrinsicHeight(I)I -PLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->onIntrinsicsQueried()V +PLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->getCanAffectParentInLookahead(Landroidx/compose/ui/node/LayoutNode;)Z PLandroidx/compose/ui/node/NodeChain$Differ;->(Landroidx/compose/ui/node/NodeChain;Landroidx/compose/ui/Modifier$Node;ILandroidx/compose/runtime/collection/MutableVector;Landroidx/compose/runtime/collection/MutableVector;)V PLandroidx/compose/ui/node/NodeChain$Differ;->insert(I)V PLandroidx/compose/ui/node/NodeChain$Differ;->same(II)V @@ -13935,20 +12999,25 @@ PLandroidx/compose/ui/node/NodeCoordinator$Companion$PointerInputSource$1;->inte PLandroidx/compose/ui/node/NodeCoordinator$Companion$PointerInputSource$1;->shouldHitTestChildren(Landroidx/compose/ui/node/LayoutNode;)Z PLandroidx/compose/ui/node/NodeCoordinator$hit$1;->(Landroidx/compose/ui/node/NodeCoordinator;Landroidx/compose/ui/node/DelegatableNode;Landroidx/compose/ui/node/NodeCoordinator$HitTestSource;JLandroidx/compose/ui/node/HitTestResult;ZZ)V PLandroidx/compose/ui/node/NodeCoordinator$hit$1;->invoke()Ljava/lang/Object; +PLandroidx/compose/ui/node/NodeCoordinator;->ancestorToLocal(Landroidx/compose/ui/node/NodeCoordinator;Landroidx/compose/ui/geometry/MutableRect;Z)V +PLandroidx/compose/ui/node/NodeCoordinator;->ancestorToLocal-R5De75A(Landroidx/compose/ui/node/NodeCoordinator;J)J +PLandroidx/compose/ui/node/NodeCoordinator;->calculateMinimumTouchTargetPadding-E7KxVPU(J)J PLandroidx/compose/ui/node/NodeCoordinator;->distanceInMinimumTouchTarget-tz77jQw(JJ)F +PLandroidx/compose/ui/node/NodeCoordinator;->getMinimumTouchTargetSize-NH-jbRc()J PLandroidx/compose/ui/node/NodeCoordinator;->hit-1hIXUjU(Landroidx/compose/ui/node/DelegatableNode;Landroidx/compose/ui/node/NodeCoordinator$HitTestSource;JLandroidx/compose/ui/node/HitTestResult;ZZ)V PLandroidx/compose/ui/node/NodeCoordinator;->hitTestChild-YqVAtuI(Landroidx/compose/ui/node/NodeCoordinator$HitTestSource;JLandroidx/compose/ui/node/HitTestResult;ZZ)V PLandroidx/compose/ui/node/NodeCoordinator;->localPositionOf-R5De75A(Landroidx/compose/ui/layout/LayoutCoordinates;J)J PLandroidx/compose/ui/node/NodeCoordinator;->speculativeHit-JHbHoSQ(Landroidx/compose/ui/node/DelegatableNode;Landroidx/compose/ui/node/NodeCoordinator$HitTestSource;JLandroidx/compose/ui/node/HitTestResult;ZZF)V PLandroidx/compose/ui/node/NodeCoordinatorKt;->access$nextUncheckedUntil-hw7D004(Landroidx/compose/ui/node/DelegatableNode;I)Landroidx/compose/ui/Modifier$Node; -PLandroidx/compose/ui/node/Ref;->()V PLandroidx/compose/ui/node/Snake;->getDiagonalSize-impl([I)I PLandroidx/compose/ui/platform/AbstractComposeView;->shouldDelayChildPressedState()Z PLandroidx/compose/ui/platform/AccessibilityNodeInfoVerificationHelperMethods$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/accessibility/AccessibilityNodeInfo;Ljava/util/List;)V PLandroidx/compose/ui/platform/AccessibilityNodeInfoVerificationHelperMethods;->()V PLandroidx/compose/ui/platform/AccessibilityNodeInfoVerificationHelperMethods;->()V PLandroidx/compose/ui/platform/AccessibilityNodeInfoVerificationHelperMethods;->setAvailableExtraData(Landroid/view/accessibility/AccessibilityNodeInfo;Ljava/util/List;)V +PLandroidx/compose/ui/platform/AndroidComposeView;->clearChildInvalidObservations(Landroid/view/ViewGroup;)V PLandroidx/compose/ui/platform/AndroidComposeView;->dispatchTouchEvent(Landroid/view/MotionEvent;)Z +PLandroidx/compose/ui/platform/AndroidComposeView;->getAndroidViewsHandler$ui_release()Landroidx/compose/ui/platform/AndroidViewsHandler; PLandroidx/compose/ui/platform/AndroidComposeView;->isBadMotionEvent(Landroid/view/MotionEvent;)Z PLandroidx/compose/ui/platform/AndroidComposeView;->isInBounds(Landroid/view/MotionEvent;)Z PLandroidx/compose/ui/platform/AndroidComposeView;->isPositionChanged(Landroid/view/MotionEvent;)Z @@ -13957,36 +13026,56 @@ PLandroidx/compose/ui/platform/AndroidComposeView;->screenToLocal-MK-Hz9U(J)J PLandroidx/compose/ui/platform/AndroidComposeView;->sendMotionEvent-8iAsVTc(Landroid/view/MotionEvent;)I PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$1;->onViewDetachedFromWindow(Landroid/view/View;)V PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$boundsUpdatesEventLoop$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getAccessibilityNodeProvider(Landroid/view/View;)Landroidx/core/view/accessibility/AccessibilityNodeProviderCompat; PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getAccessibilitySelectionEnd(Landroidx/compose/ui/semantics/SemanticsNode;)I PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getAccessibilitySelectionStart(Landroidx/compose/ui/semantics/SemanticsNode;)I +PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getCurrentSemanticsNodes()Ljava/util/Map; +PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getTextForTextField(Landroidx/compose/ui/semantics/SemanticsConfiguration;)Landroidx/compose/ui/text/AnnotatedString; PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->populateAccessibilityNodeInfoProperties$canScrollBackward(Landroidx/compose/ui/semantics/ScrollAxisRange;)Z PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->populateAccessibilityNodeInfoProperties$canScrollForward(Landroidx/compose/ui/semantics/ScrollAxisRange;)Z +PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->trimToSize(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; +PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat_androidKt;->access$enabled(Landroidx/compose/ui/semantics/SemanticsNode;)Z +PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat_androidKt;->access$excludeLineAndPageGranularities(Landroidx/compose/ui/semantics/SemanticsNode;)Z PLandroidx/compose/ui/platform/AndroidComposeViewVerificationHelperMethodsN;->()V PLandroidx/compose/ui/platform/AndroidComposeViewVerificationHelperMethodsN;->()V PLandroidx/compose/ui/platform/AndroidComposeViewVerificationHelperMethodsN;->setPointerIcon(Landroid/view/View;Landroidx/compose/ui/input/pointer/PointerIcon;)V PLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$ProvideAndroidCompositionLocals$2$invoke$$inlined$onDispose$1;->dispose()V PLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$obtainImageVectorCache$1$invoke$$inlined$onDispose$1;->dispose()V -PLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$obtainImageVectorCache$callbacks$1$1;->onTrimMemory(I)V PLandroidx/compose/ui/platform/AndroidViewConfiguration;->getTouchSlop()F +PLandroidx/compose/ui/platform/AndroidViewsHandler;->(Landroid/content/Context;)V +PLandroidx/compose/ui/platform/AndroidViewsHandler;->getLayoutNodeToHolder()Ljava/util/HashMap; +PLandroidx/compose/ui/platform/AndroidViewsHandler;->onLayout(ZIIII)V +PLandroidx/compose/ui/platform/AndroidViewsHandler;->onMeasure(II)V +PLandroidx/compose/ui/platform/AndroidViewsHandler;->requestLayout()V +PLandroidx/compose/ui/platform/CalculateMatrixToWindowApi29$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/View;Landroid/graphics/Matrix;)V +PLandroidx/compose/ui/platform/ComposeView;->getAccessibilityClassName()Ljava/lang/CharSequence; PLandroidx/compose/ui/platform/DisposableSaveableStateRegistry_androidKt$DisposableSaveableStateRegistry$1;->invoke()Ljava/lang/Object; PLandroidx/compose/ui/platform/DisposableSaveableStateRegistry_androidKt$DisposableSaveableStateRegistry$registered$1;->saveState()Landroid/os/Bundle; +PLandroidx/compose/ui/platform/InvertMatrixKt;->invertTo-JiSxe2E([F[F)Z +PLandroidx/compose/ui/platform/LayerMatrixCache;->calculateInverseMatrix-bWbORWo(Ljava/lang/Object;)[F PLandroidx/compose/ui/platform/OutlineResolver;->isInOutline-k-4lQ0M(J)Z PLandroidx/compose/ui/platform/RenderNodeApi29;->getClipToBounds()Z PLandroidx/compose/ui/platform/RenderNodeLayer;->isInLayer-k-4lQ0M(J)Z +PLandroidx/compose/ui/platform/SemanticsNodeWithAdjustedBounds;->(Landroidx/compose/ui/semantics/SemanticsNode;Landroid/graphics/Rect;)V PLandroidx/compose/ui/platform/ViewCompositionStrategy$DisposeOnDetachedFromWindowOrReleasedFromPool$installFor$listener$1;->onViewDetachedFromWindow(Landroid/view/View;)V PLandroidx/compose/ui/platform/WindowRecomposerPolicy$createAndInstallWindowRecomposer$1;->onViewDetachedFromWindow(Landroid/view/View;)V PLandroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$1;->onViewDetachedFromWindow(Landroid/view/View;)V PLandroidx/compose/ui/platform/WrappedComposition;->dispose()V PLandroidx/compose/ui/platform/accessibility/CollectionInfoKt;->calculateIfHorizontallyStacked(Ljava/util/ArrayList;)Z +PLandroidx/compose/ui/platform/accessibility/CollectionInfoKt;->hasCollectionInfo(Landroidx/compose/ui/semantics/SemanticsNode;)Z PLandroidx/compose/ui/semantics/NodeLocationHolder$compareTo$child1$1;->(Landroidx/compose/ui/geometry/Rect;)V PLandroidx/compose/ui/semantics/NodeLocationHolder$compareTo$child1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/ui/semantics/NodeLocationHolder$compareTo$child2$1;->(Landroidx/compose/ui/geometry/Rect;)V PLandroidx/compose/ui/semantics/NodeLocationHolder$compareTo$child2$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/ui/semantics/NodeLocationHolder;->compareTo(Ljava/lang/Object;)I PLandroidx/compose/ui/semantics/SemanticsConfiguration;->get(Landroidx/compose/ui/semantics/SemanticsPropertyKey;)Ljava/lang/Object; +PLandroidx/compose/ui/semantics/SemanticsNode$emitFakeNodes$fakeNode$1;->(Landroidx/compose/ui/semantics/Role;)V +PLandroidx/compose/ui/semantics/SemanticsNode$fakeSemanticsNode$fakeNode$1;->(Lkotlin/jvm/functions/Function1;)V +PLandroidx/compose/ui/semantics/SemanticsNode$fakeSemanticsNode$fakeNode$1;->getSemanticsConfiguration()Landroidx/compose/ui/semantics/SemanticsConfiguration; +PLandroidx/compose/ui/semantics/SemanticsNode;->getBoundsInRoot()Landroidx/compose/ui/geometry/Rect; +PLandroidx/compose/ui/semantics/SemanticsSortKt;->findNodeByPredicateTraversal(Landroidx/compose/ui/node/LayoutNode;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/node/LayoutNode; PLandroidx/compose/ui/text/AnnotatedString;->length()I -PLandroidx/compose/ui/text/TextStyle;->copy-HL5avdY$default(Landroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/style/TextAlign;)Landroidx/compose/ui/text/TextStyle; PLandroidx/compose/ui/text/input/TextInputServiceAndroid$textInputCommandEventLoop$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; -PLandroidx/compose/ui/unit/Density;->roundToPx--R2X_6o(J)I PLandroidx/compose/ui/unit/Velocity;->()V PLandroidx/compose/ui/unit/Velocity;->(J)V PLandroidx/compose/ui/unit/Velocity;->copy-OhffZ5M$default(JFFI)J @@ -13999,31 +13088,88 @@ PLandroidx/compose/ui/window/PopupProperties;->(ZZZLandroidx/compose/ui/wi PLandroidx/compose/ui/window/SecureFlagPolicy;->()V PLandroidx/compose/ui/window/SecureFlagPolicy;->(ILjava/lang/String;)V PLandroidx/core/app/ComponentActivity;->onSaveInstanceState(Landroid/os/Bundle;)V +PLandroidx/core/content/PermissionChecker;->AnimationState$default(FFI)Landroidx/compose/animation/core/AnimationState; +PLandroidx/core/graphics/TypefaceCompat;->()V +PLandroidx/core/graphics/TypefaceCompatApi29Impl;->()V +PLandroidx/core/graphics/TypefaceCompatApi29Impl;->createFromFontInfo(Landroid/content/Context;[Landroidx/core/provider/FontsContractCompat$FontInfo;I)Landroid/graphics/Typeface; +PLandroidx/core/graphics/TypefaceCompatApi29Impl;->findBaseFont(Landroid/graphics/fonts/FontFamily;I)Landroid/graphics/fonts/Font; +PLandroidx/core/graphics/TypefaceCompatApi29Impl;->getMatchScore(Landroid/graphics/fonts/FontStyle;Landroid/graphics/fonts/FontStyle;)I +PLandroidx/core/graphics/TypefaceCompatBaseImpl;->()V PLandroidx/core/graphics/TypefaceCompatUtil$Api19Impl;->openFileDescriptor(Landroid/content/ContentResolver;Landroid/net/Uri;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/os/ParcelFileDescriptor; PLandroidx/core/graphics/TypefaceCompatUtil;->mmap(Landroid/content/Context;Landroid/net/Uri;)Ljava/nio/MappedByteBuffer; -PLandroidx/core/provider/CalleeHandler;->cancelConsumed(Lkotlinx/coroutines/channels/ReceiveChannel;Ljava/lang/Throwable;)V -PLandroidx/core/util/DebugUtils;->catchImpl(Lkotlin/coroutines/Continuation;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/FlowCollector;)Ljava/io/Serializable; +PLandroidx/core/math/MathUtils;->cancelConsumed(Lkotlinx/coroutines/channels/ReceiveChannel;Ljava/lang/Throwable;)V +PLandroidx/core/os/TraceCompat$Api18Impl;->beginSection(Ljava/lang/String;)V +PLandroidx/core/os/TraceCompat$Api18Impl;->endSection()V +PLandroidx/core/os/TraceCompat;->()V +PLandroidx/core/provider/FontProvider$$ExternalSyntheticLambda0;->()V +PLandroidx/core/provider/FontProvider$Api16Impl;->query(Landroid/content/ContentResolver;Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)Landroid/database/Cursor; +PLandroidx/core/provider/FontProvider;->()V +PLandroidx/core/provider/FontProvider;->getFontFamilyResult(Landroid/content/Context;Landroidx/core/provider/FontRequest;)Landroidx/core/provider/FontsContractCompat$FontFamilyResult; +PLandroidx/core/provider/FontRequest;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)V +PLandroidx/core/provider/FontsContractCompat$FontFamilyResult;->(I[Landroidx/core/provider/FontsContractCompat$FontInfo;)V +PLandroidx/core/provider/FontsContractCompat$FontInfo;->(Landroid/net/Uri;IIZI)V PLandroidx/core/util/Preconditions;->checkArgument(Ljava/lang/String;Z)V +PLandroidx/core/util/Preconditions;->checkNotNull(Ljava/lang/Object;Ljava/lang/String;)V +PLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->getAccessibilityNodeProvider(Landroid/view/View;)Landroid/view/accessibility/AccessibilityNodeProvider; +PLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->onInitializeAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V PLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->onRequestSendAccessibilityEvent(Landroid/view/ViewGroup;Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)Z +PLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->sendAccessibilityEventUnchecked(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V +PLandroidx/core/view/AccessibilityDelegateCompat;->onInitializeAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V +PLandroidx/core/view/ViewCompat$Api16Impl;->getParentForAccessibility(Landroid/view/View;)Landroid/view/ViewParent; PLandroidx/core/view/ViewKt$ancestors$1;->()V PLandroidx/core/view/ViewKt$ancestors$1;->()V PLandroidx/core/view/ViewKt$ancestors$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/accessibility/AccessibilityNodeInfo;Z)V +PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$$ExternalSyntheticApiModelOutline1;->m(Landroid/view/accessibility/AccessibilityNodeInfo;Ljava/lang/CharSequence;)V +PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$$ExternalSyntheticApiModelOutline2;->m(Landroid/view/accessibility/AccessibilityNodeInfo;Ljava/lang/CharSequence;)V +PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$$ExternalSyntheticApiModelOutline4;->m(Landroid/view/accessibility/AccessibilityNodeInfo;)Ljava/lang/CharSequence; +PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$$ExternalSyntheticApiModelOutline5;->m(Landroid/view/accessibility/AccessibilityNodeInfo;)Ljava/lang/CharSequence; +PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;->()V +PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;->(Ljava/lang/Object;ILjava/lang/String;Ljava/lang/Class;)V +PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->getHintText()Ljava/lang/CharSequence; PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->getMovementGranularities()I +PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->getStateDescription()Ljava/lang/CharSequence; +PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setClassName(Ljava/lang/String;)V PLandroidx/datastore/core/SingleProcessDataStore$handleUpdate$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/datastore/core/SingleProcessDataStore$transformAndWrite$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/emoji2/text/ConcurrencyHelpers$$ExternalSyntheticLambda0;->(Ljava/lang/String;)V +PLandroidx/emoji2/text/ConcurrencyHelpers$$ExternalSyntheticLambda0;->newThread(Ljava/lang/Runnable;)Ljava/lang/Thread; +PLandroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigHelper;->()V +PLandroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigHelper_API19;->()V +PLandroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigHelper_API28;->()V +PLandroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigHelper_API28;->getSigningSignatures(Landroid/content/pm/PackageManager;Ljava/lang/String;)[Landroid/content/pm/Signature; +PLandroidx/emoji2/text/DefaultEmojiCompatConfig;->create(Landroid/content/Context;)Landroidx/emoji2/text/FontRequestEmojiCompatConfig; +PLandroidx/emoji2/text/EmojiCompat$CompatInternal19$1;->(Landroidx/emoji2/text/EmojiCompat$CompatInternal19;)V PLandroidx/emoji2/text/EmojiCompat$CompatInternal19$1;->onLoaded(Landroidx/emoji2/text/MetadataRepo;)V PLandroidx/emoji2/text/EmojiCompat$ListenerDispatcher;->(Ljava/util/List;ILjava/lang/Throwable;)V PLandroidx/emoji2/text/EmojiCompat$ListenerDispatcher;->run()V +PLandroidx/emoji2/text/EmojiCompat$MetadataRepoLoaderCallback;->()V PLandroidx/emoji2/text/EmojiCompat$SpanFactory;->()V +PLandroidx/emoji2/text/EmojiCompat;->get()Landroidx/emoji2/text/EmojiCompat; +PLandroidx/emoji2/text/EmojiCompat;->load()V PLandroidx/emoji2/text/EmojiCompat;->onMetadataLoadSuccess()V +PLandroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultLoader$$ExternalSyntheticLambda0;->(Landroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultLoader;Landroidx/emoji2/text/EmojiCompat$MetadataRepoLoaderCallback;Ljava/util/concurrent/ThreadPoolExecutor;)V +PLandroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultLoader$$ExternalSyntheticLambda0;->run()V +PLandroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultLoader$1;->(Landroidx/emoji2/text/EmojiCompat$MetadataRepoLoaderCallback;Ljava/util/concurrent/ThreadPoolExecutor;)V PLandroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultLoader$1;->onLoaded(Landroidx/emoji2/text/MetadataRepo;)V +PLandroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultLoader;->load(Landroidx/emoji2/text/EmojiCompat$MetadataRepoLoaderCallback;)V +PLandroidx/emoji2/text/EmojiCompatInitializer$LoadEmojiCompatRunnable;->run()V PLandroidx/emoji2/text/EmojiMetadata;->()V PLandroidx/emoji2/text/EmojiMetadata;->(Landroidx/emoji2/text/MetadataRepo;I)V PLandroidx/emoji2/text/EmojiMetadata;->getCodepointAt(I)I PLandroidx/emoji2/text/EmojiMetadata;->getCodepointsLength()I PLandroidx/emoji2/text/EmojiMetadata;->getMetadataItem()Landroidx/emoji2/text/flatbuffer/MetadataItem; PLandroidx/emoji2/text/EmojiProcessor;->(Landroidx/emoji2/text/MetadataRepo;Landroidx/emoji2/text/EmojiCompat$SpanFactory;Landroidx/emoji2/text/DefaultGlyphChecker;)V +PLandroidx/emoji2/text/FontRequestEmojiCompatConfig$FontProviderHelper;->()V +PLandroidx/emoji2/text/FontRequestEmojiCompatConfig$FontRequestMetadataLoader$$ExternalSyntheticLambda0;->(Landroidx/emoji2/text/FontRequestEmojiCompatConfig$FontRequestMetadataLoader;)V +PLandroidx/emoji2/text/FontRequestEmojiCompatConfig$FontRequestMetadataLoader$$ExternalSyntheticLambda0;->run()V +PLandroidx/emoji2/text/FontRequestEmojiCompatConfig$FontRequestMetadataLoader;->(Landroid/content/Context;Landroidx/core/provider/FontRequest;)V PLandroidx/emoji2/text/FontRequestEmojiCompatConfig$FontRequestMetadataLoader;->cleanUp()V +PLandroidx/emoji2/text/FontRequestEmojiCompatConfig$FontRequestMetadataLoader;->load(Landroidx/emoji2/text/EmojiCompat$MetadataRepoLoaderCallback;)V +PLandroidx/emoji2/text/FontRequestEmojiCompatConfig$FontRequestMetadataLoader;->loadInternal()V +PLandroidx/emoji2/text/FontRequestEmojiCompatConfig$FontRequestMetadataLoader;->retrieveFontInfo()Landroidx/core/provider/FontsContractCompat$FontInfo; +PLandroidx/emoji2/text/FontRequestEmojiCompatConfig;->()V +PLandroidx/emoji2/text/FontRequestEmojiCompatConfig;->(Landroid/content/Context;Landroidx/core/provider/FontRequest;)V PLandroidx/emoji2/text/MetadataListReader$ByteBufferReader;->(Ljava/nio/ByteBuffer;)V PLandroidx/emoji2/text/MetadataListReader$ByteBufferReader;->readUnsignedInt()J PLandroidx/emoji2/text/MetadataListReader$ByteBufferReader;->skip(I)V @@ -14035,15 +13181,13 @@ PLandroidx/emoji2/text/flatbuffer/MetadataItem;->()V PLandroidx/emoji2/text/flatbuffer/MetadataList;->()V PLandroidx/emoji2/text/flatbuffer/Table;->()V PLandroidx/emoji2/text/flatbuffer/Table;->__offset(I)I +PLandroidx/emoji2/text/flatbuffer/Utf8Safe;->()V PLandroidx/exifinterface/media/ExifInterface$ByteOrderedDataInputStream;->()V PLandroidx/exifinterface/media/ExifInterface$ByteOrderedDataInputStream;->(Ljava/io/InputStream;)V PLandroidx/exifinterface/media/ExifInterface$ByteOrderedDataInputStream;->(Ljava/io/InputStream;Ljava/nio/ByteOrder;)V PLandroidx/exifinterface/media/ExifInterface$ByteOrderedDataInputStream;->([B)V -PLandroidx/exifinterface/media/ExifInterface$ByteOrderedDataInputStream;->read([BII)I PLandroidx/exifinterface/media/ExifInterface$ByteOrderedDataInputStream;->readByte()B -PLandroidx/exifinterface/media/ExifInterface$ByteOrderedDataInputStream;->readFully([B)V PLandroidx/exifinterface/media/ExifInterface$ByteOrderedDataInputStream;->readInt()I -PLandroidx/exifinterface/media/ExifInterface$ByteOrderedDataInputStream;->readShort()S PLandroidx/exifinterface/media/ExifInterface$ByteOrderedDataInputStream;->readUnsignedShort()I PLandroidx/exifinterface/media/ExifInterface$ByteOrderedDataInputStream;->skipFully(I)V PLandroidx/exifinterface/media/ExifInterface$ExifAttribute;->(J[BII)V @@ -14054,8 +13198,6 @@ PLandroidx/exifinterface/media/ExifInterface$ExifAttribute;->getStringValue(Ljav PLandroidx/exifinterface/media/ExifInterface$ExifAttribute;->getValue(Ljava/nio/ByteOrder;)Ljava/io/Serializable; PLandroidx/exifinterface/media/ExifInterface$ExifTag;->(IIILjava/lang/String;)V PLandroidx/exifinterface/media/ExifInterface$ExifTag;->(IILjava/lang/String;)V -PLandroidx/exifinterface/media/ExifInterface$SeekableByteOrderedDataInputStream;->([B)V -PLandroidx/exifinterface/media/ExifInterface$SeekableByteOrderedDataInputStream;->seek(J)V PLandroidx/exifinterface/media/ExifInterface;->()V PLandroidx/exifinterface/media/ExifInterface;->(Lcoil/decode/ExifInterfaceInputStream;)V PLandroidx/exifinterface/media/ExifInterface;->addDefaultValuesForCompatibility()V @@ -14063,13 +13205,6 @@ PLandroidx/exifinterface/media/ExifInterface;->getAttribute(Ljava/lang/String;)L PLandroidx/exifinterface/media/ExifInterface;->getExifAttribute(Ljava/lang/String;)Landroidx/exifinterface/media/ExifInterface$ExifAttribute; PLandroidx/exifinterface/media/ExifInterface;->getJpegAttributes(Landroidx/exifinterface/media/ExifInterface$ByteOrderedDataInputStream;II)V PLandroidx/exifinterface/media/ExifInterface;->getMimeType(Ljava/io/BufferedInputStream;)I -PLandroidx/exifinterface/media/ExifInterface;->getWebpAttributes(Landroidx/exifinterface/media/ExifInterface$ByteOrderedDataInputStream;)V -PLandroidx/exifinterface/media/ExifInterface;->handleThumbnailFromJfif(Landroidx/exifinterface/media/ExifInterface$ByteOrderedDataInputStream;Ljava/util/HashMap;)V -PLandroidx/exifinterface/media/ExifInterface;->parseTiffHeaders(Landroidx/exifinterface/media/ExifInterface$ByteOrderedDataInputStream;)V -PLandroidx/exifinterface/media/ExifInterface;->readByteOrder(Landroidx/exifinterface/media/ExifInterface$ByteOrderedDataInputStream;)Ljava/nio/ByteOrder; -PLandroidx/exifinterface/media/ExifInterface;->readExifSegment(I[B)V -PLandroidx/exifinterface/media/ExifInterface;->readImageFileDirectory(Landroidx/exifinterface/media/ExifInterface$SeekableByteOrderedDataInputStream;I)V -PLandroidx/exifinterface/media/ExifInterface;->setThumbnailData(Landroidx/exifinterface/media/ExifInterface$ByteOrderedDataInputStream;)V PLandroidx/lifecycle/CloseableCoroutineScope;->close()V PLandroidx/lifecycle/DefaultLifecycleObserver;->onDestroy()V PLandroidx/lifecycle/DefaultLifecycleObserver;->onPause()V @@ -14087,7 +13222,6 @@ PLandroidx/lifecycle/LifecycleDispatcher$DispatcherActivityCallback;->onActivity PLandroidx/lifecycle/LiveData$ObserverWrapper;->detachObserver()V PLandroidx/lifecycle/LiveData;->removeObserver(Landroidx/lifecycle/Observer;)V PLandroidx/lifecycle/MediatorLiveData;->onInactive()V -PLandroidx/lifecycle/ProcessLifecycleOwner$1;->run()V PLandroidx/lifecycle/ProcessLifecycleOwner$3;->onActivityPaused(Landroid/app/Activity;)V PLandroidx/lifecycle/ProcessLifecycleOwner$3;->onActivityStopped(Landroid/app/Activity;)V PLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityDestroyed(Landroid/app/Activity;)V @@ -14112,7 +13246,6 @@ PLandroidx/metrics/performance/PerformanceMetricsState;->returnStateDataToPool$m PLandroidx/navigation/NavBackStackEntryState$Companion$CREATOR$1;->()V PLandroidx/navigation/NavBackStackEntryState;->()V PLandroidx/navigation/NavBackStackEntryState;->(Landroidx/navigation/NavBackStackEntry;)V -PLandroidx/navigation/NavBackStackEntryState;->writeToParcel(Landroid/os/Parcel;I)V PLandroidx/navigation/NavController$NavControllerNavigatorState;->pop(Landroidx/navigation/NavBackStackEntry;Z)V PLandroidx/navigation/NavController$NavControllerNavigatorState;->popWithTransition(Landroidx/navigation/NavBackStackEntry;Z)V PLandroidx/navigation/NavController$popBackStackInternal$2;->(Lkotlin/jvm/internal/Ref$BooleanRef;Lkotlin/jvm/internal/Ref$BooleanRef;Landroidx/navigation/NavController;ZLkotlin/collections/ArrayDeque;)V @@ -14134,7 +13267,6 @@ PLandroidx/navigation/NavController;->popEntryFromBackStack(Landroidx/navigation PLandroidx/navigation/NavController;->unlinkChildFromParent$navigation_runtime_release(Landroidx/navigation/NavBackStackEntry;)V PLandroidx/navigation/NavControllerViewModel;->onCleared()V PLandroidx/navigation/NavDeepLink$pattern$2;->invoke()Ljava/lang/Object; -PLandroidx/navigation/NavDeepLink;->parseArgument(Landroid/os/Bundle;Ljava/lang/String;Ljava/lang/String;Landroidx/navigation/NavArgument;)V PLandroidx/navigation/NavDestination$DeepLinkMatch;->(Landroidx/navigation/NavDestination;Landroid/os/Bundle;ZZI)V PLandroidx/navigation/NavGraph$Companion$findStartDestination$1;->()V PLandroidx/navigation/NavGraph$Companion$findStartDestination$1;->()V @@ -14144,9 +13276,7 @@ PLandroidx/navigation/NavGraph;->findNode(IZ)Landroidx/navigation/NavDestination PLandroidx/navigation/NavOptions$Builder;->()V PLandroidx/navigation/NavOptions;->(ZZIZZIIII)V PLandroidx/navigation/NavOptionsBuilder;->()V -PLandroidx/navigation/NavType$Companion$StringType$1;->get(Ljava/lang/String;Landroid/os/Bundle;)Ljava/lang/Object; -PLandroidx/navigation/NavType$Companion$StringType$1;->parseValue(Ljava/lang/String;)Ljava/lang/Object; -PLandroidx/navigation/NavType$Companion$StringType$1;->put(Landroid/os/Bundle;Ljava/lang/String;Ljava/lang/Object;)V +PLandroidx/navigation/NavOptionsBuilderKt;->navOptions(Lkotlin/jvm/functions/Function1;)Landroidx/navigation/NavOptions; PLandroidx/navigation/NavigatorState;->pop(Landroidx/navigation/NavBackStackEntry;Z)V PLandroidx/navigation/NavigatorState;->popWithTransition(Landroidx/navigation/NavBackStackEntry;Z)V PLandroidx/navigation/PopUpToBuilder;->()V @@ -14160,80 +13290,125 @@ PLandroidx/profileinstaller/ProfileInstaller$1;->onResultReceived(ILjava/lang/Ob PLandroidx/profileinstaller/ProfileInstaller$2;->()V PLandroidx/profileinstaller/ProfileInstaller;->()V PLandroidx/profileinstaller/ProfileInstaller;->writeProfile(Landroid/content/Context;Ljava/util/concurrent/Executor;Landroidx/profileinstaller/ProfileInstaller$DiagnosticsCallback;Z)V -PLandroidx/profileinstaller/ProfileInstallerInitializer$$ExternalSyntheticLambda1;->(Landroid/content/Context;)V PLandroidx/profileinstaller/ProfileInstallerInitializer$$ExternalSyntheticLambda1;->run()V +PLandroidx/profileinstaller/ProfileInstallerInitializer$$ExternalSyntheticLambda2;->(Landroid/content/Context;)V +PLandroidx/profileinstaller/ProfileInstallerInitializer$$ExternalSyntheticLambda2;->run()V PLandroidx/room/InvalidationTracker;->removeObserver(Landroidx/room/InvalidationTracker$Observer;)V PLandroidx/room/InvalidationTracker;->stopTrackingTable(Landroidx/sqlite/db/SupportSQLiteDatabase;I)V PLandroidx/room/RoomTrackingLiveData;->onInactive()V PLandroidx/savedstate/SavedStateRegistryController;->performSave(Landroid/os/Bundle;)V PLandroidx/work/impl/model/WorkSpecDao_Impl$13;->finalize()V PLcoil/EventListener$Companion$NONE$1;->decodeEnd()V +PLcoil/EventListener$Companion$NONE$1;->decodeStart()V +PLcoil/EventListener$Companion$NONE$1;->fetchEnd()V PLcoil/EventListener$Companion$NONE$1;->onCancel()V -PLcoil/EventListener$Companion$NONE$1;->onError()V PLcoil/EventListener$Companion$NONE$1;->onSuccess()V -PLcoil/RealImageLoader;->onError(Lcoil/request/ErrorResult;Lcoil/target/Target;Lcoil/EventListener;)V PLcoil/RealImageLoader;->onSuccess(Lcoil/request/SuccessResult;Lcoil/target/Target;Lcoil/EventListener;)V -PLcoil/compose/AsyncImageKt$contentDescription$1;->(Ljava/lang/String;)V -PLcoil/compose/AsyncImageKt$contentDescription$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLcoil/compose/AsyncImagePainter$State$Error;->(Landroidx/compose/ui/graphics/painter/Painter;Lcoil/request/ErrorResult;)V -PLcoil/compose/AsyncImagePainter$State$Error;->getPainter()Landroidx/compose/ui/graphics/painter/Painter; +PLcoil/compose/AsyncImagePainter$Companion$DefaultTransform$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLcoil/compose/AsyncImagePainter$State$Loading;->equals(Ljava/lang/Object;)Z PLcoil/compose/AsyncImagePainter$State$Success;->(Landroidx/compose/ui/graphics/painter/Painter;Lcoil/request/SuccessResult;)V PLcoil/compose/AsyncImagePainter$State$Success;->getPainter()Landroidx/compose/ui/graphics/painter/Painter; PLcoil/compose/AsyncImagePainter$onRemembered$1$3;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -PLcoil/compose/AsyncImagePainter$updateRequest$$inlined$target$default$1;->onError(Landroid/graphics/drawable/Drawable;)V PLcoil/compose/AsyncImagePainter$updateRequest$$inlined$target$default$1;->onSuccess(Landroid/graphics/drawable/Drawable;)V PLcoil/compose/AsyncImagePainter;->onForgotten()V +PLcoil/compose/AsyncImagePainter;->toPainter(Landroid/graphics/drawable/Drawable;)Landroidx/compose/ui/graphics/painter/Painter; PLcoil/compose/AsyncImagePainterKt$FakeTransitionTarget$1;->()V PLcoil/compose/AsyncImagePainterKt;->()V +PLcoil/compose/ContentPainterModifier;->equals(Ljava/lang/Object;)Z +PLcoil/compose/SingletonAsyncImageKt;->AsyncImage-3HmZ8SU(Ljava/lang/Object;Ljava/lang/String;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Alignment;Landroidx/compose/ui/layout/ContentScale;FLandroidx/compose/ui/graphics/ColorFilter;ILandroidx/compose/runtime/Composer;II)V +PLcoil/decode/BitmapFactoryDecoder$ExceptionCatchingSource;->(Lokio/BufferedSource;)V +PLcoil/decode/BitmapFactoryDecoder$ExceptionCatchingSource;->read(Lokio/Buffer;J)J +PLcoil/decode/BitmapFactoryDecoder$Factory;->create(Lcoil/fetch/SourceResult;Lcoil/request/Options;)Lcoil/decode/Decoder; +PLcoil/decode/BitmapFactoryDecoder$decode$1;->(Lcoil/decode/BitmapFactoryDecoder;Lkotlin/coroutines/Continuation;)V +PLcoil/decode/BitmapFactoryDecoder$decode$2$1;->(Lcoil/decode/BitmapFactoryDecoder;)V +PLcoil/decode/BitmapFactoryDecoder$decode$2$1;->invoke()Ljava/lang/Object; +PLcoil/decode/BitmapFactoryDecoder;->(Lcoil/decode/ImageSource;Lcoil/request/Options;Lkotlinx/coroutines/sync/SemaphoreImpl;I)V +PLcoil/decode/BitmapFactoryDecoder;->access$decode(Lcoil/decode/BitmapFactoryDecoder;Landroid/graphics/BitmapFactory$Options;)Lcoil/decode/DecodeResult; +PLcoil/decode/BitmapFactoryDecoder;->decode(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLcoil/decode/DecodeResult;->(Landroid/graphics/drawable/BitmapDrawable;Z)V PLcoil/decode/DecodeUtils;->computeSizeMultiplier(IIIII)D PLcoil/decode/ExifData;->()V PLcoil/decode/ExifData;->(IZ)V PLcoil/decode/ExifInterfaceInputStream;->(Ljava/io/InputStream;)V PLcoil/decode/ExifInterfaceInputStream;->read([BII)I -PLcoil/decode/ExifInterfaceInputStream;->skip(J)J +PLcoil/decode/ExifUtils;->()V +PLcoil/decode/ExifUtilsKt;->()V +PLcoil/decode/FileImageSource;->(Lokio/Path;Lokio/FileSystem;Ljava/lang/String;Ljava/io/Closeable;)V PLcoil/decode/FileImageSource;->close()V PLcoil/decode/FileImageSource;->getMetadata()Lcoil/decode/ImageSource$Metadata; -PLcoil/decode/SourceImageSource;->(Lokio/BufferedSource;Ljava/io/File;Lcoil/decode/ImageSource$Metadata;)V -PLcoil/decode/SourceImageSource;->close()V -PLcoil/decode/SourceImageSource;->getMetadata()Lcoil/decode/ImageSource$Metadata; -PLcoil/decode/SourceImageSource;->source()Lokio/BufferedSource; +PLcoil/decode/FileImageSource;->source()Lokio/BufferedSource; +PLcoil/decode/ImageSource;->()V +PLcoil/decode/SvgDecodeUtils;->()V +PLcoil/decode/SvgDecoder$Factory;->create(Lcoil/fetch/SourceResult;Lcoil/request/Options;)Lcoil/decode/Decoder; PLcoil/decode/SvgDecoder$decode$2;->(Lcoil/decode/SvgDecoder;)V PLcoil/decode/SvgDecoder$decode$2;->invoke()Ljava/lang/Object; PLcoil/decode/SvgDecoder;->(Lcoil/decode/ImageSource;Lcoil/request/Options;Z)V PLcoil/decode/SvgDecoder;->decode(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +PLcoil/disk/DiskLruCache$Editor;->(Lcoil/disk/DiskLruCache;Lcoil/disk/DiskLruCache$Entry;)V +PLcoil/disk/DiskLruCache$Editor;->complete(Z)V +PLcoil/disk/DiskLruCache$Editor;->file(I)Lokio/Path; +PLcoil/disk/DiskLruCache$Entry;->(Lcoil/disk/DiskLruCache;Ljava/lang/String;)V +PLcoil/disk/DiskLruCache$Entry;->snapshot()Lcoil/disk/DiskLruCache$Snapshot; +PLcoil/disk/DiskLruCache$Snapshot;->(Lcoil/disk/DiskLruCache;Lcoil/disk/DiskLruCache$Entry;)V PLcoil/disk/DiskLruCache$Snapshot;->close()V +PLcoil/disk/DiskLruCache$Snapshot;->file(I)Lokio/Path; +PLcoil/disk/DiskLruCache;->access$completeEdit(Lcoil/disk/DiskLruCache;Lcoil/disk/DiskLruCache$Editor;Z)V +PLcoil/disk/DiskLruCache;->edit(Ljava/lang/String;)Lcoil/disk/DiskLruCache$Editor; +PLcoil/disk/FaultHidingSink;->flush()V +PLcoil/disk/FaultHidingSink;->write(Lokio/Buffer;J)V +PLcoil/disk/RealDiskCache$RealEditor;->(Lcoil/disk/DiskLruCache$Editor;)V +PLcoil/disk/RealDiskCache$RealEditor;->commitAndGet()Lcoil/disk/RealDiskCache$RealSnapshot; +PLcoil/disk/RealDiskCache$RealEditor;->getData()Lokio/Path; +PLcoil/disk/RealDiskCache$RealEditor;->getMetadata()Lokio/Path; +PLcoil/disk/RealDiskCache$RealSnapshot;->(Lcoil/disk/DiskLruCache$Snapshot;)V PLcoil/disk/RealDiskCache$RealSnapshot;->close()V PLcoil/disk/RealDiskCache$RealSnapshot;->closeAndEdit()Lcoil/disk/RealDiskCache$RealEditor; +PLcoil/disk/RealDiskCache$RealSnapshot;->getData()Lokio/Path; +PLcoil/disk/RealDiskCache$RealSnapshot;->getMetadata()Lokio/Path; +PLcoil/disk/RealDiskCache;->edit(Ljava/lang/String;)Lcoil/disk/RealDiskCache$RealEditor; +PLcoil/disk/RealDiskCache;->getFileSystem()Lokio/FileSystem; +PLcoil/fetch/FetchResult;->()V +PLcoil/fetch/HttpUriFetcher$executeNetworkRequest$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +PLcoil/fetch/HttpUriFetcher$fetch$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +PLcoil/fetch/HttpUriFetcher;->getFileSystem()Lokio/FileSystem; +PLcoil/fetch/HttpUriFetcher;->getMimeType$coil_base_release(Ljava/lang/String;Lokhttp3/MediaType;)Ljava/lang/String; +PLcoil/fetch/HttpUriFetcher;->toCacheResponse(Lcoil/disk/DiskCache$Snapshot;)Lcoil/network/CacheResponse; +PLcoil/fetch/HttpUriFetcher;->toImageSource(Lcoil/disk/DiskCache$Snapshot;)Lcoil/decode/FileImageSource; +PLcoil/fetch/HttpUriFetcher;->writeToDiskCache(Lcoil/disk/DiskCache$Snapshot;Lokhttp3/Request;Lokhttp3/Response;Lcoil/network/CacheResponse;)Lcoil/disk/DiskCache$Snapshot; +PLcoil/fetch/SourceResult;->(Lcoil/decode/ImageSource;Ljava/lang/String;I)V PLcoil/intercept/EngineInterceptor$ExecuteResult;->(Landroid/graphics/drawable/Drawable;ZILjava/lang/String;)V +PLcoil/intercept/EngineInterceptor$decode$1;->(Lcoil/intercept/EngineInterceptor;Lkotlin/coroutines/Continuation;)V +PLcoil/intercept/EngineInterceptor$execute$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +PLcoil/intercept/EngineInterceptor$execute$executeResult$1;->(Lcoil/intercept/EngineInterceptor;Lkotlin/jvm/internal/Ref$ObjectRef;Lkotlin/jvm/internal/Ref$ObjectRef;Lcoil/request/ImageRequest;Ljava/lang/Object;Lkotlin/jvm/internal/Ref$ObjectRef;Lcoil/EventListener;Lkotlin/coroutines/Continuation;)V +PLcoil/intercept/EngineInterceptor$execute$executeResult$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +PLcoil/intercept/EngineInterceptor$execute$executeResult$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +PLcoil/intercept/EngineInterceptor$execute$executeResult$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +PLcoil/intercept/EngineInterceptor$fetch$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcoil/intercept/EngineInterceptor$intercept$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +PLcoil/intercept/EngineInterceptor;->access$decode(Lcoil/intercept/EngineInterceptor;Lcoil/fetch/SourceResult;Lcoil/ComponentRegistry;Lcoil/request/ImageRequest;Ljava/lang/Object;Lcoil/request/Options;Lcoil/EventListener;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLcoil/intercept/RealInterceptorChain$proceed$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcoil/intercept/RealInterceptorChain;->checkRequest(Lcoil/request/ImageRequest;Lcoil/intercept/Interceptor;)V -PLcoil/intercept/RealInterceptorChain;->getRequest()Lcoil/request/ImageRequest; PLcoil/memory/MemoryCache$Key;->equals(Ljava/lang/Object;)Z PLcoil/memory/MemoryCache$Value;->(Landroid/graphics/Bitmap;Ljava/util/Map;)V +PLcoil/memory/MemoryCacheService;->newResult(Lcoil/intercept/RealInterceptorChain;Lcoil/request/ImageRequest;Lcoil/memory/MemoryCache$Key;Lcoil/memory/MemoryCache$Value;)Lcoil/request/SuccessResult; PLcoil/memory/RealMemoryCache;->set(Lcoil/memory/MemoryCache$Key;Lcoil/memory/MemoryCache$Value;)V -PLcoil/memory/RealMemoryCache;->trimMemory(I)V PLcoil/memory/RealStrongMemoryCache$InternalValue;->(Landroid/graphics/Bitmap;Ljava/util/Map;I)V PLcoil/memory/RealStrongMemoryCache$cache$1;->entryRemoved(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V PLcoil/memory/RealStrongMemoryCache$cache$1;->sizeOf(Ljava/lang/Object;Ljava/lang/Object;)I PLcoil/memory/RealStrongMemoryCache;->set(Lcoil/memory/MemoryCache$Key;Landroid/graphics/Bitmap;Ljava/util/Map;)V -PLcoil/memory/RealStrongMemoryCache;->trimMemory(I)V PLcoil/memory/RealWeakMemoryCache$InternalValue;->(ILjava/lang/ref/WeakReference;Ljava/util/Map;I)V -PLcoil/memory/RealWeakMemoryCache;->cleanUp$coil_base_release()V PLcoil/memory/RealWeakMemoryCache;->set(Lcoil/memory/MemoryCache$Key;Landroid/graphics/Bitmap;Ljava/util/Map;I)V -PLcoil/memory/RealWeakMemoryCache;->trimMemory(I)V +PLcoil/network/CacheResponse$cacheControl$2;->(Lcoil/network/CacheResponse;)V PLcoil/network/CacheResponse$cacheControl$2;->invoke()Ljava/lang/Object; +PLcoil/network/CacheResponse$contentType$2;->(Lcoil/network/CacheResponse;)V +PLcoil/network/CacheResponse$contentType$2;->invoke()Ljava/lang/Object; +PLcoil/network/CacheResponse;->(Lokhttp3/Response;)V +PLcoil/network/CacheResponse;->writeTo(Lokio/RealBufferedSink;)V PLcoil/network/CacheStrategy$Companion;->combineHeaders(Lokhttp3/Headers;Lokhttp3/Headers;)Lokhttp3/Headers; PLcoil/network/CacheStrategy$Companion;->isEndToEnd(Ljava/lang/String;)Z -PLcoil/network/HttpException;->(Lokhttp3/Response;)V PLcoil/request/BaseRequestDelegate;->complete()V -PLcoil/request/ErrorResult;->(Landroid/graphics/drawable/Drawable;Lcoil/request/ImageRequest;Ljava/lang/Throwable;)V -PLcoil/request/ErrorResult;->getDrawable()Landroid/graphics/drawable/Drawable; -PLcoil/request/ErrorResult;->getRequest()Lcoil/request/ImageRequest; +PLcoil/request/CachePolicy$EnumUnboxingLocalUtility;->getWriteEnabled(I)Z PLcoil/request/ImageResult;->()V -PLcoil/request/RequestService;->errorResult(Lcoil/request/ImageRequest;Ljava/lang/Throwable;)Lcoil/request/ErrorResult; PLcoil/request/SuccessResult;->(Landroid/graphics/drawable/Drawable;Lcoil/request/ImageRequest;ILcoil/memory/MemoryCache$Key;Ljava/lang/String;ZZ)V PLcoil/request/SuccessResult;->getRequest()Lcoil/request/ImageRequest; PLcoil/size/-Sizes;->isOriginal(Lcoil/size/Size;)Z @@ -14243,10 +13418,11 @@ PLcoil/transition/NoneTransition;->(Lcoil/transition/TransitionTarget;Lcoi PLcoil/util/-Bitmaps;->getAllocationByteCountCompat(Landroid/graphics/Bitmap;)I PLcoil/util/-SvgUtils;->toPx(Lcoil/size/Dimension;I)F PLcoil/util/-SvgUtils;->toSoftware(Landroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap$Config; +PLcoil/util/-Utils;->closeQuietly(Ljava/io/Closeable;)V PLcoil/util/-Utils;->toPx(Lcoil/size/Dimension;I)I PLcoil/util/ContinuationCallback;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLcoil/util/ContinuationCallback;->onFailure(Lokhttp3/internal/connection/RealCall;Ljava/io/IOException;)V -PLcoil/util/SystemCallbacks;->onTrimMemory(I)V +PLcoil/util/ContinuationCallback;->onResponse(Lokhttp3/Response;)V PLcoil/util/Time$provider$1;->()V PLcoil/util/Time$provider$1;->()V PLcoil/util/Time$provider$1;->invoke()Ljava/lang/Object; @@ -14332,6 +13508,7 @@ PLcom/caverock/androidsvg/SVGAndroidRenderer;->isSpecified(Lcom/caverock/android PLcom/caverock/androidsvg/SVGAndroidRenderer;->makePathAndBoundingBox(Lcom/caverock/androidsvg/SVG$Circle;)Landroid/graphics/Path; PLcom/caverock/androidsvg/SVGAndroidRenderer;->pushLayer()Z PLcom/caverock/androidsvg/SVGAndroidRenderer;->render(Lcom/caverock/androidsvg/SVG$Svg;Lcom/caverock/androidsvg/SVG$Box;Lcom/caverock/androidsvg/SVG$Box;Lcom/caverock/androidsvg/PreserveAspectRatio;)V +PLcom/caverock/androidsvg/SVGAndroidRenderer;->render(Lcom/caverock/androidsvg/SVG$SvgObject;)V PLcom/caverock/androidsvg/SVGAndroidRenderer;->renderChildren(Lcom/caverock/androidsvg/SVG$SvgContainer;Z)V PLcom/caverock/androidsvg/SVGAndroidRenderer;->renderMarkers(Lcom/caverock/androidsvg/SVG$GraphicsElement;)V PLcom/caverock/androidsvg/SVGAndroidRenderer;->setPaintColour(Lcom/caverock/androidsvg/SVGAndroidRenderer$RendererState;ZLcom/caverock/androidsvg/SVG$SvgPaint;)V @@ -14392,6 +13569,7 @@ PLcom/google/protobuf/FieldSet;->computeElementSizeNoTag(Lcom/google/protobuf/Wi PLcom/google/protobuf/FieldSet;->makeImmutable()V PLcom/google/protobuf/FieldSet;->writeElement(Lcom/google/protobuf/CodedOutputStream;Lcom/google/protobuf/WireFormat$FieldType;ILjava/lang/Object;)V PLcom/google/protobuf/MapEntryLite;->computeSerializedSize(Lcom/google/protobuf/MapEntryLite$Metadata;Ljava/lang/Object;Ljava/lang/Object;)I +PLcom/google/protobuf/MapEntryLite;->writeTo(Lcom/google/protobuf/CodedOutputStream;Lcom/google/protobuf/MapEntryLite$Metadata;Ljava/lang/Object;Ljava/lang/Object;)V PLcom/google/protobuf/MapFieldLite;->calculateHashCodeForObject(Ljava/lang/Object;)I PLcom/google/protobuf/MapFieldLite;->ensureMutable()V PLcom/google/protobuf/MapFieldLite;->equals(Ljava/lang/Object;)Z @@ -14421,12 +13599,6 @@ PLcom/google/samples/apps/nowinandroid/DaggerNiaApplication_HiltComponents_Singl PLcom/google/samples/apps/nowinandroid/DaggerNiaApplication_HiltComponents_SingletonC$ActivityRetainedCImpl;->getActivityRetainedLifecycle()Ldagger/hilt/android/ActivityRetainedLifecycle; PLcom/google/samples/apps/nowinandroid/MainActivity$onCreate$3$1$1$invoke$$inlined$onDispose$1;->dispose()V PLcom/google/samples/apps/nowinandroid/MainActivity;->onPause()V -PLcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstAuthorsRepository$getAuthor$$inlined$map$1$2$1;->(Lcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstAuthorsRepository$getAuthor$$inlined$map$1$2;Lkotlin/coroutines/Continuation;)V -PLcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstAuthorsRepository$getAuthor$$inlined$map$1$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstAuthorsRepository$getAuthor$$inlined$map$1$2;->(Lkotlinx/coroutines/flow/FlowCollector;)V -PLcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstAuthorsRepository$getAuthor$$inlined$map$1$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstAuthorsRepository$getAuthor$$inlined$map$1;->(Lkotlinx/coroutines/flow/Flow;)V -PLcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstAuthorsRepository$getAuthor$$inlined$map$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepository$getNewsResources$$inlined$map$1$2$1;->(Lcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepository$getNewsResources$$inlined$map$1$2;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepository$getNewsResources$$inlined$map$1$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepository$getNewsResources$$inlined$map$1$2;->(Lkotlinx/coroutines/flow/FlowCollector;)V @@ -14440,55 +13612,35 @@ PLcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepo PLcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepository$getNewsResources$$inlined$map$2;->(Lkotlinx/coroutines/flow/Flow;)V PLcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepository$getNewsResources$$inlined$map$2;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLcom/google/samples/apps/nowinandroid/core/data/util/ConnectivityManagerNetworkMonitor$isOnline$1$1;->invoke()Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/core/database/dao/AuthorDao_Impl$8;->(Lcom/google/samples/apps/nowinandroid/core/database/dao/AuthorDao_Impl;Landroidx/room/RoomSQLiteQuery;)V -PLcom/google/samples/apps/nowinandroid/core/database/dao/AuthorDao_Impl$8;->call()Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/core/database/dao/AuthorDao_Impl$8;->finalize()V -PLcom/google/samples/apps/nowinandroid/core/database/dao/AuthorDao_Impl$9;->finalize()V -PLcom/google/samples/apps/nowinandroid/core/database/dao/AuthorDao_Impl;->getAuthorEntity(Ljava/lang/String;)Lkotlinx/coroutines/flow/SafeFlow; -PLcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl$12;->(Lcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl;Landroidx/room/RoomSQLiteQuery;)V -PLcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl$12;->finalize()V -PLcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl$13;->(Lcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl;Landroidx/room/RoomSQLiteQuery;)V -PLcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl$13;->call()Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl$13;->finalize()V -PLcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl;->__fetchRelationshipauthorsAscomGoogleSamplesAppsNowinandroidCoreDatabaseModelAuthorEntity(Landroidx/collection/ArrayMap;)V -PLcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl;->__fetchRelationshiptopicsAscomGoogleSamplesAppsNowinandroidCoreDatabaseModelTopicEntity(Landroidx/collection/ArrayMap;)V +PLcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl$10;->(Lcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl;Landroidx/room/RoomSQLiteQuery;)V +PLcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl$10;->call()Ljava/lang/Object; +PLcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl$10;->finalize()V +PLcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl$11;->(Lcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl;Landroidx/room/RoomSQLiteQuery;)V +PLcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl$11;->call()Ljava/lang/Object; +PLcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl$11;->finalize()V PLcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl;->getNewsResources()Lkotlinx/coroutines/flow/SafeFlow; -PLcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl;->getNewsResources(Ljava/util/Set;Ljava/util/Set;)Lkotlinx/coroutines/flow/SafeFlow; +PLcom/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao_Impl;->getNewsResources(Ljava/util/Set;)Lkotlinx/coroutines/flow/SafeFlow; PLcom/google/samples/apps/nowinandroid/core/database/dao/TopicDao_Impl$9;->finalize()V -PLcom/google/samples/apps/nowinandroid/core/database/model/PopulatedNewsResource;->(Lcom/google/samples/apps/nowinandroid/core/database/model/NewsResourceEntity;Ljava/util/ArrayList;Ljava/util/ArrayList;)V -PLcom/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSource$toggleFollowedAuthorId$1;->(Lcom/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSource;Lkotlin/coroutines/Continuation;)V -PLcom/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSource$toggleFollowedAuthorId$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSource$toggleFollowedAuthorId$2;->(Ljava/lang/String;Lkotlin/coroutines/Continuation;Z)V -PLcom/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSource$toggleFollowedAuthorId$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; -PLcom/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSource$toggleFollowedAuthorId$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSource$toggleFollowedAuthorId$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSource;->toggleFollowedAuthorId(Ljava/lang/String;Lkotlin/coroutines/Continuation;Z)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/core/datastore/UserPreferences;->access$3500(Lcom/google/samples/apps/nowinandroid/core/datastore/UserPreferences;)Lcom/google/protobuf/MapFieldLite; +PLcom/google/samples/apps/nowinandroid/core/database/model/PopulatedNewsResource;->(Lcom/google/samples/apps/nowinandroid/core/database/model/NewsResourceEntity;Ljava/util/ArrayList;)V +PLcom/google/samples/apps/nowinandroid/core/database/model/PopulatedNewsResourceKt;->asExternalModel(Lcom/google/samples/apps/nowinandroid/core/database/model/PopulatedNewsResource;)Lcom/google/samples/apps/nowinandroid/core/model/data/NewsResource; +PLcom/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSource$toggleFollowedTopicId$1;->(Lcom/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSource;Lkotlin/coroutines/Continuation;)V +PLcom/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSource$toggleFollowedTopicId$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +PLcom/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSource$toggleFollowedTopicId$2;->(Ljava/lang/String;Lkotlin/coroutines/Continuation;Z)V +PLcom/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSource$toggleFollowedTopicId$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +PLcom/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSource$toggleFollowedTopicId$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +PLcom/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSource$toggleFollowedTopicId$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +PLcom/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSource;->toggleFollowedTopicId(Ljava/lang/String;Lkotlin/coroutines/Continuation;Z)Ljava/lang/Object; +PLcom/google/samples/apps/nowinandroid/core/datastore/UserPreferences;->access$3400(Lcom/google/samples/apps/nowinandroid/core/datastore/UserPreferences;)Lcom/google/protobuf/MapFieldLite; PLcom/google/samples/apps/nowinandroid/core/datastore/UserPreferencesKt$Dsl;->(Lcom/google/samples/apps/nowinandroid/core/datastore/UserPreferences$Builder;)V PLcom/google/samples/apps/nowinandroid/core/datastore/UserPreferencesKt$Dsl;->_build()Lcom/google/samples/apps/nowinandroid/core/datastore/UserPreferences; -PLcom/google/samples/apps/nowinandroid/core/datastore/UserPreferencesKt$Dsl;->getFollowedAuthorIdsMap()Lcom/google/protobuf/kotlin/DslMap; PLcom/google/samples/apps/nowinandroid/core/datastore/UserPreferencesKt$Dsl;->getFollowedTopicIdsMap()Lcom/google/protobuf/kotlin/DslMap; -PLcom/google/samples/apps/nowinandroid/core/decoder/UriDecoder;->()V PLcom/google/samples/apps/nowinandroid/core/designsystem/component/ButtonKt$NiaTextButton$1$1;->(Lkotlin/jvm/functions/Function3;Landroidx/compose/foundation/layout/RowScope;II)V PLcom/google/samples/apps/nowinandroid/core/designsystem/component/ButtonKt$NiaTextButton$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/nowinandroid/core/designsystem/component/ButtonKt$NiaTextButton$1;->(Lkotlin/jvm/functions/Function3;I)V -PLcom/google/samples/apps/nowinandroid/core/designsystem/component/ButtonKt$NiaTextButton$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/nowinandroid/core/designsystem/component/ButtonKt$NiaTextButton$3;->(Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;I)V PLcom/google/samples/apps/nowinandroid/core/designsystem/component/ButtonKt$NiaTextButton$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/nowinandroid/core/designsystem/component/ButtonKt;->NiaTextButton(Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;ZZLandroidx/compose/material3/ButtonColors;Landroidx/compose/foundation/layout/PaddingValues;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;II)V PLcom/google/samples/apps/nowinandroid/core/designsystem/component/ButtonKt;->NiaTextButton(Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;ZZLandroidx/compose/material3/ButtonColors;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;II)V -PLcom/google/samples/apps/nowinandroid/core/designsystem/component/ButtonKt;->access$NiaButtonContent(Landroidx/compose/foundation/layout/RowScope;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;I)V -PLcom/google/samples/apps/nowinandroid/core/designsystem/component/ChipKt$NiaFilterChip$1$1;->(Lkotlin/jvm/functions/Function1;Z)V -PLcom/google/samples/apps/nowinandroid/core/designsystem/component/ChipKt$NiaFilterChip$2$1;->(ILkotlin/jvm/functions/Function2;)V -PLcom/google/samples/apps/nowinandroid/core/designsystem/component/ChipKt$NiaFilterChip$2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/core/designsystem/component/ChipKt$NiaFilterChip$2;->(ILkotlin/jvm/functions/Function2;)V -PLcom/google/samples/apps/nowinandroid/core/designsystem/component/ChipKt$NiaFilterChip$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/core/designsystem/component/ChipKt$NiaFilterChip$3;->(ZLkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;ZLkotlin/jvm/functions/Function2;II)V -PLcom/google/samples/apps/nowinandroid/core/designsystem/component/ChipKt;->NiaFilterChip(ZLkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;ZLkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;II)V -PLcom/google/samples/apps/nowinandroid/core/designsystem/component/ComposableSingletons$ChipKt$lambda-1$1;->()V -PLcom/google/samples/apps/nowinandroid/core/designsystem/component/ComposableSingletons$ChipKt$lambda-1$1;->()V -PLcom/google/samples/apps/nowinandroid/core/designsystem/component/ComposableSingletons$ChipKt$lambda-1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/core/designsystem/component/ComposableSingletons$ChipKt;->()V PLcom/google/samples/apps/nowinandroid/core/designsystem/component/ComposableSingletons$TagKt$lambda-1$1;->()V PLcom/google/samples/apps/nowinandroid/core/designsystem/component/ComposableSingletons$TagKt$lambda-1$1;->()V PLcom/google/samples/apps/nowinandroid/core/designsystem/component/ComposableSingletons$TagKt$lambda-2$1;->()V @@ -14499,17 +13651,6 @@ PLcom/google/samples/apps/nowinandroid/core/designsystem/component/ComposableSin PLcom/google/samples/apps/nowinandroid/core/designsystem/component/DropdownMenuKt$NiaDropdownMenu$1;->(Ljava/util/List;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function3;ILkotlin/jvm/functions/Function1;ZLkotlin/jvm/functions/Function0;)V PLcom/google/samples/apps/nowinandroid/core/designsystem/component/DropdownMenuKt;->NiaDropdownMenu(ZLkotlin/jvm/functions/Function0;Ljava/util/List;Lkotlin/jvm/functions/Function1;ZLkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;II)V PLcom/google/samples/apps/nowinandroid/core/designsystem/component/NiaButtonDefaults;->textButtonColors-ro_MJ88(JJJLandroidx/compose/runtime/Composer;I)Landroidx/compose/material3/ButtonColors; -PLcom/google/samples/apps/nowinandroid/core/designsystem/component/NiaChipDefaults;->()V -PLcom/google/samples/apps/nowinandroid/core/designsystem/component/NiaTabDefaults;->()V -PLcom/google/samples/apps/nowinandroid/core/designsystem/component/TabsKt$NiaTab$1$1;->(ILkotlin/jvm/functions/Function2;)V -PLcom/google/samples/apps/nowinandroid/core/designsystem/component/TabsKt$NiaTab$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/core/designsystem/component/TabsKt$NiaTab$1;->(ILkotlin/jvm/functions/Function2;)V -PLcom/google/samples/apps/nowinandroid/core/designsystem/component/TabsKt$NiaTab$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/core/designsystem/component/TabsKt$NiaTabRow$1;->(I)V -PLcom/google/samples/apps/nowinandroid/core/designsystem/component/TabsKt$NiaTabRow$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/core/designsystem/component/TabsKt$NiaTabRow$2;->(ILandroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function2;II)V -PLcom/google/samples/apps/nowinandroid/core/designsystem/component/TabsKt;->NiaTab(ZLkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;ZLkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;II)V -PLcom/google/samples/apps/nowinandroid/core/designsystem/component/TabsKt;->NiaTabRow(ILandroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;II)V PLcom/google/samples/apps/nowinandroid/core/designsystem/component/TagKt$NiaTopicTag$2$1$1;->(Lkotlin/jvm/functions/Function1;)V PLcom/google/samples/apps/nowinandroid/core/designsystem/component/TagKt$NiaTopicTag$2$2$1;->(Lkotlin/jvm/functions/Function1;)V PLcom/google/samples/apps/nowinandroid/core/designsystem/component/TagKt$NiaTopicTag$2$3$1;->(Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;)V @@ -14522,7 +13663,7 @@ PLcom/google/samples/apps/nowinandroid/core/domain/GetSaveableNewsResourcesUseCa PLcom/google/samples/apps/nowinandroid/core/domain/GetSaveableNewsResourcesUseCase$special$$inlined$map$1$2;->(Lkotlinx/coroutines/flow/FlowCollector;)V PLcom/google/samples/apps/nowinandroid/core/domain/GetSaveableNewsResourcesUseCase$special$$inlined$map$1$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLcom/google/samples/apps/nowinandroid/core/domain/GetSaveableNewsResourcesUseCase$special$$inlined$map$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/core/domain/GetSaveableNewsResourcesUseCase;->invoke(Ljava/util/Set;Ljava/util/Set;)Lkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$unsafeFlow$1; +PLcom/google/samples/apps/nowinandroid/core/domain/GetSaveableNewsResourcesUseCase;->invoke(Ljava/util/Set;)Lkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$unsafeFlow$1; PLcom/google/samples/apps/nowinandroid/core/domain/GetSaveableNewsResourcesUseCaseKt$mapToSaveableNewsResources$$inlined$filterNot$1$2$1;->(Lcom/google/samples/apps/nowinandroid/core/domain/GetSaveableNewsResourcesUseCaseKt$mapToSaveableNewsResources$$inlined$filterNot$1$2;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/nowinandroid/core/domain/GetSaveableNewsResourcesUseCaseKt$mapToSaveableNewsResources$$inlined$filterNot$1$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/nowinandroid/core/domain/GetSaveableNewsResourcesUseCaseKt$mapToSaveableNewsResources$$inlined$filterNot$1$2;->(Lkotlinx/coroutines/flow/FlowCollector;)V @@ -14533,21 +13674,7 @@ PLcom/google/samples/apps/nowinandroid/core/domain/GetSaveableNewsResourcesUseCa PLcom/google/samples/apps/nowinandroid/core/domain/GetSaveableNewsResourcesUseCaseKt$mapToSaveableNewsResources$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/nowinandroid/core/domain/GetSaveableNewsResourcesUseCaseKt$mapToSaveableNewsResources$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/nowinandroid/core/domain/model/SaveableNewsResource;->(Lcom/google/samples/apps/nowinandroid/core/model/data/NewsResource;Z)V -PLcom/google/samples/apps/nowinandroid/core/model/data/NewsResource;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlinx/datetime/Instant;Lcom/google/samples/apps/nowinandroid/core/model/data/NewsResourceType;Ljava/util/List;Ljava/util/List;)V -PLcom/google/samples/apps/nowinandroid/core/result/Result$Loading;->()V -PLcom/google/samples/apps/nowinandroid/core/result/Result$Loading;->()V -PLcom/google/samples/apps/nowinandroid/core/result/Result$Success;->(Ljava/lang/Object;)V -PLcom/google/samples/apps/nowinandroid/core/result/ResultKt$asResult$$inlined$map$1$2$1;->(Lcom/google/samples/apps/nowinandroid/core/result/ResultKt$asResult$$inlined$map$1$2;Lkotlin/coroutines/Continuation;)V -PLcom/google/samples/apps/nowinandroid/core/result/ResultKt$asResult$$inlined$map$1$2;->(Lkotlinx/coroutines/flow/FlowCollector;)V -PLcom/google/samples/apps/nowinandroid/core/result/ResultKt$asResult$$inlined$map$1$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/core/result/ResultKt$asResult$$inlined$map$1;->(Lkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$unsafeFlow$1;)V -PLcom/google/samples/apps/nowinandroid/core/result/ResultKt$asResult$$inlined$map$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/core/result/ResultKt$asResult$2;->(Lkotlin/coroutines/Continuation;)V -PLcom/google/samples/apps/nowinandroid/core/result/ResultKt$asResult$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; -PLcom/google/samples/apps/nowinandroid/core/result/ResultKt$asResult$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/core/result/ResultKt$asResult$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/core/result/ResultKt$asResult$3;->(Lkotlin/coroutines/Continuation;)V -PLcom/google/samples/apps/nowinandroid/core/result/ResultKt;->asResult(Lkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$unsafeFlow$1;)Lkotlinx/coroutines/flow/FlowKt__ErrorsKt$catch$$inlined$unsafeFlow$1; +PLcom/google/samples/apps/nowinandroid/core/model/data/NewsResource;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlinx/datetime/Instant;Lcom/google/samples/apps/nowinandroid/core/model/data/NewsResourceType;Ljava/util/List;)V PLcom/google/samples/apps/nowinandroid/core/ui/ComposableSingletons$NewsResourceCardKt$lambda-1$1;->()V PLcom/google/samples/apps/nowinandroid/core/ui/ComposableSingletons$NewsResourceCardKt$lambda-1$1;->()V PLcom/google/samples/apps/nowinandroid/core/ui/ComposableSingletons$NewsResourceCardKt$lambda-1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; @@ -14566,16 +13693,10 @@ PLcom/google/samples/apps/nowinandroid/core/ui/ComposableSingletons$NewsResource PLcom/google/samples/apps/nowinandroid/core/ui/ComposableSingletons$NewsResourceCardKt$lambda-8$1;->()V PLcom/google/samples/apps/nowinandroid/core/ui/ComposableSingletons$NewsResourceCardKt$lambda-8$1;->()V PLcom/google/samples/apps/nowinandroid/core/ui/ComposableSingletons$NewsResourceCardKt;->()V -PLcom/google/samples/apps/nowinandroid/core/ui/NewsFeedKt$newsFeed$$inlined$items$default$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/core/ui/NewsFeedKt$newsFeed$$inlined$items$default$4;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/nowinandroid/core/ui/NewsFeedKt$newsFeed$$inlined$items$default$5;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/nowinandroid/core/ui/NewsFeedKt$newsFeed$2$1;->(Lkotlin/jvm/functions/Function2;Lcom/google/samples/apps/nowinandroid/core/domain/model/SaveableNewsResource;)V PLcom/google/samples/apps/nowinandroid/core/ui/NewsFeedKt$newsFeed$2$2;->(Landroid/content/Context;Landroid/content/Intent;)V PLcom/google/samples/apps/nowinandroid/core/ui/NewsResourceCardKt$BookmarkButton$1$1;->(Lkotlin/jvm/functions/Function0;)V -PLcom/google/samples/apps/nowinandroid/core/ui/NewsResourceCardKt$NewsResourceAuthors$2;->(ILjava/util/List;)V -PLcom/google/samples/apps/nowinandroid/core/ui/NewsResourceCardKt$NewsResourceAuthors$authorNameFormatted$1;->()V -PLcom/google/samples/apps/nowinandroid/core/ui/NewsResourceCardKt$NewsResourceAuthors$authorNameFormatted$1;->()V -PLcom/google/samples/apps/nowinandroid/core/ui/NewsResourceCardKt$NewsResourceAuthors$authorNameFormatted$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/nowinandroid/core/ui/NewsResourceCardKt$NewsResourceCardExpanded$1$1;->(Ljava/lang/String;)V PLcom/google/samples/apps/nowinandroid/core/ui/NewsResourceCardKt$NewsResourceCardExpanded$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/nowinandroid/core/ui/NewsResourceCardKt$NewsResourceCardExpanded$2;->(Lcom/google/samples/apps/nowinandroid/core/model/data/NewsResource;ZLkotlin/jvm/functions/Function0;I)V @@ -14597,105 +13718,12 @@ PLcom/google/samples/apps/nowinandroid/core/ui/NewsResourceCardKt$dateFormatted$ PLcom/google/samples/apps/nowinandroid/core/ui/NewsResourceCardKt$dateFormatted$1;->(Landroid/content/Context;Landroidx/compose/runtime/MutableState;)V PLcom/google/samples/apps/nowinandroid/core/ui/NewsResourceCardKt$dateFormatted$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/nowinandroid/core/ui/NewsResourceCardKt;->BookmarkButton(ZLkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;II)V -PLcom/google/samples/apps/nowinandroid/core/ui/NewsResourceCardKt;->NewsResourceAuthors(Ljava/util/List;Landroidx/compose/runtime/Composer;I)V PLcom/google/samples/apps/nowinandroid/core/ui/NewsResourceCardKt;->NewsResourceCardExpanded(Lcom/google/samples/apps/nowinandroid/core/model/data/NewsResource;ZLkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;II)V PLcom/google/samples/apps/nowinandroid/core/ui/NewsResourceCardKt;->NewsResourceDate(Lkotlinx/datetime/Instant;Landroidx/compose/runtime/Composer;I)V PLcom/google/samples/apps/nowinandroid/core/ui/NewsResourceCardKt;->NewsResourceHeaderImage(ILandroidx/compose/runtime/Composer;Ljava/lang/String;)V PLcom/google/samples/apps/nowinandroid/core/ui/NewsResourceCardKt;->NewsResourceShortDescription(ILandroidx/compose/runtime/Composer;Ljava/lang/String;)V PLcom/google/samples/apps/nowinandroid/core/ui/NewsResourceCardKt;->NewsResourceTitle(Ljava/lang/String;Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;II)V -PLcom/google/samples/apps/nowinandroid/core/ui/NewsResourceCardKt;->NewsResourceTopics(Ljava/util/List;Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;II)V -PLcom/google/samples/apps/nowinandroid/core/ui/NewsResourceCardListKt$newsResourceCardItems$$inlined$items$default$2;->(Ljava/util/List;Lcom/google/samples/apps/nowinandroid/core/ui/NewsResourceCardListKt$newsResourceCardItems$1;)V -PLcom/google/samples/apps/nowinandroid/core/ui/NewsResourceCardListKt$newsResourceCardItems$$inlined$items$default$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/core/ui/NewsResourceCardListKt$newsResourceCardItems$$inlined$items$default$3;->(Ljava/util/List;)V -PLcom/google/samples/apps/nowinandroid/core/ui/NewsResourceCardListKt$newsResourceCardItems$$inlined$items$default$3;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/core/ui/NewsResourceCardListKt$newsResourceCardItems$$inlined$items$default$4;->(Ljava/util/List;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V -PLcom/google/samples/apps/nowinandroid/core/ui/NewsResourceCardListKt$newsResourceCardItems$$inlined$items$default$4;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/core/ui/NewsResourceCardListKt$newsResourceCardItems$1;->(Lkotlin/jvm/functions/Function1;)V -PLcom/google/samples/apps/nowinandroid/core/ui/NewsResourceCardListKt$newsResourceCardItems$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/core/ui/NewsResourceCardListKt$newsResourceCardItems$2$1;->(Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)V -PLcom/google/samples/apps/nowinandroid/core/ui/NewsResourceCardListKt$newsResourceCardItems$2$2;->(Lkotlin/jvm/functions/Function1;Landroid/content/Context;Landroid/content/Intent;Ljava/lang/Object;)V -PLcom/google/samples/apps/nowinandroid/core/ui/NewsResourceCardListKt;->newsResourceCardItems$default(Landroidx/compose/foundation/lazy/LazyListScope;Ljava/util/List;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;)V PLcom/google/samples/apps/nowinandroid/core/ui/TimeZoneBroadcastReceiver;->(Lcom/google/samples/apps/nowinandroid/core/ui/NewsResourceCardKt$dateFormatted$1$receiver$1;)V -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorScreenKt$AuthorRoute$1;->(Lcom/google/samples/apps/nowinandroid/feature/author/AuthorViewModel;)V -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorScreenKt$AuthorRoute$2;->(Lcom/google/samples/apps/nowinandroid/feature/author/AuthorViewModel;)V -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorScreenKt$AuthorRoute$3;->(Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;Lcom/google/samples/apps/nowinandroid/feature/author/AuthorViewModel;II)V -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorScreenKt$AuthorRoute$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorScreenKt$AuthorScreen$1$1;->(Landroidx/compose/ui/Modifier;I)V -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorScreenKt$AuthorScreen$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorScreenKt$AuthorScreen$1$2;->(Lcom/google/samples/apps/nowinandroid/feature/author/AuthorUiState;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;I)V -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorScreenKt$AuthorScreen$1$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorScreenKt$AuthorScreen$1;->(Lcom/google/samples/apps/nowinandroid/feature/author/AuthorUiState;Lcom/google/samples/apps/nowinandroid/feature/author/NewsUiState;Lkotlin/jvm/functions/Function2;Landroidx/compose/ui/Modifier;ILkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;)V -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorScreenKt$AuthorScreen$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorScreenKt$AuthorToolbar$3$1$1;->(Lkotlin/jvm/functions/Function0;)V -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorScreenKt$AuthorToolbar$3$2;->(Z)V -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorScreenKt$AuthorToolbar$3$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorScreenKt$authorBody$1;->(Lcom/google/samples/apps/nowinandroid/core/model/data/Author;)V -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorScreenKt$authorBody$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorScreenKt$authorCards$1;->()V -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorScreenKt$authorCards$1;->()V -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorScreenKt$authorCards$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorScreenKt$authorCards$2;->()V -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorScreenKt$authorCards$2;->()V -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorScreenKt$authorCards$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorScreenKt$authorCards$3;->(Lkotlin/jvm/functions/Function2;)V -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorScreenKt;->AuthorRoute(Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;Lcom/google/samples/apps/nowinandroid/feature/author/AuthorViewModel;Landroidx/compose/runtime/Composer;II)V -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorScreenKt;->AuthorScreen(Lcom/google/samples/apps/nowinandroid/feature/author/AuthorUiState;Lcom/google/samples/apps/nowinandroid/feature/author/NewsUiState;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;II)V -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorScreenKt;->access$AuthorHeader(Lcom/google/samples/apps/nowinandroid/core/model/data/Author;Landroidx/compose/runtime/Composer;I)V -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorScreenKt;->access$AuthorToolbar(Lcom/google/samples/apps/nowinandroid/core/domain/model/FollowableAuthor;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorUiState$Error;->()V -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorUiState$Error;->()V -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorUiState$Loading;->()V -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorUiState$Loading;->()V -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorUiState$Success;->(Lcom/google/samples/apps/nowinandroid/core/domain/model/FollowableAuthor;)V -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorUiState$Success;->equals(Ljava/lang/Object;)Z -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorViewModel;->(Landroidx/lifecycle/SavedStateHandle;Lcom/google/samples/apps/nowinandroid/core/decoder/UriDecoder;Lcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstUserDataRepository;Lcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstAuthorsRepository;Lcom/google/samples/apps/nowinandroid/core/domain/GetSaveableNewsResourcesUseCase;)V -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorViewModelKt$authorUiState$$inlined$map$1$2$1;->(Lcom/google/samples/apps/nowinandroid/feature/author/AuthorViewModelKt$authorUiState$$inlined$map$1$2;Lkotlin/coroutines/Continuation;)V -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorViewModelKt$authorUiState$$inlined$map$1$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorViewModelKt$authorUiState$$inlined$map$1$2;->(Lkotlinx/coroutines/flow/FlowCollector;)V -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorViewModelKt$authorUiState$$inlined$map$1$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorViewModelKt$authorUiState$$inlined$map$1;->(Lcom/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSource$special$$inlined$map$1;)V -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorViewModelKt$authorUiState$$inlined$map$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorViewModelKt$authorUiState$$inlined$map$2$2$1;->(Lcom/google/samples/apps/nowinandroid/feature/author/AuthorViewModelKt$authorUiState$$inlined$map$2$2;Lkotlin/coroutines/Continuation;)V -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorViewModelKt$authorUiState$$inlined$map$2$2;->(Lkotlinx/coroutines/flow/FlowCollector;Ljava/lang/String;)V -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorViewModelKt$authorUiState$$inlined$map$2$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorViewModelKt$authorUiState$$inlined$map$2;->(Lkotlinx/coroutines/flow/FlowKt__ErrorsKt$catch$$inlined$unsafeFlow$1;Ljava/lang/String;)V -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorViewModelKt$authorUiState$$inlined$map$2;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorViewModelKt$authorUiState$2;->()V -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorViewModelKt$authorUiState$2;->()V -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorViewModelKt$authorUiState$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorViewModelKt$newsUiState$$inlined$map$1$2$1;->(Lcom/google/samples/apps/nowinandroid/feature/author/AuthorViewModelKt$newsUiState$$inlined$map$1$2;Lkotlin/coroutines/Continuation;)V -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorViewModelKt$newsUiState$$inlined$map$1$2;->(Lkotlinx/coroutines/flow/FlowCollector;)V -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorViewModelKt$newsUiState$$inlined$map$1$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorViewModelKt$newsUiState$$inlined$map$1;->(Lkotlinx/coroutines/flow/FlowKt__ErrorsKt$catch$$inlined$unsafeFlow$1;)V -PLcom/google/samples/apps/nowinandroid/feature/author/AuthorViewModelKt$newsUiState$$inlined$map$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/feature/author/ComposableSingletons$AuthorScreenKt$lambda-1$1;->()V -PLcom/google/samples/apps/nowinandroid/feature/author/ComposableSingletons$AuthorScreenKt$lambda-1$1;->()V -PLcom/google/samples/apps/nowinandroid/feature/author/ComposableSingletons$AuthorScreenKt$lambda-1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/feature/author/ComposableSingletons$AuthorScreenKt$lambda-2$1;->()V -PLcom/google/samples/apps/nowinandroid/feature/author/ComposableSingletons$AuthorScreenKt$lambda-2$1;->()V -PLcom/google/samples/apps/nowinandroid/feature/author/ComposableSingletons$AuthorScreenKt$lambda-2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/feature/author/ComposableSingletons$AuthorScreenKt$lambda-3$1;->()V -PLcom/google/samples/apps/nowinandroid/feature/author/ComposableSingletons$AuthorScreenKt$lambda-3$1;->()V -PLcom/google/samples/apps/nowinandroid/feature/author/ComposableSingletons$AuthorScreenKt$lambda-3$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/feature/author/ComposableSingletons$AuthorScreenKt$lambda-4$1;->()V -PLcom/google/samples/apps/nowinandroid/feature/author/ComposableSingletons$AuthorScreenKt$lambda-4$1;->()V -PLcom/google/samples/apps/nowinandroid/feature/author/ComposableSingletons$AuthorScreenKt$lambda-5$1;->()V -PLcom/google/samples/apps/nowinandroid/feature/author/ComposableSingletons$AuthorScreenKt$lambda-5$1;->()V -PLcom/google/samples/apps/nowinandroid/feature/author/ComposableSingletons$AuthorScreenKt$lambda-5$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/feature/author/ComposableSingletons$AuthorScreenKt$lambda-6$1;->()V -PLcom/google/samples/apps/nowinandroid/feature/author/ComposableSingletons$AuthorScreenKt$lambda-6$1;->()V -PLcom/google/samples/apps/nowinandroid/feature/author/ComposableSingletons$AuthorScreenKt$lambda-7$1;->()V -PLcom/google/samples/apps/nowinandroid/feature/author/ComposableSingletons$AuthorScreenKt$lambda-7$1;->()V -PLcom/google/samples/apps/nowinandroid/feature/author/ComposableSingletons$AuthorScreenKt$lambda-8$1;->()V -PLcom/google/samples/apps/nowinandroid/feature/author/ComposableSingletons$AuthorScreenKt$lambda-8$1;->()V -PLcom/google/samples/apps/nowinandroid/feature/author/ComposableSingletons$AuthorScreenKt$lambda-9$1;->()V -PLcom/google/samples/apps/nowinandroid/feature/author/ComposableSingletons$AuthorScreenKt$lambda-9$1;->()V -PLcom/google/samples/apps/nowinandroid/feature/author/ComposableSingletons$AuthorScreenKt;->()V -PLcom/google/samples/apps/nowinandroid/feature/author/NewsUiState$Loading;->()V -PLcom/google/samples/apps/nowinandroid/feature/author/NewsUiState$Loading;->()V -PLcom/google/samples/apps/nowinandroid/feature/author/NewsUiState$Success;->(Ljava/util/List;)V -PLcom/google/samples/apps/nowinandroid/feature/author/navigation/AuthorArgs;->(Landroidx/lifecycle/SavedStateHandle;Lcom/google/samples/apps/nowinandroid/core/decoder/UriDecoder;)V -PLcom/google/samples/apps/nowinandroid/feature/author/navigation/AuthorNavigationKt$authorScreen$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreenKt$BookmarksRoute$1;->(Lcom/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksViewModel;)V PLcom/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreenKt$BookmarksRoute$2;->(Landroidx/compose/ui/Modifier;Lcom/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksViewModel;II)V PLcom/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreenKt$BookmarksRoute$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; @@ -14726,13 +13754,13 @@ PLcom/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksViewModel$spec PLcom/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksViewModel$special$$inlined$map$2;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLcom/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksViewModel;->(Lcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstUserDataRepository;Lcom/google/samples/apps/nowinandroid/core/domain/GetSaveableNewsResourcesUseCase;)V PLcom/google/samples/apps/nowinandroid/feature/bookmarks/navigation/ComposableSingletons$BookmarksNavigationKt$lambda-1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/feature/foryou/AuthorsCarouselKt$AuthorItem$2$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/feature/foryou/AuthorsCarouselKt$AuthorsCarousel$1$2$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenKt$ForYouRoute$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +PLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenKt$ForYouRoute$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +PLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenKt$SingleTopicButton$1$1$1;->invoke()Ljava/lang/Object; +PLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenKt$SingleTopicButton$1$2$1$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel$special$$inlined$map$2$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel$updateAuthorSelection$1;->(Lcom/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel;Ljava/lang/String;ZLkotlin/coroutines/Continuation;)V -PLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel$updateAuthorSelection$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; -PLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel$updateAuthorSelection$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +PLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel$updateTopicSelection$1;->(Lcom/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel;Ljava/lang/String;ZLkotlin/coroutines/Continuation;)V +PLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel$updateTopicSelection$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +PLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel$updateTopicSelection$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModelKt$mapToFeedState$$inlined$map$1$2$1;->(Lcom/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModelKt$mapToFeedState$$inlined$map$1$2;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModelKt$mapToFeedState$$inlined$map$1$2;->(Lkotlinx/coroutines/flow/FlowCollector;)V PLcom/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModelKt$mapToFeedState$$inlined$map$1$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; @@ -14768,58 +13796,36 @@ PLcom/google/samples/apps/nowinandroid/feature/interests/ComposableSingletons$In PLcom/google/samples/apps/nowinandroid/feature/interests/ComposableSingletons$TabContentKt$lambda-1$1;->()V PLcom/google/samples/apps/nowinandroid/feature/interests/ComposableSingletons$TabContentKt$lambda-1$1;->()V PLcom/google/samples/apps/nowinandroid/feature/interests/ComposableSingletons$TabContentKt$lambda-1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/feature/interests/ComposableSingletons$TabContentKt$lambda-2$1;->()V -PLcom/google/samples/apps/nowinandroid/feature/interests/ComposableSingletons$TabContentKt$lambda-2$1;->()V PLcom/google/samples/apps/nowinandroid/feature/interests/ComposableSingletons$TabContentKt;->()V PLcom/google/samples/apps/nowinandroid/feature/interests/InterestsItemKt$InterestsIcon$1;->(Ljava/lang/String;Landroidx/compose/ui/Modifier;II)V PLcom/google/samples/apps/nowinandroid/feature/interests/InterestsItemKt$InterestsItem$1$1$1;->(Lkotlin/jvm/functions/Function0;)V -PLcom/google/samples/apps/nowinandroid/feature/interests/InterestsItemKt$InterestsItem$1$1$1;->invoke()Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/feature/interests/InterestsScreenKt$InterestsContent$1$1$1$1$1;->(ILkotlin/jvm/functions/Function1;)V -PLcom/google/samples/apps/nowinandroid/feature/interests/InterestsScreenKt$InterestsContent$1$1$1$1$1;->invoke()Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/feature/interests/InterestsScreenKt$InterestsContent$1$1$1$2;->(I)V -PLcom/google/samples/apps/nowinandroid/feature/interests/InterestsScreenKt$InterestsContent$1$1$1$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/feature/interests/InterestsScreenKt$InterestsContent$1$1;->(Lcom/google/samples/apps/nowinandroid/feature/interests/InterestsTabState;Lkotlin/jvm/functions/Function1;I)V -PLcom/google/samples/apps/nowinandroid/feature/interests/InterestsScreenKt$InterestsContent$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +PLcom/google/samples/apps/nowinandroid/feature/interests/InterestsItemKt;->InterestsIcon(Ljava/lang/String;Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;II)V PLcom/google/samples/apps/nowinandroid/feature/interests/InterestsScreenKt$InterestsRoute$1;->(Lcom/google/samples/apps/nowinandroid/feature/interests/InterestsViewModel;)V -PLcom/google/samples/apps/nowinandroid/feature/interests/InterestsScreenKt$InterestsRoute$2;->(Lcom/google/samples/apps/nowinandroid/feature/interests/InterestsViewModel;)V -PLcom/google/samples/apps/nowinandroid/feature/interests/InterestsScreenKt$InterestsRoute$3;->(Lcom/google/samples/apps/nowinandroid/feature/interests/InterestsViewModel;)V -PLcom/google/samples/apps/nowinandroid/feature/interests/InterestsScreenKt$InterestsRoute$3;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/feature/interests/InterestsScreenKt$InterestsRoute$4$1$invoke$$inlined$onDispose$1;->(Landroidx/metrics/performance/PerformanceMetricsState$Holder;)V -PLcom/google/samples/apps/nowinandroid/feature/interests/InterestsScreenKt$InterestsRoute$4$1$invoke$$inlined$onDispose$1;->dispose()V -PLcom/google/samples/apps/nowinandroid/feature/interests/InterestsScreenKt$InterestsRoute$4$1;->(Landroidx/compose/runtime/MutableState;)V -PLcom/google/samples/apps/nowinandroid/feature/interests/InterestsScreenKt$InterestsRoute$4$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/feature/interests/InterestsScreenKt$InterestsRoute$5;->(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;Lcom/google/samples/apps/nowinandroid/feature/interests/InterestsViewModel;II)V -PLcom/google/samples/apps/nowinandroid/feature/interests/InterestsScreenKt$InterestsRoute$5;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/feature/interests/InterestsScreenKt$InterestsScreen$2;->(Lcom/google/samples/apps/nowinandroid/feature/interests/InterestsUiState;Lcom/google/samples/apps/nowinandroid/feature/interests/InterestsTabState;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;II)V -PLcom/google/samples/apps/nowinandroid/feature/interests/InterestsScreenKt;->InterestsContent(Lcom/google/samples/apps/nowinandroid/feature/interests/InterestsTabState;Lkotlin/jvm/functions/Function1;Lcom/google/samples/apps/nowinandroid/feature/interests/InterestsUiState$Interests;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;II)V -PLcom/google/samples/apps/nowinandroid/feature/interests/InterestsScreenKt;->InterestsRoute(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;Lcom/google/samples/apps/nowinandroid/feature/interests/InterestsViewModel;Landroidx/compose/runtime/Composer;II)V -PLcom/google/samples/apps/nowinandroid/feature/interests/InterestsScreenKt;->InterestsScreen(Lcom/google/samples/apps/nowinandroid/feature/interests/InterestsUiState;Lcom/google/samples/apps/nowinandroid/feature/interests/InterestsTabState;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;II)V -PLcom/google/samples/apps/nowinandroid/feature/interests/InterestsTabState;->(ILjava/util/List;)V -PLcom/google/samples/apps/nowinandroid/feature/interests/InterestsTabState;->equals(Ljava/lang/Object;)Z -PLcom/google/samples/apps/nowinandroid/feature/interests/InterestsUiState$Interests;->(Ljava/util/List;Ljava/util/List;)V +PLcom/google/samples/apps/nowinandroid/feature/interests/InterestsScreenKt$InterestsRoute$2;->(Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;Lcom/google/samples/apps/nowinandroid/feature/interests/InterestsViewModel;II)V +PLcom/google/samples/apps/nowinandroid/feature/interests/InterestsScreenKt$InterestsRoute$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +PLcom/google/samples/apps/nowinandroid/feature/interests/InterestsScreenKt$InterestsScreen$2;->(Lcom/google/samples/apps/nowinandroid/feature/interests/InterestsUiState;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;II)V +PLcom/google/samples/apps/nowinandroid/feature/interests/InterestsScreenKt;->InterestsRoute(Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;Lcom/google/samples/apps/nowinandroid/feature/interests/InterestsViewModel;Landroidx/compose/runtime/Composer;II)V +PLcom/google/samples/apps/nowinandroid/feature/interests/InterestsScreenKt;->InterestsScreen(Lcom/google/samples/apps/nowinandroid/feature/interests/InterestsUiState;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;II)V +PLcom/google/samples/apps/nowinandroid/feature/interests/InterestsTabState;->(Ljava/util/List;)V +PLcom/google/samples/apps/nowinandroid/feature/interests/InterestsUiState$Interests;->(Ljava/util/List;)V PLcom/google/samples/apps/nowinandroid/feature/interests/InterestsUiState$Interests;->equals(Ljava/lang/Object;)Z PLcom/google/samples/apps/nowinandroid/feature/interests/InterestsUiState$Loading;->()V PLcom/google/samples/apps/nowinandroid/feature/interests/InterestsUiState$Loading;->()V -PLcom/google/samples/apps/nowinandroid/feature/interests/InterestsViewModel$uiState$2;->()V -PLcom/google/samples/apps/nowinandroid/feature/interests/InterestsViewModel$uiState$2;->()V -PLcom/google/samples/apps/nowinandroid/feature/interests/InterestsViewModel$uiState$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/feature/interests/InterestsViewModel;->(Lcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstUserDataRepository;Lcom/google/samples/apps/nowinandroid/core/domain/GetFollowableTopicsUseCase;Lcom/google/samples/apps/nowinandroid/core/domain/GetSortedFollowableAuthorsUseCase;)V -PLcom/google/samples/apps/nowinandroid/feature/interests/TabContentKt$AuthorsTabContent$1$1$1$1;->(Lkotlin/jvm/functions/Function1;Lcom/google/samples/apps/nowinandroid/core/domain/model/FollowableAuthor;)V -PLcom/google/samples/apps/nowinandroid/feature/interests/TabContentKt$AuthorsTabContent$1$1$1$1;->invoke()Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/feature/interests/TabContentKt$AuthorsTabContent$1$1$1$2;->(Lkotlin/jvm/functions/Function2;Lcom/google/samples/apps/nowinandroid/core/domain/model/FollowableAuthor;)V -PLcom/google/samples/apps/nowinandroid/feature/interests/TabContentKt$AuthorsTabContent$1$1$1;->(Lcom/google/samples/apps/nowinandroid/core/domain/model/FollowableAuthor;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;)V -PLcom/google/samples/apps/nowinandroid/feature/interests/TabContentKt$AuthorsTabContent$1;->(Ljava/util/List;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;)V -PLcom/google/samples/apps/nowinandroid/feature/interests/TabContentKt$AuthorsTabContent$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +PLcom/google/samples/apps/nowinandroid/feature/interests/InterestsViewModel$special$$inlined$map$1$2$1;->(Lcom/google/samples/apps/nowinandroid/feature/interests/InterestsViewModel$special$$inlined$map$1$2;Lkotlin/coroutines/Continuation;)V +PLcom/google/samples/apps/nowinandroid/feature/interests/InterestsViewModel$special$$inlined$map$1$2;->(Lkotlinx/coroutines/flow/FlowCollector;)V +PLcom/google/samples/apps/nowinandroid/feature/interests/InterestsViewModel$special$$inlined$map$1$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +PLcom/google/samples/apps/nowinandroid/feature/interests/InterestsViewModel$special$$inlined$map$1;->(Lkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$unsafeFlow$1;)V +PLcom/google/samples/apps/nowinandroid/feature/interests/InterestsViewModel$special$$inlined$map$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +PLcom/google/samples/apps/nowinandroid/feature/interests/InterestsViewModel;->(Lcom/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstUserDataRepository;Lcom/google/samples/apps/nowinandroid/core/domain/GetFollowableTopicsUseCase;)V PLcom/google/samples/apps/nowinandroid/feature/interests/TabContentKt$TopicsTabContent$1$1$1$1$1;->(Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V PLcom/google/samples/apps/nowinandroid/feature/interests/TabContentKt$TopicsTabContent$1$1$1$2$1;->(Ljava/lang/String;Lkotlin/jvm/functions/Function2;)V PLcom/google/samples/apps/nowinandroid/feature/interests/TabContentKt$TopicsTabContent$1$1$1;->(Lcom/google/samples/apps/nowinandroid/core/domain/model/FollowableTopic;Lkotlin/jvm/functions/Function1;Ljava/lang/String;ILkotlin/jvm/functions/Function2;)V PLcom/google/samples/apps/nowinandroid/feature/interests/TabContentKt$TopicsTabContent$1$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/nowinandroid/feature/interests/TabContentKt$TopicsTabContent$1;->(Ljava/util/List;Lkotlin/jvm/functions/Function1;ILkotlin/jvm/functions/Function2;)V PLcom/google/samples/apps/nowinandroid/feature/interests/TabContentKt$TopicsTabContent$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/feature/interests/TabContentKt;->AuthorsTabContent(Ljava/util/List;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;II)V PLcom/google/samples/apps/nowinandroid/feature/interests/TabContentKt;->TopicsTabContent(Ljava/util/List;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;II)V PLcom/google/samples/apps/nowinandroid/feature/interests/navigation/InterestsNavigationKt$interestsGraph$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLcom/google/samples/apps/nowinandroid/navigation/NiaNavHostKt$NiaNavHost$1$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +PLcom/google/samples/apps/nowinandroid/sync/R$string;->isAttached(Landroidx/compose/ui/node/PointerInputModifierNode;)Z PLcom/google/samples/apps/nowinandroid/ui/NiaAppKt$NiaApp$1$3$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/nowinandroid/ui/NiaAppKt$NiaApp$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/nowinandroid/ui/NiaAppKt$NiaBottomBar$1$1$1$1;->invoke()Ljava/lang/Object; @@ -14917,11 +13923,8 @@ PLkotlin/collections/ArraysKt___ArraysKt;->indexOf([Ljava/lang/Object;Ljava/lang PLkotlin/collections/CollectionsKt__CollectionsKt;->arrayListOf([Ljava/lang/Object;)Ljava/util/ArrayList; PLkotlin/collections/CollectionsKt__ReversedViewsKt;->removeAll(Ljava/util/List;Lkotlin/jvm/functions/Function1;)V PLkotlin/collections/CollectionsKt___CollectionsKt;->firstOrNull(Ljava/util/List;)Ljava/lang/Object; -PLkotlin/collections/CollectionsKt___CollectionsKt;->joinTo(Ljava/lang/Iterable;Ljava/lang/StringBuilder;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/CharSequence;ILjava/lang/CharSequence;Lkotlin/jvm/functions/Function1;)V -PLkotlin/collections/CollectionsKt___CollectionsKt;->joinToString$default(Ljava/lang/Iterable;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;I)Ljava/lang/String; -PLkotlin/internal/ProgressionUtilKt;->navOptions(Lkotlin/jvm/functions/Function1;)Landroidx/navigation/NavOptions; -PLkotlin/jvm/internal/AdaptedFunctionReference;->(ILjava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;)V -PLkotlin/jvm/internal/AdaptedFunctionReference;->(Ljava/lang/Class;Ljava/lang/String;)V +PLkotlin/collections/EmptyMap;->equals(Ljava/lang/Object;)Z +PLkotlin/collections/EmptySet;->isEmpty()Z PLkotlin/jvm/internal/Ref$LongRef;->()V PLkotlin/math/MathKt__MathJVMKt;->roundToInt(D)I PLkotlin/sequences/TakeWhileSequence$iterator$1;->(Lkotlin/sequences/TakeWhileSequence;)V @@ -14929,15 +13932,28 @@ PLkotlin/sequences/TakeWhileSequence$iterator$1;->calcNext()V PLkotlin/sequences/TakeWhileSequence$iterator$1;->hasNext()Z PLkotlin/sequences/TakeWhileSequence$iterator$1;->next()Ljava/lang/Object; PLkotlin/sequences/TakeWhileSequence;->(Lkotlin/sequences/Sequence;Lkotlin/jvm/functions/Function1;)V -PLkotlin/text/StringsKt__AppendableKt;->appendElement(Ljava/lang/StringBuilder;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)V +PLkotlin/text/StringsKt__StringNumberConversionsKt;->toLongOrNull(Ljava/lang/String;)Ljava/lang/Long; +PLkotlin/text/StringsKt__StringsKt;->substringBefore$default(Ljava/lang/String;C)Ljava/lang/String; PLkotlinx/coroutines/CancellableContinuationImpl;->resumeUndispatched(Lkotlinx/coroutines/CoroutineDispatcher;Lkotlin/Unit;)V PLkotlinx/coroutines/DefaultExecutor;->acknowledgeShutdownIfNeeded()V PLkotlinx/coroutines/EventLoopImplBase;->isEmpty()Z +PLkotlinx/coroutines/InterruptibleKt$runInterruptible$2;->(Lkotlin/jvm/functions/Function0;Lkotlin/coroutines/Continuation;)V +PLkotlinx/coroutines/InterruptibleKt$runInterruptible$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +PLkotlinx/coroutines/InterruptibleKt$runInterruptible$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +PLkotlinx/coroutines/InterruptibleKt$runInterruptible$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +PLkotlinx/coroutines/InvokeOnCancelling;->()V +PLkotlinx/coroutines/InvokeOnCancelling;->(Lkotlin/jvm/functions/Function1;)V +PLkotlinx/coroutines/InvokeOnCancelling;->invoke(Ljava/lang/Throwable;)V PLkotlinx/coroutines/InvokeOnCompletion;->invoke(Ljava/lang/Throwable;)V PLkotlinx/coroutines/JobSupport$AwaitContinuation;->getContinuationCancellationCause(Lkotlinx/coroutines/JobSupport;)Ljava/lang/Throwable; PLkotlinx/coroutines/JobSupport;->isCancelled()Z +PLkotlinx/coroutines/RemoveOnCancel;->(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;)V PLkotlinx/coroutines/SupervisorJobImpl;->childCancelled(Ljava/lang/Throwable;)Z +PLkotlinx/coroutines/ThreadState;->()V +PLkotlinx/coroutines/ThreadState;->(Lkotlinx/coroutines/Job;)V PLkotlinx/coroutines/ThreadState;->clearInterrupt()V +PLkotlinx/coroutines/ThreadState;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +PLkotlinx/coroutines/ThreadState;->setup()V PLkotlinx/coroutines/UndispatchedCoroutine;->afterResume(Ljava/lang/Object;)V PLkotlinx/coroutines/android/HandlerContext$scheduleResumeAfterDelay$$inlined$Runnable$1;->run()V PLkotlinx/coroutines/channels/AbstractChannel$ReceiveElement;->resumeReceiveClosed(Lkotlinx/coroutines/channels/Closed;)V @@ -14960,22 +13976,12 @@ PLkotlinx/coroutines/flow/FlowKt__EmittersKt$onStart$$inlined$unsafeFlow$1$1;->< PLkotlinx/coroutines/flow/FlowKt__EmittersKt$onStart$$inlined$unsafeFlow$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__EmittersKt$onStart$$inlined$unsafeFlow$1;->(Lkotlin/jvm/functions/Function2;Lkotlinx/coroutines/flow/Flow;)V PLkotlinx/coroutines/flow/FlowKt__EmittersKt$onStart$$inlined$unsafeFlow$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -PLkotlinx/coroutines/flow/FlowKt__ErrorsKt$catch$$inlined$unsafeFlow$1$1;->(Lkotlinx/coroutines/flow/FlowKt__ErrorsKt$catch$$inlined$unsafeFlow$1;Lkotlin/coroutines/Continuation;)V -PLkotlinx/coroutines/flow/FlowKt__ErrorsKt$catch$$inlined$unsafeFlow$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; -PLkotlinx/coroutines/flow/FlowKt__ErrorsKt$catch$$inlined$unsafeFlow$1;->(Lkotlinx/coroutines/flow/FlowKt__EmittersKt$onStart$$inlined$unsafeFlow$1;Lcom/google/samples/apps/nowinandroid/core/result/ResultKt$asResult$3;)V -PLkotlinx/coroutines/flow/FlowKt__ErrorsKt$catch$$inlined$unsafeFlow$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -PLkotlinx/coroutines/flow/FlowKt__ErrorsKt$catchImpl$1;->(Lkotlin/coroutines/Continuation;)V -PLkotlinx/coroutines/flow/FlowKt__ErrorsKt$catchImpl$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; -PLkotlinx/coroutines/flow/FlowKt__ErrorsKt$catchImpl$2$emit$1;->(Lkotlinx/coroutines/flow/FlowKt__ErrorsKt$catchImpl$2;Lkotlin/coroutines/Continuation;)V -PLkotlinx/coroutines/flow/FlowKt__ErrorsKt$catchImpl$2;->(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/jvm/internal/Ref$ObjectRef;)V -PLkotlinx/coroutines/flow/FlowKt__ErrorsKt$catchImpl$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__ReduceKt$first$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/SharedFlowImpl;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/internal/FlowCoroutine;->childCancelled(Ljava/lang/Throwable;)Z PLkotlinx/coroutines/internal/DispatchedContinuation;->cancelCompletedResult$kotlinx_coroutines_core(Ljava/lang/Object;Ljava/util/concurrent/CancellationException;)V PLkotlinx/coroutines/internal/InlineList;->plus-FjFbRPM(Ljava/lang/Object;Lkotlinx/coroutines/internal/LockFreeLinkedListNode;)Ljava/lang/Object; PLkotlinx/coroutines/internal/ScopeCoroutine;->afterCompletion(Ljava/lang/Object;)V -PLkotlinx/coroutines/scheduling/CoroutineScheduler;->parkedWorkersStackTopUpdate(Lkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;II)V PLkotlinx/coroutines/sync/MutexImpl$LockCont$tryResumeLockWaiter$1;->(Lkotlinx/coroutines/sync/MutexImpl;Lkotlinx/coroutines/sync/MutexImpl$LockCont;)V PLkotlinx/coroutines/sync/MutexImpl$LockCont;->(Lkotlinx/coroutines/sync/MutexImpl;Ljava/lang/Object;Lkotlinx/coroutines/CancellableContinuationImpl;)V PLkotlinx/coroutines/sync/MutexImpl$LockCont;->completeResumeLockWaiter()V @@ -14983,45 +13989,262 @@ PLkotlinx/coroutines/sync/MutexImpl$LockCont;->tryResumeLockWaiter()Z PLkotlinx/coroutines/sync/MutexImpl$LockWaiter;->()V PLkotlinx/coroutines/sync/MutexImpl$LockWaiter;->(Ljava/lang/Object;)V PLkotlinx/coroutines/sync/MutexImpl$LockedQueue;->(Ljava/lang/Object;)V +PLkotlinx/coroutines/sync/MutexImpl$UnlockOp;->(Lkotlinx/coroutines/sync/MutexImpl$LockedQueue;)V +PLkotlinx/coroutines/sync/MutexImpl$UnlockOp;->complete(Ljava/lang/Object;Ljava/lang/Object;)V +PLkotlinx/coroutines/sync/MutexImpl$UnlockOp;->prepare(Ljava/lang/Object;)Lkotlinx/coroutines/internal/Symbol; +PLkotlinx/coroutines/sync/SemaphoreImpl;->acquire(Lcoil/decode/BitmapFactoryDecoder$decode$1;)Ljava/lang/Object; PLkotlinx/coroutines/sync/SemaphoreImpl;->release()V -PLkotlinx/serialization/SerializersKt;->access$DistanceAndInLayer(FZ)J +PLokhttp3/Address;->equalsNonHost$okhttp(Lokhttp3/Address;)Z +PLokhttp3/CacheControl$Companion;->indexOfElement(ILjava/lang/String;Ljava/lang/String;)I +PLokhttp3/CertificatePinner;->equals(Ljava/lang/Object;)Z +PLokhttp3/ConnectionSpec;->equals(Ljava/lang/Object;)Z +PLokhttp3/Dispatcher;->finished$okhttp(Lokhttp3/internal/connection/RealCall$AsyncCall;)V +PLokhttp3/Handshake$Companion$handshake$1;->(Ljava/util/List;)V +PLokhttp3/Handshake$Companion;->get(Ljavax/net/ssl/SSLSession;)Lokhttp3/Handshake; +PLokhttp3/Handshake$peerCertificates$2;->(Lkotlin/jvm/functions/Function0;)V +PLokhttp3/Handshake;->(Lokhttp3/TlsVersion;Lokhttp3/CipherSuite;Ljava/util/List;Lkotlin/jvm/functions/Function0;)V PLokhttp3/Headers$Builder;->add(Ljava/lang/String;Ljava/lang/String;)V PLokhttp3/Headers;->getDate(Ljava/lang/String;)Ljava/util/Date; +PLokhttp3/HttpUrl;->encodedPath()Ljava/lang/String; +PLokhttp3/MediaType$Companion;->get(Ljava/lang/String;)Lokhttp3/MediaType; +PLokhttp3/MediaType;->()V +PLokhttp3/MediaType;->(Ljava/lang/String;)V +PLokhttp3/Protocol$Companion;->get(Ljava/lang/String;)Lokhttp3/Protocol; +PLokhttp3/Response$Builder;->()V +PLokhttp3/Response$Builder;->(Lokhttp3/Response;)V +PLokhttp3/Response$Builder;->build()Lokhttp3/Response; +PLokhttp3/Response$Builder;->checkSupportResponse(Ljava/lang/String;Lokhttp3/Response;)V +PLokhttp3/Response;->(Lokhttp3/Request;Lokhttp3/Protocol;Ljava/lang/String;ILokhttp3/Handshake;Lokhttp3/Headers;Lokhttp3/ResponseBody;Lokhttp3/Response;Lokhttp3/Response;Lokhttp3/Response;JJLokhttp3/internal/connection/Exchange;)V +PLokhttp3/Response;->cacheControl()Lokhttp3/CacheControl; +PLokhttp3/Response;->close()V +PLokhttp3/Response;->header$default(Lokhttp3/Response;Ljava/lang/String;)Ljava/lang/String; +PLokhttp3/ResponseBody;->close()V +PLokhttp3/internal/Util;->closeQuietly(Ljava/io/Closeable;)V +PLokhttp3/internal/Util;->closeQuietly(Ljava/net/Socket;)V +PLokhttp3/internal/Util;->format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String; +PLokhttp3/internal/Util;->headersContentLength(Lokhttp3/Response;)J +PLokhttp3/internal/Util;->readMedium(Lokio/BufferedSource;)I +PLokhttp3/internal/Util;->toHeaders(Ljava/util/List;)Lokhttp3/Headers; +PLokhttp3/internal/Util;->toNonNegativeInt(ILjava/lang/String;)I PLokhttp3/internal/Util;->withSuppressed(Ljava/io/IOException;Ljava/util/List;)V +PLokhttp3/internal/cache/CacheInterceptor$Companion;->access$stripBody(Lokhttp3/Response;)Lokhttp3/Response; +PLokhttp3/internal/concurrent/TaskQueue$execute$1;->(Ljava/lang/String;Lokhttp3/internal/http2/Http2Connection$ReaderRunnable;)V +PLokhttp3/internal/concurrent/TaskQueue$execute$1;->runOnce()J +PLokhttp3/internal/concurrent/TaskQueue;->cancelAllAndDecide$okhttp()Z +PLokhttp3/internal/concurrent/TaskQueue;->schedule(Lokhttp3/internal/concurrent/Task;J)V +PLokhttp3/internal/concurrent/TaskQueue;->scheduleAndDecide$okhttp(Lokhttp3/internal/concurrent/Task;JZ)Z +PLokhttp3/internal/concurrent/TaskQueue;->shutdown()V +PLokhttp3/internal/concurrent/TaskRunner$RealBackend;->coordinatorNotify(Lokhttp3/internal/concurrent/TaskRunner;)V +PLokhttp3/internal/concurrent/TaskRunner$RealBackend;->coordinatorWait(Lokhttp3/internal/concurrent/TaskRunner;J)V +PLokhttp3/internal/concurrent/TaskRunner$RealBackend;->execute(Ljava/lang/Runnable;)V +PLokhttp3/internal/concurrent/TaskRunner$RealBackend;->nanoTime()J +PLokhttp3/internal/concurrent/TaskRunner$runnable$1;->run()V +PLokhttp3/internal/concurrent/TaskRunner;->access$runTask(Lokhttp3/internal/concurrent/TaskRunner;Lokhttp3/internal/concurrent/Task;)V +PLokhttp3/internal/concurrent/TaskRunner;->afterRun(Lokhttp3/internal/concurrent/Task;J)V +PLokhttp3/internal/concurrent/TaskRunner;->awaitTaskToRun()Lokhttp3/internal/concurrent/Task; +PLokhttp3/internal/concurrent/TaskRunner;->kickCoordinator$okhttp(Lokhttp3/internal/concurrent/TaskQueue;)V +PLokhttp3/internal/connection/Exchange$ResponseBodySource;->(Lokhttp3/internal/connection/Exchange;Lokio/Source;J)V +PLokhttp3/internal/connection/Exchange$ResponseBodySource;->close()V +PLokhttp3/internal/connection/Exchange$ResponseBodySource;->complete(Ljava/io/IOException;)Ljava/io/IOException; +PLokhttp3/internal/connection/Exchange$ResponseBodySource;->read(Lokio/Buffer;J)J +PLokhttp3/internal/connection/Exchange;->(Lokhttp3/internal/connection/RealCall;Lokhttp3/EventListener;Lokhttp3/internal/connection/ExchangeFinder;Lokhttp3/internal/http/ExchangeCodec;)V +PLokhttp3/internal/connection/Exchange;->bodyComplete(ZZLjava/io/IOException;)Ljava/io/IOException; +PLokhttp3/internal/connection/Exchange;->readResponseHeaders(Z)Lokhttp3/Response$Builder; PLokhttp3/internal/connection/Exchange;->trackFailure(Ljava/io/IOException;)V +PLokhttp3/internal/connection/ExchangeFinder;->sameHostAndPort(Lokhttp3/HttpUrl;)Z PLokhttp3/internal/connection/ExchangeFinder;->trackFailure(Ljava/io/IOException;)V +PLokhttp3/internal/connection/RealCall$CallReference;->(Lokhttp3/internal/connection/RealCall;Ljava/lang/Object;)V +PLokhttp3/internal/connection/RealCall;->acquireConnectionNoEvents(Lokhttp3/internal/connection/RealConnection;)V +PLokhttp3/internal/connection/RealCall;->callDone(Ljava/io/IOException;)Ljava/io/IOException; PLokhttp3/internal/connection/RealCall;->cancel()V -PLokhttp3/internal/connection/RouteException;->(Ljava/io/IOException;)V +PLokhttp3/internal/connection/RealCall;->exitNetworkInterceptorExchange$okhttp(Z)V +PLokhttp3/internal/connection/RealCall;->messageDone$okhttp(Lokhttp3/internal/connection/Exchange;ZZLjava/io/IOException;)Ljava/io/IOException; +PLokhttp3/internal/connection/RealCall;->noMoreExchanges$okhttp(Ljava/io/IOException;)Ljava/io/IOException; +PLokhttp3/internal/connection/RealCall;->releaseConnectionNoEvents$okhttp()Ljava/net/Socket; +PLokhttp3/internal/connection/RealConnection$connectTls$1;->(Lokhttp3/CertificatePinner;Lokhttp3/Handshake;Lokhttp3/Address;)V +PLokhttp3/internal/connection/RealConnection;->isEligible$okhttp(Lokhttp3/Address;Ljava/util/List;)Z +PLokhttp3/internal/connection/RealConnection;->isHealthy(Z)Z +PLokhttp3/internal/connection/RealConnection;->newCodec$okhttp(Lokhttp3/OkHttpClient;Lokhttp3/internal/http/RealInterceptorChain;)Lokhttp3/internal/http/ExchangeCodec; +PLokhttp3/internal/connection/RealConnection;->onSettings(Lokhttp3/internal/http2/Http2Connection;Lokhttp3/internal/http2/Settings;)V +PLokhttp3/internal/connection/RealConnection;->startHttp2()V +PLokhttp3/internal/connection/RealConnectionPool$cleanupTask$1;->runOnce()J +PLokhttp3/internal/connection/RealConnectionPool;->pruneAndGetAllocationCount(Lokhttp3/internal/connection/RealConnection;J)I +PLokhttp3/internal/http/CallServerInterceptor;->intercept(Lokhttp3/internal/http/RealInterceptorChain;)Lokhttp3/Response; PLokhttp3/internal/http/DatesKt$STANDARD_DATE_FORMAT$1;->()V PLokhttp3/internal/http/DatesKt$STANDARD_DATE_FORMAT$1;->initialValue()Ljava/lang/Object; PLokhttp3/internal/http/DatesKt;->()V PLokhttp3/internal/http/DatesKt;->toHttpDateOrNull(Ljava/lang/String;)Ljava/util/Date; -PLokhttp3/internal/http/RealResponseBody;->contentLength()J -PLokhttp3/internal/http/RealResponseBody;->contentType()Lokhttp3/MediaType; +PLokhttp3/internal/http/HttpHeaders;->()V +PLokhttp3/internal/http/HttpHeaders;->promisesBody(Lokhttp3/Response;)Z +PLokhttp3/internal/http/HttpHeaders;->receiveHeaders(Lokhttp3/CookieJar;Lokhttp3/HttpUrl;Lokhttp3/Headers;)V +PLokhttp3/internal/http/HttpMethod;->permitsRequestBody(Ljava/lang/String;)Z +PLokhttp3/internal/http/RealResponseBody;->(Ljava/lang/String;JLokio/RealBufferedSource;)V +PLokhttp3/internal/http/RealResponseBody;->source()Lokio/BufferedSource; +PLokhttp3/internal/http/RetryAndFollowUpInterceptor;->followUpRequest(Lokhttp3/Response;Lokhttp3/internal/connection/Exchange;)Lokhttp3/Request; PLokhttp3/internal/http/RetryAndFollowUpInterceptor;->recover(Ljava/io/IOException;Lokhttp3/internal/connection/RealCall;Lokhttp3/Request;Z)Z +PLokhttp3/internal/http/StatusLine$Companion;->parse(Ljava/lang/String;)Lokhttp3/internal/http/StatusLine; +PLokhttp3/internal/http/StatusLine;->(Lokhttp3/Protocol;ILjava/lang/String;)V +PLokhttp3/internal/http2/ErrorCode;->()V +PLokhttp3/internal/http2/ErrorCode;->(IILjava/lang/String;)V +PLokhttp3/internal/http2/Header;->()V +PLokhttp3/internal/http2/Header;->(Ljava/lang/String;Ljava/lang/String;)V +PLokhttp3/internal/http2/Header;->(Lokio/ByteString;Ljava/lang/String;)V +PLokhttp3/internal/http2/Header;->(Lokio/ByteString;Lokio/ByteString;)V +PLokhttp3/internal/http2/Hpack$Reader;->(Lokhttp3/internal/http2/Http2Reader$ContinuationSource;)V +PLokhttp3/internal/http2/Hpack$Reader;->evictToRecoverBytes(I)I +PLokhttp3/internal/http2/Hpack$Reader;->getName(I)Lokio/ByteString; +PLokhttp3/internal/http2/Hpack$Reader;->insertIntoDynamicTable(Lokhttp3/internal/http2/Header;)V +PLokhttp3/internal/http2/Hpack$Reader;->readInt(II)I +PLokhttp3/internal/http2/Hpack$Writer;->(Lokio/Buffer;)V +PLokhttp3/internal/http2/Hpack$Writer;->evictToRecoverBytes(I)V +PLokhttp3/internal/http2/Hpack$Writer;->insertIntoDynamicTable(Lokhttp3/internal/http2/Header;)V +PLokhttp3/internal/http2/Hpack$Writer;->writeByteString(Lokio/ByteString;)V +PLokhttp3/internal/http2/Hpack$Writer;->writeHeaders(Ljava/util/ArrayList;)V +PLokhttp3/internal/http2/Hpack$Writer;->writeInt(III)V +PLokhttp3/internal/http2/Hpack;->()V +PLokhttp3/internal/http2/Hpack;->checkLowercase(Lokio/ByteString;)V +PLokhttp3/internal/http2/Http2;->()V +PLokhttp3/internal/http2/Http2;->()V +PLokhttp3/internal/http2/Http2Connection$Builder;->(Lokhttp3/internal/concurrent/TaskRunner;)V +PLokhttp3/internal/http2/Http2Connection$ReaderRunnable$applyAndAckSettings$lambda-7$lambda-6$$inlined$execute$default$1;->(Ljava/lang/String;Lokhttp3/internal/http2/Http2Connection;Lkotlin/jvm/internal/Ref$ObjectRef;)V +PLokhttp3/internal/http2/Http2Connection$ReaderRunnable$applyAndAckSettings$lambda-7$lambda-6$$inlined$execute$default$1;->runOnce()J PLokhttp3/internal/http2/Http2Connection$ReaderRunnable$ping$$inlined$execute$default$1;->(Ljava/lang/String;Lokhttp3/internal/http2/Http2Connection;II)V PLokhttp3/internal/http2/Http2Connection$ReaderRunnable$ping$$inlined$execute$default$1;->runOnce()J +PLokhttp3/internal/http2/Http2Connection$ReaderRunnable$settings$$inlined$execute$default$1;->(Ljava/lang/String;Lokhttp3/internal/http2/Http2Connection$ReaderRunnable;Lokhttp3/internal/http2/Settings;)V +PLokhttp3/internal/http2/Http2Connection$ReaderRunnable$settings$$inlined$execute$default$1;->runOnce()J +PLokhttp3/internal/http2/Http2Connection$ReaderRunnable;->(Lokhttp3/internal/http2/Http2Connection;Lokhttp3/internal/http2/Http2Reader;)V +PLokhttp3/internal/http2/Http2Connection$ReaderRunnable;->ackSettings()V +PLokhttp3/internal/http2/Http2Connection$ReaderRunnable;->headers(ILjava/util/List;Z)V +PLokhttp3/internal/http2/Http2Connection$ReaderRunnable;->invoke()Ljava/lang/Object; PLokhttp3/internal/http2/Http2Connection$ReaderRunnable;->ping(IIZ)V +PLokhttp3/internal/http2/Http2Connection$ReaderRunnable;->settings(Lokhttp3/internal/http2/Settings;)V +PLokhttp3/internal/http2/Http2Connection$ReaderRunnable;->windowUpdate(JI)V PLokhttp3/internal/http2/Http2Connection$writeSynResetLater$$inlined$execute$default$1;->(Ljava/lang/String;Lokhttp3/internal/http2/Http2Connection;ILokhttp3/internal/http2/ErrorCode;)V PLokhttp3/internal/http2/Http2Connection$writeSynResetLater$$inlined$execute$default$1;->runOnce()J +PLokhttp3/internal/http2/Http2Connection;->()V +PLokhttp3/internal/http2/Http2Connection;->(Lokhttp3/internal/http2/Http2Connection$Builder;)V +PLokhttp3/internal/http2/Http2Connection;->close$okhttp(Lokhttp3/internal/http2/ErrorCode;Lokhttp3/internal/http2/ErrorCode;Ljava/io/IOException;)V +PLokhttp3/internal/http2/Http2Connection;->flush()V +PLokhttp3/internal/http2/Http2Connection;->getStream(I)Lokhttp3/internal/http2/Http2Stream; +PLokhttp3/internal/http2/Http2Connection;->removeStream$okhttp(I)Lokhttp3/internal/http2/Http2Stream; +PLokhttp3/internal/http2/Http2Connection;->shutdown(Lokhttp3/internal/http2/ErrorCode;)V +PLokhttp3/internal/http2/Http2Connection;->updateConnectionFlowControl$okhttp(J)V PLokhttp3/internal/http2/Http2Connection;->writeSynResetLater$okhttp(ILokhttp3/internal/http2/ErrorCode;)V +PLokhttp3/internal/http2/Http2ExchangeCodec;->()V +PLokhttp3/internal/http2/Http2ExchangeCodec;->(Lokhttp3/OkHttpClient;Lokhttp3/internal/connection/RealConnection;Lokhttp3/internal/http/RealInterceptorChain;Lokhttp3/internal/http2/Http2Connection;)V PLokhttp3/internal/http2/Http2ExchangeCodec;->cancel()V -PLokhttp3/internal/http2/Http2Stream;->close(Lokhttp3/internal/http2/ErrorCode;Ljava/io/IOException;)V +PLokhttp3/internal/http2/Http2ExchangeCodec;->finishRequest()V +PLokhttp3/internal/http2/Http2ExchangeCodec;->getConnection()Lokhttp3/internal/connection/RealConnection; +PLokhttp3/internal/http2/Http2ExchangeCodec;->openResponseBodySource(Lokhttp3/Response;)Lokio/Source; +PLokhttp3/internal/http2/Http2ExchangeCodec;->readResponseHeaders(Z)Lokhttp3/Response$Builder; +PLokhttp3/internal/http2/Http2ExchangeCodec;->reportedContentLength(Lokhttp3/Response;)J +PLokhttp3/internal/http2/Http2Reader$Companion;->lengthWithoutPadding(III)I +PLokhttp3/internal/http2/Http2Reader$ContinuationSource;->(Lokio/BufferedSource;)V +PLokhttp3/internal/http2/Http2Reader$ContinuationSource;->read(Lokio/Buffer;J)J +PLokhttp3/internal/http2/Http2Reader;->()V +PLokhttp3/internal/http2/Http2Reader;->(Lokio/BufferedSource;Z)V +PLokhttp3/internal/http2/Http2Reader;->close()V +PLokhttp3/internal/http2/Http2Reader;->nextFrame(ZLokhttp3/internal/http2/Http2Reader$Handler;)Z +PLokhttp3/internal/http2/Http2Reader;->readConnectionPreface(Lokhttp3/internal/http2/Http2Reader$Handler;)V +PLokhttp3/internal/http2/Http2Reader;->readHeaderBlock(IIII)Ljava/util/List; +PLokhttp3/internal/http2/Http2Stream$FramingSink;->(Lokhttp3/internal/http2/Http2Stream;Z)V +PLokhttp3/internal/http2/Http2Stream$FramingSink;->close()V +PLokhttp3/internal/http2/Http2Stream$FramingSource;->(Lokhttp3/internal/http2/Http2Stream;JZ)V +PLokhttp3/internal/http2/Http2Stream$FramingSource;->close()V +PLokhttp3/internal/http2/Http2Stream$FramingSource;->read(Lokio/Buffer;J)J +PLokhttp3/internal/http2/Http2Stream$FramingSource;->updateConnectionFlowControl(J)V +PLokhttp3/internal/http2/Http2Stream$StreamTimeout;->(Lokhttp3/internal/http2/Http2Stream;)V +PLokhttp3/internal/http2/Http2Stream$StreamTimeout;->exitAndThrowIfTimedOut()V +PLokhttp3/internal/http2/Http2Stream;->(ILokhttp3/internal/http2/Http2Connection;ZZLokhttp3/Headers;)V +PLokhttp3/internal/http2/Http2Stream;->cancelStreamIfNecessary$okhttp()V PLokhttp3/internal/http2/Http2Stream;->closeInternal(Lokhttp3/internal/http2/ErrorCode;Ljava/io/IOException;)Z PLokhttp3/internal/http2/Http2Stream;->closeLater(Lokhttp3/internal/http2/ErrorCode;)V +PLokhttp3/internal/http2/Http2Stream;->getSink()Lokhttp3/internal/http2/Http2Stream$FramingSink; +PLokhttp3/internal/http2/Http2Stream;->isLocallyInitiated()Z +PLokhttp3/internal/http2/Http2Stream;->isOpen()Z +PLokhttp3/internal/http2/Http2Stream;->receiveHeaders(Lokhttp3/Headers;Z)V +PLokhttp3/internal/http2/Http2Stream;->waitForIo$okhttp()V +PLokhttp3/internal/http2/Http2Writer;->()V +PLokhttp3/internal/http2/Http2Writer;->(Lokio/BufferedSink;Z)V +PLokhttp3/internal/http2/Http2Writer;->applyAndAckSettings(Lokhttp3/internal/http2/Settings;)V +PLokhttp3/internal/http2/Http2Writer;->close()V +PLokhttp3/internal/http2/Http2Writer;->frameHeader(IIII)V +PLokhttp3/internal/http2/Http2Writer;->goAway(ILokhttp3/internal/http2/ErrorCode;[B)V PLokhttp3/internal/http2/Http2Writer;->ping(IIZ)V PLokhttp3/internal/http2/Http2Writer;->rstStream(ILokhttp3/internal/http2/ErrorCode;)V +PLokhttp3/internal/http2/Http2Writer;->windowUpdate(JI)V +PLokhttp3/internal/http2/Huffman$Node;->()V +PLokhttp3/internal/http2/Huffman$Node;->(II)V +PLokhttp3/internal/http2/Huffman;->()V +PLokhttp3/internal/http2/Huffman;->addCode(III)V +PLokhttp3/internal/http2/PushObserver$Companion$PushObserverCancel;->()V +PLokhttp3/internal/http2/PushObserver;->()V +PLokhttp3/internal/http2/Settings;->()V +PLokhttp3/internal/http2/Settings;->getInitialWindowSize()I +PLokhttp3/internal/http2/Settings;->merge(Lokhttp3/internal/http2/Settings;)V +PLokhttp3/internal/http2/Settings;->set(II)V PLokhttp3/internal/http2/StreamResetException;->(Lokhttp3/internal/http2/ErrorCode;)V -PLokhttp3/internal/platform/Android10Platform;->isCleartextTrafficPermitted(Ljava/lang/String;)Z -PLokio/GzipSource;->(Lokio/Source;)V -PLokio/GzipSource;->checkEqual(IILjava/lang/String;)V -PLokio/GzipSource;->close()V -PLokio/GzipSource;->read(Lokio/Buffer;J)J -PLokio/GzipSource;->updateCrc(JJLokio/Buffer;)V -PLokio/InflaterSource;->(Lokio/RealBufferedSource;Ljava/util/zip/Inflater;)V -PLokio/InflaterSource;->close()V -PLokio/InflaterSource;->read(Lokio/Buffer;J)J +PLokhttp3/internal/platform/Android10Platform;->getSelectedProtocol(Ljavax/net/ssl/SSLSocket;)Ljava/lang/String; +PLokhttp3/internal/platform/Jdk9Platform$$ExternalSyntheticApiModelOutline1;->m(Ljavax/net/ssl/SSLSocket;)Ljava/lang/String; +PLokhttp3/internal/platform/Platform;->afterHandshake(Ljavax/net/ssl/SSLSocket;)V +PLokhttp3/internal/platform/android/Android10SocketAdapter;->getSelectedProtocol(Ljavax/net/ssl/SSLSocket;)Ljava/lang/String; +PLokhttp3/internal/platform/android/AndroidCertificateChainCleaner;->equals(Ljava/lang/Object;)Z +PLokhttp3/internal/tls/OkHostnameVerifier;->getSubjectAltNames(Ljava/security/cert/X509Certificate;I)Ljava/util/List; +PLokhttp3/internal/tls/OkHostnameVerifier;->isAscii(Ljava/lang/String;)Z +PLokhttp3/internal/tls/OkHostnameVerifier;->verify(Ljava/lang/String;Ljava/security/cert/X509Certificate;)Z +PLokhttp3/internal/tls/OkHostnameVerifier;->verify(Ljava/lang/String;Ljavax/net/ssl/SSLSession;)Z +PLokio/AsyncTimeout$Companion;->awaitTimeout$okio()Lokio/AsyncTimeout; +PLokio/AsyncTimeout$Watchdog;->()V +PLokio/AsyncTimeout$Watchdog;->run()V +PLokio/AsyncTimeout$sink$1;->close()V +PLokio/AsyncTimeout$sink$1;->flush()V +PLokio/AsyncTimeout$sink$1;->write(Lokio/Buffer;J)V +PLokio/AsyncTimeout$source$1;->close()V +PLokio/AsyncTimeout$source$1;->read(Lokio/Buffer;J)J +PLokio/AsyncTimeout;->exit()Z +PLokio/Buffer;->copyTo(JJLokio/Buffer;)V +PLokio/Buffer;->readShort()S +PLokio/Buffer;->readUtf8(J)Ljava/lang/String; +PLokio/Buffer;->skip(J)V +PLokio/Buffer;->writeShort(I)V +PLokio/ByteString;->hashCode()I +PLokio/ByteString;->toAsciiLowercase()Lokio/ByteString; +PLokio/FileSystem;->metadata(Lokio/Path;)Lokio/FileMetadata; +PLokio/ForwardingSink;->flush()V +PLokio/ForwardingSink;->write(Lokio/Buffer;J)V +PLokio/ForwardingSource;->(Lokio/Source;)V +PLokio/ForwardingSource;->close()V +PLokio/ForwardingSource;->read(Lokio/Buffer;J)J +PLokio/InputStreamSource;->close()V +PLokio/JvmSystemFileSystem;->source(Lokio/Path;)Lokio/Source; +PLokio/OutputStreamSink;->flush()V +PLokio/PeekSource;->(Lokio/BufferedSource;)V +PLokio/PeekSource;->read(Lokio/Buffer;J)J +PLokio/RealBufferedSink;->flush()V +PLokio/RealBufferedSink;->write(Lokio/Buffer;J)V +PLokio/RealBufferedSink;->write(Lokio/ByteString;)Lokio/BufferedSink; +PLokio/RealBufferedSink;->writeInt(I)Lokio/BufferedSink; +PLokio/RealBufferedSink;->writeShort(I)Lokio/BufferedSink; +PLokio/RealBufferedSource$inputStream$1;->(Lokio/RealBufferedSource;)V PLokio/RealBufferedSource$inputStream$1;->available()I PLokio/RealBufferedSource$inputStream$1;->close()V +PLokio/RealBufferedSource$inputStream$1;->read([BII)I +PLokio/RealBufferedSource;->close()V +PLokio/RealBufferedSource;->exhausted()Z +PLokio/RealBufferedSource;->getBuffer()Lokio/Buffer; +PLokio/RealBufferedSource;->indexOf(BJJ)J PLokio/RealBufferedSource;->inputStream()Ljava/io/InputStream; -PLokio/_JvmPlatformKt;->()V +PLokio/RealBufferedSource;->rangeEquals(JLokio/ByteString;)Z +PLokio/RealBufferedSource;->read(Lokio/Buffer;J)J +PLokio/RealBufferedSource;->readAll(Lokio/RealBufferedSink;)J +PLokio/RealBufferedSource;->readByte()B +PLokio/RealBufferedSource;->readByteString(J)Lokio/ByteString; +PLokio/RealBufferedSource;->readInt()I +PLokio/RealBufferedSource;->readShort()S +PLokio/RealBufferedSource;->readUtf8LineStrict()Ljava/lang/String; +PLokio/RealBufferedSource;->readUtf8LineStrict(J)Ljava/lang/String; +PLokio/RealBufferedSource;->require(J)V +PLokio/RealBufferedSource;->skip(J)V +PLokio/Segment;->sharedCopy()Lokio/Segment; +PLokio/Timeout$Companion$NONE$1;->throwIfReached()V +PLokio/internal/_BufferKt;->readUtf8Line(Lokio/Buffer;J)Ljava/lang/String; From 4bc29d9cdcec4a1d1fc17c6b5d76bff27b9add2f Mon Sep 17 00:00:00 2001 From: mlykotom Date: Tue, 6 Dec 2022 11:51:26 +0100 Subject: [PATCH 09/37] Fix scrolling benchmark Change-Id: Ifb43ab0ffe6e38b00d5aad63415fc8439534c112 --- .../apps/nowinandroid/foryou/ScrollForYouFeedBenchmark.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ScrollForYouFeedBenchmark.kt b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ScrollForYouFeedBenchmark.kt index b9ab11c4b..b4e8352dc 100644 --- a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ScrollForYouFeedBenchmark.kt +++ b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ScrollForYouFeedBenchmark.kt @@ -50,6 +50,7 @@ class ScrollForYouFeedBenchmark { } ) { forYouWaitForContent() + forYouSelectTopics() forYouScrollFeedDownUp() } } From 8c6b74d978dce8c2b84b9bc19b11ef71ff2c17c1 Mon Sep 17 00:00:00 2001 From: mlykotom Date: Tue, 6 Dec 2022 13:49:52 +0100 Subject: [PATCH 10/37] Fix wait for bookmarks to show Change-Id: Ia4dfb1eea89a6b211b80789ae6f4548a0c23121e --- .../samples/apps/nowinandroid/bookmarks/BookmarksActions.kt | 1 + .../samples/apps/nowinandroid/interests/InterestsActions.kt | 2 ++ 2 files changed, 3 insertions(+) diff --git a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/bookmarks/BookmarksActions.kt b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/bookmarks/BookmarksActions.kt index 83ad48398..3dce5b313 100644 --- a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/bookmarks/BookmarksActions.kt +++ b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/bookmarks/BookmarksActions.kt @@ -25,6 +25,7 @@ fun MacrobenchmarkScope.goToBookmarksScreen() { device.findObject(By.text("Saved")).click() device.waitForIdle() // Wait until saved title are shown on screen + device.wait(Until.hasObject(By.res("niaTopAppBar")), 2_000) val topAppBar = device.findObject(By.res("niaTopAppBar")) topAppBar.wait(Until.hasObject(By.text("Saved")), 2_000) } diff --git a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/interests/InterestsActions.kt b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/interests/InterestsActions.kt index e595ae4e4..e94369ce2 100644 --- a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/interests/InterestsActions.kt +++ b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/interests/InterestsActions.kt @@ -25,8 +25,10 @@ fun MacrobenchmarkScope.goToInterestsScreen() { device.findObject(By.text("Interests")).click() device.waitForIdle() // Wait until interests are shown on screen + device.wait(Until.hasObject(By.res("niaTopAppBar")), 2_000) val topAppBar = device.findObject(By.res("niaTopAppBar")) topAppBar.wait(Until.hasObject(By.text("Interests")), 2_000) + // Wait until content is loaded by checking if interests are loaded device.wait(Until.gone(By.res("loadingWheel")), 5_000) } From 0c98a3fa582eb40372447523c22057cec38d0313 Mon Sep 17 00:00:00 2001 From: mlykotom Date: Tue, 6 Dec 2022 22:14:36 +0100 Subject: [PATCH 11/37] Add comment Change-Id: I8524c4fbd8c9b95274d82a28e19eceb12da3ef6a --- .../google/samples/apps/nowinandroid/foryou/ForYouActions.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ForYouActions.kt b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ForYouActions.kt index 25009223e..e540b507e 100644 --- a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ForYouActions.kt +++ b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ForYouActions.kt @@ -45,7 +45,8 @@ fun MacrobenchmarkScope.forYouSelectTopics(recheckTopicsIfChecked: Boolean = fal // Select some topics to show some feed content repeat(3) { index -> - // Selecting topics that are in the first column + // Selecting topics that are in the first column. The visible topics are indexed horizontally first, + // so if we want to select the items in the column, we need to select the 0th, 2th, 4th index. val topic = topics.children[(2 * index) % topics.childCount] // Find the checkable element to figure out whether it's checked or not val topicCheckIcon = topic.findObject(By.checkable(true)) From 1c09d0a6ead55d22ae510d9118e4abe41338d43f Mon Sep 17 00:00:00 2001 From: mlykotom Date: Fri, 16 Dec 2022 22:08:16 +0100 Subject: [PATCH 12/37] Simplify selecting topics Change-Id: Icd5bcb361c7ccdf9ce907729ca3f65de41f34649 --- .../google/samples/apps/nowinandroid/foryou/ForYouActions.kt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ForYouActions.kt b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ForYouActions.kt index e540b507e..b407dfcb1 100644 --- a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ForYouActions.kt +++ b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ForYouActions.kt @@ -45,9 +45,8 @@ fun MacrobenchmarkScope.forYouSelectTopics(recheckTopicsIfChecked: Boolean = fal // Select some topics to show some feed content repeat(3) { index -> - // Selecting topics that are in the first column. The visible topics are indexed horizontally first, - // so if we want to select the items in the column, we need to select the 0th, 2th, 4th index. - val topic = topics.children[(2 * index) % topics.childCount] + // Selecting some topics, which will populate items in the feed. + val topic = topics.children[index % topics.childCount] // Find the checkable element to figure out whether it's checked or not val topicCheckIcon = topic.findObject(By.checkable(true)) From 8eac9a4bddc3504506225ee1b727cd67a1877781 Mon Sep 17 00:00:00 2001 From: ratobing Date: Sat, 7 Jan 2023 23:32:54 +0700 Subject: [PATCH 13/37] Set item keys for smart recomposition of topics --- .../samples/apps/nowinandroid/feature/foryou/ForYouScreen.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreen.kt b/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreen.kt index 0e62a9b0b..f26cc71dc 100644 --- a/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreen.kt +++ b/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreen.kt @@ -302,7 +302,10 @@ private fun TopicSelection( .heightIn(max = max(240.dp, with(LocalDensity.current) { 240.sp.toDp() })) .fillMaxWidth() ) { - items(onboardingUiState.topics) { + items( + items = onboardingUiState.topics, + key = { it.topic.id } + ) { SingleTopicButton( name = it.topic.name, topicId = it.topic.id, From 6046f6e943300e8e27866bfb0b0807614a131544 Mon Sep 17 00:00:00 2001 From: Angie Sasmita Date: Thu, 19 Jan 2023 13:57:36 +0800 Subject: [PATCH 14/37] Add dynamic color option in settings for API >=32 Change-Id: Ib42c1cbd0208e98ef7610a1c8aca5d721aa464e6 --- .../samples/apps/nowinandroid/MainActivity.kt | 14 ++- .../OfflineFirstUserDataRepository.kt | 3 + .../data/repository/UserDataRepository.kt | 5 ++ .../repository/fake/FakeUserDataRepository.kt | 4 + .../OfflineFirstUserDataRepositoryTest.kt | 21 +++++ .../datastore/NiaPreferencesDataSource.kt | 10 ++- .../nowinandroid/data/user_preferences.proto | 2 + .../datastore/NiaPreferencesDataSourceTest.kt | 11 +++ core/designsystem/build.gradle.kts | 3 +- .../core/designsystem/ThemeTest.kt | 34 ++++++++ .../core/designsystem/component/Background.kt | 4 +- .../component/DynamicAsyncImage.kt | 44 ++++++++++ .../core/designsystem/theme/Theme.kt | 35 +++----- .../core/designsystem/theme/Tint.kt | 34 ++++++++ .../core/domain/UserNewsResourceTest.kt | 1 + .../nowinandroid/core/model/data/UserData.kt | 1 + .../repository/TestUserDataRepository.kt | 7 ++ .../feature/foryou/ForYouScreen.kt | 8 +- .../feature/interests/InterestsItem.kt | 8 +- .../feature/settings/SettingsDialogTest.kt | 87 ++++++++++++++++++- .../feature/settings/SettingsDialog.kt | 60 +++++++++++-- .../feature/settings/SettingsViewModel.kt | 13 ++- .../settings/src/main/res/values/strings.xml | 6 +- .../feature/settings/SettingsViewModelTest.kt | 3 +- .../nowinandroid/feature/topic/TopicScreen.kt | 8 +- 25 files changed, 367 insertions(+), 59 deletions(-) create mode 100644 core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/DynamicAsyncImage.kt create mode 100644 core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/theme/Tint.kt diff --git a/app/src/main/java/com/google/samples/apps/nowinandroid/MainActivity.kt b/app/src/main/java/com/google/samples/apps/nowinandroid/MainActivity.kt index 2cfc7142f..06cbf9c84 100644 --- a/app/src/main/java/com/google/samples/apps/nowinandroid/MainActivity.kt +++ b/app/src/main/java/com/google/samples/apps/nowinandroid/MainActivity.kt @@ -106,7 +106,8 @@ class MainActivity : ComponentActivity() { NiaTheme( darkTheme = darkTheme, - androidTheme = shouldUseAndroidTheme(uiState) + androidTheme = shouldUseAndroidTheme(uiState), + disableDynamicTheming = shouldDisableDynamicTheming(uiState) ) { NiaApp( networkMonitor = networkMonitor, @@ -141,6 +142,17 @@ private fun shouldUseAndroidTheme( } } +/** + * Returns `true` if the dynamic color is disabled, as a function of the [uiState]. + */ +@Composable +private fun shouldDisableDynamicTheming( + uiState: MainActivityUiState, +): Boolean = when (uiState) { + Loading -> false + is Success -> !uiState.userData.useDynamicColor +} + /** * Returns `true` if dark theme should be used, as a function of the [uiState] and the * current system context. diff --git a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstUserDataRepository.kt b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstUserDataRepository.kt index 14a419b67..954779a3f 100644 --- a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstUserDataRepository.kt +++ b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstUserDataRepository.kt @@ -45,6 +45,9 @@ class OfflineFirstUserDataRepository @Inject constructor( override suspend fun setDarkThemeConfig(darkThemeConfig: DarkThemeConfig) = niaPreferencesDataSource.setDarkThemeConfig(darkThemeConfig) + override suspend fun setDynamicColorPreference(useDynamicColor: Boolean) = + niaPreferencesDataSource.setDynamicColorPreference(useDynamicColor) + override suspend fun setShouldHideOnboarding(shouldHideOnboarding: Boolean) = niaPreferencesDataSource.setShouldHideOnboarding(shouldHideOnboarding) } diff --git a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/UserDataRepository.kt b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/UserDataRepository.kt index d645e0194..ea093852f 100644 --- a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/UserDataRepository.kt +++ b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/UserDataRepository.kt @@ -53,6 +53,11 @@ interface UserDataRepository { */ suspend fun setDarkThemeConfig(darkThemeConfig: DarkThemeConfig) + /** + * Sets the preferred dynamic color config. + */ + suspend fun setDynamicColorPreference(useDynamicColor: Boolean) + /** * Sets whether the user has completed the onboarding process. */ diff --git a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/fake/FakeUserDataRepository.kt b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/fake/FakeUserDataRepository.kt index 5d4d17d0b..d7920cabc 100644 --- a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/fake/FakeUserDataRepository.kt +++ b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/fake/FakeUserDataRepository.kt @@ -55,6 +55,10 @@ class FakeUserDataRepository @Inject constructor( niaPreferencesDataSource.setDarkThemeConfig(darkThemeConfig) } + override suspend fun setDynamicColorPreference(useDynamicColor: Boolean) { + niaPreferencesDataSource.setDynamicColorPreference(useDynamicColor) + } + override suspend fun setShouldHideOnboarding(shouldHideOnboarding: Boolean) { niaPreferencesDataSource.setShouldHideOnboarding(shouldHideOnboarding) } diff --git a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstUserDataRepositoryTest.kt b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstUserDataRepositoryTest.kt index 531f1004a..926052ea8 100644 --- a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstUserDataRepositoryTest.kt +++ b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstUserDataRepositoryTest.kt @@ -60,6 +60,7 @@ class OfflineFirstUserDataRepositoryTest { followedTopics = emptySet(), themeBrand = ThemeBrand.DEFAULT, darkThemeConfig = DarkThemeConfig.FOLLOW_SYSTEM, + useDynamicColor = false, shouldHideOnboarding = false ), subject.userData.first() @@ -170,6 +171,26 @@ class OfflineFirstUserDataRepositoryTest { ) } + @Test + fun offlineFirstUserDataRepository_set_dynamic_color_delegates_to_nia_preferences() = + runTest { + subject.setDynamicColorPreference(true) + + assertEquals( + true, + subject.userData + .map { it.useDynamicColor } + .first() + ) + assertEquals( + true, + niaPreferencesDataSource + .userData + .map { it.useDynamicColor } + .first() + ) + } + @Test fun offlineFirstUserDataRepository_set_dark_theme_config_delegates_to_nia_preferences() = runTest { diff --git a/core/datastore/src/main/java/com/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSource.kt b/core/datastore/src/main/java/com/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSource.kt index 841ad9e2e..e82b13950 100644 --- a/core/datastore/src/main/java/com/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSource.kt +++ b/core/datastore/src/main/java/com/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSource.kt @@ -29,7 +29,6 @@ import kotlinx.coroutines.flow.map class NiaPreferencesDataSource @Inject constructor( private val userPreferences: DataStore ) { - val userData = userPreferences.data .map { UserData( @@ -52,6 +51,7 @@ class NiaPreferencesDataSource @Inject constructor( DarkThemeConfig.LIGHT DarkThemeConfigProto.DARK_THEME_CONFIG_DARK -> DarkThemeConfig.DARK }, + useDynamicColor = it.useDynamicColor, shouldHideOnboarding = it.shouldHideOnboarding ) } @@ -98,6 +98,14 @@ class NiaPreferencesDataSource @Inject constructor( } } + suspend fun setDynamicColorPreference(useDynamicColor: Boolean) { + userPreferences.updateData { + it.copy { + this.useDynamicColor = useDynamicColor + } + } + } + suspend fun setDarkThemeConfig(darkThemeConfig: DarkThemeConfig) { userPreferences.updateData { it.copy { diff --git a/core/datastore/src/main/proto/com/google/samples/apps/nowinandroid/data/user_preferences.proto b/core/datastore/src/main/proto/com/google/samples/apps/nowinandroid/data/user_preferences.proto index b7d33dcaf..5288c04ea 100644 --- a/core/datastore/src/main/proto/com/google/samples/apps/nowinandroid/data/user_preferences.proto +++ b/core/datastore/src/main/proto/com/google/samples/apps/nowinandroid/data/user_preferences.proto @@ -45,4 +45,6 @@ message UserPreferences { DarkThemeConfigProto dark_theme_config = 17; bool should_hide_onboarding = 18; + + bool use_dynamic_color = 19; } diff --git a/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSourceTest.kt b/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSourceTest.kt index cfca4b83a..62a70de11 100644 --- a/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSourceTest.kt +++ b/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSourceTest.kt @@ -77,4 +77,15 @@ class NiaPreferencesDataSourceTest { // Then: onboarding should be shown again assertFalse(subject.userData.first().shouldHideOnboarding) } + + @Test + fun shouldUseDynamicColorFalseByDefault() = runTest { + assertFalse(subject.userData.first().useDynamicColor) + } + + @Test + fun userShouldUseDynamicColorIsTrueWhenSet() = runTest { + subject.setDynamicColorPreference(true) + assertTrue(subject.userData.first().useDynamicColor) + } } diff --git a/core/designsystem/build.gradle.kts b/core/designsystem/build.gradle.kts index 503ac2d19..1bcc9d65c 100644 --- a/core/designsystem/build.gradle.kts +++ b/core/designsystem/build.gradle.kts @@ -31,6 +31,7 @@ android { dependencies { implementation(libs.androidx.core.ktx) + implementation(libs.coil.kt.compose) api(libs.androidx.compose.foundation) api(libs.androidx.compose.foundation.layout) api(libs.androidx.compose.material.iconsExtended) @@ -41,4 +42,4 @@ dependencies { api(libs.androidx.compose.runtime) lintPublish(project(":lint")) androidTestImplementation(project(":core:testing")) -} \ No newline at end of file +} diff --git a/core/designsystem/src/androidTest/java/com/google/samples/apps/nowinandroid/core/designsystem/ThemeTest.kt b/core/designsystem/src/androidTest/java/com/google/samples/apps/nowinandroid/core/designsystem/ThemeTest.kt index bd73cd7c2..fa227e358 100644 --- a/core/designsystem/src/androidTest/java/com/google/samples/apps/nowinandroid/core/designsystem/ThemeTest.kt +++ b/core/designsystem/src/androidTest/java/com/google/samples/apps/nowinandroid/core/designsystem/ThemeTest.kt @@ -38,7 +38,9 @@ import com.google.samples.apps.nowinandroid.core.designsystem.theme.LightAndroid import com.google.samples.apps.nowinandroid.core.designsystem.theme.LightDefaultColorScheme import com.google.samples.apps.nowinandroid.core.designsystem.theme.LocalBackgroundTheme import com.google.samples.apps.nowinandroid.core.designsystem.theme.LocalGradientColors +import com.google.samples.apps.nowinandroid.core.designsystem.theme.LocalTintTheme import com.google.samples.apps.nowinandroid.core.designsystem.theme.NiaTheme +import com.google.samples.apps.nowinandroid.core.designsystem.theme.TintTheme import kotlin.test.assertEquals import org.junit.Rule import org.junit.Test @@ -70,6 +72,8 @@ class ThemeTest { assertEquals(gradientColors, LocalGradientColors.current) val backgroundTheme = defaultBackgroundTheme(colorScheme) assertEquals(backgroundTheme, LocalBackgroundTheme.current) + val tintTheme = defaultTintTheme() + assertEquals(tintTheme, LocalTintTheme.current) } } } @@ -88,6 +92,8 @@ class ThemeTest { assertEquals(gradientColors, LocalGradientColors.current) val backgroundTheme = defaultBackgroundTheme(colorScheme) assertEquals(backgroundTheme, LocalBackgroundTheme.current) + val tintTheme = defaultTintTheme() + assertEquals(tintTheme, LocalTintTheme.current) } } } @@ -97,6 +103,7 @@ class ThemeTest { composeTestRule.setContent { NiaTheme( darkTheme = false, + disableDynamicTheming = false, androidTheme = false ) { val colorScheme = dynamicLightColorSchemeWithFallback() @@ -105,6 +112,8 @@ class ThemeTest { assertEquals(gradientColors, LocalGradientColors.current) val backgroundTheme = defaultBackgroundTheme(colorScheme) assertEquals(backgroundTheme, LocalBackgroundTheme.current) + val tintTheme = dynamicTintTheme(colorScheme) + assertEquals(tintTheme, LocalTintTheme.current) } } } @@ -114,6 +123,7 @@ class ThemeTest { composeTestRule.setContent { NiaTheme( darkTheme = true, + disableDynamicTheming = false, androidTheme = false ) { val colorScheme = dynamicDarkColorSchemeWithFallback() @@ -122,6 +132,8 @@ class ThemeTest { assertEquals(gradientColors, LocalGradientColors.current) val backgroundTheme = defaultBackgroundTheme(colorScheme) assertEquals(backgroundTheme, LocalBackgroundTheme.current) + val tintTheme = dynamicTintTheme(colorScheme) + assertEquals(tintTheme, LocalTintTheme.current) } } } @@ -140,6 +152,8 @@ class ThemeTest { assertEquals(gradientColors, LocalGradientColors.current) val backgroundTheme = LightAndroidBackgroundTheme assertEquals(backgroundTheme, LocalBackgroundTheme.current) + val tintTheme = defaultTintTheme() + assertEquals(tintTheme, LocalTintTheme.current) } } } @@ -158,6 +172,8 @@ class ThemeTest { assertEquals(gradientColors, LocalGradientColors.current) val backgroundTheme = DarkAndroidBackgroundTheme assertEquals(backgroundTheme, LocalBackgroundTheme.current) + val tintTheme = defaultTintTheme() + assertEquals(tintTheme, LocalTintTheme.current) } } } @@ -167,6 +183,7 @@ class ThemeTest { composeTestRule.setContent { NiaTheme( darkTheme = false, + disableDynamicTheming = false, androidTheme = true ) { val colorScheme = LightAndroidColorScheme @@ -175,6 +192,8 @@ class ThemeTest { assertEquals(gradientColors, LocalGradientColors.current) val backgroundTheme = LightAndroidBackgroundTheme assertEquals(backgroundTheme, LocalBackgroundTheme.current) + val tintTheme = defaultTintTheme() + assertEquals(tintTheme, LocalTintTheme.current) } } } @@ -184,6 +203,7 @@ class ThemeTest { composeTestRule.setContent { NiaTheme( darkTheme = true, + disableDynamicTheming = false, androidTheme = true ) { val colorScheme = DarkAndroidColorScheme @@ -192,6 +212,8 @@ class ThemeTest { assertEquals(gradientColors, LocalGradientColors.current) val backgroundTheme = DarkAndroidBackgroundTheme assertEquals(backgroundTheme, LocalBackgroundTheme.current) + val tintTheme = defaultTintTheme() + assertEquals(tintTheme, LocalTintTheme.current) } } } @@ -241,6 +263,18 @@ class ThemeTest { ) } + private fun defaultTintTheme(): TintTheme { + return TintTheme() + } + + private fun dynamicTintTheme(colorScheme: ColorScheme): TintTheme { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + TintTheme(colorScheme.primary) + } else { + TintTheme() + } + } + /** * Workaround for the fact that the NiA design system specify all color scheme values. */ diff --git a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Background.kt b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Background.kt index 40eae962f..f81d2e36d 100644 --- a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Background.kt +++ b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Background.kt @@ -158,7 +158,7 @@ fun BackgroundDefault() { @ThemePreviews @Composable fun BackgroundDynamic() { - NiaTheme { + NiaTheme(disableDynamicTheming = false) { NiaBackground(Modifier.size(100.dp), content = {}) } } @@ -182,7 +182,7 @@ fun GradientBackgroundDefault() { @ThemePreviews @Composable fun GradientBackgroundDynamic() { - NiaTheme { + NiaTheme(disableDynamicTheming = false) { NiaGradientBackground(Modifier.size(100.dp), content = {}) } } diff --git a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/DynamicAsyncImage.kt b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/DynamicAsyncImage.kt new file mode 100644 index 000000000..9ebd898cb --- /dev/null +++ b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/DynamicAsyncImage.kt @@ -0,0 +1,44 @@ +/* + * Copyright 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.samples.apps.nowinandroid.core.designsystem.component + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.ColorFilter +import androidx.compose.ui.graphics.painter.Painter +import coil.compose.AsyncImage +import com.google.samples.apps.nowinandroid.core.designsystem.theme.LocalTintTheme + +/** + * A wrapper around [AsyncImage] which determines the colorFilter based on the theme + */ +@Composable +fun DynamicAsyncImage( + imageUrl: String, + contentDescription: String?, + modifier: Modifier = Modifier, + placeholder: Painter? = null +) { + val iconTint = LocalTintTheme.current.iconTint + AsyncImage( + placeholder = placeholder, + model = imageUrl, + contentDescription = contentDescription, + colorFilter = if(iconTint != null) ColorFilter.tint(iconTint) else null, + modifier = modifier + ) +} diff --git a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/theme/Theme.kt b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/theme/Theme.kt index cc405421e..e7be17c99 100644 --- a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/theme/Theme.kt +++ b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/theme/Theme.kt @@ -185,35 +185,15 @@ val DarkAndroidBackgroundTheme = BackgroundTheme(color = Color.Black) * * @param darkTheme Whether the theme should use a dark color scheme (follows system by default). * @param androidTheme Whether the theme should use the Android theme color scheme instead of the - * default theme. If this is `false`, then dynamic theming will be used when supported. - */ -@Composable -fun NiaTheme( - darkTheme: Boolean = isSystemInDarkTheme(), - androidTheme: Boolean = false, - content: @Composable () -> Unit -) = NiaTheme( - darkTheme = darkTheme, - androidTheme = androidTheme, - disableDynamicTheming = false, - content = content -) - -/** - * Now in Android theme. This is an internal only version, to allow disabling dynamic theming - * in tests. - * - * @param darkTheme Whether the theme should use a dark color scheme (follows system by default). - * @param androidTheme Whether the theme should use the Android theme color scheme instead of the * default theme. * @param disableDynamicTheming If `true`, disables the use of dynamic theming, even when it is * supported. This parameter has no effect if [androidTheme] is `true`. */ @Composable -internal fun NiaTheme( +fun NiaTheme( darkTheme: Boolean = isSystemInDarkTheme(), androidTheme: Boolean = false, - disableDynamicTheming: Boolean, + disableDynamicTheming: Boolean = true, content: @Composable () -> Unit ) { // Color scheme @@ -223,6 +203,7 @@ internal fun NiaTheme( val context = LocalContext.current if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) } + else -> if (darkTheme) DarkDefaultColorScheme else LightDefaultColorScheme } // Gradient colors @@ -246,10 +227,16 @@ internal fun NiaTheme( androidTheme -> if (darkTheme) DarkAndroidBackgroundTheme else LightAndroidBackgroundTheme else -> defaultBackgroundTheme } + val tintTheme = when { + androidTheme -> TintTheme() + !disableDynamicTheming && supportsDynamicTheming() -> TintTheme(colorScheme.primary) + else -> TintTheme() + } // Composition locals CompositionLocalProvider( LocalGradientColors provides gradientColors, - LocalBackgroundTheme provides backgroundTheme + LocalBackgroundTheme provides backgroundTheme, + LocalTintTheme provides tintTheme ) { MaterialTheme( colorScheme = colorScheme, @@ -260,4 +247,4 @@ internal fun NiaTheme( } @ChecksSdkIntAtLeast(api = Build.VERSION_CODES.S) -private fun supportsDynamicTheming() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.S +fun supportsDynamicTheming() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.S diff --git a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/theme/Tint.kt b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/theme/Tint.kt new file mode 100644 index 000000000..72f344103 --- /dev/null +++ b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/theme/Tint.kt @@ -0,0 +1,34 @@ +/* + * Copyright 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.samples.apps.nowinandroid.core.designsystem.theme + +import androidx.compose.runtime.Immutable +import androidx.compose.runtime.staticCompositionLocalOf +import androidx.compose.ui.graphics.Color + +/** + * A class to model background color and tonal elevation values for Now in Android. + */ +@Immutable +data class TintTheme( + val iconTint: Color? = null, +) + +/** + * A composition local for [TintTheme]. + */ +val LocalTintTheme = staticCompositionLocalOf { TintTheme() } diff --git a/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/UserNewsResourceTest.kt b/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/UserNewsResourceTest.kt index d1ea7b569..d06a6d5ac 100644 --- a/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/UserNewsResourceTest.kt +++ b/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/UserNewsResourceTest.kt @@ -72,6 +72,7 @@ class UserNewsResourceTest { followedTopics = setOf("T1"), themeBrand = DEFAULT, darkThemeConfig = FOLLOW_SYSTEM, + useDynamicColor = false, shouldHideOnboarding = true ) diff --git a/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/UserData.kt b/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/UserData.kt index dcea61b5b..56e3fa522 100644 --- a/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/UserData.kt +++ b/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/UserData.kt @@ -24,5 +24,6 @@ data class UserData( val followedTopics: Set, val themeBrand: ThemeBrand, val darkThemeConfig: DarkThemeConfig, + val useDynamicColor: Boolean, val shouldHideOnboarding: Boolean ) diff --git a/core/testing/src/main/java/com/google/samples/apps/nowinandroid/core/testing/repository/TestUserDataRepository.kt b/core/testing/src/main/java/com/google/samples/apps/nowinandroid/core/testing/repository/TestUserDataRepository.kt index 8dba1bfc7..c4c6e126f 100644 --- a/core/testing/src/main/java/com/google/samples/apps/nowinandroid/core/testing/repository/TestUserDataRepository.kt +++ b/core/testing/src/main/java/com/google/samples/apps/nowinandroid/core/testing/repository/TestUserDataRepository.kt @@ -30,6 +30,7 @@ val emptyUserData = UserData( followedTopics = emptySet(), themeBrand = ThemeBrand.DEFAULT, darkThemeConfig = DarkThemeConfig.FOLLOW_SYSTEM, + useDynamicColor = false, shouldHideOnboarding = false ) @@ -77,6 +78,12 @@ class TestUserDataRepository : UserDataRepository { } } + override suspend fun setDynamicColorPreference(useDynamicColor: Boolean) { + currentUserData.let { current -> + _userData.tryEmit(current.copy(useDynamicColor = useDynamicColor)) + } + } + override suspend fun setShouldHideOnboarding(shouldHideOnboarding: Boolean) { currentUserData.let { current -> _userData.tryEmit(current.copy(shouldHideOnboarding = shouldHideOnboarding)) diff --git a/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreen.kt b/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreen.kt index 0e62a9b0b..eb07307e1 100644 --- a/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreen.kt +++ b/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreen.kt @@ -60,7 +60,6 @@ import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.layout.layout import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalView @@ -76,7 +75,7 @@ import androidx.core.view.doOnPreDraw import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.ExperimentalLifecycleComposeApi import androidx.lifecycle.compose.collectAsStateWithLifecycle -import coil.compose.AsyncImage +import com.google.samples.apps.nowinandroid.core.designsystem.component.DynamicAsyncImage import com.google.samples.apps.nowinandroid.core.designsystem.component.NiaButton import com.google.samples.apps.nowinandroid.core.designsystem.component.NiaIconToggleButton import com.google.samples.apps.nowinandroid.core.designsystem.component.NiaOverlayLoadingWheel @@ -374,12 +373,11 @@ fun TopicIcon( imageUrl: String, modifier: Modifier = Modifier ) { - AsyncImage( + DynamicAsyncImage( // TODO b/228077205, show loading image visual instead of static placeholder placeholder = painterResource(R.drawable.ic_icon_placeholder), - model = imageUrl, + imageUrl = imageUrl, contentDescription = null, // decorative - colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.primary), modifier = modifier .padding(10.dp) .size(32.dp) diff --git a/feature/interests/src/main/java/com/google/samples/apps/nowinandroid/feature/interests/InterestsItem.kt b/feature/interests/src/main/java/com/google/samples/apps/nowinandroid/feature/interests/InterestsItem.kt index de04f59f1..19ace59f6 100644 --- a/feature/interests/src/main/java/com/google/samples/apps/nowinandroid/feature/interests/InterestsItem.kt +++ b/feature/interests/src/main/java/com/google/samples/apps/nowinandroid/feature/interests/InterestsItem.kt @@ -31,12 +31,11 @@ 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.ColorFilter import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp -import coil.compose.AsyncImage +import com.google.samples.apps.nowinandroid.core.designsystem.component.DynamicAsyncImage import com.google.samples.apps.nowinandroid.core.designsystem.component.NiaIconToggleButton import com.google.samples.apps.nowinandroid.core.designsystem.icon.NiaIcons import com.google.samples.apps.nowinandroid.core.designsystem.theme.NiaTheme @@ -122,10 +121,9 @@ private fun InterestsIcon(topicImageUrl: String, modifier: Modifier = Modifier) contentDescription = null, // decorative image ) } else { - AsyncImage( - model = topicImageUrl, + DynamicAsyncImage( + imageUrl = topicImageUrl, contentDescription = null, - colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.primary), modifier = modifier ) } diff --git a/feature/settings/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsDialogTest.kt b/feature/settings/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsDialogTest.kt index 07b6b272c..ecaacb32d 100644 --- a/feature/settings/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsDialogTest.kt +++ b/feature/settings/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsDialogTest.kt @@ -22,6 +22,7 @@ import androidx.compose.ui.test.junit4.createAndroidComposeRule import androidx.compose.ui.test.onNodeWithText import com.google.samples.apps.nowinandroid.core.model.data.DarkThemeConfig.DARK import com.google.samples.apps.nowinandroid.core.model.data.ThemeBrand.ANDROID +import com.google.samples.apps.nowinandroid.core.model.data.ThemeBrand.DEFAULT import com.google.samples.apps.nowinandroid.feature.settings.SettingsUiState.Loading import com.google.samples.apps.nowinandroid.feature.settings.SettingsUiState.Success import org.junit.Rule @@ -40,7 +41,8 @@ class SettingsDialogTest { composeTestRule.setContent { SettingsDialog( settingsUiState = Loading, - onDismiss = { }, + onDismiss = {}, + onChangeDynamicColorPreference = {}, onChangeThemeBrand = {}, onChangeDarkThemeConfig = {} ) @@ -52,16 +54,18 @@ class SettingsDialogTest { } @Test - fun whenStateIsSuccess_allSettingsAreDisplayed() { + fun whenStateIsSuccess_allDefaultSettingsAreDisplayed() { composeTestRule.setContent { SettingsDialog( settingsUiState = Success( UserEditableSettings( brand = ANDROID, + useDynamicColor = false, darkThemeConfig = DARK ) ), onDismiss = { }, + onChangeDynamicColorPreference = {}, onChangeThemeBrand = {}, onChangeDarkThemeConfig = {} ) @@ -81,6 +85,79 @@ class SettingsDialogTest { composeTestRule.onNodeWithText(getString(R.string.dark_mode_config_dark)).assertIsSelected() } + @Test + fun whenStateIsSuccess_supportsDynamicColor_usesDefaultBrand_DynamicColorOptionIsDisplayed() { + composeTestRule.setContent { + SettingsDialog( + settingsUiState = Success( + UserEditableSettings( + brand = DEFAULT, + darkThemeConfig = DARK, + useDynamicColor = false, + ) + ), + supportDynamicColor = true, + onDismiss = {}, + onChangeDynamicColorPreference = {}, + onChangeThemeBrand = {}, + onChangeDarkThemeConfig = {} + ) + } + + composeTestRule.onNodeWithText(getString(R.string.dynamic_color_preference)).assertExists() + composeTestRule.onNodeWithText(getString(R.string.dynamic_color_yes)).assertExists() + composeTestRule.onNodeWithText(getString(R.string.dynamic_color_no)).assertExists() + + // Check that the correct default dynamic color setting is selected. + composeTestRule.onNodeWithText(getString(R.string.dynamic_color_no)).assertIsSelected() + } + + @Test + fun whenStateIsSuccess_notSupportDynamicColor_DynamicColorOptionIsNotDisplayed() { + composeTestRule.setContent { + SettingsDialog( + settingsUiState = Success( + UserEditableSettings( + brand = ANDROID, + darkThemeConfig = DARK, + useDynamicColor = false, + ) + ), + onDismiss = {}, + onChangeDynamicColorPreference = {}, + onChangeThemeBrand = {}, + onChangeDarkThemeConfig = {} + ) + } + + composeTestRule.onNodeWithText(getString(R.string.dynamic_color_preference)).assertDoesNotExist() + composeTestRule.onNodeWithText(getString(R.string.dynamic_color_yes)).assertDoesNotExist() + composeTestRule.onNodeWithText(getString(R.string.dynamic_color_no)).assertDoesNotExist() + } + + @Test + fun whenStateIsSuccess_usesAndroidBrand_DynamicColorOptionIsNotDisplayed() { + composeTestRule.setContent { + SettingsDialog( + settingsUiState = Success( + UserEditableSettings( + brand = ANDROID, + darkThemeConfig = DARK, + useDynamicColor = false, + ) + ), + onDismiss = {}, + onChangeDynamicColorPreference = {}, + onChangeThemeBrand = {}, + onChangeDarkThemeConfig = {} + ) + } + + composeTestRule.onNodeWithText(getString(R.string.dynamic_color_preference)).assertDoesNotExist() + composeTestRule.onNodeWithText(getString(R.string.dynamic_color_yes)).assertDoesNotExist() + composeTestRule.onNodeWithText(getString(R.string.dynamic_color_no)).assertDoesNotExist() + } + @Test fun whenStateIsSuccess_allLinksAreDisplayed() { composeTestRule.setContent { @@ -88,10 +165,12 @@ class SettingsDialogTest { settingsUiState = Success( UserEditableSettings( brand = ANDROID, - darkThemeConfig = DARK + darkThemeConfig = DARK, + useDynamicColor = false, ) ), - onDismiss = { }, + onDismiss = {}, + onChangeDynamicColorPreference = {}, onChangeThemeBrand = {}, onChangeDarkThemeConfig = {} ) diff --git a/feature/settings/src/main/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsDialog.kt b/feature/settings/src/main/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsDialog.kt index 01c7cb0f5..b2d7ab429 100644 --- a/feature/settings/src/main/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsDialog.kt +++ b/feature/settings/src/main/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsDialog.kt @@ -26,6 +26,7 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.widthIn import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.selection.selectable import androidx.compose.foundation.selection.selectableGroup @@ -38,17 +39,21 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment +import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.semantics.Role import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.DialogProperties import androidx.core.content.ContextCompat import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.ExperimentalLifecycleComposeApi import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.google.samples.apps.nowinandroid.core.designsystem.theme.NiaTheme +import com.google.samples.apps.nowinandroid.core.designsystem.theme.supportsDynamicTheming import com.google.samples.apps.nowinandroid.core.model.data.DarkThemeConfig import com.google.samples.apps.nowinandroid.core.model.data.DarkThemeConfig.DARK import com.google.samples.apps.nowinandroid.core.model.data.DarkThemeConfig.FOLLOW_SYSTEM @@ -71,19 +76,33 @@ fun SettingsDialog( onDismiss = onDismiss, settingsUiState = settingsUiState, onChangeThemeBrand = viewModel::updateThemeBrand, + onChangeDynamicColorPreference = viewModel::updateDynamicColorPreference, onChangeDarkThemeConfig = viewModel::updateDarkThemeConfig, ) } +@OptIn(ExperimentalComposeUiApi::class) @Composable fun SettingsDialog( settingsUiState: SettingsUiState, + supportDynamicColor: Boolean = supportsDynamicTheming(), onDismiss: () -> Unit, onChangeThemeBrand: (themeBrand: ThemeBrand) -> Unit, + onChangeDynamicColorPreference: (useDynamicColor: Boolean) -> Unit, onChangeDarkThemeConfig: (darkThemeConfig: DarkThemeConfig) -> Unit ) { + val configuration = LocalConfiguration.current + /** + * usePlatformDefaultWidth = false is use as a temporary fix to allow + * height recalculation during recomposition. This, however, causes + * Dialog's to occupy full width in Compact mode. Therefore max width + * is configured below. This should be removed when there's fix to + * b/221643630 + */ AlertDialog( + properties = DialogProperties(usePlatformDefaultWidth = false), + modifier = Modifier.widthIn(max = configuration.screenWidthDp.dp - 80.dp), onDismissRequest = { onDismiss() }, title = { Text( @@ -101,10 +120,13 @@ fun SettingsDialog( modifier = Modifier.padding(vertical = 16.dp) ) } + is Success -> { SettingsPanel( settings = settingsUiState.settings, + supportDynamicColor = supportDynamicColor, onChangeThemeBrand = onChangeThemeBrand, + onChangeDynamicColorPreference = onChangeDynamicColorPreference, onChangeDarkThemeConfig = onChangeDarkThemeConfig ) } @@ -129,7 +151,9 @@ fun SettingsDialog( @Composable private fun SettingsPanel( settings: UserEditableSettings, + supportDynamicColor: Boolean, onChangeThemeBrand: (themeBrand: ThemeBrand) -> Unit, + onChangeDynamicColorPreference: (useDynamicColor: Boolean) -> Unit, onChangeDarkThemeConfig: (darkThemeConfig: DarkThemeConfig) -> Unit ) { SettingsDialogSectionTitle(text = stringResource(string.theme)) @@ -145,7 +169,22 @@ private fun SettingsPanel( onClick = { onChangeThemeBrand(ANDROID) } ) } - SettingsDialogSectionTitle(text = "Dark mode preference") + if (settings.brand == DEFAULT && supportDynamicColor) { + SettingsDialogSectionTitle(text = stringResource(R.string.dynamic_color_preference)) + Column(Modifier.selectableGroup()) { + SettingsDialogThemeChooserRow( + text = stringResource(string.dynamic_color_yes), + selected = settings.useDynamicColor == true, + onClick = { onChangeDynamicColorPreference(true) } + ) + SettingsDialogThemeChooserRow( + text = stringResource(string.dynamic_color_no), + selected = settings.useDynamicColor == false, + onClick = { onChangeDynamicColorPreference(false) } + ) + } + } + SettingsDialogSectionTitle(text = stringResource(R.string.dark_mode_preference)) Column(Modifier.selectableGroup()) { SettingsDialogThemeChooserRow( text = stringResource(string.dark_mode_config_system_default), @@ -262,11 +301,13 @@ private fun PreviewSettingsDialog() { settingsUiState = Success( UserEditableSettings( brand = DEFAULT, - darkThemeConfig = FOLLOW_SYSTEM + darkThemeConfig = FOLLOW_SYSTEM, + useDynamicColor = false ) ), - onChangeThemeBrand = { }, - onChangeDarkThemeConfig = { } + onChangeThemeBrand = {}, + onChangeDynamicColorPreference = {}, + onChangeDarkThemeConfig = {} ) } } @@ -278,14 +319,17 @@ private fun PreviewSettingsDialogLoading() { SettingsDialog( onDismiss = {}, settingsUiState = Loading, - onChangeThemeBrand = { }, - onChangeDarkThemeConfig = { } + onChangeThemeBrand = {}, + onChangeDynamicColorPreference = {}, + onChangeDarkThemeConfig = {} ) } } /* ktlint-disable max-line-length */ private const val PRIVACY_POLICY_URL = "https://policies.google.com/privacy" -private const val LICENSES_URL = "https://github.com/android/nowinandroid/blob/main/app/LICENSES.md#open-source-licenses-and-copyright-notices" -private const val BRAND_GUIDELINES_URL = "https://developer.android.com/distribute/marketing-tools/brand-guidelines" +private const val LICENSES_URL = + "https://github.com/android/nowinandroid/blob/main/app/LICENSES.md#open-source-licenses-and-copyright-notices" +private const val BRAND_GUIDELINES_URL = + "https://developer.android.com/distribute/marketing-tools/brand-guidelines" private const val FEEDBACK_URL = "https://goo.gle/nia-app-feedback" diff --git a/feature/settings/src/main/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsViewModel.kt b/feature/settings/src/main/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsViewModel.kt index 85a7feb91..c1eac1eee 100644 --- a/feature/settings/src/main/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsViewModel.kt +++ b/feature/settings/src/main/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsViewModel.kt @@ -41,6 +41,7 @@ class SettingsViewModel @Inject constructor( Success( settings = UserEditableSettings( brand = userData.themeBrand, + useDynamicColor = userData.useDynamicColor, darkThemeConfig = userData.darkThemeConfig ) ) @@ -68,12 +69,22 @@ class SettingsViewModel @Inject constructor( userDataRepository.setDarkThemeConfig(darkThemeConfig) } } + + fun updateDynamicColorPreference(useDynamicColor: Boolean) { + viewModelScope.launch { + userDataRepository.setDynamicColorPreference(useDynamicColor) + } + } } /** * Represents the settings which the user can edit within the app. */ -data class UserEditableSettings(val brand: ThemeBrand, val darkThemeConfig: DarkThemeConfig) +data class UserEditableSettings( + val brand: ThemeBrand, + val useDynamicColor: Boolean, + val darkThemeConfig: DarkThemeConfig +) sealed interface SettingsUiState { object Loading : SettingsUiState diff --git a/feature/settings/src/main/res/values/strings.xml b/feature/settings/src/main/res/values/strings.xml index b5265f650..5efaeb577 100644 --- a/feature/settings/src/main/res/values/strings.xml +++ b/feature/settings/src/main/res/values/strings.xml @@ -25,8 +25,12 @@ Theme Default Android + Dark mode preference System default Light Dark + Use Dynamic Color + Yes + No OK - \ No newline at end of file + diff --git a/feature/settings/src/test/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsViewModelTest.kt b/feature/settings/src/test/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsViewModelTest.kt index 6d8cf8b13..0377490b3 100644 --- a/feature/settings/src/test/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsViewModelTest.kt +++ b/feature/settings/src/test/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsViewModelTest.kt @@ -63,7 +63,8 @@ class SettingsViewModelTest { Success( UserEditableSettings( brand = ANDROID, - darkThemeConfig = DARK + darkThemeConfig = DARK, + useDynamicColor = false ) ), viewModel.settingsUiState.value diff --git a/feature/topic/src/main/java/com/google/samples/apps/nowinandroid/feature/topic/TopicScreen.kt b/feature/topic/src/main/java/com/google/samples/apps/nowinandroid/feature/topic/TopicScreen.kt index b3263839f..2200fc035 100644 --- a/feature/topic/src/main/java/com/google/samples/apps/nowinandroid/feature/topic/TopicScreen.kt +++ b/feature/topic/src/main/java/com/google/samples/apps/nowinandroid/feature/topic/TopicScreen.kt @@ -39,14 +39,13 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.ExperimentalLifecycleComposeApi import androidx.lifecycle.compose.collectAsStateWithLifecycle -import coil.compose.AsyncImage +import com.google.samples.apps.nowinandroid.core.designsystem.component.DynamicAsyncImage import com.google.samples.apps.nowinandroid.core.designsystem.component.NiaBackground import com.google.samples.apps.nowinandroid.core.designsystem.component.NiaFilterChip import com.google.samples.apps.nowinandroid.core.designsystem.component.NiaLoadingWheel @@ -153,10 +152,9 @@ private fun TopicHeader(name: String, description: String, imageUrl: String) { Column( modifier = Modifier.padding(horizontal = 24.dp) ) { - AsyncImage( - model = imageUrl, + DynamicAsyncImage( + imageUrl = imageUrl, contentDescription = null, - colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.primary), modifier = Modifier .align(Alignment.CenterHorizontally) .size(216.dp) From aa6f338f38ce54db7413e77f69401f7b87d27e83 Mon Sep 17 00:00:00 2001 From: Angie Sasmita Date: Thu, 19 Jan 2023 19:43:51 +0800 Subject: [PATCH 15/37] Make empty bookmark icon dynamic to dynamic color settings Change-Id: I6a69f0a82f91536d43d986cc5a382b65f4219816 --- .../feature/bookmarks/BookmarksScreen.kt | 4 +++ .../main/res/drawable/img_empty_bookmarks.png | Bin 0 -> 24325 bytes .../main/res/drawable/img_empty_bookmarks.xml | 31 ------------------ 3 files changed, 4 insertions(+), 31 deletions(-) create mode 100644 feature/bookmarks/src/main/res/drawable/img_empty_bookmarks.png delete mode 100644 feature/bookmarks/src/main/res/drawable/img_empty_bookmarks.xml diff --git a/feature/bookmarks/src/main/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreen.kt b/feature/bookmarks/src/main/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreen.kt index d5d70e9f7..eed7be1ff 100644 --- a/feature/bookmarks/src/main/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreen.kt +++ b/feature/bookmarks/src/main/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreen.kt @@ -40,6 +40,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource @@ -51,6 +52,7 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.ExperimentalLifecycleComposeApi import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.google.samples.apps.nowinandroid.core.designsystem.component.NiaLoadingWheel +import com.google.samples.apps.nowinandroid.core.designsystem.theme.LocalTintTheme import com.google.samples.apps.nowinandroid.core.designsystem.theme.NiaTheme import com.google.samples.apps.nowinandroid.core.domain.model.previewUserNewsResources import com.google.samples.apps.nowinandroid.core.ui.NewsFeedUiState @@ -142,9 +144,11 @@ private fun EmptyState(modifier: Modifier = Modifier) { verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally ) { + val iconTint = LocalTintTheme.current.iconTint Image( modifier = Modifier.fillMaxWidth(), painter = painterResource(id = R.drawable.img_empty_bookmarks), + colorFilter = if(iconTint != null) ColorFilter.tint(iconTint) else null, contentDescription = null ) diff --git a/feature/bookmarks/src/main/res/drawable/img_empty_bookmarks.png b/feature/bookmarks/src/main/res/drawable/img_empty_bookmarks.png new file mode 100644 index 0000000000000000000000000000000000000000..4755a9ec0716f02f2139f9e6a7eb765412dc85a3 GIT binary patch literal 24325 zcmaHSbyyVd_x9}4DXoAAf=Gk3G}57Tw=|NH(hGt#0O%WhFT+0Dyx3LIGTC@XyJ+=_~LL zo|}@P2LKR||NDgi8Ceg&FCiXUiZVde_`|>82TZ#cuU-H^?MH%}*H{2xmZ2>7LgyU> z)w%r9TG@Nvhq2sN3YTCj{Iy}S4KHm9rgp;f)&|SXuyA7?vBAj1!pXpSU5m2JmcKlgz8txpOD|pMH_I<53>+pn?CtpFFB$gjv3NSHP19dL)&^ zRo3O{z~R@Q4J3l5W_!u6>;Inpo$s?%ZO#hpoWIPkE1RI)yj|Xb*9;#OA-&Ed+L51^ zv;C#=ktKP={_CofA^vaU7nm}-$_P(t-Eka8cADNkw<#Nluo~>-p{vjH!>9Z|&MQ1sFsy7|=0n`8N za@nPXiQ85)q|Lsw1QQm_&$aZVw!2}JrkXauTQ5H=S?gzz#HI}gz}punI}z-IbVe3W zj18wR+)5J%tvTgVKq+7nd6c)VH-jF>qf1HznUjx~gY8egh~`fY3e5ge6fIg)-0;*J zic!*fi=Q(GM&Y`gaFg8vX z5U?i^)!S{SIO<+Nw)tVaHif{jFd*0N?sm_vZ?CU&Jam0&KY#j@0=32+8X5Rhj2IvB zDDQ4IRbB4y_4vvHpLNp2yS(>RAxVjqN-dwrlzlKwsS|ho_Z;r(!ubBQ4`}6Ey0*`~ zGG+39x8RuUxm9#JlR&a!I8#PYy`N&b=HsEvrnSc``iq`Ct997GMU31qn-OK=VHSt+ znB8G6)87>yV?K#f@_0MvH+{}Uj_h(lh{0`tA3okSP?}vd$s#YT67n2K)m7BQp zldpF!ZbEnhBT*BE)&dUnBM*PIy2Mp=a9?)JORV81*(jtug3M+JDWV;>mg1!ZjYcm` z@hNJ1TJup^iv~4lKltqQsfvk0?Kjap%!@sT^eaMCOm=r9-pQbg? zs33T&>zfYgJ4;UJN9%zHc)LOog@1mj*`QnRg;krtsxWrqN@v#HgIua|%E&i+_gM7v zhBPi5=~y!^ZZ&m&r=cZK`w~gF`=8pn_I*5u*(jguXZb4ys_mKugbI}G1vuM$_v3MP z9X6bc+G$x&wWr^+_r2we`(TsQoAYb3Yf>-(sR^C)T&y{{hV5SaRPR)6vXbXZa_Mo0 zI+vwmtJ3e7UoPA`<+A&z7CNg- z(wEkD@V9XF$wd`fsOxfL{%zBN3xwMw^&_;W7uBV>iIrh^Ri4)E`8hmlA9Yx zf6U3e02gC6=knT#D0I^qck^;z&|Q)csRQl89IJ?M9;W9G0b3#2!u>V{Wy77U6}0z= z8lL^)v2$x$$2^uJfR8Zyh0lw8>n|~z7`;XyOiOnu9<`KOZPkR{VEd&xpMT9syW)>$ zCVfNaRuQm8vv=z5w*6T`*HDH}UX7&#zvmJA{`E^Ak@N4O5vZnLIs5H;LxDv~tP>KOSP-;xSi+SQ;mb$)V zNl1;&R`)3feRM`_c4yL^^Z@jmrH$NhG2S}16PJJXj~%Z*ul~!j9j=0B3!C9p-EzxZ zf~kuVIq&_mmypspRliJFeA(K$Q2``n9?;xWc{ORHQl+hP!zQkUMXYG$?;;^W+5%Px z$+=38b01dpD=K^c<0-#$v=*^~tMi|i5Kf?7?b8xtsl?(vHNy4F7&uB#yYRvJBloJE z_-NE0qa#Ip@5^bsn9bYvLt{|~ zKZDsh0Y4i!;iAfm%y=WJ0DE=n^VS%XZ?}QiOdCJE*REfl2T+O(G*|LVj$CGG7;D$s z37*_6PPmn6C5xriNKR1RPWg8|CPxR*{(*w<$xh5+uE&*l661Z7ul9JVp)4Rfx4J%d zIko(3QULxPH-MW#2m2ao%KXW7x zu2$z8exy3QNMz~=SnT@lqp-Q5uzY^t@VAz<{wR3_)hjcnOc}QnJRzuISv=8*e<6C9 zw9odf4)wQwpFg#_7O5nDj%vcn&19P{w#-eeuU>SWd2jscIQQ#Y>QQ}#^xQvIq%rZ= zhUwk;JH!WS)D&!v=lMs>&UI@Z7~Q(piH{s%<8OtxnD>}B{oCfef~pf~TtA5cSQhs* z?mg<@Q$cV!a6wRy4u#jSxi0Av_aPqDHar+DLmEFvVxe>6r_}Axq4Q2lBv1XZ{U=-p zympM;iLuA0bROeAcUtQbi|=!v*-}4Hn)`Jc9j>HKBRBkEw3U>NCRt~ zN#@DBxIw|rXrof1@IHrz#g4_0*u2y9sPNX5&%_d4JpccLS8WlX48V`%d+t4*B z7h7Y6zVQyse(Q2jujREZ#?rvEd2M^6uyCv?`SU^w_+WnKJYr1+|zozx`cH zT`R@;T=qjq)gxx{QbS9u*q~rbuBh2szi;a8?JqnX_XMfG5Ln(CghUCeW+bw*q4Ztxp*arsf>$ zpcW8t>>w}bm;T2%vDL&z7Cq4#3H3A2N+Ay5-!-LSdU%sR@mK4|(2PMv(w86OrWdtH zS-}y2msoNkc4^{T%!;ihuwfV>h+gM;q|BW6Z%ob}eRlsyZ=szwVCzc-@Za%x({~5u zJT?XNzVV|eUH5~1|3KqUhS2P06k-2vKH=LhmW+ktUPcG zuzr^PwZyhsx48r@zhe2$_iTMzZaE2G`k(cKHlEMxp`J`P8c+u2o-|02Bnu_%zZsPs zvC_8EDG{64kz@F2sq}LsIR6c3^lpvD{>B(sYCwb-K+xa&{{a712f)|pKIqPgnvF{C z!o&I{W1dR%{@*+r(Mk9G^Z@v$r}OOmG@Wd;*#Fi%kAjP5(T3?FQ!0BHck3nj^zzOJ zVVwVb#%7d#-UR=%uOBrE!~b`z#r5;&0U{4(%3ac}NCyKW5Lf?M&N_ex&B8lrZI?O? z0t8e3?`ner92V_Qd&+`Pk3W(nxZg7&jreDUs%1At=?KZZAr@x{vIYBOW9*K|0Q?@% z`@lk)z_tIWDx@6azl%L~4{L4W1n}k%l>gaZ^Ne}pM)c(!-G9rVT1a+nwU0AT_}?dj zKlq;NKaoAPqW@WBfOob7Q`N$7#V&?`7p)-l7tP~Xi~8s0d5GohP1`71@;_Hm70`aS zdx=#+LIDoJ!UyTrub~+KcbpS4Sgm#J{r_yy(nfE`WBhOO$Vq!-Hl9Wa*nPJ~i~j~AO|*lv zLty{AfkLvyJzg^$LI9|-^4z$62rE@Ky z>lz}0bkNPCSP(aB)-4ZRk^)RsyE~38>i+;Mj)G)+9#S_4AG{jF4S}vP= zW75GpUlnq>@8uhP)#@X}{{CDBGI=-hH}T=i6(RHUK_}CZ=T=Rl)URxi@@pB?(b7k4 zt>-oPefgjHM>q@bwuSc-rC$LxLK zE2I|{DHU1E-1Mf`=Ebn+*A_H!$hV$j_b4_-#>?&yF3-TZv+Qlh;G~w^Ei8%aHh+$M zjSK&7*(hnV)q0$D=W2(|`G!lXbdL;| z+xCK8+SAEyLp%y?0#(h^=iko7mWvO-z3`ZOjP1XV`VoC=b(DvK)~wHSuUSbRK9l_>`8fGvypTVl;oBmfnksyL&hBaNN5OmCe9bwYXqV5N~0S zhGlJ= z!iUuaPrP3l7Q~{n-K+kz2e0!8mllU2{oDdkPCl_u)FbET>Qm2d39+U*#Fv{$wx6i( zm92?UO5Sy$>@&SbK(r65u6pclN_k}udKB9(w>htG8H>Bb_@QN_Zt3@ND`1ny=07*8 zb1HQKBlA1`oUF9*O}eR4E{|aSg*|;$+@27InQvC#+Hp->HK)wx>;stULKW6B@rxej zZ=-jyBstmxzB~#j%tNq=+C4Em3Jh4kUly|zFIwYxK)b%w-070blN7vPMLE2Z+lIC7 z>S%WCH{Kaefph-uOOVcj?+YJ=@kUd<)0_6tCtg+P%aDnVUD_&Y)wo*ho8M80Xxv5- zWUc5t$OHs0@1!M!Q8z(%N<;6{5qrH!&=TW&Z1gS*TR1pPfrU=Uzbe>4YWt_|qMFSC z-1$5G3Nu~t$TD*q_|SG~U~a0v+3t#E@3!uBHGfNoI!UkOL|50oncVO5{c_jq8?2ww z&*sNnCU}!Kvw9+w%xIgI@vA~n*Y?b^%>DW}`F?DrCBGt!N7Cx{nDpp}t>~Q2k;2>| z_pjF8an>-p=gy7Qd*LHSk#|cKE0F}`K7S=2h|onSiHn(U)q98v>%I%vK<>kbI*V** zO)L0^C8VAxxd+LXt8E@J`RJ_CzJgD8R*xmK(t9sxu4Z%@yHVs+Oz8Zs-qFe@^D~pX zK_buTl1~bm_ zSS^9^{x6{eLf`b*0PSB=d|%Duj>YUqrPZDS1^Rx7SA%U)A@`KgZxa@mfL#RlF7?yGZS|J#*^5V2oS!9wMn|csdu< z{QUv51-v)t_y;mL&?yf3jPe#|Y%tgf1$T##kqsM#-c#M@W0o@e(8}A6apv`I?~=NB z%vTdR*uQ+%$8;fTifla-$scDwr%6t^kj*~7jVN#f3I_A#rN>X%3S#Ze*4*_yp4za;Q`3!s zfdXy~Xo><>6S=b^hEq6n^8RhD+Vc`ERRx*E#JEnv0>yl%Ez|5X{zyz z8}UkBzi*~Hu|&JWgL281uFjUVxA~doP;sKDsWxY%pjK}ApWJlxF012m*Zu0Dua~UX z{%p#|PFfc^!Of_R*_i9jC9i8ME7VAd5+OH3dEfcXW)_ngtz$L60v@YP;%2uF#N?i_ zCFJ=#bE9ATWZSsf*-pDRlY)%dMn9$(e(gM2c93GGi|9m|mE?u6!7r(6uZJ&}G;rvy zR@m~_#XeUgdMKBqT|fIW=&n1Q)tMaGwM7mSne*a#aHUr3*s^XpVY%C6Ibn{MFJ$s2 zWaMTykMGkL^0&ifv2{I}3AdL_hF|tJcxj8Pb?LjS)%WZ=gl&*-bMJIdAo_}@_^{jI z_AvoCExHp_luC|2VGYlRj=fil6))7zUz%_mStld!NZe^V|BD(7aEX}iZ@tTJAq!%HVQ=94&}2?Tyo{L=1IKw z{+GAb^6S&#hkmv+cdF?xyBufDhfCJrZ9X68-arxk>FH|&d|IxRLBPJTs=ns0q#nl{z`T%DB@cNVvL*U<3|mmX-MWJ)&A=v%g3X2tM{W3+gA z_C{Pxlw;=Py(uxN@dK}cB$H3y`^pSg$PP%#RhzqFw$Uo3eAv==8N6tY*1*=1ULKC$ z=g3B>ex}QlwKnQQdZrtQh5oZ)1o`RNp%?#r@Y=)L*=1_tR$g}ZUVjYBUd*7qyDDQA*H1ZHF^V?s3| zkvs;^Xf!0KF0Ib79;Q(DSwXgViEc8Nh^P*VYZ~XW@w2xSx2ut@Bc=4f8D1e~ht}Ql zp|NZ#q9d#xRZM-BOk37m3%y{~{JdSjM}T07ALWXBA0f+gKfT(BJ5=G~E>3I!3e=R0 znm|926+IEP+D>vbfXK9{e9BC#RNK}9lEruRZU*4NxqI6u{AVf8kN7v)e4B6~9k!Bn;FZgu%>2|P*yBd$0MNXn>?nsF_65KUP<8vVY zl3h}w*}g**$N`fSktA#R%rapWvYk&&omu#Z07kRy?TtAryXoT+5@URE0|B@lETOSv z2YNl!KXQ33oayZ=0B(=gYRh$R2QGPA~xc#5=yC0n%5CHbb z`FEbsBMar8!qdcBC<)lVI}Qnbm?Urh(ahNLn|X^EyYC36NF zykg$B08wpTSNgPmzP1}AGGP0lU*ni?K`lVAEW`B>Y<(HX1BI40e^!#mQoIE`OuD-U z$X3N{zUiz&AJDx@_3jHdtF-6Y%qq`CvmM=F0M?cjfZY!Q>|Hu|#XM|itqt}Wrz$7V z>mBe#1L(g+=O^Cf&5mONfXbys8!nN$)$E*Ys-HGPX!NeW0brDTljdp{EKyf^(hPcI zIIT4G^?7-m^U59_J%M!|->mSr4N8D3Q93EM|M~Z{I|!g6qO+MwYnp46z-~}hyDP!| z=iQ#pNO{Qz2bfj&M6aU0t#u`R4yer}A6|W>5nnfeifRo*Pw=qxEg|*|gXvfdGikec z@KhT3)em#Y`vAadLxXAGt>fJGoAY0ZsylC~N=ypj^aX5LH`Sj!QZ~$G!vZWa?T;bv zkfr#Sm>aitLu{M?+4=EYA`dlSv6V31o?b&3g?49)Tm%N&7rZjoSV^F6_3s zhpwjo_pFZP^>&#e{FvwlXG%+9TnGR-)e#ldTaHsLPj9c@--)v0LLXiL9htw!N(D$k zO#s`NwROWuG3^u-lyHIqv@v!*^V!93b1f|kW`LrEH;%smEvX6a9d(nc-*xGed(zT1 zi&Su5UO`SA&{CMBP}~ux?%F#Eod@H8Gp=->>w}tE#RIs3%mc9plg&us)#Znj6PviP zC#L0~*%j2B)$7wz*_~Qg44S+m=~NJap@*^fjp&NV%E=HaWPwjWt5P=Viv^YRp!IK# zl1lC5NfHQZa!eZndBA#%CVU99;)xrh$$ykwU4vo zL1P80+KRzd+vR@W%aN3W?Am`${ic~!S&KOe)>eex6e9+J9cD@lY4fE4mU>1noy1TL zO%e;-#hWk@d|>sBQmfV9_Yu#%Hn4H^6xO3)yA@JrL7;zgvTmnyyeQpq5D5lPjgJ6| z-x)>r0ia>pZ;sUA5t1QSU!?I$cWtEEwTgR))WF2Eeh_!yF&^T4FSbG&!a4+jt>OR% zT$pA&imt>K3WjFbPi~EI$1o2D-J6&3iw+?`1(7kHMwcY@?_M(2%lUw8y%QnC{KH@xdH?~> z%Zl~>8FVMg4}1+PR+=?-g|9;f55*t=!pKeWRy5(gJP5Yua!!D8s(kxzIcd5oA^C3@ zKnt0ZBaH5u!KJE;P|UDFb>S_$8YYFxjW(Y%2#Bw}Ce@~-s&0=jBtBbfD&ftGXEp<@ zl*m0pU{~cSJ0)P@E7Rp@t~o#k)ERuaif!wHZhJtslAqduA&=Ou!O`=&EZ^ykyPBv? znAXnqY5@vDSR~1wa)3f50;T9-YvU!aLCDRf3*F9BBar^l8)l0S)EJqJe8GQMh#V`t z_4}d@sVRK9d|3*Hj-^h&WJTp=FGX2fsSiya*G-f-7GS_sg>bimL=qfm8{Hd);wEVF z8i47x3YKtyj8AlySToQUQj{-)F%<@w$G@onhg7x58Wf_vr9?#DxDT61z@I?bD=5Sy zL6oO3lps%SYOP3SOUegO%J@1_1Qt(Hn?pf!SKnwvq2_&0zI~&1Tog1efMOvwp>Chh zlarw4_|Z9#i}ZH#he2WUyZ)b4SdfCZP@sY;S6P(eWHXc?&knN1wJchp?X7zux~j3> z%7X<3;Zl2Tkc${Lj1cL1AgEg+*#3JCvPh&A){hO;sPWla^KPq?d*ZaH%x;viVl#M; z1|HL^fKK&0z^h8|qAGaz9&@MGRzD9|>zJKmIp7d70{|z%CfNDucLQiK1@2)hpT@`E zI+~1mKaNDA!R!=PtN1zpPc15N;QXn)Pq(c6&@Ou>Rvz?PHZL3saH=WOZ?hAyV#v-Z zy=dyiFDBHZz*xOfmZ99{08d^IE50p@Jt9P0QM9Sl00J!z%y?%YdPG&O4XD2@SoYTrIR^KJRs?Tl6=#J8l6kGW2}<{t1559?`ONIa@=`vO`o#8 zT!iD*WIvc>u8_XQ1XGsIWCm^_nxqPD)Hfn`ZYlv%XcLnV^Pcu(2v`vIjYFV$Bq#Q3 zpNKnO)S4OU{@Q`@2dbW(ya3Z3+0|6I+wu%M1?nRK1G&OEm^4`gE{=%$HAo6BitEpl zL#|eGHOdGO!gmx!pkF$}_#hkDZ7ANoLF6kZ;p#R&C>zIHNN@b5fQEo30GqM;c(Xhh z+)gNW*jK7sDy$0vbvC-vw;%+JjQgW^1b;SaG`+?#OIdMi8aRo_01I@B?Omt^sxvR| zQD{hLW_|$!LQ6ic3x*HCP>jt;`PJ*U@1LRqT{LYWPgr?TQx713Ud*t#+MSp@rHiU= zv@~-)pvB}D02YZIE7JThvS)o>iJsST1^f%_8kp=+5GB0efIHCjIB1mR1t%bhl~2qL zT1=Bk8x{Qze}Sb4vaey5PjoCgiP=Xnw`ftW>Mk|_Y#CFY;hy;|O)lp*ERx5`zA7TY zU^048A0)6yAE%qA&YqafEx!4tOq@K=wAe)(A3&VtGxIzr(sxRmx6r{Fp5{HPnujJ} zfV)x_ucu3Mv-*Q7D^=oL^40e&n(~Q-z2#rPM3@4aAJ&4v82NS5oV_}sg=wMW!W}-Q z?Ld;ZbNmsG1;F}n2@6CWrR_+i@o-o9?;_lxpU2z%gmQ69OPt#vPaoY)uSbE|ZDcjG z+06WF2I_VD_7{*?UngP8H~hnDjr3O<3XGTpX2dwA0X_UPH0L!=-c}kl77`rYR<^d* zt>?>-d>-rCAJ%S$bJ_SYr72-B%4$U@@GX_OMF1PH7VAcW1S7C8wRVTJS7#ltx^=3 zezcSGRqr0VM{Zz6ylABWd0uCHF&AFfk^3K`_@Ag@0j z2-lvu`>Eq^k&2=O(dxYTPWoEma6>?5V3%1BwDJ^@=lIsLZn(ZWl)Z|TR71tX{o{9V z3n`_rfxZYi#Nr%aL0Y*5`rk@G5}Yb= zs$?5+C0WRLZJG`jTSjlsf0dI4!TiV_+uBW8co;c8ABB&^PFn;VzATE+mhx?a(h4SQL|p0v1FQfRaP~KYyV{K@ZZ!;qwUi-Oq0k*= z%;`4e>B+z!bo6_e01Te^tK8+<-WKCTGYaKmu7EbtygEwJnL}IVoEJOK_)FM1G1GOl#3%KhIwo zTVc*J(L69bk8Ffud_BX z3*quYr*ecX$Qcl+hxY(rR*}=WvU=AWv)PnQqB`oRT2cMyLy#M8O@^TJ!G76-H<@8c zKhl|~RNP!fA|1e4%vOkAzymBKlG`lu)t|H@sjOdBfVdmwk$DeZUm_p(G^@);t+n;S*%a{x*gO;v5up2txJR!FL;I$`}7+{uBI_*p7 z|59(}mZ!wEuU!ge%#;>KFze|l_LjUd@4(FQD@TxP3~|B?-g}%+U4YidI69oR;%vo4 zoRV{FvO*|z%$ccROFB{idP=>1nPU6J0irtOuZuU5^AWbqx&~qPLZ|;wgHh-T$@Vx#xgrbq1x(Xq4mLmpdkos6tg>0N znN#oTS;sCoT+PCrS2qV47&cH9yjG+IF-Ml0E7iw%yyBCk#*J0^^!-=bl29E4GZEX# zwgspJD9X=z^^1_izbfy}0VyqsV=QCir8?LHzkf(CMCcaYo%u7UjlZVLmpv8&_Gq$t zP#SiS9ZIte_EX&~PkT|~XH=9(Hd|3i%fA4{s`i-7Hxf^J86wf!*6XSj);RbsDbaQi z&q)v+vmZHDty1)_)>Xy5e))fM77jOE0Lemhhc*i?4e5loM&ZNm_RkGr2?DM z;OTZT8FOBN18iB;hy_fI`82#11l(84?mCu>`AO#sI(fkS#$B5kh_9Ndla&^upZh=5 z2kcZ>@rd8l0-mM4ZN~ZFkXD1(MM1Uc!_L*(@{%M5=~0jy>5m7T@Z1u5cf4(cC5tVh z7sV-Apza(h%9U_jpa$OZ6>0j${3U>P$(n~Xd3epe#w)d_f*C*l`E&nYE6p(wPcX^& zOTW4hH(6Uh!N$fHa0-~>h|~Z(F);~dhFPh7u~xiK+p(3U&&cyslDS@X0ATyjB7#Ca z5$eSrt$EL)O13bg84Pa$Xxsyty!(EE#oZuF?l%o)V5lu2O3mh8YsF4XQK=Hdo|SS> zKn;L#U==Y)|Al!TW6Y1W1D4tvBnRMq0BF?j7XFzfEB3c58>LLR&q_7NN7;tEUeU0D zi_020^p%XH=T)@{i&rbKggrB3?8?m^6bu%@P`8PJ)9Z);^yyHQ3OU4AdJ%*eFEg6m z1uFIUzI2G7jqG$a;Hj;?YcexjG<>M(t2l7>Sd6ZylS}3g zNRX)fw~f>cw_a~5Y&BhDWu3Nd*MvR*glj(zsQ)fsRaq$^1Zq0xzjpWPSAJH=JyXE5 zedTm-JjIK-u3Q>oP(v08#+Cs_YcvpekY&BS=KG>73f~IAzft|yL!>YWs?$9-kKLgv zO^Y_iS>j5M09$0UfDnh_`p*+YzlRICKz0l2AU(7Is84;U>ORE_X6+}ksE*|t#E|}1 zGVYbJ!Irxwb%Y-LuElKGfwN-5SpgCFuaP>rf5TES9cSM32V*(VRe8 zV$h%zDD90Dric@3lleNgo#Iyj@K(UxHR1yZ6dG}+Ig9k^uE1~iIY|9jq?_Bp+zqyQ zrbXfG@qdFrQuA%kgFmVM@eS9Ks8*ttS1lGdAgoPE1eR*Si!0O6o8iN;tOL68nBii` z)hJ8ZJO~qmECc%TaLE=-WMuaWFdR(|X+73l{sSVJ>?gOb>V=I^KKfa2BX$@k6cge% zm>xm%6O@V;PJZ7dZ^HJ&+R#7s)n5{aTVga!Yec{?Ay>F;P}8Es#~|@$+ja5e{Mvx zpq~0gd=Elu0thYgqb7>@2&7q8pXhMeYr2!L zx;!`FL-+U|P!r_TLqCK8$Zj0kcV>s!1nLw3VWX_p+2HE)h;#)HabjqjjHqOv>S+?f zc;09!KaWoOhqp(`$HGSs--~ovoQ4p397COQRLpT6s(#M1u`d9{l$pXldfG|pyTxzW zWwvwbMQVuw{k~8rt^JcN2>hb&iznKmfUeiuyQW0*LE0pP{e$i4 z!6(%aZw_AJoy48h0@h&f>J`ZAd};@cO(_B&{o;(D;K`=3nECTBU*#}<$W#GoT4bz- zsY_o5vGT-&%RImu`&zW8S~dKE$&X0QT>mE3B9RB zF1JwH7mp*8@OO{dp!s$Bs^BBEN59IS(J%psBROnsc-Pmaprw#6D!YphDcJz-s@3ZK zS0L>N0xfIFy@<>>)UlkdbxFXtjmnv|8Emj{zLMnLd?~pF<($6x)`OErJGo6q_1uCVIR5Xnmj*0bRA%Sk_6lIB^K+2N!_41A&Atjx2T;q8a>=_`K+gUtGY)>+ z98p(tdTBE4#i4$xhH+w30@4z|f@ppgKzi<`h1S?L%;ek7ka}b%w_sPrmC62k%WLexJiIeQ9dmiCB(I~yF^i|2FOTJ@YGPV`_Wo#r-4;q{v8CU5nPkIDGzx}o2H4Q`LrEA06lDs*Iv~;defQaul-AkiPDAz}Iyc!-n*YiNk$3R6M}1og z6x$*wAO$uqXwj;p^wE?X`wPB;X&`Bjq+a7Q6;OaU~joxvk#=^Bw>S*{T$p9J3?QF=`#!M#*yRRs-{$1 z2^rh)0=4OY+#Lo`kz?{}Jtg89bNzzQ02MP7jP_GazClL%5#}m?QEQR1kHbhT3m$M` zIz6GBbIG0iPCll(C)_XtH~J7zso^N`@5zWh?Id9l+SZR+w_S*zgD5iTg2ywLrqRMA zh2vfEi`vcfABA(hqjPIEn==Lj!u!L<%y!d3vw72O)neeYizsI8qdvR@{O1_W1=|@4 z;0m0cgmq6mTQ~M@DecWj464$;irJOYW#6JGQ1h&1rG@5qDDyni?IgvS9|*x_ z$WMbQw4Yb$RV|oFY8XVGzB$+3JrgC2G6d4F)0BsC!Vkdo9{*4~n3a_FGaj?r7uld0 zK>`NfC9<1AkXteTm4gkSXfS_CvHZ=@O9Z(R&7h1nB_^$gZYR=wXAtlrIwxdHaIWnFS6JH{1lss2)0+kzZy*ix`jDT06x_PWTw@ccLBj0x`*Zf3DVbsr?zxvxN z=6-BIqXh>9{z`XI(lW*AdVXW48H&X~k7%|^m>2Rl+MdA3X4IPdikx-FupBY z3r*~#6kp6lMq@kUr&^B5Z?3xaAKUdR6+$M3NB7zpt7(f?mpmKj(@-o1xE4%Lrsl@A zmbRlN?}XNH-RHOxqA6QM*);$v(zV)gDht5}`N3nHdufe}8~gT6`ZxD#JCSp2){Td? ze@&1=Bh4klFj1kDkbAKaV;aLYBkzEsavWXxk5w!=yol!VRvxVnJ*J&voF z@pZ+0X(>|^DmmSKJ2rubP|*yLYEGkM(l~TeV-{%FL|s4k@D>A`79l*C=3 z^nzb02dRcu`R5m3x1T{z`aP$SS64iX$UM4~rq(oO4*kT_xL&`_bpIfsLOC$7ob_PrpR{8TbAPpci(s#T!~D45!U_QN9}~KkkK5+$dZU8 z`0{&?@*gr1Sh!Mav5ce(6f$D4wqVZV)lEF_g)>^OgD1^f*=j;3RCv1(*}D3eu&qRE zu4e3_)}fM_E)>Z;iH-Z43>MC+sbHmTejfK@6RBG)q>6Pv2F^@> z?ws-ZOME95OVw$1;lY{v_?qA@i7oOyZQXeKLt0ft;$V*iAFfQ=l6S^;mVG8o5sEMT z`U~K$a33H*Y56h7uP_5qW?!;uC)&54cX&=u^s&vEW4fO&d2-&Hl&xHDJaQCeka2!r zfE#=x;xVAPbe76*RCGrKHgG|LI%h%%4F!RALg|O-ljfBih0D~2^kiMc%KmHin~AZb zqRU-=Pwz&bf;`^1x}1^ z1{NA_bTztCl?7Xmi}9s)kaykJPg^`sy3QKiUuePX5){&F!s#$2`9WBroD=vA;f;rB zS24ph$F2p4E)madlFReLB(;O@XeX`y z`f@G10m>fs3LTjSrOKWt>W?oq{?ctPuLqvo5px6)Fz*KzrdlIiaT&BlJzW&4U# zdbdaSz91C_iI@;8zl%2R-BpYjRD%N4{lB326aC!C7uIup!l$!w?KP^dM*`OwcSWy; zTxmZA^JnPIeeLqkOw%~co|8WxvHJdLXL}`ce=x(I0#e^%BN|^4l{Cx8e9^f{t3T97 zUX1^h0zU8kk@u?m3H5ynO-v!4Zgx+Iz?wjv0$v*KE{pc3JC+sUa^aheD+Ai2^qKeT zW2JY$dtN@T&Q5o@t-1`d+X%`y>6*JazprKFuINdG(s}VG==nQ>R7BSwN%Gc^;)G=V z{Dl{w!V30k{sNz9hP?Q(?P1rElITjNKl`pPZ-uW=2sQSZ#5YXdnY6LsOX8(>8@hOR zE2fRPWiD!_P{wlJ?|$%b+NrWoq&V5UY=GWpGG=$AW{6E`OOhKSs6mloF-#lwDY$v* zFqm*%{oNO*5cCUjIP#(Im}C{1vE4mh+*&TNT?_X3#Pnyu4(YVdtjwC9h|YdLF*Sc9 zF~D52A6B8vCQSWup-c43Jk}(a_J+wk&QG?WLiH|Jg*C-gf2%?hq^F3#m>km$ocHps zukrFqH4TeKh&#l?!-^Dws<#X?Vfrny;v&oqu_Ar`4yI~Bf0%yT{*L3^H}rWGbNjeo z`L!3qBcM=p{{G2dSLCy=-Mp9dW5IX!vl7=m$LYfF^#H4*U}pt%a6bMoS1Zh;THcun z6L9zQLuaM<0E##efhtplHRJDL4L85$NNQqCuu^`nx?Nqum4>w{)Rv{>I!}2rb+_Y8 zE%-E;dg4s!%0{DV2z+mW$VrqO{T7^?4PLN^F4|aeN$=(#5*q0@VI*t$KoesUP}+Sp zb`5QxkXAftEJ;4KH&-5d?DI_PKIH)Ld3Xx&N$+2)Mxt?8Y%8hb%wytj>OBsw6`sWn z1s^FbqY0Xu9?P0pWe5j@fDs=a8K<*M-9rC+NjHDW_mW&%^BX5j8V6eT$GzMHS7)7Mm2s=V#|BM=Ui(s# zLU+g{+v3o*=@&|PTeya^CxL~S0gL&e#hxwySqPOt;(AMv-{D4sZ)q4ko+>vOUwhA z`CKf6qVLn@R2HPhI4sO>&jT~n(<_}xZ>O|f#S)My{5W5V!glxD?-qXOA{GQM6sV`?FcM-oPEw{)*R&p4YjqYfr>9 z38UPSy_80noAZ1?fNiwA)lzIA^8V)fixJaisfXr>lsv*q-u!p&?fG;hQ*ymDMHvZ;}w37K=&YR^pRmXNbpNvWBP+!;4W! zU7|uMuDv*`?rb3kkQM=x{)TQfeyjjYlFoB(923$rR&g@Np&qHslI8C0vQ8x)rGww% z^%rd%Q5RLG-?$|&3Y=za_6L+6Vcee1fD|j~CjLNtoEuAT2|L`I)-EEGd0#zAZf^3m zDezv&yYi^Tf5h3(*Buv)8IlWu%j)Ncd^QSft2muk_S|>A>@m{hE?3TJz&@|7nL24S z!xT+P{-i9bwD-J3lohVKzt!HeZ(G7cI^xA9j-sY}W|rneI}DasK!)BGQx+h}hG+Wl2(>gNY4nvt(nXq5`sq60O%*8>rI zU3716{|do`J$sQyn8RzM@YRikWfkdeZ}Y)#v{<=Fim`WaA*^_~so=*pDSYa_ohqLM zJc};AQInuj1v={6s55hEC`J8J1(V=Ls>gn6e1BJ+1c|3--!ylKZI6CGJkUCYtLyE}W&EAD5jY2L>K zV`CwWzcT?M{zk>mKFgzEh&^5Hm?0Y?WV}0+1C(RzGI}`<pPR0%!Ot3v->O~92>)czieODbsMnw)ffKOtLT6p+;Le{u zrgF;wkH+*hVAk|F?_Hj#n=^Yt=&1Ka;Ko&aWWyHeP76jLpT?$l{c2P9mojbJGet>cEX#C#^*X+M1oEtYP>j#g)aS*XQUDMImB& z-}WlCUWa>cT_Y7eHy{hhZc><8$oev|jP(+BCmK`Y`Joc^*TIV-hnpu8f*Q7M0e{qE z(BZ**XYkflpi6{1^4A^Et7*;rBj?*b?CZt6t>Uz(HJPb50yiF@Zn%ru_f>tFL??A?LKAjSelV4X`g#)NB4v{bYT*&;g+y{%LY!olId!*REw>4}{9C z&W#a%WfDzqg#Y}u9Af0M$CJmH(&v~#6#a(xL;|a5G^So!9V)TO7r#m0Q?yO!xw3Br zr;0ACtd-FjefeIS-U#s*ijm~SD2&9ZrnoHn^}U))b93w_icZq_c+sb}}Pp&bO{ zs|Ba(ibe#6Ca!Tm|MJTK`FS|u&jYNduI7$5^cD9j}yU|dUVwOxl$|Kk{_<9CK|M(L?5fO6U|C+Yy zCJKp!YLCae=XfxR+?bKE>N-QE!;FHo)k1;}RSV}Kh9_+SZ`!De!n_#jV6~^65=IR) zZKrFgQ7@%(mTnKlhVC*Y^eFFc!_w__O8px~(}{I&H_Y1m#NDE@WTGP!84G`8bNHoR z!dILxmq%`CJ6o-}NS)0JiVRV6J%juxi{~Co3sS)Asgc9|6sfT z_SAz)yHEXkxy^X(eac40Yu-{7L=PQhYYk%4_u}hfmZD@0ZIAXLf7JJqlh~LGz5*?* zmGYjS>XGs+{asfL$3YY%W>JH*4l|K8e*6&WUIiOTKiMDj*iV^I01e4!cB7~3gv71 zqkrxOWc(XwwLaR9g9}`1N}Mo!xi_N9GA#@gRdn3}D-O-Rg8HeB*@x1aTP9Nn5FFz6+;FoG$-0~w%QINNHWVqW#| z+7WU)qO|M0JTw)=7MYX(%L;Umwp35;V40lsYPTiezwd{mb^}L`dgq2$*^zMk=)HS= zvT9lvNk4FiCi(L^mkEPyCac%VhY=WxfzYpXV&7)ne|0l;gR@ro(N4mUlatUHQ|;bW z91tVH@mIb08)W+}K!SGq`DPX9dq=l*0w>2EAb_snOY6az2l z8uFl3rm}>?oqXo}i%e+{OBUloE+Hna)B&OoTVMGUK8h1uyq}NEUUQHP7cnzblR#Q< z2>0e>Gsr|;pDhdbz7BxrYg6L<)8S_xWW`Nw>dF;Oud9C$VjvDcPy&1_PGNkl>D8*C zk=cZm#C7ok9{J6*>$2gTtZ>N()salfA6p?j!*(TA*lqd*`iHt@AqRWp+1}!0ZoS6LQdmH!*6*I+RZ~mrZKcE&WZ!mgg=^F(|)Wn zL&a%s{{Z4$uQCa<|G<6PDdx^M`0kiK;3~_LTeYlaY*ZiT_Pbn{=4_5Oc;n*t5l<}k zhEIN4+ZPqi#d!fb%aIQ8m=Ulz&N>M@NYs_wFWw7*&-bS7GOVe3ATnjW^ZxKT^j&tJ zx4+&rHmz4u+HWXj%XJ`B7g#qhYUQ|Gn9<#q^({#{nQT}8S9yGXZR)vK4%Z{s)WPVY*zDdvBR z60f19uX^o4w4B%rgT?U9CRfhxkFCpYVqH&q(xx(rxY40`GI!_mjTT|UHv%ZLu-T2! z_XfduqR4>nf-OihSqwdhQJFu<6?Xd1-qdc+)?`wFZgR40Knzg8R zKn1i&gNXM+RoxRG>DHSuIWl%l#Kp{Qdb~RZaVw@#`rP4>>!$EV1&}WN6=p@1$-k=D zaJTv0evBb%m(-O6@Rmdf{QLK#COMq{Whaj^@Q_)%zznB4IcOd?_B*9A!H4iEfM5$R zMc<+uCF{$pukn$Oim}OR8kkdB<_AB{iIVI*l@%+)DJQ}-EQ0#5-2U#ZtaRdM4gf(U zucfs)VrDP`Q=hoZsEhR4TI;E?J_|87_$&uB5}$H(r8V@We+?W~Bb6RYN@1gd8X z2JFq!St3CaP5mp&+yzV!T7Ndt*O02e9#}~JZQPCB?Tn0Ds?X*1Usly{fJj(q17A#@ zmjM}w(wGNrF!?o8-AG{9DD{6OuK0V6!q&n2)df%*ON~J|k!exkjWN&f+dCQha50sE zcGqJ4lsjwIU}Z}_38ZK78!J$RhhN2&%M+S`2k{QtXBcr-PXlt!%dYa6kD9m0ciZ5} zd+P=g>VRcKA6P)A8C)bHY+R0Kj95-`pNMNkF?dsC{tIcVsF)kcSKk-@gM)s?RA58_ zT(AeHM}G>JI}0_AV%e4_{XhiYQqgogm~x;{U~$eXH;jW<_n7OUPwO9knjqr-`tc`B zaFSQV?N_MgdH~jkH9O}f>5QwPuY*5_fgdzl+UBg^#;LoZRs*TS@IwN|sDFQR^ZTR* z?+;VgW)6vhIB8wKu@#Md&{lau1JE|%$iLW}?WMVd&Y_bGtBbzhO5{Wi7Y z^X*5tGU*uM$B$CPV&u*hqX&~E_$WoU8LVME1HI5&rM%nMWz*V@fzw|gD?pfED{-E8 zTAW`+N8*nZcl8d{t`$^TBph{G=g@noebL(ek&h!`J(Z01bo6vDRIUg#v>IB0i-jmr zrfw*rKZM8B8DdKH1I_(~7d=9GSU`NTHdc&lg@%>F(_}mIx+RwN-gz!lP2sT$hU^o? zl-}v-U2etYX$SZ!$0*vZ6E(N#8h$_(QC`Hv*!FeZ~=cLbcy<|^& zwZmOQNU$xbDtYx17l}s^O(rJYV_27|B=9?p95kiM8`x4--005UQM(yC3+;E zkv{JFo?ah$`8`;u5`!=$P4M1+Onbs08nQTkB>P)M)^9#!xc(B;JS45{#gSxhjrcne zFm~tBS?TRFN???TE$CADqB@rvb5`!G$tQ)Rfd*fi`LZ$g(F-EsO9iiDaSNfcE5z+V zQck4YtF{u}{8zi-Thpo>sYs^!{(}mRyLAiUG6Ou1pWw#nC@`*A6pu~FmlB@Uu$m4c zM!*aOl3PEum-j9bdAk~Dxa>bX0SjAAHH&5;J1T|l#NqwJlK8rN!;!873My&;^uzz? zj8KEDtz}!3gK(<19Y>6*d(LV4&9~rm6fbiq zOoSc0rxsp_BVf^Hk$`||67aTd=E@}Q5E9Z?E;vW74$8jrROXF_YA_3YbQu0d8$AD{ z_DYTnDP}2gbz~(dRWd)*>LGA1W9Y#3&eVsHG~GQ>-8O8L2DHmaOi-5#eCbA0wT9lD z2jzYkV?FeSs!ksd0?=N z_Q>`t1LFU>3SDykf4YvK@dN)3ihhL|eDqK3+$`g+x@#^Bx`c0mZbP%xwroD2pBt@y z3BBcgRdCU^;^X8B<=s?#-@l%tRF0hBWHEAooCi-y9(n9G1Z1^7zBixKYHn19j`RxT zdLbR$-|+sNNIW#Gr!Kn6_+ta{UG_k7BgS?B749@h>4m6hIZJ>#b&`a9c0yYh+@oY= z%~NgQ}dh@#it|>|CRkmJNz4OYws|B|BNd6GeASE zW0mFTNa@oo?$TvZR*}-40&UAowb3(zcNT>u523SrR!Op7qoXXKlo>Um{^7WHnjd~# z9@Cst`pUl%&Ay<-KN;m_3psdZH;LRR!ALjs?X0i254V?dGN}fO@KQ<%%|B`3zC|tv zosNekEp|Q@PKfOcbM1}#pzjjyZQE)z@qLtlGjb?FX8s0#u>zlw1)~XgFT#$zK*D04 z@vkP7sYOI8bxgEsm!>FIgGEiLXQyAoGMHAL`e8URQfJ#tTM+|(?l0EnOo?P_QzFQs zOD<$_{T8ZFOndL#0nIPPO6=*#&*IAeMt1cX9FPTK)UWj6YbBQ8Gu+@aYemW4fAY^@ zQFgi?zseqtLKAuILyfN8nPwnqIX>my0GbosITWLRKBx5F!0~{$&*s(%__12~O>=M6 zG_39U`qitwVb$QnWo?#G-tUsKB2FjIms|?HsS#;KRral0nvkWqLU zsE7S#aRf@{Sy$r`-{oq909O|$l4s&rj7*|8_r1Ahn?)1hyUEoviVDtg4xUFv=VjcT zV`Tn3oTrehN_Jl_!>*Y-tR6WIcrHy}IUvSV_9>ECB z9zpw$pn5mH93H1(V_cy{l$@gHH2L>1r!jl!J-PcM4SLANI96RmWU^ZG)0Cazm#2YZ zQh!~-RZaqBcHc`9n}EImmK`s?!Vfh+XRlMdTGm-pRk7@h-J0bEds&x{G0SF^Ai0an z;7CEWCKCboQ$C{z((63#g}gh8b#x_`tGPH6hqFMSc)Wrw44*SMUXQd*Yg=T92>X0b z>$B#QQ`bYXxcnU!`g(zE(&m@OQ{Dx(X}8U+3+v0MSRv3~Rl89|Pl*)s(V-P*6cu4X zrr|V6WNN{?DM*->7YCePj|(sNZs)!upQT!<)SdME72@;FtO!+~?oFD>`{5gmFsn^5 z4F^76snnz$u+0}5g$gGQnN7s^i561rZ#!JdUrgh@< z+k78LJX;u0FW!(9s@a)%+p4nim^zs7v<4KMowW=MMsEY);GoL|F2Q{I9>&xwlqtU@ z>i4FMYniK>%+_!CN1cw7Vs!uqJzF>&lp+o2gMFjm8LFC*)aD3{{^&gMpMvT&KSQue z9SF>{2u=PU6MCcNZ!y9~wRc;pxFxIJ%JU!X$74;P$5)Haz-I5&NjcRev28bR39a}O z;y!ITU)1}?T7)jby<+@>aq!T&h`|1Ny`F*^|IN1)00o;2=nG+d{Mn(ZTcu{#3f8Ak5sNcbhp9rqan)JXnQXe_GSK0=YD~0J+gh=BxFHw29#hSC-II=W z+JA1M{qx66(}xYjkpMOH#db1eR5~Q4trKmNA9!nRJC0wF+!*l6i-UOrLCRQ43kS6Y z0Jr1*fy#DO#?+1H#0>v)T4%i?UIH8Pge#J_dAkrY`WbVgqtkQc)aN;iZuf zYEvc6B7&V}vpy2@a20iAiaLU7?Ne!NUHcg8IQ~1-BDg(rXKd!1lTcz;e{Pog2D)0g z*^wHWai6c>{tifCr!0bsWYzF-PTL44W$q*H0H#w7ZG4qdMSjDAcclvh(S3#?wsbQs zFNwbLe||Ncx38tcLuoJe8Xx7?k@JX?%sH}wXw-oP5;@B?eWb5)e*qeOhL`=gTq5+l zm`CJ7W0>&U^QJQ`H=f4TJprZLu27JeX6fa)I2ozLts>lc^#<~OJe5S$;R$SOPmd5; n5GzZq4y3pJ|9-YFQZ9_WFii=`3jq?xL7;~Z9^J3dgh&1#RD!zS literal 0 HcmV?d00001 diff --git a/feature/bookmarks/src/main/res/drawable/img_empty_bookmarks.xml b/feature/bookmarks/src/main/res/drawable/img_empty_bookmarks.xml deleted file mode 100644 index b9e2f2963..000000000 --- a/feature/bookmarks/src/main/res/drawable/img_empty_bookmarks.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - From 19efc1b5e8438f4d707dff1b1da26663c413a565 Mon Sep 17 00:00:00 2001 From: Angie Sasmita Date: Thu, 19 Jan 2023 19:51:17 +0800 Subject: [PATCH 16/37] Fix Spotless issue manually Change-Id: Icd560e6ceaaeee0a6f502fe49b3403ab07f926ef --- .../component/DynamicAsyncImage.kt | 20 +++++++++---------- .../core/designsystem/theme/Tint.kt | 18 ++++++++--------- .../feature/bookmarks/BookmarksScreen.kt | 2 +- .../feature/settings/SettingsDialogTest.kt | 6 ++++-- 4 files changed, 24 insertions(+), 22 deletions(-) diff --git a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/DynamicAsyncImage.kt b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/DynamicAsyncImage.kt index 9ebd898cb..26f80989f 100644 --- a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/DynamicAsyncImage.kt +++ b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/DynamicAsyncImage.kt @@ -1,17 +1,17 @@ /* * Copyright 2023 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 + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * https://www.apache.org/licenses/LICENSE-2.0 + * https://www.apache.org/licenses/LICENSE-2.0 * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package com.google.samples.apps.nowinandroid.core.designsystem.component @@ -38,7 +38,7 @@ fun DynamicAsyncImage( placeholder = placeholder, model = imageUrl, contentDescription = contentDescription, - colorFilter = if(iconTint != null) ColorFilter.tint(iconTint) else null, + colorFilter = if (iconTint != null) ColorFilter.tint(iconTint) else null, modifier = modifier ) } diff --git a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/theme/Tint.kt b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/theme/Tint.kt index 72f344103..848c8d8f5 100644 --- a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/theme/Tint.kt +++ b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/theme/Tint.kt @@ -1,17 +1,17 @@ /* * Copyright 2023 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 + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * https://www.apache.org/licenses/LICENSE-2.0 + * https://www.apache.org/licenses/LICENSE-2.0 * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package com.google.samples.apps.nowinandroid.core.designsystem.theme diff --git a/feature/bookmarks/src/main/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreen.kt b/feature/bookmarks/src/main/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreen.kt index eed7be1ff..4531942bb 100644 --- a/feature/bookmarks/src/main/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreen.kt +++ b/feature/bookmarks/src/main/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreen.kt @@ -148,7 +148,7 @@ private fun EmptyState(modifier: Modifier = Modifier) { Image( modifier = Modifier.fillMaxWidth(), painter = painterResource(id = R.drawable.img_empty_bookmarks), - colorFilter = if(iconTint != null) ColorFilter.tint(iconTint) else null, + colorFilter = if (iconTint != null) ColorFilter.tint(iconTint) else null, contentDescription = null ) diff --git a/feature/settings/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsDialogTest.kt b/feature/settings/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsDialogTest.kt index ecaacb32d..4643362ff 100644 --- a/feature/settings/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsDialogTest.kt +++ b/feature/settings/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsDialogTest.kt @@ -130,7 +130,8 @@ class SettingsDialogTest { ) } - composeTestRule.onNodeWithText(getString(R.string.dynamic_color_preference)).assertDoesNotExist() + composeTestRule.onNodeWithText(getString(R.string.dynamic_color_preference)) + .assertDoesNotExist() composeTestRule.onNodeWithText(getString(R.string.dynamic_color_yes)).assertDoesNotExist() composeTestRule.onNodeWithText(getString(R.string.dynamic_color_no)).assertDoesNotExist() } @@ -153,7 +154,8 @@ class SettingsDialogTest { ) } - composeTestRule.onNodeWithText(getString(R.string.dynamic_color_preference)).assertDoesNotExist() + composeTestRule.onNodeWithText(getString(R.string.dynamic_color_preference)) + .assertDoesNotExist() composeTestRule.onNodeWithText(getString(R.string.dynamic_color_yes)).assertDoesNotExist() composeTestRule.onNodeWithText(getString(R.string.dynamic_color_no)).assertDoesNotExist() } From dbbe8ffecba40e3c93e8db2ff6eb9ac16af8d16c Mon Sep 17 00:00:00 2001 From: Angie Sasmita Date: Fri, 20 Jan 2023 09:44:39 +0800 Subject: [PATCH 17/37] Small fix for naming and boolean logic Change-Id: I3dd291bdd581494574c557329bf23f5ed07af0bb --- .../apps/nowinandroid/core/designsystem/ThemeTest.kt | 6 +++--- .../apps/nowinandroid/feature/settings/SettingsDialog.kt | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/core/designsystem/src/androidTest/java/com/google/samples/apps/nowinandroid/core/designsystem/ThemeTest.kt b/core/designsystem/src/androidTest/java/com/google/samples/apps/nowinandroid/core/designsystem/ThemeTest.kt index fa227e358..a047d838b 100644 --- a/core/designsystem/src/androidTest/java/com/google/samples/apps/nowinandroid/core/designsystem/ThemeTest.kt +++ b/core/designsystem/src/androidTest/java/com/google/samples/apps/nowinandroid/core/designsystem/ThemeTest.kt @@ -112,7 +112,7 @@ class ThemeTest { assertEquals(gradientColors, LocalGradientColors.current) val backgroundTheme = defaultBackgroundTheme(colorScheme) assertEquals(backgroundTheme, LocalBackgroundTheme.current) - val tintTheme = dynamicTintTheme(colorScheme) + val tintTheme = dynamicTintThemeWithFallback(colorScheme) assertEquals(tintTheme, LocalTintTheme.current) } } @@ -132,7 +132,7 @@ class ThemeTest { assertEquals(gradientColors, LocalGradientColors.current) val backgroundTheme = defaultBackgroundTheme(colorScheme) assertEquals(backgroundTheme, LocalBackgroundTheme.current) - val tintTheme = dynamicTintTheme(colorScheme) + val tintTheme = dynamicTintThemeWithFallback(colorScheme) assertEquals(tintTheme, LocalTintTheme.current) } } @@ -267,7 +267,7 @@ class ThemeTest { return TintTheme() } - private fun dynamicTintTheme(colorScheme: ColorScheme): TintTheme { + private fun dynamicTintThemeWithFallback(colorScheme: ColorScheme): TintTheme { return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { TintTheme(colorScheme.primary) } else { diff --git a/feature/settings/src/main/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsDialog.kt b/feature/settings/src/main/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsDialog.kt index b2d7ab429..a824c1db3 100644 --- a/feature/settings/src/main/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsDialog.kt +++ b/feature/settings/src/main/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsDialog.kt @@ -98,7 +98,7 @@ fun SettingsDialog( * height recalculation during recomposition. This, however, causes * Dialog's to occupy full width in Compact mode. Therefore max width * is configured below. This should be removed when there's fix to - * b/221643630 + * https://issuetracker.google.com/issues/221643630 */ AlertDialog( properties = DialogProperties(usePlatformDefaultWidth = false), @@ -174,12 +174,12 @@ private fun SettingsPanel( Column(Modifier.selectableGroup()) { SettingsDialogThemeChooserRow( text = stringResource(string.dynamic_color_yes), - selected = settings.useDynamicColor == true, + selected = settings.useDynamicColor, onClick = { onChangeDynamicColorPreference(true) } ) SettingsDialogThemeChooserRow( text = stringResource(string.dynamic_color_no), - selected = settings.useDynamicColor == false, + selected = !settings.useDynamicColor, onClick = { onChangeDynamicColorPreference(false) } ) } From 46c1d510d49529d1aed1aeb194dac759c5395ac4 Mon Sep 17 00:00:00 2001 From: Mohsen Rzna Date: Fri, 20 Jan 2023 04:40:03 +0100 Subject: [PATCH 18/37] Android-CI workflow -> GMD refactor (#537) This PR is about updating the operating system to macOS-12 as the previous one was going to be deprecated, as well as updating the checkout to v3 to avoid the warnings in the panel; adding setup SDK action to accept the license which was missing from the beginning. I also added imports instead of adding them directly with the codes. As a reference, there was another PR with a similar topic, but it wasn't complete: #483 --- .github/workflows/AndroidCIWithGmd.yaml | 36 ++++++++++++++----------- app/build.gradle.kts | 3 ++- core/database/build.gradle.kts | 8 ++++-- feature/bookmarks/build.gradle.kts | 5 +++- feature/foryou/build.gradle.kts | 5 +++- feature/interests/build.gradle.kts | 5 +++- feature/settings/build.gradle.kts | 5 +++- feature/topic/build.gradle.kts | 5 +++- 8 files changed, 48 insertions(+), 24 deletions(-) diff --git a/.github/workflows/AndroidCIWithGmd.yaml b/.github/workflows/AndroidCIWithGmd.yaml index fb01ab1e8..6721d3aa0 100644 --- a/.github/workflows/AndroidCIWithGmd.yaml +++ b/.github/workflows/AndroidCIWithGmd.yaml @@ -9,23 +9,27 @@ on: jobs: android-ci: - runs-on: macos-latest + runs-on: macos-12 steps: - - uses: actions/setup-java@v3 - with: - distribution: 'zulu' - java-version: '11' - - uses: actions/checkout@v2 + - uses: actions/setup-java@v3 + with: + distribution: 'zulu' + java-version: '11' + - uses: actions/checkout@v3 - - name: Run instrumented tests with GMD - continue-on-error: true - run: ./gradlew cleanManagedDevices --unused-only && ./gradlew pixel4api30DemoDebugAndroidTest -Dorg.gradle.workers.max=1 -Pandroid.testoptions.manageddevices.emulator.gpu="swiftshader_indirect" -Pandroid.experimental.testOptions.managedDevices.emulator.showKernelLogging=true --info + - name: Setup Android SDK + uses: android-actions/setup-android@v2 - - name: Upload test reports - if: success() || failure() - uses: actions/upload-artifact@v3 - with: - name: test-reports - path: | - '**/*/build/reports/androidTests/' + - name: Run instrumented tests with GMD + run: ./gradlew cleanManagedDevices --unused-only && + ./gradlew pixel4api30DemoDebugAndroidTest -Dorg.gradle.workers.max=1 + -Pandroid.testoptions.manageddevices.emulator.gpu="swiftshader_indirect" -Pandroid.experimental.testOptions.managedDevices.emulator.showKernelLogging=true --info + + - name: Upload test reports + if: success() || failure() + uses: actions/upload-artifact@v3 + with: + name: test-reports + path: | + '**/*/build/reports/androidTests/' diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 3cc48f284..b52d54d12 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -14,6 +14,7 @@ * limitations under the License. */ import com.google.samples.apps.nowinandroid.NiaBuildType +import com.android.build.api.dsl.ManagedVirtualDevice plugins { id("nowinandroid.android.application") @@ -76,7 +77,7 @@ android { // TODO: Convert it as a convention plugin once Flamingo goes out (https://github.com/android/nowinandroid/issues/523) managedDevices { devices { - maybeCreate("pixel4api30").apply { + maybeCreate("pixel4api30").apply { device = "Pixel 4" apiLevel = 30 // ATDs currently support only API level 30. diff --git a/core/database/build.gradle.kts b/core/database/build.gradle.kts index 1177ae0f5..79fd4ded9 100644 --- a/core/database/build.gradle.kts +++ b/core/database/build.gradle.kts @@ -13,6 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + +import com.android.build.api.dsl.ManagedVirtualDevice + // TODO: Remove once https://youtrack.jetbrains.com/issue/KTIJ-19369 is fixed @Suppress("DSL_SCOPE_VIOLATION") plugins { @@ -31,7 +34,8 @@ android { arg("room.schemaLocation", "$projectDir/schemas") } - testInstrumentationRunner = "com.google.samples.apps.nowinandroid.core.testing.NiaTestRunner" + testInstrumentationRunner = + "com.google.samples.apps.nowinandroid.core.testing.NiaTestRunner" } namespace = "com.google.samples.apps.nowinandroid.core.database" @@ -39,7 +43,7 @@ android { // TODO: Convert it as a convention plugin once Flamingo goes out (https://github.com/android/nowinandroid/issues/523) managedDevices { devices { - maybeCreate("pixel4api30").apply { + maybeCreate("pixel4api30").apply { device = "Pixel 4" apiLevel = 30 // ATDs currently support only API level 30. diff --git a/feature/bookmarks/build.gradle.kts b/feature/bookmarks/build.gradle.kts index 18212ba4a..2bbeec9a1 100644 --- a/feature/bookmarks/build.gradle.kts +++ b/feature/bookmarks/build.gradle.kts @@ -13,6 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + +import com.android.build.api.dsl.ManagedVirtualDevice + plugins { id("nowinandroid.android.feature") id("nowinandroid.android.library.compose") @@ -26,7 +29,7 @@ android { // TODO: Convert it as a convention plugin once Flamingo goes out (https://github.com/android/nowinandroid/issues/523) managedDevices { devices { - maybeCreate("pixel4api30").apply { + maybeCreate("pixel4api30").apply { device = "Pixel 4" apiLevel = 30 // ATDs currently support only API level 30. diff --git a/feature/foryou/build.gradle.kts b/feature/foryou/build.gradle.kts index 84fe81ff0..59e0cc904 100644 --- a/feature/foryou/build.gradle.kts +++ b/feature/foryou/build.gradle.kts @@ -13,6 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + +import com.android.build.api.dsl.ManagedVirtualDevice + plugins { id("nowinandroid.android.feature") id("nowinandroid.android.library.compose") @@ -26,7 +29,7 @@ android { // TODO: Convert it as a convention plugin once Flamingo goes out (https://github.com/android/nowinandroid/issues/523) managedDevices { devices { - maybeCreate("pixel4api30").apply { + maybeCreate("pixel4api30").apply { device = "Pixel 4" apiLevel = 30 // ATDs currently support only API level 30. diff --git a/feature/interests/build.gradle.kts b/feature/interests/build.gradle.kts index 477093d2b..8fd9dcd8d 100644 --- a/feature/interests/build.gradle.kts +++ b/feature/interests/build.gradle.kts @@ -13,6 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + +import com.android.build.api.dsl.ManagedVirtualDevice + plugins { id("nowinandroid.android.feature") id("nowinandroid.android.library.compose") @@ -25,7 +28,7 @@ android { // TODO: Convert it as a convention plugin once Flamingo goes out (https://github.com/android/nowinandroid/issues/523) managedDevices { devices { - maybeCreate("pixel4api30").apply { + maybeCreate("pixel4api30").apply { device = "Pixel 4" apiLevel = 30 // ATDs currently support only API level 30. diff --git a/feature/settings/build.gradle.kts b/feature/settings/build.gradle.kts index 3fbe1cef8..41dee24dc 100644 --- a/feature/settings/build.gradle.kts +++ b/feature/settings/build.gradle.kts @@ -13,6 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + +import com.android.build.api.dsl.ManagedVirtualDevice + plugins { id("nowinandroid.android.feature") id("nowinandroid.android.library.compose") @@ -26,7 +29,7 @@ android { // TODO: Convert it as a convention plugin once Flamingo goes out (https://github.com/android/nowinandroid/issues/523) managedDevices { devices { - maybeCreate("pixel4api30").apply { + maybeCreate("pixel4api30").apply { device = "Pixel 4" apiLevel = 30 // ATDs currently support only API level 30. diff --git a/feature/topic/build.gradle.kts b/feature/topic/build.gradle.kts index 76e803b67..48e2563f8 100644 --- a/feature/topic/build.gradle.kts +++ b/feature/topic/build.gradle.kts @@ -13,6 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + +import com.android.build.api.dsl.ManagedVirtualDevice + plugins { id("nowinandroid.android.feature") id("nowinandroid.android.library.compose") @@ -26,7 +29,7 @@ android { // TODO: Convert it as a convention plugin once Flamingo goes out (https://github.com/android/nowinandroid/issues/523) managedDevices { devices { - maybeCreate("pixel4api30").apply { + maybeCreate("pixel4api30").apply { device = "Pixel 4" apiLevel = 30 // ATDs currently support only API level 30. From 3d524d95ccdcc014e133ebd0d73550190b4c5405 Mon Sep 17 00:00:00 2001 From: mlykotom Date: Mon, 23 Jan 2023 10:53:00 +0100 Subject: [PATCH 19/37] Fix selecting topics Change-Id: I958ad68ead1dffce0916dd5d6b7bff275b201fc7 --- .../apps/nowinandroid/foryou/ForYouActions.kt | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ForYouActions.kt b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ForYouActions.kt index b407dfcb1..5e4952fbb 100644 --- a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ForYouActions.kt +++ b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ForYouActions.kt @@ -44,11 +44,20 @@ fun MacrobenchmarkScope.forYouSelectTopics(recheckTopicsIfChecked: Boolean = fal topics.setGestureMargins(horizontalMargin, 0, horizontalMargin, 0) // Select some topics to show some feed content - repeat(3) { index -> + var index = 0 + var visited = 0 + + while (visited < 3) { // Selecting some topics, which will populate items in the feed. val topic = topics.children[index % topics.childCount] // Find the checkable element to figure out whether it's checked or not val topicCheckIcon = topic.findObject(By.checkable(true)) + // Topic icon may not be visible if it's out of the screen boundaries + // If that's the case, let's try another index + if (topicCheckIcon == null) { + index++ + continue + } when { // Topic wasn't checked, so just do that @@ -69,6 +78,9 @@ fun MacrobenchmarkScope.forYouSelectTopics(recheckTopicsIfChecked: Boolean = fal // Topic is checked, but we don't recheck it } } + + index++ + visited++ } } From 257d3e5c70e8f25a078638c66cd3e57dff342933 Mon Sep 17 00:00:00 2001 From: Angie Sasmita Date: Wed, 25 Jan 2023 17:51:15 +0800 Subject: [PATCH 20/37] change the bookmark image to SVG Change-Id: I995faf3ac437cf78c7c447801a969fab01dbc85d --- .../main/res/drawable/img_empty_bookmarks.xml | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 feature/bookmarks/src/main/res/drawable/img_empty_bookmarks.xml diff --git a/feature/bookmarks/src/main/res/drawable/img_empty_bookmarks.xml b/feature/bookmarks/src/main/res/drawable/img_empty_bookmarks.xml new file mode 100644 index 000000000..2a9d0b14e --- /dev/null +++ b/feature/bookmarks/src/main/res/drawable/img_empty_bookmarks.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + From f28d7f0eefd22120176f3adbf0277cf764f597a0 Mon Sep 17 00:00:00 2001 From: Angie Sasmita Date: Wed, 25 Jan 2023 17:56:34 +0800 Subject: [PATCH 21/37] change the bookmark image to SVG Change-Id: I2a9ae27d338127ab2a7b2b90ecff5b565fe5bd1a --- .../main/res/drawable/img_empty_bookmarks.png | Bin 24325 -> 0 bytes .../main/res/drawable/img_empty_bookmarks.xml | 16 ++++++++++++++++ 2 files changed, 16 insertions(+) delete mode 100644 feature/bookmarks/src/main/res/drawable/img_empty_bookmarks.png diff --git a/feature/bookmarks/src/main/res/drawable/img_empty_bookmarks.png b/feature/bookmarks/src/main/res/drawable/img_empty_bookmarks.png deleted file mode 100644 index 4755a9ec0716f02f2139f9e6a7eb765412dc85a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24325 zcmaHSbyyVd_x9}4DXoAAf=Gk3G}57Tw=|NH(hGt#0O%WhFT+0Dyx3LIGTC@XyJ+=_~LL zo|}@P2LKR||NDgi8Ceg&FCiXUiZVde_`|>82TZ#cuU-H^?MH%}*H{2xmZ2>7LgyU> z)w%r9TG@Nvhq2sN3YTCj{Iy}S4KHm9rgp;f)&|SXuyA7?vBAj1!pXpSU5m2JmcKlgz8txpOD|pMH_I<53>+pn?CtpFFB$gjv3NSHP19dL)&^ zRo3O{z~R@Q4J3l5W_!u6>;Inpo$s?%ZO#hpoWIPkE1RI)yj|Xb*9;#OA-&Ed+L51^ zv;C#=ktKP={_CofA^vaU7nm}-$_P(t-Eka8cADNkw<#Nluo~>-p{vjH!>9Z|&MQ1sFsy7|=0n`8N za@nPXiQ85)q|Lsw1QQm_&$aZVw!2}JrkXauTQ5H=S?gzz#HI}gz}punI}z-IbVe3W zj18wR+)5J%tvTgVKq+7nd6c)VH-jF>qf1HznUjx~gY8egh~`fY3e5ge6fIg)-0;*J zic!*fi=Q(GM&Y`gaFg8vX z5U?i^)!S{SIO<+Nw)tVaHif{jFd*0N?sm_vZ?CU&Jam0&KY#j@0=32+8X5Rhj2IvB zDDQ4IRbB4y_4vvHpLNp2yS(>RAxVjqN-dwrlzlKwsS|ho_Z;r(!ubBQ4`}6Ey0*`~ zGG+39x8RuUxm9#JlR&a!I8#PYy`N&b=HsEvrnSc``iq`Ct997GMU31qn-OK=VHSt+ znB8G6)87>yV?K#f@_0MvH+{}Uj_h(lh{0`tA3okSP?}vd$s#YT67n2K)m7BQp zldpF!ZbEnhBT*BE)&dUnBM*PIy2Mp=a9?)JORV81*(jtug3M+JDWV;>mg1!ZjYcm` z@hNJ1TJup^iv~4lKltqQsfvk0?Kjap%!@sT^eaMCOm=r9-pQbg? zs33T&>zfYgJ4;UJN9%zHc)LOog@1mj*`QnRg;krtsxWrqN@v#HgIua|%E&i+_gM7v zhBPi5=~y!^ZZ&m&r=cZK`w~gF`=8pn_I*5u*(jguXZb4ys_mKugbI}G1vuM$_v3MP z9X6bc+G$x&wWr^+_r2we`(TsQoAYb3Yf>-(sR^C)T&y{{hV5SaRPR)6vXbXZa_Mo0 zI+vwmtJ3e7UoPA`<+A&z7CNg- z(wEkD@V9XF$wd`fsOxfL{%zBN3xwMw^&_;W7uBV>iIrh^Ri4)E`8hmlA9Yx zf6U3e02gC6=knT#D0I^qck^;z&|Q)csRQl89IJ?M9;W9G0b3#2!u>V{Wy77U6}0z= z8lL^)v2$x$$2^uJfR8Zyh0lw8>n|~z7`;XyOiOnu9<`KOZPkR{VEd&xpMT9syW)>$ zCVfNaRuQm8vv=z5w*6T`*HDH}UX7&#zvmJA{`E^Ak@N4O5vZnLIs5H;LxDv~tP>KOSP-;xSi+SQ;mb$)V zNl1;&R`)3feRM`_c4yL^^Z@jmrH$NhG2S}16PJJXj~%Z*ul~!j9j=0B3!C9p-EzxZ zf~kuVIq&_mmypspRliJFeA(K$Q2``n9?;xWc{ORHQl+hP!zQkUMXYG$?;;^W+5%Px z$+=38b01dpD=K^c<0-#$v=*^~tMi|i5Kf?7?b8xtsl?(vHNy4F7&uB#yYRvJBloJE z_-NE0qa#Ip@5^bsn9bYvLt{|~ zKZDsh0Y4i!;iAfm%y=WJ0DE=n^VS%XZ?}QiOdCJE*REfl2T+O(G*|LVj$CGG7;D$s z37*_6PPmn6C5xriNKR1RPWg8|CPxR*{(*w<$xh5+uE&*l661Z7ul9JVp)4Rfx4J%d zIko(3QULxPH-MW#2m2ao%KXW7x zu2$z8exy3QNMz~=SnT@lqp-Q5uzY^t@VAz<{wR3_)hjcnOc}QnJRzuISv=8*e<6C9 zw9odf4)wQwpFg#_7O5nDj%vcn&19P{w#-eeuU>SWd2jscIQQ#Y>QQ}#^xQvIq%rZ= zhUwk;JH!WS)D&!v=lMs>&UI@Z7~Q(piH{s%<8OtxnD>}B{oCfef~pf~TtA5cSQhs* z?mg<@Q$cV!a6wRy4u#jSxi0Av_aPqDHar+DLmEFvVxe>6r_}Axq4Q2lBv1XZ{U=-p zympM;iLuA0bROeAcUtQbi|=!v*-}4Hn)`Jc9j>HKBRBkEw3U>NCRt~ zN#@DBxIw|rXrof1@IHrz#g4_0*u2y9sPNX5&%_d4JpccLS8WlX48V`%d+t4*B z7h7Y6zVQyse(Q2jujREZ#?rvEd2M^6uyCv?`SU^w_+WnKJYr1+|zozx`cH zT`R@;T=qjq)gxx{QbS9u*q~rbuBh2szi;a8?JqnX_XMfG5Ln(CghUCeW+bw*q4Ztxp*arsf>$ zpcW8t>>w}bm;T2%vDL&z7Cq4#3H3A2N+Ay5-!-LSdU%sR@mK4|(2PMv(w86OrWdtH zS-}y2msoNkc4^{T%!;ihuwfV>h+gM;q|BW6Z%ob}eRlsyZ=szwVCzc-@Za%x({~5u zJT?XNzVV|eUH5~1|3KqUhS2P06k-2vKH=LhmW+ktUPcG zuzr^PwZyhsx48r@zhe2$_iTMzZaE2G`k(cKHlEMxp`J`P8c+u2o-|02Bnu_%zZsPs zvC_8EDG{64kz@F2sq}LsIR6c3^lpvD{>B(sYCwb-K+xa&{{a712f)|pKIqPgnvF{C z!o&I{W1dR%{@*+r(Mk9G^Z@v$r}OOmG@Wd;*#Fi%kAjP5(T3?FQ!0BHck3nj^zzOJ zVVwVb#%7d#-UR=%uOBrE!~b`z#r5;&0U{4(%3ac}NCyKW5Lf?M&N_ex&B8lrZI?O? z0t8e3?`ner92V_Qd&+`Pk3W(nxZg7&jreDUs%1At=?KZZAr@x{vIYBOW9*K|0Q?@% z`@lk)z_tIWDx@6azl%L~4{L4W1n}k%l>gaZ^Ne}pM)c(!-G9rVT1a+nwU0AT_}?dj zKlq;NKaoAPqW@WBfOob7Q`N$7#V&?`7p)-l7tP~Xi~8s0d5GohP1`71@;_Hm70`aS zdx=#+LIDoJ!UyTrub~+KcbpS4Sgm#J{r_yy(nfE`WBhOO$Vq!-Hl9Wa*nPJ~i~j~AO|*lv zLty{AfkLvyJzg^$LI9|-^4z$62rE@Ky z>lz}0bkNPCSP(aB)-4ZRk^)RsyE~38>i+;Mj)G)+9#S_4AG{jF4S}vP= zW75GpUlnq>@8uhP)#@X}{{CDBGI=-hH}T=i6(RHUK_}CZ=T=Rl)URxi@@pB?(b7k4 zt>-oPefgjHM>q@bwuSc-rC$LxLK zE2I|{DHU1E-1Mf`=Ebn+*A_H!$hV$j_b4_-#>?&yF3-TZv+Qlh;G~w^Ei8%aHh+$M zjSK&7*(hnV)q0$D=W2(|`G!lXbdL;| z+xCK8+SAEyLp%y?0#(h^=iko7mWvO-z3`ZOjP1XV`VoC=b(DvK)~wHSuUSbRK9l_>`8fGvypTVl;oBmfnksyL&hBaNN5OmCe9bwYXqV5N~0S zhGlJ= z!iUuaPrP3l7Q~{n-K+kz2e0!8mllU2{oDdkPCl_u)FbET>Qm2d39+U*#Fv{$wx6i( zm92?UO5Sy$>@&SbK(r65u6pclN_k}udKB9(w>htG8H>Bb_@QN_Zt3@ND`1ny=07*8 zb1HQKBlA1`oUF9*O}eR4E{|aSg*|;$+@27InQvC#+Hp->HK)wx>;stULKW6B@rxej zZ=-jyBstmxzB~#j%tNq=+C4Em3Jh4kUly|zFIwYxK)b%w-070blN7vPMLE2Z+lIC7 z>S%WCH{Kaefph-uOOVcj?+YJ=@kUd<)0_6tCtg+P%aDnVUD_&Y)wo*ho8M80Xxv5- zWUc5t$OHs0@1!M!Q8z(%N<;6{5qrH!&=TW&Z1gS*TR1pPfrU=Uzbe>4YWt_|qMFSC z-1$5G3Nu~t$TD*q_|SG~U~a0v+3t#E@3!uBHGfNoI!UkOL|50oncVO5{c_jq8?2ww z&*sNnCU}!Kvw9+w%xIgI@vA~n*Y?b^%>DW}`F?DrCBGt!N7Cx{nDpp}t>~Q2k;2>| z_pjF8an>-p=gy7Qd*LHSk#|cKE0F}`K7S=2h|onSiHn(U)q98v>%I%vK<>kbI*V** zO)L0^C8VAxxd+LXt8E@J`RJ_CzJgD8R*xmK(t9sxu4Z%@yHVs+Oz8Zs-qFe@^D~pX zK_buTl1~bm_ zSS^9^{x6{eLf`b*0PSB=d|%Duj>YUqrPZDS1^Rx7SA%U)A@`KgZxa@mfL#RlF7?yGZS|J#*^5V2oS!9wMn|csdu< z{QUv51-v)t_y;mL&?yf3jPe#|Y%tgf1$T##kqsM#-c#M@W0o@e(8}A6apv`I?~=NB z%vTdR*uQ+%$8;fTifla-$scDwr%6t^kj*~7jVN#f3I_A#rN>X%3S#Ze*4*_yp4za;Q`3!s zfdXy~Xo><>6S=b^hEq6n^8RhD+Vc`ERRx*E#JEnv0>yl%Ez|5X{zyz z8}UkBzi*~Hu|&JWgL281uFjUVxA~doP;sKDsWxY%pjK}ApWJlxF012m*Zu0Dua~UX z{%p#|PFfc^!Of_R*_i9jC9i8ME7VAd5+OH3dEfcXW)_ngtz$L60v@YP;%2uF#N?i_ zCFJ=#bE9ATWZSsf*-pDRlY)%dMn9$(e(gM2c93GGi|9m|mE?u6!7r(6uZJ&}G;rvy zR@m~_#XeUgdMKBqT|fIW=&n1Q)tMaGwM7mSne*a#aHUr3*s^XpVY%C6Ibn{MFJ$s2 zWaMTykMGkL^0&ifv2{I}3AdL_hF|tJcxj8Pb?LjS)%WZ=gl&*-bMJIdAo_}@_^{jI z_AvoCExHp_luC|2VGYlRj=fil6))7zUz%_mStld!NZe^V|BD(7aEX}iZ@tTJAq!%HVQ=94&}2?Tyo{L=1IKw z{+GAb^6S&#hkmv+cdF?xyBufDhfCJrZ9X68-arxk>FH|&d|IxRLBPJTs=ns0q#nl{z`T%DB@cNVvL*U<3|mmX-MWJ)&A=v%g3X2tM{W3+gA z_C{Pxlw;=Py(uxN@dK}cB$H3y`^pSg$PP%#RhzqFw$Uo3eAv==8N6tY*1*=1ULKC$ z=g3B>ex}QlwKnQQdZrtQh5oZ)1o`RNp%?#r@Y=)L*=1_tR$g}ZUVjYBUd*7qyDDQA*H1ZHF^V?s3| zkvs;^Xf!0KF0Ib79;Q(DSwXgViEc8Nh^P*VYZ~XW@w2xSx2ut@Bc=4f8D1e~ht}Ql zp|NZ#q9d#xRZM-BOk37m3%y{~{JdSjM}T07ALWXBA0f+gKfT(BJ5=G~E>3I!3e=R0 znm|926+IEP+D>vbfXK9{e9BC#RNK}9lEruRZU*4NxqI6u{AVf8kN7v)e4B6~9k!Bn;FZgu%>2|P*yBd$0MNXn>?nsF_65KUP<8vVY zl3h}w*}g**$N`fSktA#R%rapWvYk&&omu#Z07kRy?TtAryXoT+5@URE0|B@lETOSv z2YNl!KXQ33oayZ=0B(=gYRh$R2QGPA~xc#5=yC0n%5CHbb z`FEbsBMar8!qdcBC<)lVI}Qnbm?Urh(ahNLn|X^EyYC36NF zykg$B08wpTSNgPmzP1}AGGP0lU*ni?K`lVAEW`B>Y<(HX1BI40e^!#mQoIE`OuD-U z$X3N{zUiz&AJDx@_3jHdtF-6Y%qq`CvmM=F0M?cjfZY!Q>|Hu|#XM|itqt}Wrz$7V z>mBe#1L(g+=O^Cf&5mONfXbys8!nN$)$E*Ys-HGPX!NeW0brDTljdp{EKyf^(hPcI zIIT4G^?7-m^U59_J%M!|->mSr4N8D3Q93EM|M~Z{I|!g6qO+MwYnp46z-~}hyDP!| z=iQ#pNO{Qz2bfj&M6aU0t#u`R4yer}A6|W>5nnfeifRo*Pw=qxEg|*|gXvfdGikec z@KhT3)em#Y`vAadLxXAGt>fJGoAY0ZsylC~N=ypj^aX5LH`Sj!QZ~$G!vZWa?T;bv zkfr#Sm>aitLu{M?+4=EYA`dlSv6V31o?b&3g?49)Tm%N&7rZjoSV^F6_3s zhpwjo_pFZP^>&#e{FvwlXG%+9TnGR-)e#ldTaHsLPj9c@--)v0LLXiL9htw!N(D$k zO#s`NwROWuG3^u-lyHIqv@v!*^V!93b1f|kW`LrEH;%smEvX6a9d(nc-*xGed(zT1 zi&Su5UO`SA&{CMBP}~ux?%F#Eod@H8Gp=->>w}tE#RIs3%mc9plg&us)#Znj6PviP zC#L0~*%j2B)$7wz*_~Qg44S+m=~NJap@*^fjp&NV%E=HaWPwjWt5P=Viv^YRp!IK# zl1lC5NfHQZa!eZndBA#%CVU99;)xrh$$ykwU4vo zL1P80+KRzd+vR@W%aN3W?Am`${ic~!S&KOe)>eex6e9+J9cD@lY4fE4mU>1noy1TL zO%e;-#hWk@d|>sBQmfV9_Yu#%Hn4H^6xO3)yA@JrL7;zgvTmnyyeQpq5D5lPjgJ6| z-x)>r0ia>pZ;sUA5t1QSU!?I$cWtEEwTgR))WF2Eeh_!yF&^T4FSbG&!a4+jt>OR% zT$pA&imt>K3WjFbPi~EI$1o2D-J6&3iw+?`1(7kHMwcY@?_M(2%lUw8y%QnC{KH@xdH?~> z%Zl~>8FVMg4}1+PR+=?-g|9;f55*t=!pKeWRy5(gJP5Yua!!D8s(kxzIcd5oA^C3@ zKnt0ZBaH5u!KJE;P|UDFb>S_$8YYFxjW(Y%2#Bw}Ce@~-s&0=jBtBbfD&ftGXEp<@ zl*m0pU{~cSJ0)P@E7Rp@t~o#k)ERuaif!wHZhJtslAqduA&=Ou!O`=&EZ^ykyPBv? znAXnqY5@vDSR~1wa)3f50;T9-YvU!aLCDRf3*F9BBar^l8)l0S)EJqJe8GQMh#V`t z_4}d@sVRK9d|3*Hj-^h&WJTp=FGX2fsSiya*G-f-7GS_sg>bimL=qfm8{Hd);wEVF z8i47x3YKtyj8AlySToQUQj{-)F%<@w$G@onhg7x58Wf_vr9?#DxDT61z@I?bD=5Sy zL6oO3lps%SYOP3SOUegO%J@1_1Qt(Hn?pf!SKnwvq2_&0zI~&1Tog1efMOvwp>Chh zlarw4_|Z9#i}ZH#he2WUyZ)b4SdfCZP@sY;S6P(eWHXc?&knN1wJchp?X7zux~j3> z%7X<3;Zl2Tkc${Lj1cL1AgEg+*#3JCvPh&A){hO;sPWla^KPq?d*ZaH%x;viVl#M; z1|HL^fKK&0z^h8|qAGaz9&@MGRzD9|>zJKmIp7d70{|z%CfNDucLQiK1@2)hpT@`E zI+~1mKaNDA!R!=PtN1zpPc15N;QXn)Pq(c6&@Ou>Rvz?PHZL3saH=WOZ?hAyV#v-Z zy=dyiFDBHZz*xOfmZ99{08d^IE50p@Jt9P0QM9Sl00J!z%y?%YdPG&O4XD2@SoYTrIR^KJRs?Tl6=#J8l6kGW2}<{t1559?`ONIa@=`vO`o#8 zT!iD*WIvc>u8_XQ1XGsIWCm^_nxqPD)Hfn`ZYlv%XcLnV^Pcu(2v`vIjYFV$Bq#Q3 zpNKnO)S4OU{@Q`@2dbW(ya3Z3+0|6I+wu%M1?nRK1G&OEm^4`gE{=%$HAo6BitEpl zL#|eGHOdGO!gmx!pkF$}_#hkDZ7ANoLF6kZ;p#R&C>zIHNN@b5fQEo30GqM;c(Xhh z+)gNW*jK7sDy$0vbvC-vw;%+JjQgW^1b;SaG`+?#OIdMi8aRo_01I@B?Omt^sxvR| zQD{hLW_|$!LQ6ic3x*HCP>jt;`PJ*U@1LRqT{LYWPgr?TQx713Ud*t#+MSp@rHiU= zv@~-)pvB}D02YZIE7JThvS)o>iJsST1^f%_8kp=+5GB0efIHCjIB1mR1t%bhl~2qL zT1=Bk8x{Qze}Sb4vaey5PjoCgiP=Xnw`ftW>Mk|_Y#CFY;hy;|O)lp*ERx5`zA7TY zU^048A0)6yAE%qA&YqafEx!4tOq@K=wAe)(A3&VtGxIzr(sxRmx6r{Fp5{HPnujJ} zfV)x_ucu3Mv-*Q7D^=oL^40e&n(~Q-z2#rPM3@4aAJ&4v82NS5oV_}sg=wMW!W}-Q z?Ld;ZbNmsG1;F}n2@6CWrR_+i@o-o9?;_lxpU2z%gmQ69OPt#vPaoY)uSbE|ZDcjG z+06WF2I_VD_7{*?UngP8H~hnDjr3O<3XGTpX2dwA0X_UPH0L!=-c}kl77`rYR<^d* zt>?>-d>-rCAJ%S$bJ_SYr72-B%4$U@@GX_OMF1PH7VAcW1S7C8wRVTJS7#ltx^=3 zezcSGRqr0VM{Zz6ylABWd0uCHF&AFfk^3K`_@Ag@0j z2-lvu`>Eq^k&2=O(dxYTPWoEma6>?5V3%1BwDJ^@=lIsLZn(ZWl)Z|TR71tX{o{9V z3n`_rfxZYi#Nr%aL0Y*5`rk@G5}Yb= zs$?5+C0WRLZJG`jTSjlsf0dI4!TiV_+uBW8co;c8ABB&^PFn;VzATE+mhx?a(h4SQL|p0v1FQfRaP~KYyV{K@ZZ!;qwUi-Oq0k*= z%;`4e>B+z!bo6_e01Te^tK8+<-WKCTGYaKmu7EbtygEwJnL}IVoEJOK_)FM1G1GOl#3%KhIwo zTVc*J(L69bk8Ffud_BX z3*quYr*ecX$Qcl+hxY(rR*}=WvU=AWv)PnQqB`oRT2cMyLy#M8O@^TJ!G76-H<@8c zKhl|~RNP!fA|1e4%vOkAzymBKlG`lu)t|H@sjOdBfVdmwk$DeZUm_p(G^@);t+n;S*%a{x*gO;v5up2txJR!FL;I$`}7+{uBI_*p7 z|59(}mZ!wEuU!ge%#;>KFze|l_LjUd@4(FQD@TxP3~|B?-g}%+U4YidI69oR;%vo4 zoRV{FvO*|z%$ccROFB{idP=>1nPU6J0irtOuZuU5^AWbqx&~qPLZ|;wgHh-T$@Vx#xgrbq1x(Xq4mLmpdkos6tg>0N znN#oTS;sCoT+PCrS2qV47&cH9yjG+IF-Ml0E7iw%yyBCk#*J0^^!-=bl29E4GZEX# zwgspJD9X=z^^1_izbfy}0VyqsV=QCir8?LHzkf(CMCcaYo%u7UjlZVLmpv8&_Gq$t zP#SiS9ZIte_EX&~PkT|~XH=9(Hd|3i%fA4{s`i-7Hxf^J86wf!*6XSj);RbsDbaQi z&q)v+vmZHDty1)_)>Xy5e))fM77jOE0Lemhhc*i?4e5loM&ZNm_RkGr2?DM z;OTZT8FOBN18iB;hy_fI`82#11l(84?mCu>`AO#sI(fkS#$B5kh_9Ndla&^upZh=5 z2kcZ>@rd8l0-mM4ZN~ZFkXD1(MM1Uc!_L*(@{%M5=~0jy>5m7T@Z1u5cf4(cC5tVh z7sV-Apza(h%9U_jpa$OZ6>0j${3U>P$(n~Xd3epe#w)d_f*C*l`E&nYE6p(wPcX^& zOTW4hH(6Uh!N$fHa0-~>h|~Z(F);~dhFPh7u~xiK+p(3U&&cyslDS@X0ATyjB7#Ca z5$eSrt$EL)O13bg84Pa$Xxsyty!(EE#oZuF?l%o)V5lu2O3mh8YsF4XQK=Hdo|SS> zKn;L#U==Y)|Al!TW6Y1W1D4tvBnRMq0BF?j7XFzfEB3c58>LLR&q_7NN7;tEUeU0D zi_020^p%XH=T)@{i&rbKggrB3?8?m^6bu%@P`8PJ)9Z);^yyHQ3OU4AdJ%*eFEg6m z1uFIUzI2G7jqG$a;Hj;?YcexjG<>M(t2l7>Sd6ZylS}3g zNRX)fw~f>cw_a~5Y&BhDWu3Nd*MvR*glj(zsQ)fsRaq$^1Zq0xzjpWPSAJH=JyXE5 zedTm-JjIK-u3Q>oP(v08#+Cs_YcvpekY&BS=KG>73f~IAzft|yL!>YWs?$9-kKLgv zO^Y_iS>j5M09$0UfDnh_`p*+YzlRICKz0l2AU(7Is84;U>ORE_X6+}ksE*|t#E|}1 zGVYbJ!Irxwb%Y-LuElKGfwN-5SpgCFuaP>rf5TES9cSM32V*(VRe8 zV$h%zDD90Dric@3lleNgo#Iyj@K(UxHR1yZ6dG}+Ig9k^uE1~iIY|9jq?_Bp+zqyQ zrbXfG@qdFrQuA%kgFmVM@eS9Ks8*ttS1lGdAgoPE1eR*Si!0O6o8iN;tOL68nBii` z)hJ8ZJO~qmECc%TaLE=-WMuaWFdR(|X+73l{sSVJ>?gOb>V=I^KKfa2BX$@k6cge% zm>xm%6O@V;PJZ7dZ^HJ&+R#7s)n5{aTVga!Yec{?Ay>F;P}8Es#~|@$+ja5e{Mvx zpq~0gd=Elu0thYgqb7>@2&7q8pXhMeYr2!L zx;!`FL-+U|P!r_TLqCK8$Zj0kcV>s!1nLw3VWX_p+2HE)h;#)HabjqjjHqOv>S+?f zc;09!KaWoOhqp(`$HGSs--~ovoQ4p397COQRLpT6s(#M1u`d9{l$pXldfG|pyTxzW zWwvwbMQVuw{k~8rt^JcN2>hb&iznKmfUeiuyQW0*LE0pP{e$i4 z!6(%aZw_AJoy48h0@h&f>J`ZAd};@cO(_B&{o;(D;K`=3nECTBU*#}<$W#GoT4bz- zsY_o5vGT-&%RImu`&zW8S~dKE$&X0QT>mE3B9RB zF1JwH7mp*8@OO{dp!s$Bs^BBEN59IS(J%psBROnsc-Pmaprw#6D!YphDcJz-s@3ZK zS0L>N0xfIFy@<>>)UlkdbxFXtjmnv|8Emj{zLMnLd?~pF<($6x)`OErJGo6q_1uCVIR5Xnmj*0bRA%Sk_6lIB^K+2N!_41A&Atjx2T;q8a>=_`K+gUtGY)>+ z98p(tdTBE4#i4$xhH+w30@4z|f@ppgKzi<`h1S?L%;ek7ka}b%w_sPrmC62k%WLexJiIeQ9dmiCB(I~yF^i|2FOTJ@YGPV`_Wo#r-4;q{v8CU5nPkIDGzx}o2H4Q`LrEA06lDs*Iv~;defQaul-AkiPDAz}Iyc!-n*YiNk$3R6M}1og z6x$*wAO$uqXwj;p^wE?X`wPB;X&`Bjq+a7Q6;OaU~joxvk#=^Bw>S*{T$p9J3?QF=`#!M#*yRRs-{$1 z2^rh)0=4OY+#Lo`kz?{}Jtg89bNzzQ02MP7jP_GazClL%5#}m?QEQR1kHbhT3m$M` zIz6GBbIG0iPCll(C)_XtH~J7zso^N`@5zWh?Id9l+SZR+w_S*zgD5iTg2ywLrqRMA zh2vfEi`vcfABA(hqjPIEn==Lj!u!L<%y!d3vw72O)neeYizsI8qdvR@{O1_W1=|@4 z;0m0cgmq6mTQ~M@DecWj464$;irJOYW#6JGQ1h&1rG@5qDDyni?IgvS9|*x_ z$WMbQw4Yb$RV|oFY8XVGzB$+3JrgC2G6d4F)0BsC!Vkdo9{*4~n3a_FGaj?r7uld0 zK>`NfC9<1AkXteTm4gkSXfS_CvHZ=@O9Z(R&7h1nB_^$gZYR=wXAtlrIwxdHaIWnFS6JH{1lss2)0+kzZy*ix`jDT06x_PWTw@ccLBj0x`*Zf3DVbsr?zxvxN z=6-BIqXh>9{z`XI(lW*AdVXW48H&X~k7%|^m>2Rl+MdA3X4IPdikx-FupBY z3r*~#6kp6lMq@kUr&^B5Z?3xaAKUdR6+$M3NB7zpt7(f?mpmKj(@-o1xE4%Lrsl@A zmbRlN?}XNH-RHOxqA6QM*);$v(zV)gDht5}`N3nHdufe}8~gT6`ZxD#JCSp2){Td? ze@&1=Bh4klFj1kDkbAKaV;aLYBkzEsavWXxk5w!=yol!VRvxVnJ*J&voF z@pZ+0X(>|^DmmSKJ2rubP|*yLYEGkM(l~TeV-{%FL|s4k@D>A`79l*C=3 z^nzb02dRcu`R5m3x1T{z`aP$SS64iX$UM4~rq(oO4*kT_xL&`_bpIfsLOC$7ob_PrpR{8TbAPpci(s#T!~D45!U_QN9}~KkkK5+$dZU8 z`0{&?@*gr1Sh!Mav5ce(6f$D4wqVZV)lEF_g)>^OgD1^f*=j;3RCv1(*}D3eu&qRE zu4e3_)}fM_E)>Z;iH-Z43>MC+sbHmTejfK@6RBG)q>6Pv2F^@> z?ws-ZOME95OVw$1;lY{v_?qA@i7oOyZQXeKLt0ft;$V*iAFfQ=l6S^;mVG8o5sEMT z`U~K$a33H*Y56h7uP_5qW?!;uC)&54cX&=u^s&vEW4fO&d2-&Hl&xHDJaQCeka2!r zfE#=x;xVAPbe76*RCGrKHgG|LI%h%%4F!RALg|O-ljfBih0D~2^kiMc%KmHin~AZb zqRU-=Pwz&bf;`^1x}1^ z1{NA_bTztCl?7Xmi}9s)kaykJPg^`sy3QKiUuePX5){&F!s#$2`9WBroD=vA;f;rB zS24ph$F2p4E)madlFReLB(;O@XeX`y z`f@G10m>fs3LTjSrOKWt>W?oq{?ctPuLqvo5px6)Fz*KzrdlIiaT&BlJzW&4U# zdbdaSz91C_iI@;8zl%2R-BpYjRD%N4{lB326aC!C7uIup!l$!w?KP^dM*`OwcSWy; zTxmZA^JnPIeeLqkOw%~co|8WxvHJdLXL}`ce=x(I0#e^%BN|^4l{Cx8e9^f{t3T97 zUX1^h0zU8kk@u?m3H5ynO-v!4Zgx+Iz?wjv0$v*KE{pc3JC+sUa^aheD+Ai2^qKeT zW2JY$dtN@T&Q5o@t-1`d+X%`y>6*JazprKFuINdG(s}VG==nQ>R7BSwN%Gc^;)G=V z{Dl{w!V30k{sNz9hP?Q(?P1rElITjNKl`pPZ-uW=2sQSZ#5YXdnY6LsOX8(>8@hOR zE2fRPWiD!_P{wlJ?|$%b+NrWoq&V5UY=GWpGG=$AW{6E`OOhKSs6mloF-#lwDY$v* zFqm*%{oNO*5cCUjIP#(Im}C{1vE4mh+*&TNT?_X3#Pnyu4(YVdtjwC9h|YdLF*Sc9 zF~D52A6B8vCQSWup-c43Jk}(a_J+wk&QG?WLiH|Jg*C-gf2%?hq^F3#m>km$ocHps zukrFqH4TeKh&#l?!-^Dws<#X?Vfrny;v&oqu_Ar`4yI~Bf0%yT{*L3^H}rWGbNjeo z`L!3qBcM=p{{G2dSLCy=-Mp9dW5IX!vl7=m$LYfF^#H4*U}pt%a6bMoS1Zh;THcun z6L9zQLuaM<0E##efhtplHRJDL4L85$NNQqCuu^`nx?Nqum4>w{)Rv{>I!}2rb+_Y8 zE%-E;dg4s!%0{DV2z+mW$VrqO{T7^?4PLN^F4|aeN$=(#5*q0@VI*t$KoesUP}+Sp zb`5QxkXAftEJ;4KH&-5d?DI_PKIH)Ld3Xx&N$+2)Mxt?8Y%8hb%wytj>OBsw6`sWn z1s^FbqY0Xu9?P0pWe5j@fDs=a8K<*M-9rC+NjHDW_mW&%^BX5j8V6eT$GzMHS7)7Mm2s=V#|BM=Ui(s# zLU+g{+v3o*=@&|PTeya^CxL~S0gL&e#hxwySqPOt;(AMv-{D4sZ)q4ko+>vOUwhA z`CKf6qVLn@R2HPhI4sO>&jT~n(<_}xZ>O|f#S)My{5W5V!glxD?-qXOA{GQM6sV`?FcM-oPEw{)*R&p4YjqYfr>9 z38UPSy_80noAZ1?fNiwA)lzIA^8V)fixJaisfXr>lsv*q-u!p&?fG;hQ*ymDMHvZ;}w37K=&YR^pRmXNbpNvWBP+!;4W! zU7|uMuDv*`?rb3kkQM=x{)TQfeyjjYlFoB(923$rR&g@Np&qHslI8C0vQ8x)rGww% z^%rd%Q5RLG-?$|&3Y=za_6L+6Vcee1fD|j~CjLNtoEuAT2|L`I)-EEGd0#zAZf^3m zDezv&yYi^Tf5h3(*Buv)8IlWu%j)Ncd^QSft2muk_S|>A>@m{hE?3TJz&@|7nL24S z!xT+P{-i9bwD-J3lohVKzt!HeZ(G7cI^xA9j-sY}W|rneI}DasK!)BGQx+h}hG+Wl2(>gNY4nvt(nXq5`sq60O%*8>rI zU3716{|do`J$sQyn8RzM@YRikWfkdeZ}Y)#v{<=Fim`WaA*^_~so=*pDSYa_ohqLM zJc};AQInuj1v={6s55hEC`J8J1(V=Ls>gn6e1BJ+1c|3--!ylKZI6CGJkUCYtLyE}W&EAD5jY2L>K zV`CwWzcT?M{zk>mKFgzEh&^5Hm?0Y?WV}0+1C(RzGI}`<pPR0%!Ot3v->O~92>)czieODbsMnw)ffKOtLT6p+;Le{u zrgF;wkH+*hVAk|F?_Hj#n=^Yt=&1Ka;Ko&aWWyHeP76jLpT?$l{c2P9mojbJGet>cEX#C#^*X+M1oEtYP>j#g)aS*XQUDMImB& z-}WlCUWa>cT_Y7eHy{hhZc><8$oev|jP(+BCmK`Y`Joc^*TIV-hnpu8f*Q7M0e{qE z(BZ**XYkflpi6{1^4A^Et7*;rBj?*b?CZt6t>Uz(HJPb50yiF@Zn%ru_f>tFL??A?LKAjSelV4X`g#)NB4v{bYT*&;g+y{%LY!olId!*REw>4}{9C z&W#a%WfDzqg#Y}u9Af0M$CJmH(&v~#6#a(xL;|a5G^So!9V)TO7r#m0Q?yO!xw3Br zr;0ACtd-FjefeIS-U#s*ijm~SD2&9ZrnoHn^}U))b93w_icZq_c+sb}}Pp&bO{ zs|Ba(ibe#6Ca!Tm|MJTK`FS|u&jYNduI7$5^cD9j}yU|dUVwOxl$|Kk{_<9CK|M(L?5fO6U|C+Yy zCJKp!YLCae=XfxR+?bKE>N-QE!;FHo)k1;}RSV}Kh9_+SZ`!De!n_#jV6~^65=IR) zZKrFgQ7@%(mTnKlhVC*Y^eFFc!_w__O8px~(}{I&H_Y1m#NDE@WTGP!84G`8bNHoR z!dILxmq%`CJ6o-}NS)0JiVRV6J%juxi{~Co3sS)Asgc9|6sfT z_SAz)yHEXkxy^X(eac40Yu-{7L=PQhYYk%4_u}hfmZD@0ZIAXLf7JJqlh~LGz5*?* zmGYjS>XGs+{asfL$3YY%W>JH*4l|K8e*6&WUIiOTKiMDj*iV^I01e4!cB7~3gv71 zqkrxOWc(XwwLaR9g9}`1N}Mo!xi_N9GA#@gRdn3}D-O-Rg8HeB*@x1aTP9Nn5FFz6+;FoG$-0~w%QINNHWVqW#| z+7WU)qO|M0JTw)=7MYX(%L;Umwp35;V40lsYPTiezwd{mb^}L`dgq2$*^zMk=)HS= zvT9lvNk4FiCi(L^mkEPyCac%VhY=WxfzYpXV&7)ne|0l;gR@ro(N4mUlatUHQ|;bW z91tVH@mIb08)W+}K!SGq`DPX9dq=l*0w>2EAb_snOY6az2l z8uFl3rm}>?oqXo}i%e+{OBUloE+Hna)B&OoTVMGUK8h1uyq}NEUUQHP7cnzblR#Q< z2>0e>Gsr|;pDhdbz7BxrYg6L<)8S_xWW`Nw>dF;Oud9C$VjvDcPy&1_PGNkl>D8*C zk=cZm#C7ok9{J6*>$2gTtZ>N()salfA6p?j!*(TA*lqd*`iHt@AqRWp+1}!0ZoS6LQdmH!*6*I+RZ~mrZKcE&WZ!mgg=^F(|)Wn zL&a%s{{Z4$uQCa<|G<6PDdx^M`0kiK;3~_LTeYlaY*ZiT_Pbn{=4_5Oc;n*t5l<}k zhEIN4+ZPqi#d!fb%aIQ8m=Ulz&N>M@NYs_wFWw7*&-bS7GOVe3ATnjW^ZxKT^j&tJ zx4+&rHmz4u+HWXj%XJ`B7g#qhYUQ|Gn9<#q^({#{nQT}8S9yGXZR)vK4%Z{s)WPVY*zDdvBR z60f19uX^o4w4B%rgT?U9CRfhxkFCpYVqH&q(xx(rxY40`GI!_mjTT|UHv%ZLu-T2! z_XfduqR4>nf-OihSqwdhQJFu<6?Xd1-qdc+)?`wFZgR40Knzg8R zKn1i&gNXM+RoxRG>DHSuIWl%l#Kp{Qdb~RZaVw@#`rP4>>!$EV1&}WN6=p@1$-k=D zaJTv0evBb%m(-O6@Rmdf{QLK#COMq{Whaj^@Q_)%zznB4IcOd?_B*9A!H4iEfM5$R zMc<+uCF{$pukn$Oim}OR8kkdB<_AB{iIVI*l@%+)DJQ}-EQ0#5-2U#ZtaRdM4gf(U zucfs)VrDP`Q=hoZsEhR4TI;E?J_|87_$&uB5}$H(r8V@We+?W~Bb6RYN@1gd8X z2JFq!St3CaP5mp&+yzV!T7Ndt*O02e9#}~JZQPCB?Tn0Ds?X*1Usly{fJj(q17A#@ zmjM}w(wGNrF!?o8-AG{9DD{6OuK0V6!q&n2)df%*ON~J|k!exkjWN&f+dCQha50sE zcGqJ4lsjwIU}Z}_38ZK78!J$RhhN2&%M+S`2k{QtXBcr-PXlt!%dYa6kD9m0ciZ5} zd+P=g>VRcKA6P)A8C)bHY+R0Kj95-`pNMNkF?dsC{tIcVsF)kcSKk-@gM)s?RA58_ zT(AeHM}G>JI}0_AV%e4_{XhiYQqgogm~x;{U~$eXH;jW<_n7OUPwO9knjqr-`tc`B zaFSQV?N_MgdH~jkH9O}f>5QwPuY*5_fgdzl+UBg^#;LoZRs*TS@IwN|sDFQR^ZTR* z?+;VgW)6vhIB8wKu@#Md&{lau1JE|%$iLW}?WMVd&Y_bGtBbzhO5{Wi7Y z^X*5tGU*uM$B$CPV&u*hqX&~E_$WoU8LVME1HI5&rM%nMWz*V@fzw|gD?pfED{-E8 zTAW`+N8*nZcl8d{t`$^TBph{G=g@noebL(ek&h!`J(Z01bo6vDRIUg#v>IB0i-jmr zrfw*rKZM8B8DdKH1I_(~7d=9GSU`NTHdc&lg@%>F(_}mIx+RwN-gz!lP2sT$hU^o? zl-}v-U2etYX$SZ!$0*vZ6E(N#8h$_(QC`Hv*!FeZ~=cLbcy<|^& zwZmOQNU$xbDtYx17l}s^O(rJYV_27|B=9?p95kiM8`x4--005UQM(yC3+;E zkv{JFo?ah$`8`;u5`!=$P4M1+Onbs08nQTkB>P)M)^9#!xc(B;JS45{#gSxhjrcne zFm~tBS?TRFN???TE$CADqB@rvb5`!G$tQ)Rfd*fi`LZ$g(F-EsO9iiDaSNfcE5z+V zQck4YtF{u}{8zi-Thpo>sYs^!{(}mRyLAiUG6Ou1pWw#nC@`*A6pu~FmlB@Uu$m4c zM!*aOl3PEum-j9bdAk~Dxa>bX0SjAAHH&5;J1T|l#NqwJlK8rN!;!873My&;^uzz? zj8KEDtz}!3gK(<19Y>6*d(LV4&9~rm6fbiq zOoSc0rxsp_BVf^Hk$`||67aTd=E@}Q5E9Z?E;vW74$8jrROXF_YA_3YbQu0d8$AD{ z_DYTnDP}2gbz~(dRWd)*>LGA1W9Y#3&eVsHG~GQ>-8O8L2DHmaOi-5#eCbA0wT9lD z2jzYkV?FeSs!ksd0?=N z_Q>`t1LFU>3SDykf4YvK@dN)3ihhL|eDqK3+$`g+x@#^Bx`c0mZbP%xwroD2pBt@y z3BBcgRdCU^;^X8B<=s?#-@l%tRF0hBWHEAooCi-y9(n9G1Z1^7zBixKYHn19j`RxT zdLbR$-|+sNNIW#Gr!Kn6_+ta{UG_k7BgS?B749@h>4m6hIZJ>#b&`a9c0yYh+@oY= z%~NgQ}dh@#it|>|CRkmJNz4OYws|B|BNd6GeASE zW0mFTNa@oo?$TvZR*}-40&UAowb3(zcNT>u523SrR!Op7qoXXKlo>Um{^7WHnjd~# z9@Cst`pUl%&Ay<-KN;m_3psdZH;LRR!ALjs?X0i254V?dGN}fO@KQ<%%|B`3zC|tv zosNekEp|Q@PKfOcbM1}#pzjjyZQE)z@qLtlGjb?FX8s0#u>zlw1)~XgFT#$zK*D04 z@vkP7sYOI8bxgEsm!>FIgGEiLXQyAoGMHAL`e8URQfJ#tTM+|(?l0EnOo?P_QzFQs zOD<$_{T8ZFOndL#0nIPPO6=*#&*IAeMt1cX9FPTK)UWj6YbBQ8Gu+@aYemW4fAY^@ zQFgi?zseqtLKAuILyfN8nPwnqIX>my0GbosITWLRKBx5F!0~{$&*s(%__12~O>=M6 zG_39U`qitwVb$QnWo?#G-tUsKB2FjIms|?HsS#;KRral0nvkWqLU zsE7S#aRf@{Sy$r`-{oq909O|$l4s&rj7*|8_r1Ahn?)1hyUEoviVDtg4xUFv=VjcT zV`Tn3oTrehN_Jl_!>*Y-tR6WIcrHy}IUvSV_9>ECB z9zpw$pn5mH93H1(V_cy{l$@gHH2L>1r!jl!J-PcM4SLANI96RmWU^ZG)0Cazm#2YZ zQh!~-RZaqBcHc`9n}EImmK`s?!Vfh+XRlMdTGm-pRk7@h-J0bEds&x{G0SF^Ai0an z;7CEWCKCboQ$C{z((63#g}gh8b#x_`tGPH6hqFMSc)Wrw44*SMUXQd*Yg=T92>X0b z>$B#QQ`bYXxcnU!`g(zE(&m@OQ{Dx(X}8U+3+v0MSRv3~Rl89|Pl*)s(V-P*6cu4X zrr|V6WNN{?DM*->7YCePj|(sNZs)!upQT!<)SdME72@;FtO!+~?oFD>`{5gmFsn^5 z4F^76snnz$u+0}5g$gGQnN7s^i561rZ#!JdUrgh@< z+k78LJX;u0FW!(9s@a)%+p4nim^zs7v<4KMowW=MMsEY);GoL|F2Q{I9>&xwlqtU@ z>i4FMYniK>%+_!CN1cw7Vs!uqJzF>&lp+o2gMFjm8LFC*)aD3{{^&gMpMvT&KSQue z9SF>{2u=PU6MCcNZ!y9~wRc;pxFxIJ%JU!X$74;P$5)Haz-I5&NjcRev28bR39a}O z;y!ITU)1}?T7)jby<+@>aq!T&h`|1Ny`F*^|IN1)00o;2=nG+d{Mn(ZTcu{#3f8Ak5sNcbhp9rqan)JXnQXe_GSK0=YD~0J+gh=BxFHw29#hSC-II=W z+JA1M{qx66(}xYjkpMOH#db1eR5~Q4trKmNA9!nRJC0wF+!*l6i-UOrLCRQ43kS6Y z0Jr1*fy#DO#?+1H#0>v)T4%i?UIH8Pge#J_dAkrY`WbVgqtkQc)aN;iZuf zYEvc6B7&V}vpy2@a20iAiaLU7?Ne!NUHcg8IQ~1-BDg(rXKd!1lTcz;e{Pog2D)0g z*^wHWai6c>{tifCr!0bsWYzF-PTL44W$q*H0H#w7ZG4qdMSjDAcclvh(S3#?wsbQs zFNwbLe||Ncx38tcLuoJe8Xx7?k@JX?%sH}wXw-oP5;@B?eWb5)e*qeOhL`=gTq5+l zm`CJ7W0>&U^QJQ`H=f4TJprZLu27JeX6fa)I2ozLts>lc^#<~OJe5S$;R$SOPmd5; n5GzZq4y3pJ|9-YFQZ9_WFii=`3jq?xL7;~Z9^J3dgh&1#RD!zS diff --git a/feature/bookmarks/src/main/res/drawable/img_empty_bookmarks.xml b/feature/bookmarks/src/main/res/drawable/img_empty_bookmarks.xml index 2a9d0b14e..64bbfbd23 100644 --- a/feature/bookmarks/src/main/res/drawable/img_empty_bookmarks.xml +++ b/feature/bookmarks/src/main/res/drawable/img_empty_bookmarks.xml @@ -1,3 +1,19 @@ + + Date: Thu, 19 Jan 2023 10:48:43 +0100 Subject: [PATCH 22/37] Create .editorconfig, enable trailing commas Change-Id: Iee83659c4a08ee1260254effac770038e529979f --- .editorconfig | 6 ++++++ gradle/init.gradle.kts | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000..83be1d5a0 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,6 @@ +# https://editorconfig.org/ +# This configuration is used by ktlint when spotless invokes it + +[*.{kt,kts}] +ij_kotlin_allow_trailing_comma=true +ij_kotlin_allow_trailing_comma_on_call_site=true diff --git a/gradle/init.gradle.kts b/gradle/init.gradle.kts index bd5658fc0..57f91da08 100644 --- a/gradle/init.gradle.kts +++ b/gradle/init.gradle.kts @@ -14,10 +14,10 @@ * limitations under the License. */ -val ktlintVersion = "0.43.0" +val ktlintVersion = "0.48.1" initscript { - val spotlessVersion = "6.11.0" + val spotlessVersion = "6.13.0" repositories { mavenCentral() From 819dd494ad3d95f9dc742947500ee2f7b461360b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rton=20Braun?= Date: Thu, 19 Jan 2023 10:52:53 +0100 Subject: [PATCH 23/37] Run Spotless to add trailing commas (and apply other rule updates) Change-Id: I5f8e49a3ef004c7e9e7dfe4bc55f0a35dc575209 --- .../samples/apps/niacatalog/ui/Catalog.kt | 80 ++++++++-------- .../apps/nowinandroid/ui/NavigationTest.kt | 13 ++- .../apps/nowinandroid/ui/NavigationUiTest.kt | 41 ++++---- .../apps/nowinandroid/ui/NiaAppStateTest.kt | 22 ++--- .../samples/apps/nowinandroid/MainActivity.kt | 4 +- .../nowinandroid/MainActivityViewModel.kt | 6 +- .../apps/nowinandroid/di/JankStatsModule.kt | 2 +- .../nowinandroid/navigation/NiaNavHost.kt | 4 +- .../navigation/TopLevelDestination.kt | 10 +- .../samples/apps/nowinandroid/ui/NiaApp.kt | 54 ++++++----- .../apps/nowinandroid/ui/NiaAppState.kt | 4 +- .../test/uiautomator/UiAutomatorHelpers.kt | 4 +- .../foryou/ScrollForYouFeedBenchmark.kt | 2 +- .../TopicsScreenRecompositionBenchmark.kt | 2 +- .../nowinandroid/startup/StartupBenchmark.kt | 4 +- .../core/network/NiaDispatchers.kt | 2 +- .../nowinandroid/core/result/ResultKtTest.kt | 9 +- .../data/test/AlwaysOnlineNetworkMonitor.kt | 2 +- .../core/data/test/TestDataModule.kt | 10 +- .../nowinandroid/core/data/SyncUtilities.kt | 10 +- .../nowinandroid/core/data/di/DataModule.kt | 8 +- .../core/data/model/NewsResource.kt | 2 +- .../nowinandroid/core/data/model/Topic.kt | 2 +- .../repository/OfflineFirstNewsRepository.kt | 14 +-- .../OfflineFirstTopicsRepository.kt | 6 +- .../OfflineFirstUserDataRepository.kt | 4 +- .../repository/fake/FakeNewsRepository.kt | 8 +- .../repository/fake/FakeTopicsRepository.kt | 8 +- .../repository/fake/FakeUserDataRepository.kt | 2 +- .../util/ConnectivityManagerNetworkMonitor.kt | 8 +- .../core/data/model/NetworkEntityKtTest.kt | 2 +- .../OfflineFirstNewsRepositoryTest.kt | 32 +++---- .../OfflineFirstTopicsRepositoryTest.kt | 22 ++--- .../OfflineFirstUserDataRepositoryTest.kt | 42 ++++----- .../core/data/repository/TestSynchronizer.kt | 4 +- .../data/testdoubles/TestNewsResourceDao.kt | 12 +-- .../testdoubles/TestNiaNetworkDataSource.kt | 12 +-- .../core/data/testdoubles/TestTopicDao.kt | 4 +- .../model/PopulatedNewsResourceKtTest.kt | 10 +- .../util/NewsResourceTypeConverterTest.kt | 20 ++-- .../core/database/dao/NewsResourceDaoTest.kt | 32 +++---- .../core/database/DatabaseMigrations.kt | 16 ++-- .../core/database/DatabaseModule.kt | 2 +- .../nowinandroid/core/database/NiaDatabase.kt | 2 +- .../core/database/dao/NewsResourceDao.kt | 8 +- .../core/database/dao/TopicDao.kt | 6 +- .../core/database/model/NewsResourceEntity.kt | 4 +- .../model/NewsResourceTopicCrossRef.kt | 4 +- .../database/model/PopulatedNewsResource.kt | 6 +- .../datastore/test/TestDataStoreModule.kt | 8 +- .../core/datastore/IntToStringIdsMigration.kt | 4 +- .../core/datastore/ListToMapMigration.kt | 6 +- .../datastore/NiaPreferencesDataSource.kt | 19 ++-- .../core/datastore/di/DataStoreModule.kt | 6 +- .../datastore/IntToStringIdsMigrationTest.kt | 12 +-- .../core/datastore/ListToMapMigrationTest.kt | 16 ++-- .../datastore/NiaPreferencesDataSourceTest.kt | 8 +- .../UserPreferencesSerializerTest.kt | 8 +- .../core/designsystem/ThemeTest.kt | 26 ++--- .../core/designsystem/component/Background.kt | 10 +- .../core/designsystem/component/Button.kt | 47 +++++----- .../core/designsystem/component/Chip.kt | 20 ++-- .../designsystem/component/DropdownMenu.kt | 30 +++--- .../component/DynamicAsyncImage.kt | 4 +- .../core/designsystem/component/IconButton.kt | 8 +- .../designsystem/component/LoadingWheel.kt | 18 ++-- .../core/designsystem/component/Navigation.kt | 22 +++-- .../core/designsystem/component/Tabs.kt | 12 +-- .../core/designsystem/component/Tag.kt | 14 +-- .../core/designsystem/component/TopAppBar.kt | 12 +-- .../core/designsystem/component/ViewToggle.kt | 16 ++-- .../core/designsystem/theme/Background.kt | 2 +- .../core/designsystem/theme/Gradient.kt | 2 +- .../core/designsystem/theme/Theme.kt | 18 ++-- .../core/designsystem/theme/Type.kt | 32 +++---- .../core/domain/GetFollowableTopicsUseCase.kt | 8 +- .../domain/GetUserNewsResourcesUseCase.kt | 8 +- .../core/domain/model/FollowableTopic.kt | 10 +- .../core/domain/model/UserNewsResource.kt | 18 ++-- .../domain/GetFollowableTopicsUseCaseTest.kt | 12 +-- .../domain/GetUserNewsResourcesUseCaseTest.kt | 16 ++-- .../core/domain/UserNewsResourceTest.kt | 14 ++- .../core/model/data/NewsResource.kt | 14 +-- .../core/model/data/NewsResourceType.kt | 22 ++--- .../nowinandroid/core/model/data/Topic.kt | 6 +- .../nowinandroid/core/model/data/UserData.kt | 2 +- .../core/network/di/NetworkModule.kt | 2 +- .../network/fake/FakeNiaNetworkDataSource.kt | 4 +- .../network/model/util/InstantSerializer.kt | 2 +- .../model/util/NewsResourceTypeSerializer.kt | 2 +- .../network/retrofit/RetrofitNiaNetwork.kt | 14 +-- .../fake/FakeNiaNetworkDataSourceTest.kt | 12 +-- .../util/NewsResourceTypeSerializerTest.kt | 22 ++--- .../core/testing/di/TestDispatcherModule.kt | 2 +- .../repository/TestUserDataRepository.kt | 16 +++- .../core/ui/NewsResourceCardTest.kt | 8 +- .../core/ui/JankStatsExtensions.kt | 4 +- .../apps/nowinandroid/core/ui/NewsFeed.kt | 14 +-- .../nowinandroid/core/ui/NewsResourceCard.kt | 50 +++++----- .../core/ui/NewsResourceCardList.kt | 2 +- .../core/ui/TimeZoneBroadcastReceiver.kt | 2 +- .../feature/bookmarks/BookmarksScreenTest.kt | 40 ++++---- .../feature/bookmarks/BookmarksScreen.kt | 22 ++--- .../feature/bookmarks/BookmarksViewModel.kt | 6 +- .../bookmarks/BookmarksViewModelTest.kt | 8 +- .../feature/foryou/ForYouScreenTest.kt | 48 +++++----- .../feature/foryou/ForYouScreen.kt | 77 +++++++-------- .../feature/foryou/ForYouViewModel.kt | 14 +-- .../feature/foryou/OnboardingUiState.kt | 2 +- .../feature/foryou/ForYouViewModelTest.kt | 94 +++++++++---------- .../interests/InterestsScreenTest.kt | 12 +-- .../feature/interests/InterestsItem.kt | 32 +++---- .../feature/interests/InterestsScreen.kt | 8 +- .../feature/interests/InterestsViewModel.kt | 8 +- .../feature/interests/TabContent.kt | 6 +- .../navigation/InterestsNavigation.kt | 4 +- .../interests/InterestsViewModelTest.kt | 34 +++---- .../feature/settings/SettingsDialogTest.kt | 27 +++--- .../feature/settings/SettingsDialog.kt | 59 ++++++------ .../feature/settings/SettingsViewModel.kt | 10 +- .../feature/settings/SettingsViewModelTest.kt | 9 +- .../feature/topic/TopicScreenTest.kt | 26 ++--- .../nowinandroid/feature/topic/TopicScreen.kt | 33 ++++--- .../feature/topic/TopicViewModel.kt | 22 ++--- .../topic/navigation/TopicNavigation.kt | 6 +- .../feature/topic/TopicViewModelTest.kt | 34 +++---- .../lint/designsystem/DesignSystemDetector.kt | 18 ++-- .../designsystem/DesignSystemIssueRegistry.kt | 2 +- .../test/NeverSyncingSyncStatusMonitor.kt | 2 +- .../core/sync/test/TestSyncModule.kt | 4 +- .../sync/workers/SyncWorkerTest.kt | 2 +- .../apps/nowinandroid/sync/di/SyncModule.kt | 2 +- .../sync/initializers/SyncInitializer.kt | 2 +- .../sync/initializers/SyncWorkHelpers.kt | 8 +- .../status/WorkManagerSyncStatusMonitor.kt | 6 +- .../nowinandroid/sync/workers/SyncWorker.kt | 9 +- 136 files changed, 980 insertions(+), 969 deletions(-) diff --git a/app-nia-catalog/src/main/java/com/google/samples/apps/niacatalog/ui/Catalog.kt b/app-nia-catalog/src/main/java/com/google/samples/apps/niacatalog/ui/Catalog.kt index 965d03c47..52e1c7485 100644 --- a/app-nia-catalog/src/main/java/com/google/samples/apps/niacatalog/ui/Catalog.kt +++ b/app-nia-catalog/src/main/java/com/google/samples/apps/niacatalog/ui/Catalog.kt @@ -66,7 +66,7 @@ fun NiaCatalog() { LazyColumn( modifier = Modifier.fillMaxSize(), contentPadding = contentPadding, - verticalArrangement = Arrangement.spacedBy(16.dp) + verticalArrangement = Arrangement.spacedBy(16.dp), ) { item { Text( @@ -93,19 +93,19 @@ fun NiaCatalog() { FlowRow(mainAxisSpacing = 16.dp) { NiaButton( onClick = {}, - enabled = false + enabled = false, ) { Text(text = "Disabled") } NiaOutlinedButton( onClick = {}, - enabled = false + enabled = false, ) { Text(text = "Disabled") } NiaTextButton( onClick = {}, - enabled = false + enabled = false, ) { Text(text = "Disabled") } @@ -119,21 +119,21 @@ fun NiaCatalog() { text = { Text(text = "Enabled") }, leadingIcon = { Icon(imageVector = NiaIcons.Add, contentDescription = null) - } + }, ) NiaOutlinedButton( onClick = {}, text = { Text(text = "Enabled") }, leadingIcon = { Icon(imageVector = NiaIcons.Add, contentDescription = null) - } + }, ) NiaTextButton( onClick = {}, text = { Text(text = "Enabled") }, leadingIcon = { Icon(imageVector = NiaIcons.Add, contentDescription = null) - } + }, ) } } @@ -146,7 +146,7 @@ fun NiaCatalog() { text = { Text(text = "Disabled") }, leadingIcon = { Icon(imageVector = NiaIcons.Add, contentDescription = null) - } + }, ) NiaOutlinedButton( onClick = {}, @@ -154,7 +154,7 @@ fun NiaCatalog() { text = { Text(text = "Disabled") }, leadingIcon = { Icon(imageVector = NiaIcons.Add, contentDescription = null) - } + }, ) NiaTextButton( onClick = {}, @@ -162,7 +162,7 @@ fun NiaCatalog() { text = { Text(text = "Disabled") }, leadingIcon = { Icon(imageVector = NiaIcons.Add, contentDescription = null) - } + }, ) } } @@ -173,14 +173,14 @@ fun NiaCatalog() { text = { Text("Enabled") }, items = listOf("Item 1", "Item 2", "Item 3"), onItemClick = {}, - itemText = { item -> Text(item) } + itemText = { item -> Text(item) }, ) NiaDropdownMenuButton( text = { Text("Disabled") }, items = listOf("Item 1", "Item 2", "Item 3"), onItemClick = {}, itemText = { item -> Text(item) }, - enabled = false + enabled = false, ) } } @@ -191,25 +191,25 @@ fun NiaCatalog() { NiaFilterChip( selected = firstChecked, onSelectedChange = { checked -> firstChecked = checked }, - label = { Text(text = "Enabled") } + label = { Text(text = "Enabled") }, ) var secondChecked by remember { mutableStateOf(true) } NiaFilterChip( selected = secondChecked, onSelectedChange = { checked -> secondChecked = checked }, - label = { Text(text = "Enabled") } + label = { Text(text = "Enabled") }, ) NiaFilterChip( selected = false, onSelectedChange = {}, enabled = false, - label = { Text(text = "Disabled") } + label = { Text(text = "Disabled") }, ) NiaFilterChip( selected = true, onSelectedChange = {}, enabled = false, - label = { Text(text = "Disabled") } + label = { Text(text = "Disabled") }, ) } } @@ -223,15 +223,15 @@ fun NiaCatalog() { icon = { Icon( painter = painterResource(id = NiaIcons.BookmarkBorder), - contentDescription = null + contentDescription = null, ) }, checkedIcon = { Icon( painter = painterResource(id = NiaIcons.Bookmark), - contentDescription = null + contentDescription = null, ) - } + }, ) var secondChecked by remember { mutableStateOf(true) } NiaIconToggleButton( @@ -240,15 +240,15 @@ fun NiaCatalog() { icon = { Icon( painter = painterResource(id = NiaIcons.BookmarkBorder), - contentDescription = null + contentDescription = null, ) }, checkedIcon = { Icon( painter = painterResource(id = NiaIcons.Bookmark), - contentDescription = null + contentDescription = null, ) - } + }, ) NiaIconToggleButton( checked = false, @@ -256,16 +256,16 @@ fun NiaCatalog() { icon = { Icon( painter = painterResource(id = NiaIcons.BookmarkBorder), - contentDescription = null + contentDescription = null, ) }, checkedIcon = { Icon( painter = painterResource(id = NiaIcons.Bookmark), - contentDescription = null + contentDescription = null, ) }, - enabled = false + enabled = false, ) NiaIconToggleButton( checked = true, @@ -273,16 +273,16 @@ fun NiaCatalog() { icon = { Icon( painter = painterResource(id = NiaIcons.BookmarkBorder), - contentDescription = null + contentDescription = null, ) }, checkedIcon = { Icon( painter = painterResource(id = NiaIcons.Bookmark), - contentDescription = null + contentDescription = null, ) }, - enabled = false + enabled = false, ) } } @@ -294,21 +294,21 @@ fun NiaCatalog() { expanded = firstExpanded, onExpandedChange = { expanded -> firstExpanded = expanded }, compactText = { Text(text = "Compact view") }, - expandedText = { Text(text = "Expanded view") } + expandedText = { Text(text = "Expanded view") }, ) var secondExpanded by remember { mutableStateOf(true) } NiaViewToggleButton( expanded = secondExpanded, onExpandedChange = { expanded -> secondExpanded = expanded }, compactText = { Text(text = "Compact view") }, - expandedText = { Text(text = "Expanded view") } + expandedText = { Text(text = "Expanded view") }, ) NiaViewToggleButton( expanded = false, onExpandedChange = {}, compactText = { Text(text = "Disabled") }, expandedText = { Text(text = "Disabled") }, - enabled = false + enabled = false, ) } } @@ -330,7 +330,7 @@ fun NiaCatalog() { text = { Text(text = "Topic 1".uppercase()) }, followText = { Text(text = "Follow") }, unFollowText = { Text(text = "Unfollow") }, - browseText = { Text(text = "Browse topic") } + browseText = { Text(text = "Browse topic") }, ) var secondFollowed by remember { mutableStateOf(true) } NiaTopicTag( @@ -345,7 +345,7 @@ fun NiaCatalog() { text = { Text(text = "Topic 2".uppercase()) }, followText = { Text(text = "Follow") }, unFollowText = { Text(text = "Unfollow") }, - browseText = { Text(text = "Browse topic") } + browseText = { Text(text = "Browse topic") }, ) NiaTopicTag( expanded = false, @@ -355,7 +355,7 @@ fun NiaCatalog() { onUnfollowClick = {}, onBrowseClick = {}, text = { Text(text = "Disabled".uppercase()) }, - enabled = false + enabled = false, ) } } @@ -368,7 +368,7 @@ fun NiaCatalog() { NiaTab( selected = selectedTabIndex == index, onClick = { selectedTabIndex = index }, - text = { Text(text = title) } + text = { Text(text = title) }, ) } } @@ -380,12 +380,12 @@ fun NiaCatalog() { val icons = listOf( NiaIcons.UpcomingBorder, NiaIcons.MenuBookBorder, - NiaIcons.BookmarksBorder + NiaIcons.BookmarksBorder, ) val selectedIcons = listOf( NiaIcons.Upcoming, NiaIcons.MenuBook, - NiaIcons.Bookmarks + NiaIcons.Bookmarks, ) val tagIcon = NiaIcons.Tag NiaNavigationBar { @@ -397,7 +397,7 @@ fun NiaCatalog() { } else { Icon( painter = painterResource(id = icons[index]), - contentDescription = item + contentDescription = item, ) } }, @@ -407,13 +407,13 @@ fun NiaCatalog() { } else { Icon( painter = painterResource(id = selectedIcons[index]), - contentDescription = item + contentDescription = item, ) } }, label = { Text(item) }, selected = selectedItem == index, - onClick = { selectedItem = index } + onClick = { selectedItem = index }, ) } } diff --git a/app/src/androidTest/java/com/google/samples/apps/nowinandroid/ui/NavigationTest.kt b/app/src/androidTest/java/com/google/samples/apps/nowinandroid/ui/NavigationTest.kt index 8474c3546..17dd28ac7 100644 --- a/app/src/androidTest/java/com/google/samples/apps/nowinandroid/ui/NavigationTest.kt +++ b/app/src/androidTest/java/com/google/samples/apps/nowinandroid/ui/NavigationTest.kt @@ -29,10 +29,6 @@ import androidx.test.espresso.Espresso import androidx.test.espresso.NoActivityResumedException import com.google.samples.apps.nowinandroid.MainActivity import com.google.samples.apps.nowinandroid.R -import com.google.samples.apps.nowinandroid.feature.bookmarks.R as BookmarksR -import com.google.samples.apps.nowinandroid.feature.foryou.R as FeatureForyouR -import com.google.samples.apps.nowinandroid.feature.interests.R as FeatureInterestsR -import com.google.samples.apps.nowinandroid.feature.settings.R as SettingsR import dagger.hilt.android.testing.BindValue import dagger.hilt.android.testing.HiltAndroidRule import dagger.hilt.android.testing.HiltAndroidTest @@ -40,6 +36,10 @@ import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.rules.TemporaryFolder +import com.google.samples.apps.nowinandroid.feature.bookmarks.R as BookmarksR +import com.google.samples.apps.nowinandroid.feature.foryou.R as FeatureForyouR +import com.google.samples.apps.nowinandroid.feature.interests.R as FeatureInterestsR +import com.google.samples.apps.nowinandroid.feature.settings.R as SettingsR /** * Tests all the navigation flows that are handled by the navigation library. @@ -57,7 +57,8 @@ class NavigationTest { * Create a temporary folder used to create a Data Store file. This guarantees that * the file is removed in between each test, preventing a crash. */ - @BindValue @get:Rule(order = 1) + @BindValue + @get:Rule(order = 1) val tmpFolder: TemporaryFolder = TemporaryFolder.builder().assureDeletion().build() /** @@ -165,7 +166,6 @@ class NavigationTest { @Test fun topLevelDestinations_showTopBarWithTitle() { composeTestRule.apply { - // Verify that the top bar contains the app name on the first screen. onNodeWithText(appName).assertExists() @@ -207,7 +207,6 @@ class NavigationTest { @Test fun whenSettingsDialogDismissed_previousScreenIsDisplayed() { composeTestRule.apply { - // Navigate to the saved screen, open the settings dialog, then close it. onNodeWithText(saved).performClick() onNodeWithContentDescription(settings).performClick() diff --git a/app/src/androidTest/java/com/google/samples/apps/nowinandroid/ui/NavigationUiTest.kt b/app/src/androidTest/java/com/google/samples/apps/nowinandroid/ui/NavigationUiTest.kt index 67dd5b61c..ca20d4332 100644 --- a/app/src/androidTest/java/com/google/samples/apps/nowinandroid/ui/NavigationUiTest.kt +++ b/app/src/androidTest/java/com/google/samples/apps/nowinandroid/ui/NavigationUiTest.kt @@ -30,11 +30,11 @@ import com.google.samples.apps.nowinandroid.uitesthiltmanifest.HiltComponentActi import dagger.hilt.android.testing.BindValue import dagger.hilt.android.testing.HiltAndroidRule import dagger.hilt.android.testing.HiltAndroidTest -import javax.inject.Inject import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.rules.TemporaryFolder +import javax.inject.Inject /** * Tests that the navigation UI is rendered correctly on different screen sizes. @@ -53,7 +53,8 @@ class NavigationUiTest { * Create a temporary folder used to create a Data Store file. This guarantees that * the file is removed in between each test, preventing a crash. */ - @BindValue @get:Rule(order = 1) + @BindValue + @get:Rule(order = 1) val tmpFolder: TemporaryFolder = TemporaryFolder.builder().assureDeletion().build() /** @@ -77,9 +78,9 @@ class NavigationUiTest { BoxWithConstraints { NiaApp( windowSizeClass = WindowSizeClass.calculateFromSize( - DpSize(maxWidth, maxHeight) + DpSize(maxWidth, maxHeight), ), - networkMonitor = networkMonitor + networkMonitor = networkMonitor, ) } } @@ -96,9 +97,9 @@ class NavigationUiTest { BoxWithConstraints { NiaApp( windowSizeClass = WindowSizeClass.calculateFromSize( - DpSize(maxWidth, maxHeight) + DpSize(maxWidth, maxHeight), ), - networkMonitor = networkMonitor + networkMonitor = networkMonitor, ) } } @@ -115,9 +116,9 @@ class NavigationUiTest { BoxWithConstraints { NiaApp( windowSizeClass = WindowSizeClass.calculateFromSize( - DpSize(maxWidth, maxHeight) + DpSize(maxWidth, maxHeight), ), - networkMonitor = networkMonitor + networkMonitor = networkMonitor, ) } } @@ -134,9 +135,9 @@ class NavigationUiTest { BoxWithConstraints { NiaApp( windowSizeClass = WindowSizeClass.calculateFromSize( - DpSize(maxWidth, maxHeight) + DpSize(maxWidth, maxHeight), ), - networkMonitor = networkMonitor + networkMonitor = networkMonitor, ) } } @@ -153,9 +154,9 @@ class NavigationUiTest { BoxWithConstraints { NiaApp( windowSizeClass = WindowSizeClass.calculateFromSize( - DpSize(maxWidth, maxHeight) + DpSize(maxWidth, maxHeight), ), - networkMonitor = networkMonitor + networkMonitor = networkMonitor, ) } } @@ -172,9 +173,9 @@ class NavigationUiTest { BoxWithConstraints { NiaApp( windowSizeClass = WindowSizeClass.calculateFromSize( - DpSize(maxWidth, maxHeight) + DpSize(maxWidth, maxHeight), ), - networkMonitor = networkMonitor + networkMonitor = networkMonitor, ) } } @@ -191,9 +192,9 @@ class NavigationUiTest { BoxWithConstraints { NiaApp( windowSizeClass = WindowSizeClass.calculateFromSize( - DpSize(maxWidth, maxHeight) + DpSize(maxWidth, maxHeight), ), - networkMonitor = networkMonitor + networkMonitor = networkMonitor, ) } } @@ -210,9 +211,9 @@ class NavigationUiTest { BoxWithConstraints { NiaApp( windowSizeClass = WindowSizeClass.calculateFromSize( - DpSize(maxWidth, maxHeight) + DpSize(maxWidth, maxHeight), ), - networkMonitor = networkMonitor + networkMonitor = networkMonitor, ) } } @@ -229,9 +230,9 @@ class NavigationUiTest { BoxWithConstraints { NiaApp( windowSizeClass = WindowSizeClass.calculateFromSize( - DpSize(maxWidth, maxHeight) + DpSize(maxWidth, maxHeight), ), - networkMonitor = networkMonitor + networkMonitor = networkMonitor, ) } } diff --git a/app/src/androidTest/java/com/google/samples/apps/nowinandroid/ui/NiaAppStateTest.kt b/app/src/androidTest/java/com/google/samples/apps/nowinandroid/ui/NiaAppStateTest.kt index 8e0d65636..64896a544 100644 --- a/app/src/androidTest/java/com/google/samples/apps/nowinandroid/ui/NiaAppStateTest.kt +++ b/app/src/androidTest/java/com/google/samples/apps/nowinandroid/ui/NiaAppStateTest.kt @@ -31,15 +31,15 @@ import androidx.navigation.compose.composable import androidx.navigation.createGraph import androidx.navigation.testing.TestNavHostController import com.google.samples.apps.nowinandroid.core.testing.util.TestNetworkMonitor -import kotlin.test.assertEquals -import kotlin.test.assertFalse -import kotlin.test.assertTrue import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch import kotlinx.coroutines.test.UnconfinedTestDispatcher import kotlinx.coroutines.test.runTest import org.junit.Rule import org.junit.Test +import kotlin.test.assertEquals +import kotlin.test.assertFalse +import kotlin.test.assertTrue /** * Tests [NiaAppState]. @@ -70,7 +70,7 @@ class NiaAppStateTest { windowSizeClass = getCompactWindowClass(), navController = navController, networkMonitor = networkMonitor, - coroutineScope = backgroundScope + coroutineScope = backgroundScope, ) } @@ -91,7 +91,7 @@ class NiaAppStateTest { composeTestRule.setContent { state = rememberNiaAppState( windowSizeClass = getCompactWindowClass(), - networkMonitor = networkMonitor + networkMonitor = networkMonitor, ) } @@ -108,7 +108,7 @@ class NiaAppStateTest { windowSizeClass = getCompactWindowClass(), navController = NavHostController(LocalContext.current), networkMonitor = networkMonitor, - coroutineScope = backgroundScope + coroutineScope = backgroundScope, ) } @@ -123,7 +123,7 @@ class NiaAppStateTest { windowSizeClass = WindowSizeClass.calculateFromSize(DpSize(800.dp, 800.dp)), navController = NavHostController(LocalContext.current), networkMonitor = networkMonitor, - coroutineScope = backgroundScope + coroutineScope = backgroundScope, ) } @@ -133,13 +133,12 @@ class NiaAppStateTest { @Test fun niaAppState_showNavRail_large() = runTest { - composeTestRule.setContent { state = NiaAppState( windowSizeClass = WindowSizeClass.calculateFromSize(DpSize(900.dp, 1200.dp)), navController = NavHostController(LocalContext.current), networkMonitor = networkMonitor, - coroutineScope = backgroundScope + coroutineScope = backgroundScope, ) } @@ -149,13 +148,12 @@ class NiaAppStateTest { @Test fun stateIsOfflineWhenNetworkMonitorIsOffline() = runTest(UnconfinedTestDispatcher()) { - composeTestRule.setContent { state = NiaAppState( windowSizeClass = WindowSizeClass.calculateFromSize(DpSize(900.dp, 1200.dp)), navController = NavHostController(LocalContext.current), networkMonitor = networkMonitor, - coroutineScope = backgroundScope + coroutineScope = backgroundScope, ) } @@ -163,7 +161,7 @@ class NiaAppStateTest { networkMonitor.setConnected(false) assertEquals( true, - state.isOffline.value + state.isOffline.value, ) } diff --git a/app/src/main/java/com/google/samples/apps/nowinandroid/MainActivity.kt b/app/src/main/java/com/google/samples/apps/nowinandroid/MainActivity.kt index 06cbf9c84..e46d2156a 100644 --- a/app/src/main/java/com/google/samples/apps/nowinandroid/MainActivity.kt +++ b/app/src/main/java/com/google/samples/apps/nowinandroid/MainActivity.kt @@ -43,10 +43,10 @@ import com.google.samples.apps.nowinandroid.core.model.data.DarkThemeConfig import com.google.samples.apps.nowinandroid.core.model.data.ThemeBrand import com.google.samples.apps.nowinandroid.ui.NiaApp import dagger.hilt.android.AndroidEntryPoint -import javax.inject.Inject import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch +import javax.inject.Inject @OptIn(ExperimentalMaterial3WindowSizeClassApi::class) @AndroidEntryPoint @@ -107,7 +107,7 @@ class MainActivity : ComponentActivity() { NiaTheme( darkTheme = darkTheme, androidTheme = shouldUseAndroidTheme(uiState), - disableDynamicTheming = shouldDisableDynamicTheming(uiState) + disableDynamicTheming = shouldDisableDynamicTheming(uiState), ) { NiaApp( networkMonitor = networkMonitor, diff --git a/app/src/main/java/com/google/samples/apps/nowinandroid/MainActivityViewModel.kt b/app/src/main/java/com/google/samples/apps/nowinandroid/MainActivityViewModel.kt index 0a182cbd7..ebea4b965 100644 --- a/app/src/main/java/com/google/samples/apps/nowinandroid/MainActivityViewModel.kt +++ b/app/src/main/java/com/google/samples/apps/nowinandroid/MainActivityViewModel.kt @@ -23,22 +23,22 @@ import com.google.samples.apps.nowinandroid.MainActivityUiState.Success import com.google.samples.apps.nowinandroid.core.data.repository.UserDataRepository import com.google.samples.apps.nowinandroid.core.model.data.UserData import dagger.hilt.android.lifecycle.HiltViewModel -import javax.inject.Inject import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn +import javax.inject.Inject @HiltViewModel class MainActivityViewModel @Inject constructor( - userDataRepository: UserDataRepository + userDataRepository: UserDataRepository, ) : ViewModel() { val uiState: StateFlow = userDataRepository.userData.map { Success(it) }.stateIn( scope = viewModelScope, initialValue = Loading, - started = SharingStarted.WhileSubscribed(5_000) + started = SharingStarted.WhileSubscribed(5_000), ) } diff --git a/app/src/main/java/com/google/samples/apps/nowinandroid/di/JankStatsModule.kt b/app/src/main/java/com/google/samples/apps/nowinandroid/di/JankStatsModule.kt index 90f844c1b..be64d057f 100644 --- a/app/src/main/java/com/google/samples/apps/nowinandroid/di/JankStatsModule.kt +++ b/app/src/main/java/com/google/samples/apps/nowinandroid/di/JankStatsModule.kt @@ -47,7 +47,7 @@ object JankStatsModule { @Provides fun providesJankStats( window: Window, - frameListener: JankStats.OnFrameListener + frameListener: JankStats.OnFrameListener, ): JankStats { return JankStats.createAndTrack(window, frameListener) } diff --git a/app/src/main/java/com/google/samples/apps/nowinandroid/navigation/NiaNavHost.kt b/app/src/main/java/com/google/samples/apps/nowinandroid/navigation/NiaNavHost.kt index 6146a5527..d6e30a10e 100644 --- a/app/src/main/java/com/google/samples/apps/nowinandroid/navigation/NiaNavHost.kt +++ b/app/src/main/java/com/google/samples/apps/nowinandroid/navigation/NiaNavHost.kt @@ -39,7 +39,7 @@ fun NiaNavHost( navController: NavHostController, onBackClick: () -> Unit, modifier: Modifier = Modifier, - startDestination: String = forYouNavigationRoute + startDestination: String = forYouNavigationRoute, ) { NavHost( navController = navController, @@ -54,7 +54,7 @@ fun NiaNavHost( }, nestedGraphs = { topicScreen(onBackClick) - } + }, ) } } diff --git a/app/src/main/java/com/google/samples/apps/nowinandroid/navigation/TopLevelDestination.kt b/app/src/main/java/com/google/samples/apps/nowinandroid/navigation/TopLevelDestination.kt index 956037f29..396ab8b7b 100644 --- a/app/src/main/java/com/google/samples/apps/nowinandroid/navigation/TopLevelDestination.kt +++ b/app/src/main/java/com/google/samples/apps/nowinandroid/navigation/TopLevelDestination.kt @@ -34,24 +34,24 @@ enum class TopLevelDestination( val selectedIcon: Icon, val unselectedIcon: Icon, val iconTextId: Int, - val titleTextId: Int + val titleTextId: Int, ) { FOR_YOU( selectedIcon = DrawableResourceIcon(NiaIcons.Upcoming), unselectedIcon = DrawableResourceIcon(NiaIcons.UpcomingBorder), iconTextId = forYouR.string.for_you, - titleTextId = R.string.app_name + titleTextId = R.string.app_name, ), BOOKMARKS( selectedIcon = DrawableResourceIcon(NiaIcons.Bookmarks), unselectedIcon = DrawableResourceIcon(NiaIcons.BookmarksBorder), iconTextId = bookmarksR.string.saved, - titleTextId = bookmarksR.string.saved + titleTextId = bookmarksR.string.saved, ), INTERESTS( selectedIcon = ImageVectorIcon(NiaIcons.Grid3x3), unselectedIcon = ImageVectorIcon(NiaIcons.Grid3x3), iconTextId = interestsR.string.interests, - titleTextId = interestsR.string.interests - ) + titleTextId = interestsR.string.interests, + ), } diff --git a/app/src/main/java/com/google/samples/apps/nowinandroid/ui/NiaApp.kt b/app/src/main/java/com/google/samples/apps/nowinandroid/ui/NiaApp.kt index a3f570ad5..14bc11992 100644 --- a/app/src/main/java/com/google/samples/apps/nowinandroid/ui/NiaApp.kt +++ b/app/src/main/java/com/google/samples/apps/nowinandroid/ui/NiaApp.kt @@ -68,16 +68,16 @@ import com.google.samples.apps.nowinandroid.core.designsystem.icon.Icon.ImageVec import com.google.samples.apps.nowinandroid.core.designsystem.icon.NiaIcons import com.google.samples.apps.nowinandroid.core.designsystem.theme.GradientColors import com.google.samples.apps.nowinandroid.core.designsystem.theme.LocalGradientColors -import com.google.samples.apps.nowinandroid.feature.settings.R as settingsR import com.google.samples.apps.nowinandroid.feature.settings.SettingsDialog import com.google.samples.apps.nowinandroid.navigation.NiaNavHost import com.google.samples.apps.nowinandroid.navigation.TopLevelDestination +import com.google.samples.apps.nowinandroid.feature.settings.R as settingsR @OptIn( ExperimentalMaterial3Api::class, ExperimentalLayoutApi::class, ExperimentalComposeUiApi::class, - ExperimentalLifecycleComposeApi::class + ExperimentalLifecycleComposeApi::class, ) @Composable fun NiaApp( @@ -85,7 +85,7 @@ fun NiaApp( networkMonitor: NetworkMonitor, appState: NiaAppState = rememberNiaAppState( networkMonitor = networkMonitor, - windowSizeClass = windowSizeClass + windowSizeClass = windowSizeClass, ), ) { val shouldShowGradientBackground = @@ -106,15 +106,17 @@ fun NiaApp( // If user is not connected to the internet show a snack bar to inform them. val notConnectedMessage = stringResource(R.string.not_connected) LaunchedEffect(isOffline) { - if (isOffline) snackbarHostState.showSnackbar( - message = notConnectedMessage, - duration = Indefinite - ) + if (isOffline) { + snackbarHostState.showSnackbar( + message = notConnectedMessage, + duration = Indefinite, + ) + } } if (appState.shouldShowSettingsDialog) { SettingsDialog( - onDismiss = { appState.setShowSettingsDialog(false) } + onDismiss = { appState.setShowSettingsDialog(false) }, ) } @@ -132,10 +134,10 @@ fun NiaApp( destinations = appState.topLevelDestinations, onNavigateToDestination = appState::navigateToTopLevelDestination, currentDestination = appState.currentDestination, - modifier = Modifier.testTag("NiaBottomBar") + modifier = Modifier.testTag("NiaBottomBar"), ) } - } + }, ) { padding -> Row( Modifier @@ -144,9 +146,9 @@ fun NiaApp( .consumedWindowInsets(padding) .windowInsetsPadding( WindowInsets.safeDrawing.only( - WindowInsetsSides.Horizontal - ) - ) + WindowInsetsSides.Horizontal, + ), + ), ) { if (appState.shouldShowNavRail) { NiaNavRail( @@ -155,7 +157,7 @@ fun NiaApp( currentDestination = appState.currentDestination, modifier = Modifier .testTag("NiaNavRail") - .safeDrawingPadding() + .safeDrawingPadding(), ) } @@ -167,18 +169,18 @@ fun NiaApp( titleRes = destination.titleTextId, actionIcon = NiaIcons.Settings, actionIconContentDescription = stringResource( - id = settingsR.string.top_app_bar_action_icon_description + id = settingsR.string.top_app_bar_action_icon_description, ), colors = TopAppBarDefaults.centerAlignedTopAppBarColors( - containerColor = Color.Transparent + containerColor = Color.Transparent, ), - onActionClick = { appState.setShowSettingsDialog(true) } + onActionClick = { appState.setShowSettingsDialog(true) }, ) } NiaNavHost( navController = appState.navController, - onBackClick = appState::onBackClick + onBackClick = appState::onBackClick, ) } @@ -212,15 +214,15 @@ private fun NiaNavRail( when (icon) { is ImageVectorIcon -> Icon( imageVector = icon.imageVector, - contentDescription = null + contentDescription = null, ) is DrawableResourceIcon -> Icon( painter = painterResource(id = icon.id), - contentDescription = null + contentDescription = null, ) } }, - label = { Text(stringResource(destination.iconTextId)) } + label = { Text(stringResource(destination.iconTextId)) }, ) } } @@ -231,10 +233,10 @@ private fun NiaBottomBar( destinations: List, onNavigateToDestination: (TopLevelDestination) -> Unit, currentDestination: NavDestination?, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { NiaNavigationBar( - modifier = modifier + modifier = modifier, ) { destinations.forEach { destination -> val selected = currentDestination.isTopLevelDestinationInHierarchy(destination) @@ -250,16 +252,16 @@ private fun NiaBottomBar( when (icon) { is ImageVectorIcon -> Icon( imageVector = icon.imageVector, - contentDescription = null + contentDescription = null, ) is DrawableResourceIcon -> Icon( painter = painterResource(id = icon.id), - contentDescription = null + contentDescription = null, ) } }, - label = { Text(stringResource(destination.iconTextId)) } + label = { Text(stringResource(destination.iconTextId)) }, ) } } diff --git a/app/src/main/java/com/google/samples/apps/nowinandroid/ui/NiaAppState.kt b/app/src/main/java/com/google/samples/apps/nowinandroid/ui/NiaAppState.kt index bc5724c02..51df525a0 100644 --- a/app/src/main/java/com/google/samples/apps/nowinandroid/ui/NiaAppState.kt +++ b/app/src/main/java/com/google/samples/apps/nowinandroid/ui/NiaAppState.kt @@ -56,7 +56,7 @@ fun rememberNiaAppState( windowSizeClass: WindowSizeClass, networkMonitor: NetworkMonitor, coroutineScope: CoroutineScope = rememberCoroutineScope(), - navController: NavHostController = rememberNavController() + navController: NavHostController = rememberNavController(), ): NiaAppState { NavigationTrackingSideEffect(navController) return remember(navController, coroutineScope, windowSizeClass, networkMonitor) { @@ -98,7 +98,7 @@ class NiaAppState( .stateIn( scope = coroutineScope, started = SharingStarted.WhileSubscribed(5_000), - initialValue = false + initialValue = false, ) /** diff --git a/benchmarks/src/main/java/androidx/test/uiautomator/UiAutomatorHelpers.kt b/benchmarks/src/main/java/androidx/test/uiautomator/UiAutomatorHelpers.kt index 3e5191d34..85867b982 100644 --- a/benchmarks/src/main/java/androidx/test/uiautomator/UiAutomatorHelpers.kt +++ b/benchmarks/src/main/java/androidx/test/uiautomator/UiAutomatorHelpers.kt @@ -28,7 +28,7 @@ import androidx.test.uiautomator.HasChildrenOp.EXACTLY */ fun untilHasChildren( childCount: Int = 1, - op: HasChildrenOp = AT_LEAST + op: HasChildrenOp = AT_LEAST, ): UiObject2Condition { return object : UiObject2Condition() { override fun apply(element: UiObject2): Boolean { @@ -44,5 +44,5 @@ fun untilHasChildren( enum class HasChildrenOp { AT_LEAST, EXACTLY, - AT_MOST + AT_MOST, } diff --git a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ScrollForYouFeedBenchmark.kt b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ScrollForYouFeedBenchmark.kt index b4e8352dc..f8945a31c 100644 --- a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ScrollForYouFeedBenchmark.kt +++ b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ScrollForYouFeedBenchmark.kt @@ -47,7 +47,7 @@ class ScrollForYouFeedBenchmark { // Start the app pressHome() startActivityAndWait() - } + }, ) { forYouWaitForContent() forYouSelectTopics() diff --git a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/interests/TopicsScreenRecompositionBenchmark.kt b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/interests/TopicsScreenRecompositionBenchmark.kt index 69f02d235..24bd233ea 100644 --- a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/interests/TopicsScreenRecompositionBenchmark.kt +++ b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/interests/TopicsScreenRecompositionBenchmark.kt @@ -51,7 +51,7 @@ class TopicsScreenRecompositionBenchmark { // Navigate to interests screen device.findObject(By.text("Interests")).click() device.waitForIdle() - } + }, ) { interestsWaitForTopics() repeat(3) { diff --git a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/startup/StartupBenchmark.kt b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/startup/StartupBenchmark.kt index 5d83d89b2..8e396eda3 100644 --- a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/startup/StartupBenchmark.kt +++ b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/startup/StartupBenchmark.kt @@ -66,7 +66,7 @@ abstract class AbstractStartupBenchmark(private val startupMode: StartupMode) { @Test fun startupBaselineProfileDisabled() = startup( - CompilationMode.Partial(baselineProfileMode = Disable, warmupIterations = 1) + CompilationMode.Partial(baselineProfileMode = Disable, warmupIterations = 1), ) @Test @@ -83,7 +83,7 @@ abstract class AbstractStartupBenchmark(private val startupMode: StartupMode) { startupMode = startupMode, setupBlock = { pressHome() - } + }, ) { startActivityAndWait() // Waits until the content is ready to capture Time To Full Display diff --git a/core/common/src/main/java/com/google/samples/apps/nowinandroid/core/network/NiaDispatchers.kt b/core/common/src/main/java/com/google/samples/apps/nowinandroid/core/network/NiaDispatchers.kt index 5895568a7..277b68717 100644 --- a/core/common/src/main/java/com/google/samples/apps/nowinandroid/core/network/NiaDispatchers.kt +++ b/core/common/src/main/java/com/google/samples/apps/nowinandroid/core/network/NiaDispatchers.kt @@ -24,5 +24,5 @@ import kotlin.annotation.AnnotationRetention.RUNTIME annotation class Dispatcher(val niaDispatcher: NiaDispatchers) enum class NiaDispatchers { - IO + IO, } diff --git a/core/common/src/test/java/com/google/samples/apps/nowinandroid/core/result/ResultKtTest.kt b/core/common/src/test/java/com/google/samples/apps/nowinandroid/core/result/ResultKtTest.kt index 90852c7c5..4f1229e9d 100644 --- a/core/common/src/test/java/com/google/samples/apps/nowinandroid/core/result/ResultKtTest.kt +++ b/core/common/src/test/java/com/google/samples/apps/nowinandroid/core/result/ResultKtTest.kt @@ -17,10 +17,10 @@ package com.google.samples.apps.nowinandroid.core.result import app.cash.turbine.test -import kotlin.test.assertEquals import kotlinx.coroutines.flow.flow import kotlinx.coroutines.test.runTest import org.junit.Test +import kotlin.test.assertEquals class ResultKtTest { @@ -38,11 +38,12 @@ class ResultKtTest { when (val errorResult = awaitItem()) { is Result.Error -> assertEquals( "Test Done", - errorResult.exception?.message + errorResult.exception?.message, ) Result.Loading, - is Result.Success -> throw IllegalStateException( - "The flow should have emitted an Error Result" + is Result.Success, + -> throw IllegalStateException( + "The flow should have emitted an Error Result", ) } diff --git a/core/data-test/src/main/java/com/google/samples/apps/nowinandroid/core/data/test/AlwaysOnlineNetworkMonitor.kt b/core/data-test/src/main/java/com/google/samples/apps/nowinandroid/core/data/test/AlwaysOnlineNetworkMonitor.kt index 91e47b688..c00c99ded 100644 --- a/core/data-test/src/main/java/com/google/samples/apps/nowinandroid/core/data/test/AlwaysOnlineNetworkMonitor.kt +++ b/core/data-test/src/main/java/com/google/samples/apps/nowinandroid/core/data/test/AlwaysOnlineNetworkMonitor.kt @@ -17,9 +17,9 @@ package com.google.samples.apps.nowinandroid.core.data.test import com.google.samples.apps.nowinandroid.core.data.util.NetworkMonitor -import javax.inject.Inject import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flowOf +import javax.inject.Inject class AlwaysOnlineNetworkMonitor @Inject constructor() : NetworkMonitor { override val isOnline: Flow = flowOf(true) diff --git a/core/data-test/src/main/java/com/google/samples/apps/nowinandroid/core/data/test/TestDataModule.kt b/core/data-test/src/main/java/com/google/samples/apps/nowinandroid/core/data/test/TestDataModule.kt index ca20edc44..f4fc9c7b0 100644 --- a/core/data-test/src/main/java/com/google/samples/apps/nowinandroid/core/data/test/TestDataModule.kt +++ b/core/data-test/src/main/java/com/google/samples/apps/nowinandroid/core/data/test/TestDataModule.kt @@ -32,26 +32,26 @@ import dagger.hilt.testing.TestInstallIn @Module @TestInstallIn( components = [SingletonComponent::class], - replaces = [DataModule::class] + replaces = [DataModule::class], ) interface TestDataModule { @Binds fun bindsTopicRepository( - fakeTopicsRepository: FakeTopicsRepository + fakeTopicsRepository: FakeTopicsRepository, ): TopicsRepository @Binds fun bindsNewsResourceRepository( - fakeNewsRepository: FakeNewsRepository + fakeNewsRepository: FakeNewsRepository, ): NewsRepository @Binds fun bindsUserDataRepository( - userDataRepository: FakeUserDataRepository + userDataRepository: FakeUserDataRepository, ): UserDataRepository @Binds fun bindsNetworkMonitor( - networkMonitor: AlwaysOnlineNetworkMonitor + networkMonitor: AlwaysOnlineNetworkMonitor, ): NetworkMonitor } diff --git a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/SyncUtilities.kt b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/SyncUtilities.kt index 0f2a592de..5d069dbaf 100644 --- a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/SyncUtilities.kt +++ b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/SyncUtilities.kt @@ -19,9 +19,9 @@ package com.google.samples.apps.nowinandroid.core.data import android.util.Log import com.google.samples.apps.nowinandroid.core.datastore.ChangeListVersions import com.google.samples.apps.nowinandroid.core.network.model.NetworkChangeList -import kotlin.coroutines.cancellation.CancellationException import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine +import kotlin.coroutines.cancellation.CancellationException /** * Interface marker for a class that manages synchronization between local data and a remote @@ -62,7 +62,7 @@ private suspend fun suspendRunCatching(block: suspend () -> T): Result = Log.i( "suspendRunCatching", "Failed to evaluate a suspendRunCatchingBlock. Returning failure Result", - exception + exception, ) Result.failure(exception) } @@ -116,10 +116,10 @@ fun combine( flow4: Flow, flow5: Flow, flow6: Flow, - transform: suspend (T1, T2, T3, T4, T5, T6) -> R + transform: suspend (T1, T2, T3, T4, T5, T6) -> R, ): Flow = combine( combine(flow, flow2, flow3, ::Triple), - combine(flow4, flow5, flow6, ::Triple) + combine(flow4, flow5, flow6, ::Triple), ) { t1, t2 -> transform( t1.first, @@ -127,6 +127,6 @@ fun combine( t1.third, t2.first, t2.second, - t2.third + t2.third, ) } diff --git a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/di/DataModule.kt b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/di/DataModule.kt index c58552416..b4dda701e 100644 --- a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/di/DataModule.kt +++ b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/di/DataModule.kt @@ -35,21 +35,21 @@ interface DataModule { @Binds fun bindsTopicRepository( - topicsRepository: OfflineFirstTopicsRepository + topicsRepository: OfflineFirstTopicsRepository, ): TopicsRepository @Binds fun bindsNewsResourceRepository( - newsRepository: OfflineFirstNewsRepository + newsRepository: OfflineFirstNewsRepository, ): NewsRepository @Binds fun bindsUserDataRepository( - userDataRepository: OfflineFirstUserDataRepository + userDataRepository: OfflineFirstUserDataRepository, ): UserDataRepository @Binds fun bindsNetworkMonitor( - networkMonitor: ConnectivityManagerNetworkMonitor + networkMonitor: ConnectivityManagerNetworkMonitor, ): NetworkMonitor } diff --git a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/model/NewsResource.kt b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/model/NewsResource.kt index ecb2d7a4e..c3ad91dfe 100644 --- a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/model/NewsResource.kt +++ b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/model/NewsResource.kt @@ -62,6 +62,6 @@ fun NetworkNewsResource.topicCrossReferences(): List topics.map { topicId -> NewsResourceTopicCrossRef( newsResourceId = id, - topicId = topicId + topicId = topicId, ) } diff --git a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/model/Topic.kt b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/model/Topic.kt index b9acb90a0..188b1e06d 100644 --- a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/model/Topic.kt +++ b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/model/Topic.kt @@ -25,5 +25,5 @@ fun NetworkTopic.asEntity() = TopicEntity( shortDescription = shortDescription, longDescription = longDescription, url = url, - imageUrl = imageUrl + imageUrl = imageUrl, ) diff --git a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepository.kt b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepository.kt index bd434a7dc..9e041b956 100644 --- a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepository.kt +++ b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepository.kt @@ -30,9 +30,9 @@ import com.google.samples.apps.nowinandroid.core.datastore.ChangeListVersions import com.google.samples.apps.nowinandroid.core.model.data.NewsResource import com.google.samples.apps.nowinandroid.core.network.NiaNetworkDataSource import com.google.samples.apps.nowinandroid.core.network.model.NetworkNewsResource -import javax.inject.Inject import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map +import javax.inject.Inject /** * Disk storage backed implementation of the [NewsRepository]. @@ -49,9 +49,9 @@ class OfflineFirstNewsRepository @Inject constructor( .map { it.map(PopulatedNewsResource::asExternalModel) } override fun getNewsResources( - filterTopicIds: Set + filterTopicIds: Set, ): Flow> = newsResourceDao.getNewsResources( - filterTopicIds = filterTopicIds + filterTopicIds = filterTopicIds, ) .map { it.map(PopulatedNewsResource::asExternalModel) } @@ -74,18 +74,18 @@ class OfflineFirstNewsRepository @Inject constructor( topicEntities = networkNewsResources .map(NetworkNewsResource::topicEntityShells) .flatten() - .distinctBy(TopicEntity::id) + .distinctBy(TopicEntity::id), ) newsResourceDao.upsertNewsResources( newsResourceEntities = networkNewsResources - .map(NetworkNewsResource::asEntity) + .map(NetworkNewsResource::asEntity), ) newsResourceDao.insertOrIgnoreTopicCrossRefEntities( newsResourceTopicCrossReferences = networkNewsResources .map(NetworkNewsResource::topicCrossReferences) .distinct() - .flatten() + .flatten(), ) - } + }, ) } diff --git a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstTopicsRepository.kt b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstTopicsRepository.kt index c3d2cb72e..13dd19e49 100644 --- a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstTopicsRepository.kt +++ b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstTopicsRepository.kt @@ -26,9 +26,9 @@ import com.google.samples.apps.nowinandroid.core.datastore.ChangeListVersions import com.google.samples.apps.nowinandroid.core.model.data.Topic import com.google.samples.apps.nowinandroid.core.network.NiaNetworkDataSource import com.google.samples.apps.nowinandroid.core.network.model.NetworkTopic -import javax.inject.Inject import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map +import javax.inject.Inject /** * Disk storage backed implementation of the [TopicsRepository]. @@ -59,8 +59,8 @@ class OfflineFirstTopicsRepository @Inject constructor( modelUpdater = { changedIds -> val networkTopics = network.getTopics(ids = changedIds) topicDao.upsertTopics( - entities = networkTopics.map(NetworkTopic::asEntity) + entities = networkTopics.map(NetworkTopic::asEntity), ) - } + }, ) } diff --git a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstUserDataRepository.kt b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstUserDataRepository.kt index 954779a3f..200ca4a3d 100644 --- a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstUserDataRepository.kt +++ b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstUserDataRepository.kt @@ -20,11 +20,11 @@ import com.google.samples.apps.nowinandroid.core.datastore.NiaPreferencesDataSou import com.google.samples.apps.nowinandroid.core.model.data.DarkThemeConfig import com.google.samples.apps.nowinandroid.core.model.data.ThemeBrand import com.google.samples.apps.nowinandroid.core.model.data.UserData -import javax.inject.Inject import kotlinx.coroutines.flow.Flow +import javax.inject.Inject class OfflineFirstUserDataRepository @Inject constructor( - private val niaPreferencesDataSource: NiaPreferencesDataSource + private val niaPreferencesDataSource: NiaPreferencesDataSource, ) : UserDataRepository { override val userData: Flow = diff --git a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/fake/FakeNewsRepository.kt b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/fake/FakeNewsRepository.kt index f74a94a43..d6a712538 100644 --- a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/fake/FakeNewsRepository.kt +++ b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/fake/FakeNewsRepository.kt @@ -26,11 +26,11 @@ import com.google.samples.apps.nowinandroid.core.network.Dispatcher import com.google.samples.apps.nowinandroid.core.network.NiaDispatchers.IO import com.google.samples.apps.nowinandroid.core.network.fake.FakeNiaNetworkDataSource import com.google.samples.apps.nowinandroid.core.network.model.NetworkNewsResource -import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flowOn +import javax.inject.Inject /** * Fake implementation of the [NewsRepository] that retrieves the news resources from a JSON String. @@ -40,7 +40,7 @@ import kotlinx.coroutines.flow.flowOn */ class FakeNewsRepository @Inject constructor( @Dispatcher(IO) private val ioDispatcher: CoroutineDispatcher, - private val datasource: FakeNiaNetworkDataSource + private val datasource: FakeNiaNetworkDataSource, ) : NewsRepository { override fun getNewsResources(): Flow> = @@ -48,7 +48,7 @@ class FakeNewsRepository @Inject constructor( emit( datasource.getNewsResources() .map(NetworkNewsResource::asEntity) - .map(NewsResourceEntity::asExternalModel) + .map(NewsResourceEntity::asExternalModel), ) }.flowOn(ioDispatcher) @@ -61,7 +61,7 @@ class FakeNewsRepository @Inject constructor( .getNewsResources() .filter { it.topics.intersect(filterTopicIds).isNotEmpty() } .map(NetworkNewsResource::asEntity) - .map(NewsResourceEntity::asExternalModel) + .map(NewsResourceEntity::asExternalModel), ) }.flowOn(ioDispatcher) diff --git a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/fake/FakeTopicsRepository.kt b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/fake/FakeTopicsRepository.kt index 60d876b75..1ab9c9353 100644 --- a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/fake/FakeTopicsRepository.kt +++ b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/fake/FakeTopicsRepository.kt @@ -22,12 +22,12 @@ import com.google.samples.apps.nowinandroid.core.model.data.Topic import com.google.samples.apps.nowinandroid.core.network.Dispatcher import com.google.samples.apps.nowinandroid.core.network.NiaDispatchers.IO import com.google.samples.apps.nowinandroid.core.network.fake.FakeNiaNetworkDataSource -import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.map +import javax.inject.Inject /** * Fake implementation of the [TopicsRepository] that retrieves the topics from a JSON String, and @@ -38,7 +38,7 @@ import kotlinx.coroutines.flow.map */ class FakeTopicsRepository @Inject constructor( @Dispatcher(IO) private val ioDispatcher: CoroutineDispatcher, - private val datasource: FakeNiaNetworkDataSource + private val datasource: FakeNiaNetworkDataSource, ) : TopicsRepository { override fun getTopics(): Flow> = flow { emit( @@ -49,9 +49,9 @@ class FakeTopicsRepository @Inject constructor( shortDescription = it.shortDescription, longDescription = it.longDescription, url = it.url, - imageUrl = it.imageUrl + imageUrl = it.imageUrl, ) - } + }, ) }.flowOn(ioDispatcher) diff --git a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/fake/FakeUserDataRepository.kt b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/fake/FakeUserDataRepository.kt index d7920cabc..af206e5c7 100644 --- a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/fake/FakeUserDataRepository.kt +++ b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/fake/FakeUserDataRepository.kt @@ -21,8 +21,8 @@ import com.google.samples.apps.nowinandroid.core.datastore.NiaPreferencesDataSou import com.google.samples.apps.nowinandroid.core.model.data.DarkThemeConfig import com.google.samples.apps.nowinandroid.core.model.data.ThemeBrand import com.google.samples.apps.nowinandroid.core.model.data.UserData -import javax.inject.Inject import kotlinx.coroutines.flow.Flow +import javax.inject.Inject /** * Fake implementation of the [UserDataRepository] that returns hardcoded user data. diff --git a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/util/ConnectivityManagerNetworkMonitor.kt b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/util/ConnectivityManagerNetworkMonitor.kt index 0f86f5384..982f47c6e 100644 --- a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/util/ConnectivityManagerNetworkMonitor.kt +++ b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/util/ConnectivityManagerNetworkMonitor.kt @@ -26,14 +26,14 @@ import android.os.Build.VERSION import android.os.Build.VERSION_CODES import androidx.core.content.getSystemService import dagger.hilt.android.qualifiers.ApplicationContext -import javax.inject.Inject import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.callbackFlow import kotlinx.coroutines.flow.conflate +import javax.inject.Inject class ConnectivityManagerNetworkMonitor @Inject constructor( - @ApplicationContext private val context: Context + @ApplicationContext private val context: Context, ) : NetworkMonitor { override val isOnline: Flow = callbackFlow { val connectivityManager = context.getSystemService() @@ -54,7 +54,7 @@ class ConnectivityManagerNetworkMonitor @Inject constructor( override fun onCapabilitiesChanged( network: Network, - networkCapabilities: NetworkCapabilities + networkCapabilities: NetworkCapabilities, ) { channel.trySend(connectivityManager.isCurrentlyConnected()) } @@ -64,7 +64,7 @@ class ConnectivityManagerNetworkMonitor @Inject constructor( Builder() .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) .build(), - callback + callback, ) channel.trySend(connectivityManager.isCurrentlyConnected()) diff --git a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/model/NetworkEntityKtTest.kt b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/model/NetworkEntityKtTest.kt index ed0c78c8e..dbbb3a94e 100644 --- a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/model/NetworkEntityKtTest.kt +++ b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/model/NetworkEntityKtTest.kt @@ -20,9 +20,9 @@ import com.google.samples.apps.nowinandroid.core.model.data.NewsResourceType.Art import com.google.samples.apps.nowinandroid.core.network.model.NetworkNewsResource import com.google.samples.apps.nowinandroid.core.network.model.NetworkNewsResourceExpanded import com.google.samples.apps.nowinandroid.core.network.model.NetworkTopic -import kotlin.test.assertEquals import kotlinx.datetime.Instant import org.junit.Test +import kotlin.test.assertEquals class NetworkEntityKtTest { diff --git a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepositoryTest.kt b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepositoryTest.kt index cc32bf9bb..74848d655 100644 --- a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepositoryTest.kt +++ b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepositoryTest.kt @@ -35,13 +35,13 @@ import com.google.samples.apps.nowinandroid.core.datastore.test.testUserPreferen import com.google.samples.apps.nowinandroid.core.model.data.NewsResource import com.google.samples.apps.nowinandroid.core.network.model.NetworkChangeList import com.google.samples.apps.nowinandroid.core.network.model.NetworkNewsResource -import kotlin.test.assertEquals import kotlinx.coroutines.flow.first import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.rules.TemporaryFolder +import kotlin.test.assertEquals class OfflineFirstNewsRepositoryTest { @@ -65,8 +65,8 @@ class OfflineFirstNewsRepositoryTest { network = TestNiaNetworkDataSource() synchronizer = TestSynchronizer( NiaPreferencesDataSource( - tmpFolder.testUserPreferencesDataStore() - ) + tmpFolder.testUserPreferencesDataStore(), + ), ) subject = OfflineFirstNewsRepository( @@ -84,7 +84,7 @@ class OfflineFirstNewsRepositoryTest { .first() .map(PopulatedNewsResource::asExternalModel), subject.getNewsResources() - .first() + .first(), ) } @@ -100,7 +100,7 @@ class OfflineFirstNewsRepositoryTest { subject.getNewsResources( filterTopicIds = filteredInterestsIds, ) - .first() + .first(), ) assertEquals( @@ -108,7 +108,7 @@ class OfflineFirstNewsRepositoryTest { subject.getNewsResources( filterTopicIds = nonPresentInterestsIds, ) - .first() + .first(), ) } @@ -127,13 +127,13 @@ class OfflineFirstNewsRepositoryTest { assertEquals( newsResourcesFromNetwork.map(NewsResource::id), - newsResourcesFromDb.map(NewsResource::id) + newsResourcesFromDb.map(NewsResource::id), ) // After sync version should be updated assertEquals( network.latestChangeListVersion(CollectionType.NewsResources), - synchronizer.getChangeListVersions().newsResourceVersion + synchronizer.getChangeListVersions().newsResourceVersion, ) } @@ -155,7 +155,7 @@ class OfflineFirstNewsRepositoryTest { network.editCollection( collectionType = CollectionType.NewsResources, id = it, - isDelete = true + isDelete = true, ) } @@ -168,13 +168,13 @@ class OfflineFirstNewsRepositoryTest { // Assert that items marked deleted on the network have been deleted locally assertEquals( newsResourcesFromNetwork.map(NewsResource::id) - deletedItems, - newsResourcesFromDb.map(NewsResource::id) + newsResourcesFromDb.map(NewsResource::id), ) // After sync version should be updated assertEquals( network.latestChangeListVersion(CollectionType.NewsResources), - synchronizer.getChangeListVersions().newsResourceVersion + synchronizer.getChangeListVersions().newsResourceVersion, ) } @@ -190,7 +190,7 @@ class OfflineFirstNewsRepositoryTest { val changeList = network.changeListsAfter( CollectionType.NewsResources, - version = 7 + version = 7, ) val changeListIds = changeList .map(NetworkChangeList::id) @@ -207,13 +207,13 @@ class OfflineFirstNewsRepositoryTest { assertEquals( newsResourcesFromNetwork.map(NewsResource::id), - newsResourcesFromDb.map(NewsResource::id) + newsResourcesFromDb.map(NewsResource::id), ) // After sync version should be updated assertEquals( changeList.last().changeListVersion, - synchronizer.getChangeListVersions().newsResourceVersion + synchronizer.getChangeListVersions().newsResourceVersion, ) } @@ -228,7 +228,7 @@ class OfflineFirstNewsRepositoryTest { .flatten() .distinctBy(TopicEntity::id), topicDao.getTopicEntities() - .first() + .first(), ) } @@ -242,7 +242,7 @@ class OfflineFirstNewsRepositoryTest { .map(NetworkNewsResource::topicCrossReferences) .distinct() .flatten(), - newsResourceDao.topicCrossReferences + newsResourceDao.topicCrossReferences, ) } } diff --git a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstTopicsRepositoryTest.kt b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstTopicsRepositoryTest.kt index 5c3f8dfc0..ca9941b8a 100644 --- a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstTopicsRepositoryTest.kt +++ b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstTopicsRepositoryTest.kt @@ -28,13 +28,13 @@ import com.google.samples.apps.nowinandroid.core.datastore.NiaPreferencesDataSou import com.google.samples.apps.nowinandroid.core.datastore.test.testUserPreferencesDataStore import com.google.samples.apps.nowinandroid.core.model.data.Topic import com.google.samples.apps.nowinandroid.core.network.model.NetworkTopic -import kotlin.test.assertEquals import kotlinx.coroutines.flow.first import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.rules.TemporaryFolder +import kotlin.test.assertEquals class OfflineFirstTopicsRepositoryTest { @@ -56,13 +56,13 @@ class OfflineFirstTopicsRepositoryTest { topicDao = TestTopicDao() network = TestNiaNetworkDataSource() niaPreferences = NiaPreferencesDataSource( - tmpFolder.testUserPreferencesDataStore() + tmpFolder.testUserPreferencesDataStore(), ) synchronizer = TestSynchronizer(niaPreferences) subject = OfflineFirstTopicsRepository( topicDao = topicDao, - network = network + network = network, ) } @@ -74,7 +74,7 @@ class OfflineFirstTopicsRepositoryTest { .first() .map(TopicEntity::asExternalModel), subject.getTopics() - .first() + .first(), ) } @@ -91,13 +91,13 @@ class OfflineFirstTopicsRepositoryTest { assertEquals( networkTopics.map(TopicEntity::id), - dbTopics.map(TopicEntity::id) + dbTopics.map(TopicEntity::id), ) // After sync version should be updated assertEquals( network.latestChangeListVersion(CollectionType.Topics), - synchronizer.getChangeListVersions().topicVersion + synchronizer.getChangeListVersions().topicVersion, ) } @@ -121,13 +121,13 @@ class OfflineFirstTopicsRepositoryTest { assertEquals( networkTopics.map(TopicEntity::id), - dbTopics.map(TopicEntity::id) + dbTopics.map(TopicEntity::id), ) // After sync version should be updated assertEquals( network.latestChangeListVersion(CollectionType.Topics), - synchronizer.getChangeListVersions().topicVersion + synchronizer.getChangeListVersions().topicVersion, ) } @@ -149,7 +149,7 @@ class OfflineFirstTopicsRepositoryTest { network.editCollection( collectionType = CollectionType.Topics, id = it, - isDelete = true + isDelete = true, ) } @@ -162,13 +162,13 @@ class OfflineFirstTopicsRepositoryTest { // Assert that items marked deleted on the network have been deleted locally assertEquals( networkTopics.map(Topic::id) - deletedItems, - dbTopics.map(Topic::id) + dbTopics.map(Topic::id), ) // After sync version should be updated assertEquals( network.latestChangeListVersion(CollectionType.Topics), - synchronizer.getChangeListVersions().topicVersion + synchronizer.getChangeListVersions().topicVersion, ) } } diff --git a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstUserDataRepositoryTest.kt b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstUserDataRepositoryTest.kt index 926052ea8..055d8e074 100644 --- a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstUserDataRepositoryTest.kt +++ b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstUserDataRepositoryTest.kt @@ -21,9 +21,6 @@ import com.google.samples.apps.nowinandroid.core.datastore.test.testUserPreferen import com.google.samples.apps.nowinandroid.core.model.data.DarkThemeConfig import com.google.samples.apps.nowinandroid.core.model.data.ThemeBrand import com.google.samples.apps.nowinandroid.core.model.data.UserData -import kotlin.test.assertEquals -import kotlin.test.assertFalse -import kotlin.test.assertTrue import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map import kotlinx.coroutines.test.runTest @@ -31,6 +28,9 @@ import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.rules.TemporaryFolder +import kotlin.test.assertEquals +import kotlin.test.assertFalse +import kotlin.test.assertTrue class OfflineFirstUserDataRepositoryTest { private lateinit var subject: OfflineFirstUserDataRepository @@ -43,11 +43,11 @@ class OfflineFirstUserDataRepositoryTest { @Before fun setup() { niaPreferencesDataSource = NiaPreferencesDataSource( - tmpFolder.testUserPreferencesDataStore() + tmpFolder.testUserPreferencesDataStore(), ) subject = OfflineFirstUserDataRepository( - niaPreferencesDataSource = niaPreferencesDataSource + niaPreferencesDataSource = niaPreferencesDataSource, ) } @@ -61,9 +61,9 @@ class OfflineFirstUserDataRepositoryTest { themeBrand = ThemeBrand.DEFAULT, darkThemeConfig = DarkThemeConfig.FOLLOW_SYSTEM, useDynamicColor = false, - shouldHideOnboarding = false + shouldHideOnboarding = false, ), - subject.userData.first() + subject.userData.first(), ) } @@ -76,7 +76,7 @@ class OfflineFirstUserDataRepositoryTest { setOf("0"), subject.userData .map { it.followedTopics } - .first() + .first(), ) subject.toggleFollowedTopicId(followedTopicId = "1", followed = true) @@ -85,7 +85,7 @@ class OfflineFirstUserDataRepositoryTest { setOf("0", "1"), subject.userData .map { it.followedTopics } - .first() + .first(), ) assertEquals( @@ -94,7 +94,7 @@ class OfflineFirstUserDataRepositoryTest { .first(), subject.userData .map { it.followedTopics } - .first() + .first(), ) } @@ -107,7 +107,7 @@ class OfflineFirstUserDataRepositoryTest { setOf("1", "2"), subject.userData .map { it.followedTopics } - .first() + .first(), ) assertEquals( @@ -116,7 +116,7 @@ class OfflineFirstUserDataRepositoryTest { .first(), subject.userData .map { it.followedTopics } - .first() + .first(), ) } @@ -129,7 +129,7 @@ class OfflineFirstUserDataRepositoryTest { setOf("0"), subject.userData .map { it.bookmarkedNewsResources } - .first() + .first(), ) subject.updateNewsResourceBookmark(newsResourceId = "1", bookmarked = true) @@ -138,7 +138,7 @@ class OfflineFirstUserDataRepositoryTest { setOf("0", "1"), subject.userData .map { it.bookmarkedNewsResources } - .first() + .first(), ) assertEquals( @@ -147,7 +147,7 @@ class OfflineFirstUserDataRepositoryTest { .first(), subject.userData .map { it.bookmarkedNewsResources } - .first() + .first(), ) } @@ -160,14 +160,14 @@ class OfflineFirstUserDataRepositoryTest { ThemeBrand.ANDROID, subject.userData .map { it.themeBrand } - .first() + .first(), ) assertEquals( ThemeBrand.ANDROID, niaPreferencesDataSource .userData .map { it.themeBrand } - .first() + .first(), ) } @@ -180,14 +180,14 @@ class OfflineFirstUserDataRepositoryTest { true, subject.userData .map { it.useDynamicColor } - .first() + .first(), ) assertEquals( true, niaPreferencesDataSource .userData .map { it.useDynamicColor } - .first() + .first(), ) } @@ -200,14 +200,14 @@ class OfflineFirstUserDataRepositoryTest { DarkThemeConfig.DARK, subject.userData .map { it.darkThemeConfig } - .first() + .first(), ) assertEquals( DarkThemeConfig.DARK, niaPreferencesDataSource .userData .map { it.darkThemeConfig } - .first() + .first(), ) } diff --git a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/TestSynchronizer.kt b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/TestSynchronizer.kt index e50a3776b..270dd010e 100644 --- a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/TestSynchronizer.kt +++ b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/TestSynchronizer.kt @@ -24,12 +24,12 @@ import com.google.samples.apps.nowinandroid.core.datastore.NiaPreferencesDataSou * Test synchronizer that delegates to [NiaPreferencesDataSource] */ class TestSynchronizer( - private val niaPreferences: NiaPreferencesDataSource + private val niaPreferences: NiaPreferencesDataSource, ) : Synchronizer { override suspend fun getChangeListVersions(): ChangeListVersions = niaPreferences.getChangeListVersions() override suspend fun updateChangeListVersions( - update: ChangeListVersions.() -> ChangeListVersions + update: ChangeListVersions.() -> ChangeListVersions, ) = niaPreferences.updateChangeListVersion(update) } diff --git a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/testdoubles/TestNewsResourceDao.kt b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/testdoubles/TestNewsResourceDao.kt index 6441cf6ed..f63014075 100644 --- a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/testdoubles/TestNewsResourceDao.kt +++ b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/testdoubles/TestNewsResourceDao.kt @@ -46,8 +46,8 @@ class TestNewsResourceDao : NewsResourceDao { headerImageUrl = "headerImageUrl", type = Video, publishDate = Instant.fromEpochMilliseconds(1), - ) - ) + ), + ), ) internal var topicCrossReferences: List = listOf() @@ -58,7 +58,7 @@ class TestNewsResourceDao : NewsResourceDao { } override fun getNewsResources( - filterTopicIds: Set + filterTopicIds: Set, ): Flow> = getNewsResources() .map { resources -> @@ -68,7 +68,7 @@ class TestNewsResourceDao : NewsResourceDao { } override suspend fun insertOrIgnoreNewsResources( - entities: List + entities: List, ): List { entitiesStateFlow.value = entities // Assume no conflicts on insert @@ -84,7 +84,7 @@ class TestNewsResourceDao : NewsResourceDao { } override suspend fun insertOrIgnoreTopicCrossRefEntities( - newsResourceTopicCrossReferences: List + newsResourceTopicCrossReferences: List, ) { topicCrossReferences = newsResourceTopicCrossReferences } @@ -107,6 +107,6 @@ private fun NewsResourceEntity.asPopulatedNewsResource() = PopulatedNewsResource longDescription = "long description", url = "URL", imageUrl = "image URL", - ) + ), ), ) diff --git a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/testdoubles/TestNiaNetworkDataSource.kt b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/testdoubles/TestNiaNetworkDataSource.kt index abbf39f50..8e248a3aa 100644 --- a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/testdoubles/TestNiaNetworkDataSource.kt +++ b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/testdoubles/TestNiaNetworkDataSource.kt @@ -27,7 +27,7 @@ import kotlinx.serialization.json.Json enum class CollectionType { Topics, - NewsResources + NewsResources, } /** @@ -37,7 +37,7 @@ class TestNiaNetworkDataSource : NiaNetworkDataSource { private val source = FakeNiaNetworkDataSource( UnconfinedTestDispatcher(), - Json { ignoreUnknownKeys = true } + Json { ignoreUnknownKeys = true }, ) private val allTopics = runBlocking { source.getTopics() } @@ -54,13 +54,13 @@ class TestNiaNetworkDataSource : NiaNetworkDataSource { override suspend fun getTopics(ids: List?): List = allTopics.matchIds( ids = ids, - idGetter = NetworkTopic::id + idGetter = NetworkTopic::id, ) override suspend fun getNewsResources(ids: List?): List = allNewsResources.matchIds( ids = ids, - idGetter = NetworkNewsResource::id + idGetter = NetworkNewsResource::id, ) override suspend fun getTopicChangeList(after: Int?): List = @@ -102,7 +102,7 @@ fun List.after(version: Int?): List = */ private fun List.matchIds( ids: List?, - idGetter: (T) -> String + idGetter: (T) -> String, ) = when (ids) { null -> this else -> ids.toSet().let { idSet -> this.filter { idSet.contains(idGetter(it)) } } @@ -113,7 +113,7 @@ private fun List.matchIds( * [after] simulates which models have changed by excluding items before it */ private fun List.mapToChangeList( - idGetter: (T) -> String + idGetter: (T) -> String, ) = mapIndexed { index, item -> NetworkChangeList( id = idGetter(item), diff --git a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/testdoubles/TestTopicDao.kt b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/testdoubles/TestTopicDao.kt index d842f1501..8ac0dc0b8 100644 --- a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/testdoubles/TestTopicDao.kt +++ b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/testdoubles/TestTopicDao.kt @@ -37,8 +37,8 @@ class TestTopicDao : TopicDao { longDescription = "long description", url = "URL", imageUrl = "image URL", - ) - ) + ), + ), ) override fun getTopicEntity(topicId: String): Flow { diff --git a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/database/model/PopulatedNewsResourceKtTest.kt b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/database/model/PopulatedNewsResourceKtTest.kt index fa500decb..83158f6cd 100644 --- a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/database/model/PopulatedNewsResourceKtTest.kt +++ b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/database/model/PopulatedNewsResourceKtTest.kt @@ -19,9 +19,9 @@ package com.google.samples.apps.nowinandroid.core.database.model import com.google.samples.apps.nowinandroid.core.model.data.NewsResource import com.google.samples.apps.nowinandroid.core.model.data.NewsResourceType.Video import com.google.samples.apps.nowinandroid.core.model.data.Topic -import kotlin.test.assertEquals import kotlinx.datetime.Instant import org.junit.Test +import kotlin.test.assertEquals class PopulatedNewsResourceKtTest { @Test @@ -44,7 +44,7 @@ class PopulatedNewsResourceKtTest { longDescription = "long description", url = "URL", imageUrl = "image URL", - ) + ), ), ) val newsResource = populatedNewsResource.asExternalModel() @@ -66,10 +66,10 @@ class PopulatedNewsResourceKtTest { longDescription = "long description", url = "URL", imageUrl = "image URL", - ) - ) + ), + ), ), - newsResource + newsResource, ) } } diff --git a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/database/util/NewsResourceTypeConverterTest.kt b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/database/util/NewsResourceTypeConverterTest.kt index 37a25dc7e..77a09819b 100644 --- a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/database/util/NewsResourceTypeConverterTest.kt +++ b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/database/util/NewsResourceTypeConverterTest.kt @@ -17,8 +17,8 @@ package com.google.samples.apps.nowinandroid.core.database.util import com.google.samples.apps.nowinandroid.core.model.data.NewsResourceType -import kotlin.test.assertEquals import org.junit.Test +import kotlin.test.assertEquals class NewsResourceTypeConverterTest { @@ -26,7 +26,7 @@ class NewsResourceTypeConverterTest { fun test_room_news_resource_type_converter_for_video() { assertEquals( NewsResourceType.Video, - NewsResourceTypeConverter().stringToNewsResourceType("Video 📺") + NewsResourceTypeConverter().stringToNewsResourceType("Video 📺"), ) } @@ -34,7 +34,7 @@ class NewsResourceTypeConverterTest { fun test_room_news_resource_type_converter_for_article() { assertEquals( NewsResourceType.Article, - NewsResourceTypeConverter().stringToNewsResourceType("Article 📚") + NewsResourceTypeConverter().stringToNewsResourceType("Article 📚"), ) } @@ -42,7 +42,7 @@ class NewsResourceTypeConverterTest { fun test_room_news_resource_type_converter_for_api_change() { assertEquals( NewsResourceType.APIChange, - NewsResourceTypeConverter().stringToNewsResourceType("API change") + NewsResourceTypeConverter().stringToNewsResourceType("API change"), ) } @@ -50,7 +50,7 @@ class NewsResourceTypeConverterTest { fun test_room_news_resource_type_converter_for_codelab() { assertEquals( NewsResourceType.Codelab, - NewsResourceTypeConverter().stringToNewsResourceType("Codelab") + NewsResourceTypeConverter().stringToNewsResourceType("Codelab"), ) } @@ -58,7 +58,7 @@ class NewsResourceTypeConverterTest { fun test_room_news_resource_type_converter_for_podcast() { assertEquals( NewsResourceType.Podcast, - NewsResourceTypeConverter().stringToNewsResourceType("Podcast 🎙") + NewsResourceTypeConverter().stringToNewsResourceType("Podcast 🎙"), ) } @@ -66,7 +66,7 @@ class NewsResourceTypeConverterTest { fun test_room_news_resource_type_converter_for_docs() { assertEquals( NewsResourceType.Docs, - NewsResourceTypeConverter().stringToNewsResourceType("Docs 📑") + NewsResourceTypeConverter().stringToNewsResourceType("Docs 📑"), ) } @@ -74,7 +74,7 @@ class NewsResourceTypeConverterTest { fun test_room_news_resource_type_converter_for_event() { assertEquals( NewsResourceType.Event, - NewsResourceTypeConverter().stringToNewsResourceType("Event 📆") + NewsResourceTypeConverter().stringToNewsResourceType("Event 📆"), ) } @@ -82,7 +82,7 @@ class NewsResourceTypeConverterTest { fun test_room_news_resource_type_converter_for_dac() { assertEquals( NewsResourceType.DAC, - NewsResourceTypeConverter().stringToNewsResourceType("DAC") + NewsResourceTypeConverter().stringToNewsResourceType("DAC"), ) } @@ -90,7 +90,7 @@ class NewsResourceTypeConverterTest { fun test_room_news_resource_type_converter_for_umm() { assertEquals( NewsResourceType.Unknown, - NewsResourceTypeConverter().stringToNewsResourceType("umm") + NewsResourceTypeConverter().stringToNewsResourceType("umm"), ) } } diff --git a/core/database/src/androidTest/java/com/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDaoTest.kt b/core/database/src/androidTest/java/com/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDaoTest.kt index 5dd1cf624..c1c1b39ba 100644 --- a/core/database/src/androidTest/java/com/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDaoTest.kt +++ b/core/database/src/androidTest/java/com/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDaoTest.kt @@ -25,12 +25,12 @@ import com.google.samples.apps.nowinandroid.core.database.model.NewsResourceTopi import com.google.samples.apps.nowinandroid.core.database.model.TopicEntity import com.google.samples.apps.nowinandroid.core.database.model.asExternalModel import com.google.samples.apps.nowinandroid.core.model.data.NewsResourceType -import kotlin.test.assertEquals import kotlinx.coroutines.flow.first import kotlinx.coroutines.test.runTest import kotlinx.datetime.Instant import org.junit.Before import org.junit.Test +import kotlin.test.assertEquals class NewsResourceDaoTest { @@ -43,7 +43,7 @@ class NewsResourceDaoTest { val context = ApplicationProvider.getApplicationContext() db = Room.inMemoryDatabaseBuilder( context, - NiaDatabase::class.java + NiaDatabase::class.java, ).build() newsResourceDao = db.newsResourceDao() topicDao = db.topicDao() @@ -70,7 +70,7 @@ class NewsResourceDaoTest { ), ) newsResourceDao.upsertNewsResources( - newsResourceEntities + newsResourceEntities, ) val savedNewsResourceEntities = newsResourceDao.getNewsResources() @@ -80,7 +80,7 @@ class NewsResourceDaoTest { listOf(3L, 2L, 1L, 0L), savedNewsResourceEntities.map { it.asExternalModel().publishDate.toEpochMilliseconds() - } + }, ) } @@ -89,11 +89,11 @@ class NewsResourceDaoTest { val topicEntities = listOf( testTopicEntity( id = "1", - name = "1" + name = "1", ), testTopicEntity( id = "2", - name = "2" + name = "2", ), ) val newsResourceEntities = listOf( @@ -117,18 +117,18 @@ class NewsResourceDaoTest { val newsResourceTopicCrossRefEntities = topicEntities.mapIndexed { index, topicEntity -> NewsResourceTopicCrossRef( newsResourceId = index.toString(), - topicId = topicEntity.id + topicId = topicEntity.id, ) } topicDao.insertOrIgnoreTopics( - topicEntities = topicEntities + topicEntities = topicEntities, ) newsResourceDao.upsertNewsResources( - newsResourceEntities + newsResourceEntities, ) newsResourceDao.insertOrIgnoreTopicCrossRefEntities( - newsResourceTopicCrossRefEntities + newsResourceTopicCrossRefEntities, ) val filteredNewsResources = newsResourceDao.getNewsResources( @@ -139,7 +139,7 @@ class NewsResourceDaoTest { assertEquals( listOf("1", "0"), - filteredNewsResources.map { it.entity.id } + filteredNewsResources.map { it.entity.id }, ) } @@ -169,7 +169,7 @@ class NewsResourceDaoTest { val (toDelete, toKeep) = newsResourceEntities.partition { it.id.toInt() % 2 == 0 } newsResourceDao.deleteNewsResources( - toDelete.map(NewsResourceEntity::id) + toDelete.map(NewsResourceEntity::id), ) assertEquals( @@ -177,26 +177,26 @@ class NewsResourceDaoTest { .toSet(), newsResourceDao.getNewsResources().first() .map { it.entity.id } - .toSet() + .toSet(), ) } } private fun testTopicEntity( id: String = "0", - name: String + name: String, ) = TopicEntity( id = id, name = name, shortDescription = "", longDescription = "", url = "", - imageUrl = "" + imageUrl = "", ) private fun testNewsResource( id: String = "0", - millisSinceEpoch: Long = 0 + millisSinceEpoch: Long = 0, ) = NewsResourceEntity( id = id, title = "", diff --git a/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/DatabaseMigrations.kt b/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/DatabaseMigrations.kt index 8d7430fa0..09e0849fe 100644 --- a/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/DatabaseMigrations.kt +++ b/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/DatabaseMigrations.kt @@ -33,31 +33,31 @@ object DatabaseMigrations { @RenameColumn( tableName = "topics", fromColumnName = "description", - toColumnName = "shortDescription" + toColumnName = "shortDescription", ) class Schema2to3 : AutoMigrationSpec @DeleteColumn( tableName = "news_resources", - columnName = "episode_id" + columnName = "episode_id", ) @DeleteTable.Entries( DeleteTable( - tableName = "episodes_authors" + tableName = "episodes_authors", ), DeleteTable( - tableName = "episodes" - ) + tableName = "episodes", + ), ) class Schema10to11 : AutoMigrationSpec @DeleteTable.Entries( DeleteTable( - tableName = "news_resources_authors" + tableName = "news_resources_authors", ), DeleteTable( - tableName = "authors" - ) + tableName = "authors", + ), ) class Schema11to12 : AutoMigrationSpec } diff --git a/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/DatabaseModule.kt b/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/DatabaseModule.kt index 7d4dd67c8..7d89cd1ac 100644 --- a/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/DatabaseModule.kt +++ b/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/DatabaseModule.kt @@ -35,6 +35,6 @@ object DatabaseModule { ): NiaDatabase = Room.databaseBuilder( context, NiaDatabase::class.java, - "nia-database" + "nia-database", ).build() } diff --git a/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/NiaDatabase.kt b/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/NiaDatabase.kt index 33a186275..83bd46967 100644 --- a/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/NiaDatabase.kt +++ b/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/NiaDatabase.kt @@ -46,7 +46,7 @@ import com.google.samples.apps.nowinandroid.core.database.util.NewsResourceTypeC AutoMigration(from = 8, to = 9), AutoMigration(from = 9, to = 10), AutoMigration(from = 10, to = 11, spec = DatabaseMigrations.Schema10to11::class), - AutoMigration(from = 11, to = 12, spec = DatabaseMigrations.Schema11to12::class) + AutoMigration(from = 11, to = 12, spec = DatabaseMigrations.Schema11to12::class), ], exportSchema = true, ) diff --git a/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao.kt b/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao.kt index 8f02bb4a8..af0a59bce 100644 --- a/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao.kt +++ b/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao.kt @@ -39,7 +39,7 @@ interface NewsResourceDao { value = """ SELECT * FROM news_resources ORDER BY publish_date DESC - """ + """, ) fun getNewsResources(): Flow> @@ -53,7 +53,7 @@ interface NewsResourceDao { WHERE topic_id IN (:filterTopicIds) ) ORDER BY publish_date DESC - """ + """, ) fun getNewsResources( filterTopicIds: Set = emptySet(), @@ -79,7 +79,7 @@ interface NewsResourceDao { @Insert(onConflict = OnConflictStrategy.IGNORE) suspend fun insertOrIgnoreTopicCrossRefEntities( - newsResourceTopicCrossReferences: List + newsResourceTopicCrossReferences: List, ) /** @@ -89,7 +89,7 @@ interface NewsResourceDao { value = """ DELETE FROM news_resources WHERE id in (:ids) - """ + """, ) suspend fun deleteNewsResources(ids: List) } diff --git a/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/dao/TopicDao.kt b/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/dao/TopicDao.kt index 9d9cde602..37724af69 100644 --- a/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/dao/TopicDao.kt +++ b/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/dao/TopicDao.kt @@ -34,7 +34,7 @@ interface TopicDao { value = """ SELECT * FROM topics WHERE id = :topicId - """ + """, ) fun getTopicEntity(topicId: String): Flow @@ -45,7 +45,7 @@ interface TopicDao { value = """ SELECT * FROM topics WHERE id IN (:ids) - """ + """, ) fun getTopicEntities(ids: Set): Flow> @@ -74,7 +74,7 @@ interface TopicDao { value = """ DELETE FROM topics WHERE id in (:ids) - """ + """, ) suspend fun deleteTopics(ids: List) } diff --git a/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/model/NewsResourceEntity.kt b/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/model/NewsResourceEntity.kt index 38cd3c473..a571d8f94 100644 --- a/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/model/NewsResourceEntity.kt +++ b/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/model/NewsResourceEntity.kt @@ -27,7 +27,7 @@ import kotlinx.datetime.Instant * Defines an NiA news resource. */ @Entity( - tableName = "news_resources" + tableName = "news_resources", ) data class NewsResourceEntity( @PrimaryKey @@ -50,5 +50,5 @@ fun NewsResourceEntity.asExternalModel() = NewsResource( headerImageUrl = headerImageUrl, publishDate = publishDate, type = type, - topics = listOf() + topics = listOf(), ) diff --git a/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/model/NewsResourceTopicCrossRef.kt b/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/model/NewsResourceTopicCrossRef.kt index dac2b5f0b..59bf1458f 100644 --- a/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/model/NewsResourceTopicCrossRef.kt +++ b/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/model/NewsResourceTopicCrossRef.kt @@ -32,13 +32,13 @@ import androidx.room.Index entity = NewsResourceEntity::class, parentColumns = ["id"], childColumns = ["news_resource_id"], - onDelete = ForeignKey.CASCADE + onDelete = ForeignKey.CASCADE, ), ForeignKey( entity = TopicEntity::class, parentColumns = ["id"], childColumns = ["topic_id"], - onDelete = ForeignKey.CASCADE + onDelete = ForeignKey.CASCADE, ), ], indices = [ diff --git a/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/model/PopulatedNewsResource.kt b/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/model/PopulatedNewsResource.kt index 6e18cc873..ec8acfb3f 100644 --- a/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/model/PopulatedNewsResource.kt +++ b/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/model/PopulatedNewsResource.kt @@ -34,9 +34,9 @@ data class PopulatedNewsResource( value = NewsResourceTopicCrossRef::class, parentColumn = "news_resource_id", entityColumn = "topic_id", - ) + ), ) - val topics: List + val topics: List, ) fun PopulatedNewsResource.asExternalModel() = NewsResource( @@ -47,5 +47,5 @@ fun PopulatedNewsResource.asExternalModel() = NewsResource( headerImageUrl = entity.headerImageUrl, publishDate = entity.publishDate, type = entity.type, - topics = topics.map(TopicEntity::asExternalModel) + topics = topics.map(TopicEntity::asExternalModel), ) diff --git a/core/datastore-test/src/main/java/com/google/samples/apps/nowinandroid/core/datastore/test/TestDataStoreModule.kt b/core/datastore-test/src/main/java/com/google/samples/apps/nowinandroid/core/datastore/test/TestDataStoreModule.kt index 62b3abc34..b29728cf1 100644 --- a/core/datastore-test/src/main/java/com/google/samples/apps/nowinandroid/core/datastore/test/TestDataStoreModule.kt +++ b/core/datastore-test/src/main/java/com/google/samples/apps/nowinandroid/core/datastore/test/TestDataStoreModule.kt @@ -25,13 +25,13 @@ import dagger.Module import dagger.Provides import dagger.hilt.components.SingletonComponent import dagger.hilt.testing.TestInstallIn -import javax.inject.Singleton import org.junit.rules.TemporaryFolder +import javax.inject.Singleton @Module @TestInstallIn( components = [SingletonComponent::class], - replaces = [DataStoreModule::class] + replaces = [DataStoreModule::class], ) object TestDataStoreModule { @@ -39,13 +39,13 @@ object TestDataStoreModule { @Singleton fun providesUserPreferencesDataStore( userPreferencesSerializer: UserPreferencesSerializer, - tmpFolder: TemporaryFolder + tmpFolder: TemporaryFolder, ): DataStore = tmpFolder.testUserPreferencesDataStore(userPreferencesSerializer) } fun TemporaryFolder.testUserPreferencesDataStore( - userPreferencesSerializer: UserPreferencesSerializer = UserPreferencesSerializer() + userPreferencesSerializer: UserPreferencesSerializer = UserPreferencesSerializer(), ) = DataStoreFactory.create( serializer = userPreferencesSerializer, ) { diff --git a/core/datastore/src/main/java/com/google/samples/apps/nowinandroid/core/datastore/IntToStringIdsMigration.kt b/core/datastore/src/main/java/com/google/samples/apps/nowinandroid/core/datastore/IntToStringIdsMigration.kt index cd27bb015..98632c652 100644 --- a/core/datastore/src/main/java/com/google/samples/apps/nowinandroid/core/datastore/IntToStringIdsMigration.kt +++ b/core/datastore/src/main/java/com/google/samples/apps/nowinandroid/core/datastore/IntToStringIdsMigration.kt @@ -30,14 +30,14 @@ object IntToStringIdsMigration : DataMigration { // Migrate topic ids deprecatedFollowedTopicIds.clear() deprecatedFollowedTopicIds.addAll( - currentData.deprecatedIntFollowedTopicIdsList.map(Int::toString) + currentData.deprecatedIntFollowedTopicIdsList.map(Int::toString), ) deprecatedIntFollowedTopicIds.clear() // Migrate author ids deprecatedFollowedAuthorIds.clear() deprecatedFollowedAuthorIds.addAll( - currentData.deprecatedIntFollowedAuthorIdsList.map(Int::toString) + currentData.deprecatedIntFollowedAuthorIdsList.map(Int::toString), ) deprecatedIntFollowedAuthorIds.clear() diff --git a/core/datastore/src/main/java/com/google/samples/apps/nowinandroid/core/datastore/ListToMapMigration.kt b/core/datastore/src/main/java/com/google/samples/apps/nowinandroid/core/datastore/ListToMapMigration.kt index b88b27f74..5bff23340 100644 --- a/core/datastore/src/main/java/com/google/samples/apps/nowinandroid/core/datastore/ListToMapMigration.kt +++ b/core/datastore/src/main/java/com/google/samples/apps/nowinandroid/core/datastore/ListToMapMigration.kt @@ -30,21 +30,21 @@ object ListToMapMigration : DataMigration { // Migrate topic id lists followedTopicIds.clear() followedTopicIds.putAll( - currentData.deprecatedFollowedTopicIdsList.associateWith { true } + currentData.deprecatedFollowedTopicIdsList.associateWith { true }, ) deprecatedFollowedTopicIds.clear() // Migrate author ids followedAuthorIds.clear() followedAuthorIds.putAll( - currentData.deprecatedFollowedAuthorIdsList.associateWith { true } + currentData.deprecatedFollowedAuthorIdsList.associateWith { true }, ) deprecatedFollowedAuthorIds.clear() // Migrate bookmarks bookmarkedNewsResourceIds.clear() bookmarkedNewsResourceIds.putAll( - currentData.deprecatedBookmarkedNewsResourceIdsList.associateWith { true } + currentData.deprecatedBookmarkedNewsResourceIdsList.associateWith { true }, ) deprecatedBookmarkedNewsResourceIds.clear() diff --git a/core/datastore/src/main/java/com/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSource.kt b/core/datastore/src/main/java/com/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSource.kt index e82b13950..f5751193a 100644 --- a/core/datastore/src/main/java/com/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSource.kt +++ b/core/datastore/src/main/java/com/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSource.kt @@ -21,13 +21,13 @@ import androidx.datastore.core.DataStore import com.google.samples.apps.nowinandroid.core.model.data.DarkThemeConfig import com.google.samples.apps.nowinandroid.core.model.data.ThemeBrand import com.google.samples.apps.nowinandroid.core.model.data.UserData -import java.io.IOException -import javax.inject.Inject import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.map +import java.io.IOException +import javax.inject.Inject class NiaPreferencesDataSource @Inject constructor( - private val userPreferences: DataStore + private val userPreferences: DataStore, ) { val userData = userPreferences.data .map { @@ -38,21 +38,23 @@ class NiaPreferencesDataSource @Inject constructor( null, ThemeBrandProto.THEME_BRAND_UNSPECIFIED, ThemeBrandProto.UNRECOGNIZED, - ThemeBrandProto.THEME_BRAND_DEFAULT -> ThemeBrand.DEFAULT + ThemeBrandProto.THEME_BRAND_DEFAULT, + -> ThemeBrand.DEFAULT ThemeBrandProto.THEME_BRAND_ANDROID -> ThemeBrand.ANDROID }, darkThemeConfig = when (it.darkThemeConfig) { null, DarkThemeConfigProto.DARK_THEME_CONFIG_UNSPECIFIED, DarkThemeConfigProto.UNRECOGNIZED, - DarkThemeConfigProto.DARK_THEME_CONFIG_FOLLOW_SYSTEM -> + DarkThemeConfigProto.DARK_THEME_CONFIG_FOLLOW_SYSTEM, + -> DarkThemeConfig.FOLLOW_SYSTEM DarkThemeConfigProto.DARK_THEME_CONFIG_LIGHT -> DarkThemeConfig.LIGHT DarkThemeConfigProto.DARK_THEME_CONFIG_DARK -> DarkThemeConfig.DARK }, useDynamicColor = it.useDynamicColor, - shouldHideOnboarding = it.shouldHideOnboarding + shouldHideOnboarding = it.shouldHideOnboarding, ) } @@ -153,8 +155,8 @@ class NiaPreferencesDataSource @Inject constructor( val updatedChangeListVersions = update( ChangeListVersions( topicVersion = currentPreferences.topicChangeListVersion, - newsResourceVersion = currentPreferences.newsResourceChangeListVersion - ) + newsResourceVersion = currentPreferences.newsResourceChangeListVersion, + ), ) currentPreferences.copy { @@ -177,7 +179,6 @@ class NiaPreferencesDataSource @Inject constructor( } private fun UserPreferencesKt.Dsl.updateShouldHideOnboardingIfNecessary() { - if (followedTopicIds.isEmpty() && followedAuthorIds.isEmpty()) { shouldHideOnboarding = false } diff --git a/core/datastore/src/main/java/com/google/samples/apps/nowinandroid/core/datastore/di/DataStoreModule.kt b/core/datastore/src/main/java/com/google/samples/apps/nowinandroid/core/datastore/di/DataStoreModule.kt index f4eb8f848..895e22307 100644 --- a/core/datastore/src/main/java/com/google/samples/apps/nowinandroid/core/datastore/di/DataStoreModule.kt +++ b/core/datastore/src/main/java/com/google/samples/apps/nowinandroid/core/datastore/di/DataStoreModule.kt @@ -30,10 +30,10 @@ import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent -import javax.inject.Singleton import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.SupervisorJob +import javax.inject.Singleton @Module @InstallIn(SingletonComponent::class) @@ -44,14 +44,14 @@ object DataStoreModule { fun providesUserPreferencesDataStore( @ApplicationContext context: Context, @Dispatcher(IO) ioDispatcher: CoroutineDispatcher, - userPreferencesSerializer: UserPreferencesSerializer + userPreferencesSerializer: UserPreferencesSerializer, ): DataStore = DataStoreFactory.create( serializer = userPreferencesSerializer, scope = CoroutineScope(ioDispatcher + SupervisorJob()), migrations = listOf( IntToStringIdsMigration, - ) + ), ) { context.dataStoreFile("user_preferences.pb") } diff --git a/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/IntToStringIdsMigrationTest.kt b/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/IntToStringIdsMigrationTest.kt index e82f74b52..8b97cff34 100644 --- a/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/IntToStringIdsMigrationTest.kt +++ b/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/IntToStringIdsMigrationTest.kt @@ -16,10 +16,10 @@ package com.google.samples.apps.nowinandroid.core.datastore -import kotlin.test.assertEquals -import kotlin.test.assertTrue import kotlinx.coroutines.test.runTest import org.junit.Test +import kotlin.test.assertEquals +import kotlin.test.assertTrue /** * Unit test for [IntToStringIdsMigration] @@ -35,7 +35,7 @@ class IntToStringIdsMigrationTest { // Assert that there are no string topic ids yet assertEquals( emptyList(), - preMigrationUserPreferences.deprecatedFollowedTopicIdsList + preMigrationUserPreferences.deprecatedFollowedTopicIdsList, ) // Run the migration @@ -48,7 +48,7 @@ class IntToStringIdsMigrationTest { deprecatedFollowedTopicIds.addAll(listOf("1", "2", "3")) hasDoneIntToStringIdMigration = true }, - postMigrationUserPreferences + postMigrationUserPreferences, ) // Assert that the migration has been marked complete @@ -64,7 +64,7 @@ class IntToStringIdsMigrationTest { // Assert that there are no string author ids yet assertEquals( emptyList(), - preMigrationUserPreferences.deprecatedFollowedAuthorIdsList + preMigrationUserPreferences.deprecatedFollowedAuthorIdsList, ) // Run the migration @@ -77,7 +77,7 @@ class IntToStringIdsMigrationTest { deprecatedFollowedAuthorIds.addAll(listOf("4", "5", "6")) hasDoneIntToStringIdMigration = true }, - postMigrationUserPreferences + postMigrationUserPreferences, ) // Assert that the migration has been marked complete diff --git a/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/ListToMapMigrationTest.kt b/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/ListToMapMigrationTest.kt index c2fdf4f55..f7e083b45 100644 --- a/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/ListToMapMigrationTest.kt +++ b/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/ListToMapMigrationTest.kt @@ -16,10 +16,10 @@ package com.google.samples.apps.nowinandroid.core.datastore -import kotlin.test.assertEquals -import kotlin.test.assertTrue import kotlinx.coroutines.test.runTest import org.junit.Test +import kotlin.test.assertEquals +import kotlin.test.assertTrue class ListToMapMigrationTest { @@ -32,7 +32,7 @@ class ListToMapMigrationTest { // Assert that there are no topic ids in the map yet assertEquals( emptyMap(), - preMigrationUserPreferences.followedTopicIdsMap + preMigrationUserPreferences.followedTopicIdsMap, ) // Run the migration @@ -42,7 +42,7 @@ class ListToMapMigrationTest { // Assert the deprecated topic ids have been migrated to the topic ids map assertEquals( mapOf("1" to true, "2" to true, "3" to true), - postMigrationUserPreferences.followedTopicIdsMap + postMigrationUserPreferences.followedTopicIdsMap, ) // Assert that the migration has been marked complete @@ -58,7 +58,7 @@ class ListToMapMigrationTest { // Assert that there are no author ids in the map yet assertEquals( emptyMap(), - preMigrationUserPreferences.followedAuthorIdsMap + preMigrationUserPreferences.followedAuthorIdsMap, ) // Run the migration @@ -68,7 +68,7 @@ class ListToMapMigrationTest { // Assert the deprecated author ids have been migrated to the author ids map assertEquals( mapOf("4" to true, "5" to true, "6" to true), - postMigrationUserPreferences.followedAuthorIdsMap + postMigrationUserPreferences.followedAuthorIdsMap, ) // Assert that the migration has been marked complete @@ -84,7 +84,7 @@ class ListToMapMigrationTest { // Assert that there are no bookmarks in the map yet assertEquals( emptyMap(), - preMigrationUserPreferences.bookmarkedNewsResourceIdsMap + preMigrationUserPreferences.bookmarkedNewsResourceIdsMap, ) // Run the migration @@ -94,7 +94,7 @@ class ListToMapMigrationTest { // Assert the deprecated bookmarks have been migrated to the bookmarks map assertEquals( mapOf("7" to true, "8" to true, "9" to true), - postMigrationUserPreferences.bookmarkedNewsResourceIdsMap + postMigrationUserPreferences.bookmarkedNewsResourceIdsMap, ) // Assert that the migration has been marked complete diff --git a/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSourceTest.kt b/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSourceTest.kt index 62a70de11..0d047d310 100644 --- a/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSourceTest.kt +++ b/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSourceTest.kt @@ -17,14 +17,14 @@ package com.google.samples.apps.nowinandroid.core.datastore import com.google.samples.apps.nowinandroid.core.datastore.test.testUserPreferencesDataStore -import kotlin.test.assertFalse -import kotlin.test.assertTrue import kotlinx.coroutines.flow.first import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.rules.TemporaryFolder +import kotlin.test.assertFalse +import kotlin.test.assertTrue class NiaPreferencesDataSourceTest { private lateinit var subject: NiaPreferencesDataSource @@ -35,7 +35,7 @@ class NiaPreferencesDataSourceTest { @Before fun setup() { subject = NiaPreferencesDataSource( - tmpFolder.testUserPreferencesDataStore() + tmpFolder.testUserPreferencesDataStore(), ) } @@ -52,7 +52,6 @@ class NiaPreferencesDataSourceTest { @Test fun userShouldHideOnboarding_unfollowsLastTopic_shouldHideOnboardingIsFalse() = runTest { - // Given: user completes onboarding by selecting a single topic. subject.toggleFollowedTopicId("1", true) subject.setShouldHideOnboarding(true) @@ -66,7 +65,6 @@ class NiaPreferencesDataSourceTest { @Test fun userShouldHideOnboarding_unfollowsAllTopics_shouldHideOnboardingIsFalse() = runTest { - // Given: user completes onboarding by selecting several topics. subject.setFollowedTopicIds(setOf("1", "2")) subject.setShouldHideOnboarding(true) diff --git a/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/UserPreferencesSerializerTest.kt b/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/UserPreferencesSerializerTest.kt index 1b10c5672..ad7664fe5 100644 --- a/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/UserPreferencesSerializerTest.kt +++ b/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/UserPreferencesSerializerTest.kt @@ -17,11 +17,11 @@ package com.google.samples.apps.nowinandroid.core.datastore import androidx.datastore.core.CorruptionException +import kotlinx.coroutines.test.runTest +import org.junit.Test import java.io.ByteArrayInputStream import java.io.ByteArrayOutputStream import kotlin.test.assertEquals -import kotlinx.coroutines.test.runTest -import org.junit.Test class UserPreferencesSerializerTest { private val userPreferencesSerializer = UserPreferencesSerializer() @@ -32,7 +32,7 @@ class UserPreferencesSerializerTest { userPreferences { // Default value }, - userPreferencesSerializer.defaultValue + userPreferencesSerializer.defaultValue, ) } @@ -53,7 +53,7 @@ class UserPreferencesSerializerTest { assertEquals( expectedUserPreferences, - actualUserPreferences + actualUserPreferences, ) } diff --git a/core/designsystem/src/androidTest/java/com/google/samples/apps/nowinandroid/core/designsystem/ThemeTest.kt b/core/designsystem/src/androidTest/java/com/google/samples/apps/nowinandroid/core/designsystem/ThemeTest.kt index a047d838b..b10df053c 100644 --- a/core/designsystem/src/androidTest/java/com/google/samples/apps/nowinandroid/core/designsystem/ThemeTest.kt +++ b/core/designsystem/src/androidTest/java/com/google/samples/apps/nowinandroid/core/designsystem/ThemeTest.kt @@ -41,9 +41,9 @@ import com.google.samples.apps.nowinandroid.core.designsystem.theme.LocalGradien import com.google.samples.apps.nowinandroid.core.designsystem.theme.LocalTintTheme import com.google.samples.apps.nowinandroid.core.designsystem.theme.NiaTheme import com.google.samples.apps.nowinandroid.core.designsystem.theme.TintTheme -import kotlin.test.assertEquals import org.junit.Rule import org.junit.Test +import kotlin.test.assertEquals /** * Tests [NiaTheme] using different combinations of the theme mode parameters: @@ -64,7 +64,7 @@ class ThemeTest { NiaTheme( darkTheme = false, disableDynamicTheming = true, - androidTheme = false + androidTheme = false, ) { val colorScheme = LightDefaultColorScheme assertColorSchemesEqual(colorScheme, MaterialTheme.colorScheme) @@ -84,7 +84,7 @@ class ThemeTest { NiaTheme( darkTheme = true, disableDynamicTheming = true, - androidTheme = false + androidTheme = false, ) { val colorScheme = DarkDefaultColorScheme assertColorSchemesEqual(colorScheme, MaterialTheme.colorScheme) @@ -104,7 +104,7 @@ class ThemeTest { NiaTheme( darkTheme = false, disableDynamicTheming = false, - androidTheme = false + androidTheme = false, ) { val colorScheme = dynamicLightColorSchemeWithFallback() assertColorSchemesEqual(colorScheme, MaterialTheme.colorScheme) @@ -124,7 +124,7 @@ class ThemeTest { NiaTheme( darkTheme = true, disableDynamicTheming = false, - androidTheme = false + androidTheme = false, ) { val colorScheme = dynamicDarkColorSchemeWithFallback() assertColorSchemesEqual(colorScheme, MaterialTheme.colorScheme) @@ -144,7 +144,7 @@ class ThemeTest { NiaTheme( darkTheme = false, disableDynamicTheming = true, - androidTheme = true + androidTheme = true, ) { val colorScheme = LightAndroidColorScheme assertColorSchemesEqual(colorScheme, MaterialTheme.colorScheme) @@ -164,7 +164,7 @@ class ThemeTest { NiaTheme( darkTheme = true, disableDynamicTheming = true, - androidTheme = true + androidTheme = true, ) { val colorScheme = DarkAndroidColorScheme assertColorSchemesEqual(colorScheme, MaterialTheme.colorScheme) @@ -184,7 +184,7 @@ class ThemeTest { NiaTheme( darkTheme = false, disableDynamicTheming = false, - androidTheme = true + androidTheme = true, ) { val colorScheme = LightAndroidColorScheme assertColorSchemesEqual(colorScheme, MaterialTheme.colorScheme) @@ -204,7 +204,7 @@ class ThemeTest { NiaTheme( darkTheme = true, disableDynamicTheming = false, - androidTheme = true + androidTheme = true, ) { val colorScheme = DarkAndroidColorScheme assertColorSchemesEqual(colorScheme, MaterialTheme.colorScheme) @@ -244,7 +244,7 @@ class ThemeTest { return GradientColors( top = colorScheme.inverseOnSurface, bottom = colorScheme.primaryContainer, - container = colorScheme.surface + container = colorScheme.surface, ) } @@ -259,7 +259,7 @@ class ThemeTest { private fun defaultBackgroundTheme(colorScheme: ColorScheme): BackgroundTheme { return BackgroundTheme( color = colorScheme.surface, - tonalElevation = 2.dp + tonalElevation = 2.dp, ) } @@ -280,7 +280,7 @@ class ThemeTest { */ private fun assertColorSchemesEqual( expectedColorScheme: ColorScheme, - actualColorScheme: ColorScheme + actualColorScheme: ColorScheme, ) { assertEquals(expectedColorScheme.primary, actualColorScheme.primary) assertEquals(expectedColorScheme.onPrimary, actualColorScheme.onPrimary) @@ -291,7 +291,7 @@ class ThemeTest { assertEquals(expectedColorScheme.secondaryContainer, actualColorScheme.secondaryContainer) assertEquals( expectedColorScheme.onSecondaryContainer, - actualColorScheme.onSecondaryContainer + actualColorScheme.onSecondaryContainer, ) assertEquals(expectedColorScheme.tertiary, actualColorScheme.tertiary) assertEquals(expectedColorScheme.onTertiary, actualColorScheme.onTertiary) diff --git a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Background.kt b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Background.kt index f81d2e36d..9ef52dd76 100644 --- a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Background.kt +++ b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Background.kt @@ -50,7 +50,7 @@ import kotlin.math.tan @Composable fun NiaBackground( modifier: Modifier = Modifier, - content: @Composable () -> Unit + content: @Composable () -> Unit, ) { val color = LocalBackgroundTheme.current.color val tonalElevation = LocalBackgroundTheme.current.tonalElevation @@ -77,7 +77,7 @@ fun NiaBackground( fun NiaGradientBackground( modifier: Modifier = Modifier, gradientColors: GradientColors = LocalGradientColors.current, - content: @Composable () -> Unit + content: @Composable () -> Unit, ) { val currentTopColor by rememberUpdatedState(gradientColors.top) val currentBottomColor by rememberUpdatedState(gradientColors.bottom) @@ -87,7 +87,7 @@ fun NiaGradientBackground( } else { gradientColors.container }, - modifier = modifier.fillMaxSize() + modifier = modifier.fillMaxSize(), ) { Box( Modifier @@ -98,7 +98,7 @@ fun NiaGradientBackground( val offset = size.height * tan( Math .toRadians(11.06) - .toFloat() + .toFloat(), ) val start = Offset(size.width / 2 + offset / 2, 0f) @@ -132,7 +132,7 @@ fun NiaGradientBackground( drawRect(topGradient) drawRect(bottomGradient) } - } + }, ) { content() } diff --git a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Button.kt b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Button.kt index cab6fcd2f..e4b437dfe 100644 --- a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Button.kt +++ b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Button.kt @@ -48,17 +48,17 @@ fun NiaButton( modifier: Modifier = Modifier, enabled: Boolean = true, contentPadding: PaddingValues = ButtonDefaults.ContentPadding, - content: @Composable RowScope.() -> Unit + content: @Composable RowScope.() -> Unit, ) { Button( onClick = onClick, modifier = modifier, enabled = enabled, colors = ButtonDefaults.buttonColors( - containerColor = MaterialTheme.colorScheme.onBackground + containerColor = MaterialTheme.colorScheme.onBackground, ), contentPadding = contentPadding, - content = content + content = content, ) } @@ -78,7 +78,7 @@ fun NiaButton( modifier: Modifier = Modifier, enabled: Boolean = true, text: @Composable () -> Unit, - leadingIcon: @Composable (() -> Unit)? = null + leadingIcon: @Composable (() -> Unit)? = null, ) { NiaButton( onClick = onClick, @@ -88,11 +88,11 @@ fun NiaButton( ButtonDefaults.ButtonWithIconContentPadding } else { ButtonDefaults.ContentPadding - } + }, ) { NiaButtonContent( text = text, - leadingIcon = leadingIcon + leadingIcon = leadingIcon, ) } } @@ -114,14 +114,14 @@ fun NiaOutlinedButton( modifier: Modifier = Modifier, enabled: Boolean = true, contentPadding: PaddingValues = ButtonDefaults.ContentPadding, - content: @Composable RowScope.() -> Unit + content: @Composable RowScope.() -> Unit, ) { OutlinedButton( onClick = onClick, modifier = modifier, enabled = enabled, colors = ButtonDefaults.outlinedButtonColors( - contentColor = MaterialTheme.colorScheme.onBackground + contentColor = MaterialTheme.colorScheme.onBackground, ), border = BorderStroke( width = NiaButtonDefaults.OutlinedButtonBorderWidth, @@ -129,12 +129,12 @@ fun NiaOutlinedButton( MaterialTheme.colorScheme.outline } else { MaterialTheme.colorScheme.onSurface.copy( - alpha = NiaButtonDefaults.DisabledOutlinedButtonBorderAlpha + alpha = NiaButtonDefaults.DisabledOutlinedButtonBorderAlpha, ) - } + }, ), contentPadding = contentPadding, - content = content + content = content, ) } @@ -154,7 +154,7 @@ fun NiaOutlinedButton( modifier: Modifier = Modifier, enabled: Boolean = true, text: @Composable () -> Unit, - leadingIcon: @Composable (() -> Unit)? = null + leadingIcon: @Composable (() -> Unit)? = null, ) { NiaOutlinedButton( onClick = onClick, @@ -164,11 +164,11 @@ fun NiaOutlinedButton( ButtonDefaults.ButtonWithIconContentPadding } else { ButtonDefaults.ContentPadding - } + }, ) { NiaButtonContent( text = text, - leadingIcon = leadingIcon + leadingIcon = leadingIcon, ) } } @@ -187,16 +187,16 @@ fun NiaTextButton( onClick: () -> Unit, modifier: Modifier = Modifier, enabled: Boolean = true, - content: @Composable RowScope.() -> Unit + content: @Composable RowScope.() -> Unit, ) { TextButton( onClick = onClick, modifier = modifier, enabled = enabled, colors = ButtonDefaults.textButtonColors( - contentColor = MaterialTheme.colorScheme.onBackground + contentColor = MaterialTheme.colorScheme.onBackground, ), - content = content + content = content, ) } @@ -216,16 +216,16 @@ fun NiaTextButton( modifier: Modifier = Modifier, enabled: Boolean = true, text: @Composable () -> Unit, - leadingIcon: @Composable (() -> Unit)? = null + leadingIcon: @Composable (() -> Unit)? = null, ) { NiaTextButton( onClick = onClick, modifier = modifier, - enabled = enabled + enabled = enabled, ) { NiaButtonContent( text = text, - leadingIcon = leadingIcon + leadingIcon = leadingIcon, ) } } @@ -239,7 +239,7 @@ fun NiaTextButton( @Composable private fun NiaButtonContent( text: @Composable () -> Unit, - leadingIcon: @Composable (() -> Unit)? = null + leadingIcon: @Composable (() -> Unit)? = null, ) { if (leadingIcon != null) { Box(Modifier.sizeIn(maxHeight = ButtonDefaults.IconSize)) { @@ -253,8 +253,8 @@ private fun NiaButtonContent( ButtonDefaults.IconSpacing } else { 0.dp - } - ) + }, + ), ) { text() } @@ -267,6 +267,7 @@ object NiaButtonDefaults { // TODO: File bug // OutlinedButton border color doesn't respect disabled state by default const val DisabledOutlinedButtonBorderAlpha = 0.12f + // TODO: File bug // OutlinedButton default border width isn't exposed via ButtonDefaults val OutlinedButtonBorderWidth = 1.dp diff --git a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Chip.kt b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Chip.kt index 663667861..b291b3fa1 100644 --- a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Chip.kt +++ b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Chip.kt @@ -46,7 +46,7 @@ fun NiaFilterChip( onSelectedChange: (Boolean) -> Unit, modifier: Modifier = Modifier, enabled: Boolean = true, - label: @Composable () -> Unit + label: @Composable () -> Unit, ) { FilterChip( selected = selected, @@ -62,7 +62,7 @@ fun NiaFilterChip( { Icon( imageVector = NiaIcons.Check, - contentDescription = null + contentDescription = null, ) } } else { @@ -73,33 +73,33 @@ fun NiaFilterChip( borderColor = MaterialTheme.colorScheme.onBackground, selectedBorderColor = MaterialTheme.colorScheme.onBackground, disabledBorderColor = MaterialTheme.colorScheme.onBackground.copy( - alpha = NiaChipDefaults.DisabledChipContentAlpha + alpha = NiaChipDefaults.DisabledChipContentAlpha, ), disabledSelectedBorderColor = MaterialTheme.colorScheme.onBackground.copy( - alpha = NiaChipDefaults.DisabledChipContentAlpha + alpha = NiaChipDefaults.DisabledChipContentAlpha, ), - selectedBorderWidth = NiaChipDefaults.ChipBorderWidth + selectedBorderWidth = NiaChipDefaults.ChipBorderWidth, ), colors = FilterChipDefaults.filterChipColors( labelColor = MaterialTheme.colorScheme.onBackground, iconColor = MaterialTheme.colorScheme.onBackground, disabledContainerColor = if (selected) { MaterialTheme.colorScheme.onBackground.copy( - alpha = NiaChipDefaults.DisabledChipContainerAlpha + alpha = NiaChipDefaults.DisabledChipContainerAlpha, ) } else { Color.Transparent }, disabledLabelColor = MaterialTheme.colorScheme.onBackground.copy( - alpha = NiaChipDefaults.DisabledChipContentAlpha + alpha = NiaChipDefaults.DisabledChipContentAlpha, ), disabledLeadingIconColor = MaterialTheme.colorScheme.onBackground.copy( - alpha = NiaChipDefaults.DisabledChipContentAlpha + alpha = NiaChipDefaults.DisabledChipContentAlpha, ), selectedContainerColor = MaterialTheme.colorScheme.primaryContainer, selectedLabelColor = MaterialTheme.colorScheme.onBackground, - selectedLeadingIconColor = MaterialTheme.colorScheme.onBackground - ) + selectedLeadingIconColor = MaterialTheme.colorScheme.onBackground, + ), ) } diff --git a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/DropdownMenu.kt b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/DropdownMenu.kt index b8d3fa837..b624ebcb6 100644 --- a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/DropdownMenu.kt +++ b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/DropdownMenu.kt @@ -61,7 +61,7 @@ fun NiaDropdownMenuButton( text: @Composable () -> Unit, itemText: @Composable (item: T) -> Unit, itemLeadingIcon: @Composable ((item: T) -> Unit)? = null, - itemTrailingIcon: @Composable ((item: T) -> Unit)? = null + itemTrailingIcon: @Composable ((item: T) -> Unit)? = null, ) { var expanded by remember { mutableStateOf(false) } Box(modifier = modifier) { @@ -69,7 +69,7 @@ fun NiaDropdownMenuButton( onClick = { expanded = true }, enabled = enabled, colors = ButtonDefaults.outlinedButtonColors( - contentColor = MaterialTheme.colorScheme.onBackground + contentColor = MaterialTheme.colorScheme.onBackground, ), border = BorderStroke( width = NiaDropdownMenuDefaults.DropdownMenuButtonBorderWidth, @@ -77,11 +77,11 @@ fun NiaDropdownMenuButton( MaterialTheme.colorScheme.outline } else { MaterialTheme.colorScheme.onSurface.copy( - alpha = NiaDropdownMenuDefaults.DisabledDropdownMenuButtonBorderAlpha + alpha = NiaDropdownMenuDefaults.DisabledDropdownMenuButtonBorderAlpha, ) - } + }, ), - contentPadding = NiaDropdownMenuDefaults.DropdownMenuButtonContentPadding + contentPadding = NiaDropdownMenuDefaults.DropdownMenuButtonContentPadding, ) { NiaDropdownMenuButtonContent( text = text, @@ -92,9 +92,9 @@ fun NiaDropdownMenuButton( } else { NiaIcons.ArrowDropDown }, - contentDescription = null + contentDescription = null, ) - } + }, ) } NiaDropdownMenu( @@ -105,7 +105,7 @@ fun NiaDropdownMenuButton( dismissOnItemClick = dismissOnItemClick, itemText = itemText, itemLeadingIcon = itemLeadingIcon, - itemTrailingIcon = itemTrailingIcon + itemTrailingIcon = itemTrailingIcon, ) } } @@ -129,8 +129,8 @@ private fun NiaDropdownMenuButtonContent( ButtonDefaults.IconSpacing } else { 0.dp - } - ) + }, + ), ) { ProvideTextStyle(value = MaterialTheme.typography.labelSmall) { text() @@ -166,11 +166,11 @@ fun NiaDropdownMenu( dismissOnItemClick: Boolean = true, itemText: @Composable (item: T) -> Unit, itemLeadingIcon: @Composable ((item: T) -> Unit)? = null, - itemTrailingIcon: @Composable ((item: T) -> Unit)? = null + itemTrailingIcon: @Composable ((item: T) -> Unit)? = null, ) { DropdownMenu( expanded = expanded, - onDismissRequest = onDismissRequest + onDismissRequest = onDismissRequest, ) { items.forEach { item -> DropdownMenuItem( @@ -188,7 +188,7 @@ fun NiaDropdownMenu( { itemTrailingIcon(item) } } else { null - } + }, ) } } @@ -201,9 +201,11 @@ object NiaDropdownMenuDefaults { // TODO: File bug // OutlinedButton border color doesn't respect disabled state by default const val DisabledDropdownMenuButtonBorderAlpha = 0.12f + // TODO: File bug // OutlinedButton default border width isn't exposed via ButtonDefaults val DropdownMenuButtonBorderWidth = 1.dp + // TODO: File bug // Various default button padding values aren't exposed via ButtonDefaults val DropdownMenuButtonContentPadding = @@ -211,6 +213,6 @@ object NiaDropdownMenuDefaults { start = 24.dp, top = 8.dp, end = 16.dp, - bottom = 8.dp + bottom = 8.dp, ) } diff --git a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/DynamicAsyncImage.kt b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/DynamicAsyncImage.kt index 26f80989f..e26a824af 100644 --- a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/DynamicAsyncImage.kt +++ b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/DynamicAsyncImage.kt @@ -31,7 +31,7 @@ fun DynamicAsyncImage( imageUrl: String, contentDescription: String?, modifier: Modifier = Modifier, - placeholder: Painter? = null + placeholder: Painter? = null, ) { val iconTint = LocalTintTheme.current.iconTint AsyncImage( @@ -39,6 +39,6 @@ fun DynamicAsyncImage( model = imageUrl, contentDescription = contentDescription, colorFilter = if (iconTint != null) ColorFilter.tint(iconTint) else null, - modifier = modifier + modifier = modifier, ) } diff --git a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/IconButton.kt b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/IconButton.kt index 0eedf23f7..b0dda0af1 100644 --- a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/IconButton.kt +++ b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/IconButton.kt @@ -43,7 +43,7 @@ fun NiaIconToggleButton( modifier: Modifier = Modifier, enabled: Boolean = true, icon: @Composable () -> Unit, - checkedIcon: @Composable () -> Unit = icon + checkedIcon: @Composable () -> Unit = icon, ) { // TODO: File bug // Can't use regular IconToggleButton as it doesn't include a shape (appears square) @@ -57,12 +57,12 @@ fun NiaIconToggleButton( checkedContentColor = MaterialTheme.colorScheme.onPrimaryContainer, disabledContainerColor = if (checked) { MaterialTheme.colorScheme.onBackground.copy( - alpha = NiaIconButtonDefaults.DisabledIconButtonContainerAlpha + alpha = NiaIconButtonDefaults.DisabledIconButtonContainerAlpha, ) } else { Color.Transparent - } - ) + }, + ), ) { if (checked) checkedIcon() else icon() } diff --git a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/LoadingWheel.kt b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/LoadingWheel.kt index 836558021..55ff143a6 100644 --- a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/LoadingWheel.kt +++ b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/LoadingWheel.kt @@ -53,7 +53,7 @@ import kotlinx.coroutines.launch @Composable fun NiaLoadingWheel( contentDesc: String, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { val infiniteTransition = rememberInfiniteTransition() @@ -68,8 +68,8 @@ fun NiaLoadingWheel( animationSpec = tween( durationMillis = 100, easing = FastOutSlowInEasing, - delayMillis = 40 * index - ) + delayMillis = 40 * index, + ), ) } } @@ -80,8 +80,8 @@ fun NiaLoadingWheel( initialValue = 0F, targetValue = 360F, animationSpec = infiniteRepeatable( - animation = tween(durationMillis = ROTATION_TIME, easing = LinearEasing) - ) + animation = tween(durationMillis = ROTATION_TIME, easing = LinearEasing), + ), ) // Specifies the color animation for the base-to-progress line color change @@ -98,8 +98,8 @@ fun NiaLoadingWheel( baseLineColor at ROTATION_TIME / NUM_OF_LINES with LinearEasing }, repeatMode = RepeatMode.Restart, - initialStartOffset = StartOffset(ROTATION_TIME / NUM_OF_LINES / 2 * index) - ) + initialStartOffset = StartOffset(ROTATION_TIME / NUM_OF_LINES / 2 * index), + ), ) } @@ -121,7 +121,7 @@ fun NiaLoadingWheel( strokeWidth = 4F, cap = StrokeCap.Round, start = Offset(size.width / 2, size.height / 4), - end = Offset(size.width / 2, floatAnimValues[index].value * size.height / 4) + end = Offset(size.width / 2, floatAnimValues[index].value * size.height / 4), ) } } @@ -131,7 +131,7 @@ fun NiaLoadingWheel( @Composable fun NiaOverlayLoadingWheel( contentDesc: String, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { Surface( shape = RoundedCornerShape(60.dp), diff --git a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Navigation.kt b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Navigation.kt index 57d70642c..624cf25ac 100644 --- a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Navigation.kt +++ b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Navigation.kt @@ -54,7 +54,7 @@ fun RowScope.NiaNavigationBarItem( selectedIcon: @Composable () -> Unit = icon, enabled: Boolean = true, label: @Composable (() -> Unit)? = null, - alwaysShowLabel: Boolean = true + alwaysShowLabel: Boolean = true, ) { NavigationBarItem( selected = selected, @@ -69,8 +69,8 @@ fun RowScope.NiaNavigationBarItem( unselectedIconColor = NiaNavigationDefaults.navigationContentColor(), selectedTextColor = NiaNavigationDefaults.navigationSelectedItemColor(), unselectedTextColor = NiaNavigationDefaults.navigationContentColor(), - indicatorColor = NiaNavigationDefaults.navigationIndicatorColor() - ) + indicatorColor = NiaNavigationDefaults.navigationIndicatorColor(), + ), ) } @@ -84,13 +84,13 @@ fun RowScope.NiaNavigationBarItem( @Composable fun NiaNavigationBar( modifier: Modifier = Modifier, - content: @Composable RowScope.() -> Unit + content: @Composable RowScope.() -> Unit, ) { NavigationBar( modifier = modifier, contentColor = NiaNavigationDefaults.navigationContentColor(), tonalElevation = 0.dp, - content = content + content = content, ) } @@ -118,7 +118,7 @@ fun NiaNavigationRailItem( selectedIcon: @Composable () -> Unit = icon, enabled: Boolean = true, label: @Composable (() -> Unit)? = null, - alwaysShowLabel: Boolean = true + alwaysShowLabel: Boolean = true, ) { NavigationRailItem( selected = selected, @@ -133,8 +133,8 @@ fun NiaNavigationRailItem( unselectedIconColor = NiaNavigationDefaults.navigationContentColor(), selectedTextColor = NiaNavigationDefaults.navigationSelectedItemColor(), unselectedTextColor = NiaNavigationDefaults.navigationContentColor(), - indicatorColor = NiaNavigationDefaults.navigationIndicatorColor() - ) + indicatorColor = NiaNavigationDefaults.navigationIndicatorColor(), + ), ) } @@ -150,14 +150,14 @@ fun NiaNavigationRailItem( fun NiaNavigationRail( modifier: Modifier = Modifier, header: @Composable (ColumnScope.() -> Unit)? = null, - content: @Composable ColumnScope.() -> Unit + content: @Composable ColumnScope.() -> Unit, ) { NavigationRail( modifier = modifier, containerColor = Color.Transparent, contentColor = NiaNavigationDefaults.navigationContentColor(), header = header, - content = content + content = content, ) } @@ -167,8 +167,10 @@ fun NiaNavigationRail( object NiaNavigationDefaults { @Composable fun navigationContentColor() = MaterialTheme.colorScheme.onSurfaceVariant + @Composable fun navigationSelectedItemColor() = MaterialTheme.colorScheme.onPrimaryContainer + @Composable fun navigationIndicatorColor() = MaterialTheme.colorScheme.primaryContainer } diff --git a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Tabs.kt b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Tabs.kt index 76a0a3248..ad2f3799c 100644 --- a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Tabs.kt +++ b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Tabs.kt @@ -46,7 +46,7 @@ fun NiaTab( onClick: () -> Unit, modifier: Modifier = Modifier, enabled: Boolean = true, - text: @Composable () -> Unit + text: @Composable () -> Unit, ) { Tab( selected = selected, @@ -61,9 +61,9 @@ fun NiaTab( Box(modifier = Modifier.padding(top = NiaTabDefaults.TabTopPadding)) { text() } - } + }, ) - } + }, ) } @@ -79,7 +79,7 @@ fun NiaTab( fun NiaTabRow( selectedTabIndex: Int, modifier: Modifier = Modifier, - tabs: @Composable () -> Unit + tabs: @Composable () -> Unit, ) { TabRow( selectedTabIndex = selectedTabIndex, @@ -90,10 +90,10 @@ fun NiaTabRow( TabRowDefaults.Indicator( modifier = Modifier.tabIndicatorOffset(tabPositions[selectedTabIndex]), height = 2.dp, - color = MaterialTheme.colorScheme.onSurface + color = MaterialTheme.colorScheme.onSurface, ) }, - tabs = tabs + tabs = tabs, ) } diff --git a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Tag.kt b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Tag.kt index dae42421c..cf8b246bb 100644 --- a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Tag.kt +++ b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Tag.kt @@ -41,15 +41,14 @@ fun NiaTopicTag( text: @Composable () -> Unit, followText: @Composable () -> Unit = { Text(stringResource(R.string.follow)) }, unFollowText: @Composable () -> Unit = { Text(stringResource(R.string.unfollow)) }, - browseText: @Composable () -> Unit = { Text(stringResource(R.string.browse_topic)) } + browseText: @Composable () -> Unit = { Text(stringResource(R.string.browse_topic)) }, ) { - Box(modifier = modifier) { val containerColor = if (followed) { MaterialTheme.colorScheme.primaryContainer } else { MaterialTheme.colorScheme.surfaceVariant.copy( - alpha = NiaTagDefaults.UnfollowedTopicTagContainerAlpha + alpha = NiaTagDefaults.UnfollowedTopicTagContainerAlpha, ) } TextButton( @@ -59,9 +58,9 @@ fun NiaTopicTag( containerColor = containerColor, contentColor = contentColorFor(backgroundColor = containerColor), disabledContainerColor = MaterialTheme.colorScheme.onSurface.copy( - alpha = NiaTagDefaults.DisabledTopicTagContainerAlpha - ) - ) + alpha = NiaTagDefaults.DisabledTopicTagContainerAlpha, + ), + ), ) { ProvideTextStyle(value = MaterialTheme.typography.labelSmall) { text() @@ -84,7 +83,7 @@ fun NiaTopicTag( UNFOLLOW -> unFollowText() BROWSE -> browseText() } - } + }, ) } } @@ -94,6 +93,7 @@ fun NiaTopicTag( */ object NiaTagDefaults { const val UnfollowedTopicTagContainerAlpha = 0.5f + // TODO: File bug // Button disabled container alpha value not exposed by ButtonDefaults const val DisabledTopicTagContainerAlpha = 0.12f diff --git a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/TopAppBar.kt b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/TopAppBar.kt index fb4cc0ff0..28007a3b1 100644 --- a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/TopAppBar.kt +++ b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/TopAppBar.kt @@ -46,7 +46,7 @@ fun NiaTopAppBar( modifier: Modifier = Modifier, colors: TopAppBarColors = TopAppBarDefaults.centerAlignedTopAppBarColors(), onNavigationClick: () -> Unit = {}, - onActionClick: () -> Unit = {} + onActionClick: () -> Unit = {}, ) { CenterAlignedTopAppBar( title = { Text(text = stringResource(id = titleRes)) }, @@ -55,7 +55,7 @@ fun NiaTopAppBar( Icon( imageVector = navigationIcon, contentDescription = navigationIconContentDescription, - tint = MaterialTheme.colorScheme.onSurface + tint = MaterialTheme.colorScheme.onSurface, ) } }, @@ -64,7 +64,7 @@ fun NiaTopAppBar( Icon( imageVector = actionIcon, contentDescription = actionIconContentDescription, - tint = MaterialTheme.colorScheme.onSurface + tint = MaterialTheme.colorScheme.onSurface, ) } }, @@ -84,7 +84,7 @@ fun NiaTopAppBar( actionIconContentDescription: String?, modifier: Modifier = Modifier, colors: TopAppBarColors = TopAppBarDefaults.centerAlignedTopAppBarColors(), - onActionClick: () -> Unit = {} + onActionClick: () -> Unit = {}, ) { CenterAlignedTopAppBar( title = { Text(text = stringResource(id = titleRes)) }, @@ -93,7 +93,7 @@ fun NiaTopAppBar( Icon( imageVector = actionIcon, contentDescription = actionIconContentDescription, - tint = MaterialTheme.colorScheme.onSurface + tint = MaterialTheme.colorScheme.onSurface, ) } }, @@ -111,6 +111,6 @@ private fun NiaTopAppBarPreview() { navigationIcon = NiaIcons.Search, navigationIconContentDescription = "Navigation icon", actionIcon = NiaIcons.MoreVert, - actionIconContentDescription = "Action icon" + actionIconContentDescription = "Action icon", ) } diff --git a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/ViewToggle.kt b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/ViewToggle.kt index a6721c78c..c6ec77a92 100644 --- a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/ViewToggle.kt +++ b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/ViewToggle.kt @@ -49,25 +49,25 @@ fun NiaViewToggleButton( modifier: Modifier = Modifier, enabled: Boolean = true, compactText: @Composable () -> Unit, - expandedText: @Composable () -> Unit + expandedText: @Composable () -> Unit, ) { TextButton( onClick = { onExpandedChange(!expanded) }, modifier = modifier, enabled = enabled, colors = ButtonDefaults.textButtonColors( - contentColor = MaterialTheme.colorScheme.onBackground + contentColor = MaterialTheme.colorScheme.onBackground, ), - contentPadding = NiaViewToggleDefaults.ViewToggleButtonContentPadding + contentPadding = NiaViewToggleDefaults.ViewToggleButtonContentPadding, ) { NiaViewToggleButtonContent( text = if (expanded) expandedText else compactText, trailingIcon = { Icon( imageVector = if (expanded) NiaIcons.ViewDay else NiaIcons.ShortText, - contentDescription = null + contentDescription = null, ) - } + }, ) } } @@ -91,8 +91,8 @@ private fun NiaViewToggleButtonContent( ButtonDefaults.IconSpacing } else { 0.dp - } - ) + }, + ), ) { ProvideTextStyle(value = MaterialTheme.typography.labelSmall) { text() @@ -116,6 +116,6 @@ object NiaViewToggleDefaults { start = 16.dp, top = 8.dp, end = 12.dp, - bottom = 8.dp + bottom = 8.dp, ) } diff --git a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/theme/Background.kt b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/theme/Background.kt index f91e5a30d..e75758ea8 100644 --- a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/theme/Background.kt +++ b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/theme/Background.kt @@ -27,7 +27,7 @@ import androidx.compose.ui.unit.Dp @Immutable data class BackgroundTheme( val color: Color = Color.Unspecified, - val tonalElevation: Dp = Dp.Unspecified + val tonalElevation: Dp = Dp.Unspecified, ) /** diff --git a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/theme/Gradient.kt b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/theme/Gradient.kt index f471af761..bad1c62a1 100644 --- a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/theme/Gradient.kt +++ b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/theme/Gradient.kt @@ -31,7 +31,7 @@ import androidx.compose.ui.graphics.Color data class GradientColors( val top: Color = Color.Unspecified, val bottom: Color = Color.Unspecified, - val container: Color = Color.Unspecified + val container: Color = Color.Unspecified, ) /** diff --git a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/theme/Theme.kt b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/theme/Theme.kt index e7be17c99..582f88473 100644 --- a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/theme/Theme.kt +++ b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/theme/Theme.kt @@ -61,7 +61,7 @@ val LightDefaultColorScheme = lightColorScheme( onSurfaceVariant = PurpleGray30, inverseSurface = DarkPurpleGray20, inverseOnSurface = DarkPurpleGray95, - outline = PurpleGray50 + outline = PurpleGray50, ) /** @@ -93,7 +93,7 @@ val DarkDefaultColorScheme = darkColorScheme( onSurfaceVariant = PurpleGray80, inverseSurface = DarkPurpleGray90, inverseOnSurface = DarkPurpleGray10, - outline = PurpleGray60 + outline = PurpleGray60, ) /** @@ -125,7 +125,7 @@ val LightAndroidColorScheme = lightColorScheme( onSurfaceVariant = GreenGray30, inverseSurface = DarkGreenGray20, inverseOnSurface = DarkGreenGray95, - outline = GreenGray50 + outline = GreenGray50, ) /** @@ -157,7 +157,7 @@ val DarkAndroidColorScheme = darkColorScheme( onSurfaceVariant = GreenGray80, inverseSurface = DarkGreenGray90, inverseOnSurface = DarkGreenGray10, - outline = GreenGray60 + outline = GreenGray60, ) /** @@ -194,7 +194,7 @@ fun NiaTheme( darkTheme: Boolean = isSystemInDarkTheme(), androidTheme: Boolean = false, disableDynamicTheming: Boolean = true, - content: @Composable () -> Unit + content: @Composable () -> Unit, ) { // Color scheme val colorScheme = when { @@ -211,7 +211,7 @@ fun NiaTheme( val defaultGradientColors = GradientColors( top = colorScheme.inverseOnSurface, bottom = colorScheme.primaryContainer, - container = colorScheme.surface + container = colorScheme.surface, ) val gradientColors = when { androidTheme -> if (darkTheme) DarkAndroidGradientColors else LightAndroidGradientColors @@ -221,7 +221,7 @@ fun NiaTheme( // Background theme val defaultBackgroundTheme = BackgroundTheme( color = colorScheme.surface, - tonalElevation = 2.dp + tonalElevation = 2.dp, ) val backgroundTheme = when { androidTheme -> if (darkTheme) DarkAndroidBackgroundTheme else LightAndroidBackgroundTheme @@ -236,12 +236,12 @@ fun NiaTheme( CompositionLocalProvider( LocalGradientColors provides gradientColors, LocalBackgroundTheme provides backgroundTheme, - LocalTintTheme provides tintTheme + LocalTintTheme provides tintTheme, ) { MaterialTheme( colorScheme = colorScheme, typography = NiaTypography, - content = content + content = content, ) } } diff --git a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/theme/Type.kt b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/theme/Type.kt index 7c9621caf..0d3b06457 100644 --- a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/theme/Type.kt +++ b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/theme/Type.kt @@ -29,90 +29,90 @@ internal val NiaTypography = Typography( fontWeight = FontWeight.Normal, fontSize = 57.sp, lineHeight = 64.sp, - letterSpacing = (-0.25).sp + letterSpacing = (-0.25).sp, ), displayMedium = TextStyle( fontWeight = FontWeight.Normal, fontSize = 45.sp, lineHeight = 52.sp, - letterSpacing = 0.sp + letterSpacing = 0.sp, ), displaySmall = TextStyle( fontWeight = FontWeight.Normal, fontSize = 36.sp, lineHeight = 44.sp, - letterSpacing = 0.sp + letterSpacing = 0.sp, ), headlineLarge = TextStyle( fontWeight = FontWeight.Normal, fontSize = 32.sp, lineHeight = 40.sp, - letterSpacing = 0.sp + letterSpacing = 0.sp, ), headlineMedium = TextStyle( fontWeight = FontWeight.Normal, fontSize = 28.sp, lineHeight = 36.sp, - letterSpacing = 0.sp + letterSpacing = 0.sp, ), headlineSmall = TextStyle( fontWeight = FontWeight.Normal, fontSize = 24.sp, lineHeight = 32.sp, - letterSpacing = 0.sp + letterSpacing = 0.sp, ), titleLarge = TextStyle( fontWeight = FontWeight.Bold, fontSize = 22.sp, lineHeight = 28.sp, - letterSpacing = 0.sp + letterSpacing = 0.sp, ), titleMedium = TextStyle( fontWeight = FontWeight.Bold, fontSize = 18.sp, lineHeight = 24.sp, - letterSpacing = 0.1.sp + letterSpacing = 0.1.sp, ), titleSmall = TextStyle( fontWeight = FontWeight.Medium, fontSize = 14.sp, lineHeight = 20.sp, - letterSpacing = 0.1.sp + letterSpacing = 0.1.sp, ), bodyLarge = TextStyle( fontWeight = FontWeight.Normal, fontSize = 16.sp, lineHeight = 24.sp, - letterSpacing = 0.5.sp + letterSpacing = 0.5.sp, ), bodyMedium = TextStyle( fontWeight = FontWeight.Normal, fontSize = 14.sp, lineHeight = 20.sp, - letterSpacing = 0.25.sp + letterSpacing = 0.25.sp, ), bodySmall = TextStyle( fontWeight = FontWeight.Normal, fontSize = 12.sp, lineHeight = 16.sp, - letterSpacing = 0.4.sp + letterSpacing = 0.4.sp, ), labelLarge = TextStyle( fontWeight = FontWeight.Medium, fontSize = 14.sp, lineHeight = 20.sp, - letterSpacing = 0.1.sp + letterSpacing = 0.1.sp, ), labelMedium = TextStyle( fontWeight = FontWeight.Medium, fontSize = 12.sp, lineHeight = 16.sp, - letterSpacing = 0.5.sp + letterSpacing = 0.5.sp, ), labelSmall = TextStyle( fontWeight = FontWeight.Medium, fontSize = 10.sp, lineHeight = 16.sp, - letterSpacing = 0.sp - ) + letterSpacing = 0.sp, + ), ) diff --git a/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/GetFollowableTopicsUseCase.kt b/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/GetFollowableTopicsUseCase.kt index 2fab78d6c..ccc7e4ee1 100644 --- a/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/GetFollowableTopicsUseCase.kt +++ b/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/GetFollowableTopicsUseCase.kt @@ -21,16 +21,16 @@ import com.google.samples.apps.nowinandroid.core.data.repository.UserDataReposit import com.google.samples.apps.nowinandroid.core.domain.TopicSortField.NAME import com.google.samples.apps.nowinandroid.core.domain.TopicSortField.NONE import com.google.samples.apps.nowinandroid.core.domain.model.FollowableTopic -import javax.inject.Inject import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine +import javax.inject.Inject /** * A use case which obtains a list of topics with their followed state. */ class GetFollowableTopicsUseCase @Inject constructor( private val topicsRepository: TopicsRepository, - private val userDataRepository: UserDataRepository + private val userDataRepository: UserDataRepository, ) { /** * Returns a list of topics with their associated followed state. @@ -40,13 +40,13 @@ class GetFollowableTopicsUseCase @Inject constructor( operator fun invoke(sortBy: TopicSortField = NONE): Flow> { return combine( userDataRepository.userData, - topicsRepository.getTopics() + topicsRepository.getTopics(), ) { userData, topics -> val followedTopics = topics .map { topic -> FollowableTopic( topic = topic, - isFollowed = topic.id in userData.followedTopics + isFollowed = topic.id in userData.followedTopics, ) } when (sortBy) { diff --git a/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/GetUserNewsResourcesUseCase.kt b/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/GetUserNewsResourcesUseCase.kt index 07cd6d856..db274bbbd 100644 --- a/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/GetUserNewsResourcesUseCase.kt +++ b/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/GetUserNewsResourcesUseCase.kt @@ -22,10 +22,10 @@ import com.google.samples.apps.nowinandroid.core.domain.model.UserNewsResource import com.google.samples.apps.nowinandroid.core.domain.model.mapToUserNewsResources import com.google.samples.apps.nowinandroid.core.model.data.NewsResource import com.google.samples.apps.nowinandroid.core.model.data.UserData -import javax.inject.Inject import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.filterNot +import javax.inject.Inject /** * A use case responsible for obtaining news resources with their associated bookmarked (also known @@ -33,7 +33,7 @@ import kotlinx.coroutines.flow.filterNot */ class GetUserNewsResourcesUseCase @Inject constructor( private val newsRepository: NewsRepository, - private val userDataRepository: UserDataRepository + private val userDataRepository: UserDataRepository, ) { /** * Returns a list of UserNewsResources which match the supplied set of topic ids. @@ -42,7 +42,7 @@ class GetUserNewsResourcesUseCase @Inject constructor( * this is empty the list of news resources will not be filtered. */ operator fun invoke( - filterTopicIds: Set = emptySet() + filterTopicIds: Set = emptySet(), ): Flow> = if (filterTopicIds.isEmpty()) { newsRepository.getNewsResources() @@ -52,7 +52,7 @@ class GetUserNewsResourcesUseCase @Inject constructor( } private fun Flow>.mapToUserNewsResources( - userDataStream: Flow + userDataStream: Flow, ): Flow> = filterNot { it.isEmpty() } .combine(userDataStream) { newsResources, userData -> diff --git a/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/model/FollowableTopic.kt b/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/model/FollowableTopic.kt index 4071eb1aa..121f83098 100644 --- a/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/model/FollowableTopic.kt +++ b/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/model/FollowableTopic.kt @@ -24,20 +24,20 @@ import com.google.samples.apps.nowinandroid.core.model.data.previewTopics */ data class FollowableTopic( // TODO consider changing to UserTopic and flattening val topic: Topic, - val isFollowed: Boolean + val isFollowed: Boolean, ) val previewFollowableTopics = listOf( FollowableTopic( previewTopics[0], - isFollowed = false + isFollowed = false, ), FollowableTopic( previewTopics[1], - isFollowed = true + isFollowed = true, ), FollowableTopic( previewTopics[2], - isFollowed = false - ) + isFollowed = false, + ), ) diff --git a/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/model/UserNewsResource.kt b/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/model/UserNewsResource.kt index 872f93f16..7cf511c60 100644 --- a/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/model/UserNewsResource.kt +++ b/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/model/UserNewsResource.kt @@ -42,7 +42,7 @@ data class UserNewsResource internal constructor( val publishDate: Instant, val type: NewsResourceType, val followableTopics: List, - val isSaved: Boolean + val isSaved: Boolean, ) { constructor(newsResource: NewsResource, userData: UserData) : this( id = newsResource.id, @@ -55,10 +55,10 @@ data class UserNewsResource internal constructor( followableTopics = newsResource.topics.map { topic -> FollowableTopic( topic = topic, - isFollowed = userData.followedTopics.contains(topic.id) + isFollowed = userData.followedTopics.contains(topic.id), ) }, - isSaved = userData.bookmarkedNewsResources.contains(newsResource.id) + isSaved = userData.bookmarkedNewsResources.contains(newsResource.id), ) } @@ -80,11 +80,11 @@ val previewUserNewsResources = listOf( hour = 23, minute = 0, second = 0, - nanosecond = 0 + nanosecond = 0, ).toInstant(TimeZone.UTC), type = Codelab, followableTopics = listOf(previewFollowableTopics[1]), - isSaved = true + isSaved = true, ), UserNewsResource( id = "2", @@ -98,7 +98,7 @@ val previewUserNewsResources = listOf( publishDate = Instant.parse("2021-11-09T00:00:00.000Z"), type = Video, followableTopics = listOf(previewFollowableTopics[0], previewFollowableTopics[1]), - isSaved = false + isSaved = false, ), UserNewsResource( id = "3", @@ -112,7 +112,7 @@ val previewUserNewsResources = listOf( publishDate = Instant.parse("2021-11-01T00:00:00.000Z"), type = Video, followableTopics = listOf(previewFollowableTopics[2]), - isSaved = false + isSaved = false, ), UserNewsResource( id = "4", @@ -124,6 +124,6 @@ val previewUserNewsResources = listOf( publishDate = Instant.parse("2022-10-01T00:00:00.000Z"), type = Unknown, followableTopics = listOf(previewFollowableTopics[2]), - isSaved = true - ) + isSaved = true, + ), ) diff --git a/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/GetFollowableTopicsUseCaseTest.kt b/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/GetFollowableTopicsUseCaseTest.kt index 95ab22b63..8bf63aea4 100644 --- a/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/GetFollowableTopicsUseCaseTest.kt +++ b/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/GetFollowableTopicsUseCaseTest.kt @@ -22,11 +22,11 @@ import com.google.samples.apps.nowinandroid.core.model.data.Topic import com.google.samples.apps.nowinandroid.core.testing.repository.TestTopicsRepository import com.google.samples.apps.nowinandroid.core.testing.repository.TestUserDataRepository import com.google.samples.apps.nowinandroid.core.testing.util.MainDispatcherRule -import kotlin.test.assertEquals import kotlinx.coroutines.flow.first import kotlinx.coroutines.test.runTest import org.junit.Rule import org.junit.Test +import kotlin.test.assertEquals class GetFollowableTopicsUseCaseTest { @@ -38,12 +38,11 @@ class GetFollowableTopicsUseCaseTest { val useCase = GetFollowableTopicsUseCase( topicsRepository, - userDataRepository + userDataRepository, ) @Test fun whenNoParams_followableTopicsAreReturnedWithNoSorting() = runTest { - // Obtain a stream of followable topics. val followableTopics = useCase() @@ -58,16 +57,15 @@ class GetFollowableTopicsUseCaseTest { FollowableTopic(testTopics[1], false), FollowableTopic(testTopics[2], true), ), - followableTopics.first() + followableTopics.first(), ) } @Test fun whenSortOrderIsByName_topicsSortedByNameAreReturned() = runTest { - // Obtain a stream of followable topics, sorted by name. val followableTopics = useCase( - sortBy = NAME + sortBy = NAME, ) // Send some test topics and their followed state. @@ -81,7 +79,7 @@ class GetFollowableTopicsUseCaseTest { .sortedBy { it.name } .map { FollowableTopic(it, false) - } + }, ) } } diff --git a/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/GetUserNewsResourcesUseCaseTest.kt b/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/GetUserNewsResourcesUseCaseTest.kt index fe50ecf4d..32ee8773c 100644 --- a/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/GetUserNewsResourcesUseCaseTest.kt +++ b/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/GetUserNewsResourcesUseCaseTest.kt @@ -24,12 +24,12 @@ import com.google.samples.apps.nowinandroid.core.testing.repository.TestNewsRepo import com.google.samples.apps.nowinandroid.core.testing.repository.TestUserDataRepository import com.google.samples.apps.nowinandroid.core.testing.repository.emptyUserData import com.google.samples.apps.nowinandroid.core.testing.util.MainDispatcherRule -import kotlin.test.assertEquals import kotlinx.coroutines.flow.first import kotlinx.coroutines.test.runTest import kotlinx.datetime.Instant import org.junit.Rule import org.junit.Test +import kotlin.test.assertEquals class GetUserNewsResourcesUseCaseTest { @@ -43,7 +43,6 @@ class GetUserNewsResourcesUseCaseTest { @Test fun whenNoFilters_allNewsResourcesAreReturned() = runTest { - // Obtain the user news resources stream. val userNewsResources = useCase() @@ -53,7 +52,7 @@ class GetUserNewsResourcesUseCaseTest { // Construct the test user data with bookmarks and followed topics. val userData = emptyUserData.copy( bookmarkedNewsResources = setOf(sampleNewsResources[0].id, sampleNewsResources[2].id), - followedTopics = setOf(sampleTopic1.id) + followedTopics = setOf(sampleTopic1.id), ) userDataRepository.setUserData(userData) @@ -61,13 +60,12 @@ class GetUserNewsResourcesUseCaseTest { // Check that the correct news resources are returned with their bookmarked state. assertEquals( sampleNewsResources.mapToUserNewsResources(userData), - userNewsResources.first() + userNewsResources.first(), ) } @Test fun whenFilteredByTopicId_matchingNewsResourcesAreReturned() = runTest { - // Obtain a stream of user news resources for the given topic id. val userNewsResources = useCase(filterTopicIds = setOf(sampleTopic1.id)) @@ -80,7 +78,7 @@ class GetUserNewsResourcesUseCaseTest { sampleNewsResources .filter { it.topics.contains(sampleTopic1) } .mapToUserNewsResources(emptyUserData), - userNewsResources.first() + userNewsResources.first(), ) } } @@ -115,7 +113,7 @@ private val sampleNewsResources = listOf( headerImageUrl = "https://i.ytimg.com/vi/-fJ6poHQrjM/maxresdefault.jpg", publishDate = Instant.parse("2021-11-09T00:00:00.000Z"), type = Video, - topics = listOf(sampleTopic1) + topics = listOf(sampleTopic1), ), NewsResource( id = "2", @@ -127,7 +125,7 @@ private val sampleNewsResources = listOf( headerImageUrl = "https://i.ytimg.com/vi/ZARz0pjm5YM/maxresdefault.jpg", publishDate = Instant.parse("2021-11-01T00:00:00.000Z"), type = Video, - topics = listOf(sampleTopic1, sampleTopic2) + topics = listOf(sampleTopic1, sampleTopic2), ), NewsResource( id = "3", @@ -137,6 +135,6 @@ private val sampleNewsResources = listOf( headerImageUrl = "https://i.ytimg.com/vi/r5JgIyS3t3s/maxresdefault.jpg", publishDate = Instant.parse("2021-11-08T00:00:00.000Z"), type = Video, - topics = listOf(sampleTopic2) + topics = listOf(sampleTopic2), ), ) diff --git a/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/UserNewsResourceTest.kt b/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/UserNewsResourceTest.kt index d06a6d5ac..8350c5178 100644 --- a/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/UserNewsResourceTest.kt +++ b/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/UserNewsResourceTest.kt @@ -38,7 +38,6 @@ class UserNewsResourceTest { */ @Test fun userNewsResourcesAreConstructedFromNewsResourcesAndUserData() { - val newsResource1 = NewsResource( id = "N1", title = "Test news title", @@ -54,7 +53,7 @@ class UserNewsResourceTest { shortDescription = "Topic 1 short description", longDescription = "Topic 1 long description", url = "Topic 1 URL", - imageUrl = "Topic 1 image URL" + imageUrl = "Topic 1 image URL", ), Topic( id = "T2", @@ -62,9 +61,9 @@ class UserNewsResourceTest { shortDescription = "Topic 2 short description", longDescription = "Topic 2 long description", url = "Topic 2 URL", - imageUrl = "Topic 2 image URL" + imageUrl = "Topic 2 image URL", ), - ) + ), ) val userData = UserData( @@ -73,7 +72,7 @@ class UserNewsResourceTest { themeBrand = DEFAULT, darkThemeConfig = FOLLOW_SYSTEM, useDynamicColor = false, - shouldHideOnboarding = true + shouldHideOnboarding = true, ) val userNewsResource = UserNewsResource(newsResource1, userData) @@ -89,11 +88,10 @@ class UserNewsResourceTest { // Check that each Topic has been converted to a FollowedTopic correctly. assertEquals(newsResource1.topics.size, userNewsResource.followableTopics.size) for (topic in newsResource1.topics) { - // Construct the expected FollowableTopic. val followableTopic = FollowableTopic( topic = topic, - isFollowed = userData.followedTopics.contains(topic.id) + isFollowed = userData.followedTopics.contains(topic.id), ) assertTrue(userNewsResource.followableTopics.contains(followableTopic)) } @@ -101,7 +99,7 @@ class UserNewsResourceTest { // Check that the saved flag is set correctly. assertEquals( userData.bookmarkedNewsResources.contains(newsResource1.id), - userNewsResource.isSaved + userNewsResource.isSaved, ) } } diff --git a/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/NewsResource.kt b/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/NewsResource.kt index 4f75d27ad..2f60ca43b 100644 --- a/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/NewsResource.kt +++ b/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/NewsResource.kt @@ -37,7 +37,7 @@ data class NewsResource( val headerImageUrl: String?, val publishDate: Instant, val type: NewsResourceType, - val topics: List + val topics: List, ) val previewNewsResources = listOf( @@ -54,10 +54,10 @@ val previewNewsResources = listOf( hour = 23, minute = 0, second = 0, - nanosecond = 0 + nanosecond = 0, ).toInstant(TimeZone.UTC), type = Codelab, - topics = listOf(previewTopics[1]) + topics = listOf(previewTopics[1]), ), NewsResource( id = "2", @@ -70,7 +70,7 @@ val previewNewsResources = listOf( headerImageUrl = "https://i.ytimg.com/vi/-fJ6poHQrjM/maxresdefault.jpg", publishDate = Instant.parse("2021-11-09T00:00:00.000Z"), type = Video, - topics = listOf(previewTopics[0], previewTopics[1]) + topics = listOf(previewTopics[0], previewTopics[1]), ), NewsResource( id = "3", @@ -83,7 +83,7 @@ val previewNewsResources = listOf( headerImageUrl = "https://i.ytimg.com/vi/ZARz0pjm5YM/maxresdefault.jpg", publishDate = Instant.parse("2021-11-01T00:00:00.000Z"), type = Video, - topics = listOf(previewTopics[2]) + topics = listOf(previewTopics[2]), ), NewsResource( id = "4", @@ -94,6 +94,6 @@ val previewNewsResources = listOf( headerImageUrl = "", publishDate = Instant.parse("2022-10-01T00:00:00.000Z"), type = Unknown, - topics = listOf(previewTopics[2]) - ) + topics = listOf(previewTopics[2]), + ), ) diff --git a/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/NewsResourceType.kt b/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/NewsResourceType.kt index a6a175ff3..bb00f8620 100644 --- a/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/NewsResourceType.kt +++ b/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/NewsResourceType.kt @@ -23,53 +23,53 @@ enum class NewsResourceType( val serializedName: String, val displayText: String, // TODO: descriptions should probably be string resources - val description: String + val description: String, ) { Video( serializedName = "Video 📺", displayText = "Video 📺", - description = "A video published on YouTube" + description = "A video published on YouTube", ), APIChange( serializedName = "API change", displayText = "API change", - description = "An addition, deprecation or change to the Android platform APIs." + description = "An addition, deprecation or change to the Android platform APIs.", ), Article( serializedName = "Article 📚", displayText = "Article 📚", - description = "An article, typically on Medium or the official Android blog" + description = "An article, typically on Medium or the official Android blog", ), Codelab( serializedName = "Codelab", displayText = "Codelab", - description = "A new or updated codelab" + description = "A new or updated codelab", ), Podcast( serializedName = "Podcast 🎙", displayText = "Podcast 🎙", - description = "A podcast" + description = "A podcast", ), Docs( serializedName = "Docs 📑", displayText = "Docs 📑", - description = "A new or updated piece of documentation" + description = "A new or updated piece of documentation", ), Event( serializedName = "Event 📆", displayText = "Event 📆", - description = "Information about a developer event e.g. Android Developer Summit" + description = "Information about a developer event e.g. Android Developer Summit", ), DAC( serializedName = "DAC", displayText = "DAC", - description = "Android version features - Information about features in an Android" + description = "Android version features - Information about features in an Android", ), Unknown( serializedName = "Unknown", displayText = "Unknown", - description = "Unknown" - ) + description = "Unknown", + ), } fun String?.asNewsResourceType() = when (this) { diff --git a/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/Topic.kt b/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/Topic.kt index 16dd4e464..03c184e0d 100644 --- a/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/Topic.kt +++ b/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/Topic.kt @@ -37,7 +37,7 @@ val previewTopics = listOf( shortDescription = "News we want everyone to see", longDescription = "Stay up to date with the latest events and announcements from Android!", imageUrl = "https://firebasestorage.googleapis.com/v0/b/now-in-android.appspot.com/o/img%2Fic_topic_Headlines.svg?alt=media&token=506faab0-617a-4668-9e63-4a2fb996603f", - url = "" + url = "", ), Topic( id = "3", @@ -45,7 +45,7 @@ val previewTopics = listOf( shortDescription = "Material Design, Navigation, Text, Paging, Accessibility (a11y), Internationalization (i18n), Localization (l10n), Animations, Large Screens, Widgets", longDescription = "Learn how to optimize your app's user interface - everything that users can see and interact with. Stay up to date on tocpis such as Material Design, Navigation, Text, Paging, Compose, Accessibility (a11y), Internationalization (i18n), Localization (l10n), Animations, Large Screens, Widgets, and many more!", imageUrl = "https://firebasestorage.googleapis.com/v0/b/now-in-android.appspot.com/o/img%2Fic_topic_UI.svg?alt=media&token=0ee1842b-12e8-435f-87ba-a5bb02c47594", - url = "" + url = "", ), Topic( id = "4", @@ -53,6 +53,6 @@ val previewTopics = listOf( shortDescription = "CI, Espresso, TestLab, etc", longDescription = "Testing is an integral part of the app development process. By running tests against your app consistently, you can verify your app's correctness, functional behavior, and usability before you release it publicly. Stay up to date on the latest tricks in CI, Espresso, and Firebase TestLab.", imageUrl = "https://firebasestorage.googleapis.com/v0/b/now-in-android.appspot.com/o/img%2Fic_topic_Testing.svg?alt=media&token=a11533c4-7cc8-4b11-91a3-806158ebf428", - url = "" + url = "", ), ) diff --git a/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/UserData.kt b/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/UserData.kt index 56e3fa522..638b90d36 100644 --- a/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/UserData.kt +++ b/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/UserData.kt @@ -25,5 +25,5 @@ data class UserData( val themeBrand: ThemeBrand, val darkThemeConfig: DarkThemeConfig, val useDynamicColor: Boolean, - val shouldHideOnboarding: Boolean + val shouldHideOnboarding: Boolean, ) diff --git a/core/network/src/main/java/com/google/samples/apps/nowinandroid/core/network/di/NetworkModule.kt b/core/network/src/main/java/com/google/samples/apps/nowinandroid/core/network/di/NetworkModule.kt index d6b6b987d..a272451e5 100644 --- a/core/network/src/main/java/com/google/samples/apps/nowinandroid/core/network/di/NetworkModule.kt +++ b/core/network/src/main/java/com/google/samples/apps/nowinandroid/core/network/di/NetworkModule.kt @@ -23,8 +23,8 @@ import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent -import javax.inject.Singleton import kotlinx.serialization.json.Json +import javax.inject.Singleton @Module @InstallIn(SingletonComponent::class) diff --git a/core/network/src/main/java/com/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSource.kt b/core/network/src/main/java/com/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSource.kt index 47a8ab4c4..4ffddb20a 100644 --- a/core/network/src/main/java/com/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSource.kt +++ b/core/network/src/main/java/com/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSource.kt @@ -23,12 +23,12 @@ import com.google.samples.apps.nowinandroid.core.network.NiaNetworkDataSource import com.google.samples.apps.nowinandroid.core.network.model.NetworkChangeList import com.google.samples.apps.nowinandroid.core.network.model.NetworkNewsResource import com.google.samples.apps.nowinandroid.core.network.model.NetworkTopic -import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.withContext import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.json.Json import kotlinx.serialization.json.decodeFromStream +import javax.inject.Inject /** * [NiaNetworkDataSource] implementation that provides static news resources to aid development @@ -69,7 +69,7 @@ class FakeNiaNetworkDataSource @Inject constructor( * [NetworkChangeList.id] */ private fun List.mapToChangeList( - idGetter: (T) -> String + idGetter: (T) -> String, ) = mapIndexed { index, item -> NetworkChangeList( id = idGetter(item), diff --git a/core/network/src/main/java/com/google/samples/apps/nowinandroid/core/network/model/util/InstantSerializer.kt b/core/network/src/main/java/com/google/samples/apps/nowinandroid/core/network/model/util/InstantSerializer.kt index f093998cf..dec73dc10 100644 --- a/core/network/src/main/java/com/google/samples/apps/nowinandroid/core/network/model/util/InstantSerializer.kt +++ b/core/network/src/main/java/com/google/samples/apps/nowinandroid/core/network/model/util/InstantSerializer.kt @@ -31,7 +31,7 @@ object InstantSerializer : KSerializer { override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor( serialName = "Instant", - kind = STRING + kind = STRING, ) override fun serialize(encoder: Encoder, value: Instant) = diff --git a/core/network/src/main/java/com/google/samples/apps/nowinandroid/core/network/model/util/NewsResourceTypeSerializer.kt b/core/network/src/main/java/com/google/samples/apps/nowinandroid/core/network/model/util/NewsResourceTypeSerializer.kt index 4100a956c..ac40d6182 100644 --- a/core/network/src/main/java/com/google/samples/apps/nowinandroid/core/network/model/util/NewsResourceTypeSerializer.kt +++ b/core/network/src/main/java/com/google/samples/apps/nowinandroid/core/network/model/util/NewsResourceTypeSerializer.kt @@ -31,7 +31,7 @@ object NewsResourceTypeSerializer : KSerializer { override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor( serialName = "type", - kind = STRING + kind = STRING, ) override fun serialize(encoder: Encoder, value: NewsResourceType) = diff --git a/core/network/src/main/java/com/google/samples/apps/nowinandroid/core/network/retrofit/RetrofitNiaNetwork.kt b/core/network/src/main/java/com/google/samples/apps/nowinandroid/core/network/retrofit/RetrofitNiaNetwork.kt index e380c05cc..6b59f16e3 100644 --- a/core/network/src/main/java/com/google/samples/apps/nowinandroid/core/network/retrofit/RetrofitNiaNetwork.kt +++ b/core/network/src/main/java/com/google/samples/apps/nowinandroid/core/network/retrofit/RetrofitNiaNetwork.kt @@ -22,8 +22,6 @@ import com.google.samples.apps.nowinandroid.core.network.model.NetworkChangeList import com.google.samples.apps.nowinandroid.core.network.model.NetworkNewsResource import com.google.samples.apps.nowinandroid.core.network.model.NetworkTopic import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory -import javax.inject.Inject -import javax.inject.Singleton import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.Serializable import kotlinx.serialization.json.Json @@ -33,6 +31,8 @@ import okhttp3.logging.HttpLoggingInterceptor import retrofit2.Retrofit import retrofit2.http.GET import retrofit2.http.Query +import javax.inject.Inject +import javax.inject.Singleton /** * Retrofit API declaration for NIA Network API @@ -66,7 +66,7 @@ private const val NiaBaseUrl = BuildConfig.BACKEND_URL */ @Serializable private data class NetworkResponse( - val data: T + val data: T, ) /** @@ -74,7 +74,7 @@ private data class NetworkResponse( */ @Singleton class RetrofitNiaNetwork @Inject constructor( - networkJson: Json + networkJson: Json, ) : NiaNetworkDataSource { private val networkApi = Retrofit.Builder() @@ -85,13 +85,13 @@ class RetrofitNiaNetwork @Inject constructor( // TODO: Decide logging logic HttpLoggingInterceptor().apply { setLevel(HttpLoggingInterceptor.Level.BODY) - } + }, ) - .build() + .build(), ) .addConverterFactory( @OptIn(ExperimentalSerializationApi::class) - networkJson.asConverterFactory("application/json".toMediaType()) + networkJson.asConverterFactory("application/json".toMediaType()), ) .build() .create(RetrofitNiaNetworkApi::class.java) diff --git a/core/network/src/test/java/com/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSourceTest.kt b/core/network/src/test/java/com/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSourceTest.kt index 48eb4746b..f54351750 100644 --- a/core/network/src/test/java/com/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSourceTest.kt +++ b/core/network/src/test/java/com/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSourceTest.kt @@ -20,7 +20,6 @@ import JvmUnitTestFakeAssetManager import com.google.samples.apps.nowinandroid.core.model.data.NewsResourceType.Codelab import com.google.samples.apps.nowinandroid.core.network.model.NetworkNewsResource import com.google.samples.apps.nowinandroid.core.network.model.NetworkTopic -import kotlin.test.assertEquals import kotlinx.coroutines.test.StandardTestDispatcher import kotlinx.coroutines.test.runTest import kotlinx.datetime.LocalDateTime @@ -29,6 +28,7 @@ import kotlinx.datetime.toInstant import kotlinx.serialization.json.Json import org.junit.Before import org.junit.Test +import kotlin.test.assertEquals class FakeNiaNetworkDataSourceTest { @@ -41,7 +41,7 @@ class FakeNiaNetworkDataSourceTest { subject = FakeNiaNetworkDataSource( ioDispatcher = testDispatcher, networkJson = Json { ignoreUnknownKeys = true }, - assets = JvmUnitTestFakeAssetManager + assets = JvmUnitTestFakeAssetManager, ) } @@ -55,10 +55,10 @@ class FakeNiaNetworkDataSourceTest { shortDescription = "News you'll definitely be interested in", longDescription = "The latest events and announcements from the world of Android development.", url = "", - imageUrl = "https://firebasestorage.googleapis.com/v0/b/now-in-android.appspot.com/o/img%2Fic_topic_Headlines.svg?alt=media&token=506faab0-617a-4668-9e63-4a2fb996603f" + imageUrl = "https://firebasestorage.googleapis.com/v0/b/now-in-android.appspot.com/o/img%2Fic_topic_Headlines.svg?alt=media&token=506faab0-617a-4668-9e63-4a2fb996603f", ), /* ktlint-enable max-line-length */ - subject.getTopics().first() + subject.getTopics().first(), ) } @@ -79,13 +79,13 @@ class FakeNiaNetworkDataSourceTest { hour = 23, minute = 0, second = 0, - nanosecond = 0 + nanosecond = 0, ).toInstant(TimeZone.UTC), type = Codelab, topics = listOf("2", "3", "10"), ), /* ktlint-enable max-line-length */ - subject.getNewsResources().find { it.id == "125" } + subject.getNewsResources().find { it.id == "125" }, ) } } diff --git a/core/network/src/test/java/com/google/samples/apps/nowinandroid/core/network/model/util/NewsResourceTypeSerializerTest.kt b/core/network/src/test/java/com/google/samples/apps/nowinandroid/core/network/model/util/NewsResourceTypeSerializerTest.kt index 191501a3d..16ac7df26 100644 --- a/core/network/src/test/java/com/google/samples/apps/nowinandroid/core/network/model/util/NewsResourceTypeSerializerTest.kt +++ b/core/network/src/test/java/com/google/samples/apps/nowinandroid/core/network/model/util/NewsResourceTypeSerializerTest.kt @@ -17,9 +17,9 @@ package com.google.samples.apps.nowinandroid.core.network.model.util import com.google.samples.apps.nowinandroid.core.model.data.NewsResourceType -import kotlin.test.assertEquals import kotlinx.serialization.json.Json import org.junit.Test +import kotlin.test.assertEquals class NewsResourceTypeSerializerTest { @@ -27,7 +27,7 @@ class NewsResourceTypeSerializerTest { fun test_news_resource_serializer_video() { assertEquals( NewsResourceType.Video, - Json.decodeFromString(NewsResourceTypeSerializer, """"Video 📺"""") + Json.decodeFromString(NewsResourceTypeSerializer, """"Video 📺""""), ) } @@ -35,7 +35,7 @@ class NewsResourceTypeSerializerTest { fun test_news_resource_serializer_article() { assertEquals( NewsResourceType.Article, - Json.decodeFromString(NewsResourceTypeSerializer, """"Article 📚"""") + Json.decodeFromString(NewsResourceTypeSerializer, """"Article 📚""""), ) } @@ -43,7 +43,7 @@ class NewsResourceTypeSerializerTest { fun test_news_resource_serializer_api_change() { assertEquals( NewsResourceType.APIChange, - Json.decodeFromString(NewsResourceTypeSerializer, """"API change"""") + Json.decodeFromString(NewsResourceTypeSerializer, """"API change""""), ) } @@ -51,7 +51,7 @@ class NewsResourceTypeSerializerTest { fun test_news_resource_serializer_codelab() { assertEquals( NewsResourceType.Codelab, - Json.decodeFromString(NewsResourceTypeSerializer, """"Codelab"""") + Json.decodeFromString(NewsResourceTypeSerializer, """"Codelab""""), ) } @@ -59,7 +59,7 @@ class NewsResourceTypeSerializerTest { fun test_news_resource_serializer_podcast() { assertEquals( NewsResourceType.Podcast, - Json.decodeFromString(NewsResourceTypeSerializer, """"Podcast 🎙"""") + Json.decodeFromString(NewsResourceTypeSerializer, """"Podcast 🎙""""), ) } @@ -67,7 +67,7 @@ class NewsResourceTypeSerializerTest { fun test_news_resource_serializer_docs() { assertEquals( NewsResourceType.Docs, - Json.decodeFromString(NewsResourceTypeSerializer, """"Docs 📑"""") + Json.decodeFromString(NewsResourceTypeSerializer, """"Docs 📑""""), ) } @@ -75,7 +75,7 @@ class NewsResourceTypeSerializerTest { fun test_news_resource_serializer_event() { assertEquals( NewsResourceType.Event, - Json.decodeFromString(NewsResourceTypeSerializer, """"Event 📆"""") + Json.decodeFromString(NewsResourceTypeSerializer, """"Event 📆""""), ) } @@ -83,7 +83,7 @@ class NewsResourceTypeSerializerTest { fun test_news_resource_serializer_dac() { assertEquals( NewsResourceType.DAC, - Json.decodeFromString(NewsResourceTypeSerializer, """"DAC"""") + Json.decodeFromString(NewsResourceTypeSerializer, """"DAC""""), ) } @@ -91,7 +91,7 @@ class NewsResourceTypeSerializerTest { fun test_news_resource_serializer_unknown() { assertEquals( NewsResourceType.Unknown, - Json.decodeFromString(NewsResourceTypeSerializer, """"umm"""") + Json.decodeFromString(NewsResourceTypeSerializer, """"umm""""), ) } @@ -100,7 +100,7 @@ class NewsResourceTypeSerializerTest { val json = Json.encodeToString(NewsResourceTypeSerializer, NewsResourceType.Video) assertEquals( NewsResourceType.Video, - Json.decodeFromString(NewsResourceTypeSerializer, json) + Json.decodeFromString(NewsResourceTypeSerializer, json), ) } } diff --git a/core/testing/src/main/java/com/google/samples/apps/nowinandroid/core/testing/di/TestDispatcherModule.kt b/core/testing/src/main/java/com/google/samples/apps/nowinandroid/core/testing/di/TestDispatcherModule.kt index d0af32893..66d52dabe 100644 --- a/core/testing/src/main/java/com/google/samples/apps/nowinandroid/core/testing/di/TestDispatcherModule.kt +++ b/core/testing/src/main/java/com/google/samples/apps/nowinandroid/core/testing/di/TestDispatcherModule.kt @@ -20,9 +20,9 @@ import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent -import javax.inject.Singleton import kotlinx.coroutines.test.TestDispatcher import kotlinx.coroutines.test.UnconfinedTestDispatcher +import javax.inject.Singleton @Module @InstallIn(SingletonComponent::class) diff --git a/core/testing/src/main/java/com/google/samples/apps/nowinandroid/core/testing/repository/TestUserDataRepository.kt b/core/testing/src/main/java/com/google/samples/apps/nowinandroid/core/testing/repository/TestUserDataRepository.kt index c4c6e126f..e1b86cd63 100644 --- a/core/testing/src/main/java/com/google/samples/apps/nowinandroid/core/testing/repository/TestUserDataRepository.kt +++ b/core/testing/src/main/java/com/google/samples/apps/nowinandroid/core/testing/repository/TestUserDataRepository.kt @@ -31,7 +31,7 @@ val emptyUserData = UserData( themeBrand = ThemeBrand.DEFAULT, darkThemeConfig = DarkThemeConfig.FOLLOW_SYSTEM, useDynamicColor = false, - shouldHideOnboarding = false + shouldHideOnboarding = false, ) class TestUserDataRepository : UserDataRepository { @@ -50,8 +50,11 @@ class TestUserDataRepository : UserDataRepository { override suspend fun toggleFollowedTopicId(followedTopicId: String, followed: Boolean) { currentUserData.let { current -> - val followedTopics = if (followed) current.followedTopics + followedTopicId - else current.followedTopics - followedTopicId + val followedTopics = if (followed) { + current.followedTopics + followedTopicId + } else { + current.followedTopics - followedTopicId + } _userData.tryEmit(current.copy(followedTopics = followedTopics)) } @@ -59,8 +62,11 @@ class TestUserDataRepository : UserDataRepository { override suspend fun updateNewsResourceBookmark(newsResourceId: String, bookmarked: Boolean) { currentUserData.let { current -> - val bookmarkedNews = if (bookmarked) current.bookmarkedNewsResources + newsResourceId - else current.bookmarkedNewsResources - newsResourceId + val bookmarkedNews = if (bookmarked) { + current.bookmarkedNewsResources + newsResourceId + } else { + current.bookmarkedNewsResources - newsResourceId + } _userData.tryEmit(current.copy(bookmarkedNewsResources = bookmarkedNews)) } diff --git a/core/ui/src/androidTest/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCardTest.kt b/core/ui/src/androidTest/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCardTest.kt index 6fbe0b0e4..ddcd2644e 100644 --- a/core/ui/src/androidTest/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCardTest.kt +++ b/core/ui/src/androidTest/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCardTest.kt @@ -40,7 +40,7 @@ class NewsResourceCardTest { userNewsResource = newsWithKnownResourceType, isBookmarked = false, onToggleBookmark = {}, - onClick = {} + onClick = {}, ) dateFormatted = dateFormatted(publishDate = newsWithKnownResourceType.publishDate) @@ -51,8 +51,8 @@ class NewsResourceCardTest { composeTestRule.activity.getString( R.string.card_meta_data_text, dateFormatted, - newsWithKnownResourceType.type.displayText - ) + newsWithKnownResourceType.type.displayText, + ), ) .assertExists() } @@ -67,7 +67,7 @@ class NewsResourceCardTest { userNewsResource = newsWithUnknownResourceType, isBookmarked = false, onToggleBookmark = {}, - onClick = {} + onClick = {}, ) dateFormatted = dateFormatted(publishDate = newsWithUnknownResourceType.publishDate) diff --git a/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/JankStatsExtensions.kt b/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/JankStatsExtensions.kt index d4ca9180d..c9fee1ac8 100644 --- a/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/JankStatsExtensions.kt +++ b/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/JankStatsExtensions.kt @@ -51,7 +51,7 @@ fun rememberMetricsStateHolder(): Holder { @Composable fun TrackJank( vararg keys: Any?, - reportMetric: suspend CoroutineScope.(state: Holder) -> Unit + reportMetric: suspend CoroutineScope.(state: Holder) -> Unit, ) { val metrics = rememberMetricsStateHolder() LaunchedEffect(metrics, *keys) { @@ -66,7 +66,7 @@ fun TrackJank( @Composable fun TrackDisposableJank( vararg keys: Any?, - reportMetric: DisposableEffectScope.(state: Holder) -> DisposableEffectResult + reportMetric: DisposableEffectScope.(state: Holder) -> DisposableEffectResult, ) { val metrics = rememberMetricsStateHolder() DisposableEffect(metrics, *keys) { diff --git a/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsFeed.kt b/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsFeed.kt index 44c810a36..bbff34e40 100644 --- a/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsFeed.kt +++ b/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsFeed.kt @@ -46,7 +46,7 @@ import com.google.samples.apps.nowinandroid.core.domain.model.previewUserNewsRes */ fun LazyGridScope.newsFeed( feedState: NewsFeedUiState, - onNewsResourcesCheckedChanged: (String, Boolean) -> Unit + onNewsResourcesCheckedChanged: (String, Boolean) -> Unit, ) { when (feedState) { NewsFeedUiState.Loading -> Unit @@ -65,9 +65,9 @@ fun LazyGridScope.newsFeed( onToggleBookmark = { onNewsResourcesCheckedChanged( userNewsResource.id, - !userNewsResource.isSaved + !userNewsResource.isSaved, ) - } + }, ) } } @@ -100,7 +100,7 @@ sealed interface NewsFeedUiState { /** * The list of news resources contained in this feed. */ - val feed: List + val feed: List, ) : NewsFeedUiState } @@ -111,7 +111,7 @@ private fun NewsFeedLoadingPreview() { LazyVerticalGrid(columns = GridCells.Adaptive(300.dp)) { newsFeed( feedState = NewsFeedUiState.Loading, - onNewsResourcesCheckedChanged = { _, _ -> } + onNewsResourcesCheckedChanged = { _, _ -> }, ) } } @@ -125,9 +125,9 @@ private fun NewsFeedContentPreview() { LazyVerticalGrid(columns = GridCells.Adaptive(300.dp)) { newsFeed( feedState = NewsFeedUiState.Success( - previewUserNewsResources + previewUserNewsResources, ), - onNewsResourcesCheckedChanged = { _, _ -> } + onNewsResourcesCheckedChanged = { _, _ -> }, ) } } diff --git a/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCard.kt b/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCard.kt index 76657067e..f2ec186e7 100644 --- a/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCard.kt +++ b/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCard.kt @@ -52,7 +52,6 @@ import androidx.compose.ui.semantics.semantics import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import coil.compose.AsyncImage -import com.google.samples.apps.nowinandroid.core.designsystem.R as DesignsystemR import com.google.samples.apps.nowinandroid.core.designsystem.component.NiaIconToggleButton import com.google.samples.apps.nowinandroid.core.designsystem.component.NiaTopicTag import com.google.samples.apps.nowinandroid.core.designsystem.icon.NiaIcons @@ -62,11 +61,12 @@ import com.google.samples.apps.nowinandroid.core.domain.model.UserNewsResource import com.google.samples.apps.nowinandroid.core.domain.model.previewUserNewsResources import com.google.samples.apps.nowinandroid.core.model.data.NewsResource import com.google.samples.apps.nowinandroid.core.model.data.NewsResourceType +import kotlinx.datetime.Instant +import kotlinx.datetime.toJavaInstant import java.time.ZoneId import java.time.format.DateTimeFormatter import java.util.Locale -import kotlinx.datetime.Instant -import kotlinx.datetime.toJavaInstant +import com.google.samples.apps.nowinandroid.core.designsystem.R as DesignsystemR /** * [NewsResource] card used on the following screens: For You, Saved @@ -79,7 +79,7 @@ fun NewsResourceCardExpanded( isBookmarked: Boolean, onToggleBookmark: () -> Unit, onClick: () -> Unit, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { val clickActionLabel = stringResource(R.string.card_tap_action) Card( @@ -90,7 +90,7 @@ fun NewsResourceCardExpanded( // Pass null for action to only override the label and not the actual action. modifier = modifier.semantics { onClick(label = clickActionLabel, action = null) - } + }, ) { Column { if (!userNewsResource.headerImageUrl.isNullOrEmpty()) { @@ -99,14 +99,14 @@ fun NewsResourceCardExpanded( } } Box( - modifier = Modifier.padding(16.dp) + modifier = Modifier.padding(16.dp), ) { Column { Spacer(modifier = Modifier.height(12.dp)) Row { NewsResourceTitle( userNewsResource.title, - modifier = Modifier.fillMaxWidth((.8f)) + modifier = Modifier.fillMaxWidth((.8f)), ) Spacer(modifier = Modifier.weight(1f)) BookmarkButton(isBookmarked, onToggleBookmark) @@ -125,7 +125,7 @@ fun NewsResourceCardExpanded( @Composable fun NewsResourceHeaderImage( - headerImageUrl: String? + headerImageUrl: String?, ) { AsyncImage( placeholder = if (LocalInspectionMode.current) { @@ -140,14 +140,14 @@ fun NewsResourceHeaderImage( contentScale = ContentScale.Crop, model = headerImageUrl, // TODO b/226661685: Investigate using alt text of image to populate content description - contentDescription = null // decorative image + contentDescription = null, // decorative image ) } @Composable fun NewsResourceTitle( newsResourceTitle: String, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { Text(newsResourceTitle, style = MaterialTheme.typography.headlineSmall, modifier = modifier) } @@ -156,7 +156,7 @@ fun NewsResourceTitle( fun BookmarkButton( isBookmarked: Boolean, onClick: () -> Unit, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { NiaIconToggleButton( checked = isBookmarked, @@ -165,15 +165,15 @@ fun BookmarkButton( icon = { Icon( painter = painterResource(NiaIcons.BookmarkBorder), - contentDescription = stringResource(R.string.bookmark) + contentDescription = stringResource(R.string.bookmark), ) }, checkedIcon = { Icon( painter = painterResource(NiaIcons.Bookmark), - contentDescription = stringResource(R.string.unbookmark) + contentDescription = stringResource(R.string.unbookmark), ) - } + }, ) } @@ -185,7 +185,7 @@ fun dateFormatted(publishDate: Instant): String { DisposableEffect(context) { val receiver = TimeZoneBroadcastReceiver( - onTimeZoneChanged = { zoneId = ZoneId.systemDefault() } + onTimeZoneChanged = { zoneId = ZoneId.systemDefault() }, ) receiver.register(context) onDispose { @@ -200,7 +200,7 @@ fun dateFormatted(publishDate: Instant): String { @Composable fun NewsResourceMetaData( publishDate: Instant, - resourceType: NewsResourceType + resourceType: NewsResourceType, ) { val formattedDate = dateFormatted(publishDate) Text( @@ -209,21 +209,21 @@ fun NewsResourceMetaData( } else { formattedDate }, - style = MaterialTheme.typography.labelSmall + style = MaterialTheme.typography.labelSmall, ) } @Composable fun NewsResourceLink( @Suppress("UNUSED_PARAMETER") - newsResource: NewsResource + newsResource: NewsResource, ) { TODO() } @Composable fun NewsResourceShortDescription( - newsResourceShortDescription: String + newsResourceShortDescription: String, ) { Text(newsResourceShortDescription, style = MaterialTheme.typography.bodyLarge) } @@ -231,7 +231,7 @@ fun NewsResourceShortDescription( @Composable fun NewsResourceTopics( topics: List, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { // Store the ID of the Topic which has its "following" menu expanded, if any. // To avoid UI confusion, only one topic can have an expanded menu at a time. @@ -255,21 +255,21 @@ fun NewsResourceTopics( val contentDescription = if (followableTopic.isFollowed) { stringResource( R.string.topic_chip_content_description_when_followed, - followableTopic.topic.name + followableTopic.topic.name, ) } else { stringResource( R.string.topic_chip_content_description_when_not_followed, - followableTopic.topic.name + followableTopic.topic.name, ) } Text( text = followableTopic.topic.name.uppercase(Locale.getDefault()), modifier = Modifier.semantics { this.contentDescription = contentDescription - } + }, ) - } + }, ) } } @@ -304,7 +304,7 @@ private fun ExpandedNewsResourcePreview() { userNewsResource = previewUserNewsResources[0], isBookmarked = true, onToggleBookmark = {}, - onClick = {} + onClick = {}, ) } } diff --git a/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCardList.kt b/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCardList.kt index e0bd22785..a63bae657 100644 --- a/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCardList.kt +++ b/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCardList.kt @@ -56,7 +56,7 @@ fun LazyListScope.userNewsResourceCardItems( else -> onItemClick(userNewsResource) } }, - modifier = itemModifier + modifier = itemModifier, ) }, ) diff --git a/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/TimeZoneBroadcastReceiver.kt b/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/TimeZoneBroadcastReceiver.kt index 0e3fc6d1c..f7ae813c4 100644 --- a/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/TimeZoneBroadcastReceiver.kt +++ b/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/TimeZoneBroadcastReceiver.kt @@ -22,7 +22,7 @@ import android.content.Intent import android.content.IntentFilter class TimeZoneBroadcastReceiver( - val onTimeZoneChanged: () -> Unit + val onTimeZoneChanged: () -> Unit, ) : BroadcastReceiver() { private var registered = false diff --git a/feature/bookmarks/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreenTest.kt b/feature/bookmarks/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreenTest.kt index 1f51d2bb9..08d4f6c06 100644 --- a/feature/bookmarks/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreenTest.kt +++ b/feature/bookmarks/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreenTest.kt @@ -32,10 +32,10 @@ import androidx.compose.ui.test.performClick import androidx.compose.ui.test.performScrollToNode import com.google.samples.apps.nowinandroid.core.domain.model.previewUserNewsResources import com.google.samples.apps.nowinandroid.core.ui.NewsFeedUiState -import kotlin.test.assertEquals -import kotlin.test.assertTrue import org.junit.Rule import org.junit.Test +import kotlin.test.assertEquals +import kotlin.test.assertTrue /** * UI tests for [BookmarksScreen] composable. @@ -50,13 +50,13 @@ class BookmarksScreenTest { composeTestRule.setContent { BookmarksScreen( feedState = NewsFeedUiState.Loading, - removeFromBookmarks = { } + removeFromBookmarks = { }, ) } composeTestRule .onNodeWithContentDescription( - composeTestRule.activity.resources.getString(R.string.saved_loading) + composeTestRule.activity.resources.getString(R.string.saved_loading), ) .assertExists() } @@ -66,16 +66,16 @@ class BookmarksScreenTest { composeTestRule.setContent { BookmarksScreen( feedState = NewsFeedUiState.Success( - previewUserNewsResources.take(2) + previewUserNewsResources.take(2), ), - removeFromBookmarks = { } + removeFromBookmarks = { }, ) } composeTestRule .onNodeWithText( previewUserNewsResources[0].title, - substring = true + substring = true, ) .assertExists() .assertHasClickAction() @@ -84,14 +84,14 @@ class BookmarksScreenTest { .performScrollToNode( hasText( previewUserNewsResources[1].title, - substring = true - ) + substring = true, + ), ) composeTestRule .onNodeWithText( previewUserNewsResources[1].title, - substring = true + substring = true, ) .assertExists() .assertHasClickAction() @@ -104,27 +104,27 @@ class BookmarksScreenTest { composeTestRule.setContent { BookmarksScreen( feedState = NewsFeedUiState.Success( - previewUserNewsResources.take(2) + previewUserNewsResources.take(2), ), removeFromBookmarks = { newsResourceId -> assertEquals(previewUserNewsResources[0].id, newsResourceId) removeFromBookmarksCalled = true - } + }, ) } composeTestRule .onAllNodesWithContentDescription( composeTestRule.activity.getString( - com.google.samples.apps.nowinandroid.core.ui.R.string.unbookmark - ) + com.google.samples.apps.nowinandroid.core.ui.R.string.unbookmark, + ), ).filter( hasAnyAncestor( hasText( previewUserNewsResources[0].title, - substring = true - ) - ) + substring = true, + ), + ), ) .assertCountEquals(1) .onFirst() @@ -138,19 +138,19 @@ class BookmarksScreenTest { composeTestRule.setContent { BookmarksScreen( feedState = NewsFeedUiState.Success(emptyList()), - removeFromBookmarks = { } + removeFromBookmarks = { }, ) } composeTestRule .onNodeWithText( - composeTestRule.activity.getString(R.string.bookmarks_empty_error) + composeTestRule.activity.getString(R.string.bookmarks_empty_error), ) .assertExists() composeTestRule .onNodeWithText( - composeTestRule.activity.getString(R.string.bookmarks_empty_description) + composeTestRule.activity.getString(R.string.bookmarks_empty_description), ) .assertExists() } diff --git a/feature/bookmarks/src/main/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreen.kt b/feature/bookmarks/src/main/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreen.kt index 4531942bb..6b0bca003 100644 --- a/feature/bookmarks/src/main/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreen.kt +++ b/feature/bookmarks/src/main/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreen.kt @@ -65,13 +65,13 @@ import com.google.samples.apps.nowinandroid.core.ui.newsFeed @Composable internal fun BookmarksRoute( modifier: Modifier = Modifier, - viewModel: BookmarksViewModel = hiltViewModel() + viewModel: BookmarksViewModel = hiltViewModel(), ) { val feedState by viewModel.feedUiState.collectAsStateWithLifecycle() BookmarksScreen( feedState = feedState, removeFromBookmarks = viewModel::removeFromSavedResources, - modifier = modifier + modifier = modifier, ) } @@ -83,7 +83,7 @@ internal fun BookmarksRoute( internal fun BookmarksScreen( feedState: NewsFeedUiState, removeFromBookmarks: (String) -> Unit, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { when (feedState) { Loading -> LoadingState(modifier) @@ -110,7 +110,7 @@ private fun LoadingState(modifier: Modifier = Modifier) { private fun BookmarksGrid( feedState: NewsFeedUiState, removeFromBookmarks: (String) -> Unit, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { val scrollableState = rememberLazyGridState() TrackScrollJank(scrollableState = scrollableState, stateName = "bookmarks:grid") @@ -122,7 +122,7 @@ private fun BookmarksGrid( state = scrollableState, modifier = modifier .fillMaxSize() - .testTag("bookmarks:feed") + .testTag("bookmarks:feed"), ) { newsFeed( feedState = feedState, @@ -142,14 +142,14 @@ private fun EmptyState(modifier: Modifier = Modifier) { .fillMaxSize() .testTag("bookmarks:empty"), verticalArrangement = Arrangement.Center, - horizontalAlignment = Alignment.CenterHorizontally + horizontalAlignment = Alignment.CenterHorizontally, ) { val iconTint = LocalTintTheme.current.iconTint Image( modifier = Modifier.fillMaxWidth(), painter = painterResource(id = R.drawable.img_empty_bookmarks), colorFilter = if (iconTint != null) ColorFilter.tint(iconTint) else null, - contentDescription = null + contentDescription = null, ) Spacer(modifier = Modifier.height(16.dp)) @@ -159,7 +159,7 @@ private fun EmptyState(modifier: Modifier = Modifier) { modifier = Modifier.fillMaxWidth(), textAlign = TextAlign.Center, style = MaterialTheme.typography.titleMedium, - fontWeight = FontWeight.Bold + fontWeight = FontWeight.Bold, ) Spacer(modifier = Modifier.height(8.dp)) @@ -168,7 +168,7 @@ private fun EmptyState(modifier: Modifier = Modifier) { text = stringResource(id = R.string.bookmarks_empty_description), modifier = Modifier.fillMaxWidth(), textAlign = TextAlign.Center, - style = MaterialTheme.typography.bodyMedium + style = MaterialTheme.typography.bodyMedium, ) } } @@ -187,9 +187,9 @@ private fun BookmarksGridPreview() { NiaTheme { BookmarksGrid( feedState = Success( - previewUserNewsResources + previewUserNewsResources, ), - removeFromBookmarks = {} + removeFromBookmarks = {}, ) } } diff --git a/feature/bookmarks/src/main/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksViewModel.kt b/feature/bookmarks/src/main/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksViewModel.kt index db94839be..fe631c287 100644 --- a/feature/bookmarks/src/main/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksViewModel.kt +++ b/feature/bookmarks/src/main/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksViewModel.kt @@ -24,7 +24,6 @@ import com.google.samples.apps.nowinandroid.core.domain.model.UserNewsResource import com.google.samples.apps.nowinandroid.core.ui.NewsFeedUiState import com.google.samples.apps.nowinandroid.core.ui.NewsFeedUiState.Loading import dagger.hilt.android.lifecycle.HiltViewModel -import javax.inject.Inject import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.filterNot @@ -32,11 +31,12 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch +import javax.inject.Inject @HiltViewModel class BookmarksViewModel @Inject constructor( private val userDataRepository: UserDataRepository, - getSaveableNewsResources: GetUserNewsResourcesUseCase + getSaveableNewsResources: GetUserNewsResourcesUseCase, ) : ViewModel() { val feedUiState: StateFlow = getSaveableNewsResources() @@ -47,7 +47,7 @@ class BookmarksViewModel @Inject constructor( .stateIn( scope = viewModelScope, started = SharingStarted.WhileSubscribed(5_000), - initialValue = Loading + initialValue = Loading, ) fun removeFromSavedResources(newsResourceId: String) { diff --git a/feature/bookmarks/src/test/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksViewModelTest.kt b/feature/bookmarks/src/test/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksViewModelTest.kt index a8da1a4ff..b721218d4 100644 --- a/feature/bookmarks/src/test/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksViewModelTest.kt +++ b/feature/bookmarks/src/test/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksViewModelTest.kt @@ -23,8 +23,6 @@ import com.google.samples.apps.nowinandroid.core.testing.repository.TestUserData import com.google.samples.apps.nowinandroid.core.testing.util.MainDispatcherRule import com.google.samples.apps.nowinandroid.core.ui.NewsFeedUiState.Loading import com.google.samples.apps.nowinandroid.core.ui.NewsFeedUiState.Success -import kotlin.test.assertEquals -import kotlin.test.assertIs import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch import kotlinx.coroutines.test.UnconfinedTestDispatcher @@ -32,6 +30,8 @@ import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Rule import org.junit.Test +import kotlin.test.assertEquals +import kotlin.test.assertIs /** * To learn more about how this test handles Flows created with stateIn, see @@ -45,7 +45,7 @@ class BookmarksViewModelTest { private val newsRepository = TestNewsRepository() private val getUserNewsResourcesUseCase = GetUserNewsResourcesUseCase( newsRepository = newsRepository, - userDataRepository = userDataRepository + userDataRepository = userDataRepository, ) private lateinit var viewModel: BookmarksViewModel @@ -53,7 +53,7 @@ class BookmarksViewModelTest { fun setup() { viewModel = BookmarksViewModel( userDataRepository = userDataRepository, - getSaveableNewsResources = getUserNewsResourcesUseCase + getSaveableNewsResources = getUserNewsResourcesUseCase, ) } diff --git a/feature/foryou/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenTest.kt b/feature/foryou/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenTest.kt index 70f60811b..9ff4ed8f4 100644 --- a/feature/foryou/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenTest.kt +++ b/feature/foryou/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenTest.kt @@ -41,7 +41,7 @@ class ForYouScreenTest { private val doneButtonMatcher by lazy { hasText( - composeTestRule.activity.resources.getString(R.string.done) + composeTestRule.activity.resources.getString(R.string.done), ) } @@ -55,14 +55,14 @@ class ForYouScreenTest { feedState = NewsFeedUiState.Loading, onTopicCheckedChanged = { _, _ -> }, saveFollowedTopics = {}, - onNewsResourcesCheckedChanged = { _, _ -> } + onNewsResourcesCheckedChanged = { _, _ -> }, ) } } composeTestRule .onNodeWithContentDescription( - composeTestRule.activity.resources.getString(R.string.for_you_loading) + composeTestRule.activity.resources.getString(R.string.for_you_loading), ) .assertExists() } @@ -77,14 +77,14 @@ class ForYouScreenTest { feedState = NewsFeedUiState.Success(emptyList()), onTopicCheckedChanged = { _, _ -> }, saveFollowedTopics = {}, - onNewsResourcesCheckedChanged = { _, _ -> } + onNewsResourcesCheckedChanged = { _, _ -> }, ) } } composeTestRule .onNodeWithContentDescription( - composeTestRule.activity.resources.getString(R.string.for_you_loading) + composeTestRule.activity.resources.getString(R.string.for_you_loading), ) .assertExists() } @@ -100,11 +100,11 @@ class ForYouScreenTest { topics = testTopics, ), feedState = NewsFeedUiState.Success( - feed = emptyList() + feed = emptyList(), ), onTopicCheckedChanged = { _, _ -> }, saveFollowedTopics = {}, - onNewsResourcesCheckedChanged = { _, _ -> } + onNewsResourcesCheckedChanged = { _, _ -> }, ) } } @@ -140,14 +140,14 @@ class ForYouScreenTest { // Follow one topic topics = testTopics.mapIndexed { index, testTopic -> testTopic.copy(isFollowed = index == 1) - } + }, ), feedState = NewsFeedUiState.Success( - feed = emptyList() + feed = emptyList(), ), onTopicCheckedChanged = { _, _ -> }, saveFollowedTopics = {}, - onNewsResourcesCheckedChanged = { _, _ -> } + onNewsResourcesCheckedChanged = { _, _ -> }, ) } } @@ -183,14 +183,14 @@ class ForYouScreenTest { feedState = NewsFeedUiState.Loading, onTopicCheckedChanged = { _, _ -> }, saveFollowedTopics = {}, - onNewsResourcesCheckedChanged = { _, _ -> } + onNewsResourcesCheckedChanged = { _, _ -> }, ) } } composeTestRule .onNodeWithContentDescription( - composeTestRule.activity.resources.getString(R.string.for_you_loading) + composeTestRule.activity.resources.getString(R.string.for_you_loading), ) .assertExists() } @@ -205,14 +205,14 @@ class ForYouScreenTest { feedState = NewsFeedUiState.Loading, onTopicCheckedChanged = { _, _ -> }, saveFollowedTopics = {}, - onNewsResourcesCheckedChanged = { _, _ -> } + onNewsResourcesCheckedChanged = { _, _ -> }, ) } } composeTestRule .onNodeWithContentDescription( - composeTestRule.activity.resources.getString(R.string.for_you_loading) + composeTestRule.activity.resources.getString(R.string.for_you_loading), ) .assertExists() } @@ -224,18 +224,18 @@ class ForYouScreenTest { isSyncing = false, onboardingUiState = OnboardingUiState.NotShown, feedState = NewsFeedUiState.Success( - feed = previewUserNewsResources + feed = previewUserNewsResources, ), onTopicCheckedChanged = { _, _ -> }, saveFollowedTopics = {}, - onNewsResourcesCheckedChanged = { _, _ -> } + onNewsResourcesCheckedChanged = { _, _ -> }, ) } composeTestRule .onNodeWithText( previewUserNewsResources[0].title, - substring = true + substring = true, ) .assertExists() .assertHasClickAction() @@ -244,14 +244,14 @@ class ForYouScreenTest { .performScrollToNode( hasText( previewUserNewsResources[1].title, - substring = true - ) + substring = true, + ), ) composeTestRule .onNodeWithText( previewUserNewsResources[1].title, - substring = true + substring = true, ) .assertExists() .assertHasClickAction() @@ -264,19 +264,19 @@ private val testTopic = Topic( shortDescription = "", longDescription = "", url = "", - imageUrl = "" + imageUrl = "", ) private val testTopics = listOf( FollowableTopic( topic = testTopic.copy(id = "0", name = "Headlines"), - isFollowed = false + isFollowed = false, ), FollowableTopic( topic = testTopic.copy(id = "1", name = "UI"), - isFollowed = false + isFollowed = false, ), FollowableTopic( topic = testTopic.copy(id = "2", name = "Tools"), - isFollowed = false + isFollowed = false, ), ) diff --git a/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreen.kt b/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreen.kt index ef714308b..aef60817f 100644 --- a/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreen.kt +++ b/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreen.kt @@ -93,7 +93,7 @@ import com.google.samples.apps.nowinandroid.core.ui.newsFeed @Composable internal fun ForYouRoute( modifier: Modifier = Modifier, - viewModel: ForYouViewModel = hiltViewModel() + viewModel: ForYouViewModel = hiltViewModel(), ) { val onboardingUiState by viewModel.onboardingUiState.collectAsStateWithLifecycle() val feedState by viewModel.feedState.collectAsStateWithLifecycle() @@ -106,7 +106,7 @@ internal fun ForYouRoute( onTopicCheckedChanged = viewModel::updateTopicSelection, saveFollowedTopics = viewModel::dismissOnboarding, onNewsResourcesCheckedChanged = viewModel::updateNewsResourceSaved, - modifier = modifier + modifier = modifier, ) } @@ -152,7 +152,7 @@ internal fun ForYouScreen( modifier = modifier .fillMaxSize() .testTag("forYou:feed"), - state = state + state = state, ) { onboarding( onboardingUiState = onboardingUiState, @@ -163,13 +163,13 @@ internal fun ForYouScreen( interestsItemModifier = Modifier.layout { measurable, constraints -> val placeable = measurable.measure( constraints.copy( - maxWidth = constraints.maxWidth + 32.dp.roundToPx() - ) + maxWidth = constraints.maxWidth + 32.dp.roundToPx(), + ), ) layout(placeable.width, placeable.height) { placeable.place(0, 0) } - } + }, ) newsFeed( @@ -198,12 +198,12 @@ internal fun ForYouScreen( ) { val loadingContentDescription = stringResource(id = R.string.for_you_loading) Box( - modifier = Modifier.fillMaxWidth() + modifier = Modifier.fillMaxWidth(), ) { NiaOverlayLoadingWheel( modifier = Modifier .align(Alignment.Center), - contentDesc = loadingContentDescription + contentDesc = loadingContentDescription, ) } } @@ -218,12 +218,13 @@ private fun LazyGridScope.onboarding( onboardingUiState: OnboardingUiState, onTopicCheckedChanged: (String, Boolean) -> Unit, saveFollowedTopics: () -> Unit, - interestsItemModifier: Modifier = Modifier + interestsItemModifier: Modifier = Modifier, ) { when (onboardingUiState) { OnboardingUiState.Loading, OnboardingUiState.LoadFailed, - OnboardingUiState.NotShown -> Unit + OnboardingUiState.NotShown, + -> Unit is OnboardingUiState.Shown -> { item(span = { GridItemSpan(maxLineSpan) }) { @@ -234,7 +235,7 @@ private fun LazyGridScope.onboarding( modifier = Modifier .fillMaxWidth() .padding(top = 24.dp), - style = MaterialTheme.typography.titleMedium + style = MaterialTheme.typography.titleMedium, ) Text( text = stringResource(R.string.onboarding_guidance_subtitle), @@ -242,27 +243,27 @@ private fun LazyGridScope.onboarding( .fillMaxWidth() .padding(top = 8.dp, start = 16.dp, end = 16.dp), textAlign = TextAlign.Center, - style = MaterialTheme.typography.bodyMedium + style = MaterialTheme.typography.bodyMedium, ) TopicSelection( onboardingUiState, onTopicCheckedChanged, - Modifier.padding(bottom = 8.dp) + Modifier.padding(bottom = 8.dp), ) // Done button Row( horizontalArrangement = Arrangement.Center, - modifier = Modifier.fillMaxWidth() + modifier = Modifier.fillMaxWidth(), ) { NiaButton( onClick = saveFollowedTopics, enabled = onboardingUiState.isDismissable, modifier = Modifier .padding(horizontal = 40.dp) - .width(364.dp) + .width(364.dp), ) { Text( - text = stringResource(R.string.done) + text = stringResource(R.string.done), ) } } @@ -276,7 +277,7 @@ private fun LazyGridScope.onboarding( private fun TopicSelection( onboardingUiState: OnboardingUiState.Shown, onTopicCheckedChanged: (String, Boolean) -> Unit, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) = trace("TopicSelection") { val lazyGridState = rememberLazyGridState() val topicSelectionTestTag = "forYou:topicSelection" @@ -301,7 +302,7 @@ private fun TopicSelection( // The maximum of these two bounds is therefore a valid upper bound in all cases. .heightIn(max = max(240.dp, with(LocalDensity.current) { 240.sp.toDp() })) .fillMaxWidth() - .testTag(topicSelectionTestTag) + .testTag(topicSelectionTestTag), ) { items(onboardingUiState.topics) { SingleTopicButton( @@ -309,7 +310,7 @@ private fun TopicSelection( topicId = it.topic.id, imageUrl = it.topic.imageUrl, isSelected = it.isFollowed, - onClick = onTopicCheckedChanged + onClick = onTopicCheckedChanged, ) } } @@ -322,7 +323,7 @@ private fun SingleTopicButton( topicId: String, imageUrl: String, isSelected: Boolean, - onClick: (String, Boolean) -> Unit + onClick: (String, Boolean) -> Unit, ) = trace("SingleTopicButton") { Surface( modifier = Modifier @@ -333,14 +334,14 @@ private fun SingleTopicButton( selected = isSelected, onClick = { onClick(topicId, !isSelected) - } + }, ) { Row( verticalAlignment = Alignment.CenterVertically, - modifier = Modifier.padding(start = 12.dp, end = 8.dp) + modifier = Modifier.padding(start = 12.dp, end = 8.dp), ) { TopicIcon( - imageUrl = imageUrl + imageUrl = imageUrl, ) Text( text = name, @@ -348,7 +349,7 @@ private fun SingleTopicButton( modifier = Modifier .padding(horizontal = 12.dp) .weight(1f), - color = MaterialTheme.colorScheme.onSurface + color = MaterialTheme.colorScheme.onSurface, ) NiaIconToggleButton( checked = isSelected, @@ -356,15 +357,15 @@ private fun SingleTopicButton( icon = { Icon( imageVector = NiaIcons.Add, - contentDescription = name + contentDescription = name, ) }, checkedIcon = { Icon( imageVector = NiaIcons.Check, - contentDescription = name + contentDescription = name, ) - } + }, ) } } @@ -373,7 +374,7 @@ private fun SingleTopicButton( @Composable fun TopicIcon( imageUrl: String, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { DynamicAsyncImage( // TODO b/228077205, show loading image visual instead of static placeholder @@ -382,7 +383,7 @@ fun TopicIcon( contentDescription = null, // decorative modifier = modifier .padding(10.dp) - .size(32.dp) + .size(32.dp), ) } @@ -395,11 +396,11 @@ fun ForYouScreenPopulatedFeed() { isSyncing = false, onboardingUiState = OnboardingUiState.NotShown, feedState = NewsFeedUiState.Success( - feed = previewUserNewsResources + feed = previewUserNewsResources, ), onTopicCheckedChanged = { _, _ -> }, saveFollowedTopics = {}, - onNewsResourcesCheckedChanged = { _, _ -> } + onNewsResourcesCheckedChanged = { _, _ -> }, ) } } @@ -414,11 +415,11 @@ fun ForYouScreenOfflinePopulatedFeed() { isSyncing = false, onboardingUiState = OnboardingUiState.NotShown, feedState = NewsFeedUiState.Success( - feed = previewUserNewsResources + feed = previewUserNewsResources, ), onTopicCheckedChanged = { _, _ -> }, saveFollowedTopics = {}, - onNewsResourcesCheckedChanged = { _, _ -> } + onNewsResourcesCheckedChanged = { _, _ -> }, ) } } @@ -435,11 +436,11 @@ fun ForYouScreenTopicSelection() { topics = previewTopics.map { FollowableTopic(it, false) }, ), feedState = NewsFeedUiState.Success( - feed = previewUserNewsResources + feed = previewUserNewsResources, ), onTopicCheckedChanged = { _, _ -> }, saveFollowedTopics = {}, - onNewsResourcesCheckedChanged = { _, _ -> } + onNewsResourcesCheckedChanged = { _, _ -> }, ) } } @@ -456,7 +457,7 @@ fun ForYouScreenLoading() { feedState = NewsFeedUiState.Loading, onTopicCheckedChanged = { _, _ -> }, saveFollowedTopics = {}, - onNewsResourcesCheckedChanged = { _, _ -> } + onNewsResourcesCheckedChanged = { _, _ -> }, ) } } @@ -471,11 +472,11 @@ fun ForYouScreenPopulatedAndLoading() { isSyncing = true, onboardingUiState = OnboardingUiState.Loading, feedState = NewsFeedUiState.Success( - feed = previewUserNewsResources + feed = previewUserNewsResources, ), onTopicCheckedChanged = { _, _ -> }, saveFollowedTopics = {}, - onNewsResourcesCheckedChanged = { _, _ -> } + onNewsResourcesCheckedChanged = { _, _ -> }, ) } } diff --git a/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel.kt b/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel.kt index 6c9218a75..4895f8306 100644 --- a/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel.kt +++ b/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel.kt @@ -25,7 +25,6 @@ import com.google.samples.apps.nowinandroid.core.domain.GetUserNewsResourcesUseC import com.google.samples.apps.nowinandroid.core.domain.model.UserNewsResource import com.google.samples.apps.nowinandroid.core.ui.NewsFeedUiState import dagger.hilt.android.lifecycle.HiltViewModel -import javax.inject.Inject import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow @@ -36,13 +35,14 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch +import javax.inject.Inject @HiltViewModel class ForYouViewModel @Inject constructor( syncStatusMonitor: SyncStatusMonitor, private val userDataRepository: UserDataRepository, private val getSaveableNewsResources: GetUserNewsResourcesUseCase, - getFollowableTopics: GetFollowableTopicsUseCase + getFollowableTopics: GetFollowableTopicsUseCase, ) : ViewModel() { private val shouldShowOnboarding: Flow = @@ -52,7 +52,7 @@ class ForYouViewModel @Inject constructor( .stateIn( scope = viewModelScope, started = SharingStarted.WhileSubscribed(5_000), - initialValue = false + initialValue = false, ) val feedState: StateFlow = @@ -67,7 +67,7 @@ class ForYouViewModel @Inject constructor( flowOf(NewsFeedUiState.Success(emptyList())) } else { getSaveableNewsResources( - filterTopicIds = userData.followedTopics + filterTopicIds = userData.followedTopics, ).mapToFeedState() } } @@ -78,13 +78,13 @@ class ForYouViewModel @Inject constructor( .stateIn( scope = viewModelScope, started = SharingStarted.WhileSubscribed(5_000), - initialValue = NewsFeedUiState.Loading + initialValue = NewsFeedUiState.Loading, ) val onboardingUiState: StateFlow = combine( shouldShowOnboarding, - getFollowableTopics() + getFollowableTopics(), ) { shouldShowOnboarding, topics -> if (shouldShowOnboarding) { OnboardingUiState.Shown(topics = topics) @@ -95,7 +95,7 @@ class ForYouViewModel @Inject constructor( .stateIn( scope = viewModelScope, started = SharingStarted.WhileSubscribed(5_000), - initialValue = OnboardingUiState.Loading + initialValue = OnboardingUiState.Loading, ) fun updateTopicSelection(topicId: String, isChecked: Boolean) { diff --git a/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/OnboardingUiState.kt b/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/OnboardingUiState.kt index 73ecfed14..faf368b1e 100644 --- a/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/OnboardingUiState.kt +++ b/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/OnboardingUiState.kt @@ -41,7 +41,7 @@ sealed interface OnboardingUiState { * There is a onboarding state, with the given lists of topics. */ data class Shown( - val topics: List + val topics: List, ) : OnboardingUiState { /** * True if the onboarding can be dismissed. diff --git a/feature/foryou/src/test/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModelTest.kt b/feature/foryou/src/test/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModelTest.kt index 4427b44fe..1f6e010d5 100644 --- a/feature/foryou/src/test/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModelTest.kt +++ b/feature/foryou/src/test/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModelTest.kt @@ -32,7 +32,6 @@ import com.google.samples.apps.nowinandroid.core.testing.util.MainDispatcherRule import com.google.samples.apps.nowinandroid.core.testing.util.TestNetworkMonitor import com.google.samples.apps.nowinandroid.core.testing.util.TestSyncStatusMonitor import com.google.samples.apps.nowinandroid.core.ui.NewsFeedUiState -import kotlin.test.assertEquals import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch import kotlinx.coroutines.test.UnconfinedTestDispatcher @@ -42,6 +41,7 @@ import kotlinx.datetime.Instant import org.junit.Before import org.junit.Rule import org.junit.Test +import kotlin.test.assertEquals /** * To learn more about how this test handles Flows created with stateIn, see @@ -58,11 +58,11 @@ class ForYouViewModelTest { private val newsRepository = TestNewsRepository() private val getUserNewsResourcesUseCase = GetUserNewsResourcesUseCase( newsRepository = newsRepository, - userDataRepository = userDataRepository + userDataRepository = userDataRepository, ) private val getFollowableTopicsUseCase = GetFollowableTopicsUseCase( topicsRepository = topicsRepository, - userDataRepository = userDataRepository + userDataRepository = userDataRepository, ) private lateinit var viewModel: ForYouViewModel @@ -72,7 +72,7 @@ class ForYouViewModelTest { syncStatusMonitor = syncStatusMonitor, userDataRepository = userDataRepository, getSaveableNewsResources = getUserNewsResourcesUseCase, - getFollowableTopics = getFollowableTopicsUseCase + getFollowableTopics = getFollowableTopicsUseCase, ) } @@ -80,7 +80,7 @@ class ForYouViewModelTest { fun stateIsInitiallyLoading() = runTest { assertEquals( OnboardingUiState.Loading, - viewModel.onboardingUiState.value + viewModel.onboardingUiState.value, ) assertEquals(NewsFeedUiState.Loading, viewModel.feedState.value) } @@ -95,7 +95,7 @@ class ForYouViewModelTest { assertEquals( OnboardingUiState.Loading, - viewModel.onboardingUiState.value + viewModel.onboardingUiState.value, ) assertEquals(NewsFeedUiState.Loading, viewModel.feedState.value) @@ -112,7 +112,7 @@ class ForYouViewModelTest { assertEquals( true, - viewModel.isSyncing.value + viewModel.isSyncing.value, ) collectJob.cancel() @@ -128,7 +128,7 @@ class ForYouViewModelTest { assertEquals( OnboardingUiState.Loading, - viewModel.onboardingUiState.value + viewModel.onboardingUiState.value, ) assertEquals(NewsFeedUiState.Success(emptyList()), viewModel.feedState.value) @@ -157,7 +157,7 @@ class ForYouViewModelTest { url = "URL", imageUrl = "image URL", ), - isFollowed = false + isFollowed = false, ), FollowableTopic( topic = Topic( @@ -168,7 +168,7 @@ class ForYouViewModelTest { url = "URL", imageUrl = "image URL", ), - isFollowed = false + isFollowed = false, ), FollowableTopic( topic = Topic( @@ -179,17 +179,17 @@ class ForYouViewModelTest { url = "URL", imageUrl = "image URL", ), - isFollowed = false + isFollowed = false, ), ), ), - viewModel.onboardingUiState.value + viewModel.onboardingUiState.value, ) assertEquals( NewsFeedUiState.Success( - feed = emptyList() + feed = emptyList(), ), - viewModel.feedState.value + viewModel.feedState.value, ) collectJob1.cancel() @@ -218,7 +218,7 @@ class ForYouViewModelTest { url = "URL", imageUrl = "image URL", ), - isFollowed = false + isFollowed = false, ), FollowableTopic( topic = Topic( @@ -229,7 +229,7 @@ class ForYouViewModelTest { url = "URL", imageUrl = "image URL", ), - isFollowed = false + isFollowed = false, ), FollowableTopic( topic = Topic( @@ -240,18 +240,18 @@ class ForYouViewModelTest { url = "URL", imageUrl = "image URL", ), - isFollowed = false + isFollowed = false, ), ), ), - viewModel.onboardingUiState.value + viewModel.onboardingUiState.value, ) assertEquals( NewsFeedUiState.Success( - feed = emptyList() + feed = emptyList(), ), - viewModel.feedState.value + viewModel.feedState.value, ) collectJob1.cancel() @@ -273,7 +273,7 @@ class ForYouViewModelTest { assertEquals( OnboardingUiState.NotShown, - viewModel.onboardingUiState.value + viewModel.onboardingUiState.value, ) assertEquals(NewsFeedUiState.Loading, viewModel.feedState.value) @@ -281,13 +281,13 @@ class ForYouViewModelTest { assertEquals( OnboardingUiState.NotShown, - viewModel.onboardingUiState.value + viewModel.onboardingUiState.value, ) assertEquals( NewsFeedUiState.Success( - feed = sampleNewsResources.mapToUserNewsResources(userData) + feed = sampleNewsResources.mapToUserNewsResources(userData), ), - viewModel.feedState.value + viewModel.feedState.value, ) collectJob1.cancel() @@ -308,15 +308,15 @@ class ForYouViewModelTest { OnboardingUiState.Shown( topics = sampleTopics.map { FollowableTopic(it, false) - } + }, ), - viewModel.onboardingUiState.value + viewModel.onboardingUiState.value, ) assertEquals( NewsFeedUiState.Success( feed = emptyList(), ), - viewModel.feedState.value + viewModel.feedState.value, ) val followedTopicId = sampleTopics[1].id @@ -326,9 +326,9 @@ class ForYouViewModelTest { OnboardingUiState.Shown( topics = sampleTopics.map { FollowableTopic(it, it.id == followedTopicId) - } + }, ), - viewModel.onboardingUiState.value + viewModel.onboardingUiState.value, ) val userData = emptyUserData.copy(followedTopics = setOf(followedTopicId)) @@ -338,9 +338,9 @@ class ForYouViewModelTest { feed = listOf( UserNewsResource(sampleNewsResources[1], userData), UserNewsResource(sampleNewsResources[2], userData), - ) + ), ), - viewModel.feedState.value + viewModel.feedState.value, ) collectJob1.cancel() @@ -372,7 +372,7 @@ class ForYouViewModelTest { url = "URL", imageUrl = "image URL", ), - isFollowed = false + isFollowed = false, ), FollowableTopic( topic = Topic( @@ -383,7 +383,7 @@ class ForYouViewModelTest { url = "URL", imageUrl = "image URL", ), - isFollowed = false + isFollowed = false, ), FollowableTopic( topic = Topic( @@ -394,17 +394,17 @@ class ForYouViewModelTest { url = "URL", imageUrl = "image URL", ), - isFollowed = false - ) + isFollowed = false, + ), ), ), - viewModel.onboardingUiState.value + viewModel.onboardingUiState.value, ) assertEquals( NewsFeedUiState.Success( - feed = emptyList() + feed = emptyList(), ), - viewModel.feedState.value + viewModel.feedState.value, ) collectJob1.cancel() @@ -420,7 +420,7 @@ class ForYouViewModelTest { val followedTopicIds = setOf("1") val userData = emptyUserData.copy( followedTopics = followedTopicIds, - shouldHideOnboarding = true + shouldHideOnboarding = true, ) topicsRepository.sendTopics(sampleTopics) @@ -430,25 +430,25 @@ class ForYouViewModelTest { val bookmarkedNewsResourceId = "2" viewModel.updateNewsResourceSaved( newsResourceId = bookmarkedNewsResourceId, - isChecked = true + isChecked = true, ) val userDataExpected = userData.copy( - bookmarkedNewsResources = setOf(bookmarkedNewsResourceId) + bookmarkedNewsResources = setOf(bookmarkedNewsResourceId), ) assertEquals( OnboardingUiState.NotShown, - viewModel.onboardingUiState.value + viewModel.onboardingUiState.value, ) assertEquals( NewsFeedUiState.Success( feed = listOf( UserNewsResource(newsResource = sampleNewsResources[1], userDataExpected), - UserNewsResource(newsResource = sampleNewsResources[2], userDataExpected) - ) + UserNewsResource(newsResource = sampleNewsResources[2], userDataExpected), + ), ), - viewModel.feedState.value + viewModel.feedState.value, ) collectJob1.cancel() @@ -480,7 +480,7 @@ private val sampleTopics = listOf( longDescription = "long description", url = "URL", imageUrl = "image URL", - ) + ), ) private val sampleNewsResources = listOf( @@ -503,7 +503,7 @@ private val sampleNewsResources = listOf( longDescription = "long description", url = "URL", imageUrl = "image URL", - ) + ), ), ), NewsResource( diff --git a/feature/interests/src/androidTest/java/com/google/samples/apps/nowinandroid/interests/InterestsScreenTest.kt b/feature/interests/src/androidTest/java/com/google/samples/apps/nowinandroid/interests/InterestsScreenTest.kt index e44086c4c..2c5ed4844 100644 --- a/feature/interests/src/androidTest/java/com/google/samples/apps/nowinandroid/interests/InterestsScreenTest.kt +++ b/feature/interests/src/androidTest/java/com/google/samples/apps/nowinandroid/interests/InterestsScreenTest.kt @@ -76,7 +76,7 @@ class InterestsScreenTest { fun interestsWithTopics_whenTopicsFollowed_showFollowedAndUnfollowedTopicsWithInfo() { composeTestRule.setContent { InterestsScreen( - uiState = InterestsUiState.Interests(topics = testTopics) + uiState = InterestsUiState.Interests(topics = testTopics), ) } @@ -115,7 +115,7 @@ class InterestsScreenTest { InterestsScreen( uiState = uiState, followTopic = { _, _ -> }, - navigateToTopic = {} + navigateToTopic = {}, ) } } @@ -138,7 +138,7 @@ private val testTopics = listOf( url = TOPIC_URL, imageUrl = TOPIC_IMAGE_URL, ), - isFollowed = true + isFollowed = true, ), FollowableTopic( Topic( @@ -149,7 +149,7 @@ private val testTopics = listOf( url = TOPIC_URL, imageUrl = TOPIC_IMAGE_URL, ), - isFollowed = false + isFollowed = false, ), FollowableTopic( Topic( @@ -160,8 +160,8 @@ private val testTopics = listOf( url = TOPIC_URL, imageUrl = TOPIC_IMAGE_URL, ), - isFollowed = false - ) + isFollowed = false, + ), ) private val numberOfUnfollowedTopics = testTopics.filter { !it.isFollowed }.size diff --git a/feature/interests/src/main/java/com/google/samples/apps/nowinandroid/feature/interests/InterestsItem.kt b/feature/interests/src/main/java/com/google/samples/apps/nowinandroid/feature/interests/InterestsItem.kt index 19ace59f6..f8a7a8d90 100644 --- a/feature/interests/src/main/java/com/google/samples/apps/nowinandroid/feature/interests/InterestsItem.kt +++ b/feature/interests/src/main/java/com/google/samples/apps/nowinandroid/feature/interests/InterestsItem.kt @@ -51,18 +51,18 @@ fun InterestsItem( modifier: Modifier = Modifier, iconModifier: Modifier = Modifier, description: String = "", - itemSeparation: Dp = 16.dp + itemSeparation: Dp = 16.dp, ) { Row( verticalAlignment = Alignment.CenterVertically, - modifier = modifier + modifier = modifier, ) { Row( verticalAlignment = Alignment.CenterVertically, modifier = Modifier .weight(1f) .clickable { onClick() } - .padding(vertical = itemSeparation) + .padding(vertical = itemSeparation), ) { InterestsIcon(topicImageUrl, iconModifier.size(64.dp)) Spacer(modifier = Modifier.width(16.dp)) @@ -75,18 +75,18 @@ fun InterestsItem( Icon( imageVector = NiaIcons.Add, contentDescription = stringResource( - id = string.card_follow_button_content_desc - ) + id = string.card_follow_button_content_desc, + ), ) }, checkedIcon = { Icon( imageVector = NiaIcons.Check, contentDescription = stringResource( - id = string.card_unfollow_button_content_desc - ) + id = string.card_unfollow_button_content_desc, + ), ) - } + }, ) } } @@ -98,13 +98,13 @@ private fun InterestContent(name: String, description: String, modifier: Modifie text = name, style = MaterialTheme.typography.headlineSmall, modifier = Modifier.padding( - vertical = if (description.isEmpty()) 0.dp else 4.dp - ) + vertical = if (description.isEmpty()) 0.dp else 4.dp, + ), ) if (description.isNotEmpty()) { Text( text = description, - style = MaterialTheme.typography.bodyMedium + style = MaterialTheme.typography.bodyMedium, ) } } @@ -124,7 +124,7 @@ private fun InterestsIcon(topicImageUrl: String, modifier: Modifier = Modifier) DynamicAsyncImage( imageUrl = topicImageUrl, contentDescription = null, - modifier = modifier + modifier = modifier, ) } } @@ -140,7 +140,7 @@ private fun InterestsCardPreview() { following = false, topicImageUrl = "", onClick = { }, - onFollowButtonClick = { } + onFollowButtonClick = { }, ) } } @@ -157,7 +157,7 @@ private fun InterestsCardLongNamePreview() { following = true, topicImageUrl = "", onClick = { }, - onFollowButtonClick = { } + onFollowButtonClick = { }, ) } } @@ -175,7 +175,7 @@ private fun InterestsCardLongDescriptionPreview() { following = false, topicImageUrl = "", onClick = { }, - onFollowButtonClick = { } + onFollowButtonClick = { }, ) } } @@ -192,7 +192,7 @@ private fun InterestsCardWithEmptyDescriptionPreview() { following = true, topicImageUrl = "", onClick = { }, - onFollowButtonClick = { } + onFollowButtonClick = { }, ) } } diff --git a/feature/interests/src/main/java/com/google/samples/apps/nowinandroid/feature/interests/InterestsScreen.kt b/feature/interests/src/main/java/com/google/samples/apps/nowinandroid/feature/interests/InterestsScreen.kt index 8cce790c4..4376d55d6 100644 --- a/feature/interests/src/main/java/com/google/samples/apps/nowinandroid/feature/interests/InterestsScreen.kt +++ b/feature/interests/src/main/java/com/google/samples/apps/nowinandroid/feature/interests/InterestsScreen.kt @@ -38,7 +38,7 @@ import com.google.samples.apps.nowinandroid.core.ui.DevicePreviews internal fun InterestsRoute( navigateToTopic: (String) -> Unit, modifier: Modifier = Modifier, - viewModel: InterestsViewModel = hiltViewModel() + viewModel: InterestsViewModel = hiltViewModel(), ) { val uiState by viewModel.uiState.collectAsStateWithLifecycle() @@ -46,7 +46,7 @@ internal fun InterestsRoute( uiState = uiState, followTopic = viewModel::followTopic, navigateToTopic = navigateToTopic, - modifier = modifier + modifier = modifier, ) } @@ -59,7 +59,7 @@ internal fun InterestsScreen( ) { Column( modifier = modifier, - horizontalAlignment = Alignment.CenterHorizontally + horizontalAlignment = Alignment.CenterHorizontally, ) { when (uiState) { InterestsUiState.Loading -> @@ -91,7 +91,7 @@ fun InterestsScreenPopulated() { NiaBackground { InterestsScreen( uiState = InterestsUiState.Interests( - topics = previewTopics.map { FollowableTopic(it, false) } + topics = previewTopics.map { FollowableTopic(it, false) }, ), followTopic = { _, _ -> }, navigateToTopic = {}, diff --git a/feature/interests/src/main/java/com/google/samples/apps/nowinandroid/feature/interests/InterestsViewModel.kt b/feature/interests/src/main/java/com/google/samples/apps/nowinandroid/feature/interests/InterestsViewModel.kt index 8466a33f0..d6ef94521 100644 --- a/feature/interests/src/main/java/com/google/samples/apps/nowinandroid/feature/interests/InterestsViewModel.kt +++ b/feature/interests/src/main/java/com/google/samples/apps/nowinandroid/feature/interests/InterestsViewModel.kt @@ -23,12 +23,12 @@ import com.google.samples.apps.nowinandroid.core.domain.GetFollowableTopicsUseCa import com.google.samples.apps.nowinandroid.core.domain.TopicSortField import com.google.samples.apps.nowinandroid.core.domain.model.FollowableTopic import dagger.hilt.android.lifecycle.HiltViewModel -import javax.inject.Inject import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch +import javax.inject.Inject @HiltViewModel class InterestsViewModel @Inject constructor( @@ -38,11 +38,11 @@ class InterestsViewModel @Inject constructor( val uiState: StateFlow = getFollowableTopics(sortBy = TopicSortField.NAME).map( - InterestsUiState::Interests + InterestsUiState::Interests, ).stateIn( scope = viewModelScope, started = SharingStarted.WhileSubscribed(5_000), - initialValue = InterestsUiState.Loading + initialValue = InterestsUiState.Loading, ) fun followTopic(followedTopicId: String, followed: Boolean) { @@ -56,7 +56,7 @@ sealed interface InterestsUiState { object Loading : InterestsUiState data class Interests( - val topics: List + val topics: List, ) : InterestsUiState object Empty : InterestsUiState diff --git a/feature/interests/src/main/java/com/google/samples/apps/nowinandroid/feature/interests/TabContent.kt b/feature/interests/src/main/java/com/google/samples/apps/nowinandroid/feature/interests/TabContent.kt index 0cff8c82c..dcca35795 100644 --- a/feature/interests/src/main/java/com/google/samples/apps/nowinandroid/feature/interests/TabContent.kt +++ b/feature/interests/src/main/java/com/google/samples/apps/nowinandroid/feature/interests/TabContent.kt @@ -34,13 +34,13 @@ fun TopicsTabContent( topics: List, onTopicClick: (String) -> Unit, onFollowButtonClick: (String, Boolean) -> Unit, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { LazyColumn( modifier = modifier .padding(horizontal = 16.dp) .testTag("interests:topics"), - contentPadding = PaddingValues(top = 8.dp) + contentPadding = PaddingValues(top = 8.dp), ) { topics.forEach { followableTopic -> val topicId = followableTopic.topic.id @@ -51,7 +51,7 @@ fun TopicsTabContent( description = followableTopic.topic.shortDescription, topicImageUrl = followableTopic.topic.imageUrl, onClick = { onTopicClick(topicId) }, - onFollowButtonClick = { onFollowButtonClick(topicId, it) } + onFollowButtonClick = { onFollowButtonClick(topicId, it) }, ) } } diff --git a/feature/interests/src/main/java/com/google/samples/apps/nowinandroid/feature/interests/navigation/InterestsNavigation.kt b/feature/interests/src/main/java/com/google/samples/apps/nowinandroid/feature/interests/navigation/InterestsNavigation.kt index 47facde82..9a5ce7696 100644 --- a/feature/interests/src/main/java/com/google/samples/apps/nowinandroid/feature/interests/navigation/InterestsNavigation.kt +++ b/feature/interests/src/main/java/com/google/samples/apps/nowinandroid/feature/interests/navigation/InterestsNavigation.kt @@ -32,11 +32,11 @@ fun NavController.navigateToInterestsGraph(navOptions: NavOptions? = null) { fun NavGraphBuilder.interestsGraph( navigateToTopic: (String) -> Unit, - nestedGraphs: NavGraphBuilder.() -> Unit + nestedGraphs: NavGraphBuilder.() -> Unit, ) { navigation( route = interestsGraphRoutePattern, - startDestination = interestsRoute + startDestination = interestsRoute, ) { composable(route = interestsRoute) { InterestsRoute( diff --git a/feature/interests/src/test/java/com/google/samples/apps/nowinandroid/interests/InterestsViewModelTest.kt b/feature/interests/src/test/java/com/google/samples/apps/nowinandroid/interests/InterestsViewModelTest.kt index c84a8ad45..e47b25021 100644 --- a/feature/interests/src/test/java/com/google/samples/apps/nowinandroid/interests/InterestsViewModelTest.kt +++ b/feature/interests/src/test/java/com/google/samples/apps/nowinandroid/interests/InterestsViewModelTest.kt @@ -24,7 +24,6 @@ import com.google.samples.apps.nowinandroid.core.testing.repository.TestUserData import com.google.samples.apps.nowinandroid.core.testing.util.MainDispatcherRule import com.google.samples.apps.nowinandroid.feature.interests.InterestsUiState import com.google.samples.apps.nowinandroid.feature.interests.InterestsViewModel -import kotlin.test.assertEquals import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch import kotlinx.coroutines.test.UnconfinedTestDispatcher @@ -32,6 +31,7 @@ import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Rule import org.junit.Test +import kotlin.test.assertEquals /** * To learn more about how this test handles Flows created with stateIn, see @@ -46,7 +46,7 @@ class InterestsViewModelTest { private val topicsRepository = TestTopicsRepository() private val getFollowableTopicsUseCase = GetFollowableTopicsUseCase( topicsRepository = topicsRepository, - userDataRepository = userDataRepository + userDataRepository = userDataRepository, ) private lateinit var viewModel: InterestsViewModel @@ -84,17 +84,17 @@ class InterestsViewModelTest { assertEquals( false, (viewModel.uiState.value as InterestsUiState.Interests) - .topics.first { it.topic.id == toggleTopicId }.isFollowed + .topics.first { it.topic.id == toggleTopicId }.isFollowed, ) viewModel.followTopic( followedTopicId = toggleTopicId, - true + true, ) assertEquals( InterestsUiState.Interests(topics = testOutputTopics), - viewModel.uiState.value + viewModel.uiState.value, ) collectJob.cancel() @@ -108,23 +108,23 @@ class InterestsViewModelTest { topicsRepository.sendTopics(testOutputTopics.map { it.topic }) userDataRepository.setFollowedTopicIds( - setOf(testOutputTopics[0].topic.id, testOutputTopics[1].topic.id) + setOf(testOutputTopics[0].topic.id, testOutputTopics[1].topic.id), ) assertEquals( true, (viewModel.uiState.value as InterestsUiState.Interests) - .topics.first { it.topic.id == toggleTopicId }.isFollowed + .topics.first { it.topic.id == toggleTopicId }.isFollowed, ) viewModel.followTopic( followedTopicId = toggleTopicId, - false + false, ) assertEquals( InterestsUiState.Interests(topics = testInputTopics), - viewModel.uiState.value + viewModel.uiState.value, ) collectJob.cancel() @@ -149,7 +149,7 @@ private val testInputTopics = listOf( url = TOPIC_URL, imageUrl = TOPIC_IMAGE_URL, ), - isFollowed = true + isFollowed = true, ), FollowableTopic( Topic( @@ -160,7 +160,7 @@ private val testInputTopics = listOf( url = TOPIC_URL, imageUrl = TOPIC_IMAGE_URL, ), - isFollowed = false + isFollowed = false, ), FollowableTopic( Topic( @@ -171,8 +171,8 @@ private val testInputTopics = listOf( url = TOPIC_URL, imageUrl = TOPIC_IMAGE_URL, ), - isFollowed = false - ) + isFollowed = false, + ), ) private val testOutputTopics = listOf( @@ -185,7 +185,7 @@ private val testOutputTopics = listOf( url = TOPIC_URL, imageUrl = TOPIC_IMAGE_URL, ), - isFollowed = true + isFollowed = true, ), FollowableTopic( Topic( @@ -196,7 +196,7 @@ private val testOutputTopics = listOf( url = TOPIC_URL, imageUrl = TOPIC_IMAGE_URL, ), - isFollowed = true + isFollowed = true, ), FollowableTopic( Topic( @@ -207,6 +207,6 @@ private val testOutputTopics = listOf( url = TOPIC_URL, imageUrl = TOPIC_IMAGE_URL, ), - isFollowed = false - ) + isFollowed = false, + ), ) diff --git a/feature/settings/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsDialogTest.kt b/feature/settings/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsDialogTest.kt index 4643362ff..febc606b0 100644 --- a/feature/settings/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsDialogTest.kt +++ b/feature/settings/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsDialogTest.kt @@ -37,14 +37,13 @@ class SettingsDialogTest { @Test fun whenLoading_showsLoadingText() { - composeTestRule.setContent { SettingsDialog( settingsUiState = Loading, onDismiss = {}, onChangeDynamicColorPreference = {}, onChangeThemeBrand = {}, - onChangeDarkThemeConfig = {} + onChangeDarkThemeConfig = {}, ) } @@ -61,13 +60,13 @@ class SettingsDialogTest { UserEditableSettings( brand = ANDROID, useDynamicColor = false, - darkThemeConfig = DARK - ) + darkThemeConfig = DARK, + ), ), onDismiss = { }, onChangeDynamicColorPreference = {}, onChangeThemeBrand = {}, - onChangeDarkThemeConfig = {} + onChangeDarkThemeConfig = {}, ) } @@ -75,7 +74,7 @@ class SettingsDialogTest { composeTestRule.onNodeWithText(getString(R.string.brand_default)).assertExists() composeTestRule.onNodeWithText(getString(R.string.brand_android)).assertExists() composeTestRule.onNodeWithText( - getString(R.string.dark_mode_config_system_default) + getString(R.string.dark_mode_config_system_default), ).assertExists() composeTestRule.onNodeWithText(getString(R.string.dark_mode_config_light)).assertExists() composeTestRule.onNodeWithText(getString(R.string.dark_mode_config_dark)).assertExists() @@ -94,13 +93,13 @@ class SettingsDialogTest { brand = DEFAULT, darkThemeConfig = DARK, useDynamicColor = false, - ) + ), ), supportDynamicColor = true, onDismiss = {}, onChangeDynamicColorPreference = {}, onChangeThemeBrand = {}, - onChangeDarkThemeConfig = {} + onChangeDarkThemeConfig = {}, ) } @@ -121,12 +120,12 @@ class SettingsDialogTest { brand = ANDROID, darkThemeConfig = DARK, useDynamicColor = false, - ) + ), ), onDismiss = {}, onChangeDynamicColorPreference = {}, onChangeThemeBrand = {}, - onChangeDarkThemeConfig = {} + onChangeDarkThemeConfig = {}, ) } @@ -145,12 +144,12 @@ class SettingsDialogTest { brand = ANDROID, darkThemeConfig = DARK, useDynamicColor = false, - ) + ), ), onDismiss = {}, onChangeDynamicColorPreference = {}, onChangeThemeBrand = {}, - onChangeDarkThemeConfig = {} + onChangeDarkThemeConfig = {}, ) } @@ -169,12 +168,12 @@ class SettingsDialogTest { brand = ANDROID, darkThemeConfig = DARK, useDynamicColor = false, - ) + ), ), onDismiss = {}, onChangeDynamicColorPreference = {}, onChangeThemeBrand = {}, - onChangeDarkThemeConfig = {} + onChangeDarkThemeConfig = {}, ) } diff --git a/feature/settings/src/main/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsDialog.kt b/feature/settings/src/main/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsDialog.kt index a824c1db3..bed230d0d 100644 --- a/feature/settings/src/main/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsDialog.kt +++ b/feature/settings/src/main/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsDialog.kt @@ -69,7 +69,7 @@ import com.google.samples.apps.nowinandroid.feature.settings.SettingsUiState.Suc @Composable fun SettingsDialog( onDismiss: () -> Unit, - viewModel: SettingsViewModel = hiltViewModel() + viewModel: SettingsViewModel = hiltViewModel(), ) { val settingsUiState by viewModel.settingsUiState.collectAsStateWithLifecycle() SettingsDialog( @@ -89,7 +89,7 @@ fun SettingsDialog( onDismiss: () -> Unit, onChangeThemeBrand: (themeBrand: ThemeBrand) -> Unit, onChangeDynamicColorPreference: (useDynamicColor: Boolean) -> Unit, - onChangeDarkThemeConfig: (darkThemeConfig: DarkThemeConfig) -> Unit + onChangeDarkThemeConfig: (darkThemeConfig: DarkThemeConfig) -> Unit, ) { val configuration = LocalConfiguration.current @@ -107,7 +107,7 @@ fun SettingsDialog( title = { Text( text = stringResource(string.settings_title), - style = MaterialTheme.typography.titleLarge + style = MaterialTheme.typography.titleLarge, ) }, text = { @@ -117,7 +117,7 @@ fun SettingsDialog( Loading -> { Text( text = stringResource(string.loading), - modifier = Modifier.padding(vertical = 16.dp) + modifier = Modifier.padding(vertical = 16.dp), ) } @@ -127,7 +127,7 @@ fun SettingsDialog( supportDynamicColor = supportDynamicColor, onChangeThemeBrand = onChangeThemeBrand, onChangeDynamicColorPreference = onChangeDynamicColorPreference, - onChangeDarkThemeConfig = onChangeDarkThemeConfig + onChangeDarkThemeConfig = onChangeDarkThemeConfig, ) } } @@ -142,9 +142,9 @@ fun SettingsDialog( color = MaterialTheme.colorScheme.primary, modifier = Modifier .padding(horizontal = 8.dp) - .clickable { onDismiss() } + .clickable { onDismiss() }, ) - } + }, ) } @@ -154,19 +154,19 @@ private fun SettingsPanel( supportDynamicColor: Boolean, onChangeThemeBrand: (themeBrand: ThemeBrand) -> Unit, onChangeDynamicColorPreference: (useDynamicColor: Boolean) -> Unit, - onChangeDarkThemeConfig: (darkThemeConfig: DarkThemeConfig) -> Unit + onChangeDarkThemeConfig: (darkThemeConfig: DarkThemeConfig) -> Unit, ) { SettingsDialogSectionTitle(text = stringResource(string.theme)) Column(Modifier.selectableGroup()) { SettingsDialogThemeChooserRow( text = stringResource(string.brand_default), selected = settings.brand == DEFAULT, - onClick = { onChangeThemeBrand(DEFAULT) } + onClick = { onChangeThemeBrand(DEFAULT) }, ) SettingsDialogThemeChooserRow( text = stringResource(string.brand_android), selected = settings.brand == ANDROID, - onClick = { onChangeThemeBrand(ANDROID) } + onClick = { onChangeThemeBrand(ANDROID) }, ) } if (settings.brand == DEFAULT && supportDynamicColor) { @@ -175,12 +175,12 @@ private fun SettingsPanel( SettingsDialogThemeChooserRow( text = stringResource(string.dynamic_color_yes), selected = settings.useDynamicColor, - onClick = { onChangeDynamicColorPreference(true) } + onClick = { onChangeDynamicColorPreference(true) }, ) SettingsDialogThemeChooserRow( text = stringResource(string.dynamic_color_no), selected = !settings.useDynamicColor, - onClick = { onChangeDynamicColorPreference(false) } + onClick = { onChangeDynamicColorPreference(false) }, ) } } @@ -189,17 +189,17 @@ private fun SettingsPanel( SettingsDialogThemeChooserRow( text = stringResource(string.dark_mode_config_system_default), selected = settings.darkThemeConfig == FOLLOW_SYSTEM, - onClick = { onChangeDarkThemeConfig(FOLLOW_SYSTEM) } + onClick = { onChangeDarkThemeConfig(FOLLOW_SYSTEM) }, ) SettingsDialogThemeChooserRow( text = stringResource(string.dark_mode_config_light), selected = settings.darkThemeConfig == LIGHT, - onClick = { onChangeDarkThemeConfig(LIGHT) } + onClick = { onChangeDarkThemeConfig(LIGHT) }, ) SettingsDialogThemeChooserRow( text = stringResource(string.dark_mode_config_dark), selected = settings.darkThemeConfig == DARK, - onClick = { onChangeDarkThemeConfig(DARK) } + onClick = { onChangeDarkThemeConfig(DARK) }, ) } } @@ -209,7 +209,7 @@ private fun SettingsDialogSectionTitle(text: String) { Text( text = text, style = MaterialTheme.typography.titleMedium, - modifier = Modifier.padding(top = 16.dp, bottom = 8.dp) + modifier = Modifier.padding(top = 16.dp, bottom = 8.dp), ) } @@ -217,7 +217,7 @@ private fun SettingsDialogSectionTitle(text: String) { fun SettingsDialogThemeChooserRow( text: String, selected: Boolean, - onClick: () -> Unit + onClick: () -> Unit, ) { Row( Modifier @@ -228,11 +228,11 @@ fun SettingsDialogThemeChooserRow( onClick = onClick, ) .padding(8.dp), - verticalAlignment = Alignment.CenterVertically + verticalAlignment = Alignment.CenterVertically, ) { RadioButton( selected = selected, - onClick = null + onClick = null, ) Spacer(Modifier.width(8.dp)) Text(text) @@ -242,7 +242,7 @@ fun SettingsDialogThemeChooserRow( @Composable private fun LinksPanel() { Row( - modifier = Modifier.padding(top = 16.dp) + modifier = Modifier.padding(top = 16.dp), ) { Column( Modifier.fillMaxWidth(), @@ -251,24 +251,24 @@ private fun LinksPanel() { Row { TextLink( text = stringResource(string.privacy_policy), - url = PRIVACY_POLICY_URL + url = PRIVACY_POLICY_URL, ) Spacer(Modifier.width(16.dp)) TextLink( text = stringResource(string.licenses), - url = LICENSES_URL + url = LICENSES_URL, ) } Spacer(Modifier.height(16.dp)) Row { TextLink( text = stringResource(string.brand_guidelines), - url = BRAND_GUIDELINES_URL + url = BRAND_GUIDELINES_URL, ) Spacer(Modifier.width(16.dp)) TextLink( text = stringResource(string.feedback), - url = FEEDBACK_URL + url = FEEDBACK_URL, ) } } @@ -277,7 +277,6 @@ private fun LinksPanel() { @Composable private fun TextLink(text: String, url: String) { - val launchResourceIntent = Intent(Intent.ACTION_VIEW, Uri.parse(url)) val context = LocalContext.current @@ -288,7 +287,7 @@ private fun TextLink(text: String, url: String) { modifier = Modifier .clickable { ContextCompat.startActivity(context, launchResourceIntent, null) - } + }, ) } @@ -302,12 +301,12 @@ private fun PreviewSettingsDialog() { UserEditableSettings( brand = DEFAULT, darkThemeConfig = FOLLOW_SYSTEM, - useDynamicColor = false - ) + useDynamicColor = false, + ), ), onChangeThemeBrand = {}, onChangeDynamicColorPreference = {}, - onChangeDarkThemeConfig = {} + onChangeDarkThemeConfig = {}, ) } } @@ -321,7 +320,7 @@ private fun PreviewSettingsDialogLoading() { settingsUiState = Loading, onChangeThemeBrand = {}, onChangeDynamicColorPreference = {}, - onChangeDarkThemeConfig = {} + onChangeDarkThemeConfig = {}, ) } } diff --git a/feature/settings/src/main/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsViewModel.kt b/feature/settings/src/main/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsViewModel.kt index c1eac1eee..33bf58a2c 100644 --- a/feature/settings/src/main/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsViewModel.kt +++ b/feature/settings/src/main/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsViewModel.kt @@ -24,12 +24,12 @@ import com.google.samples.apps.nowinandroid.core.model.data.ThemeBrand import com.google.samples.apps.nowinandroid.feature.settings.SettingsUiState.Loading import com.google.samples.apps.nowinandroid.feature.settings.SettingsUiState.Success import dagger.hilt.android.lifecycle.HiltViewModel -import javax.inject.Inject import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch +import javax.inject.Inject @HiltViewModel class SettingsViewModel @Inject constructor( @@ -42,8 +42,8 @@ class SettingsViewModel @Inject constructor( settings = UserEditableSettings( brand = userData.themeBrand, useDynamicColor = userData.useDynamicColor, - darkThemeConfig = userData.darkThemeConfig - ) + darkThemeConfig = userData.darkThemeConfig, + ), ) } .stateIn( @@ -55,7 +55,7 @@ class SettingsViewModel @Inject constructor( // scrollable column. // TODO: Change to SharingStarted.WhileSubscribed(5_000) when b/221643630 is fixed started = SharingStarted.Eagerly, - initialValue = Loading + initialValue = Loading, ) fun updateThemeBrand(themeBrand: ThemeBrand) { @@ -83,7 +83,7 @@ class SettingsViewModel @Inject constructor( data class UserEditableSettings( val brand: ThemeBrand, val useDynamicColor: Boolean, - val darkThemeConfig: DarkThemeConfig + val darkThemeConfig: DarkThemeConfig, ) sealed interface SettingsUiState { diff --git a/feature/settings/src/test/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsViewModelTest.kt b/feature/settings/src/test/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsViewModelTest.kt index 0377490b3..9062abee6 100644 --- a/feature/settings/src/test/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsViewModelTest.kt +++ b/feature/settings/src/test/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsViewModelTest.kt @@ -22,7 +22,6 @@ import com.google.samples.apps.nowinandroid.core.testing.repository.TestUserData import com.google.samples.apps.nowinandroid.core.testing.util.MainDispatcherRule import com.google.samples.apps.nowinandroid.feature.settings.SettingsUiState.Loading import com.google.samples.apps.nowinandroid.feature.settings.SettingsUiState.Success -import kotlin.test.assertEquals import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch import kotlinx.coroutines.test.UnconfinedTestDispatcher @@ -30,6 +29,7 @@ import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Rule import org.junit.Test +import kotlin.test.assertEquals class SettingsViewModelTest { @@ -52,7 +52,6 @@ class SettingsViewModelTest { @Test fun stateIsSuccessAfterUserDataLoaded() = runTest { - val collectJob = launch(UnconfinedTestDispatcher()) { viewModel.settingsUiState.collect() } @@ -64,10 +63,10 @@ class SettingsViewModelTest { UserEditableSettings( brand = ANDROID, darkThemeConfig = DARK, - useDynamicColor = false - ) + useDynamicColor = false, + ), ), - viewModel.settingsUiState.value + viewModel.settingsUiState.value, ) collectJob.cancel() diff --git a/feature/topic/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/topic/TopicScreenTest.kt b/feature/topic/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/topic/TopicScreenTest.kt index df9e83315..9f984c4a3 100644 --- a/feature/topic/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/topic/TopicScreenTest.kt +++ b/feature/topic/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/topic/TopicScreenTest.kt @@ -120,7 +120,7 @@ class TopicScreenTest { TopicScreen( topicUiState = TopicUiState.Success(testTopic), newsUiState = NewsUiState.Success( - sampleUserNewsResources + sampleUserNewsResources, ), onBackClick = { }, onFollowClick = { }, @@ -149,9 +149,9 @@ private val testTopics = listOf( shortDescription = "", longDescription = TOPIC_DESC, url = "", - imageUrl = "" + imageUrl = "", ), - isFollowed = true + isFollowed = true, ), FollowableTopic( Topic( @@ -160,9 +160,9 @@ private val testTopics = listOf( shortDescription = "", longDescription = TOPIC_DESC, url = "", - imageUrl = "" + imageUrl = "", ), - isFollowed = false + isFollowed = false, ), FollowableTopic( Topic( @@ -171,10 +171,10 @@ private val testTopics = listOf( shortDescription = "", longDescription = TOPIC_DESC, url = "", - imageUrl = "" + imageUrl = "", ), - isFollowed = false - ) + isFollowed = false, + ), ) private val sampleUserNewsResources = listOf( @@ -198,10 +198,10 @@ private val sampleUserNewsResources = listOf( shortDescription = "", longDescription = TOPIC_DESC, url = "", - imageUrl = "" - ) - ) + imageUrl = "", + ), + ), ), - userData = emptyUserData.copy(bookmarkedNewsResources = setOf("1")) - ) + userData = emptyUserData.copy(bookmarkedNewsResources = setOf("1")), + ), ) diff --git a/feature/topic/src/main/java/com/google/samples/apps/nowinandroid/feature/topic/TopicScreen.kt b/feature/topic/src/main/java/com/google/samples/apps/nowinandroid/feature/topic/TopicScreen.kt index 2200fc035..b4d31084b 100644 --- a/feature/topic/src/main/java/com/google/samples/apps/nowinandroid/feature/topic/TopicScreen.kt +++ b/feature/topic/src/main/java/com/google/samples/apps/nowinandroid/feature/topic/TopicScreen.kt @@ -95,7 +95,7 @@ internal fun TopicScreen( LazyColumn( state = state, modifier = modifier, - horizontalAlignment = Alignment.CenterHorizontally + horizontalAlignment = Alignment.CenterHorizontally, ) { item { Spacer(Modifier.windowInsetsTopHeight(WindowInsets.safeDrawing)) @@ -122,7 +122,7 @@ internal fun TopicScreen( description = topicUiState.followableTopic.topic.longDescription, news = newsUiState, imageUrl = topicUiState.followableTopic.topic.imageUrl, - onBookmarkChanged = onBookmarkChanged + onBookmarkChanged = onBookmarkChanged, ) } } @@ -137,7 +137,7 @@ private fun LazyListScope.TopicBody( description: String, news: NewsUiState, imageUrl: String, - onBookmarkChanged: (String, Boolean) -> Unit + onBookmarkChanged: (String, Boolean) -> Unit, ) { // TODO: Show icon if available item { @@ -150,7 +150,7 @@ private fun LazyListScope.TopicBody( @Composable private fun TopicHeader(name: String, description: String, imageUrl: String) { Column( - modifier = Modifier.padding(horizontal = 24.dp) + modifier = Modifier.padding(horizontal = 24.dp), ) { DynamicAsyncImage( imageUrl = imageUrl, @@ -158,14 +158,14 @@ private fun TopicHeader(name: String, description: String, imageUrl: String) { modifier = Modifier .align(Alignment.CenterHorizontally) .size(216.dp) - .padding(bottom = 12.dp) + .padding(bottom = 12.dp), ) Text(name, style = MaterialTheme.typography.displayMedium) if (description.isNotEmpty()) { Text( description, modifier = Modifier.padding(top = 24.dp), - style = MaterialTheme.typography.bodyLarge + style = MaterialTheme.typography.bodyLarge, ) } } @@ -174,14 +174,14 @@ private fun TopicHeader(name: String, description: String, imageUrl: String) { // TODO: Could/should this be replaced with [LazyGridScope.newsFeed]? private fun LazyListScope.userNewsResourceCards( news: NewsUiState, - onBookmarkChanged: (String, Boolean) -> Unit + onBookmarkChanged: (String, Boolean) -> Unit, ) { when (news) { is NewsUiState.Success -> { userNewsResourceCardItems( items = news.news, onToggleBookmark = { onBookmarkChanged(it.id, !it.isSaved) }, - itemModifier = Modifier.padding(24.dp) + itemModifier = Modifier.padding(24.dp), ) } @@ -201,8 +201,11 @@ private fun TopicBodyPreview() { NiaTheme { LazyColumn { TopicBody( - "Jetpack Compose", "Lorem ipsum maximum", - NewsUiState.Success(emptyList()), "", { _, _ -> } + "Jetpack Compose", + "Lorem ipsum maximum", + NewsUiState.Success(emptyList()), + "", + { _, _ -> }, ) } } @@ -220,21 +223,21 @@ private fun TopicToolbar( verticalAlignment = Alignment.CenterVertically, modifier = modifier .fillMaxWidth() - .padding(bottom = 32.dp) + .padding(bottom = 32.dp), ) { IconButton(onClick = { onBackClick() }) { Icon( imageVector = NiaIcons.ArrowBack, contentDescription = stringResource( - id = com.google.samples.apps.nowinandroid.core.ui.R.string.back - ) + id = com.google.samples.apps.nowinandroid.core.ui.R.string.back, + ), ) } val selected = uiState.isFollowed NiaFilterChip( selected = selected, onSelectedChange = onFollowClick, - modifier = Modifier.padding(end = 24.dp) + modifier = Modifier.padding(end = 24.dp), ) { if (selected) { Text("FOLLOWING") @@ -253,7 +256,7 @@ fun TopicScreenPopulated() { TopicScreen( topicUiState = TopicUiState.Success(FollowableTopic(previewTopics[0], false)), newsUiState = NewsUiState.Success( - previewUserNewsResources + previewUserNewsResources, ), onBackClick = {}, onFollowClick = {}, diff --git a/feature/topic/src/main/java/com/google/samples/apps/nowinandroid/feature/topic/TopicViewModel.kt b/feature/topic/src/main/java/com/google/samples/apps/nowinandroid/feature/topic/TopicViewModel.kt index 260cecbd1..c0c6bbafd 100644 --- a/feature/topic/src/main/java/com/google/samples/apps/nowinandroid/feature/topic/TopicViewModel.kt +++ b/feature/topic/src/main/java/com/google/samples/apps/nowinandroid/feature/topic/TopicViewModel.kt @@ -30,7 +30,6 @@ import com.google.samples.apps.nowinandroid.core.result.Result import com.google.samples.apps.nowinandroid.core.result.asResult import com.google.samples.apps.nowinandroid.feature.topic.navigation.TopicArgs import dagger.hilt.android.lifecycle.HiltViewModel -import javax.inject.Inject import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow @@ -38,6 +37,7 @@ import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch +import javax.inject.Inject @HiltViewModel class TopicViewModel @Inject constructor( @@ -45,7 +45,7 @@ class TopicViewModel @Inject constructor( stringDecoder: StringDecoder, private val userDataRepository: UserDataRepository, topicsRepository: TopicsRepository, - getSaveableNewsResources: GetUserNewsResourcesUseCase + getSaveableNewsResources: GetUserNewsResourcesUseCase, ) : ViewModel() { private val topicArgs: TopicArgs = TopicArgs(savedStateHandle, stringDecoder) @@ -53,23 +53,23 @@ class TopicViewModel @Inject constructor( val topicUiState: StateFlow = topicUiState( topicId = topicArgs.topicId, userDataRepository = userDataRepository, - topicsRepository = topicsRepository + topicsRepository = topicsRepository, ) .stateIn( scope = viewModelScope, started = SharingStarted.WhileSubscribed(5_000), - initialValue = TopicUiState.Loading + initialValue = TopicUiState.Loading, ) val newUiState: StateFlow = newsUiState( topicId = topicArgs.topicId, userDataRepository = userDataRepository, - getSaveableNewsResources = getSaveableNewsResources + getSaveableNewsResources = getSaveableNewsResources, ) .stateIn( scope = viewModelScope, started = SharingStarted.WhileSubscribed(5_000), - initialValue = NewsUiState.Loading + initialValue = NewsUiState.Loading, ) fun followTopicToggle(followed: Boolean) { @@ -97,13 +97,13 @@ private fun topicUiState( // Observe topic information val topicStream: Flow = topicsRepository.getTopic( - id = topicId + id = topicId, ) return combine( followedTopicIds, topicStream, - ::Pair + ::Pair, ) .asResult() .map { followedTopicToTopicResult -> @@ -114,8 +114,8 @@ private fun topicUiState( TopicUiState.Success( followableTopic = FollowableTopic( topic = topic, - isFollowed = followed - ) + isFollowed = followed, + ), ) } is Result.Loading -> { @@ -145,7 +145,7 @@ private fun newsUiState( return combine( newsStream, bookmark, - ::Pair + ::Pair, ) .asResult() .map { newsToBookmarksResult -> diff --git a/feature/topic/src/main/java/com/google/samples/apps/nowinandroid/feature/topic/navigation/TopicNavigation.kt b/feature/topic/src/main/java/com/google/samples/apps/nowinandroid/feature/topic/navigation/TopicNavigation.kt index 808143275..1cc43bbd1 100644 --- a/feature/topic/src/main/java/com/google/samples/apps/nowinandroid/feature/topic/navigation/TopicNavigation.kt +++ b/feature/topic/src/main/java/com/google/samples/apps/nowinandroid/feature/topic/navigation/TopicNavigation.kt @@ -41,13 +41,13 @@ fun NavController.navigateToTopic(topicId: String) { } fun NavGraphBuilder.topicScreen( - onBackClick: () -> Unit + onBackClick: () -> Unit, ) { composable( route = "topic_route/{$topicIdArg}", arguments = listOf( - navArgument(topicIdArg) { type = NavType.StringType } - ) + navArgument(topicIdArg) { type = NavType.StringType }, + ), ) { TopicRoute(onBackClick = onBackClick) } diff --git a/feature/topic/src/test/java/com/google/samples/apps/nowinandroid/feature/topic/TopicViewModelTest.kt b/feature/topic/src/test/java/com/google/samples/apps/nowinandroid/feature/topic/TopicViewModelTest.kt index 6c61e59d5..a8f1b0a88 100644 --- a/feature/topic/src/test/java/com/google/samples/apps/nowinandroid/feature/topic/TopicViewModelTest.kt +++ b/feature/topic/src/test/java/com/google/samples/apps/nowinandroid/feature/topic/TopicViewModelTest.kt @@ -28,8 +28,6 @@ import com.google.samples.apps.nowinandroid.core.testing.repository.TestTopicsRe import com.google.samples.apps.nowinandroid.core.testing.repository.TestUserDataRepository import com.google.samples.apps.nowinandroid.core.testing.util.MainDispatcherRule import com.google.samples.apps.nowinandroid.feature.topic.navigation.topicIdArg -import kotlin.test.assertEquals -import kotlin.test.assertIs import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.first @@ -40,6 +38,8 @@ import kotlinx.datetime.Instant import org.junit.Before import org.junit.Rule import org.junit.Test +import kotlin.test.assertEquals +import kotlin.test.assertIs /** * To learn more about how this test handles Flows created with stateIn, see @@ -55,7 +55,7 @@ class TopicViewModelTest { private val newsRepository = TestNewsRepository() private val getUserNewsResourcesUseCase = GetUserNewsResourcesUseCase( newsRepository = newsRepository, - userDataRepository = userDataRepository + userDataRepository = userDataRepository, ) private lateinit var viewModel: TopicViewModel @@ -66,7 +66,7 @@ class TopicViewModelTest { stringDecoder = FakeStringDecoder(), userDataRepository = userDataRepository, topicsRepository = topicsRepository, - getSaveableNewsResources = getUserNewsResourcesUseCase + getSaveableNewsResources = getUserNewsResourcesUseCase, ) } @@ -80,7 +80,7 @@ class TopicViewModelTest { assertIs(item) val topicFromRepository = topicsRepository.getTopic( - testInputTopics[0].topic.id + testInputTopics[0].topic.id, ).first() assertEquals(topicFromRepository, item.followableTopic.topic) @@ -131,7 +131,7 @@ class TopicViewModelTest { combine( viewModel.topicUiState, viewModel.newUiState, - ::Pair + ::Pair, ).collect() } topicsRepository.sendTopics(testInputTopics.map { it.topic }) @@ -158,7 +158,7 @@ class TopicViewModelTest { assertEquals( TopicUiState.Success(followableTopic = testOutputTopics[0]), - viewModel.topicUiState.value + viewModel.topicUiState.value, ) collectJob.cancel() @@ -183,7 +183,7 @@ private val testInputTopics = listOf( url = TOPIC_URL, imageUrl = TOPIC_IMAGE_URL, ), - isFollowed = true + isFollowed = true, ), FollowableTopic( Topic( @@ -194,7 +194,7 @@ private val testInputTopics = listOf( url = TOPIC_URL, imageUrl = TOPIC_IMAGE_URL, ), - isFollowed = false + isFollowed = false, ), FollowableTopic( Topic( @@ -205,8 +205,8 @@ private val testInputTopics = listOf( url = TOPIC_URL, imageUrl = TOPIC_IMAGE_URL, ), - isFollowed = false - ) + isFollowed = false, + ), ) private val testOutputTopics = listOf( @@ -219,7 +219,7 @@ private val testOutputTopics = listOf( url = TOPIC_URL, imageUrl = TOPIC_IMAGE_URL, ), - isFollowed = true + isFollowed = true, ), FollowableTopic( Topic( @@ -230,7 +230,7 @@ private val testOutputTopics = listOf( url = TOPIC_URL, imageUrl = TOPIC_IMAGE_URL, ), - isFollowed = true + isFollowed = true, ), FollowableTopic( Topic( @@ -241,8 +241,8 @@ private val testOutputTopics = listOf( url = TOPIC_URL, imageUrl = TOPIC_IMAGE_URL, ), - isFollowed = false - ) + isFollowed = false, + ), ) private val sampleNewsResources = listOf( @@ -265,7 +265,7 @@ private val sampleNewsResources = listOf( longDescription = "long description", url = "URL", imageUrl = "image URL", - ) + ), ), - ) + ), ) diff --git a/lint/src/main/java/com/google/samples/apps/nowinandroid/lint/designsystem/DesignSystemDetector.kt b/lint/src/main/java/com/google/samples/apps/nowinandroid/lint/designsystem/DesignSystemDetector.kt index 047b5d7ab..39aa07160 100644 --- a/lint/src/main/java/com/google/samples/apps/nowinandroid/lint/designsystem/DesignSystemDetector.kt +++ b/lint/src/main/java/com/google/samples/apps/nowinandroid/lint/designsystem/DesignSystemDetector.kt @@ -38,7 +38,7 @@ class DesignSystemDetector : Detector(), Detector.UastScanner { override fun getApplicableUastTypes(): List> { return listOf( UCallExpression::class.java, - UQualifiedReferenceExpression::class.java + UQualifiedReferenceExpression::class.java, ) } @@ -71,8 +71,8 @@ class DesignSystemDetector : Detector(), Detector.UastScanner { severity = Severity.ERROR, implementation = Implementation( DesignSystemDetector::class.java, - Scope.JAVA_FILE_SCOPE - ) + Scope.JAVA_FILE_SCOPE, + ), ) // Unfortunately :lint is a Java module and thus can't depend on the :core-designsystem @@ -99,21 +99,23 @@ class DesignSystemDetector : Detector(), Detector.UastScanner { "CenterAlignedTopAppBar" to "NiaTopAppBar", "SmallTopAppBar" to "NiaTopAppBar", "MediumTopAppBar" to "NiaTopAppBar", - "LargeTopAppBar" to "NiaTopAppBar" + "LargeTopAppBar" to "NiaTopAppBar", ) val RECEIVER_NAMES = mapOf( - "Icons" to "NiaIcons" + "Icons" to "NiaIcons", ) fun reportIssue( context: JavaContext, node: UElement, name: String, - preferredName: String + preferredName: String, ) { context.report( - ISSUE, node, context.getLocation(node), - "Using $name instead of $preferredName" + ISSUE, + node, + context.getLocation(node), + "Using $name instead of $preferredName", ) } } diff --git a/lint/src/main/java/com/google/samples/apps/nowinandroid/lint/designsystem/DesignSystemIssueRegistry.kt b/lint/src/main/java/com/google/samples/apps/nowinandroid/lint/designsystem/DesignSystemIssueRegistry.kt index 152c07c28..d951151bb 100644 --- a/lint/src/main/java/com/google/samples/apps/nowinandroid/lint/designsystem/DesignSystemIssueRegistry.kt +++ b/lint/src/main/java/com/google/samples/apps/nowinandroid/lint/designsystem/DesignSystemIssueRegistry.kt @@ -35,6 +35,6 @@ class DesignSystemIssueRegistry : IssueRegistry() { override val vendor: Vendor = Vendor( vendorName = "Now in Android", feedbackUrl = "https://github.com/android/nowinandroid/issues", - contact = "https://github.com/android/nowinandroid" + contact = "https://github.com/android/nowinandroid", ) } diff --git a/sync/sync-test/src/main/java/com/google/samples/apps/nowinandroid/core/sync/test/NeverSyncingSyncStatusMonitor.kt b/sync/sync-test/src/main/java/com/google/samples/apps/nowinandroid/core/sync/test/NeverSyncingSyncStatusMonitor.kt index 0c0069f7d..647dd864e 100644 --- a/sync/sync-test/src/main/java/com/google/samples/apps/nowinandroid/core/sync/test/NeverSyncingSyncStatusMonitor.kt +++ b/sync/sync-test/src/main/java/com/google/samples/apps/nowinandroid/core/sync/test/NeverSyncingSyncStatusMonitor.kt @@ -17,9 +17,9 @@ package com.google.samples.apps.nowinandroid.core.sync.test import com.google.samples.apps.nowinandroid.core.data.util.SyncStatusMonitor -import javax.inject.Inject import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flowOf +import javax.inject.Inject class NeverSyncingSyncStatusMonitor @Inject constructor() : SyncStatusMonitor { override val isSyncing: Flow = flowOf(false) diff --git a/sync/sync-test/src/main/java/com/google/samples/apps/nowinandroid/core/sync/test/TestSyncModule.kt b/sync/sync-test/src/main/java/com/google/samples/apps/nowinandroid/core/sync/test/TestSyncModule.kt index bc0876a7c..323704b5a 100644 --- a/sync/sync-test/src/main/java/com/google/samples/apps/nowinandroid/core/sync/test/TestSyncModule.kt +++ b/sync/sync-test/src/main/java/com/google/samples/apps/nowinandroid/core/sync/test/TestSyncModule.kt @@ -26,11 +26,11 @@ import dagger.hilt.testing.TestInstallIn @Module @TestInstallIn( components = [SingletonComponent::class], - replaces = [SyncModule::class] + replaces = [SyncModule::class], ) interface TestSyncModule { @Binds fun bindsSyncStatusMonitor( - syncStatusMonitor: NeverSyncingSyncStatusMonitor + syncStatusMonitor: NeverSyncingSyncStatusMonitor, ): SyncStatusMonitor } diff --git a/sync/work/src/androidTest/java/com/google/samples/apps/nowinandroid/sync/workers/SyncWorkerTest.kt b/sync/work/src/androidTest/java/com/google/samples/apps/nowinandroid/sync/workers/SyncWorkerTest.kt index 4bcc19be8..9c9d13510 100644 --- a/sync/work/src/androidTest/java/com/google/samples/apps/nowinandroid/sync/workers/SyncWorkerTest.kt +++ b/sync/work/src/androidTest/java/com/google/samples/apps/nowinandroid/sync/workers/SyncWorkerTest.kt @@ -25,10 +25,10 @@ import androidx.work.testing.SynchronousExecutor import androidx.work.testing.WorkManagerTestInitHelper import dagger.hilt.android.testing.HiltAndroidRule import dagger.hilt.android.testing.HiltAndroidTest -import kotlin.test.assertEquals import org.junit.Before import org.junit.Rule import org.junit.Test +import kotlin.test.assertEquals @HiltAndroidTest class SyncWorkerTest { diff --git a/sync/work/src/main/java/com/google/samples/apps/nowinandroid/sync/di/SyncModule.kt b/sync/work/src/main/java/com/google/samples/apps/nowinandroid/sync/di/SyncModule.kt index 88e7df4de..68f9eee93 100644 --- a/sync/work/src/main/java/com/google/samples/apps/nowinandroid/sync/di/SyncModule.kt +++ b/sync/work/src/main/java/com/google/samples/apps/nowinandroid/sync/di/SyncModule.kt @@ -28,6 +28,6 @@ import dagger.hilt.components.SingletonComponent interface SyncModule { @Binds fun bindsSyncStatusMonitor( - syncStatusMonitor: WorkManagerSyncStatusMonitor + syncStatusMonitor: WorkManagerSyncStatusMonitor, ): SyncStatusMonitor } diff --git a/sync/work/src/main/java/com/google/samples/apps/nowinandroid/sync/initializers/SyncInitializer.kt b/sync/work/src/main/java/com/google/samples/apps/nowinandroid/sync/initializers/SyncInitializer.kt index 21f98138b..837eb9a20 100644 --- a/sync/work/src/main/java/com/google/samples/apps/nowinandroid/sync/initializers/SyncInitializer.kt +++ b/sync/work/src/main/java/com/google/samples/apps/nowinandroid/sync/initializers/SyncInitializer.kt @@ -47,7 +47,7 @@ class SyncInitializer : Initializer { enqueueUniqueWork( SyncWorkName, ExistingWorkPolicy.KEEP, - SyncWorker.startUpSyncWork() + SyncWorker.startUpSyncWork(), ) } diff --git a/sync/work/src/main/java/com/google/samples/apps/nowinandroid/sync/initializers/SyncWorkHelpers.kt b/sync/work/src/main/java/com/google/samples/apps/nowinandroid/sync/initializers/SyncWorkHelpers.kt index bfaef1808..334b3f0c7 100644 --- a/sync/work/src/main/java/com/google/samples/apps/nowinandroid/sync/initializers/SyncWorkHelpers.kt +++ b/sync/work/src/main/java/com/google/samples/apps/nowinandroid/sync/initializers/SyncWorkHelpers.kt @@ -42,7 +42,7 @@ val SyncConstraints */ fun Context.syncForegroundInfo() = ForegroundInfo( SyncNotificationId, - syncWorkNotification() + syncWorkNotification(), ) /** @@ -54,7 +54,7 @@ private fun Context.syncWorkNotification(): Notification { val channel = NotificationChannel( SyncNotificationChannelID, getString(R.string.sync_notification_channel_name), - NotificationManager.IMPORTANCE_DEFAULT + NotificationManager.IMPORTANCE_DEFAULT, ).apply { description = getString(R.string.sync_notification_channel_description) } @@ -67,10 +67,10 @@ private fun Context.syncWorkNotification(): Notification { return NotificationCompat.Builder( this, - SyncNotificationChannelID + SyncNotificationChannelID, ) .setSmallIcon( - com.google.samples.apps.nowinandroid.core.common.R.drawable.ic_nia_notification + com.google.samples.apps.nowinandroid.core.common.R.drawable.ic_nia_notification, ) .setContentTitle(getString(R.string.sync_notification_title)) .setPriority(NotificationCompat.PRIORITY_DEFAULT) diff --git a/sync/work/src/main/java/com/google/samples/apps/nowinandroid/sync/status/WorkManagerSyncStatusMonitor.kt b/sync/work/src/main/java/com/google/samples/apps/nowinandroid/sync/status/WorkManagerSyncStatusMonitor.kt index fe9c429e0..9edb630eb 100644 --- a/sync/work/src/main/java/com/google/samples/apps/nowinandroid/sync/status/WorkManagerSyncStatusMonitor.kt +++ b/sync/work/src/main/java/com/google/samples/apps/nowinandroid/sync/status/WorkManagerSyncStatusMonitor.kt @@ -25,20 +25,20 @@ import androidx.work.WorkManager import com.google.samples.apps.nowinandroid.core.data.util.SyncStatusMonitor import com.google.samples.apps.nowinandroid.sync.initializers.SyncWorkName import dagger.hilt.android.qualifiers.ApplicationContext -import javax.inject.Inject import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.conflate +import javax.inject.Inject /** * [SyncStatusMonitor] backed by [WorkInfo] from [WorkManager] */ class WorkManagerSyncStatusMonitor @Inject constructor( - @ApplicationContext context: Context + @ApplicationContext context: Context, ) : SyncStatusMonitor { override val isSyncing: Flow = Transformations.map( WorkManager.getInstance(context).getWorkInfosForUniqueWorkLiveData(SyncWorkName), - MutableList::anyRunning + MutableList::anyRunning, ) .asFlow() .conflate() diff --git a/sync/work/src/main/java/com/google/samples/apps/nowinandroid/sync/workers/SyncWorker.kt b/sync/work/src/main/java/com/google/samples/apps/nowinandroid/sync/workers/SyncWorker.kt index 1a7dfb1be..c6ac6fb65 100644 --- a/sync/work/src/main/java/com/google/samples/apps/nowinandroid/sync/workers/SyncWorker.kt +++ b/sync/work/src/main/java/com/google/samples/apps/nowinandroid/sync/workers/SyncWorker.kt @@ -65,8 +65,11 @@ class SyncWorker @AssistedInject constructor( async { newsRepository.sync() }, ).all { it } - if (syncedSuccessfully) Result.success() - else Result.retry() + if (syncedSuccessfully) { + Result.success() + } else { + Result.retry() + } } } @@ -74,7 +77,7 @@ class SyncWorker @AssistedInject constructor( niaPreferences.getChangeListVersions() override suspend fun updateChangeListVersions( - update: ChangeListVersions.() -> ChangeListVersions + update: ChangeListVersions.() -> ChangeListVersions, ) = niaPreferences.updateChangeListVersion(update) companion object { From 1d081ce26ff66d04acc65d4facac566d6a4b9463 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rton=20Braun?= Date: Wed, 25 Jan 2023 16:53:12 +0100 Subject: [PATCH 24/37] Fix formatting for a trailing comma Change-Id: I300ec889aa9cd726a3cc60294e0cf7707e3361a6 --- .../samples/apps/nowinandroid/feature/foryou/ForYouScreen.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreen.kt b/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreen.kt index f13cbdb1a..2acf43323 100644 --- a/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreen.kt +++ b/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreen.kt @@ -306,7 +306,7 @@ private fun TopicSelection( ) { items( items = onboardingUiState.topics, - key = { it.topic.id } + key = { it.topic.id }, ) { SingleTopicButton( name = it.topic.name, From 20c29a6c091215f4b994d419230fb6c0e1975f93 Mon Sep 17 00:00:00 2001 From: Manuel Vivo Date: Fri, 27 Jan 2023 11:39:31 +0100 Subject: [PATCH 25/37] Fix bookmarking scrolling to top of the page bug (#548) --- .../apps/nowinandroid/feature/foryou/ForYouViewModel.kt | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel.kt b/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel.kt index 4895f8306..d75965778 100644 --- a/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel.kt +++ b/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel.kt @@ -32,7 +32,6 @@ import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.map -import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch import javax.inject.Inject @@ -68,7 +67,8 @@ class ForYouViewModel @Inject constructor( } else { getSaveableNewsResources( filterTopicIds = userData.followedTopics, - ).mapToFeedState() + ) + .map, NewsFeedUiState>(NewsFeedUiState::Success) } } // Flatten the feed flows. @@ -116,7 +116,3 @@ class ForYouViewModel @Inject constructor( } } } - -private fun Flow>.mapToFeedState(): Flow = - map, NewsFeedUiState>(NewsFeedUiState::Success) - .onStart { emit(NewsFeedUiState.Loading) } From a9bf21aaf4cc6ad07ab5d5b17065bf681778bffd Mon Sep 17 00:00:00 2001 From: Don Turner Date: Fri, 27 Jan 2023 17:37:49 +0000 Subject: [PATCH 26/37] Add UseCase for getting followed news resources, refactor ForYouVM --- .../domain/GetUserNewsResourcesUseCase.kt | 41 +++++++++++++++++++ .../feature/foryou/ForYouViewModel.kt | 29 +++---------- .../feature/foryou/ForYouViewModelTest.kt | 8 +++- 3 files changed, 53 insertions(+), 25 deletions(-) diff --git a/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/GetUserNewsResourcesUseCase.kt b/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/GetUserNewsResourcesUseCase.kt index db274bbbd..72361eeed 100644 --- a/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/GetUserNewsResourcesUseCase.kt +++ b/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/GetUserNewsResourcesUseCase.kt @@ -24,7 +24,11 @@ import com.google.samples.apps.nowinandroid.core.model.data.NewsResource import com.google.samples.apps.nowinandroid.core.model.data.UserData import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.filterNot +import kotlinx.coroutines.flow.flatMapLatest +import kotlinx.coroutines.flow.flowOf +import kotlinx.coroutines.flow.map import javax.inject.Inject /** @@ -51,6 +55,43 @@ class GetUserNewsResourcesUseCase @Inject constructor( }.mapToUserNewsResources(userDataRepository.userData) } +class GetFollowedUserNewsResourcesUseCase @Inject constructor( + private val userDataRepository: UserDataRepository, + val getUserNewsResources: GetUserNewsResourcesUseCase, +) { + /** + * Returns a list of UserNewsResources which the user is following + */ + operator fun invoke(): Flow> = + userDataRepository.userData.map { userData -> + if (shouldShowEmptyFeed(userData)) { + null + } else { + userData.followedTopics + } + } + .distinctUntilChanged() + .flatMapLatest { followedTopics -> + if (followedTopics == null) { + flowOf(emptyList()) + } else { + getUserNewsResources(filterTopicIds = followedTopics) + } + } + + /** + * If the user hasn't completed the onboarding and hasn't selected any interests + * show an empty news list to clearly demonstrate that their selections affect the + * news articles they will see. + * + * Note: It should not be possible for the user to get into a state where the onboarding + * is not displayed AND they haven't followed any topics, however, this method is to safeguard + * against that scenario in future. + */ + private fun shouldShowEmptyFeed(userData: UserData) = + !userData.shouldHideOnboarding && userData.followedTopics.isEmpty() +} + private fun Flow>.mapToUserNewsResources( userDataStream: Flow, ): Flow> = diff --git a/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel.kt b/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel.kt index d75965778..84c4d11a3 100644 --- a/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel.kt +++ b/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel.kt @@ -21,7 +21,7 @@ import androidx.lifecycle.viewModelScope import com.google.samples.apps.nowinandroid.core.data.repository.UserDataRepository import com.google.samples.apps.nowinandroid.core.data.util.SyncStatusMonitor import com.google.samples.apps.nowinandroid.core.domain.GetFollowableTopicsUseCase -import com.google.samples.apps.nowinandroid.core.domain.GetUserNewsResourcesUseCase +import com.google.samples.apps.nowinandroid.core.domain.GetFollowedUserNewsResourcesUseCase import com.google.samples.apps.nowinandroid.core.domain.model.UserNewsResource import com.google.samples.apps.nowinandroid.core.ui.NewsFeedUiState import dagger.hilt.android.lifecycle.HiltViewModel @@ -29,8 +29,6 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine -import kotlinx.coroutines.flow.flatMapLatest -import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch @@ -40,7 +38,7 @@ import javax.inject.Inject class ForYouViewModel @Inject constructor( syncStatusMonitor: SyncStatusMonitor, private val userDataRepository: UserDataRepository, - private val getSaveableNewsResources: GetUserNewsResourcesUseCase, + getFollowedUserNewsResources: GetFollowedUserNewsResourcesUseCase, getFollowableTopics: GetFollowableTopicsUseCase, ) : ViewModel() { @@ -55,26 +53,9 @@ class ForYouViewModel @Inject constructor( ) val feedState: StateFlow = - userDataRepository.userData - .map { userData -> - // If the user hasn't completed the onboarding and hasn't selected any interests - // show an empty news list to clearly demonstrate that their selections affect the - // news articles they will see. - if (!userData.shouldHideOnboarding && - userData.followedTopics.isEmpty() - ) { - flowOf(NewsFeedUiState.Success(emptyList())) - } else { - getSaveableNewsResources( - filterTopicIds = userData.followedTopics, - ) - .map, NewsFeedUiState>(NewsFeedUiState::Success) - } - } - // Flatten the feed flows. - // As the selected topics and topic state changes, this will cancel the old feed - // monitoring and start the new one. - .flatMapLatest { it } + getFollowedUserNewsResources().map { + NewsFeedUiState.Success(it) + } .stateIn( scope = viewModelScope, started = SharingStarted.WhileSubscribed(5_000), diff --git a/feature/foryou/src/test/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModelTest.kt b/feature/foryou/src/test/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModelTest.kt index 1f6e010d5..c335f7603 100644 --- a/feature/foryou/src/test/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModelTest.kt +++ b/feature/foryou/src/test/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModelTest.kt @@ -17,6 +17,7 @@ package com.google.samples.apps.nowinandroid.feature.foryou import com.google.samples.apps.nowinandroid.core.domain.GetFollowableTopicsUseCase +import com.google.samples.apps.nowinandroid.core.domain.GetFollowedUserNewsResourcesUseCase import com.google.samples.apps.nowinandroid.core.domain.GetUserNewsResourcesUseCase import com.google.samples.apps.nowinandroid.core.domain.model.FollowableTopic import com.google.samples.apps.nowinandroid.core.domain.model.UserNewsResource @@ -60,6 +61,11 @@ class ForYouViewModelTest { newsRepository = newsRepository, userDataRepository = userDataRepository, ) + private val getFollowedUserNewsResourcesUseCase = GetFollowedUserNewsResourcesUseCase( + userDataRepository = userDataRepository, + getUserNewsResources = getUserNewsResourcesUseCase, + ) + private val getFollowableTopicsUseCase = GetFollowableTopicsUseCase( topicsRepository = topicsRepository, userDataRepository = userDataRepository, @@ -71,7 +77,7 @@ class ForYouViewModelTest { viewModel = ForYouViewModel( syncStatusMonitor = syncStatusMonitor, userDataRepository = userDataRepository, - getSaveableNewsResources = getUserNewsResourcesUseCase, + getFollowedUserNewsResources = getFollowedUserNewsResourcesUseCase, getFollowableTopics = getFollowableTopicsUseCase, ) } From 5a29414b7ae65a59bdd6d91bc4b431bbed114bfb Mon Sep 17 00:00:00 2001 From: Don Turner Date: Fri, 27 Jan 2023 17:53:58 +0000 Subject: [PATCH 27/37] Fix spotless --- .../samples/apps/nowinandroid/feature/foryou/ForYouViewModel.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel.kt b/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel.kt index 84c4d11a3..85268e894 100644 --- a/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel.kt +++ b/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel.kt @@ -22,7 +22,6 @@ import com.google.samples.apps.nowinandroid.core.data.repository.UserDataReposit import com.google.samples.apps.nowinandroid.core.data.util.SyncStatusMonitor import com.google.samples.apps.nowinandroid.core.domain.GetFollowableTopicsUseCase import com.google.samples.apps.nowinandroid.core.domain.GetFollowedUserNewsResourcesUseCase -import com.google.samples.apps.nowinandroid.core.domain.model.UserNewsResource import com.google.samples.apps.nowinandroid.core.ui.NewsFeedUiState import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.Flow From a98dd001b2dc5c775e1a88c23fa5582a74cd6651 Mon Sep 17 00:00:00 2001 From: Don Turner Date: Fri, 27 Jan 2023 18:05:40 +0000 Subject: [PATCH 28/37] Add comment describing flow transformation functions --- .../domain/GetUserNewsResourcesUseCase.kt | 28 ++++++++++++++----- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/GetUserNewsResourcesUseCase.kt b/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/GetUserNewsResourcesUseCase.kt index 72361eeed..d4ef20ca9 100644 --- a/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/GetUserNewsResourcesUseCase.kt +++ b/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/GetUserNewsResourcesUseCase.kt @@ -60,16 +60,30 @@ class GetFollowedUserNewsResourcesUseCase @Inject constructor( val getUserNewsResources: GetUserNewsResourcesUseCase, ) { /** - * Returns a list of UserNewsResources which the user is following + * Returns a list of UserNewsResources for topics which the user is following */ operator fun invoke(): Flow> = - userDataRepository.userData.map { userData -> - if (shouldShowEmptyFeed(userData)) { - null - } else { - userData.followedTopics + + /** + * This sequence of flow transformation functions does the following: + * + * - map: maps the user data into a set of followed topic IDs or null if we should return + * an empty list + * - distinctUntilChanged: will only emit a set of followed topic IDs if it's changed. This + * avoids calling potentially expensive operations (like setting up a new flow) when nothing + * has changed. + * - flatMapLatest: getUserNewsResources returns a flow, so we end up with a flow inside a + * flow. flatMapLatest solves this and cancels any previous flows created by + * getUserNewsResources. + */ + userDataRepository.userData + .map { userData -> + if (shouldShowEmptyFeed(userData)) { + null + } else { + userData.followedTopics + } } - } .distinctUntilChanged() .flatMapLatest { followedTopics -> if (followedTopics == null) { From f08f08f124507f5f4c146fb80901c357c5752f8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=A1=E1=86=AB=E1=84=83=E1=85=A9=E1=86=BC?= =?UTF-8?q?=E1=84=92=E1=85=A7=E1=86=AB?= Date: Sun, 29 Jan 2023 18:00:28 +0900 Subject: [PATCH 29/37] Fix renamed class markdown in ArchitectureLearningJourney.md GetSaveableNewsResourcesUseCase -> GetUserNewsResourcesUseCase --- docs/ArchitectureLearningJourney.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/ArchitectureLearningJourney.md b/docs/ArchitectureLearningJourney.md index 7a6ab2d76..6c84344ea 100644 --- a/docs/ArchitectureLearningJourney.md +++ b/docs/ArchitectureLearningJourney.md @@ -70,7 +70,7 @@ Here's what's happening in each step. The easiest way to find the associated cod 2 - The ForYouViewModel calls GetSaveableNewsResourcesUseCase to obtain a stream of news resources with their bookmarked/saved state. No items will be emitted into this stream until both the user and news repositories emit an item. While waiting, the feed state is set to Loading. + The ForYouViewModel calls GetUserNewsResourcesUseCase to obtain a stream of news resources with their bookmarked/saved state. No items will be emitted into this stream until both the user and news repositories emit an item. While waiting, the feed state is set to Loading. Search for usages of NewsFeedUiState.Loading @@ -142,9 +142,9 @@ Here's what's happening in each step. The easiest way to find the associated cod 11 - GetSaveableNewsResourcesUseCase combines the list of news resources with the user data to emit a list of SaveableNewsResources. + GetUserNewsResourcesUseCase combines the list of news resources with the user data to emit a list of SaveableNewsResources. - GetSaveableNewsResourcesUseCase.invoke + GetUserNewsResourcesUseCase.invoke @@ -254,7 +254,7 @@ The [domain layer](https://developer.android.com/topic/architecture/domain-layer These use cases are used to simplify and remove duplicate logic from ViewModels. They typically combine and transform data from repositories. -For example, `GetSaveableNewsResourcesUseCase` combines a stream (implemented using `Flow`) of `NewsResource`s from a `NewsRepository` with a stream of `UserData` objects from a `UserDataRepository` to create a stream of `SaveableNewsResource`s. This stream is used by various ViewModels to display news resources on screen with their bookmarked state. +For example, `GetUserNewsResourcesUseCase` combines a stream (implemented using `Flow`) of `NewsResource`s from a `NewsRepository` with a stream of `UserData` objects from a `UserDataRepository` to create a stream of `SaveableNewsResource`s. This stream is used by various ViewModels to display news resources on screen with their bookmarked state. Notably, the domain layer in Now in Android _does not_ (for now) contain any use cases for event handling. Events are handled by the UI layer calling methods on repositories directly. From e86cdea381d4233221ad57d342b67ecd7600c80c Mon Sep 17 00:00:00 2001 From: Don Turner Date: Mon, 30 Jan 2023 12:54:11 +0000 Subject: [PATCH 30/37] Add unit tests and comments --- .../domain/GetUserNewsResourcesUseCase.kt | 7 ++- .../domain/GetUserNewsResourcesUseCaseTest.kt | 49 +++++++++++++++++++ 2 files changed, 52 insertions(+), 4 deletions(-) diff --git a/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/GetUserNewsResourcesUseCase.kt b/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/GetUserNewsResourcesUseCase.kt index d4ef20ca9..fdb9eb6d9 100644 --- a/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/GetUserNewsResourcesUseCase.kt +++ b/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/GetUserNewsResourcesUseCase.kt @@ -63,7 +63,6 @@ class GetFollowedUserNewsResourcesUseCase @Inject constructor( * Returns a list of UserNewsResources for topics which the user is following */ operator fun invoke(): Flow> = - /** * This sequence of flow transformation functions does the following: * @@ -72,9 +71,9 @@ class GetFollowedUserNewsResourcesUseCase @Inject constructor( * - distinctUntilChanged: will only emit a set of followed topic IDs if it's changed. This * avoids calling potentially expensive operations (like setting up a new flow) when nothing * has changed. - * - flatMapLatest: getUserNewsResources returns a flow, so we end up with a flow inside a - * flow. flatMapLatest solves this and cancels any previous flows created by - * getUserNewsResources. + * - flatMapLatest: getUserNewsResources returns a flow, so we have a flow inside a + * flow. flatMapLatest moves the inner flow (the one we want to return) to the outer flow + * and cancels any previous flows created by getUserNewsResources. */ userDataRepository.userData .map { userData -> diff --git a/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/GetUserNewsResourcesUseCaseTest.kt b/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/GetUserNewsResourcesUseCaseTest.kt index 32ee8773c..8674c4026 100644 --- a/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/GetUserNewsResourcesUseCaseTest.kt +++ b/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/GetUserNewsResourcesUseCaseTest.kt @@ -83,6 +83,55 @@ class GetUserNewsResourcesUseCaseTest { } } +class GetFollowedUserNewsResourcesUseCaseTest { + + @get:Rule + val mainDispatcherRule = MainDispatcherRule() + + private val newsRepository = TestNewsRepository() + private val userDataRepository = TestUserDataRepository() + private val getUserNewsResourcesUseCase = + GetUserNewsResourcesUseCase(newsRepository, userDataRepository) + + val useCase = + GetFollowedUserNewsResourcesUseCase(userDataRepository, getUserNewsResourcesUseCase) + + @Test + fun whenOnboardingShownAndNoTopicsFollowed_emptyListIsReturned() = runTest { + val followedNewsResources = useCase() + + // Send some news resources and empty user data + newsRepository.sendNewsResources(sampleNewsResources) + userDataRepository.setUserData(emptyUserData) + + // Check that an empty list is returned + assertEquals( + emptyList(), + followedNewsResources.first(), + ) + } + + @Test + fun whenTopicsAreFollowed_correctNewsResourcesAreReturned() = runTest { + val followedNewsResources = useCase() + + // Send some news resources and user data with a followed topic + newsRepository.sendNewsResources(sampleNewsResources) + + val userData = emptyUserData.copy( + followedTopics = setOf(sampleTopic1.id), + ) + userDataRepository.setUserData(userData) + + assertEquals( + sampleNewsResources + .filter { it.topics.contains(sampleTopic1) } + .mapToUserNewsResources(userData), + followedNewsResources.first(), + ) + } +} + private val sampleTopic1 = Topic( id = "Topic1", name = "Headlines", From bcb4d7d5926206779a54744a221f23702bc21b4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mi=C5=82osz=20Moczkowski?= Date: Mon, 30 Jan 2023 15:34:30 +0100 Subject: [PATCH 31/37] Replace global variables with PreviewParameterProvider --- .../core/domain/model/FollowableTopic.kt | 16 --- .../core/domain/model/UserNewsResource.kt | 70 --------- .../core/model/data/NewsResource.kt | 66 --------- .../nowinandroid/core/model/data/Topic.kt | 29 ---- core/testing/build.gradle.kts | 3 + .../testing/data/FollowableTopicTestData.kt | 57 ++++++++ .../testing/data/NewsResourcesTestData.kt | 74 ++++++++++ .../core/testing/data/TopicsTestData.kt | 47 ++++++ .../testing/data/UserNewsResourcesTestData.kt | 108 ++++++++++++++ .../core/ui/NewsResourceCardTest.kt | 12 +- ...FollowableTopicPreviewParameterProvider.kt | 67 +++++++++ .../apps/nowinandroid/core/ui/NewsFeed.kt | 11 +- .../nowinandroid/core/ui/NewsResourceCard.kt | 9 +- ...serNewsResourcePreviewParameterProvider.kt | 135 ++++++++++++++++++ .../feature/bookmarks/BookmarksScreenTest.kt | 16 +-- .../feature/bookmarks/BookmarksScreen.kt | 13 +- .../bookmarks/BookmarksViewModelTest.kt | 12 +- .../feature/foryou/ForYouScreenTest.kt | 51 ++----- .../feature/foryou/ForYouScreen.kt | 36 +++-- .../interests/InterestsScreenTest.kt | 62 +------- .../feature/interests/InterestsScreen.kt | 10 +- .../feature/topic/TopicScreenTest.kt | 89 +----------- .../nowinandroid/feature/topic/TopicScreen.kt | 16 ++- 23 files changed, 598 insertions(+), 411 deletions(-) create mode 100644 core/testing/src/main/java/com/google/samples/apps/nowinandroid/core/testing/data/FollowableTopicTestData.kt create mode 100644 core/testing/src/main/java/com/google/samples/apps/nowinandroid/core/testing/data/NewsResourcesTestData.kt create mode 100644 core/testing/src/main/java/com/google/samples/apps/nowinandroid/core/testing/data/TopicsTestData.kt create mode 100644 core/testing/src/main/java/com/google/samples/apps/nowinandroid/core/testing/data/UserNewsResourcesTestData.kt create mode 100644 core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/FollowableTopicPreviewParameterProvider.kt create mode 100644 core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/UserNewsResourcePreviewParameterProvider.kt diff --git a/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/model/FollowableTopic.kt b/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/model/FollowableTopic.kt index 121f83098..7b59df412 100644 --- a/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/model/FollowableTopic.kt +++ b/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/model/FollowableTopic.kt @@ -17,7 +17,6 @@ package com.google.samples.apps.nowinandroid.core.domain.model import com.google.samples.apps.nowinandroid.core.model.data.Topic -import com.google.samples.apps.nowinandroid.core.model.data.previewTopics /** * A [topic] with the additional information for whether or not it is followed. @@ -26,18 +25,3 @@ data class FollowableTopic( // TODO consider changing to UserTopic and flattenin val topic: Topic, val isFollowed: Boolean, ) - -val previewFollowableTopics = listOf( - FollowableTopic( - previewTopics[0], - isFollowed = false, - ), - FollowableTopic( - previewTopics[1], - isFollowed = true, - ), - FollowableTopic( - previewTopics[2], - isFollowed = false, - ), -) diff --git a/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/model/UserNewsResource.kt b/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/model/UserNewsResource.kt index 7cf511c60..4e12ec95b 100644 --- a/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/model/UserNewsResource.kt +++ b/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/model/UserNewsResource.kt @@ -18,16 +18,8 @@ package com.google.samples.apps.nowinandroid.core.domain.model import com.google.samples.apps.nowinandroid.core.model.data.NewsResource import com.google.samples.apps.nowinandroid.core.model.data.NewsResourceType -import com.google.samples.apps.nowinandroid.core.model.data.NewsResourceType.Codelab -import com.google.samples.apps.nowinandroid.core.model.data.NewsResourceType.Unknown -import com.google.samples.apps.nowinandroid.core.model.data.NewsResourceType.Video import com.google.samples.apps.nowinandroid.core.model.data.UserData import kotlinx.datetime.Instant -import kotlinx.datetime.LocalDateTime -import kotlinx.datetime.TimeZone -import kotlinx.datetime.toInstant - -/* ktlint-disable max-line-length */ /** * A [NewsResource] with additional user information such as whether the user is following the @@ -65,65 +57,3 @@ data class UserNewsResource internal constructor( fun List.mapToUserNewsResources(userData: UserData): List { return map { UserNewsResource(it, userData) } } - -val previewUserNewsResources = listOf( - UserNewsResource( - id = "1", - title = "Android Basics with Compose", - content = "We released the first two units of Android Basics with Compose, our first free course that teaches Android Development with Jetpack Compose to anyone; you do not need any prior programming experience other than basic computer literacy to get started. You’ll learn the fundamentals of programming in Kotlin while building Android apps using Jetpack Compose, Android’s modern toolkit that simplifies and accelerates native UI development. These two units are just the beginning; more will be coming soon. Check out Android Basics with Compose to get started on your Android development journey", - url = "https://android-developers.googleblog.com/2022/05/new-android-basics-with-compose-course.html", - headerImageUrl = "https://developer.android.com/images/hero-assets/android-basics-compose.svg", - publishDate = LocalDateTime( - year = 2022, - monthNumber = 5, - dayOfMonth = 4, - hour = 23, - minute = 0, - second = 0, - nanosecond = 0, - ).toInstant(TimeZone.UTC), - type = Codelab, - followableTopics = listOf(previewFollowableTopics[1]), - isSaved = true, - ), - UserNewsResource( - id = "2", - title = "Thanks for helping us reach 1M YouTube Subscribers", - content = "Thank you everyone for following the Now in Android series and everything the " + - "Android Developers YouTube channel has to offer. During the Android Developer " + - "Summit, our YouTube channel reached 1 million subscribers! Here’s a small video to " + - "thank you all.", - url = "https://youtu.be/-fJ6poHQrjM", - headerImageUrl = "https://i.ytimg.com/vi/-fJ6poHQrjM/maxresdefault.jpg", - publishDate = Instant.parse("2021-11-09T00:00:00.000Z"), - type = Video, - followableTopics = listOf(previewFollowableTopics[0], previewFollowableTopics[1]), - isSaved = false, - ), - UserNewsResource( - id = "3", - title = "Transformations and customisations in the Paging Library", - content = "A demonstration of different operations that can be performed " + - "with Paging. Transformations like inserting separators, when to " + - "create a new pager, and customisation options for consuming " + - "PagingData.", - url = "https://youtu.be/ZARz0pjm5YM", - headerImageUrl = "https://i.ytimg.com/vi/ZARz0pjm5YM/maxresdefault.jpg", - publishDate = Instant.parse("2021-11-01T00:00:00.000Z"), - type = Video, - followableTopics = listOf(previewFollowableTopics[2]), - isSaved = false, - ), - UserNewsResource( - id = "4", - title = "New Jetpack Release", - content = "New Jetpack release includes updates to libraries such as CameraX, Benchmark, and" + - "more!", - url = "https://developer.android.com/jetpack/androidx/versions/all-channel", - headerImageUrl = "", - publishDate = Instant.parse("2022-10-01T00:00:00.000Z"), - type = Unknown, - followableTopics = listOf(previewFollowableTopics[2]), - isSaved = true, - ), -) diff --git a/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/NewsResource.kt b/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/NewsResource.kt index 2f60ca43b..a1d4deb65 100644 --- a/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/NewsResource.kt +++ b/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/NewsResource.kt @@ -16,15 +16,7 @@ package com.google.samples.apps.nowinandroid.core.model.data -import com.google.samples.apps.nowinandroid.core.model.data.NewsResourceType.Codelab -import com.google.samples.apps.nowinandroid.core.model.data.NewsResourceType.Unknown -import com.google.samples.apps.nowinandroid.core.model.data.NewsResourceType.Video import kotlinx.datetime.Instant -import kotlinx.datetime.LocalDateTime -import kotlinx.datetime.TimeZone -import kotlinx.datetime.toInstant - -/* ktlint-disable max-line-length */ /** * External data layer representation of a fully populated NiA news resource @@ -39,61 +31,3 @@ data class NewsResource( val type: NewsResourceType, val topics: List, ) - -val previewNewsResources = listOf( - NewsResource( - id = "1", - title = "Android Basics with Compose", - content = "We released the first two units of Android Basics with Compose, our first free course that teaches Android Development with Jetpack Compose to anyone; you do not need any prior programming experience other than basic computer literacy to get started. You’ll learn the fundamentals of programming in Kotlin while building Android apps using Jetpack Compose, Android’s modern toolkit that simplifies and accelerates native UI development. These two units are just the beginning; more will be coming soon. Check out Android Basics with Compose to get started on your Android development journey", - url = "https://android-developers.googleblog.com/2022/05/new-android-basics-with-compose-course.html", - headerImageUrl = "https://developer.android.com/images/hero-assets/android-basics-compose.svg", - publishDate = LocalDateTime( - year = 2022, - monthNumber = 5, - dayOfMonth = 4, - hour = 23, - minute = 0, - second = 0, - nanosecond = 0, - ).toInstant(TimeZone.UTC), - type = Codelab, - topics = listOf(previewTopics[1]), - ), - NewsResource( - id = "2", - title = "Thanks for helping us reach 1M YouTube Subscribers", - content = "Thank you everyone for following the Now in Android series and everything the " + - "Android Developers YouTube channel has to offer. During the Android Developer " + - "Summit, our YouTube channel reached 1 million subscribers! Here’s a small video to " + - "thank you all.", - url = "https://youtu.be/-fJ6poHQrjM", - headerImageUrl = "https://i.ytimg.com/vi/-fJ6poHQrjM/maxresdefault.jpg", - publishDate = Instant.parse("2021-11-09T00:00:00.000Z"), - type = Video, - topics = listOf(previewTopics[0], previewTopics[1]), - ), - NewsResource( - id = "3", - title = "Transformations and customisations in the Paging Library", - content = "A demonstration of different operations that can be performed " + - "with Paging. Transformations like inserting separators, when to " + - "create a new pager, and customisation options for consuming " + - "PagingData.", - url = "https://youtu.be/ZARz0pjm5YM", - headerImageUrl = "https://i.ytimg.com/vi/ZARz0pjm5YM/maxresdefault.jpg", - publishDate = Instant.parse("2021-11-01T00:00:00.000Z"), - type = Video, - topics = listOf(previewTopics[2]), - ), - NewsResource( - id = "4", - title = "New Jetpack Release", - content = "New Jetpack release includes updates to libraries such as CameraX, Benchmark, and" + - "more!", - url = "https://developer.android.com/jetpack/androidx/versions/all-channel", - headerImageUrl = "", - publishDate = Instant.parse("2022-10-01T00:00:00.000Z"), - type = Unknown, - topics = listOf(previewTopics[2]), - ), -) diff --git a/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/Topic.kt b/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/Topic.kt index 03c184e0d..cc45937b6 100644 --- a/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/Topic.kt +++ b/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/Topic.kt @@ -16,8 +16,6 @@ package com.google.samples.apps.nowinandroid.core.model.data -/* ktlint-disable max-line-length */ - /** * External data layer representation of a NiA Topic */ @@ -29,30 +27,3 @@ data class Topic( val url: String, val imageUrl: String, ) - -val previewTopics = listOf( - Topic( - id = "2", - name = "Headlines", - shortDescription = "News we want everyone to see", - longDescription = "Stay up to date with the latest events and announcements from Android!", - imageUrl = "https://firebasestorage.googleapis.com/v0/b/now-in-android.appspot.com/o/img%2Fic_topic_Headlines.svg?alt=media&token=506faab0-617a-4668-9e63-4a2fb996603f", - url = "", - ), - Topic( - id = "3", - name = "UI", - shortDescription = "Material Design, Navigation, Text, Paging, Accessibility (a11y), Internationalization (i18n), Localization (l10n), Animations, Large Screens, Widgets", - longDescription = "Learn how to optimize your app's user interface - everything that users can see and interact with. Stay up to date on tocpis such as Material Design, Navigation, Text, Paging, Compose, Accessibility (a11y), Internationalization (i18n), Localization (l10n), Animations, Large Screens, Widgets, and many more!", - imageUrl = "https://firebasestorage.googleapis.com/v0/b/now-in-android.appspot.com/o/img%2Fic_topic_UI.svg?alt=media&token=0ee1842b-12e8-435f-87ba-a5bb02c47594", - url = "", - ), - Topic( - id = "4", - name = "Testing", - shortDescription = "CI, Espresso, TestLab, etc", - longDescription = "Testing is an integral part of the app development process. By running tests against your app consistently, you can verify your app's correctness, functional behavior, and usability before you release it publicly. Stay up to date on the latest tricks in CI, Espresso, and Firebase TestLab.", - imageUrl = "https://firebasestorage.googleapis.com/v0/b/now-in-android.appspot.com/o/img%2Fic_topic_Testing.svg?alt=media&token=a11533c4-7cc8-4b11-91a3-806158ebf428", - url = "", - ), -) diff --git a/core/testing/build.gradle.kts b/core/testing/build.gradle.kts index 5c5740eee..5e0c3e409 100644 --- a/core/testing/build.gradle.kts +++ b/core/testing/build.gradle.kts @@ -26,8 +26,11 @@ android { dependencies { implementation(project(":core:common")) implementation(project(":core:data")) + implementation(project(":core:domain")) implementation(project(":core:model")) + implementation(libs.kotlinx.datetime) + api(libs.junit4) api(libs.androidx.test.core) api(libs.kotlinx.coroutines.test) diff --git a/core/testing/src/main/java/com/google/samples/apps/nowinandroid/core/testing/data/FollowableTopicTestData.kt b/core/testing/src/main/java/com/google/samples/apps/nowinandroid/core/testing/data/FollowableTopicTestData.kt new file mode 100644 index 000000000..40e9327d3 --- /dev/null +++ b/core/testing/src/main/java/com/google/samples/apps/nowinandroid/core/testing/data/FollowableTopicTestData.kt @@ -0,0 +1,57 @@ +/* + * Copyright 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.samples.apps.nowinandroid.core.testing.data + +import com.google.samples.apps.nowinandroid.core.domain.model.FollowableTopic +import com.google.samples.apps.nowinandroid.core.model.data.Topic + +/* ktlint-disable max-line-length */ +val followableTopicTestData: List = listOf( + FollowableTopic( + topic = Topic( + id = "2", + name = "Headlines", + shortDescription = "News we want everyone to see", + longDescription = "Stay up to date with the latest events and announcements from Android!", + imageUrl = "https://firebasestorage.googleapis.com/v0/b/now-in-android.appspot.com/o/img%2Fic_topic_Headlines.svg?alt=media&token=506faab0-617a-4668-9e63-4a2fb996603f", + url = "", + ), + isFollowed = false, + ), + FollowableTopic( + topic = Topic( + id = "3", + name = "UI", + shortDescription = "Material Design, Navigation, Text, Paging, Accessibility (a11y), Internationalization (i18n), Localization (l10n), Animations, Large Screens, Widgets", + longDescription = "Learn how to optimize your app's user interface - everything that users can see and interact with. Stay up to date on tocpis such as Material Design, Navigation, Text, Paging, Compose, Accessibility (a11y), Internationalization (i18n), Localization (l10n), Animations, Large Screens, Widgets, and many more!", + imageUrl = "https://firebasestorage.googleapis.com/v0/b/now-in-android.appspot.com/o/img%2Fic_topic_UI.svg?alt=media&token=0ee1842b-12e8-435f-87ba-a5bb02c47594", + url = "", + ), + isFollowed = true, + ), + FollowableTopic( + topic = Topic( + id = "4", + name = "Testing", + shortDescription = "CI, Espresso, TestLab, etc", + longDescription = "Testing is an integral part of the app development process. By running tests against your app consistently, you can verify your app's correctness, functional behavior, and usability before you release it publicly. Stay up to date on the latest tricks in CI, Espresso, and Firebase TestLab.", + imageUrl = "https://firebasestorage.googleapis.com/v0/b/now-in-android.appspot.com/o/img%2Fic_topic_Testing.svg?alt=media&token=a11533c4-7cc8-4b11-91a3-806158ebf428", + url = "", + ), + isFollowed = false, + ), +) diff --git a/core/testing/src/main/java/com/google/samples/apps/nowinandroid/core/testing/data/NewsResourcesTestData.kt b/core/testing/src/main/java/com/google/samples/apps/nowinandroid/core/testing/data/NewsResourcesTestData.kt new file mode 100644 index 000000000..bffa7cb79 --- /dev/null +++ b/core/testing/src/main/java/com/google/samples/apps/nowinandroid/core/testing/data/NewsResourcesTestData.kt @@ -0,0 +1,74 @@ +/* + * 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 + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.samples.apps.nowinandroid.core.testing.data + +import com.google.samples.apps.nowinandroid.core.model.data.NewsResource +import com.google.samples.apps.nowinandroid.core.model.data.NewsResourceType.Codelab +import com.google.samples.apps.nowinandroid.core.model.data.NewsResourceType.Unknown +import com.google.samples.apps.nowinandroid.core.model.data.NewsResourceType.Video +import kotlinx.datetime.Instant + +/* ktlint-disable max-line-length */ +val newsResourcesTestData: List = listOf( + NewsResource( + id = "1", + title = "Android Basics with Compose", + content = "We released the first two units of Android Basics with Compose, our first free course that teaches Android Development with Jetpack Compose to anyone; you do not need any prior programming experience other than basic computer literacy to get started. You’ll learn the fundamentals of programming in Kotlin while building Android apps using Jetpack Compose, Android’s modern toolkit that simplifies and accelerates native UI development. These two units are just the beginning; more will be coming soon. Check out Android Basics with Compose to get started on your Android development journey", + url = "https://android-developers.googleblog.com/2022/05/new-android-basics-with-compose-course.html", + headerImageUrl = "https://developer.android.com/images/hero-assets/android-basics-compose.svg", + publishDate = Instant.parse("2021-11-09T00:00:00.000Z"), + type = Codelab, + topics = listOf(topicsTestData[1]), + ), + NewsResource( + id = "2", + title = "Thanks for helping us reach 1M YouTube Subscribers", + content = "Thank you everyone for following the Now in Android series and everything the " + + "Android Developers YouTube channel has to offer. During the Android Developer " + + "Summit, our YouTube channel reached 1 million subscribers! Here’s a small video to " + + "thank you all.", + url = "https://youtu.be/-fJ6poHQrjM", + headerImageUrl = "https://i.ytimg.com/vi/-fJ6poHQrjM/maxresdefault.jpg", + publishDate = Instant.parse("2021-11-09T00:00:00.000Z"), + type = Video, + topics = listOf(topicsTestData[0], topicsTestData[1]), + ), + NewsResource( + id = "3", + title = "Transformations and customisations in the Paging Library", + content = "A demonstration of different operations that can be performed " + + "with Paging. Transformations like inserting separators, when to " + + "create a new pager, and customisation options for consuming " + + "PagingData.", + url = "https://youtu.be/ZARz0pjm5YM", + headerImageUrl = "https://i.ytimg.com/vi/ZARz0pjm5YM/maxresdefault.jpg", + publishDate = Instant.parse("2021-11-01T00:00:00.000Z"), + type = Video, + topics = listOf(topicsTestData[2]), + ), + NewsResource( + id = "4", + title = "New Jetpack Release", + content = "New Jetpack release includes updates to libraries such as CameraX, Benchmark, and" + + "more!", + url = "https://developer.android.com/jetpack/androidx/versions/all-channel", + headerImageUrl = "", + publishDate = Instant.parse("2022-10-01T00:00:00.000Z"), + type = Unknown, + topics = listOf(topicsTestData[2]), + ), +) diff --git a/core/testing/src/main/java/com/google/samples/apps/nowinandroid/core/testing/data/TopicsTestData.kt b/core/testing/src/main/java/com/google/samples/apps/nowinandroid/core/testing/data/TopicsTestData.kt new file mode 100644 index 000000000..eb0bd9e61 --- /dev/null +++ b/core/testing/src/main/java/com/google/samples/apps/nowinandroid/core/testing/data/TopicsTestData.kt @@ -0,0 +1,47 @@ +/* + * 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 + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.samples.apps.nowinandroid.core.testing.data + +import com.google.samples.apps.nowinandroid.core.model.data.Topic + +/* ktlint-disable max-line-length */ +val topicsTestData: List = listOf( + Topic( + id = "2", + name = "Headlines", + shortDescription = "News we want everyone to see", + longDescription = "Stay up to date with the latest events and announcements from Android!", + imageUrl = "https://firebasestorage.googleapis.com/v0/b/now-in-android.appspot.com/o/img%2Fic_topic_Headlines.svg?alt=media&token=506faab0-617a-4668-9e63-4a2fb996603f", + url = "", + ), + Topic( + id = "3", + name = "UI", + shortDescription = "Material Design, Navigation, Text, Paging, Accessibility (a11y), Internationalization (i18n), Localization (l10n), Animations, Large Screens, Widgets", + longDescription = "Learn how to optimize your app's user interface - everything that users can see and interact with. Stay up to date on tocpis such as Material Design, Navigation, Text, Paging, Compose, Accessibility (a11y), Internationalization (i18n), Localization (l10n), Animations, Large Screens, Widgets, and many more!", + imageUrl = "https://firebasestorage.googleapis.com/v0/b/now-in-android.appspot.com/o/img%2Fic_topic_UI.svg?alt=media&token=0ee1842b-12e8-435f-87ba-a5bb02c47594", + url = "", + ), + Topic( + id = "4", + name = "Testing", + shortDescription = "CI, Espresso, TestLab, etc", + longDescription = "Testing is an integral part of the app development process. By running tests against your app consistently, you can verify your app's correctness, functional behavior, and usability before you release it publicly. Stay up to date on the latest tricks in CI, Espresso, and Firebase TestLab.", + imageUrl = "https://firebasestorage.googleapis.com/v0/b/now-in-android.appspot.com/o/img%2Fic_topic_Testing.svg?alt=media&token=a11533c4-7cc8-4b11-91a3-806158ebf428", + url = "", + ), +) diff --git a/core/testing/src/main/java/com/google/samples/apps/nowinandroid/core/testing/data/UserNewsResourcesTestData.kt b/core/testing/src/main/java/com/google/samples/apps/nowinandroid/core/testing/data/UserNewsResourcesTestData.kt new file mode 100644 index 000000000..381160006 --- /dev/null +++ b/core/testing/src/main/java/com/google/samples/apps/nowinandroid/core/testing/data/UserNewsResourcesTestData.kt @@ -0,0 +1,108 @@ +/* + * Copyright 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.samples.apps.nowinandroid.core.testing.data + +import com.google.samples.apps.nowinandroid.core.domain.model.UserNewsResource +import com.google.samples.apps.nowinandroid.core.model.data.DarkThemeConfig +import com.google.samples.apps.nowinandroid.core.model.data.NewsResource +import com.google.samples.apps.nowinandroid.core.model.data.NewsResourceType +import com.google.samples.apps.nowinandroid.core.model.data.ThemeBrand +import com.google.samples.apps.nowinandroid.core.model.data.UserData +import kotlinx.datetime.Instant +import kotlinx.datetime.LocalDateTime +import kotlinx.datetime.TimeZone +import kotlinx.datetime.toInstant + +/* ktlint-disable max-line-length */ +val userNewsResourcesTestData: List = UserData( + bookmarkedNewsResources = setOf("1", "4"), + followedTopics = emptySet(), + themeBrand = ThemeBrand.ANDROID, + darkThemeConfig = DarkThemeConfig.DARK, + shouldHideOnboarding = true, + useDynamicColor = false, +).let { userData -> + listOf( + UserNewsResource( + newsResource = NewsResource( + id = "1", + title = "Android Basics with Compose", + content = "We released the first two units of Android Basics with Compose, our first free course that teaches Android Development with Jetpack Compose to anyone; you do not need any prior programming experience other than basic computer literacy to get started. You’ll learn the fundamentals of programming in Kotlin while building Android apps using Jetpack Compose, Android’s modern toolkit that simplifies and accelerates native UI development. These two units are just the beginning; more will be coming soon. Check out Android Basics with Compose to get started on your Android development journey", + url = "https://android-developers.googleblog.com/2022/05/new-android-basics-with-compose-course.html", + headerImageUrl = "https://developer.android.com/images/hero-assets/android-basics-compose.svg", + publishDate = LocalDateTime( + year = 2022, + monthNumber = 5, + dayOfMonth = 4, + hour = 23, + minute = 0, + second = 0, + nanosecond = 0, + ).toInstant(TimeZone.UTC), + type = NewsResourceType.Codelab, + topics = listOf(topicsTestData[2]), + ), + userData = userData, + ), + UserNewsResource( + newsResource = NewsResource( + id = "2", + title = "Thanks for helping us reach 1M YouTube Subscribers", + content = "Thank you everyone for following the Now in Android series and everything the " + + "Android Developers YouTube channel has to offer. During the Android Developer " + + "Summit, our YouTube channel reached 1 million subscribers! Here’s a small video to " + + "thank you all.", + url = "https://youtu.be/-fJ6poHQrjM", + headerImageUrl = "https://i.ytimg.com/vi/-fJ6poHQrjM/maxresdefault.jpg", + publishDate = Instant.parse("2021-11-09T00:00:00.000Z"), + type = NewsResourceType.Video, + topics = topicsTestData.take(2), + ), + userData = userData, + ), + UserNewsResource( + newsResource = NewsResource( + id = "3", + title = "Transformations and customisations in the Paging Library", + content = "A demonstration of different operations that can be performed " + + "with Paging. Transformations like inserting separators, when to " + + "create a new pager, and customisation options for consuming " + + "PagingData.", + url = "https://youtu.be/ZARz0pjm5YM", + headerImageUrl = "https://i.ytimg.com/vi/ZARz0pjm5YM/maxresdefault.jpg", + publishDate = Instant.parse("2021-11-01T00:00:00.000Z"), + type = NewsResourceType.Video, + topics = listOf(topicsTestData[2]), + ), + userData = userData, + ), + UserNewsResource( + newsResource = NewsResource( + id = "4", + title = "New Jetpack Release", + content = "New Jetpack release includes updates to libraries such as CameraX, Benchmark, and" + + "more!", + url = "https://developer.android.com/jetpack/androidx/versions/all-channel", + headerImageUrl = "", + publishDate = Instant.parse("2022-10-01T00:00:00.000Z"), + type = NewsResourceType.Unknown, + topics = listOf(topicsTestData[2]), + ), + userData = userData, + ), + ) +} diff --git a/core/ui/src/androidTest/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCardTest.kt b/core/ui/src/androidTest/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCardTest.kt index ddcd2644e..927ccfa28 100644 --- a/core/ui/src/androidTest/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCardTest.kt +++ b/core/ui/src/androidTest/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCardTest.kt @@ -21,8 +21,8 @@ import androidx.compose.ui.test.assertContentDescriptionEquals import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.junit4.createAndroidComposeRule import androidx.compose.ui.test.onNodeWithText -import com.google.samples.apps.nowinandroid.core.domain.model.previewFollowableTopics -import com.google.samples.apps.nowinandroid.core.domain.model.previewUserNewsResources +import com.google.samples.apps.nowinandroid.core.testing.data.followableTopicTestData +import com.google.samples.apps.nowinandroid.core.testing.data.userNewsResourcesTestData import org.junit.Rule import org.junit.Test @@ -32,7 +32,7 @@ class NewsResourceCardTest { @Test fun testMetaDataDisplay_withCodelabResource() { - val newsWithKnownResourceType = previewUserNewsResources[0] + val newsWithKnownResourceType = userNewsResourcesTestData[0] var dateFormatted = "" composeTestRule.setContent { @@ -59,7 +59,7 @@ class NewsResourceCardTest { @Test fun testMetaDataDisplay_withUnknownResource() { - val newsWithUnknownResourceType = previewUserNewsResources[3] + val newsWithUnknownResourceType = userNewsResourcesTestData[3] var dateFormatted = "" composeTestRule.setContent { @@ -81,10 +81,10 @@ class NewsResourceCardTest { @Test fun testTopicsChipColorBackground_matchesFollowedState() { composeTestRule.setContent { - NewsResourceTopics(topics = previewFollowableTopics) + NewsResourceTopics(topics = followableTopicTestData) } - for (followableTopic in previewFollowableTopics) { + for (followableTopic in followableTopicTestData) { val topicName = followableTopic.topic.name val expectedContentDescription = if (followableTopic.isFollowed) { "$topicName is followed" diff --git a/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/FollowableTopicPreviewParameterProvider.kt b/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/FollowableTopicPreviewParameterProvider.kt new file mode 100644 index 000000000..3c83b973c --- /dev/null +++ b/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/FollowableTopicPreviewParameterProvider.kt @@ -0,0 +1,67 @@ +/* + * Copyright 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.samples.apps.nowinandroid.core.ui + +import androidx.compose.ui.tooling.preview.PreviewParameterProvider +import com.google.samples.apps.nowinandroid.core.domain.model.FollowableTopic +import com.google.samples.apps.nowinandroid.core.model.data.Topic + +/* ktlint-disable max-line-length */ +/** + * This [PreviewParameterProvider](https://developer.android.com/reference/kotlin/androidx/compose/ui/tooling/preview/PreviewParameterProvider) + * provides list of [FollowableTopic] for Composable previews. + */ +class FollowableTopicPreviewParameterProvider : PreviewParameterProvider> { + override val values: Sequence> + get() = sequenceOf( + listOf( + FollowableTopic( + topic = Topic( + id = "2", + name = "Headlines", + shortDescription = "News we want everyone to see", + longDescription = "Stay up to date with the latest events and announcements from Android!", + imageUrl = "https://firebasestorage.googleapis.com/v0/b/now-in-android.appspot.com/o/img%2Fic_topic_Headlines.svg?alt=media&token=506faab0-617a-4668-9e63-4a2fb996603f", + url = "", + ), + isFollowed = false, + ), + FollowableTopic( + topic = Topic( + id = "3", + name = "UI", + shortDescription = "Material Design, Navigation, Text, Paging, Accessibility (a11y), Internationalization (i18n), Localization (l10n), Animations, Large Screens, Widgets", + longDescription = "Learn how to optimize your app's user interface - everything that users can see and interact with. Stay up to date on tocpis such as Material Design, Navigation, Text, Paging, Compose, Accessibility (a11y), Internationalization (i18n), Localization (l10n), Animations, Large Screens, Widgets, and many more!", + imageUrl = "https://firebasestorage.googleapis.com/v0/b/now-in-android.appspot.com/o/img%2Fic_topic_UI.svg?alt=media&token=0ee1842b-12e8-435f-87ba-a5bb02c47594", + url = "", + ), + isFollowed = true, + ), + FollowableTopic( + topic = Topic( + id = "4", + name = "Testing", + shortDescription = "CI, Espresso, TestLab, etc", + longDescription = "Testing is an integral part of the app development process. By running tests against your app consistently, you can verify your app's correctness, functional behavior, and usability before you release it publicly. Stay up to date on the latest tricks in CI, Espresso, and Firebase TestLab.", + imageUrl = "https://firebasestorage.googleapis.com/v0/b/now-in-android.appspot.com/o/img%2Fic_topic_Testing.svg?alt=media&token=a11533c4-7cc8-4b11-91a3-806158ebf428", + url = "", + ), + isFollowed = false, + ), + ), + ) +} diff --git a/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsFeed.kt b/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsFeed.kt index bbff34e40..73c1a21e4 100644 --- a/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsFeed.kt +++ b/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsFeed.kt @@ -35,10 +35,10 @@ import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.tooling.preview.Devices import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp import com.google.samples.apps.nowinandroid.core.designsystem.theme.NiaTheme import com.google.samples.apps.nowinandroid.core.domain.model.UserNewsResource -import com.google.samples.apps.nowinandroid.core.domain.model.previewUserNewsResources /** * An extension on [LazyListScope] defining a feed with news resources. @@ -120,13 +120,14 @@ private fun NewsFeedLoadingPreview() { @Preview @Preview(device = Devices.TABLET) @Composable -private fun NewsFeedContentPreview() { +private fun NewsFeedContentPreview( + @PreviewParameter(UserNewsResourcePreviewParameterProvider::class) + userNewsResources: List, +) { NiaTheme { LazyVerticalGrid(columns = GridCells.Adaptive(300.dp)) { newsFeed( - feedState = NewsFeedUiState.Success( - previewUserNewsResources, - ), + feedState = NewsFeedUiState.Success(userNewsResources), onNewsResourcesCheckedChanged = { _, _ -> }, ) } diff --git a/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCard.kt b/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCard.kt index f2ec186e7..ae6cadbfa 100644 --- a/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCard.kt +++ b/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCard.kt @@ -50,6 +50,7 @@ import androidx.compose.ui.semantics.contentDescription import androidx.compose.ui.semantics.onClick import androidx.compose.ui.semantics.semantics import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp import coil.compose.AsyncImage import com.google.samples.apps.nowinandroid.core.designsystem.component.NiaIconToggleButton @@ -58,7 +59,6 @@ import com.google.samples.apps.nowinandroid.core.designsystem.icon.NiaIcons import com.google.samples.apps.nowinandroid.core.designsystem.theme.NiaTheme import com.google.samples.apps.nowinandroid.core.domain.model.FollowableTopic import com.google.samples.apps.nowinandroid.core.domain.model.UserNewsResource -import com.google.samples.apps.nowinandroid.core.domain.model.previewUserNewsResources import com.google.samples.apps.nowinandroid.core.model.data.NewsResource import com.google.samples.apps.nowinandroid.core.model.data.NewsResourceType import kotlinx.datetime.Instant @@ -297,11 +297,14 @@ private fun BookmarkButtonBookmarkedPreview() { @Preview("NewsResourceCardExpanded") @Composable -private fun ExpandedNewsResourcePreview() { +private fun ExpandedNewsResourcePreview( + @PreviewParameter(UserNewsResourcePreviewParameterProvider::class) + userNewsResources: List, +) { NiaTheme { Surface { NewsResourceCardExpanded( - userNewsResource = previewUserNewsResources[0], + userNewsResource = userNewsResources[0], isBookmarked = true, onToggleBookmark = {}, onClick = {}, diff --git a/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/UserNewsResourcePreviewParameterProvider.kt b/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/UserNewsResourcePreviewParameterProvider.kt new file mode 100644 index 000000000..e32aa1a57 --- /dev/null +++ b/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/UserNewsResourcePreviewParameterProvider.kt @@ -0,0 +1,135 @@ +/* + * Copyright 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.samples.apps.nowinandroid.core.ui + +import androidx.compose.ui.tooling.preview.PreviewParameterProvider +import com.google.samples.apps.nowinandroid.core.domain.model.UserNewsResource +import com.google.samples.apps.nowinandroid.core.model.data.DarkThemeConfig +import com.google.samples.apps.nowinandroid.core.model.data.NewsResource +import com.google.samples.apps.nowinandroid.core.model.data.NewsResourceType +import com.google.samples.apps.nowinandroid.core.model.data.NewsResourceType.Video +import com.google.samples.apps.nowinandroid.core.model.data.ThemeBrand +import com.google.samples.apps.nowinandroid.core.model.data.Topic +import com.google.samples.apps.nowinandroid.core.model.data.UserData +import kotlinx.datetime.Instant +import kotlinx.datetime.LocalDateTime +import kotlinx.datetime.TimeZone +import kotlinx.datetime.toInstant + +/* ktlint-disable max-line-length */ +/** + * This [PreviewParameterProvider](https://developer.android.com/reference/kotlin/androidx/compose/ui/tooling/preview/PreviewParameterProvider) + * provides list of [UserNewsResource] for Composable previews. + */ +class UserNewsResourcePreviewParameterProvider : PreviewParameterProvider> { + override val values: Sequence> + get() { + val userData: UserData = UserData( + bookmarkedNewsResources = setOf("1", "3"), + followedTopics = emptySet(), + themeBrand = ThemeBrand.ANDROID, + darkThemeConfig = DarkThemeConfig.DARK, + shouldHideOnboarding = true, + useDynamicColor = false, + ) + + val topics = listOf( + Topic( + id = "2", + name = "Headlines", + shortDescription = "News we want everyone to see", + longDescription = "Stay up to date with the latest events and announcements from Android!", + imageUrl = "https://firebasestorage.googleapis.com/v0/b/now-in-android.appspot.com/o/img%2Fic_topic_Headlines.svg?alt=media&token=506faab0-617a-4668-9e63-4a2fb996603f", + url = "", + ), + Topic( + id = "3", + name = "UI", + shortDescription = "Material Design, Navigation, Text, Paging, Accessibility (a11y), Internationalization (i18n), Localization (l10n), Animations, Large Screens, Widgets", + longDescription = "Learn how to optimize your app's user interface - everything that users can see and interact with. Stay up to date on tocpis such as Material Design, Navigation, Text, Paging, Compose, Accessibility (a11y), Internationalization (i18n), Localization (l10n), Animations, Large Screens, Widgets, and many more!", + imageUrl = "https://firebasestorage.googleapis.com/v0/b/now-in-android.appspot.com/o/img%2Fic_topic_UI.svg?alt=media&token=0ee1842b-12e8-435f-87ba-a5bb02c47594", + url = "", + ), + Topic( + id = "4", + name = "Testing", + shortDescription = "CI, Espresso, TestLab, etc", + longDescription = "Testing is an integral part of the app development process. By running tests against your app consistently, you can verify your app's correctness, functional behavior, and usability before you release it publicly. Stay up to date on the latest tricks in CI, Espresso, and Firebase TestLab.", + imageUrl = "https://firebasestorage.googleapis.com/v0/b/now-in-android.appspot.com/o/img%2Fic_topic_Testing.svg?alt=media&token=a11533c4-7cc8-4b11-91a3-806158ebf428", + url = "", + ), + ) + + return sequenceOf( + listOf( + UserNewsResource( + newsResource = NewsResource( + id = "1", + title = "Android Basics with Compose", + content = "We released the first two units of Android Basics with Compose, our first free course that teaches Android Development with Jetpack Compose to anyone; you do not need any prior programming experience other than basic computer literacy to get started. You’ll learn the fundamentals of programming in Kotlin while building Android apps using Jetpack Compose, Android’s modern toolkit that simplifies and accelerates native UI development. These two units are just the beginning; more will be coming soon. Check out Android Basics with Compose to get started on your Android development journey", + url = "https://android-developers.googleblog.com/2022/05/new-android-basics-with-compose-course.html", + headerImageUrl = "https://developer.android.com/images/hero-assets/android-basics-compose.svg", + publishDate = LocalDateTime( + year = 2022, + monthNumber = 5, + dayOfMonth = 4, + hour = 23, + minute = 0, + second = 0, + nanosecond = 0, + ).toInstant(TimeZone.UTC), + type = NewsResourceType.Codelab, + topics = listOf(topics[2]), + ), + userData = userData, + ), + UserNewsResource( + newsResource = NewsResource( + id = "2", + title = "Thanks for helping us reach 1M YouTube Subscribers", + content = "Thank you everyone for following the Now in Android series and everything the " + + "Android Developers YouTube channel has to offer. During the Android Developer " + + "Summit, our YouTube channel reached 1 million subscribers! Here’s a small video to " + + "thank you all.", + url = "https://youtu.be/-fJ6poHQrjM", + headerImageUrl = "https://i.ytimg.com/vi/-fJ6poHQrjM/maxresdefault.jpg", + publishDate = Instant.parse("2021-11-09T00:00:00.000Z"), + type = Video, + topics = topics.take(2), + ), + userData = userData, + ), + UserNewsResource( + newsResource = NewsResource( + id = "3", + title = "Transformations and customisations in the Paging Library", + content = "A demonstration of different operations that can be performed " + + "with Paging. Transformations like inserting separators, when to " + + "create a new pager, and customisation options for consuming " + + "PagingData.", + url = "https://youtu.be/ZARz0pjm5YM", + headerImageUrl = "https://i.ytimg.com/vi/ZARz0pjm5YM/maxresdefault.jpg", + publishDate = Instant.parse("2021-11-01T00:00:00.000Z"), + type = Video, + topics = listOf(topics[2]), + ), + userData = userData, + ), + ), + ) + } +} diff --git a/feature/bookmarks/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreenTest.kt b/feature/bookmarks/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreenTest.kt index 08d4f6c06..f9faca080 100644 --- a/feature/bookmarks/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreenTest.kt +++ b/feature/bookmarks/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreenTest.kt @@ -30,7 +30,7 @@ import androidx.compose.ui.test.onNodeWithContentDescription import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick import androidx.compose.ui.test.performScrollToNode -import com.google.samples.apps.nowinandroid.core.domain.model.previewUserNewsResources +import com.google.samples.apps.nowinandroid.core.testing.data.userNewsResourcesTestData import com.google.samples.apps.nowinandroid.core.ui.NewsFeedUiState import org.junit.Rule import org.junit.Test @@ -66,7 +66,7 @@ class BookmarksScreenTest { composeTestRule.setContent { BookmarksScreen( feedState = NewsFeedUiState.Success( - previewUserNewsResources.take(2), + userNewsResourcesTestData.take(2), ), removeFromBookmarks = { }, ) @@ -74,7 +74,7 @@ class BookmarksScreenTest { composeTestRule .onNodeWithText( - previewUserNewsResources[0].title, + userNewsResourcesTestData[0].title, substring = true, ) .assertExists() @@ -83,14 +83,14 @@ class BookmarksScreenTest { composeTestRule.onNode(hasScrollToNodeAction()) .performScrollToNode( hasText( - previewUserNewsResources[1].title, + userNewsResourcesTestData[1].title, substring = true, ), ) composeTestRule .onNodeWithText( - previewUserNewsResources[1].title, + userNewsResourcesTestData[1].title, substring = true, ) .assertExists() @@ -104,10 +104,10 @@ class BookmarksScreenTest { composeTestRule.setContent { BookmarksScreen( feedState = NewsFeedUiState.Success( - previewUserNewsResources.take(2), + userNewsResourcesTestData.take(2), ), removeFromBookmarks = { newsResourceId -> - assertEquals(previewUserNewsResources[0].id, newsResourceId) + assertEquals(userNewsResourcesTestData[0].id, newsResourceId) removeFromBookmarksCalled = true }, ) @@ -121,7 +121,7 @@ class BookmarksScreenTest { ).filter( hasAnyAncestor( hasText( - previewUserNewsResources[0].title, + userNewsResourcesTestData[0].title, substring = true, ), ), diff --git a/feature/bookmarks/src/main/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreen.kt b/feature/bookmarks/src/main/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreen.kt index 6b0bca003..1169f5777 100644 --- a/feature/bookmarks/src/main/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreen.kt +++ b/feature/bookmarks/src/main/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreen.kt @@ -47,6 +47,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.ExperimentalLifecycleComposeApi @@ -54,11 +55,12 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.google.samples.apps.nowinandroid.core.designsystem.component.NiaLoadingWheel import com.google.samples.apps.nowinandroid.core.designsystem.theme.LocalTintTheme import com.google.samples.apps.nowinandroid.core.designsystem.theme.NiaTheme -import com.google.samples.apps.nowinandroid.core.domain.model.previewUserNewsResources +import com.google.samples.apps.nowinandroid.core.domain.model.UserNewsResource import com.google.samples.apps.nowinandroid.core.ui.NewsFeedUiState import com.google.samples.apps.nowinandroid.core.ui.NewsFeedUiState.Loading import com.google.samples.apps.nowinandroid.core.ui.NewsFeedUiState.Success import com.google.samples.apps.nowinandroid.core.ui.TrackScrollJank +import com.google.samples.apps.nowinandroid.core.ui.UserNewsResourcePreviewParameterProvider import com.google.samples.apps.nowinandroid.core.ui.newsFeed @OptIn(ExperimentalLifecycleComposeApi::class) @@ -183,12 +185,13 @@ private fun LoadingStatePreview() { @Preview @Composable -private fun BookmarksGridPreview() { +private fun BookmarksGridPreview( + @PreviewParameter(UserNewsResourcePreviewParameterProvider::class) + userNewsResources: List, +) { NiaTheme { BookmarksGrid( - feedState = Success( - previewUserNewsResources, - ), + feedState = Success(userNewsResources), removeFromBookmarks = {}, ) } diff --git a/feature/bookmarks/src/test/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksViewModelTest.kt b/feature/bookmarks/src/test/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksViewModelTest.kt index b721218d4..ae4445197 100644 --- a/feature/bookmarks/src/test/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksViewModelTest.kt +++ b/feature/bookmarks/src/test/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksViewModelTest.kt @@ -17,7 +17,7 @@ package com.google.samples.apps.nowinandroid.feature.bookmarks import com.google.samples.apps.nowinandroid.core.domain.GetUserNewsResourcesUseCase -import com.google.samples.apps.nowinandroid.core.model.data.previewNewsResources +import com.google.samples.apps.nowinandroid.core.testing.data.newsResourcesTestData import com.google.samples.apps.nowinandroid.core.testing.repository.TestNewsRepository import com.google.samples.apps.nowinandroid.core.testing.repository.TestUserDataRepository import com.google.samples.apps.nowinandroid.core.testing.util.MainDispatcherRule @@ -66,8 +66,8 @@ class BookmarksViewModelTest { fun oneBookmark_showsInFeed() = runTest { val collectJob = launch(UnconfinedTestDispatcher()) { viewModel.feedUiState.collect() } - newsRepository.sendNewsResources(previewNewsResources) - userDataRepository.updateNewsResourceBookmark(previewNewsResources[0].id, true) + newsRepository.sendNewsResources(newsResourcesTestData) + userDataRepository.updateNewsResourceBookmark(newsResourcesTestData[0].id, true) val item = viewModel.feedUiState.value assertIs(item) assertEquals(item.feed.size, 1) @@ -79,11 +79,11 @@ class BookmarksViewModelTest { fun oneBookmark_whenRemoving_removesFromFeed() = runTest { val collectJob = launch(UnconfinedTestDispatcher()) { viewModel.feedUiState.collect() } // Set the news resources to be used by this test - newsRepository.sendNewsResources(previewNewsResources) + newsRepository.sendNewsResources(newsResourcesTestData) // Start with the resource saved - userDataRepository.updateNewsResourceBookmark(previewNewsResources[0].id, true) + userDataRepository.updateNewsResourceBookmark(newsResourcesTestData[0].id, true) // Use viewModel to remove saved resource - viewModel.removeFromSavedResources(previewNewsResources[0].id) + viewModel.removeFromSavedResources(newsResourcesTestData[0].id) // Verify list of saved resources is now empty val item = viewModel.feedUiState.value assertIs(item) diff --git a/feature/foryou/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenTest.kt b/feature/foryou/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenTest.kt index 9ff4ed8f4..a6be20013 100644 --- a/feature/foryou/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenTest.kt +++ b/feature/foryou/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenTest.kt @@ -28,9 +28,8 @@ import androidx.compose.ui.test.onFirst import androidx.compose.ui.test.onNodeWithContentDescription import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performScrollToNode -import com.google.samples.apps.nowinandroid.core.domain.model.FollowableTopic -import com.google.samples.apps.nowinandroid.core.domain.model.previewUserNewsResources -import com.google.samples.apps.nowinandroid.core.model.data.Topic +import com.google.samples.apps.nowinandroid.core.testing.data.followableTopicTestData +import com.google.samples.apps.nowinandroid.core.testing.data.userNewsResourcesTestData import com.google.samples.apps.nowinandroid.core.ui.NewsFeedUiState import org.junit.Rule import org.junit.Test @@ -91,13 +90,14 @@ class ForYouScreenTest { @Test fun topicSelector_whenNoTopicsSelected_showsTopicChipsAndDisabledDoneButton() { + val testData = followableTopicTestData.map { it -> it.copy(isFollowed = false) } + composeTestRule.setContent { BoxWithConstraints { ForYouScreen( isSyncing = false, - onboardingUiState = - OnboardingUiState.Shown( - topics = testTopics, + onboardingUiState = OnboardingUiState.Shown( + topics = testData, ), feedState = NewsFeedUiState.Success( feed = emptyList(), @@ -109,7 +109,7 @@ class ForYouScreenTest { } } - testTopics.forEach { testTopic -> + testData.forEach { testTopic -> composeTestRule .onNodeWithText(testTopic.topic.name) .assertExists() @@ -138,7 +138,7 @@ class ForYouScreenTest { onboardingUiState = OnboardingUiState.Shown( // Follow one topic - topics = testTopics.mapIndexed { index, testTopic -> + topics = followableTopicTestData.mapIndexed { index, testTopic -> testTopic.copy(isFollowed = index == 1) }, ), @@ -152,7 +152,7 @@ class ForYouScreenTest { } } - testTopics.forEach { testTopic -> + followableTopicTestData.forEach { testTopic -> composeTestRule .onNodeWithText(testTopic.topic.name) .assertExists() @@ -179,7 +179,7 @@ class ForYouScreenTest { ForYouScreen( isSyncing = false, onboardingUiState = - OnboardingUiState.Shown(topics = testTopics), + OnboardingUiState.Shown(topics = followableTopicTestData), feedState = NewsFeedUiState.Loading, onTopicCheckedChanged = { _, _ -> }, saveFollowedTopics = {}, @@ -224,7 +224,7 @@ class ForYouScreenTest { isSyncing = false, onboardingUiState = OnboardingUiState.NotShown, feedState = NewsFeedUiState.Success( - feed = previewUserNewsResources, + feed = userNewsResourcesTestData, ), onTopicCheckedChanged = { _, _ -> }, saveFollowedTopics = {}, @@ -234,7 +234,7 @@ class ForYouScreenTest { composeTestRule .onNodeWithText( - previewUserNewsResources[0].title, + userNewsResourcesTestData[0].title, substring = true, ) .assertExists() @@ -243,40 +243,17 @@ class ForYouScreenTest { composeTestRule.onNode(hasScrollToNodeAction()) .performScrollToNode( hasText( - previewUserNewsResources[1].title, + userNewsResourcesTestData[1].title, substring = true, ), ) composeTestRule .onNodeWithText( - previewUserNewsResources[1].title, + userNewsResourcesTestData[1].title, substring = true, ) .assertExists() .assertHasClickAction() } } - -private val testTopic = Topic( - id = "", - name = "", - shortDescription = "", - longDescription = "", - url = "", - imageUrl = "", -) -private val testTopics = listOf( - FollowableTopic( - topic = testTopic.copy(id = "0", name = "Headlines"), - isFollowed = false, - ), - FollowableTopic( - topic = testTopic.copy(id = "1", name = "UI"), - isFollowed = false, - ), - FollowableTopic( - topic = testTopic.copy(id = "2", name = "Tools"), - isFollowed = false, - ), -) diff --git a/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreen.kt b/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreen.kt index 2acf43323..492660142 100644 --- a/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreen.kt +++ b/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreen.kt @@ -67,6 +67,7 @@ import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.max import androidx.compose.ui.unit.sp @@ -81,12 +82,11 @@ import com.google.samples.apps.nowinandroid.core.designsystem.component.NiaIconT import com.google.samples.apps.nowinandroid.core.designsystem.component.NiaOverlayLoadingWheel import com.google.samples.apps.nowinandroid.core.designsystem.icon.NiaIcons import com.google.samples.apps.nowinandroid.core.designsystem.theme.NiaTheme -import com.google.samples.apps.nowinandroid.core.domain.model.FollowableTopic -import com.google.samples.apps.nowinandroid.core.domain.model.previewUserNewsResources -import com.google.samples.apps.nowinandroid.core.model.data.previewTopics +import com.google.samples.apps.nowinandroid.core.domain.model.UserNewsResource import com.google.samples.apps.nowinandroid.core.ui.DevicePreviews import com.google.samples.apps.nowinandroid.core.ui.NewsFeedUiState import com.google.samples.apps.nowinandroid.core.ui.TrackScrollJank +import com.google.samples.apps.nowinandroid.core.ui.UserNewsResourcePreviewParameterProvider import com.google.samples.apps.nowinandroid.core.ui.newsFeed @OptIn(ExperimentalLifecycleComposeApi::class) @@ -392,14 +392,17 @@ fun TopicIcon( @DevicePreviews @Composable -fun ForYouScreenPopulatedFeed() { +fun ForYouScreenPopulatedFeed( + @PreviewParameter(UserNewsResourcePreviewParameterProvider::class) + userNewsResources: List, +) { BoxWithConstraints { NiaTheme { ForYouScreen( isSyncing = false, onboardingUiState = OnboardingUiState.NotShown, feedState = NewsFeedUiState.Success( - feed = previewUserNewsResources, + feed = userNewsResources, ), onTopicCheckedChanged = { _, _ -> }, saveFollowedTopics = {}, @@ -411,14 +414,17 @@ fun ForYouScreenPopulatedFeed() { @DevicePreviews @Composable -fun ForYouScreenOfflinePopulatedFeed() { +fun ForYouScreenOfflinePopulatedFeed( + @PreviewParameter(UserNewsResourcePreviewParameterProvider::class) + userNewsResources: List, +) { BoxWithConstraints { NiaTheme { ForYouScreen( isSyncing = false, onboardingUiState = OnboardingUiState.NotShown, feedState = NewsFeedUiState.Success( - feed = previewUserNewsResources, + feed = userNewsResources, ), onTopicCheckedChanged = { _, _ -> }, saveFollowedTopics = {}, @@ -430,16 +436,19 @@ fun ForYouScreenOfflinePopulatedFeed() { @DevicePreviews @Composable -fun ForYouScreenTopicSelection() { +fun ForYouScreenTopicSelection( + @PreviewParameter(UserNewsResourcePreviewParameterProvider::class) + userNewsResources: List, +) { BoxWithConstraints { NiaTheme { ForYouScreen( isSyncing = false, onboardingUiState = OnboardingUiState.Shown( - topics = previewTopics.map { FollowableTopic(it, false) }, + topics = userNewsResources.flatMap { news -> news.followableTopics }, ), feedState = NewsFeedUiState.Success( - feed = previewUserNewsResources, + feed = userNewsResources, ), onTopicCheckedChanged = { _, _ -> }, saveFollowedTopics = {}, @@ -468,14 +477,17 @@ fun ForYouScreenLoading() { @DevicePreviews @Composable -fun ForYouScreenPopulatedAndLoading() { +fun ForYouScreenPopulatedAndLoading( + @PreviewParameter(UserNewsResourcePreviewParameterProvider::class) + userNewsResources: List, +) { BoxWithConstraints { NiaTheme { ForYouScreen( isSyncing = true, onboardingUiState = OnboardingUiState.Loading, feedState = NewsFeedUiState.Success( - feed = previewUserNewsResources, + feed = userNewsResources, ), onTopicCheckedChanged = { _, _ -> }, saveFollowedTopics = {}, diff --git a/feature/interests/src/androidTest/java/com/google/samples/apps/nowinandroid/interests/InterestsScreenTest.kt b/feature/interests/src/androidTest/java/com/google/samples/apps/nowinandroid/interests/InterestsScreenTest.kt index 2c5ed4844..7f06eee6b 100644 --- a/feature/interests/src/androidTest/java/com/google/samples/apps/nowinandroid/interests/InterestsScreenTest.kt +++ b/feature/interests/src/androidTest/java/com/google/samples/apps/nowinandroid/interests/InterestsScreenTest.kt @@ -22,11 +22,9 @@ import androidx.compose.ui.test.assertCountEquals import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.junit4.createAndroidComposeRule import androidx.compose.ui.test.onAllNodesWithContentDescription -import androidx.compose.ui.test.onAllNodesWithText import androidx.compose.ui.test.onNodeWithContentDescription import androidx.compose.ui.test.onNodeWithText -import com.google.samples.apps.nowinandroid.core.domain.model.FollowableTopic -import com.google.samples.apps.nowinandroid.core.model.data.Topic +import com.google.samples.apps.nowinandroid.core.testing.data.followableTopicTestData import com.google.samples.apps.nowinandroid.feature.interests.InterestsScreen import com.google.samples.apps.nowinandroid.feature.interests.InterestsUiState import com.google.samples.apps.nowinandroid.feature.interests.R @@ -76,24 +74,20 @@ class InterestsScreenTest { fun interestsWithTopics_whenTopicsFollowed_showFollowedAndUnfollowedTopicsWithInfo() { composeTestRule.setContent { InterestsScreen( - uiState = InterestsUiState.Interests(topics = testTopics), + uiState = InterestsUiState.Interests(topics = followableTopicTestData), ) } composeTestRule - .onNodeWithText(TOPIC_1_NAME) + .onNodeWithText(followableTopicTestData[0].topic.name) .assertIsDisplayed() composeTestRule - .onNodeWithText(TOPIC_2_NAME) + .onNodeWithText(followableTopicTestData[1].topic.name) .assertIsDisplayed() composeTestRule - .onNodeWithText(TOPIC_3_NAME) + .onNodeWithText(followableTopicTestData[2].topic.name) .assertIsDisplayed() - composeTestRule - .onAllNodesWithText(TOPIC_SHORT_DESC) - .assertCountEquals(testTopics.count()) - composeTestRule .onAllNodesWithContentDescription(interestsTopicCardFollowButton) .assertCountEquals(numberOfUnfollowedTopics) @@ -120,48 +114,4 @@ class InterestsScreenTest { } } -private const val TOPIC_1_NAME = "Headlines" -private const val TOPIC_2_NAME = "UI" -private const val TOPIC_3_NAME = "Tools" -private const val TOPIC_SHORT_DESC = "At vero eos et accusamus." -private const val TOPIC_LONG_DESC = "At vero eos et accusamus et iusto odio dignissimos ducimus." -private const val TOPIC_URL = "URL" -private const val TOPIC_IMAGE_URL = "Image URL" - -private val testTopics = listOf( - FollowableTopic( - Topic( - id = "0", - name = TOPIC_1_NAME, - shortDescription = TOPIC_SHORT_DESC, - longDescription = TOPIC_LONG_DESC, - url = TOPIC_URL, - imageUrl = TOPIC_IMAGE_URL, - ), - isFollowed = true, - ), - FollowableTopic( - Topic( - id = "1", - name = TOPIC_2_NAME, - shortDescription = TOPIC_SHORT_DESC, - longDescription = TOPIC_LONG_DESC, - url = TOPIC_URL, - imageUrl = TOPIC_IMAGE_URL, - ), - isFollowed = false, - ), - FollowableTopic( - Topic( - id = "2", - name = TOPIC_3_NAME, - shortDescription = TOPIC_SHORT_DESC, - longDescription = TOPIC_LONG_DESC, - url = TOPIC_URL, - imageUrl = TOPIC_IMAGE_URL, - ), - isFollowed = false, - ), -) - -private val numberOfUnfollowedTopics = testTopics.filter { !it.isFollowed }.size +private val numberOfUnfollowedTopics = followableTopicTestData.filter { !it.isFollowed }.size diff --git a/feature/interests/src/main/java/com/google/samples/apps/nowinandroid/feature/interests/InterestsScreen.kt b/feature/interests/src/main/java/com/google/samples/apps/nowinandroid/feature/interests/InterestsScreen.kt index 4376d55d6..fd45c7608 100644 --- a/feature/interests/src/main/java/com/google/samples/apps/nowinandroid/feature/interests/InterestsScreen.kt +++ b/feature/interests/src/main/java/com/google/samples/apps/nowinandroid/feature/interests/InterestsScreen.kt @@ -23,6 +23,7 @@ import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.ExperimentalLifecycleComposeApi import androidx.lifecycle.compose.collectAsStateWithLifecycle @@ -30,8 +31,8 @@ import com.google.samples.apps.nowinandroid.core.designsystem.component.NiaBackg import com.google.samples.apps.nowinandroid.core.designsystem.component.NiaLoadingWheel import com.google.samples.apps.nowinandroid.core.designsystem.theme.NiaTheme import com.google.samples.apps.nowinandroid.core.domain.model.FollowableTopic -import com.google.samples.apps.nowinandroid.core.model.data.previewTopics import com.google.samples.apps.nowinandroid.core.ui.DevicePreviews +import com.google.samples.apps.nowinandroid.core.ui.FollowableTopicPreviewParameterProvider @OptIn(ExperimentalLifecycleComposeApi::class) @Composable @@ -86,12 +87,15 @@ private fun InterestsEmptyScreen() { @DevicePreviews @Composable -fun InterestsScreenPopulated() { +fun InterestsScreenPopulated( + @PreviewParameter(FollowableTopicPreviewParameterProvider::class) + followableTopics: List, +) { NiaTheme { NiaBackground { InterestsScreen( uiState = InterestsUiState.Interests( - topics = previewTopics.map { FollowableTopic(it, false) }, + topics = followableTopics, ), followTopic = { _, _ -> }, navigateToTopic = {}, diff --git a/feature/topic/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/topic/TopicScreenTest.kt b/feature/topic/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/topic/TopicScreenTest.kt index 9f984c4a3..626b0e773 100644 --- a/feature/topic/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/topic/TopicScreenTest.kt +++ b/feature/topic/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/topic/TopicScreenTest.kt @@ -24,13 +24,8 @@ import androidx.compose.ui.test.onFirst import androidx.compose.ui.test.onNodeWithContentDescription import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performScrollToNode -import com.google.samples.apps.nowinandroid.core.domain.model.FollowableTopic -import com.google.samples.apps.nowinandroid.core.domain.model.UserNewsResource -import com.google.samples.apps.nowinandroid.core.model.data.NewsResource -import com.google.samples.apps.nowinandroid.core.model.data.NewsResourceType.Video -import com.google.samples.apps.nowinandroid.core.model.data.Topic -import com.google.samples.apps.nowinandroid.core.testing.repository.emptyUserData -import kotlinx.datetime.Instant +import com.google.samples.apps.nowinandroid.core.testing.data.followableTopicTestData +import com.google.samples.apps.nowinandroid.core.testing.data.userNewsResourcesTestData import org.junit.Before import org.junit.Rule import org.junit.Test @@ -73,7 +68,7 @@ class TopicScreenTest { @Test fun topicTitle_whenTopicIsSuccess_isShown() { - val testTopic = testTopics.first() + val testTopic = followableTopicTestData.first() composeTestRule.setContent { TopicScreen( topicUiState = TopicUiState.Success(testTopic), @@ -100,7 +95,7 @@ class TopicScreenTest { composeTestRule.setContent { TopicScreen( topicUiState = TopicUiState.Loading, - newsUiState = NewsUiState.Success(sampleUserNewsResources), + newsUiState = NewsUiState.Success(userNewsResourcesTestData), onBackClick = { }, onFollowClick = { }, onBookmarkChanged = { _, _ -> }, @@ -115,12 +110,12 @@ class TopicScreenTest { @Test fun news_whenSuccessAndTopicIsSuccess_isShown() { - val testTopic = testTopics.first() + val testTopic = followableTopicTestData.first() composeTestRule.setContent { TopicScreen( topicUiState = TopicUiState.Success(testTopic), newsUiState = NewsUiState.Success( - sampleUserNewsResources, + userNewsResourcesTestData, ), onBackClick = { }, onFollowClick = { }, @@ -132,76 +127,6 @@ class TopicScreenTest { composeTestRule .onAllNodes(hasScrollToNodeAction()) .onFirst() - .performScrollToNode(hasText(sampleUserNewsResources.first().title)) + .performScrollToNode(hasText(userNewsResourcesTestData.first().title)) } } - -private const val TOPIC_1_NAME = "Headlines" -private const val TOPIC_2_NAME = "UI" -private const val TOPIC_3_NAME = "Tools" -private const val TOPIC_DESC = "At vero eos et accusamus et iusto odio dignissimos ducimus qui." - -private val testTopics = listOf( - FollowableTopic( - Topic( - id = "0", - name = TOPIC_1_NAME, - shortDescription = "", - longDescription = TOPIC_DESC, - url = "", - imageUrl = "", - ), - isFollowed = true, - ), - FollowableTopic( - Topic( - id = "1", - name = TOPIC_2_NAME, - shortDescription = "", - longDescription = TOPIC_DESC, - url = "", - imageUrl = "", - ), - isFollowed = false, - ), - FollowableTopic( - Topic( - id = "2", - name = TOPIC_3_NAME, - shortDescription = "", - longDescription = TOPIC_DESC, - url = "", - imageUrl = "", - ), - isFollowed = false, - ), -) - -private val sampleUserNewsResources = listOf( - UserNewsResource( - newsResource = - NewsResource( - id = "1", - title = "Thanks for helping us reach 1M YouTube Subscribers", - content = "Thank you everyone for following the Now in Android series and" + - " everything the Android Developers YouTube channel has to offer. During the " + - "Android Developer Summit, our YouTube channel reached 1 million subscribers!" + - " Here’s a small video to thank you all.", - url = "https://youtu.be/-fJ6poHQrjM", - headerImageUrl = "https://i.ytimg.com/vi/-fJ6poHQrjM/maxresdefault.jpg", - publishDate = Instant.parse("2021-11-09T00:00:00.000Z"), - type = Video, - topics = listOf( - Topic( - id = "0", - name = "Headlines", - shortDescription = "", - longDescription = TOPIC_DESC, - url = "", - imageUrl = "", - ), - ), - ), - userData = emptyUserData.copy(bookmarkedNewsResources = setOf("1")), - ), -) diff --git a/feature/topic/src/main/java/com/google/samples/apps/nowinandroid/feature/topic/TopicScreen.kt b/feature/topic/src/main/java/com/google/samples/apps/nowinandroid/feature/topic/TopicScreen.kt index b4d31084b..e7b218072 100644 --- a/feature/topic/src/main/java/com/google/samples/apps/nowinandroid/feature/topic/TopicScreen.kt +++ b/feature/topic/src/main/java/com/google/samples/apps/nowinandroid/feature/topic/TopicScreen.kt @@ -41,6 +41,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.ExperimentalLifecycleComposeApi @@ -52,10 +53,10 @@ import com.google.samples.apps.nowinandroid.core.designsystem.component.NiaLoadi import com.google.samples.apps.nowinandroid.core.designsystem.icon.NiaIcons import com.google.samples.apps.nowinandroid.core.designsystem.theme.NiaTheme import com.google.samples.apps.nowinandroid.core.domain.model.FollowableTopic -import com.google.samples.apps.nowinandroid.core.domain.model.previewUserNewsResources -import com.google.samples.apps.nowinandroid.core.model.data.previewTopics +import com.google.samples.apps.nowinandroid.core.domain.model.UserNewsResource import com.google.samples.apps.nowinandroid.core.ui.DevicePreviews import com.google.samples.apps.nowinandroid.core.ui.TrackScrollJank +import com.google.samples.apps.nowinandroid.core.ui.UserNewsResourcePreviewParameterProvider import com.google.samples.apps.nowinandroid.core.ui.userNewsResourceCardItems import com.google.samples.apps.nowinandroid.feature.topic.R.string import com.google.samples.apps.nowinandroid.feature.topic.TopicUiState.Loading @@ -250,14 +251,15 @@ private fun TopicToolbar( @DevicePreviews @Composable -fun TopicScreenPopulated() { +fun TopicScreenPopulated( + @PreviewParameter(UserNewsResourcePreviewParameterProvider::class) + userNewsResources: List, +) { NiaTheme { NiaBackground { TopicScreen( - topicUiState = TopicUiState.Success(FollowableTopic(previewTopics[0], false)), - newsUiState = NewsUiState.Success( - previewUserNewsResources, - ), + topicUiState = TopicUiState.Success(userNewsResources[0].followableTopics[0]), + newsUiState = NewsUiState.Success(userNewsResources), onBackClick = {}, onFollowClick = {}, onBookmarkChanged = { _, _ -> }, From 1036bf2f35210a455a620fda52a26e1dd6d9c66f Mon Sep 17 00:00:00 2001 From: Don Turner Date: Mon, 30 Jan 2023 15:17:38 +0000 Subject: [PATCH 32/37] Update docs/ArchitectureLearningJourney.md --- docs/ArchitectureLearningJourney.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/ArchitectureLearningJourney.md b/docs/ArchitectureLearningJourney.md index 6c84344ea..44c59dfad 100644 --- a/docs/ArchitectureLearningJourney.md +++ b/docs/ArchitectureLearningJourney.md @@ -142,7 +142,7 @@ Here's what's happening in each step. The easiest way to find the associated cod 11 - GetUserNewsResourcesUseCase combines the list of news resources with the user data to emit a list of SaveableNewsResources. + GetUserNewsResourcesUseCase combines the list of news resources with the user data to emit a list of UserNewsResources. GetUserNewsResourcesUseCase.invoke From e6d24c8a685805c781f974f34eab40321429d856 Mon Sep 17 00:00:00 2001 From: Don Turner Date: Mon, 30 Jan 2023 15:17:44 +0000 Subject: [PATCH 33/37] Update docs/ArchitectureLearningJourney.md --- docs/ArchitectureLearningJourney.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/ArchitectureLearningJourney.md b/docs/ArchitectureLearningJourney.md index 44c59dfad..6b6fa4420 100644 --- a/docs/ArchitectureLearningJourney.md +++ b/docs/ArchitectureLearningJourney.md @@ -254,7 +254,7 @@ The [domain layer](https://developer.android.com/topic/architecture/domain-layer These use cases are used to simplify and remove duplicate logic from ViewModels. They typically combine and transform data from repositories. -For example, `GetUserNewsResourcesUseCase` combines a stream (implemented using `Flow`) of `NewsResource`s from a `NewsRepository` with a stream of `UserData` objects from a `UserDataRepository` to create a stream of `SaveableNewsResource`s. This stream is used by various ViewModels to display news resources on screen with their bookmarked state. +For example, `GetUserNewsResourcesUseCase` combines a stream (implemented using `Flow`) of `NewsResource`s from a `NewsRepository` with a stream of `UserData` objects from a `UserDataRepository` to create a stream of `UserNewsResource`s. This stream is used by various ViewModels to display news resources on screen with their bookmarked state. Notably, the domain layer in Now in Android _does not_ (for now) contain any use cases for event handling. Events are handled by the UI layer calling methods on repositories directly. From e536c396f9bf29278a5da62d3e7cf37e6ebec6d3 Mon Sep 17 00:00:00 2001 From: Don Turner Date: Mon, 30 Jan 2023 15:12:19 +0000 Subject: [PATCH 34/37] Move new UseCase and tests into separate files Change-Id: I4c337473ca0a60a5fccbb8aa640735cf7d616e71 --- .../domain/GetUserNewsResourcesUseCase.kt | 54 ------------ .../domain/GetUserNewsResourcesUseCaseTest.kt | 49 ----------- .../feature/foryou/ForYouViewModel.kt | 87 ++++++++++++++++--- .../feature/foryou/ForYouViewModelTest.kt | 7 +- 4 files changed, 77 insertions(+), 120 deletions(-) diff --git a/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/GetUserNewsResourcesUseCase.kt b/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/GetUserNewsResourcesUseCase.kt index fdb9eb6d9..db274bbbd 100644 --- a/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/GetUserNewsResourcesUseCase.kt +++ b/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/GetUserNewsResourcesUseCase.kt @@ -24,11 +24,7 @@ import com.google.samples.apps.nowinandroid.core.model.data.NewsResource import com.google.samples.apps.nowinandroid.core.model.data.UserData import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine -import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.filterNot -import kotlinx.coroutines.flow.flatMapLatest -import kotlinx.coroutines.flow.flowOf -import kotlinx.coroutines.flow.map import javax.inject.Inject /** @@ -55,56 +51,6 @@ class GetUserNewsResourcesUseCase @Inject constructor( }.mapToUserNewsResources(userDataRepository.userData) } -class GetFollowedUserNewsResourcesUseCase @Inject constructor( - private val userDataRepository: UserDataRepository, - val getUserNewsResources: GetUserNewsResourcesUseCase, -) { - /** - * Returns a list of UserNewsResources for topics which the user is following - */ - operator fun invoke(): Flow> = - /** - * This sequence of flow transformation functions does the following: - * - * - map: maps the user data into a set of followed topic IDs or null if we should return - * an empty list - * - distinctUntilChanged: will only emit a set of followed topic IDs if it's changed. This - * avoids calling potentially expensive operations (like setting up a new flow) when nothing - * has changed. - * - flatMapLatest: getUserNewsResources returns a flow, so we have a flow inside a - * flow. flatMapLatest moves the inner flow (the one we want to return) to the outer flow - * and cancels any previous flows created by getUserNewsResources. - */ - userDataRepository.userData - .map { userData -> - if (shouldShowEmptyFeed(userData)) { - null - } else { - userData.followedTopics - } - } - .distinctUntilChanged() - .flatMapLatest { followedTopics -> - if (followedTopics == null) { - flowOf(emptyList()) - } else { - getUserNewsResources(filterTopicIds = followedTopics) - } - } - - /** - * If the user hasn't completed the onboarding and hasn't selected any interests - * show an empty news list to clearly demonstrate that their selections affect the - * news articles they will see. - * - * Note: It should not be possible for the user to get into a state where the onboarding - * is not displayed AND they haven't followed any topics, however, this method is to safeguard - * against that scenario in future. - */ - private fun shouldShowEmptyFeed(userData: UserData) = - !userData.shouldHideOnboarding && userData.followedTopics.isEmpty() -} - private fun Flow>.mapToUserNewsResources( userDataStream: Flow, ): Flow> = diff --git a/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/GetUserNewsResourcesUseCaseTest.kt b/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/GetUserNewsResourcesUseCaseTest.kt index 8674c4026..32ee8773c 100644 --- a/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/GetUserNewsResourcesUseCaseTest.kt +++ b/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/GetUserNewsResourcesUseCaseTest.kt @@ -83,55 +83,6 @@ class GetUserNewsResourcesUseCaseTest { } } -class GetFollowedUserNewsResourcesUseCaseTest { - - @get:Rule - val mainDispatcherRule = MainDispatcherRule() - - private val newsRepository = TestNewsRepository() - private val userDataRepository = TestUserDataRepository() - private val getUserNewsResourcesUseCase = - GetUserNewsResourcesUseCase(newsRepository, userDataRepository) - - val useCase = - GetFollowedUserNewsResourcesUseCase(userDataRepository, getUserNewsResourcesUseCase) - - @Test - fun whenOnboardingShownAndNoTopicsFollowed_emptyListIsReturned() = runTest { - val followedNewsResources = useCase() - - // Send some news resources and empty user data - newsRepository.sendNewsResources(sampleNewsResources) - userDataRepository.setUserData(emptyUserData) - - // Check that an empty list is returned - assertEquals( - emptyList(), - followedNewsResources.first(), - ) - } - - @Test - fun whenTopicsAreFollowed_correctNewsResourcesAreReturned() = runTest { - val followedNewsResources = useCase() - - // Send some news resources and user data with a followed topic - newsRepository.sendNewsResources(sampleNewsResources) - - val userData = emptyUserData.copy( - followedTopics = setOf(sampleTopic1.id), - ) - userDataRepository.setUserData(userData) - - assertEquals( - sampleNewsResources - .filter { it.topics.contains(sampleTopic1) } - .mapToUserNewsResources(userData), - followedNewsResources.first(), - ) - } -} - private val sampleTopic1 = Topic( id = "Topic1", name = "Headlines", diff --git a/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel.kt b/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel.kt index 85268e894..259cc31f2 100644 --- a/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel.kt +++ b/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel.kt @@ -21,13 +21,18 @@ import androidx.lifecycle.viewModelScope import com.google.samples.apps.nowinandroid.core.data.repository.UserDataRepository import com.google.samples.apps.nowinandroid.core.data.util.SyncStatusMonitor import com.google.samples.apps.nowinandroid.core.domain.GetFollowableTopicsUseCase -import com.google.samples.apps.nowinandroid.core.domain.GetFollowedUserNewsResourcesUseCase +import com.google.samples.apps.nowinandroid.core.domain.GetUserNewsResourcesUseCase +import com.google.samples.apps.nowinandroid.core.domain.model.UserNewsResource +import com.google.samples.apps.nowinandroid.core.model.data.UserData import com.google.samples.apps.nowinandroid.core.ui.NewsFeedUiState import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.flatMapLatest +import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch @@ -37,7 +42,7 @@ import javax.inject.Inject class ForYouViewModel @Inject constructor( syncStatusMonitor: SyncStatusMonitor, private val userDataRepository: UserDataRepository, - getFollowedUserNewsResources: GetFollowedUserNewsResourcesUseCase, + private val getUserNewsResources: GetUserNewsResourcesUseCase, getFollowableTopics: GetFollowableTopicsUseCase, ) : ViewModel() { @@ -51,15 +56,13 @@ class ForYouViewModel @Inject constructor( initialValue = false, ) - val feedState: StateFlow = - getFollowedUserNewsResources().map { - NewsFeedUiState.Success(it) - } - .stateIn( - scope = viewModelScope, - started = SharingStarted.WhileSubscribed(5_000), - initialValue = NewsFeedUiState.Loading, - ) + val feedState: StateFlow = getFollowedUserNewsResources() + .map(NewsFeedUiState::Success) + .stateIn( + scope = viewModelScope, + started = SharingStarted.WhileSubscribed(5_000), + initialValue = NewsFeedUiState.Loading, + ) val onboardingUiState: StateFlow = combine( @@ -95,4 +98,66 @@ class ForYouViewModel @Inject constructor( userDataRepository.setShouldHideOnboarding(true) } } + + /** + * This sequence of flow transformation functions does the following: + * + * - map: maps the user data into a set of followed topic IDs or null if we should return + * an empty list + * - distinctUntilChanged: will only emit a set of followed topic IDs if it's changed. This + * avoids calling potentially expensive operations (like setting up a new flow) when nothing + * has changed. + * - flatMapLatest: getUserNewsResources returns a flow, so we have a flow inside a + * flow. flatMapLatest moves the inner flow (the one we want to return) to the outer flow + * and cancels any previous flows created by getUserNewsResources. + */ + private fun getFollowedUserNewsResources(): Flow> = + userDataRepository.userData + .map { userData -> + if (userData.shouldShowEmptyFeed()) { + null + } else { + userData.followedTopics + } + } + .distinctUntilChanged() + .flatMapLatest { followedTopics -> + if (followedTopics == null) { + flowOf(emptyList()) + } else { + getUserNewsResources(filterTopicIds = followedTopics) + } + } } + +// Alternative approach (not currently being called) +private fun Flow.getFollowedUserNewsResources( + getUserNewsResources: GetUserNewsResourcesUseCase, +): Flow> = + map { userData -> + if (userData.shouldShowEmptyFeed()) { + null + } else { + userData.followedTopics + } + } + .distinctUntilChanged() + .flatMapLatest { followedTopics -> + if (followedTopics == null) { + flowOf(emptyList()) + } else { + getUserNewsResources(filterTopicIds = followedTopics) + } + } + +/** + * If the user hasn't completed the onboarding and hasn't selected any interests + * show an empty news list to clearly demonstrate that their selections affect the + * news articles they will see. + * + * Note: It should not be possible for the user to get into a state where the onboarding + * is not displayed AND they haven't followed any topics, however, this method is to safeguard + * against that scenario in future. + */ +private fun UserData.shouldShowEmptyFeed() = + !shouldHideOnboarding && followedTopics.isEmpty() diff --git a/feature/foryou/src/test/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModelTest.kt b/feature/foryou/src/test/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModelTest.kt index c335f7603..9e51758f0 100644 --- a/feature/foryou/src/test/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModelTest.kt +++ b/feature/foryou/src/test/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModelTest.kt @@ -17,7 +17,6 @@ package com.google.samples.apps.nowinandroid.feature.foryou import com.google.samples.apps.nowinandroid.core.domain.GetFollowableTopicsUseCase -import com.google.samples.apps.nowinandroid.core.domain.GetFollowedUserNewsResourcesUseCase import com.google.samples.apps.nowinandroid.core.domain.GetUserNewsResourcesUseCase import com.google.samples.apps.nowinandroid.core.domain.model.FollowableTopic import com.google.samples.apps.nowinandroid.core.domain.model.UserNewsResource @@ -61,10 +60,6 @@ class ForYouViewModelTest { newsRepository = newsRepository, userDataRepository = userDataRepository, ) - private val getFollowedUserNewsResourcesUseCase = GetFollowedUserNewsResourcesUseCase( - userDataRepository = userDataRepository, - getUserNewsResources = getUserNewsResourcesUseCase, - ) private val getFollowableTopicsUseCase = GetFollowableTopicsUseCase( topicsRepository = topicsRepository, @@ -77,7 +72,7 @@ class ForYouViewModelTest { viewModel = ForYouViewModel( syncStatusMonitor = syncStatusMonitor, userDataRepository = userDataRepository, - getFollowedUserNewsResources = getFollowedUserNewsResourcesUseCase, + getUserNewsResources = getUserNewsResourcesUseCase, getFollowableTopics = getFollowableTopicsUseCase, ) } From f9dcdb4390061a609accf726dd011f480a39ee93 Mon Sep 17 00:00:00 2001 From: Don Turner Date: Mon, 30 Jan 2023 20:17:39 +0000 Subject: [PATCH 35/37] More refactoring --- .../feature/foryou/ForYouViewModel.kt | 65 +++++++------------ 1 file changed, 23 insertions(+), 42 deletions(-) diff --git a/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel.kt b/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel.kt index 259cc31f2..cd029b4af 100644 --- a/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel.kt +++ b/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel.kt @@ -42,7 +42,7 @@ import javax.inject.Inject class ForYouViewModel @Inject constructor( syncStatusMonitor: SyncStatusMonitor, private val userDataRepository: UserDataRepository, - private val getUserNewsResources: GetUserNewsResourcesUseCase, + getUserNewsResources: GetUserNewsResourcesUseCase, getFollowableTopics: GetFollowableTopicsUseCase, ) : ViewModel() { @@ -56,13 +56,14 @@ class ForYouViewModel @Inject constructor( initialValue = false, ) - val feedState: StateFlow = getFollowedUserNewsResources() - .map(NewsFeedUiState::Success) - .stateIn( - scope = viewModelScope, - started = SharingStarted.WhileSubscribed(5_000), - initialValue = NewsFeedUiState.Loading, - ) + val feedState: StateFlow = + userDataRepository.getFollowedUserNewsResources(getUserNewsResources) + .map(NewsFeedUiState::Success) + .stateIn( + scope = viewModelScope, + started = SharingStarted.WhileSubscribed(5_000), + initialValue = NewsFeedUiState.Loading, + ) val onboardingUiState: StateFlow = combine( @@ -98,50 +99,30 @@ class ForYouViewModel @Inject constructor( userDataRepository.setShouldHideOnboarding(true) } } - - /** - * This sequence of flow transformation functions does the following: - * - * - map: maps the user data into a set of followed topic IDs or null if we should return - * an empty list - * - distinctUntilChanged: will only emit a set of followed topic IDs if it's changed. This - * avoids calling potentially expensive operations (like setting up a new flow) when nothing - * has changed. - * - flatMapLatest: getUserNewsResources returns a flow, so we have a flow inside a - * flow. flatMapLatest moves the inner flow (the one we want to return) to the outer flow - * and cancels any previous flows created by getUserNewsResources. - */ - private fun getFollowedUserNewsResources(): Flow> = - userDataRepository.userData - .map { userData -> - if (userData.shouldShowEmptyFeed()) { - null - } else { - userData.followedTopics - } - } - .distinctUntilChanged() - .flatMapLatest { followedTopics -> - if (followedTopics == null) { - flowOf(emptyList()) - } else { - getUserNewsResources(filterTopicIds = followedTopics) - } - } } -// Alternative approach (not currently being called) -private fun Flow.getFollowedUserNewsResources( +/** + * Obtain a flow of user news resources whose topics match those the user is following. + * + * getUserNewsResources: The `UseCase` used to obtain the flow of user news resources. + */ +private fun UserDataRepository.getFollowedUserNewsResources( getUserNewsResources: GetUserNewsResourcesUseCase, -): Flow> = - map { userData -> +): Flow> = userData + // Map the user data into a set of followed topic IDs or null if we should return an empty list. + .map { userData -> if (userData.shouldShowEmptyFeed()) { null } else { userData.followedTopics } } + // Only emit a set of followed topic IDs if it's changed. This avoids calling potentially + // expensive operations (like setting up a new flow) when nothing has changed. .distinctUntilChanged() + // getUserNewsResources returns a flow, so we have a flow inside a flow. flatMapLatest moves + // the inner flow (the one we want to return) to the outer flow and cancels any previous flows + // created by getUserNewsResources. .flatMapLatest { followedTopics -> if (followedTopics == null) { flowOf(emptyList()) From b4de09d0b2c4a3624703d7b2e136c6e85255bdf1 Mon Sep 17 00:00:00 2001 From: Alex Vanyo Date: Wed, 1 Feb 2023 16:23:28 -0800 Subject: [PATCH 36/37] Use only width to determine navigation UI Change-Id: Icad00b9a3eecac9762f6c6b7c3790e8cf1c161d6 --- .../samples/apps/nowinandroid/ui/NavigationUiTest.kt | 12 ++++++------ .../samples/apps/nowinandroid/ui/NiaAppState.kt | 3 +-- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/app/src/androidTest/java/com/google/samples/apps/nowinandroid/ui/NavigationUiTest.kt b/app/src/androidTest/java/com/google/samples/apps/nowinandroid/ui/NavigationUiTest.kt index ca20d4332..c498c03dd 100644 --- a/app/src/androidTest/java/com/google/samples/apps/nowinandroid/ui/NavigationUiTest.kt +++ b/app/src/androidTest/java/com/google/samples/apps/nowinandroid/ui/NavigationUiTest.kt @@ -91,7 +91,7 @@ class NavigationUiTest { } @Test - fun mediumWidth_compactHeight_showsNavigationBar() { + fun mediumWidth_compactHeight_showsNavigationRail() { composeTestRule.setContent { TestHarness(size = DpSize(610.dp, 400.dp)) { BoxWithConstraints { @@ -105,12 +105,12 @@ class NavigationUiTest { } } - composeTestRule.onNodeWithTag("NiaBottomBar").assertIsDisplayed() - composeTestRule.onNodeWithTag("NiaNavRail").assertDoesNotExist() + composeTestRule.onNodeWithTag("NiaNavRail").assertIsDisplayed() + composeTestRule.onNodeWithTag("NiaBottomBar").assertDoesNotExist() } @Test - fun expandedWidth_compactHeight_showsNavigationBar() { + fun expandedWidth_compactHeight_showsNavigationRail() { composeTestRule.setContent { TestHarness(size = DpSize(900.dp, 400.dp)) { BoxWithConstraints { @@ -124,8 +124,8 @@ class NavigationUiTest { } } - composeTestRule.onNodeWithTag("NiaBottomBar").assertIsDisplayed() - composeTestRule.onNodeWithTag("NiaNavRail").assertDoesNotExist() + composeTestRule.onNodeWithTag("NiaNavRail").assertIsDisplayed() + composeTestRule.onNodeWithTag("NiaBottomBar").assertDoesNotExist() } @Test diff --git a/app/src/main/java/com/google/samples/apps/nowinandroid/ui/NiaAppState.kt b/app/src/main/java/com/google/samples/apps/nowinandroid/ui/NiaAppState.kt index 51df525a0..88f5b2782 100644 --- a/app/src/main/java/com/google/samples/apps/nowinandroid/ui/NiaAppState.kt +++ b/app/src/main/java/com/google/samples/apps/nowinandroid/ui/NiaAppState.kt @@ -87,8 +87,7 @@ class NiaAppState( private set val shouldShowBottomBar: Boolean - get() = windowSizeClass.widthSizeClass == WindowWidthSizeClass.Compact || - windowSizeClass.heightSizeClass == WindowHeightSizeClass.Compact + get() = windowSizeClass.widthSizeClass == WindowWidthSizeClass.Compact val shouldShowNavRail: Boolean get() = !shouldShowBottomBar From 9b6695d8dd88be74da3a3f2ee47c0ebc00dd620a Mon Sep 17 00:00:00 2001 From: Alex Vanyo Date: Thu, 2 Feb 2023 08:10:26 -0800 Subject: [PATCH 37/37] Remove unused import Change-Id: I426995db727995c7af6d34082593b078756a3f9d --- .../java/com/google/samples/apps/nowinandroid/ui/NiaAppState.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/com/google/samples/apps/nowinandroid/ui/NiaAppState.kt b/app/src/main/java/com/google/samples/apps/nowinandroid/ui/NiaAppState.kt index 88f5b2782..6f929530c 100644 --- a/app/src/main/java/com/google/samples/apps/nowinandroid/ui/NiaAppState.kt +++ b/app/src/main/java/com/google/samples/apps/nowinandroid/ui/NiaAppState.kt @@ -16,7 +16,6 @@ package com.google.samples.apps.nowinandroid.ui -import androidx.compose.material3.windowsizeclass.WindowHeightSizeClass import androidx.compose.material3.windowsizeclass.WindowSizeClass import androidx.compose.material3.windowsizeclass.WindowWidthSizeClass import androidx.compose.runtime.Composable