gitextract_tu9jpf5p/ ├── .editorconfig ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.yml │ │ ├── docs_issue.yml │ │ └── feature_request.yml │ ├── ci-gradle.properties │ ├── pull_request_template.md │ ├── renovate.json │ └── workflows/ │ ├── Build.yaml │ ├── NightlyBaselineProfiles.yaml │ └── Release.yml ├── .gitignore ├── .google/ │ ├── BUILDME │ └── packaging.yaml ├── .idea/ │ ├── codeStyles/ │ │ ├── Project.xml │ │ └── codeStyleConfig.xml │ └── copyright/ │ ├── The_Android_Open_Source_Project.xml │ └── profiles_settings.xml ├── .run/ │ ├── Generate Demo Baseline Profile.run.xml │ └── spotlessApply.run.xml ├── AGENTS.md ├── CODEOWNERS ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── app/ │ ├── .gitignore │ ├── README.md │ ├── benchmark-rules.pro │ ├── build.gradle.kts │ ├── dependencies/ │ │ └── prodReleaseRuntimeClasspath.txt │ ├── google-services.json │ ├── prodRelease-badging.txt │ ├── proguard-rules.pro │ └── src/ │ ├── androidTest/ │ │ └── kotlin/ │ │ └── com/ │ │ └── google/ │ │ └── samples/ │ │ └── apps/ │ │ └── nowinandroid/ │ │ └── ui/ │ │ ├── NavigationTest.kt │ │ └── UiTestExtensions.kt │ ├── benchmark/ │ │ └── res/ │ │ ├── values/ │ │ │ └── colors.xml │ │ └── values-night/ │ │ └── colors.xml │ ├── debug/ │ │ └── res/ │ │ ├── values/ │ │ │ └── colors.xml │ │ └── values-night/ │ │ └── colors.xml │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── kotlin/ │ │ │ └── com/ │ │ │ └── google/ │ │ │ └── samples/ │ │ │ └── apps/ │ │ │ └── nowinandroid/ │ │ │ ├── MainActivity.kt │ │ │ ├── MainActivityViewModel.kt │ │ │ ├── NiaApplication.kt │ │ │ ├── di/ │ │ │ │ └── JankStatsModule.kt │ │ │ ├── navigation/ │ │ │ │ └── TopLevelNavItem.kt │ │ │ ├── ui/ │ │ │ │ ├── NiaApp.kt │ │ │ │ └── NiaAppState.kt │ │ │ └── util/ │ │ │ ├── ProfileVerifierLogger.kt │ │ │ └── UiExtensions.kt │ │ └── res/ │ │ ├── drawable/ │ │ │ ├── ic_launcher_background.xml │ │ │ ├── ic_launcher_foreground.xml │ │ │ └── ic_splash.xml │ │ ├── mipmap-anydpi-v26/ │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ ├── values/ │ │ │ ├── colors.xml │ │ │ ├── strings.xml │ │ │ └── themes.xml │ │ └── values-night/ │ │ ├── colors.xml │ │ └── themes.xml │ ├── prod/ │ │ └── AndroidManifest.xml │ └── testDemo/ │ ├── kotlin/ │ │ └── com/ │ │ └── google/ │ │ └── samples/ │ │ └── apps/ │ │ └── nowinandroid/ │ │ └── ui/ │ │ ├── DeviceConfigurationOverrideWindowInsets.kt │ │ ├── NiaAppScreenSizesScreenshotTests.kt │ │ ├── NiaAppStateTest.kt │ │ ├── SnackbarInsetsScreenshotTests.kt │ │ └── SnackbarScreenshotTests.kt │ └── resources/ │ └── robolectric.properties ├── app-nia-catalog/ │ ├── .gitignore │ ├── README.md │ ├── build.gradle.kts │ ├── dependencies/ │ │ └── releaseRuntimeClasspath.txt │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ ├── kotlin/ │ │ └── com/ │ │ └── google/ │ │ └── samples/ │ │ └── apps/ │ │ └── niacatalog/ │ │ ├── NiaCatalogActivity.kt │ │ └── ui/ │ │ └── Catalog.kt │ └── res/ │ ├── drawable/ │ │ ├── ic_launcher_background.xml │ │ └── ic_launcher_foreground.xml │ ├── mipmap-anydpi-v26/ │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ └── values/ │ ├── strings.xml │ └── themes.xml ├── benchmarks/ │ ├── README.md │ ├── build.gradle.kts │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ └── kotlin/ │ ├── androidx/ │ │ └── test/ │ │ └── uiautomator/ │ │ └── UiAutomatorHelpers.kt │ └── com/ │ └── google/ │ └── samples/ │ └── apps/ │ └── nowinandroid/ │ ├── BaselineProfileMetrics.kt │ ├── GeneralActions.kt │ ├── Utils.kt │ ├── baselineprofile/ │ │ ├── BookmarksBaselineProfile.kt │ │ ├── ForYouBaselineProfile.kt │ │ ├── InterestsBaselineProfile.kt │ │ └── StartupBaselineProfile.kt │ ├── bookmarks/ │ │ └── BookmarksActions.kt │ ├── foryou/ │ │ ├── ForYouActions.kt │ │ └── ScrollForYouFeedBenchmark.kt │ ├── interests/ │ │ ├── InterestsActions.kt │ │ ├── ScrollTopicListBenchmark.kt │ │ ├── ScrollTopicListPowerMetricsBenchmark.kt │ │ └── TopicsScreenRecompositionBenchmark.kt │ └── startup/ │ └── StartupBenchmark.kt ├── build-logic/ │ ├── README.md │ ├── convention/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ └── kotlin/ │ │ ├── AndroidApplicationComposeConventionPlugin.kt │ │ ├── AndroidApplicationConventionPlugin.kt │ │ ├── AndroidApplicationFirebaseConventionPlugin.kt │ │ ├── AndroidApplicationFlavorsConventionPlugin.kt │ │ ├── AndroidApplicationJacocoConventionPlugin.kt │ │ ├── AndroidFeatureApiConventionPlugin.kt │ │ ├── AndroidFeatureImplConventionPlugin.kt │ │ ├── AndroidLibraryComposeConventionPlugin.kt │ │ ├── AndroidLibraryConventionPlugin.kt │ │ ├── AndroidLibraryJacocoConventionPlugin.kt │ │ ├── AndroidLintConventionPlugin.kt │ │ ├── AndroidRoomConventionPlugin.kt │ │ ├── AndroidTestConventionPlugin.kt │ │ ├── HiltConventionPlugin.kt │ │ ├── JvmLibraryConventionPlugin.kt │ │ ├── RootPlugin.kt │ │ └── com/ │ │ └── google/ │ │ └── samples/ │ │ └── apps/ │ │ └── nowinandroid/ │ │ ├── AndroidCompose.kt │ │ ├── AndroidInstrumentedTests.kt │ │ ├── Badging.kt │ │ ├── GradleManagedDevices.kt │ │ ├── Graph.kt │ │ ├── Jacoco.kt │ │ ├── KotlinAndroid.kt │ │ ├── NiaBuildType.kt │ │ ├── NiaFlavor.kt │ │ ├── PrintTestApks.kt │ │ ├── ProjectExtensions.kt │ │ └── Spotless.kt │ ├── gradle.properties │ └── settings.gradle.kts ├── build.gradle.kts ├── build_android_release.sh ├── compose_compiler_config.conf ├── core/ │ ├── analytics/ │ │ ├── .gitignore │ │ ├── README.md │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── demo/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── google/ │ │ │ └── samples/ │ │ │ └── apps/ │ │ │ └── nowinandroid/ │ │ │ └── core/ │ │ │ └── analytics/ │ │ │ └── AnalyticsModule.kt │ │ ├── main/ │ │ │ ├── AndroidManifest.xml │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── google/ │ │ │ └── samples/ │ │ │ └── apps/ │ │ │ └── nowinandroid/ │ │ │ └── core/ │ │ │ └── analytics/ │ │ │ ├── AnalyticsEvent.kt │ │ │ ├── AnalyticsHelper.kt │ │ │ ├── NoOpAnalyticsHelper.kt │ │ │ ├── StubAnalyticsHelper.kt │ │ │ └── UiHelpers.kt │ │ └── prod/ │ │ └── kotlin/ │ │ └── com/ │ │ └── google/ │ │ └── samples/ │ │ └── apps/ │ │ └── nowinandroid/ │ │ └── core/ │ │ └── analytics/ │ │ ├── AnalyticsModule.kt │ │ └── FirebaseAnalyticsHelper.kt │ ├── common/ │ │ ├── .gitignore │ │ ├── README.md │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── main/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── google/ │ │ │ └── samples/ │ │ │ └── apps/ │ │ │ └── nowinandroid/ │ │ │ └── core/ │ │ │ └── common/ │ │ │ ├── network/ │ │ │ │ ├── NiaDispatchers.kt │ │ │ │ └── di/ │ │ │ │ ├── CoroutineScopesModule.kt │ │ │ │ └── DispatchersModule.kt │ │ │ └── result/ │ │ │ └── Result.kt │ │ └── test/ │ │ └── kotlin/ │ │ └── com/ │ │ └── google/ │ │ └── samples/ │ │ └── apps/ │ │ └── nowinandroid/ │ │ └── core/ │ │ └── common/ │ │ └── result/ │ │ └── ResultKtTest.kt │ ├── data/ │ │ ├── .gitignore │ │ ├── README.md │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── main/ │ │ │ ├── AndroidManifest.xml │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── google/ │ │ │ └── samples/ │ │ │ └── apps/ │ │ │ └── nowinandroid/ │ │ │ └── core/ │ │ │ └── data/ │ │ │ ├── SyncUtilities.kt │ │ │ ├── di/ │ │ │ │ ├── DataModule.kt │ │ │ │ └── UserNewsResourceRepositoryModule.kt │ │ │ ├── model/ │ │ │ │ ├── NewsResource.kt │ │ │ │ ├── RecentSearchQuery.kt │ │ │ │ └── Topic.kt │ │ │ ├── repository/ │ │ │ │ ├── AnalyticsExtensions.kt │ │ │ │ ├── CompositeUserNewsResourceRepository.kt │ │ │ │ ├── DefaultRecentSearchRepository.kt │ │ │ │ ├── DefaultSearchContentsRepository.kt │ │ │ │ ├── NewsRepository.kt │ │ │ │ ├── OfflineFirstNewsRepository.kt │ │ │ │ ├── OfflineFirstTopicsRepository.kt │ │ │ │ ├── OfflineFirstUserDataRepository.kt │ │ │ │ ├── RecentSearchRepository.kt │ │ │ │ ├── SearchContentsRepository.kt │ │ │ │ ├── TopicsRepository.kt │ │ │ │ ├── UserDataRepository.kt │ │ │ │ └── UserNewsResourceRepository.kt │ │ │ └── util/ │ │ │ ├── ConnectivityManagerNetworkMonitor.kt │ │ │ ├── NetworkMonitor.kt │ │ │ ├── SyncManager.kt │ │ │ └── TimeZoneMonitor.kt │ │ └── test/ │ │ └── kotlin/ │ │ └── com/ │ │ └── google/ │ │ └── samples/ │ │ └── apps/ │ │ └── nowinandroid/ │ │ └── core/ │ │ ├── data/ │ │ │ ├── CompositeUserNewsResourceRepositoryTest.kt │ │ │ ├── UserNewsResourceTest.kt │ │ │ ├── model/ │ │ │ │ └── NetworkEntityTest.kt │ │ │ ├── repository/ │ │ │ │ ├── OfflineFirstNewsRepositoryTest.kt │ │ │ │ ├── OfflineFirstTopicsRepositoryTest.kt │ │ │ │ ├── OfflineFirstUserDataRepositoryTest.kt │ │ │ │ └── TestSynchronizer.kt │ │ │ └── testdoubles/ │ │ │ ├── TestNewsResourceDao.kt │ │ │ ├── TestNiaNetworkDataSource.kt │ │ │ └── TestTopicDao.kt │ │ └── database/ │ │ └── model/ │ │ └── PopulatedNewsResourceKtTest.kt │ ├── data-test/ │ │ ├── .gitignore │ │ ├── README.md │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── kotlin/ │ │ └── com/ │ │ └── google/ │ │ └── samples/ │ │ └── apps/ │ │ └── nowinandroid/ │ │ └── core/ │ │ └── data/ │ │ └── test/ │ │ ├── AlwaysOnlineNetworkMonitor.kt │ │ ├── DefaultZoneIdTimeZoneMonitor.kt │ │ ├── TestDataModule.kt │ │ └── repository/ │ │ ├── FakeNewsRepository.kt │ │ ├── FakeRecentSearchRepository.kt │ │ ├── FakeSearchContentsRepository.kt │ │ ├── FakeTopicsRepository.kt │ │ └── FakeUserDataRepository.kt │ ├── database/ │ │ ├── .gitignore │ │ ├── README.md │ │ ├── build.gradle.kts │ │ ├── schemas/ │ │ │ └── com.google.samples.apps.nowinandroid.core.database.NiaDatabase/ │ │ │ ├── 1.json │ │ │ ├── 10.json │ │ │ ├── 11.json │ │ │ ├── 12.json │ │ │ ├── 13.json │ │ │ ├── 14.json │ │ │ ├── 2.json │ │ │ ├── 3.json │ │ │ ├── 4.json │ │ │ ├── 5.json │ │ │ ├── 6.json │ │ │ ├── 7.json │ │ │ ├── 8.json │ │ │ └── 9.json │ │ └── src/ │ │ ├── androidTest/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── google/ │ │ │ └── samples/ │ │ │ └── apps/ │ │ │ └── nowinandroid/ │ │ │ └── core/ │ │ │ └── database/ │ │ │ └── dao/ │ │ │ ├── DatabaseTest.kt │ │ │ ├── NewsResourceDaoTest.kt │ │ │ └── TopicDaoTest.kt │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── kotlin/ │ │ └── com/ │ │ └── google/ │ │ └── samples/ │ │ └── apps/ │ │ └── nowinandroid/ │ │ └── core/ │ │ └── database/ │ │ ├── DatabaseMigrations.kt │ │ ├── NiaDatabase.kt │ │ ├── dao/ │ │ │ ├── NewsResourceDao.kt │ │ │ ├── NewsResourceFtsDao.kt │ │ │ ├── RecentSearchQueryDao.kt │ │ │ ├── TopicDao.kt │ │ │ └── TopicFtsDao.kt │ │ ├── di/ │ │ │ ├── DaosModule.kt │ │ │ └── DatabaseModule.kt │ │ ├── model/ │ │ │ ├── NewsResourceEntity.kt │ │ │ ├── NewsResourceFtsEntity.kt │ │ │ ├── NewsResourceTopicCrossRef.kt │ │ │ ├── PopulatedNewsResource.kt │ │ │ ├── RecentSearchQueryEntity.kt │ │ │ ├── TopicEntity.kt │ │ │ └── TopicFtsEntity.kt │ │ └── util/ │ │ └── InstantConverter.kt │ ├── datastore/ │ │ ├── .gitignore │ │ ├── README.md │ │ ├── build.gradle.kts │ │ ├── consumer-proguard-rules.pro │ │ └── src/ │ │ ├── main/ │ │ │ ├── AndroidManifest.xml │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── google/ │ │ │ └── samples/ │ │ │ └── apps/ │ │ │ └── nowinandroid/ │ │ │ └── core/ │ │ │ └── datastore/ │ │ │ ├── ChangeListVersions.kt │ │ │ ├── IntToStringIdsMigration.kt │ │ │ ├── ListToMapMigration.kt │ │ │ ├── NiaPreferencesDataSource.kt │ │ │ ├── UserPreferencesSerializer.kt │ │ │ └── di/ │ │ │ └── DataStoreModule.kt │ │ └── test/ │ │ └── kotlin/ │ │ └── com/ │ │ └── google/ │ │ └── samples/ │ │ └── apps/ │ │ └── nowinandroid/ │ │ └── core/ │ │ └── datastore/ │ │ ├── IntToStringIdsMigrationTest.kt │ │ ├── ListToMapMigrationTest.kt │ │ ├── NiaPreferencesDataSourceTest.kt │ │ └── UserPreferencesSerializerTest.kt │ ├── datastore-proto/ │ │ ├── README.md │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ └── proto/ │ │ └── com/ │ │ └── google/ │ │ └── samples/ │ │ └── apps/ │ │ └── nowinandroid/ │ │ └── data/ │ │ ├── dark_theme_config.proto │ │ ├── theme_brand.proto │ │ └── user_preferences.proto │ ├── datastore-test/ │ │ ├── .gitignore │ │ ├── README.md │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── kotlin/ │ │ └── com/ │ │ └── google/ │ │ └── samples/ │ │ └── apps/ │ │ └── nowinandroid/ │ │ └── core/ │ │ └── datastore/ │ │ └── test/ │ │ ├── InMemoryDataStore.kt │ │ └── TestDataStoreModule.kt │ ├── designsystem/ │ │ ├── .gitignore │ │ ├── README.md │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── main/ │ │ │ ├── AndroidManifest.xml │ │ │ ├── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── google/ │ │ │ │ └── samples/ │ │ │ │ └── apps/ │ │ │ │ └── nowinandroid/ │ │ │ │ └── core/ │ │ │ │ └── designsystem/ │ │ │ │ ├── component/ │ │ │ │ │ ├── Background.kt │ │ │ │ │ ├── Button.kt │ │ │ │ │ ├── Chip.kt │ │ │ │ │ ├── DynamicAsyncImage.kt │ │ │ │ │ ├── IconButton.kt │ │ │ │ │ ├── LoadingWheel.kt │ │ │ │ │ ├── Navigation.kt │ │ │ │ │ ├── Tabs.kt │ │ │ │ │ ├── Tag.kt │ │ │ │ │ ├── TopAppBar.kt │ │ │ │ │ ├── ViewToggle.kt │ │ │ │ │ └── scrollbar/ │ │ │ │ │ ├── AppScrollbars.kt │ │ │ │ │ ├── LazyScrollbarUtilities.kt │ │ │ │ │ ├── Scrollbar.kt │ │ │ │ │ ├── ScrollbarExt.kt │ │ │ │ │ └── ThumbExt.kt │ │ │ │ ├── icon/ │ │ │ │ │ └── NiaIcons.kt │ │ │ │ └── theme/ │ │ │ │ ├── Background.kt │ │ │ │ ├── Color.kt │ │ │ │ ├── Gradient.kt │ │ │ │ ├── Theme.kt │ │ │ │ ├── Tint.kt │ │ │ │ └── Type.kt │ │ │ └── res/ │ │ │ └── drawable/ │ │ │ └── core_designsystem_ic_placeholder_default.xml │ │ └── test/ │ │ ├── kotlin/ │ │ │ └── com/ │ │ │ └── google/ │ │ │ └── samples/ │ │ │ └── apps/ │ │ │ └── nowinandroid/ │ │ │ └── core/ │ │ │ └── designsystem/ │ │ │ ├── BackgroundScreenshotTests.kt │ │ │ ├── ButtonScreenshotTests.kt │ │ │ ├── FilterChipScreenshotTests.kt │ │ │ ├── IconButtonScreenshotTests.kt │ │ │ ├── LoadingWheelScreenshotTests.kt │ │ │ ├── NavigationScreenshotTests.kt │ │ │ ├── TabsScreenshotTests.kt │ │ │ ├── TagScreenshotTests.kt │ │ │ ├── ThemeTest.kt │ │ │ └── TopAppBarScreenshotTests.kt │ │ └── resources/ │ │ └── robolectric.properties │ ├── domain/ │ │ ├── .gitignore │ │ ├── README.md │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── main/ │ │ │ ├── AndroidManifest.xml │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── google/ │ │ │ └── samples/ │ │ │ └── apps/ │ │ │ └── nowinandroid/ │ │ │ └── core/ │ │ │ └── domain/ │ │ │ ├── GetFollowableTopicsUseCase.kt │ │ │ ├── GetRecentSearchQueriesUseCase.kt │ │ │ └── GetSearchContentsUseCase.kt │ │ └── test/ │ │ └── kotlin/ │ │ └── com/ │ │ └── google/ │ │ └── samples/ │ │ └── apps/ │ │ └── nowinandroid/ │ │ └── core/ │ │ └── domain/ │ │ └── GetFollowableTopicsUseCaseTest.kt │ ├── model/ │ │ ├── .gitignore │ │ ├── README.md │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ └── kotlin/ │ │ └── com/ │ │ └── google/ │ │ └── samples/ │ │ └── apps/ │ │ └── nowinandroid/ │ │ └── core/ │ │ └── model/ │ │ └── data/ │ │ ├── DarkThemeConfig.kt │ │ ├── FollowableTopic.kt │ │ ├── NewsResource.kt │ │ ├── SearchResult.kt │ │ ├── ThemeBrand.kt │ │ ├── Topic.kt │ │ ├── UserData.kt │ │ ├── UserNewsResource.kt │ │ └── UserSearchResult.kt │ ├── navigation/ │ │ ├── .gitignore │ │ ├── README.md │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── main/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── google/ │ │ │ └── samples/ │ │ │ └── apps/ │ │ │ └── nowinandroid/ │ │ │ └── core/ │ │ │ └── navigation/ │ │ │ ├── NavigationState.kt │ │ │ └── Navigator.kt │ │ └── test/ │ │ └── kotlin/ │ │ └── com/ │ │ └── google/ │ │ └── samples/ │ │ └── apps/ │ │ └── nowinandroid/ │ │ └── core/ │ │ └── navigation/ │ │ └── NavigatorTest.kt │ ├── network/ │ │ ├── .gitignore │ │ ├── README.md │ │ ├── build.gradle.kts │ │ ├── lint.xml │ │ └── src/ │ │ ├── demo/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── google/ │ │ │ └── samples/ │ │ │ └── apps/ │ │ │ └── nowinandroid/ │ │ │ └── core/ │ │ │ └── network/ │ │ │ └── di/ │ │ │ └── FlavoredNetworkModule.kt │ │ ├── main/ │ │ │ ├── AndroidManifest.xml │ │ │ ├── assets/ │ │ │ │ ├── news.json │ │ │ │ └── topics.json │ │ │ └── kotlin/ │ │ │ ├── JvmUnitTestDemoAssetManager.kt │ │ │ └── com/ │ │ │ └── google/ │ │ │ └── samples/ │ │ │ └── apps/ │ │ │ └── nowinandroid/ │ │ │ └── core/ │ │ │ └── network/ │ │ │ ├── NiaNetworkDataSource.kt │ │ │ ├── demo/ │ │ │ │ ├── DemoAssetManager.kt │ │ │ │ └── DemoNiaNetworkDataSource.kt │ │ │ ├── di/ │ │ │ │ └── NetworkModule.kt │ │ │ ├── model/ │ │ │ │ ├── NetworkChangeList.kt │ │ │ │ ├── NetworkNewsResource.kt │ │ │ │ └── NetworkTopic.kt │ │ │ └── retrofit/ │ │ │ └── RetrofitNiaNetwork.kt │ │ ├── prod/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── google/ │ │ │ └── samples/ │ │ │ └── apps/ │ │ │ └── nowinandroid/ │ │ │ └── core/ │ │ │ └── network/ │ │ │ └── di/ │ │ │ └── FlavoredNetworkModule.kt │ │ └── test/ │ │ └── kotlin/ │ │ └── com/ │ │ └── google/ │ │ └── samples/ │ │ └── apps/ │ │ └── nowinandroid/ │ │ └── core/ │ │ └── network/ │ │ └── demo/ │ │ └── DemoNiaNetworkDataSourceTest.kt │ ├── notifications/ │ │ ├── .gitignore │ │ ├── README.md │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── demo/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── google/ │ │ │ └── samples/ │ │ │ └── apps/ │ │ │ └── nowinandroid/ │ │ │ └── core/ │ │ │ └── notifications/ │ │ │ └── NotificationsModule.kt │ │ ├── main/ │ │ │ ├── AndroidManifest.xml │ │ │ ├── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── google/ │ │ │ │ └── samples/ │ │ │ │ └── apps/ │ │ │ │ └── nowinandroid/ │ │ │ │ └── core/ │ │ │ │ └── notifications/ │ │ │ │ ├── NoOpNotifier.kt │ │ │ │ ├── Notifier.kt │ │ │ │ └── SystemTrayNotifier.kt │ │ │ └── res/ │ │ │ ├── drawable-anydpi-v24/ │ │ │ │ └── core_notifications_ic_nia_notification.xml │ │ │ └── values/ │ │ │ └── strings.xml │ │ └── prod/ │ │ └── kotlin/ │ │ └── com/ │ │ └── google/ │ │ └── samples/ │ │ └── apps/ │ │ └── nowinandroid/ │ │ └── core/ │ │ └── notifications/ │ │ └── NotificationsModule.kt │ ├── screenshot-testing/ │ │ ├── .gitignore │ │ ├── README.md │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── kotlin/ │ │ └── com/ │ │ └── google/ │ │ └── samples/ │ │ └── apps/ │ │ └── nowinandroid/ │ │ └── core/ │ │ └── testing/ │ │ └── util/ │ │ └── ScreenshotHelper.kt │ ├── testing/ │ │ ├── .gitignore │ │ ├── README.md │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── kotlin/ │ │ └── com/ │ │ └── google/ │ │ └── samples/ │ │ └── apps/ │ │ └── nowinandroid/ │ │ └── core/ │ │ ├── rules/ │ │ │ └── GrantPostNotificationsPermissionRule.kt │ │ └── testing/ │ │ ├── NiaTestRunner.kt │ │ ├── data/ │ │ │ ├── FollowableTopicTestData.kt │ │ │ ├── NewsResourcesTestData.kt │ │ │ ├── TopicsTestData.kt │ │ │ └── UserNewsResourcesTestData.kt │ │ ├── di/ │ │ │ ├── TestDispatcherModule.kt │ │ │ └── TestDispatchersModule.kt │ │ ├── notifications/ │ │ │ └── TestNotifier.kt │ │ ├── repository/ │ │ │ ├── TestNewsRepository.kt │ │ │ ├── TestRecentSearchRepository.kt │ │ │ ├── TestSearchContentsRepository.kt │ │ │ ├── TestTopicsRepository.kt │ │ │ └── TestUserDataRepository.kt │ │ └── util/ │ │ ├── MainDispatcherRule.kt │ │ ├── TestAnalyticsHelper.kt │ │ ├── TestNetworkMonitor.kt │ │ ├── TestSyncManager.kt │ │ └── TestTimeZoneMonitor.kt │ └── ui/ │ ├── .gitignore │ ├── README.md │ ├── build.gradle.kts │ └── src/ │ ├── androidTest/ │ │ └── kotlin/ │ │ └── com/ │ │ └── google/ │ │ └── samples/ │ │ └── apps/ │ │ └── nowinandroid/ │ │ └── core/ │ │ └── ui/ │ │ └── NewsResourceCardTest.kt │ └── main/ │ ├── AndroidManifest.xml │ ├── kotlin/ │ │ └── com/ │ │ └── google/ │ │ └── samples/ │ │ └── apps/ │ │ └── nowinandroid/ │ │ └── core/ │ │ └── ui/ │ │ ├── AnalyticsExtensions.kt │ │ ├── DevicePreviews.kt │ │ ├── FollowableTopicPreviewParameterProvider.kt │ │ ├── InterestsItem.kt │ │ ├── JankStatsExtensions.kt │ │ ├── LocalTimeZone.kt │ │ ├── NewsFeed.kt │ │ ├── NewsResourceCard.kt │ │ ├── NewsResourceCardList.kt │ │ └── UserNewsResourcePreviewParameterProvider.kt │ └── res/ │ └── values/ │ └── strings.xml ├── docs/ │ ├── ArchitectureLearningJourney.md │ └── ModularizationLearningJourney.md ├── feature/ │ ├── bookmarks/ │ │ ├── api/ │ │ │ ├── .gitignore │ │ │ ├── README.md │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── main/ │ │ │ ├── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── google/ │ │ │ │ └── samples/ │ │ │ │ └── apps/ │ │ │ │ └── nowinandroid/ │ │ │ │ └── feature/ │ │ │ │ └── bookmarks/ │ │ │ │ └── api/ │ │ │ │ └── navigation/ │ │ │ │ └── BookmarksNavKey.kt │ │ │ └── res/ │ │ │ ├── drawable/ │ │ │ │ └── feature_bookmarks_api_mg_empty_bookmarks.xml │ │ │ └── values/ │ │ │ └── strings.xml │ │ └── impl/ │ │ ├── .gitignore │ │ ├── README.md │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── androidTest/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── google/ │ │ │ └── samples/ │ │ │ └── apps/ │ │ │ └── nowinandroid/ │ │ │ └── feature/ │ │ │ └── bookmarks/ │ │ │ └── impl/ │ │ │ └── BookmarksScreenTest.kt │ │ ├── main/ │ │ │ ├── AndroidManifest.xml │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── google/ │ │ │ └── samples/ │ │ │ └── apps/ │ │ │ └── nowinandroid/ │ │ │ └── feature/ │ │ │ └── bookmarks/ │ │ │ └── impl/ │ │ │ ├── BookmarksScreen.kt │ │ │ ├── BookmarksViewModel.kt │ │ │ └── navigation/ │ │ │ └── BookmarksEntryProvider.kt │ │ └── test/ │ │ └── kotlin/ │ │ └── com/ │ │ └── google/ │ │ └── samples/ │ │ └── apps/ │ │ └── nowinandroid/ │ │ └── feature/ │ │ └── bookmarks/ │ │ └── impl/ │ │ └── BookmarksViewModelTest.kt │ ├── foryou/ │ │ ├── api/ │ │ │ ├── .gitignore │ │ │ ├── README.md │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── main/ │ │ │ ├── AndroidManifest.xml │ │ │ ├── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── google/ │ │ │ │ └── samples/ │ │ │ │ └── apps/ │ │ │ │ └── nowinandroid/ │ │ │ │ └── feature/ │ │ │ │ └── foryou/ │ │ │ │ └── api/ │ │ │ │ └── navigation/ │ │ │ │ └── ForYouNavKey.kt │ │ │ └── res/ │ │ │ ├── drawable/ │ │ │ │ └── feature_foryou_api_ic_icon_placeholder.xml │ │ │ └── values/ │ │ │ └── strings.xml │ │ └── impl/ │ │ ├── .gitignore │ │ ├── README.md │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── androidTest/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── google/ │ │ │ └── samples/ │ │ │ └── apps/ │ │ │ └── nowinandroid/ │ │ │ └── feature/ │ │ │ └── foryou/ │ │ │ └── impl/ │ │ │ └── ForYouScreenTest.kt │ │ ├── main/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── google/ │ │ │ └── samples/ │ │ │ └── apps/ │ │ │ └── nowinandroid/ │ │ │ └── feature/ │ │ │ └── foryou/ │ │ │ └── impl/ │ │ │ ├── ForYouScreen.kt │ │ │ ├── ForYouViewModel.kt │ │ │ ├── OnboardingUiState.kt │ │ │ └── navigation/ │ │ │ └── ForYouEntryProvider.kt │ │ └── test/ │ │ └── kotlin/ │ │ └── com/ │ │ └── google/ │ │ └── samples/ │ │ └── apps/ │ │ └── nowinandroid/ │ │ └── feature/ │ │ └── foryou/ │ │ └── impl/ │ │ ├── ForYouScreenScreenshotTests.kt │ │ └── ForYouViewModelTest.kt │ ├── interests/ │ │ ├── api/ │ │ │ ├── .gitignore │ │ │ ├── README.md │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── main/ │ │ │ ├── AndroidManifest.xml │ │ │ ├── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── google/ │ │ │ │ └── samples/ │ │ │ │ └── apps/ │ │ │ │ └── nowinandroid/ │ │ │ │ └── feature/ │ │ │ │ └── interests/ │ │ │ │ └── api/ │ │ │ │ └── navigation/ │ │ │ │ └── InterestsNavKey.kt │ │ │ └── res/ │ │ │ ├── drawable/ │ │ │ │ └── feature_interests_api_ic_detail_placeholder.xml │ │ │ └── values/ │ │ │ └── strings.xml │ │ └── impl/ │ │ ├── .gitignore │ │ ├── README.md │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── androidTest/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── google/ │ │ │ └── samples/ │ │ │ └── apps/ │ │ │ └── nowinandroid/ │ │ │ └── feature/ │ │ │ └── interests/ │ │ │ └── impl/ │ │ │ └── InterestsScreenTest.kt │ │ ├── main/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── google/ │ │ │ └── samples/ │ │ │ └── apps/ │ │ │ └── nowinandroid/ │ │ │ └── feature/ │ │ │ └── interests/ │ │ │ └── impl/ │ │ │ ├── InterestsDetailPlaceholder.kt │ │ │ ├── InterestsScreen.kt │ │ │ ├── InterestsViewModel.kt │ │ │ ├── TabContent.kt │ │ │ └── navigation/ │ │ │ └── InterestsEntryProvider.kt │ │ └── test/ │ │ └── kotlin/ │ │ └── com/ │ │ └── google/ │ │ └── samples/ │ │ └── apps/ │ │ └── nowinandroid/ │ │ └── interests/ │ │ └── impl/ │ │ ├── InterestsListDetailScreenTest.kt │ │ └── InterestsViewModelTest.kt │ ├── search/ │ │ ├── api/ │ │ │ ├── .gitignore │ │ │ ├── README.md │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── main/ │ │ │ ├── AndroidManifest.xml │ │ │ ├── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── google/ │ │ │ │ └── samples/ │ │ │ │ └── apps/ │ │ │ │ └── nowinandroid/ │ │ │ │ └── feature/ │ │ │ │ └── search/ │ │ │ │ └── api/ │ │ │ │ └── navigation/ │ │ │ │ └── SearchNavKey.kt │ │ │ └── res/ │ │ │ └── values/ │ │ │ └── strings.xml │ │ └── impl/ │ │ ├── .gitignore │ │ ├── README.md │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── androidTest/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── google/ │ │ │ └── samples/ │ │ │ └── apps/ │ │ │ └── nowinandroid/ │ │ │ └── feature/ │ │ │ └── search/ │ │ │ └── impl/ │ │ │ └── SearchScreenTest.kt │ │ ├── main/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── google/ │ │ │ └── samples/ │ │ │ └── apps/ │ │ │ └── nowinandroid/ │ │ │ └── feature/ │ │ │ └── search/ │ │ │ └── impl/ │ │ │ ├── RecentSearchQueriesUiState.kt │ │ │ ├── SearchResultUiState.kt │ │ │ ├── SearchScreen.kt │ │ │ ├── SearchUiStatePreviewParameterProvider.kt │ │ │ ├── SearchViewModel.kt │ │ │ └── navigation/ │ │ │ └── SearchEntryProvider.kt │ │ └── test/ │ │ └── kotlin/ │ │ └── com/ │ │ └── google/ │ │ └── samples/ │ │ └── apps/ │ │ └── nowinandroid/ │ │ └── feature/ │ │ └── search/ │ │ └── impl/ │ │ └── SearchViewModelTest.kt │ ├── settings/ │ │ └── impl/ │ │ ├── .gitignore │ │ ├── README.md │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── androidTest/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── google/ │ │ │ └── samples/ │ │ │ └── apps/ │ │ │ └── nowinandroid/ │ │ │ └── feature/ │ │ │ └── settings/ │ │ │ └── impl/ │ │ │ └── SettingsDialogTest.kt │ │ ├── main/ │ │ │ ├── AndroidManifest.xml │ │ │ ├── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── google/ │ │ │ │ └── samples/ │ │ │ │ └── apps/ │ │ │ │ └── nowinandroid/ │ │ │ │ └── feature/ │ │ │ │ └── settings/ │ │ │ │ └── impl/ │ │ │ │ ├── SettingsDialog.kt │ │ │ │ └── SettingsViewModel.kt │ │ │ └── res/ │ │ │ └── values/ │ │ │ └── strings.xml │ │ └── test/ │ │ └── kotlin/ │ │ └── com/ │ │ └── google/ │ │ └── samples/ │ │ └── apps/ │ │ └── nowinandroid/ │ │ └── feature/ │ │ └── settings/ │ │ └── impl/ │ │ └── SettingsViewModelTest.kt │ └── topic/ │ ├── api/ │ │ ├── .gitignore │ │ ├── README.md │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ ├── kotlin/ │ │ │ └── com/ │ │ │ └── google/ │ │ │ └── samples/ │ │ │ └── apps/ │ │ │ └── nowinandroid/ │ │ │ └── feature/ │ │ │ └── topic/ │ │ │ └── api/ │ │ │ └── navigation/ │ │ │ └── TopicNavKey.kt │ │ └── res/ │ │ └── values/ │ │ └── strings.xml │ └── impl/ │ ├── .gitignore │ ├── README.md │ ├── build.gradle.kts │ └── src/ │ ├── androidTest/ │ │ └── kotlin/ │ │ └── com/ │ │ └── google/ │ │ └── samples/ │ │ └── apps/ │ │ └── nowinandroid/ │ │ └── feature/ │ │ └── topic/ │ │ └── impl/ │ │ └── TopicScreenTest.kt │ ├── main/ │ │ └── kotlin/ │ │ └── com/ │ │ └── google/ │ │ └── samples/ │ │ └── apps/ │ │ └── nowinandroid/ │ │ └── feature/ │ │ └── topic/ │ │ └── impl/ │ │ ├── TopicScreen.kt │ │ ├── TopicViewModel.kt │ │ └── navigation/ │ │ └── TopicEntryProvider.kt │ └── test/ │ └── kotlin/ │ └── com/ │ └── google/ │ └── samples/ │ └── apps/ │ └── nowinandroid/ │ └── feature/ │ └── topic/ │ └── impl/ │ └── TopicViewModelTest.kt ├── gradle/ │ ├── libs.versions.toml │ └── wrapper/ │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradle.properties ├── gradlew ├── gradlew.bat ├── kokoro/ │ ├── build.sh │ ├── continuous.cfg │ ├── nightly.cfg │ ├── nightly.sh │ └── presubmit.cfg ├── lint/ │ ├── .gitignore │ ├── README.md │ ├── build.gradle.kts │ └── src/ │ ├── main/ │ │ ├── kotlin/ │ │ │ └── com/ │ │ │ └── google/ │ │ │ └── samples/ │ │ │ └── apps/ │ │ │ └── nowinandroid/ │ │ │ └── lint/ │ │ │ ├── NiaIssueRegistry.kt │ │ │ ├── TestMethodNameDetector.kt │ │ │ └── designsystem/ │ │ │ └── DesignSystemDetector.kt │ │ └── resources/ │ │ └── META-INF/ │ │ └── services/ │ │ └── com.android.tools.lint.client.api.IssueRegistry │ └── test/ │ └── kotlin/ │ └── com/ │ └── google/ │ └── samples/ │ └── apps/ │ └── nowinandroid/ │ └── lint/ │ ├── TestMethodNameDetectorTest.kt │ └── designsystem/ │ └── DesignSystemDetectorTest.kt ├── settings.gradle.kts ├── spotless/ │ ├── copyright.kt │ ├── copyright.kts │ └── copyright.xml ├── sync/ │ ├── sync-test/ │ │ ├── .gitignore │ │ ├── README.md │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── kotlin/ │ │ └── com/ │ │ └── google/ │ │ └── samples/ │ │ └── apps/ │ │ └── nowinandroid/ │ │ └── core/ │ │ └── sync/ │ │ └── test/ │ │ ├── NeverSyncingSyncManager.kt │ │ └── TestSyncModule.kt │ └── work/ │ ├── .gitignore │ ├── README.md │ ├── build.gradle.kts │ └── src/ │ ├── androidTest/ │ │ └── kotlin/ │ │ └── com/ │ │ └── google/ │ │ └── samples/ │ │ └── apps/ │ │ └── nowinandroid/ │ │ └── sync/ │ │ └── workers/ │ │ └── SyncWorkerTest.kt │ ├── demo/ │ │ └── kotlin/ │ │ └── com/ │ │ └── google/ │ │ └── samples/ │ │ └── apps/ │ │ └── nowinandroid/ │ │ └── sync/ │ │ └── di/ │ │ └── SyncModule.kt │ ├── main/ │ │ ├── kotlin/ │ │ │ └── com/ │ │ │ └── google/ │ │ │ └── samples/ │ │ │ └── apps/ │ │ │ └── nowinandroid/ │ │ │ └── sync/ │ │ │ ├── initializers/ │ │ │ │ ├── SyncInitializer.kt │ │ │ │ └── SyncWorkHelpers.kt │ │ │ ├── status/ │ │ │ │ ├── StubSyncSubscriber.kt │ │ │ │ ├── SyncSubscriber.kt │ │ │ │ └── WorkManagerSyncManager.kt │ │ │ └── workers/ │ │ │ ├── AnalyticsExtensions.kt │ │ │ ├── DelegatingWorker.kt │ │ │ └── SyncWorker.kt │ │ └── res/ │ │ └── values/ │ │ └── strings.xml │ └── prod/ │ ├── AndroidManifest.xml │ └── kotlin/ │ └── com/ │ └── google/ │ └── samples/ │ └── apps/ │ └── nowinandroid/ │ └── sync/ │ ├── di/ │ │ └── SyncModule.kt │ ├── services/ │ │ └── SyncNotificationsService.kt │ └── status/ │ └── FirebaseSyncSubscriber.kt ├── tools/ │ ├── nowinandroid-codestyle.xml │ ├── pre-push │ └── setup.sh └── ui-test-hilt-manifest/ ├── .gitignore ├── README.md ├── build.gradle.kts └── src/ └── main/ ├── AndroidManifest.xml └── kotlin/ └── com/ └── google/ └── samples/ └── apps/ └── nowinandroid/ └── uitesthiltmanifest/ └── HiltComponentActivity.kt