From f81c7222e2d3f16aec657a2b26a4860ebc59b9f3 Mon Sep 17 00:00:00 2001 From: Don Turner Date: Fri, 11 Nov 2022 11:09:59 +0000 Subject: [PATCH] Rename hasDismissedOnboarding to shouldHideOnboarding Change-Id: I8a6b35f7216f9944652d8da346e7458614311e08 --- .../OfflineFirstUserDataRepository.kt | 4 +- .../data/repository/UserDataRepository.kt | 2 +- .../repository/fake/FakeUserDataRepository.kt | 4 +- .../OfflineFirstUserDataRepositoryTest.kt | 10 ++-- .../datastore/NiaPreferencesDataSource.kt | 18 ++++---- .../nowinandroid/data/user_preferences.proto | 5 +- .../datastore/NiaPreferencesDataSourceTest.kt | 46 +++++++++---------- .../nowinandroid/core/model/data/UserData.kt | 2 +- .../repository/TestUserDataRepository.kt | 6 +-- .../feature/foryou/ForYouViewModel.kt | 6 +-- .../feature/foryou/ForYouViewModelTest.kt | 2 +- 11 files changed, 51 insertions(+), 54 deletions(-) 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 0bf4d6438..e95c13460 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 @@ -51,6 +51,6 @@ class OfflineFirstUserDataRepository @Inject constructor( override suspend fun setDarkThemeConfig(darkThemeConfig: DarkThemeConfig) = niaPreferencesDataSource.setDarkThemeConfig(darkThemeConfig) - override suspend fun setHasDismissedOnboarding(hasDismissedOnboarding: Boolean) = - niaPreferencesDataSource.setHasDismissedOnboarding(hasDismissedOnboarding) + 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 86d26a47e..8cd22c18f 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 @@ -66,5 +66,5 @@ interface UserDataRepository { /** * Sets whether the user has completed the onboarding process. */ - suspend fun setHasDismissedOnboarding(hasDismissedOnboarding: Boolean) + suspend fun setShouldHideOnboarding(shouldHideOnboarding: Boolean) } 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 e87b59a91..4752cd7a1 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 @@ -64,7 +64,7 @@ class FakeUserDataRepository @Inject constructor( niaPreferencesDataSource.setDarkThemeConfig(darkThemeConfig) } - override suspend fun setHasDismissedOnboarding(hasDismissedOnboarding: Boolean) { - niaPreferencesDataSource.setHasDismissedOnboarding(hasDismissedOnboarding) + 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 6f0f9394d..c1d740602 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 @@ -59,7 +59,7 @@ class OfflineFirstUserDataRepositoryTest { followedAuthors = emptySet(), themeBrand = ThemeBrand.DEFAULT, darkThemeConfig = DarkThemeConfig.FOLLOW_SYSTEM, - hasDismissedOnboarding = false + shouldHideOnboarding = false ), subject.userDataStream.first() ) @@ -190,13 +190,13 @@ class OfflineFirstUserDataRepositoryTest { } @Test - fun whenUserCompletesOnboarding_thenRemovesAllInterests_hasDismissedOnboardingIsFalse() = + fun whenUserCompletesOnboarding_thenRemovesAllInterests_shouldHideOnboardingIsFalse() = runTest { subject.setFollowedTopicIds(setOf("1")) - subject.setHasDismissedOnboarding(true) - assertEquals(true, subject.userDataStream.first().hasDismissedOnboarding) + subject.setShouldHideOnboarding(true) + assertEquals(true, subject.userDataStream.first().shouldHideOnboarding) subject.setFollowedTopicIds(emptySet()) - assertEquals(false, subject.userDataStream.first().hasDismissedOnboarding) + assertEquals(false, subject.userDataStream.first().shouldHideOnboarding) } } 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 be129a3bd..b4442528c 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 @@ -53,7 +53,7 @@ class NiaPreferencesDataSource @Inject constructor( DarkThemeConfig.LIGHT DarkThemeConfigProto.DARK_THEME_CONFIG_DARK -> DarkThemeConfig.DARK }, - hasDismissedOnboarding = it.hasDismissedOnboarding + shouldHideOnboarding = it.shouldHideOnboarding ) } @@ -63,7 +63,7 @@ class NiaPreferencesDataSource @Inject constructor( it.copy { followedTopicIds.clear() followedTopicIds.putAll(topicIds.associateWith { true }) - updateHasDismissedOnboardingIfNecessary() + updateShouldHideOnboardingIfNecessary() } } } catch (ioException: IOException) { @@ -80,7 +80,7 @@ class NiaPreferencesDataSource @Inject constructor( } else { followedTopicIds.remove(topicId) } - updateHasDismissedOnboardingIfNecessary() + updateShouldHideOnboardingIfNecessary() } } } catch (ioException: IOException) { @@ -94,7 +94,7 @@ class NiaPreferencesDataSource @Inject constructor( it.copy { followedAuthorIds.clear() followedAuthorIds.putAll(authorIds.associateWith { true }) - updateHasDismissedOnboardingIfNecessary() + updateShouldHideOnboardingIfNecessary() } } } catch (ioException: IOException) { @@ -111,7 +111,7 @@ class NiaPreferencesDataSource @Inject constructor( } else { followedAuthorIds.remove(authorId) } - updateHasDismissedOnboardingIfNecessary() + updateShouldHideOnboardingIfNecessary() } } } catch (ioException: IOException) { @@ -194,18 +194,18 @@ class NiaPreferencesDataSource @Inject constructor( } } - suspend fun setHasDismissedOnboarding(hasDismissedOnboarding: Boolean) { + suspend fun setShouldHideOnboarding(shouldHideOnboarding: Boolean) { userPreferences.updateData { it.copy { - this.hasDismissedOnboarding = hasDismissedOnboarding + this.shouldHideOnboarding = shouldHideOnboarding } } } } -fun UserPreferencesKt.Dsl.updateHasDismissedOnboardingIfNecessary() { +fun UserPreferencesKt.Dsl.updateShouldHideOnboardingIfNecessary() { if (followedTopicIds.isEmpty() && followedAuthorIds.isEmpty()) { - hasDismissedOnboarding = false + shouldHideOnboarding = false } } 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 f771ac1ac..b7d33dcaf 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 @@ -44,8 +44,5 @@ message UserPreferences { ThemeBrandProto theme_brand = 16; DarkThemeConfigProto dark_theme_config = 17; - // Note that proto3 only allows a default value of `false` for boolean types. This means that - // whilst the name `should_show_onboarding` would be preferable here we are forced to choose a - // name which works with this default value constraint. - bool has_dismissed_onboarding = 18; + bool should_hide_onboarding = 18; } 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 8bb552521..d5e4be841 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 @@ -39,99 +39,99 @@ class NiaPreferencesDataSourceTest { } @Test - fun hasDismissedOnboardingIsFalseByDefault() = runTest { - assertEquals(false, subject.userDataStream.first().hasDismissedOnboarding) + fun shouldHideOnboardingIsFalseByDefault() = runTest { + assertEquals(false, subject.userDataStream.first().shouldHideOnboarding) } @Test - fun userHasDismissedOnboardingIsTrueWhenSet() = runTest { - subject.setHasDismissedOnboarding(true) - assertEquals(true, subject.userDataStream.first().hasDismissedOnboarding) + fun userShouldHideOnboardingIsTrueWhenSet() = runTest { + subject.setShouldHideOnboarding(true) + assertEquals(true, subject.userDataStream.first().shouldHideOnboarding) } @Test - fun userHasDismissedOnboarding_unfollowsLastAuthor_hasDismissedOnboardingIsFalse() = runTest { + fun userShouldHideOnboarding_unfollowsLastAuthor_shouldHideOnboardingIsFalse() = runTest { // Given: user completes onboarding by selecting a single author. subject.toggleFollowedAuthorId("1", true) - subject.setHasDismissedOnboarding(true) + subject.setShouldHideOnboarding(true) // When: they unfollow that author. subject.toggleFollowedAuthorId("1", false) // Then: onboarding should be shown again - assertEquals(false, subject.userDataStream.first().hasDismissedOnboarding) + assertEquals(false, subject.userDataStream.first().shouldHideOnboarding) } @Test - fun userHasDismissedOnboarding_unfollowsLastTopic_hasDismissedOnboardingIsFalse() = runTest { + fun userShouldHideOnboarding_unfollowsLastTopic_shouldHideOnboardingIsFalse() = runTest { // Given: user completes onboarding by selecting a single topic. subject.toggleFollowedTopicId("1", true) - subject.setHasDismissedOnboarding(true) + subject.setShouldHideOnboarding(true) // When: they unfollow that topic. subject.toggleFollowedTopicId("1", false) // Then: onboarding should be shown again - assertEquals(false, subject.userDataStream.first().hasDismissedOnboarding) + assertEquals(false, subject.userDataStream.first().shouldHideOnboarding) } @Test - fun userHasDismissedOnboarding_unfollowsAllAuthors_hasDismissedOnboardingIsFalse() = runTest { + fun userShouldHideOnboarding_unfollowsAllAuthors_shouldHideOnboardingIsFalse() = runTest { // Given: user completes onboarding by selecting several authors. subject.setFollowedAuthorIds(setOf("1", "2")) - subject.setHasDismissedOnboarding(true) + subject.setShouldHideOnboarding(true) // When: they unfollow those authors. subject.setFollowedAuthorIds(emptySet()) // Then: onboarding should be shown again - assertEquals(false, subject.userDataStream.first().hasDismissedOnboarding) + assertEquals(false, subject.userDataStream.first().shouldHideOnboarding) } @Test - fun userHasDismissedOnboarding_unfollowsAllTopics_hasDismissedOnboardingIsFalse() = runTest { + fun userShouldHideOnboarding_unfollowsAllTopics_shouldHideOnboardingIsFalse() = runTest { // Given: user completes onboarding by selecting several topics. subject.setFollowedTopicIds(setOf("1", "2")) - subject.setHasDismissedOnboarding(true) + subject.setShouldHideOnboarding(true) // When: they unfollow those topics. subject.setFollowedTopicIds(emptySet()) // Then: onboarding should be shown again - assertEquals(false, subject.userDataStream.first().hasDismissedOnboarding) + assertEquals(false, subject.userDataStream.first().shouldHideOnboarding) } @Test - fun userHasDismissedOnboarding_unfollowsAllTopicsButNotAuthors_hasDismissedOnboardingIsTrue() = + fun userShouldHideOnboarding_unfollowsAllTopicsButNotAuthors_shouldHideOnboardingIsTrue() = runTest { // Given: user completes onboarding by selecting several topics and authors. subject.setFollowedTopicIds(setOf("1", "2")) subject.setFollowedAuthorIds(setOf("3", "4")) - subject.setHasDismissedOnboarding(true) + subject.setShouldHideOnboarding(true) // When: they unfollow just the topics. subject.setFollowedTopicIds(emptySet()) // Then: onboarding should still be dismissed - assertEquals(true, subject.userDataStream.first().hasDismissedOnboarding) + assertEquals(true, subject.userDataStream.first().shouldHideOnboarding) } @Test - fun userHasDismissedOnboarding_unfollowsAllAuthorsButNotTopics_hasDismissedOnboardingIsTrue() = + fun userShouldHideOnboarding_unfollowsAllAuthorsButNotTopics_shouldHideOnboardingIsTrue() = runTest { // Given: user completes onboarding by selecting several topics and authors. subject.setFollowedTopicIds(setOf("1", "2")) subject.setFollowedAuthorIds(setOf("3", "4")) - subject.setHasDismissedOnboarding(true) + subject.setShouldHideOnboarding(true) // When: they unfollow just the authors. subject.setFollowedAuthorIds(emptySet()) // Then: onboarding should still be dismissed - assertEquals(true, subject.userDataStream.first().hasDismissedOnboarding) + assertEquals(true, subject.userDataStream.first().shouldHideOnboarding) } } 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 3ce222a54..c3941cb0f 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 followedAuthors: Set, val themeBrand: ThemeBrand, val darkThemeConfig: DarkThemeConfig, - val hasDismissedOnboarding: 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 ae910e58c..507fa1f7b 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 @@ private val emptyUserData = UserData( followedAuthors = emptySet(), themeBrand = ThemeBrand.DEFAULT, darkThemeConfig = DarkThemeConfig.FOLLOW_SYSTEM, - hasDismissedOnboarding = false + shouldHideOnboarding = false ) class TestUserDataRepository : UserDataRepository { @@ -91,9 +91,9 @@ class TestUserDataRepository : UserDataRepository { } } - override suspend fun setHasDismissedOnboarding(hasDismissedOnboarding: Boolean) { + override suspend fun setShouldHideOnboarding(shouldHideOnboarding: Boolean) { currentUserData.let { current -> - _userData.tryEmit(current.copy(hasDismissedOnboarding = hasDismissedOnboarding)) + _userData.tryEmit(current.copy(shouldHideOnboarding = shouldHideOnboarding)) } } 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 3ea5b9226..c79c9d777 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 @@ -48,7 +48,7 @@ class ForYouViewModel @Inject constructor( ) : ViewModel() { private val shouldShowOnboarding: Flow = - userDataRepository.userDataStream.map { !it.hasDismissedOnboarding } + userDataRepository.userDataStream.map { !it.shouldHideOnboarding } val isSyncing = syncStatusMonitor.isSyncing .stateIn( @@ -63,7 +63,7 @@ class ForYouViewModel @Inject constructor( // 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.hasDismissedOnboarding && + if (!userData.shouldHideOnboarding && userData.followedAuthors.isEmpty() && userData.followedTopics.isEmpty() ) { @@ -126,7 +126,7 @@ class ForYouViewModel @Inject constructor( fun dismissOnboarding() { viewModelScope.launch { - userDataRepository.setHasDismissedOnboarding(true) + userDataRepository.setShouldHideOnboarding(true) } } } 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 c71813b68..5f21f9d06 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 @@ -1011,7 +1011,7 @@ class ForYouViewModelTest { userDataRepository.setFollowedTopicIds(setOf("1")) authorsRepository.sendAuthors(sampleAuthors) userDataRepository.setFollowedAuthorIds(setOf("1")) - userDataRepository.setHasDismissedOnboarding(true) + userDataRepository.setShouldHideOnboarding(true) newsRepository.sendNewsResources(sampleNewsResources) viewModel.updateNewsResourceSaved("2", true)