Skip to content

Commit

Permalink
don't add navigation if sync hidden
Browse files Browse the repository at this point in the history
  • Loading branch information
cmonfortep committed Dec 21, 2023
1 parent d520cda commit fa5929a
Show file tree
Hide file tree
Showing 7 changed files with 51 additions and 49 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ interface SyncFeature {
@Toggle.DefaultValue(true)
fun level1AllowDataSyncing(): Toggle

@Toggle.DefaultValue(false)
@Toggle.DefaultValue(true)
fun level2AllowSetupFlows(): Toggle

@Toggle.DefaultValue(true)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -134,9 +134,10 @@ class SyncRemoteFeatureToggle @Inject constructor(
}

private fun triggerNotification() {
val showSync = showSync()
notificationManager.notify(
SYNC_PAUSED_NOTIFICATION_ID,
syncNotificationBuilder.buildSyncPausedNotification(context),
syncNotificationBuilder.buildSyncPausedNotification(context, addNavigationIntent = showSync),
)
}
private fun cancelNotification() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,22 +31,24 @@ import com.squareup.anvil.annotations.ContributesBinding
import javax.inject.Inject

interface SyncNotificationBuilder {
fun buildSyncPausedNotification(context: Context): Notification
fun buildSyncPausedNotification(context: Context, addNavigationIntent: Boolean = true): Notification
}

@ContributesBinding(AppScope::class)
class AppCredentialsSyncNotificationBuilder @Inject constructor(
private val globalGlobalActivityStarter: GlobalActivityStarter,
) : SyncNotificationBuilder {
override fun buildSyncPausedNotification(context: Context): Notification {
return NotificationCompat.Builder(context, SYNC_NOTIFICATION_CHANNEL_ID)
override fun buildSyncPausedNotification(context: Context, addNavigationIntent: Boolean): Notification {
val notificationBuilder = NotificationCompat.Builder(context, SYNC_NOTIFICATION_CHANNEL_ID)
.setSmallIcon(com.duckduckgo.mobile.android.R.drawable.notification_logo)
.setStyle(NotificationCompat.DecoratedCustomViewStyle())
.setContentIntent(getPendingIntent(context))
.setCustomContentView(RemoteViews(context.packageName, R.layout.notification_sync_paused))
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
.setCategory(NotificationCompat.CATEGORY_STATUS)
.build()
if (addNavigationIntent) {
notificationBuilder.setContentIntent(getPendingIntent(context))
}
return notificationBuilder.build()
}

private fun getPendingIntent(context: Context): PendingIntent? = TaskStackBuilder.create(context).run {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,8 +78,8 @@ class SyncDisabledView @JvmOverloads constructor(
}

private fun render(viewState: ViewState) {
this.isVisible = viewState.warningMessage != null
val message = viewState.warningMessage ?: return
this.isVisible = viewState.message != null
val message = viewState.message ?: return
binding.syndDisabledWarning.setText(context.getString(message))
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ class SyncDisabledViewModel(
) : ViewModel(), DefaultLifecycleObserver {

data class ViewState(
val warningMessage: Int? = null,
val message: Int? = null,
)

private val mutableViewState = MutableStateFlow(ViewState())
Expand All @@ -52,7 +52,7 @@ class SyncDisabledViewModel(
override fun onResume(owner: LifecycleOwner) {
super.onResume(owner)
syncStateMonitor.syncState().map { state ->
mutableViewState.emit(mutableViewState.value.copy(warningMessage = getMessage(state)))
mutableViewState.emit(mutableViewState.value.copy(message = getMessage(state)))
}.flowOn(dispatcherProvider.io()).launchIn(viewModelScope)
}

Expand Down
3 changes: 1 addition & 2 deletions sync/sync-impl/src/main/res/layout/view_sync_enabled.xml
Original file line number Diff line number Diff line change
Expand Up @@ -107,8 +107,7 @@
app:leadingIcon="@drawable/ic_camera_photos_24"
app:leadingIconBackground="circular"
app:primaryText="@string/sync_show_qr_code_item"
app:primaryTextTruncated="true"
app:secondaryText=""/>
app:primaryTextTruncated="true"/>

<com.duckduckgo.common.ui.view.divider.HorizontalDivider
android:layout_width="match_parent"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,157 +56,157 @@ class SyncDisabledViewModelTest {
)

@Test
fun whenUnauthenticatedUserDataSyncingDisabledThenWarningMessageIsDisplayed() = runTest {
fun whenUnauthenticatedUserDataSyncingDisabledThenMessageIsDisplayed() = runTest {
givenAllowDataSyncing(enabled = false)
syncStateFlow.emit(OFF)
testee.onResume(mock())

testee.viewState().test {
val warningMessage = awaitItem().warningMessage
assertEquals(syncDataDisabledSignedOutUser.disabled, warningMessage)
val message = awaitItem().message
assertEquals(syncDataDisabledSignedOutUser.disabled, message)
cancelAndIgnoreRemainingEvents()
}
}

@Test
fun whenUnauthenticatedUserDataSyncingEnabledOnNewerVersionThenWarningMessageIsDisplayed() = runTest {
fun whenUnauthenticatedUserDataSyncingEnabledOnNewerVersionThenMessageIsDisplayed() = runTest {
givenAllowDataSyncing(enabledOnNewerVersion = true)
syncStateFlow.emit(OFF)
testee.onResume(mock())

testee.viewState().test {
val warningMessage = awaitItem().warningMessage
assertEquals(syncDataDisabledSignedOutUser.enabledOnNewerVersion, warningMessage)
val message = awaitItem().message
assertEquals(syncDataDisabledSignedOutUser.enabledOnNewerVersion, message)
cancelAndIgnoreRemainingEvents()
}
}

@Test
fun whenAuthenticatedUserDataSyncingDisabledThenWarningMessageIsDisplayed() = runTest {
fun whenAuthenticatedUserDataSyncingDisabledThenMessageIsDisplayed() = runTest {
givenAllowDataSyncing(enabled = false)
syncStateFlow.emit(READY)
testee.onResume(mock())

testee.viewState().test {
val warningMessage = awaitItem().warningMessage
assertEquals(syncDataDisabledSignedInUser.disabled, warningMessage)
val message = awaitItem().message
assertEquals(syncDataDisabledSignedInUser.disabled, message)
cancelAndIgnoreRemainingEvents()
}
}

@Test
fun whenAuthenticatedUserDataSyncingEnabledOnNewerVersionThenWarningMessageIsDisplayed() = runTest {
fun whenAuthenticatedUserDataSyncingEnabledOnNewerVersionThenMessageIsDisplayed() = runTest {
givenAllowDataSyncing(enabledOnNewerVersion = true)
syncStateFlow.emit(READY)
testee.onResume(mock())

testee.viewState().test {
val warningMessage = awaitItem().warningMessage
assertEquals(syncDataDisabledSignedInUser.enabledOnNewerVersion, warningMessage)
val message = awaitItem().message
assertEquals(syncDataDisabledSignedInUser.enabledOnNewerVersion, message)
cancelAndIgnoreRemainingEvents()
}
}

@Test
fun whenUnauthenticatedSetupFlowsDisabledThenWarningMessageIsDisplayed() = runTest {
fun whenUnauthenticatedSetupFlowsDisabledThenMessageIsDisplayed() = runTest {
givenAllowSetupFlows(enabled = false)
syncStateFlow.emit(OFF)
testee.onResume(mock())

testee.viewState().test {
val warningMessage = awaitItem().warningMessage
assertEquals(setupFlowsDisabledSignedOutUser.disabled, warningMessage)
val message = awaitItem().message
assertEquals(setupFlowsDisabledSignedOutUser.disabled, message)
cancelAndIgnoreRemainingEvents()
}
}

@Test
fun whenUnauthenticatedSetupFlowsEnabledOnNewerVersionThenWarningMessageIsDisplayed() = runTest {
fun whenUnauthenticatedSetupFlowsEnabledOnNewerVersionThenMessageIsDisplayed() = runTest {
givenAllowSetupFlows(enabledOnNewerVersion = true)
syncStateFlow.emit(OFF)
testee.onResume(mock())

testee.viewState().test {
val warningMessage = awaitItem().warningMessage
assertEquals(setupFlowsDisabledSignedOutUser.enabledOnNewerVersion, warningMessage)
val message = awaitItem().message
assertEquals(setupFlowsDisabledSignedOutUser.enabledOnNewerVersion, message)
cancelAndIgnoreRemainingEvents()
}
}

@Test
fun whenAuthenticatedSetupFlowsDisabledThenWarningMessageIsDisplayed() = runTest {
fun whenAuthenticatedSetupFlowsDisabledThenMessageIsDisplayed() = runTest {
givenAllowSetupFlows(enabled = false)
syncStateFlow.emit(READY)
testee.onResume(mock())

testee.viewState().test {
val warningMessage = awaitItem().warningMessage
assertNull(warningMessage)
val message = awaitItem().message
assertNull(message)
cancelAndIgnoreRemainingEvents()
}
}

@Test
fun whenAuthenticatedSetupFlowsEnabledOnNewerVersionThenWarningMessageIsDisplayed() = runTest {
fun whenAuthenticatedSetupFlowsEnabledOnNewerVersionThenMessageIsDisplayed() = runTest {
givenAllowSetupFlows(enabledOnNewerVersion = true)
syncStateFlow.emit(READY)
testee.onResume(mock())

testee.viewState().test {
val warningMessage = awaitItem().warningMessage
assertNull(warningMessage)
val message = awaitItem().message
assertNull(message)
cancelAndIgnoreRemainingEvents()
}
}

@Test
fun whenUnauthenticatedCreateAccountDisabledThenWarningMessageIsDisplayed() = runTest {
fun whenUnauthenticatedCreateAccountDisabledThenMessageIsDisplayed() = runTest {
givenCreateAccountFlows(enabled = false)
syncStateFlow.emit(OFF)
testee.onResume(mock())

testee.viewState().test {
val warningMessage = awaitItem().warningMessage
assertEquals(createAccountDisabledSignedOutUser.disabled, warningMessage)
val message = awaitItem().message
assertEquals(createAccountDisabledSignedOutUser.disabled, message)
cancelAndIgnoreRemainingEvents()
}
}

@Test
fun whenUnauthenticatedCreateAccountEnabledOnNewerVersionThenWarningMessageIsDisplayed() = runTest {
fun whenUnauthenticatedCreateAccountEnabledOnNewerVersionThenMessageIsDisplayed() = runTest {
givenCreateAccountFlows(enabledOnNewerVersion = true)
syncStateFlow.emit(OFF)
testee.onResume(mock())

testee.viewState().test {
val warningMessage = awaitItem().warningMessage
assertEquals(createAccountDisabledSignedOutUser.enabledOnNewerVersion, warningMessage)
val message = awaitItem().message
assertEquals(createAccountDisabledSignedOutUser.enabledOnNewerVersion, message)
cancelAndIgnoreRemainingEvents()
}
}

@Test
fun whenAuthenticatedCreateAccountDisabledThenWarningMessageIsDisplayed() = runTest {
fun whenAuthenticatedCreateAccountDisabledThenMessageIsDisplayed() = runTest {
givenCreateAccountFlows(enabled = false)
syncStateFlow.emit(READY)
testee.onResume(mock())

testee.viewState().test {
val warningMessage = awaitItem().warningMessage
assertNull(warningMessage)
val message = awaitItem().message
assertNull(message)
cancelAndIgnoreRemainingEvents()
}
}

@Test
fun whenAuthenticatedCreateAccountEnabledOnNewerVersionThenWarningMessageIsDisplayed() = runTest {
fun whenAuthenticatedCreateAccountEnabledOnNewerVersionThenMessageIsDisplayed() = runTest {
givenCreateAccountFlows(enabledOnNewerVersion = true)
syncStateFlow.emit(READY)
testee.onResume(mock())

testee.viewState().test {
val warningMessage = awaitItem().warningMessage
assertNull(warningMessage)
val message = awaitItem().message
assertNull(message)
cancelAndIgnoreRemainingEvents()
}
}
Expand Down

0 comments on commit fa5929a

Please sign in to comment.