From de6545f5d7822cfa9ac3bc2263f51498863f80ca Mon Sep 17 00:00:00 2001 From: Simon Marquis Date: Mon, 8 May 2023 10:22:13 +0200 Subject: [PATCH 01/10] Simplify handling of nullability in `ConnectivityManagerNetworkMonitor` --- .../util/ConnectivityManagerNetworkMonitor.kt | 82 +++++++++---------- 1 file changed, 41 insertions(+), 41 deletions(-) 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 982f47c6e..001b6d4c9 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 @@ -30,61 +30,61 @@ import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.callbackFlow import kotlinx.coroutines.flow.conflate +import Kotlinx.coroutines.flow.flowOf import javax.inject.Inject class ConnectivityManagerNetworkMonitor @Inject constructor( @ApplicationContext private val context: Context, ) : NetworkMonitor { - override val isOnline: Flow = callbackFlow { + override val isOnline: Flow { val connectivityManager = context.getSystemService() + ?: return flowOf(false) - /** - * The callback's methods are invoked on changes to *any* network, not just the active - * network. So to check for network connectivity, one must query the active network of the - * ConnectivityManager. - */ - val callback = object : NetworkCallback() { - override fun onAvailable(network: Network) { - channel.trySend(connectivityManager.isCurrentlyConnected()) - } + return callbackFlow { - override fun onLost(network: Network) { - channel.trySend(connectivityManager.isCurrentlyConnected()) - } + /** + * The callback's methods are invoked on changes to *any* network, not just the active + * network. So to check for network connectivity, one must query the active network of the + * ConnectivityManager. + */ + val callback = object : NetworkCallback() { + override fun onAvailable(network: Network) { + channel.trySend(connectivityManager.isCurrentlyConnected()) + } + + override fun onLost(network: Network) { + channel.trySend(connectivityManager.isCurrentlyConnected()) + } - override fun onCapabilitiesChanged( - network: Network, - networkCapabilities: NetworkCapabilities, - ) { - channel.trySend(connectivityManager.isCurrentlyConnected()) + override fun onCapabilitiesChanged( + network: Network, + networkCapabilities: NetworkCapabilities, + ) { + channel.trySend(connectivityManager.isCurrentlyConnected()) + } } - } - connectivityManager?.registerNetworkCallback( - Builder() - .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) - .build(), - callback, - ) + connectivityManager.registerNetworkCallback( + Builder() + .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) + .build(), + callback, + ) - channel.trySend(connectivityManager.isCurrentlyConnected()) + channel.trySend(connectivityManager.isCurrentlyConnected()) - awaitClose { - connectivityManager?.unregisterNetworkCallback(callback) + awaitClose { + connectivityManager.unregisterNetworkCallback(callback) + } } - } - .conflate() + .conflate() @Suppress("DEPRECATION") - private fun ConnectivityManager?.isCurrentlyConnected() = when (this) { - null -> false - else -> when { - VERSION.SDK_INT >= VERSION_CODES.M -> - activeNetwork - ?.let(::getNetworkCapabilities) - ?.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) - ?: false - else -> activeNetworkInfo?.isConnected ?: false - } - } + private fun ConnectivityManager.isCurrentlyConnected() = when { + VERSION.SDK_INT >= VERSION_CODES.M -> + activeNetwork + ?.let(::getNetworkCapabilities) + ?.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) + else -> activeNetworkInfo?.isConnected + } ?: false } From f34ee1c01bbd70e3c2c3a848d1b8a6a65bcb019d Mon Sep 17 00:00:00 2001 From: Simon Marquis Date: Mon, 8 May 2023 10:46:48 +0200 Subject: [PATCH 02/10] Update ConnectivityManagerNetworkMonitor.kt --- .../util/ConnectivityManagerNetworkMonitor.kt | 68 ++++++++++--------- 1 file changed, 35 insertions(+), 33 deletions(-) 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 001b6d4c9..a21965565 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 @@ -36,48 +36,50 @@ import javax.inject.Inject class ConnectivityManagerNetworkMonitor @Inject constructor( @ApplicationContext private val context: Context, ) : NetworkMonitor { - override val isOnline: Flow { + override val isOnline: Flow = callbackFlow { val connectivityManager = context.getSystemService() - ?: return flowOf(false) - - return callbackFlow { + ?: run { + channel.trySend(false) + channel.close() + return@callbackFlow + } - /** - * The callback's methods are invoked on changes to *any* network, not just the active - * network. So to check for network connectivity, one must query the active network of the - * ConnectivityManager. - */ - val callback = object : NetworkCallback() { - override fun onAvailable(network: Network) { - channel.trySend(connectivityManager.isCurrentlyConnected()) - } + /** + * The callback's methods are invoked on changes to *any* network, not just the active + * network. So to check for network connectivity, one must query the active network of the + * ConnectivityManager. + */ + val callback = object : NetworkCallback() { + override fun onAvailable(network: Network) { + channel.trySend(connectivityManager.isCurrentlyConnected()) + } - override fun onLost(network: Network) { - channel.trySend(connectivityManager.isCurrentlyConnected()) - } + override fun onLost(network: Network) { + channel.trySend(connectivityManager.isCurrentlyConnected()) + } - override fun onCapabilitiesChanged( - network: Network, - networkCapabilities: NetworkCapabilities, - ) { - channel.trySend(connectivityManager.isCurrentlyConnected()) - } + override fun onCapabilitiesChanged( + network: Network, + networkCapabilities: NetworkCapabilities, + ) { + channel.trySend(connectivityManager.isCurrentlyConnected()) } + } - connectivityManager.registerNetworkCallback( - Builder() - .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) - .build(), - callback, - ) + connectivityManager.registerNetworkCallback( + Builder() + .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) + .build(), + callback, + ) - channel.trySend(connectivityManager.isCurrentlyConnected()) + channel.trySend(connectivityManager.isCurrentlyConnected()) - awaitClose { - connectivityManager.unregisterNetworkCallback(callback) - } + awaitClose { + connectivityManager.unregisterNetworkCallback(callback) } - .conflate() + } + .conflate() @Suppress("DEPRECATION") private fun ConnectivityManager.isCurrentlyConnected() = when { From 76c249a65136e707d72ad4959b26cb6c92297d7f Mon Sep 17 00:00:00 2001 From: Simon Marquis Date: Mon, 8 May 2023 10:47:37 +0200 Subject: [PATCH 03/10] Update ConnectivityManagerNetworkMonitor.kt --- .../core/data/util/ConnectivityManagerNetworkMonitor.kt | 1 - 1 file changed, 1 deletion(-) 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 a21965565..4cb4dbe70 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 @@ -30,7 +30,6 @@ import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.callbackFlow import kotlinx.coroutines.flow.conflate -import Kotlinx.coroutines.flow.flowOf import javax.inject.Inject class ConnectivityManagerNetworkMonitor @Inject constructor( From def5c4e8819c966138dfec76852509d3b65c9493 Mon Sep 17 00:00:00 2001 From: Simon Marquis Date: Mon, 8 May 2023 10:50:12 +0200 Subject: [PATCH 04/10] Update ConnectivityManagerNetworkMonitor.kt --- .../data/util/ConnectivityManagerNetworkMonitor.kt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) 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 4cb4dbe70..4c68946c8 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 @@ -37,11 +37,11 @@ class ConnectivityManagerNetworkMonitor @Inject constructor( ) : NetworkMonitor { override val isOnline: Flow = callbackFlow { val connectivityManager = context.getSystemService() - ?: run { - channel.trySend(false) - channel.close() - return@callbackFlow - } + ?: run { + channel.trySend(false) + channel.close() + return@callbackFlow + } /** * The callback's methods are invoked on changes to *any* network, not just the active From 7819a0c6bcf0e2d9cb073f2978aed9b52df85ff2 Mon Sep 17 00:00:00 2001 From: Simon Marquis Date: Mon, 8 May 2023 12:50:01 +0200 Subject: [PATCH 05/10] Extract common code to update the Flow value --- .../util/ConnectivityManagerNetworkMonitor.kt | 31 ++++++++++--------- 1 file changed, 16 insertions(+), 15 deletions(-) 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 4c68946c8..4b8f049c0 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 @@ -37,11 +37,18 @@ class ConnectivityManagerNetworkMonitor @Inject constructor( ) : NetworkMonitor { override val isOnline: Flow = callbackFlow { val connectivityManager = context.getSystemService() - ?: run { - channel.trySend(false) - channel.close() - return@callbackFlow - } + if (connectivityManager == null) { + channel.trySend(false) + channel.close() + return@callbackFlow + } + + /** + * Sends the latest connectivity status to the underlying channel. + */ + fun update() { + channel.trySend(connectivityManager.isCurrentlyConnected()) + } /** * The callback's methods are invoked on changes to *any* network, not just the active @@ -49,20 +56,14 @@ class ConnectivityManagerNetworkMonitor @Inject constructor( * ConnectivityManager. */ val callback = object : NetworkCallback() { - override fun onAvailable(network: Network) { - channel.trySend(connectivityManager.isCurrentlyConnected()) - } + override fun onAvailable(network: Network) = update() - override fun onLost(network: Network) { - channel.trySend(connectivityManager.isCurrentlyConnected()) - } + override fun onLost(network: Network) = update() override fun onCapabilitiesChanged( network: Network, networkCapabilities: NetworkCapabilities, - ) { - channel.trySend(connectivityManager.isCurrentlyConnected()) - } + ) = update() } connectivityManager.registerNetworkCallback( @@ -72,7 +73,7 @@ class ConnectivityManagerNetworkMonitor @Inject constructor( callback, ) - channel.trySend(connectivityManager.isCurrentlyConnected()) + update() awaitClose { connectivityManager.unregisterNetworkCallback(callback) From ec9155fef9c819a96f74c939aa90a47738016189 Mon Sep 17 00:00:00 2001 From: Simon Marquis Date: Mon, 8 May 2023 12:53:05 +0200 Subject: [PATCH 06/10] Update ConnectivityManagerNetworkMonitor.kt --- .../core/data/util/ConnectivityManagerNetworkMonitor.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 4b8f049c0..b0bf9d820 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 @@ -48,7 +48,7 @@ class ConnectivityManagerNetworkMonitor @Inject constructor( */ fun update() { channel.trySend(connectivityManager.isCurrentlyConnected()) - } + } /** * The callback's methods are invoked on changes to *any* network, not just the active From 0e40e26f22e261aa048cb8798c758cb17a5bfbcc Mon Sep 17 00:00:00 2001 From: Don Turner Date: Tue, 9 May 2023 19:04:46 +0100 Subject: [PATCH 07/10] Add analytics for search queries Change-Id: If5290a903afb928fc1c3aaa66a52d2f182aba118 --- .../nowinandroid/core/analytics/AnalyticsEvent.kt | 2 ++ .../nowinandroid/feature/search/SearchViewModel.kt | 11 +++++++++++ 2 files changed, 13 insertions(+) diff --git a/core/analytics/src/main/java/com/google/samples/apps/nowinandroid/core/analytics/AnalyticsEvent.kt b/core/analytics/src/main/java/com/google/samples/apps/nowinandroid/core/analytics/AnalyticsEvent.kt index 97ae76b56..3e0650eed 100644 --- a/core/analytics/src/main/java/com/google/samples/apps/nowinandroid/core/analytics/AnalyticsEvent.kt +++ b/core/analytics/src/main/java/com/google/samples/apps/nowinandroid/core/analytics/AnalyticsEvent.kt @@ -34,6 +34,7 @@ data class AnalyticsEvent( class Types { companion object { const val SCREEN_VIEW = "screen_view" // (extras: SCREEN_NAME) + const val VIEW_SEARCH_RESULTS = "view_search_results" // (extras: SEARCH_TERM) } } @@ -53,6 +54,7 @@ data class AnalyticsEvent( class ParamKeys { companion object { const val SCREEN_NAME = "screen_name" + const val SEARCH_TERM = "search_term" } } } diff --git a/feature/search/src/main/java/com/google/samples/apps/nowinandroid/feature/search/SearchViewModel.kt b/feature/search/src/main/java/com/google/samples/apps/nowinandroid/feature/search/SearchViewModel.kt index f4b4485bc..b1b0614dc 100644 --- a/feature/search/src/main/java/com/google/samples/apps/nowinandroid/feature/search/SearchViewModel.kt +++ b/feature/search/src/main/java/com/google/samples/apps/nowinandroid/feature/search/SearchViewModel.kt @@ -19,6 +19,9 @@ package com.google.samples.apps.nowinandroid.feature.search import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.google.samples.apps.nowinandroid.core.analytics.AnalyticsEvent +import com.google.samples.apps.nowinandroid.core.analytics.AnalyticsEvent.Param +import com.google.samples.apps.nowinandroid.core.analytics.AnalyticsHelper import com.google.samples.apps.nowinandroid.core.data.repository.RecentSearchRepository import com.google.samples.apps.nowinandroid.core.domain.GetRecentSearchQueriesUseCase import com.google.samples.apps.nowinandroid.core.domain.GetSearchContentsCountUseCase @@ -42,6 +45,7 @@ class SearchViewModel @Inject constructor( recentSearchQueriesUseCase: GetRecentSearchQueriesUseCase, private val recentSearchRepository: RecentSearchRepository, private val savedStateHandle: SavedStateHandle, + private val analyticsHelper: AnalyticsHelper, ) : ViewModel() { val searchQuery = savedStateHandle.getStateFlow(SEARCH_QUERY, "") @@ -105,6 +109,13 @@ class SearchViewModel @Inject constructor( viewModelScope.launch { recentSearchRepository.insertOrReplaceRecentSearch(query) } + analyticsHelper.logEvent( + AnalyticsEvent( + type = SEARCH_QUERY, + extras = listOf(Param(SEARCH_QUERY, query) + ) + ) + ) } fun clearRecentSearches() { From 2f2dfb00a46da24b70ce6decbb7a7bb6c56eb330 Mon Sep 17 00:00:00 2001 From: James Rose Date: Tue, 9 May 2023 11:21:04 -0700 Subject: [PATCH 08/10] Mark all news resources read on first sync Otherwise, there will be unread articles until the user clicks through every article that has ever been published. --- .../repository/OfflineFirstNewsRepository.kt | 13 +++++++-- .../OfflineFirstNewsRepositoryTest.kt | 27 +++++++++++++++++++ .../datastore/NiaPreferencesDataSource.kt | 14 +++++++--- 3 files changed, 48 insertions(+), 6 deletions(-) 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 bd6ed11b4..b18bb9044 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 @@ -63,10 +63,12 @@ class OfflineFirstNewsRepository @Inject constructor( ) .map { it.map(PopulatedNewsResource::asExternalModel) } - override suspend fun syncWith(synchronizer: Synchronizer) = - synchronizer.changeListSync( + override suspend fun syncWith(synchronizer: Synchronizer): Boolean { + var isFirstSync = false + return synchronizer.changeListSync( versionReader = ChangeListVersions::newsResourceVersion, changeListFetcher = { currentVersion -> + isFirstSync = currentVersion <= 0 network.getNewsResourceChangeList(after = currentVersion) }, versionUpdater = { latestVersion -> @@ -94,6 +96,12 @@ class OfflineFirstNewsRepository @Inject constructor( else -> emptySet() } + if (isFirstSync) { + // When we first retrieve news, mark everything viewed, so that we aren't + // overwhelmed with all historical news. + niaPreferencesDataSource.setNewsResourcesViewed(changedIds, true) + } + // Obtain the news resources which have changed from the network and upsert them locally changedIds.chunked(SYNC_BATCH_SIZE).forEach { chunkedIds -> val networkNewsResources = network.getNewsResources(ids = chunkedIds) @@ -137,4 +145,5 @@ class OfflineFirstNewsRepository @Inject constructor( } }, ) + } } 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 a38d9c621..47c3996c4 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 @@ -288,6 +288,33 @@ class OfflineFirstNewsRepositoryTest { ) } + @Test + fun offlineFirstNewsRepository_sync_marks_as_read_on_first_run() = + testScope.runTest { + subject.syncWith(synchronizer) + + assertEquals( + network.getNewsResources().map { it.id }.toSet(), + niaPreferencesDataSource.userData.first().viewedNewsResources, + ) + } + + @Test + fun offlineFirstNewsRepository_sync_does_not_mark_as_read_on_subsequent_run() = + testScope.runTest { + // Pretend that we already have up to change list 7 + synchronizer.updateChangeListVersions { + copy(newsResourceVersion = 7) + } + + subject.syncWith(synchronizer) + + assertEquals( + emptySet(), + niaPreferencesDataSource.userData.first().viewedNewsResources, + ) + } + @Test fun offlineFirstNewsRepository_sends_notifications_for_newly_synced_news_that_is_followed() = testScope.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 33c04b70d..6d585ebd4 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 @@ -139,12 +139,18 @@ class NiaPreferencesDataSource @Inject constructor( } suspend fun setNewsResourceViewed(newsResourceId: String, viewed: Boolean) { + setNewsResourcesViewed(listOf(newsResourceId), viewed) + } + + suspend fun setNewsResourcesViewed(newsResourceIds: List, viewed: Boolean) { userPreferences.updateData { it.copy { - if (viewed) { - viewedNewsResourceIds.put(newsResourceId, true) - } else { - viewedNewsResourceIds.remove(newsResourceId) + newsResourceIds.forEach { + if (viewed) { + viewedNewsResourceIds.put(it, true) + } else { + viewedNewsResourceIds.remove(it) + } } } } From 6343b831b92a28f5ec66d1cfc72ce3e9439c21da Mon Sep 17 00:00:00 2001 From: Don Turner Date: Wed, 10 May 2023 08:54:40 +0100 Subject: [PATCH 09/10] Use NoOpAnalyticsHelper for tests Change-Id: I44657037f8f7ec6e38bcc3901e235ceab8c71237 --- .../apps/nowinandroid/feature/search/SearchViewModelTest.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/feature/search/src/test/java/com/google/samples/apps/nowinandroid/feature/search/SearchViewModelTest.kt b/feature/search/src/test/java/com/google/samples/apps/nowinandroid/feature/search/SearchViewModelTest.kt index 1d50b75fd..01763ba09 100644 --- a/feature/search/src/test/java/com/google/samples/apps/nowinandroid/feature/search/SearchViewModelTest.kt +++ b/feature/search/src/test/java/com/google/samples/apps/nowinandroid/feature/search/SearchViewModelTest.kt @@ -17,6 +17,8 @@ package com.google.samples.apps.nowinandroid.feature.search import androidx.lifecycle.SavedStateHandle +import com.google.samples.apps.nowinandroid.core.analytics.AnalyticsHelper +import com.google.samples.apps.nowinandroid.core.analytics.NoOpAnalyticsHelper import com.google.samples.apps.nowinandroid.core.domain.GetRecentSearchQueriesUseCase import com.google.samples.apps.nowinandroid.core.domain.GetSearchContentsCountUseCase import com.google.samples.apps.nowinandroid.core.domain.GetSearchContentsUseCase @@ -68,6 +70,7 @@ class SearchViewModelTest { recentSearchQueriesUseCase = getRecentQueryUseCase, savedStateHandle = SavedStateHandle(), recentSearchRepository = recentSearchRepository, + analyticsHelper = NoOpAnalyticsHelper(), ) } From aae307ee086a529fe24b697444942d292214dc11 Mon Sep 17 00:00:00 2001 From: Don Turner Date: Wed, 10 May 2023 08:56:21 +0100 Subject: [PATCH 10/10] Fix spotless Change-Id: I84da36ba957cb74f9fb4479e81d714c2d8928a01 --- .../apps/nowinandroid/feature/search/SearchViewModel.kt | 7 ++++--- .../nowinandroid/feature/search/SearchViewModelTest.kt | 1 - 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/feature/search/src/main/java/com/google/samples/apps/nowinandroid/feature/search/SearchViewModel.kt b/feature/search/src/main/java/com/google/samples/apps/nowinandroid/feature/search/SearchViewModel.kt index b1b0614dc..f5b409edf 100644 --- a/feature/search/src/main/java/com/google/samples/apps/nowinandroid/feature/search/SearchViewModel.kt +++ b/feature/search/src/main/java/com/google/samples/apps/nowinandroid/feature/search/SearchViewModel.kt @@ -112,9 +112,10 @@ class SearchViewModel @Inject constructor( analyticsHelper.logEvent( AnalyticsEvent( type = SEARCH_QUERY, - extras = listOf(Param(SEARCH_QUERY, query) - ) - ) + extras = listOf( + Param(SEARCH_QUERY, query), + ), + ), ) } diff --git a/feature/search/src/test/java/com/google/samples/apps/nowinandroid/feature/search/SearchViewModelTest.kt b/feature/search/src/test/java/com/google/samples/apps/nowinandroid/feature/search/SearchViewModelTest.kt index 01763ba09..fc9c20549 100644 --- a/feature/search/src/test/java/com/google/samples/apps/nowinandroid/feature/search/SearchViewModelTest.kt +++ b/feature/search/src/test/java/com/google/samples/apps/nowinandroid/feature/search/SearchViewModelTest.kt @@ -17,7 +17,6 @@ package com.google.samples.apps.nowinandroid.feature.search import androidx.lifecycle.SavedStateHandle -import com.google.samples.apps.nowinandroid.core.analytics.AnalyticsHelper import com.google.samples.apps.nowinandroid.core.analytics.NoOpAnalyticsHelper import com.google.samples.apps.nowinandroid.core.domain.GetRecentSearchQueriesUseCase import com.google.samples.apps.nowinandroid.core.domain.GetSearchContentsCountUseCase