From 932f80a2815390198ae1095525545d3cee602d08 Mon Sep 17 00:00:00 2001 From: Mohsen Rzna Date: Sun, 20 Nov 2022 12:15:35 +0100 Subject: [PATCH 01/72] Added the test for empty state and refactor --- .../feature/bookmarks/BookmarksScreenTest.kt | 37 ++++++++++++++----- 1 file changed, 27 insertions(+), 10 deletions(-) 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 1dafc5c98..81d99442c 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 @@ -17,7 +17,6 @@ package com.google.samples.apps.nowinandroid.feature.bookmarks import androidx.activity.ComponentActivity -import androidx.compose.material3.windowsizeclass.WindowSizeClass import androidx.compose.ui.test.assertCountEquals import androidx.compose.ui.test.assertHasClickAction import androidx.compose.ui.test.filter @@ -34,10 +33,11 @@ import androidx.compose.ui.test.performScrollToNode import com.google.samples.apps.nowinandroid.core.domain.model.SaveableNewsResource import com.google.samples.apps.nowinandroid.core.model.data.previewNewsResources import com.google.samples.apps.nowinandroid.core.ui.NewsFeedUiState -import kotlin.test.assertEquals -import kotlin.test.assertTrue +import com.google.samples.apps.nowinandroid.core.ui.R.string import org.junit.Rule import org.junit.Test +import kotlin.test.assertEquals +import kotlin.test.assertTrue /** * UI tests for [BookmarksScreen] composable. @@ -65,8 +65,6 @@ class BookmarksScreenTest { @Test fun feed_whenHasBookmarks_showsBookmarks() { - lateinit var windowSizeClass: WindowSizeClass - composeTestRule.setContent { BookmarksScreen( feedState = NewsFeedUiState.Success( @@ -120,11 +118,8 @@ class BookmarksScreenTest { } composeTestRule - .onAllNodesWithContentDescription( - composeTestRule.activity.getString( - com.google.samples.apps.nowinandroid.core.ui.R.string.unbookmark - ) - ).filter( + .onAllNodesWithContentDescription(composeTestRule.activity.getString(string.unbookmark)) + .filter( hasAnyAncestor( hasText( previewNewsResources[0].title, @@ -138,4 +133,26 @@ class BookmarksScreenTest { assertTrue(removeFromBookmarksCalled) } + + @Test + fun feed_whenHasNoBookmarks_showsEmptyState() { + composeTestRule.setContent { + BookmarksScreen( + feedState = NewsFeedUiState.Success(emptyList()), + removeFromBookmarks = { } + ) + } + + composeTestRule + .onNodeWithText( + composeTestRule.activity.getString(R.string.bookmarks_empty_error) + ) + .assertExists() + + composeTestRule + .onNodeWithText( + composeTestRule.activity.getString(R.string.bookmarks_empty_description) + ) + .assertExists() + } } From 40838f8138c569661fb1653d07b21094b2739770 Mon Sep 17 00:00:00 2001 From: Mohsen Rzna Date: Sun, 20 Nov 2022 12:28:35 +0100 Subject: [PATCH 02/72] Spotless apply --- .../feature/bookmarks/BookmarksScreenTest.kt | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) 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 81d99442c..ff033033a 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 @@ -33,11 +33,10 @@ import androidx.compose.ui.test.performScrollToNode import com.google.samples.apps.nowinandroid.core.domain.model.SaveableNewsResource import com.google.samples.apps.nowinandroid.core.model.data.previewNewsResources import com.google.samples.apps.nowinandroid.core.ui.NewsFeedUiState -import com.google.samples.apps.nowinandroid.core.ui.R.string -import org.junit.Rule -import org.junit.Test import kotlin.test.assertEquals import kotlin.test.assertTrue +import org.junit.Rule +import org.junit.Test /** * UI tests for [BookmarksScreen] composable. @@ -118,8 +117,11 @@ class BookmarksScreenTest { } composeTestRule - .onAllNodesWithContentDescription(composeTestRule.activity.getString(string.unbookmark)) - .filter( + .onAllNodesWithContentDescription( + composeTestRule.activity.getString( + com.google.samples.apps.nowinandroid.core.ui.R.string.unbookmark + ) + ).filter( hasAnyAncestor( hasText( previewNewsResources[0].title, From d865c6421e44df18f8bbc90847547a5c0dd44655 Mon Sep 17 00:00:00 2001 From: Mohsen Rzna Date: Sun, 20 Nov 2022 15:10:04 +0100 Subject: [PATCH 03/72] Reverted the changes back for import --- .../nowinandroid/feature/bookmarks/BookmarksScreenTest.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 ff033033a..4e47f06b1 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 @@ -33,10 +33,10 @@ import androidx.compose.ui.test.performScrollToNode import com.google.samples.apps.nowinandroid.core.domain.model.SaveableNewsResource import com.google.samples.apps.nowinandroid.core.model.data.previewNewsResources 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. From 4ded548ba730d2053463c6a5fd03db48b90fa70e Mon Sep 17 00:00:00 2001 From: Mohsen Rzna Date: Sun, 20 Nov 2022 15:23:50 +0100 Subject: [PATCH 04/72] Spotless apply - new version --- .../nowinandroid/feature/bookmarks/BookmarksScreenTest.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 4e47f06b1..ff033033a 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 @@ -33,10 +33,10 @@ import androidx.compose.ui.test.performScrollToNode import com.google.samples.apps.nowinandroid.core.domain.model.SaveableNewsResource import com.google.samples.apps.nowinandroid.core.model.data.previewNewsResources import com.google.samples.apps.nowinandroid.core.ui.NewsFeedUiState -import org.junit.Rule -import org.junit.Test import kotlin.test.assertEquals import kotlin.test.assertTrue +import org.junit.Rule +import org.junit.Test /** * UI tests for [BookmarksScreen] composable. From 55c3ebd0851aeea5495a714daa958bd044286735 Mon Sep 17 00:00:00 2001 From: Caren Date: Tue, 29 Nov 2022 12:52:34 -0800 Subject: [PATCH 05/72] Use Chrome Custom tab for opening articles Change-Id: I0024038f918a18d3c3e803587a7e1c159bfb9169 --- core/ui/build.gradle.kts | 1 + .../apps/nowinandroid/core/ui/NewsFeed.kt | 21 +++++++++++++++---- gradle/libs.versions.toml | 2 ++ 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/core/ui/build.gradle.kts b/core/ui/build.gradle.kts index 794b1573b..c76e4bb27 100644 --- a/core/ui/build.gradle.kts +++ b/core/ui/build.gradle.kts @@ -28,6 +28,7 @@ dependencies { implementation(project(":core:model")) implementation(project(":core:domain")) + implementation(libs.androidx.browser) implementation(libs.androidx.core.ktx) implementation(libs.coil.kt) implementation(libs.coil.kt.compose) 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 32308bd63..e72b6286e 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 @@ -16,22 +16,25 @@ package com.google.samples.apps.nowinandroid.core.ui -import android.content.Intent +import android.content.Context import android.net.Uri +import androidx.browser.customtabs.CustomTabColorSchemeParams +import androidx.browser.customtabs.CustomTabsIntent import androidx.compose.foundation.lazy.LazyListScope import androidx.compose.foundation.lazy.grid.GridCells import androidx.compose.foundation.lazy.grid.LazyGridScope import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.foundation.lazy.grid.items +import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +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.unit.dp -import androidx.core.content.ContextCompat import com.google.samples.apps.nowinandroid.core.designsystem.theme.NiaTheme import com.google.samples.apps.nowinandroid.core.domain.model.SaveableNewsResource import com.google.samples.apps.nowinandroid.core.model.data.previewNewsResources @@ -51,13 +54,13 @@ fun LazyGridScope.newsFeed( val resourceUrl by remember { mutableStateOf(Uri.parse(saveableNewsResource.newsResource.url)) } - val launchResourceIntent = Intent(Intent.ACTION_VIEW, resourceUrl) val context = LocalContext.current + val backgroundColor = MaterialTheme.colorScheme.background.toArgb() NewsResourceCardExpanded( newsResource = saveableNewsResource.newsResource, isBookmarked = saveableNewsResource.isSaved, - onClick = { ContextCompat.startActivity(context, launchResourceIntent, null) }, + onClick = { launchCustomChromeTab(context, resourceUrl, backgroundColor) }, onToggleBookmark = { onNewsResourcesCheckedChanged( saveableNewsResource.newsResource.id, @@ -70,6 +73,16 @@ fun LazyGridScope.newsFeed( } } +private fun launchCustomChromeTab(context: Context, uri: Uri, toolbarColor: Int) { + val customTabBarColor = CustomTabColorSchemeParams.Builder() + .setToolbarColor(toolbarColor).build() + val customTabsIntent = CustomTabsIntent.Builder() + .setDefaultColorSchemeParams(customTabBarColor) + .build() + + customTabsIntent.launchUrl(context, uri) +} + /** * A sealed hierarchy describing the state of the feed of news resources. */ diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 5892e277d..6022856fe 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -4,6 +4,7 @@ androidDesugarJdkLibs = "1.2.0" androidGradlePlugin = "7.3.1" androidxActivity = "1.6.1" androidxAppCompat = "1.5.1" +androidxBrowser = "1.4.0" androidxComposeBom = "2022.11.00" androidxComposeCompiler = "1.3.2" androidxComposeRuntimeTracing = "1.0.0-alpha01" @@ -53,6 +54,7 @@ android-desugarJdkLibs = { group = "com.android.tools", name = "desugar_jdk_libs androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "androidxActivity" } androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "androidxAppCompat" } androidx-benchmark-macro = { group = "androidx.benchmark", name = "benchmark-macro-junit4", version.ref = "androidxMacroBenchmark" } +androidx-browser = { group = "androidx.browser", name = "browser", version.ref = "androidxBrowser" } androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "androidxComposeBom" } androidx-compose-foundation = { group = "androidx.compose.foundation", name = "foundation" } androidx-compose-foundation-layout = { group = "androidx.compose.foundation", name = "foundation-layout" } From 45f8e069c56c3e8c7aa89e8de70da4f7221c1a52 Mon Sep 17 00:00:00 2001 From: Caren Date: Fri, 2 Dec 2022 12:35:23 -0800 Subject: [PATCH 06/72] Implement custom chrome tabs in NewsResourceCardList as well Change-Id: Ie5851666117a7c756b3d9ad02d6e17be0d3ba904 --- .../google/samples/apps/nowinandroid/core/ui/NewsFeed.kt | 2 +- .../apps/nowinandroid/core/ui/NewsResourceCardList.kt | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) 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 e72b6286e..28c7217ff 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 @@ -73,7 +73,7 @@ fun LazyGridScope.newsFeed( } } -private fun launchCustomChromeTab(context: Context, uri: Uri, toolbarColor: Int) { +fun launchCustomChromeTab(context: Context, uri: Uri, toolbarColor: Int) { val customTabBarColor = CustomTabColorSchemeParams.Builder() .setToolbarColor(toolbarColor).build() val customTabsIntent = CustomTabsIntent.Builder() 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 25a7bd2dc..6c5e7ffcb 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 @@ -20,7 +20,9 @@ import android.content.Intent import android.net.Uri import androidx.compose.foundation.lazy.LazyListScope import androidx.compose.foundation.lazy.items +import androidx.compose.material3.MaterialTheme import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.platform.LocalContext import androidx.core.content.ContextCompat import com.google.samples.apps.nowinandroid.core.model.data.NewsResource @@ -47,8 +49,8 @@ fun LazyListScope.newsResourceCardItems( key = { newsResourceMapper(it).id }, itemContent = { item -> val newsResource = newsResourceMapper(item) - val launchResourceIntent = - Intent(Intent.ACTION_VIEW, Uri.parse(newsResource.url)) + val resourceUrl = Uri.parse(newsResource.url) + val backgroundColor = MaterialTheme.colorScheme.background.toArgb() val context = LocalContext.current NewsResourceCardExpanded( @@ -57,7 +59,7 @@ fun LazyListScope.newsResourceCardItems( onToggleBookmark = { onToggleBookmark(item) }, onClick = { when (onItemClick) { - null -> ContextCompat.startActivity(context, launchResourceIntent, null) + null -> launchCustomChromeTab(context, resourceUrl, backgroundColor) else -> onItemClick(item) } }, From 94e2bb0ec252bed96e3215a355a542e8ae2e5b5e Mon Sep 17 00:00:00 2001 From: Caren Date: Fri, 2 Dec 2022 12:37:57 -0800 Subject: [PATCH 07/72] Run spotless Change-Id: I1deee3c9b38d352afca0f646366598e32710ffca --- .../samples/apps/nowinandroid/core/ui/NewsResourceCardList.kt | 2 -- 1 file changed, 2 deletions(-) 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 6c5e7ffcb..c76a8124d 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 @@ -16,7 +16,6 @@ package com.google.samples.apps.nowinandroid.core.ui -import android.content.Intent import android.net.Uri import androidx.compose.foundation.lazy.LazyListScope import androidx.compose.foundation.lazy.items @@ -24,7 +23,6 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.platform.LocalContext -import androidx.core.content.ContextCompat import com.google.samples.apps.nowinandroid.core.model.data.NewsResource /** From c9e764b0d8c6ce21361f984cbf0a5b369c3d56a1 Mon Sep 17 00:00:00 2001 From: mlykotom Date: Mon, 5 Dec 2022 14:50:08 +0100 Subject: [PATCH 08/72] Update to Gradle Wrapper 7.6 Change-Id: I020d73e89fcd6be6df4b25c348641f82b4a3a404 --- gradle/wrapper/gradle-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ae04661ee..070cb702f 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From 56ccf930728460c86da671a5c11986ca07053149 Mon Sep 17 00:00:00 2001 From: mlykotom Date: Mon, 5 Dec 2022 14:57:09 +0100 Subject: [PATCH 09/72] Update run configuration Change-Id: I7f2b4733ffe22dad680506218441e0bd9e10eafb --- .run/Generate Demo Baseline Profile.run.xml | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/.run/Generate Demo Baseline Profile.run.xml b/.run/Generate Demo Baseline Profile.run.xml index 68174ea4b..4c34e5a76 100644 --- a/.run/Generate Demo Baseline Profile.run.xml +++ b/.run/Generate Demo Baseline Profile.run.xml @@ -16,22 +16,27 @@ -->