From e9252b824c96b095d98c4e16946c079906ae1504 Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Thu, 1 Jul 2021 16:24:27 +0300 Subject: [PATCH 01/23] Build: Update fluxc hash This 'FluxC' hash updates 'FluxC' to that 'branch' version where 'RewindStatusModel.Reason' enum become available. This step is required in order to determine whether or not to hide the restore option for the 'UNAVAILABLE' rewind state when the reason is 'MULTISITE_NOT_SUPPORTED'. --- .../ui/jetpack/restore/usecases/GetRestoreStatusUseCaseTest.kt | 3 ++- .../ui/jetpack/restore/usecases/PostRestoreUseCaseTest.kt | 3 ++- build.gradle | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/WordPress/src/test/java/org/wordpress/android/ui/jetpack/restore/usecases/GetRestoreStatusUseCaseTest.kt b/WordPress/src/test/java/org/wordpress/android/ui/jetpack/restore/usecases/GetRestoreStatusUseCaseTest.kt index bcf01a668114..09a507436d07 100644 --- a/WordPress/src/test/java/org/wordpress/android/ui/jetpack/restore/usecases/GetRestoreStatusUseCaseTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/ui/jetpack/restore/usecases/GetRestoreStatusUseCaseTest.kt @@ -16,6 +16,7 @@ import org.wordpress.android.fluxc.action.ActivityLogAction.FETCH_REWIND_STATE import org.wordpress.android.fluxc.model.SiteModel import org.wordpress.android.fluxc.model.activity.ActivityLogModel import org.wordpress.android.fluxc.model.activity.RewindStatusModel +import org.wordpress.android.fluxc.model.activity.RewindStatusModel.Reason import org.wordpress.android.fluxc.model.activity.RewindStatusModel.Rewind import org.wordpress.android.fluxc.model.activity.RewindStatusModel.State import org.wordpress.android.fluxc.store.ActivityLogStore @@ -343,7 +344,7 @@ class GetRestoreStatusUseCaseTest { state: State = State.ACTIVE ) = RewindStatusModel( state = state, - reason = null, + reason = Reason.NO_REASON, lastUpdated = PUBLISHED, canAutoconfigure = null, credentials = null, diff --git a/WordPress/src/test/java/org/wordpress/android/ui/jetpack/restore/usecases/PostRestoreUseCaseTest.kt b/WordPress/src/test/java/org/wordpress/android/ui/jetpack/restore/usecases/PostRestoreUseCaseTest.kt index 56c8e677d82c..f4a9bd7adecb 100644 --- a/WordPress/src/test/java/org/wordpress/android/ui/jetpack/restore/usecases/PostRestoreUseCaseTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/ui/jetpack/restore/usecases/PostRestoreUseCaseTest.kt @@ -13,6 +13,7 @@ import org.wordpress.android.fluxc.action.ActivityLogAction import org.wordpress.android.fluxc.action.ActivityLogAction.REWIND import org.wordpress.android.fluxc.model.SiteModel import org.wordpress.android.fluxc.model.activity.RewindStatusModel +import org.wordpress.android.fluxc.model.activity.RewindStatusModel.Reason import org.wordpress.android.fluxc.model.activity.RewindStatusModel.Rewind import org.wordpress.android.fluxc.model.activity.RewindStatusModel.Rewind.Status import org.wordpress.android.fluxc.model.activity.RewindStatusModel.Rewind.Status.QUEUED @@ -144,7 +145,7 @@ class PostRestoreUseCaseTest : BaseUnitTest() { private fun buildStatusModel(status: Status) = RewindStatusModel( state = ACTIVE, - reason = null, + reason = Reason.NO_REASON, lastUpdated = Date(1609690147756), canAutoconfigure = null, credentials = null, diff --git a/build.gradle b/build.gradle index 887e452954e3..d489700de815 100644 --- a/build.gradle +++ b/build.gradle @@ -133,7 +133,7 @@ ext { androidxWorkVersion = "2.4.0" daggerVersion = '2.29.1' - fluxCVersion = '1.21.0-beta-2' + fluxCVersion = 'ef0351a561c1f873cf89ad2b5508cb8968e65f08' appCompatVersion = '1.0.2' coreVersion = '1.3.2' From d86eaa658122b65dba34ef772ca73237d0616894 Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Thu, 1 Jul 2021 16:56:15 +0300 Subject: [PATCH 02/23] Refactor: Optimize imports on get restore status use case test --- .../ui/jetpack/restore/usecases/GetRestoreStatusUseCaseTest.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/WordPress/src/test/java/org/wordpress/android/ui/jetpack/restore/usecases/GetRestoreStatusUseCaseTest.kt b/WordPress/src/test/java/org/wordpress/android/ui/jetpack/restore/usecases/GetRestoreStatusUseCaseTest.kt index 09a507436d07..90f8f68c8a57 100644 --- a/WordPress/src/test/java/org/wordpress/android/ui/jetpack/restore/usecases/GetRestoreStatusUseCaseTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/ui/jetpack/restore/usecases/GetRestoreStatusUseCaseTest.kt @@ -28,7 +28,6 @@ import org.wordpress.android.ui.jetpack.restore.RestoreRequestState import org.wordpress.android.ui.jetpack.restore.RestoreRequestState.AwaitingCredentials import org.wordpress.android.ui.jetpack.restore.RestoreRequestState.Complete import org.wordpress.android.ui.jetpack.restore.RestoreRequestState.Failure -import org.wordpress.android.ui.jetpack.restore.RestoreRequestState.Failure.RemoteRequestFailure import org.wordpress.android.ui.jetpack.restore.RestoreRequestState.Progress import org.wordpress.android.util.NetworkUtilsWrapper import java.util.Date @@ -254,7 +253,7 @@ class GetRestoreStatusUseCaseTest { val result = useCase.getRestoreStatus(site, null).toList() assertThat(result).size().isEqualTo(1) - assertThat(result).isEqualTo(listOf(RemoteRequestFailure)) + assertThat(result).isEqualTo(listOf(Failure.RemoteRequestFailure)) } @Test From a15351ad32ceeb8d2e9d01e453472a1aa986995c Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Thu, 1 Jul 2021 17:19:39 +0300 Subject: [PATCH 03/23] Test: Update get restore status use case test for unavailable state --- .../usecases/GetRestoreStatusUseCaseTest.kt | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/WordPress/src/test/java/org/wordpress/android/ui/jetpack/restore/usecases/GetRestoreStatusUseCaseTest.kt b/WordPress/src/test/java/org/wordpress/android/ui/jetpack/restore/usecases/GetRestoreStatusUseCaseTest.kt index 90f8f68c8a57..0611088fde52 100644 --- a/WordPress/src/test/java/org/wordpress/android/ui/jetpack/restore/usecases/GetRestoreStatusUseCaseTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/ui/jetpack/restore/usecases/GetRestoreStatusUseCaseTest.kt @@ -225,8 +225,9 @@ class GetRestoreStatusUseCaseTest { } @Test - fun `given get status model is null without restoreId, when restore status triggers, then return empty`() = test { - whenever(activityLogStore.getRewindStatusForSite(site)).thenReturn(null) + fun `given unavailable without restoreId, when restore status triggers, then return empty`() = test { + whenever(activityLogStore.getRewindStatusForSite(site)) + .thenReturn(rewindStatusModel(null, null, State.UNAVAILABLE)) val result = useCase.getRestoreStatus(site, null).toList() @@ -234,8 +235,9 @@ class GetRestoreStatusUseCaseTest { } @Test - fun `given get status model is null with restoreId, when restore status triggers, then return empty`() = test { - whenever(activityLogStore.getRewindStatusForSite(site)).thenReturn(null) + fun `given unavailable with restoreId, when restore status triggers, then return empty`() = test { + whenever(activityLogStore.getRewindStatusForSite(site)) + .thenReturn(rewindStatusModel(null, null, State.UNAVAILABLE)) val result = useCase.getRestoreStatus(site, RESTORE_ID).toList() @@ -347,7 +349,11 @@ class GetRestoreStatusUseCaseTest { lastUpdated = PUBLISHED, canAutoconfigure = null, credentials = null, - rewind = if (state != State.AWAITING_CREDENTIALS) rewind(rewindId, status as Rewind.Status) else null + rewind = if (state == State.AWAITING_CREDENTIALS || state == State.UNAVAILABLE) { + null + } else { + rewind(rewindId, status as Rewind.Status) + } ) private fun rewind( From b33526aabaf76f5d78a5e33af4a32f4a09458d7c Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Thu, 1 Jul 2021 17:43:40 +0300 Subject: [PATCH 04/23] Feature: Add new multisite restore request state This state will used to determine whether or not to hide the restore option for the 'UNAVAILABLE' rewind state when the reason is 'MULTISITE_NOT_SUPPORTED'. --- .../org/wordpress/android/ui/jetpack/restore/RestoreStates.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/jetpack/restore/RestoreStates.kt b/WordPress/src/main/java/org/wordpress/android/ui/jetpack/restore/RestoreStates.kt index bca3b5ad4207..13b325e02a21 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/jetpack/restore/RestoreStates.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/jetpack/restore/RestoreStates.kt @@ -114,6 +114,8 @@ sealed class RestoreRequestState { val published: Date? = null ) : RestoreRequestState() + object Multisite : RestoreRequestState() + object Empty : RestoreRequestState() data class AwaitingCredentials(val isAwaitingCredentials: Boolean) : RestoreRequestState() From 3380c80cc903c4014d87be2e48994b936044e649 Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Thu, 1 Jul 2021 17:45:33 +0300 Subject: [PATCH 05/23] Test: Add tests for the unavailable multisite rewind status These tests will fail as the implementation is not ready yet. The next commit will make the tests pass (TDD). --- .../usecases/GetRestoreStatusUseCaseTest.kt | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/WordPress/src/test/java/org/wordpress/android/ui/jetpack/restore/usecases/GetRestoreStatusUseCaseTest.kt b/WordPress/src/test/java/org/wordpress/android/ui/jetpack/restore/usecases/GetRestoreStatusUseCaseTest.kt index 0611088fde52..6628cdc44564 100644 --- a/WordPress/src/test/java/org/wordpress/android/ui/jetpack/restore/usecases/GetRestoreStatusUseCaseTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/ui/jetpack/restore/usecases/GetRestoreStatusUseCaseTest.kt @@ -224,6 +224,26 @@ class GetRestoreStatusUseCaseTest { ) } + @Test + fun `given unavailable multisite without restoreId, when restore status triggers, then return multisite`() = test { + whenever(activityLogStore.getRewindStatusForSite(site)) + .thenReturn(rewindStatusModel(null, null, State.UNAVAILABLE, Reason.MULTISITE_NOT_SUPPORTED)) + + val result = useCase.getRestoreStatus(site, null).toList() + + assertThat(result).contains(RestoreRequestState.Multisite) + } + + @Test + fun `given unavailable multisite with restoreId, when restore status triggers, then return multisite`() = test { + whenever(activityLogStore.getRewindStatusForSite(site)) + .thenReturn(rewindStatusModel(null, null, State.UNAVAILABLE, Reason.MULTISITE_NOT_SUPPORTED)) + + val result = useCase.getRestoreStatus(site, RESTORE_ID).toList() + + assertThat(result).contains(RestoreRequestState.Multisite) + } + @Test fun `given unavailable without restoreId, when restore status triggers, then return empty`() = test { whenever(activityLogStore.getRewindStatusForSite(site)) @@ -342,10 +362,11 @@ class GetRestoreStatusUseCaseTest { private fun rewindStatusModel( rewindId: String?, status: Rewind.Status? = null, - state: State = State.ACTIVE + state: State = State.ACTIVE, + reason: Reason = Reason.NO_REASON ) = RewindStatusModel( state = state, - reason = Reason.NO_REASON, + reason = reason, lastUpdated = PUBLISHED, canAutoconfigure = null, credentials = null, From f3dad0b98a2909df346416108a368f667d8698c6 Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Thu, 1 Jul 2021 17:46:30 +0300 Subject: [PATCH 06/23] Feature: Implement handling the unavailable multisite rewind status This commit makes the previous failing test pass (TDD). --- .../restore/usecases/GetRestoreStatusUseCase.kt | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/jetpack/restore/usecases/GetRestoreStatusUseCase.kt b/WordPress/src/main/java/org/wordpress/android/ui/jetpack/restore/usecases/GetRestoreStatusUseCase.kt index 3676c9aad1d8..4650f0724bca 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/jetpack/restore/usecases/GetRestoreStatusUseCase.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/jetpack/restore/usecases/GetRestoreStatusUseCase.kt @@ -7,6 +7,7 @@ import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flowOn import org.wordpress.android.fluxc.model.SiteModel import org.wordpress.android.fluxc.model.activity.RewindStatusModel +import org.wordpress.android.fluxc.model.activity.RewindStatusModel.Reason.MULTISITE_NOT_SUPPORTED import org.wordpress.android.fluxc.model.activity.RewindStatusModel.Rewind import org.wordpress.android.fluxc.model.activity.RewindStatusModel.Rewind.Status.FAILED import org.wordpress.android.fluxc.model.activity.RewindStatusModel.Rewind.Status.FINISHED @@ -17,12 +18,13 @@ import org.wordpress.android.fluxc.store.ActivityLogStore import org.wordpress.android.fluxc.store.ActivityLogStore.FetchRewindStatePayload import org.wordpress.android.modules.BG_THREAD import org.wordpress.android.ui.jetpack.restore.RestoreRequestState +import org.wordpress.android.ui.jetpack.restore.RestoreRequestState.AwaitingCredentials import org.wordpress.android.ui.jetpack.restore.RestoreRequestState.Complete import org.wordpress.android.ui.jetpack.restore.RestoreRequestState.Empty import org.wordpress.android.ui.jetpack.restore.RestoreRequestState.Failure -import org.wordpress.android.ui.jetpack.restore.RestoreRequestState.AwaitingCredentials import org.wordpress.android.ui.jetpack.restore.RestoreRequestState.Failure.NetworkUnavailable import org.wordpress.android.ui.jetpack.restore.RestoreRequestState.Failure.RemoteRequestFailure +import org.wordpress.android.ui.jetpack.restore.RestoreRequestState.Multisite import org.wordpress.android.ui.jetpack.restore.RestoreRequestState.Progress import org.wordpress.android.util.AppLog import org.wordpress.android.util.AppLog.T @@ -73,7 +75,11 @@ class GetRestoreStatusUseCase @Inject constructor( break } if (rewind == null) { - emit(Empty) + if (rewindStatus?.reason == MULTISITE_NOT_SUPPORTED) { + emit(Multisite) + } else { + emit(Empty) + } break } if (restoreId == null || rewind.restoreId == restoreId) { From ea02151450d3e777ae63ac96727fda970a9b12c3 Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Thu, 1 Jul 2021 18:46:06 +0300 Subject: [PATCH 07/23] Feature: Add new is restore hidden field to activity log list item event Based on this new 'isRestoreHidden' field, the restore option will be hidden for the 'UNAVAILABLE' rewind state when the reason is 'MULTISITE_NOT_SUPPORTED'. --- .../activitylog/list/ActivityLogListItem.kt | 9 ++++--- .../activitylog/ActivityLogViewModel.kt | 5 ++-- .../activitylog/ActivityLogViewModelTest.kt | 25 +++++++++++-------- 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/activitylog/list/ActivityLogListItem.kt b/WordPress/src/main/java/org/wordpress/android/ui/activitylog/list/ActivityLogListItem.kt index a4e4aad55ac7..8997ca3cfd2a 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/activitylog/list/ActivityLogListItem.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/activitylog/list/ActivityLogListItem.kt @@ -30,7 +30,8 @@ sealed class ActivityLogListItem(val type: ViewType) { val rewindId: String?, val date: Date, override val isButtonVisible: Boolean, - val buttonIcon: Icon + val buttonIcon: Icon, + val isRestoreHidden: Boolean ) : ActivityLogListItem(EVENT), IActionableItem { val formattedDate: String = date.toFormattedDateString() val icon = Icon.fromValue(gridIcon) @@ -38,7 +39,8 @@ sealed class ActivityLogListItem(val type: ViewType) { constructor( model: ActivityLogModel, - rewindDisabled: Boolean = false + rewindDisabled: Boolean, + isRestoreHidden: Boolean ) : this( activityId = model.activityID, title = model.summary, @@ -49,7 +51,8 @@ sealed class ActivityLogListItem(val type: ViewType) { rewindId = model.rewindID, date = model.published, isButtonVisible = !rewindDisabled && model.rewindable ?: false, - buttonIcon = MORE + buttonIcon = MORE, + isRestoreHidden = isRestoreHidden ) override fun longId(): Long = activityId.hashCode().toLong() diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/activitylog/ActivityLogViewModel.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/activitylog/ActivityLogViewModel.kt index 5fad36d83c64..b6f84cae377c 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/activitylog/ActivityLogViewModel.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/activitylog/ActivityLogViewModel.kt @@ -201,8 +201,9 @@ class ActivityLogViewModel @Inject constructor( } eventList.forEach { model -> val currentItem = ActivityLogListItem.Event( - model, - withRestoreProgressItem || withBackupDownloadProgressItem + model = model, + rewindDisabled = withRestoreProgressItem || withBackupDownloadProgressItem, + isRestoreHidden = false ) val lastItem = items.lastOrNull() as? ActivityLogListItem.Event if (lastItem == null || lastItem.formattedDate != currentItem.formattedDate) { diff --git a/WordPress/src/test/java/org/wordpress/android/viewmodel/activitylog/ActivityLogViewModelTest.kt b/WordPress/src/test/java/org/wordpress/android/viewmodel/activitylog/ActivityLogViewModelTest.kt index cb93b5eccee7..92fe519d2083 100644 --- a/WordPress/src/test/java/org/wordpress/android/viewmodel/activitylog/ActivityLogViewModelTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/viewmodel/activitylog/ActivityLogViewModelTest.kt @@ -1446,6 +1446,7 @@ class ActivityLogViewModelTest { backupProgressWithDate: Boolean = false, emptyList: Boolean = false, rewindDisabled: Boolean = true, + isRestoreHidden: Boolean = false, isLastPageAndFreeSite: Boolean = false, canLoadMore: Boolean = false, withFooter: Boolean = false @@ -1469,12 +1470,12 @@ class ActivityLogViewModelTest { } } if (!emptyList) { - firstItem(rewindDisabled).let { + firstItem(rewindDisabled, isRestoreHidden).let { list.add(ActivityLogListItem.Header(it.formattedDate)) list.add(it) } - list.add(secondItem(rewindDisabled)) - thirdItem(rewindDisabled).let { + list.add(secondItem(rewindDisabled, isRestoreHidden)) + thirdItem(rewindDisabled, isRestoreHidden).let { list.add(ActivityLogListItem.Header(it.formattedDate)) list.add(it) } @@ -1492,19 +1493,22 @@ class ActivityLogViewModelTest { return list } - private fun firstItem(rewindDisabled: Boolean) = ActivityLogListItem.Event( + private fun firstItem(rewindDisabled: Boolean, isRestoreHidden: Boolean) = ActivityLogListItem.Event( model = activityList[0], - rewindDisabled = rewindDisabled + rewindDisabled = rewindDisabled, + isRestoreHidden = isRestoreHidden ) - private fun secondItem(rewindDisabled: Boolean) = ActivityLogListItem.Event( + private fun secondItem(rewindDisabled: Boolean, isRestoreHidden: Boolean) = ActivityLogListItem.Event( model = activityList[1], - rewindDisabled = rewindDisabled + rewindDisabled = rewindDisabled, + isRestoreHidden = isRestoreHidden ) - private fun thirdItem(rewindDisabled: Boolean) = ActivityLogListItem.Event( + private fun thirdItem(rewindDisabled: Boolean, isRestoreHidden: Boolean) = ActivityLogListItem.Event( model = activityList[2], - rewindDisabled = rewindDisabled + rewindDisabled = rewindDisabled, + isRestoreHidden = isRestoreHidden ) private suspend fun assertFetchEvents(canLoadMore: Boolean = false) { @@ -1526,7 +1530,8 @@ class ActivityLogViewModelTest { rewindId = null, date = Date(), isButtonVisible = true, - buttonIcon = ActivityLogListItem.Icon.DEFAULT + buttonIcon = ActivityLogListItem.Icon.DEFAULT, + isRestoreHidden = false ) private fun backupDownloadCompleteEvent() = BackupDownloadEvent( From 7e2a35de67442cd49100f8b1ad0500abc9267e01 Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Thu, 1 Jul 2021 18:47:48 +0300 Subject: [PATCH 08/23] Test: Add tests for the multisite restore requests state status These tests will fail as the implementation is not ready yet. The next commit will make the tests pass (TDD). --- .../activitylog/ActivityLogViewModelTest.kt | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/WordPress/src/test/java/org/wordpress/android/viewmodel/activitylog/ActivityLogViewModelTest.kt b/WordPress/src/test/java/org/wordpress/android/viewmodel/activitylog/ActivityLogViewModelTest.kt index 92fe519d2083..a7750cacea34 100644 --- a/WordPress/src/test/java/org/wordpress/android/viewmodel/activitylog/ActivityLogViewModelTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/viewmodel/activitylog/ActivityLogViewModelTest.kt @@ -1223,6 +1223,29 @@ class ActivityLogViewModelTest { verify(getRestoreStatusUseCase).getRestoreStatus(site, RESTORE_ID) } + @Test + fun `given status is multisite, when query restore status, then reload events for multisite`() = test { + whenever(getRestoreStatusUseCase.getRestoreStatus(site, RESTORE_ID)) + .thenReturn(flow { emit(RestoreRequestState.Multisite) }) + initRestoreProgressMocks() + + viewModel.onQueryRestoreStatus(REWIND_ID, RESTORE_ID) + + assertEquals( + viewModel.events.value, + expectedActivityList( + displayRestoreProgress = false, + restoreProgressWithDate = false, + emptyList = false, + rewindDisabled = false, + isRestoreHidden = true, + isLastPageAndFreeSite = false, + canLoadMore = true, + withFooter = false + ) + ) + } + @Test fun `given status is a progress, when query restore status, then reload events for progress`() = test { val progress = RestoreRequestState.Progress(REWIND_ID, 50) From 8296ab560bab7bfe327694ef7a96c5ea7263484d Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Thu, 1 Jul 2021 18:48:32 +0300 Subject: [PATCH 09/23] Feature: Implement handling the multisite restore requests state status This commit makes the previous failing test pass (TDD). --- .../viewmodel/activitylog/ActivityLogViewModel.kt | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/activitylog/ActivityLogViewModel.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/activitylog/ActivityLogViewModel.kt index b6f84cae377c..80caed5635f0 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/activitylog/ActivityLogViewModel.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/activitylog/ActivityLogViewModel.kt @@ -203,7 +203,7 @@ class ActivityLogViewModel @Inject constructor( val currentItem = ActivityLogListItem.Event( model = model, rewindDisabled = withRestoreProgressItem || withBackupDownloadProgressItem, - isRestoreHidden = false + isRestoreHidden = restoreEvent.isRestoreHidden ) val lastItem = items.lastOrNull() as? ActivityLogListItem.Event if (lastItem == null || lastItem.formattedDate != currentItem.formattedDate) { @@ -585,12 +585,22 @@ class ActivityLogViewModel @Inject constructor( private fun handleRestoreStatus(state: RestoreRequestState) { when (state) { + is RestoreRequestState.Multisite -> handleRestoreStatusForMultisite() is RestoreRequestState.Progress -> handleRestoreStatusForProgress(state) is RestoreRequestState.Complete -> handleRestoreStatusForComplete(state) else -> Unit // Do nothing } } + private fun handleRestoreStatusForMultisite() { + reloadEvents( + restoreEvent = RestoreEvent( + displayProgress = false, + isRestoreHidden = true + ) + ) + } + private fun handleRestoreStatusForProgress(state: RestoreRequestState.Progress) { if (!isRestoreProgressItemShown) { reloadEvents( @@ -706,6 +716,7 @@ class ActivityLogViewModel @Inject constructor( data class RestoreEvent( val displayProgress: Boolean, + val isRestoreHidden: Boolean = false, val isCompleted: Boolean = false, val rewindId: String? = null, val published: Date? = null From 8f1aa7a70ac1eb4b89091a82f880e671fe1d3758 Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Thu, 1 Jul 2021 18:50:46 +0300 Subject: [PATCH 10/23] Refactor: Optimize imports on activity log list item menu adapter --- .../ui/activitylog/list/ActivityLogListItemMenuAdapter.kt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/activitylog/list/ActivityLogListItemMenuAdapter.kt b/WordPress/src/main/java/org/wordpress/android/ui/activitylog/list/ActivityLogListItemMenuAdapter.kt index 40079ef63c86..fce9a5e1526c 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/activitylog/list/ActivityLogListItemMenuAdapter.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/activitylog/list/ActivityLogListItemMenuAdapter.kt @@ -10,8 +10,6 @@ import android.widget.TextView import androidx.appcompat.content.res.AppCompatResources import org.wordpress.android.R import org.wordpress.android.ui.activitylog.list.ActivityLogListItem.SecondaryAction -import org.wordpress.android.ui.activitylog.list.ActivityLogListItem.SecondaryAction.DOWNLOAD_BACKUP -import org.wordpress.android.ui.activitylog.list.ActivityLogListItem.SecondaryAction.RESTORE import org.wordpress.android.util.ColorUtils.setImageResourceWithTint import org.wordpress.android.util.getColorResIdFromAttribute @@ -48,11 +46,11 @@ class ActivityLogListItemMenuAdapter( val iconRes: Int val colorRes = view.context.getColorResIdFromAttribute(R.attr.wpColorOnSurfaceMedium) when (items[position]) { - RESTORE -> { + SecondaryAction.RESTORE -> { textRes = R.string.activity_log_item_menu_restore_label iconRes = R.drawable.ic_history_white_24dp } - DOWNLOAD_BACKUP -> { + SecondaryAction.DOWNLOAD_BACKUP -> { textRes = R.string.activity_log_item_menu_download_backup_label iconRes = R.drawable.ic_get_app_white_24dp } From 37bd32af78315cc2e66f557e16fa4363bfb13dfd Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Thu, 1 Jul 2021 18:54:45 +0300 Subject: [PATCH 11/23] Feature: Filter out the restore option when is restore hidden is on Based on this new 'isRestoreHidden' field, the restore option will be filter out from the activity log list item menu adapter for the 'UNAVAILABLE' rewind state when the reason is 'MULTISITE_NOT_SUPPORTED'. --- .../ui/activitylog/list/ActivityLogListItemMenuAdapter.kt | 8 ++++++-- .../android/ui/activitylog/list/EventItemViewHolder.kt | 7 +++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/activitylog/list/ActivityLogListItemMenuAdapter.kt b/WordPress/src/main/java/org/wordpress/android/ui/activitylog/list/ActivityLogListItemMenuAdapter.kt index fce9a5e1526c..e0f48fbf9665 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/activitylog/list/ActivityLogListItemMenuAdapter.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/activitylog/list/ActivityLogListItemMenuAdapter.kt @@ -14,10 +14,14 @@ import org.wordpress.android.util.ColorUtils.setImageResourceWithTint import org.wordpress.android.util.getColorResIdFromAttribute class ActivityLogListItemMenuAdapter( - context: Context + context: Context, + isRestoreHidden: Boolean, ) : BaseAdapter() { private val inflater: LayoutInflater = LayoutInflater.from(context) - private val items: List = SecondaryAction.values().toList() + private val items: List = SecondaryAction.values() + .toList() + .filter { !(it == SecondaryAction.RESTORE && isRestoreHidden) } + override fun getCount(): Int { return items.size } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/activitylog/list/EventItemViewHolder.kt b/WordPress/src/main/java/org/wordpress/android/ui/activitylog/list/EventItemViewHolder.kt index ad7df787eab1..dbd08c52594f 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/activitylog/list/EventItemViewHolder.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/activitylog/list/EventItemViewHolder.kt @@ -60,10 +60,13 @@ class EventItemViewHolder( actionButton.setOnClickListener { renderMoreMenu(activity, it) } } - private fun renderMoreMenu(event: ActivityLogListItem, v: View) { + private fun renderMoreMenu( + event: Event, + v: View + ) { val popup = ListPopupWindow(v.context) popup.width = v.context.resources.getDimensionPixelSize(R.dimen.menu_item_width) - popup.setAdapter(ActivityLogListItemMenuAdapter(v.context)) + popup.setAdapter(ActivityLogListItemMenuAdapter(v.context, event.isRestoreHidden)) popup.setDropDownGravity(Gravity.END) popup.anchorView = v popup.isModal = true From 5e17be2e908e7932834f924c52a07111e7551392 Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Fri, 2 Jul 2021 12:44:46 +0300 Subject: [PATCH 12/23] Feature: Add new is restore hidden field to activity log detail vm Based on this new 'isRestoreHidden' field, the restore button will be hidden for the 'UNAVAILABLE' rewind state when the reason is 'MULTISITE_NOT_SUPPORTED'. --- .../detail/ActivityLogDetailFragment.kt | 2 +- .../activitylog/ActivityLogDetailViewModel.kt | 9 +++++- .../ActivityLogDetailViewModelTest.kt | 32 ++++++++++++------- 3 files changed, 30 insertions(+), 13 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/activitylog/detail/ActivityLogDetailFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/activitylog/detail/ActivityLogDetailFragment.kt index 8b118adbdd8b..98efd4ecccb6 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/activitylog/detail/ActivityLogDetailFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/activitylog/detail/ActivityLogDetailFragment.kt @@ -100,7 +100,7 @@ class ActivityLogDetailFragment : Fragment(R.layout.activity_log_item_detail) { } }) - viewModel.start(site, activityLogId, areButtonsVisible) + viewModel.start(site, activityLogId, areButtonsVisible, false) } } } diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModel.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModel.kt index 61d0c7c32ae5..48f8428ca955 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModel.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModel.kt @@ -29,6 +29,7 @@ class ActivityLogDetailViewModel lateinit var site: SiteModel lateinit var activityLogId: String var areButtonsVisible = false + var isRestoreHidden = false private val _navigationEvents = MutableLiveData>() val navigationEvents: LiveData> @@ -50,10 +51,16 @@ class ActivityLogDetailViewModel val downloadBackupVisible: LiveData get() = _downloadBackupVisible - fun start(site: SiteModel, activityLogId: String, areButtonsVisible: Boolean) { + fun start( + site: SiteModel, + activityLogId: String, + areButtonsVisible: Boolean, + isRestoreHidden: Boolean, + ) { this.site = site this.activityLogId = activityLogId this.areButtonsVisible = areButtonsVisible + this.isRestoreHidden = isRestoreHidden _restoreVisible.value = areButtonsVisible _downloadBackupVisible.value = areButtonsVisible diff --git a/WordPress/src/test/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModelTest.kt b/WordPress/src/test/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModelTest.kt index 1f091c5f8d57..ba3c101e6327 100644 --- a/WordPress/src/test/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModelTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModelTest.kt @@ -35,6 +35,7 @@ class ActivityLogDetailViewModelTest { private lateinit var viewModel: ActivityLogDetailViewModel private val areButtonsVisible = true + private val isRestoreHidden = false private val activityID = "id1" private val summary = "Jetpack" @@ -87,21 +88,30 @@ class ActivityLogDetailViewModelTest { @Test fun `given buttons are not visible, when view model starts, then restore button is not shown`() { - viewModel.start(site, activityID, false) + val areButtonsVisible = false + val isRestoreHidden = false + + viewModel.start(site, activityID, areButtonsVisible, isRestoreHidden) assertEquals(false, restoreVisible) } @Test fun `given buttons are visible, when view model starts, then restore button is shown`() { - viewModel.start(site, activityID, true) + val areButtonsVisible = true + val isRestoreHidden = false + + viewModel.start(site, activityID, areButtonsVisible, isRestoreHidden) assertEquals(true, restoreVisible) } @Test fun `given buttons are not visible, when view model starts, then download backup button is not shown`() { - viewModel.start(site, activityID, false) + val areButtonsVisible = false + val isRestoreHidden = false + + viewModel.start(site, activityID, areButtonsVisible, isRestoreHidden) assertEquals(false, downloadBackupVisible) } @@ -110,7 +120,7 @@ class ActivityLogDetailViewModelTest { fun emitsUIModelOnStart() { whenever(activityLogStore.getActivityLogForSite(site)).thenReturn(listOf(activityLogModel)) - viewModel.start(site, activityID, areButtonsVisible) + viewModel.start(site, activityID, areButtonsVisible, isRestoreHidden) assertNotNull(lastEmittedItem) lastEmittedItem?.let { @@ -129,7 +139,7 @@ class ActivityLogDetailViewModelTest { ) whenever(activityLogStore.getActivityLogForSite(site)).thenReturn(listOf(updatedActivity)) - viewModel.start(site, activityID, areButtonsVisible) + viewModel.start(site, activityID, areButtonsVisible, isRestoreHidden) assertNotNull(lastEmittedItem) lastEmittedItem?.let { @@ -149,7 +159,7 @@ class ActivityLogDetailViewModelTest { ) whenever(activityLogStore.getActivityLogForSite(site)).thenReturn(listOf(updatedActivity)) - viewModel.start(site, activityID, areButtonsVisible) + viewModel.start(site, activityID, areButtonsVisible, isRestoreHidden) assertNotNull(lastEmittedItem) lastEmittedItem?.let { @@ -162,11 +172,11 @@ class ActivityLogDetailViewModelTest { fun doesNotReemitUIModelOnStartWithTheSameActivityID() { whenever(activityLogStore.getActivityLogForSite(site)).thenReturn(listOf(activityLogModel)) - viewModel.start(site, activityID, areButtonsVisible) + viewModel.start(site, activityID, areButtonsVisible, isRestoreHidden) lastEmittedItem = null - viewModel.start(site, activityID, areButtonsVisible) + viewModel.start(site, activityID, areButtonsVisible, isRestoreHidden) assertNull(lastEmittedItem) } @@ -179,11 +189,11 @@ class ActivityLogDetailViewModelTest { val secondActivity = activityLogModel.copy(activityID = activityID2, content = updatedContent) whenever(activityLogStore.getActivityLogForSite(site)).thenReturn(listOf(activityLogModel, secondActivity)) - viewModel.start(site, activityID, areButtonsVisible) + viewModel.start(site, activityID, areButtonsVisible, isRestoreHidden) lastEmittedItem = null - viewModel.start(site, activityID2, areButtonsVisible) + viewModel.start(site, activityID2, areButtonsVisible, isRestoreHidden) assertNotNull(lastEmittedItem) lastEmittedItem?.let { @@ -198,7 +208,7 @@ class ActivityLogDetailViewModelTest { lastEmittedItem = mock() - viewModel.start(site, activityID, areButtonsVisible) + viewModel.start(site, activityID, areButtonsVisible, isRestoreHidden) assertNull(lastEmittedItem) } From 75166d67fc310fed1254f5c9da704e874bf2de14 Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Fri, 2 Jul 2021 13:01:23 +0300 Subject: [PATCH 13/23] Test: Add missing test for the download backup button is shown use case --- .../activitylog/ActivityLogDetailViewModelTest.kt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/WordPress/src/test/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModelTest.kt b/WordPress/src/test/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModelTest.kt index ba3c101e6327..142d3eb3e335 100644 --- a/WordPress/src/test/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModelTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModelTest.kt @@ -116,6 +116,16 @@ class ActivityLogDetailViewModelTest { assertEquals(false, downloadBackupVisible) } + @Test + fun `given buttons are visible, when view model starts, then download backup button is shown`() { + val areButtonsVisible = true + val isRestoreHidden = false + + viewModel.start(site, activityID, areButtonsVisible, isRestoreHidden) + + assertEquals(true, downloadBackupVisible) + } + @Test fun emitsUIModelOnStart() { whenever(activityLogStore.getActivityLogForSite(site)).thenReturn(listOf(activityLogModel)) From 05caf9c20e1fa667b6f6a1b1ee7a296604005583 Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Fri, 2 Jul 2021 13:16:17 +0300 Subject: [PATCH 14/23] Test: Add tests to account for the extra is restore hidden logic These tests will fail as the implementation is not ready yet. The next commit will make the tests pass (TDD). --- .../ActivityLogDetailViewModelTest.kt | 28 ++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/WordPress/src/test/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModelTest.kt b/WordPress/src/test/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModelTest.kt index 142d3eb3e335..449547496b27 100644 --- a/WordPress/src/test/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModelTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModelTest.kt @@ -87,7 +87,7 @@ class ActivityLogDetailViewModelTest { } @Test - fun `given buttons are not visible, when view model starts, then restore button is not shown`() { + fun `given buttons not visible and restore not hidden, when view model starts, then restore button is not shown`() { val areButtonsVisible = false val isRestoreHidden = false @@ -97,7 +97,17 @@ class ActivityLogDetailViewModelTest { } @Test - fun `given buttons are visible, when view model starts, then restore button is shown`() { + fun `given button not visible and restore hidden, when view model starts, then restore button is not shown`() { + val areButtonsVisible = false + val isRestoreHidden = true + + viewModel.start(site, activityID, areButtonsVisible, isRestoreHidden) + + assertEquals(false, restoreVisible) + } + + @Test + fun `given buttons visible and restore not hidden, when view model starts, then restore button is shown`() { val areButtonsVisible = true val isRestoreHidden = false @@ -107,7 +117,17 @@ class ActivityLogDetailViewModelTest { } @Test - fun `given buttons are not visible, when view model starts, then download backup button is not shown`() { + fun `given button visible and restore hidden, when view model starts, then restore button is not shown`() { + val areButtonsVisible = true + val isRestoreHidden = true + + viewModel.start(site, activityID, areButtonsVisible, isRestoreHidden) + + assertEquals(false, restoreVisible) + } + + @Test + fun `given buttons not visible, when view model starts, then download backup button is not shown`() { val areButtonsVisible = false val isRestoreHidden = false @@ -117,7 +137,7 @@ class ActivityLogDetailViewModelTest { } @Test - fun `given buttons are visible, when view model starts, then download backup button is shown`() { + fun `given buttons visible, when view model starts, then download backup button is shown`() { val areButtonsVisible = true val isRestoreHidden = false From ef67b4f72eb3f993e2c730674c138a283fec698e Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Fri, 2 Jul 2021 13:16:52 +0300 Subject: [PATCH 15/23] Feature: Implement handling the the extra is restore hidden logic This commit makes the previous failing test pass (TDD). --- .../android/viewmodel/activitylog/ActivityLogDetailViewModel.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModel.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModel.kt index 48f8428ca955..87c5ab0a115e 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModel.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModel.kt @@ -62,7 +62,7 @@ class ActivityLogDetailViewModel this.areButtonsVisible = areButtonsVisible this.isRestoreHidden = isRestoreHidden - _restoreVisible.value = areButtonsVisible + _restoreVisible.value = areButtonsVisible && !isRestoreHidden _downloadBackupVisible.value = areButtonsVisible if (activityLogId != _item.value?.activityID) { From 09f5c9e96cefe885dcc9a7e7653d2113a4350d6a Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Fri, 2 Jul 2021 13:31:19 +0300 Subject: [PATCH 16/23] Feature: Pass is restore hidden flag to activity log detail fragment Based on this new 'isRestoreHidden' flag, the restore button will be hidden for the 'UNAVAILABLE' rewind state when the reason is 'MULTISITE_NOT_SUPPORTED'. --- .../org/wordpress/android/ui/ActivityLauncher.java | 3 +++ .../activitylog/detail/ActivityLogDetailFragment.kt | 13 ++++++++++++- .../ui/activitylog/list/ActivityLogListFragment.kt | 1 + .../activitylog/ActivityLogDetailViewModel.kt | 1 + 4 files changed, 17 insertions(+), 1 deletion(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/ActivityLauncher.java b/WordPress/src/main/java/org/wordpress/android/ui/ActivityLauncher.java index 53bab1ca67d1..6c5b8650eecf 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/ActivityLauncher.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/ActivityLauncher.java @@ -138,6 +138,7 @@ import static org.wordpress.android.ui.stories.StoryComposerActivity.KEY_POST_LOCAL_ID; import static org.wordpress.android.viewmodel.activitylog.ActivityLogDetailViewModelKt.ACTIVITY_LOG_ARE_BUTTONS_VISIBLE_KEY; import static org.wordpress.android.viewmodel.activitylog.ActivityLogDetailViewModelKt.ACTIVITY_LOG_ID_KEY; +import static org.wordpress.android.viewmodel.activitylog.ActivityLogDetailViewModelKt.ACTIVITY_LOG_IS_RESTORE_HIDDEN_KEY; import static org.wordpress.android.viewmodel.activitylog.ActivityLogViewModelKt.ACTIVITY_LOG_REWINDABLE_ONLY_KEY; public class ActivityLauncher { @@ -688,6 +689,7 @@ public static void viewActivityLogDetailForResult( SiteModel site, String activityId, boolean isButtonVisible, + boolean isRestoreHidden, boolean rewindableOnly ) { Map properties = new HashMap<>(); @@ -705,6 +707,7 @@ public static void viewActivityLogDetailForResult( intent.putExtra(WordPress.SITE, site); intent.putExtra(ACTIVITY_LOG_ID_KEY, activityId); intent.putExtra(ACTIVITY_LOG_ARE_BUTTONS_VISIBLE_KEY, isButtonVisible); + intent.putExtra(ACTIVITY_LOG_IS_RESTORE_HIDDEN_KEY, isRestoreHidden); intent.putExtra(SOURCE_TRACK_EVENT_PROPERTY_KEY, source); activity.startActivityForResult(intent, RequestCodes.ACTIVITY_LOG_DETAIL); } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/activitylog/detail/ActivityLogDetailFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/activitylog/detail/ActivityLogDetailFragment.kt index 98efd4ecccb6..27777365f981 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/activitylog/detail/ActivityLogDetailFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/activitylog/detail/ActivityLogDetailFragment.kt @@ -24,6 +24,7 @@ import org.wordpress.android.util.image.ImageManager import org.wordpress.android.util.image.ImageType.AVATAR_WITH_BACKGROUND import org.wordpress.android.viewmodel.activitylog.ACTIVITY_LOG_ARE_BUTTONS_VISIBLE_KEY import org.wordpress.android.viewmodel.activitylog.ACTIVITY_LOG_ID_KEY +import org.wordpress.android.viewmodel.activitylog.ACTIVITY_LOG_IS_RESTORE_HIDDEN_KEY import org.wordpress.android.viewmodel.activitylog.ActivityLogDetailViewModel import org.wordpress.android.viewmodel.observeEvent import javax.inject.Inject @@ -59,6 +60,7 @@ class ActivityLogDetailFragment : Fragment(R.layout.activity_log_item_detail) { with(ActivityLogItemDetailBinding.bind(view)) { val (site, activityLogId) = sideAndActivityId(savedInstanceState, activity.intent) val areButtonsVisible = areButtonsVisible(savedInstanceState, activity.intent) + val isRestoreHidden = isRestoreHidden(savedInstanceState, activity.intent) viewModel.activityLogItem.observe(viewLifecycleOwner, { activityLogModel -> loadLogItem(activityLogModel, activity) @@ -100,7 +102,7 @@ class ActivityLogDetailFragment : Fragment(R.layout.activity_log_item_detail) { } }) - viewModel.start(site, activityLogId, areButtonsVisible, false) + viewModel.start(site, activityLogId, areButtonsVisible, isRestoreHidden) } } } @@ -176,11 +178,20 @@ class ActivityLogDetailFragment : Fragment(R.layout.activity_log_item_detail) { else -> throw Throwable("Couldn't initialize Activity Log view model") } + private fun isRestoreHidden(savedInstanceState: Bundle?, intent: Intent?) = when { + savedInstanceState != null -> + requireNotNull(savedInstanceState.getBoolean(ACTIVITY_LOG_IS_RESTORE_HIDDEN_KEY, false)) + intent != null -> + intent.getBooleanExtra(ACTIVITY_LOG_IS_RESTORE_HIDDEN_KEY, false) + else -> throw Throwable("Couldn't initialize Activity Log view model") + } + override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) outState.putSerializable(WordPress.SITE, viewModel.site) outState.putString(ACTIVITY_LOG_ID_KEY, viewModel.activityLogId) outState.putBoolean(ACTIVITY_LOG_ARE_BUTTONS_VISIBLE_KEY, viewModel.areButtonsVisible) + outState.putBoolean(ACTIVITY_LOG_IS_RESTORE_HIDDEN_KEY, viewModel.isRestoreHidden) } private fun ActivityLogItemDetailBinding.setActorIcon(actorIcon: String?, showJetpackIcon: Boolean?) { diff --git a/WordPress/src/main/java/org/wordpress/android/ui/activitylog/list/ActivityLogListFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/activitylog/list/ActivityLogListFragment.kt index 8da564733a40..e0e32e02065d 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/activitylog/list/ActivityLogListFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/activitylog/list/ActivityLogListFragment.kt @@ -179,6 +179,7 @@ class ActivityLogListFragment : Fragment(R.layout.activity_log_list_fragment) { viewModel.site, it.activityId, it.isButtonVisible, + it.isRestoreHidden, viewModel.rewindableOnly ) } diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModel.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModel.kt index 87c5ab0a115e..ddd734c43654 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModel.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModel.kt @@ -20,6 +20,7 @@ import javax.inject.Inject const val ACTIVITY_LOG_ID_KEY: String = "activity_log_id_key" const val ACTIVITY_LOG_ARE_BUTTONS_VISIBLE_KEY: String = "activity_log_are_buttons_visible_key" +const val ACTIVITY_LOG_IS_RESTORE_HIDDEN_KEY: String = "activity_log_is_restore_hidden_key" class ActivityLogDetailViewModel @Inject constructor( From b0b0d673188116da1ae7b9095864064e73748efa Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Fri, 2 Jul 2021 17:46:14 +0300 Subject: [PATCH 17/23] Test: Add tests to account for the extra is multisite message logic These tests will fail as the implementation is not ready yet. The next commit will make the tests pass (TDD). --- .../activitylog/ActivityLogDetailViewModel.kt | 5 ++++ .../ActivityLogDetailViewModelTest.kt | 26 +++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModel.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModel.kt index ddd734c43654..034f0e566d3b 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModel.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModel.kt @@ -1,5 +1,6 @@ package org.wordpress.android.viewmodel.activitylog +import android.text.SpannableString import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel @@ -52,6 +53,10 @@ class ActivityLogDetailViewModel val downloadBackupVisible: LiveData get() = _downloadBackupVisible + private val _multisiteVisible = MutableLiveData>() + val multisiteVisible: LiveData> + get() = _multisiteVisible + fun start( site: SiteModel, activityLogId: String, diff --git a/WordPress/src/test/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModelTest.kt b/WordPress/src/test/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModelTest.kt index 449547496b27..a0aa61723fd8 100644 --- a/WordPress/src/test/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModelTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModelTest.kt @@ -1,10 +1,12 @@ package org.wordpress.android.viewmodel.activitylog +import android.text.SpannableString import androidx.arch.core.executor.testing.InstantTaskExecutorRule import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever import org.junit.After import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse import org.junit.Assert.assertNotNull import org.junit.Assert.assertNull import org.junit.Assert.assertTrue @@ -67,6 +69,7 @@ class ActivityLogDetailViewModelTest { private var lastEmittedItem: ActivityLogDetailModel? = null private var restoreVisible: Boolean = false private var downloadBackupVisible: Boolean = false + private var multisiteVisible: Pair = Pair(false, null) private var navigationEvents: MutableList> = mutableListOf() @Before @@ -78,6 +81,7 @@ class ActivityLogDetailViewModelTest { viewModel.activityLogItem.observeForever { lastEmittedItem = it } viewModel.restoreVisible.observeForever { restoreVisible = it } viewModel.downloadBackupVisible.observeForever { downloadBackupVisible = it } + viewModel.multisiteVisible.observeForever { multisiteVisible = it } viewModel.navigationEvents.observeForever { navigationEvents.add(it) } } @@ -146,6 +150,28 @@ class ActivityLogDetailViewModelTest { assertEquals(true, downloadBackupVisible) } + @Test + fun `given restore not hidden, when view model starts, then multisite message is not shown`() { + val areButtonsVisible = true + val isRestoreHidden = false + + viewModel.start(site, activityID, areButtonsVisible, isRestoreHidden) + + assertFalse(multisiteVisible.first) + assertNull(multisiteVisible.second) + } + + @Test + fun `given restore hidden, when view model starts, then multisite message is shown`() { + val areButtonsVisible = true + val isRestoreHidden = true + + viewModel.start(site, activityID, areButtonsVisible, isRestoreHidden) + + assertTrue(multisiteVisible.first) + assertNotNull(multisiteVisible.second) + } + @Test fun emitsUIModelOnStart() { whenever(activityLogStore.getActivityLogForSite(site)).thenReturn(listOf(activityLogModel)) From cec29ca35293fcf1d4ec48bf7c641e9dc8f772af Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Fri, 2 Jul 2021 17:55:36 +0300 Subject: [PATCH 18/23] Feature: Implement handling the the extra is multisite message logic This commit makes the previous failing test pass (TDD). --- .../detail/ActivityLogDetailFragment.kt | 37 +++++++++++++----- .../activitylog/ActivityLogDetailViewModel.kt | 39 +++++++++++++++++-- .../res/layout/activity_log_item_detail.xml | 10 +++++ WordPress/src/main/res/values/strings.xml | 2 + .../ActivityLogDetailViewModelTest.kt | 16 +++++++- 5 files changed, 91 insertions(+), 13 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/activitylog/detail/ActivityLogDetailFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/activitylog/detail/ActivityLogDetailFragment.kt index 27777365f981..2428112e6c2a 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/activitylog/detail/ActivityLogDetailFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/activitylog/detail/ActivityLogDetailFragment.kt @@ -2,6 +2,8 @@ package org.wordpress.android.ui.activitylog.detail import android.content.Intent import android.os.Bundle +import android.text.SpannableString +import android.text.method.LinkMovementMethod import android.view.View import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentActivity @@ -72,16 +74,19 @@ class ActivityLogDetailFragment : Fragment(R.layout.activity_log_item_detail) { viewModel.downloadBackupVisible.observe(viewLifecycleOwner, { available -> activityDownloadBackupButton.visibility = if (available == true) View.VISIBLE else View.GONE }) + viewModel.multisiteVisible.observe(viewLifecycleOwner, { available -> + checkAndShowMultisiteMessage(available) + }) - viewModel.navigationEvents.observeEvent(viewLifecycleOwner, { - when (it) { - is ShowBackupDownload -> ActivityLauncher.showBackupDownloadForResult( - requireActivity(), - viewModel.site, - it.model.activityID, - RequestCodes.BACKUP_DOWNLOAD, - buildTrackingSource() - ) + viewModel.navigationEvents.observeEvent(viewLifecycleOwner, { + when (it) { + is ShowBackupDownload -> ActivityLauncher.showBackupDownloadForResult( + requireActivity(), + viewModel.site, + it.model.activityID, + RequestCodes.BACKUP_DOWNLOAD, + buildTrackingSource() + ) is ShowRestore -> ActivityLauncher.showRestoreForResult( requireActivity(), viewModel.site, @@ -107,6 +112,20 @@ class ActivityLogDetailFragment : Fragment(R.layout.activity_log_item_detail) { } } + private fun ActivityLogItemDetailBinding.checkAndShowMultisiteMessage(available: Pair) { + if (available.first) { + with(multisiteMessage) { + linksClickable = true + isClickable = true + movementMethod = LinkMovementMethod.getInstance() + text = available.second + visibility = View.VISIBLE + } + } else { + multisiteMessage.visibility = View.GONE + } + } + private fun ActivityLogItemDetailBinding.loadLogItem( activityLogModel: ActivityLogDetailModel?, activity: FragmentActivity diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModel.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModel.kt index 034f0e566d3b..a6699aa8c0c7 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModel.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModel.kt @@ -1,9 +1,13 @@ package org.wordpress.android.viewmodel.activitylog import android.text.SpannableString +import android.text.Spanned +import android.text.style.ClickableSpan +import android.view.View import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel +import org.wordpress.android.R import org.wordpress.android.fluxc.Dispatcher import org.wordpress.android.fluxc.model.SiteModel import org.wordpress.android.fluxc.model.activity.ActivityLogModel.ActivityActor @@ -11,11 +15,13 @@ import org.wordpress.android.fluxc.store.ActivityLogStore import org.wordpress.android.fluxc.tools.FormattableRange import org.wordpress.android.ui.activitylog.detail.ActivityLogDetailModel import org.wordpress.android.ui.activitylog.detail.ActivityLogDetailNavigationEvents +import org.wordpress.android.ui.utils.HtmlMessageUtils import org.wordpress.android.util.AppLog import org.wordpress.android.util.AppLog.T.ACTIVITY_LOG import org.wordpress.android.util.toFormattedDateString import org.wordpress.android.util.toFormattedTimeString import org.wordpress.android.viewmodel.Event +import org.wordpress.android.viewmodel.ResourceProvider import org.wordpress.android.viewmodel.SingleLiveEvent import javax.inject.Inject @@ -23,10 +29,11 @@ const val ACTIVITY_LOG_ID_KEY: String = "activity_log_id_key" const val ACTIVITY_LOG_ARE_BUTTONS_VISIBLE_KEY: String = "activity_log_are_buttons_visible_key" const val ACTIVITY_LOG_IS_RESTORE_HIDDEN_KEY: String = "activity_log_is_restore_hidden_key" -class ActivityLogDetailViewModel -@Inject constructor( +class ActivityLogDetailViewModel @Inject constructor( val dispatcher: Dispatcher, - private val activityLogStore: ActivityLogStore + private val activityLogStore: ActivityLogStore, + private val resourceProvider: ResourceProvider, + private val htmlMessageUtils: HtmlMessageUtils ) : ViewModel() { lateinit var site: SiteModel lateinit var activityLogId: String @@ -70,6 +77,7 @@ class ActivityLogDetailViewModel _restoreVisible.value = areButtonsVisible && !isRestoreHidden _downloadBackupVisible.value = areButtonsVisible + _multisiteVisible.value = if (isRestoreHidden) Pair(true, getMultisiteMessage()) else Pair(false, null) if (activityLogId != _item.value?.activityID) { _item.value = activityLogStore @@ -93,6 +101,31 @@ class ActivityLogDetailViewModel } } + private fun getMultisiteMessage(): SpannableString { + val clickableText = resourceProvider.getString(R.string.activity_log_visit_our_documentation_page) + val multisiteMessage = htmlMessageUtils.getHtmlMessageFromStringFormatResId( + R.string.activity_log_multisite_message, + clickableText + ) + return constructMultisiteSpan(multisiteMessage, clickableText) + } + + private fun constructMultisiteSpan( + multisiteMessage: CharSequence, + clickableText: String + ): SpannableString { + val clickableSpan = object : ClickableSpan() { + override fun onClick(widget: View) { + TODO() + } + } + val clickableStartIndex = multisiteMessage.indexOf(clickableText) + val clickableEndIndex = clickableStartIndex + clickableText.length + val multisiteSpan = SpannableString(multisiteMessage) + multisiteSpan.setSpan(clickableSpan, clickableStartIndex, clickableEndIndex, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) + return multisiteSpan + } + fun onRangeClicked(range: FormattableRange) { _handleFormattableRangeClick.value = range } diff --git a/WordPress/src/main/res/layout/activity_log_item_detail.xml b/WordPress/src/main/res/layout/activity_log_item_detail.xml index 181a6d84694a..4d33c2254eee 100644 --- a/WordPress/src/main/res/layout/activity_log_item_detail.xml +++ b/WordPress/src/main/res/layout/activity_log_item_detail.xml @@ -178,6 +178,16 @@ + + diff --git a/WordPress/src/main/res/values/strings.xml b/WordPress/src/main/res/values/strings.xml index cf9a47a6d81b..c53e76cca3cc 100644 --- a/WordPress/src/main/res/values/strings.xml +++ b/WordPress/src/main/res/values/strings.xml @@ -1067,6 +1067,8 @@ Activity Type filter %s (showing %s items) Activity Type filter (%s types selected) + Jetpack Backup for Multisite installations provides downloadable backups, no one-click restores. For more information %1$s. + visit our documentation page Restore to this point diff --git a/WordPress/src/test/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModelTest.kt b/WordPress/src/test/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModelTest.kt index a0aa61723fd8..57bc41d46d31 100644 --- a/WordPress/src/test/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModelTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModelTest.kt @@ -2,6 +2,7 @@ package org.wordpress.android.viewmodel.activitylog import android.text.SpannableString import androidx.arch.core.executor.testing.InstantTaskExecutorRule +import com.nhaarman.mockitokotlin2.any import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever import org.junit.After @@ -14,6 +15,7 @@ import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith +import org.mockito.ArgumentMatchers.anyInt import org.mockito.Mock import org.mockito.junit.MockitoJUnitRunner import org.wordpress.android.fluxc.Dispatcher @@ -24,7 +26,9 @@ import org.wordpress.android.fluxc.tools.FormattableContent import org.wordpress.android.fluxc.tools.FormattableRange import org.wordpress.android.ui.activitylog.detail.ActivityLogDetailModel import org.wordpress.android.ui.activitylog.detail.ActivityLogDetailNavigationEvents +import org.wordpress.android.ui.utils.HtmlMessageUtils import org.wordpress.android.viewmodel.Event +import org.wordpress.android.viewmodel.ResourceProvider import java.util.Date @RunWith(MockitoJUnitRunner::class) @@ -33,6 +37,8 @@ class ActivityLogDetailViewModelTest { @Mock private lateinit var dispatcher: Dispatcher @Mock private lateinit var activityLogStore: ActivityLogStore + @Mock private lateinit var resourceProvider: ResourceProvider + @Mock private lateinit var htmlMessageUtils: HtmlMessageUtils @Mock private lateinit var site: SiteModel private lateinit var viewModel: ActivityLogDetailViewModel @@ -76,13 +82,21 @@ class ActivityLogDetailViewModelTest { fun setUp() { viewModel = ActivityLogDetailViewModel( dispatcher, - activityLogStore + activityLogStore, + resourceProvider, + htmlMessageUtils ) viewModel.activityLogItem.observeForever { lastEmittedItem = it } viewModel.restoreVisible.observeForever { restoreVisible = it } viewModel.downloadBackupVisible.observeForever { downloadBackupVisible = it } viewModel.multisiteVisible.observeForever { multisiteVisible = it } viewModel.navigationEvents.observeForever { navigationEvents.add(it) } + setUpMocks() + } + + private fun setUpMocks() { + whenever(htmlMessageUtils.getHtmlMessageFromStringFormatResId(anyInt(), any())).thenReturn("") + whenever(resourceProvider.getString(anyInt())).thenReturn("") } @After From 4f8ab7f275b60fe9fe029f22e28ba8940dc8a109 Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Fri, 2 Jul 2021 17:59:29 +0300 Subject: [PATCH 19/23] Feature: Show documentation page on multisite message click --- .../detail/ActivityLogDetailFragment.kt | 16 +++++++++------- .../detail/ActivityLogDetailNavigationEvents.kt | 3 +++ .../activitylog/ActivityLogDetailViewModel.kt | 3 ++- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/activitylog/detail/ActivityLogDetailFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/activitylog/detail/ActivityLogDetailFragment.kt index 2428112e6c2a..564c005d500a 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/activitylog/detail/ActivityLogDetailFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/activitylog/detail/ActivityLogDetailFragment.kt @@ -16,6 +16,7 @@ import org.wordpress.android.ui.ActivityLauncher import org.wordpress.android.ui.ActivityLauncher.SOURCE_TRACK_EVENT_PROPERTY_KEY import org.wordpress.android.ui.RequestCodes import org.wordpress.android.ui.activitylog.detail.ActivityLogDetailNavigationEvents.ShowBackupDownload +import org.wordpress.android.ui.activitylog.detail.ActivityLogDetailNavigationEvents.ShowDocumentationPage import org.wordpress.android.ui.activitylog.detail.ActivityLogDetailNavigationEvents.ShowRestore import org.wordpress.android.ui.notifications.blocks.NoteBlockClickableSpan import org.wordpress.android.ui.notifications.utils.FormattableContentClickHandler @@ -87,13 +88,14 @@ class ActivityLogDetailFragment : Fragment(R.layout.activity_log_item_detail) { RequestCodes.BACKUP_DOWNLOAD, buildTrackingSource() ) - is ShowRestore -> ActivityLauncher.showRestoreForResult( - requireActivity(), - viewModel.site, - it.model.activityID, - RequestCodes.RESTORE, - buildTrackingSource() - ) + is ShowRestore -> ActivityLauncher.showRestoreForResult( + requireActivity(), + viewModel.site, + it.model.activityID, + RequestCodes.RESTORE, + buildTrackingSource() + ) + is ShowDocumentationPage -> ActivityLauncher.openUrlExternal(requireContext(), it.url) } }) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/activitylog/detail/ActivityLogDetailNavigationEvents.kt b/WordPress/src/main/java/org/wordpress/android/ui/activitylog/detail/ActivityLogDetailNavigationEvents.kt index 6d40fd770efd..7d8d05253f13 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/activitylog/detail/ActivityLogDetailNavigationEvents.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/activitylog/detail/ActivityLogDetailNavigationEvents.kt @@ -1,6 +1,9 @@ package org.wordpress.android.ui.activitylog.detail +const val DOCUMENTATION_PAGE_URL = "https://jetpack.com/support/backup/" + sealed class ActivityLogDetailNavigationEvents { data class ShowBackupDownload(val model: ActivityLogDetailModel) : ActivityLogDetailNavigationEvents() data class ShowRestore(val model: ActivityLogDetailModel) : ActivityLogDetailNavigationEvents() + data class ShowDocumentationPage(val url: String = DOCUMENTATION_PAGE_URL) : ActivityLogDetailNavigationEvents() } diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModel.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModel.kt index a6699aa8c0c7..fa7feeb432cc 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModel.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModel.kt @@ -15,6 +15,7 @@ import org.wordpress.android.fluxc.store.ActivityLogStore import org.wordpress.android.fluxc.tools.FormattableRange import org.wordpress.android.ui.activitylog.detail.ActivityLogDetailModel import org.wordpress.android.ui.activitylog.detail.ActivityLogDetailNavigationEvents +import org.wordpress.android.ui.activitylog.detail.ActivityLogDetailNavigationEvents.ShowDocumentationPage import org.wordpress.android.ui.utils.HtmlMessageUtils import org.wordpress.android.util.AppLog import org.wordpress.android.util.AppLog.T.ACTIVITY_LOG @@ -116,7 +117,7 @@ class ActivityLogDetailViewModel @Inject constructor( ): SpannableString { val clickableSpan = object : ClickableSpan() { override fun onClick(widget: View) { - TODO() + _navigationEvents.postValue(Event(ShowDocumentationPage())) } } val clickableStartIndex = multisiteMessage.indexOf(clickableText) From f8a927f7a1fbdba099385f6eb67ba46dc301c64e Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Fri, 2 Jul 2021 19:02:22 +0300 Subject: [PATCH 20/23] Build: Update fluxc hash This 'FluxC' hash updates 'FluxC' to that 'branch' version where 'RewindStatusModel.Reason' enum become available. This step is required in order to determine whether or not to hide the restore option for the 'UNAVAILABLE' rewind state when the reason is 'MULTISITE_NOT_SUPPORTED'. --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index d489700de815..546fa3d76739 100644 --- a/build.gradle +++ b/build.gradle @@ -133,7 +133,7 @@ ext { androidxWorkVersion = "2.4.0" daggerVersion = '2.29.1' - fluxCVersion = 'ef0351a561c1f873cf89ad2b5508cb8968e65f08' + fluxCVersion = '0e8ba43d06bd4125c08d413cfa4b560bdf1a5ef5' appCompatVersion = '1.0.2' coreVersion = '1.3.2' From dc97ccd511167c3bdfda3a7b5fa0e7ad23481973 Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Fri, 2 Jul 2021 19:03:59 +0300 Subject: [PATCH 21/23] Analysis: Fix ktlint issue with kotlin 1.4 trailing commas --- .../ui/activitylog/list/ActivityLogListItemMenuAdapter.kt | 2 +- .../viewmodel/activitylog/ActivityLogDetailViewModel.kt | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/activitylog/list/ActivityLogListItemMenuAdapter.kt b/WordPress/src/main/java/org/wordpress/android/ui/activitylog/list/ActivityLogListItemMenuAdapter.kt index e0f48fbf9665..3af59a37e3aa 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/activitylog/list/ActivityLogListItemMenuAdapter.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/activitylog/list/ActivityLogListItemMenuAdapter.kt @@ -15,7 +15,7 @@ import org.wordpress.android.util.getColorResIdFromAttribute class ActivityLogListItemMenuAdapter( context: Context, - isRestoreHidden: Boolean, + isRestoreHidden: Boolean ) : BaseAdapter() { private val inflater: LayoutInflater = LayoutInflater.from(context) private val items: List = SecondaryAction.values() diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModel.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModel.kt index fa7feeb432cc..280810709376 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModel.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModel.kt @@ -19,8 +19,6 @@ import org.wordpress.android.ui.activitylog.detail.ActivityLogDetailNavigationEv import org.wordpress.android.ui.utils.HtmlMessageUtils import org.wordpress.android.util.AppLog import org.wordpress.android.util.AppLog.T.ACTIVITY_LOG -import org.wordpress.android.util.toFormattedDateString -import org.wordpress.android.util.toFormattedTimeString import org.wordpress.android.viewmodel.Event import org.wordpress.android.viewmodel.ResourceProvider import org.wordpress.android.viewmodel.SingleLiveEvent @@ -69,7 +67,7 @@ class ActivityLogDetailViewModel @Inject constructor( site: SiteModel, activityLogId: String, areButtonsVisible: Boolean, - isRestoreHidden: Boolean, + isRestoreHidden: Boolean ) { this.site = site this.activityLogId = activityLogId From f7c15b93ac2768ec00bb0b8c6201580e5c3e3bcc Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Mon, 5 Jul 2021 11:30:57 +0300 Subject: [PATCH 22/23] Refactor: Fix imports on activity log detail view model Those two 'toFormattedDateString' and 'toFormattedTimeString' imports were previously automatically deleted by the IDE during commit. --- .../android/viewmodel/activitylog/ActivityLogDetailViewModel.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModel.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModel.kt index 280810709376..9a4675d409f1 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModel.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/activitylog/ActivityLogDetailViewModel.kt @@ -19,6 +19,8 @@ import org.wordpress.android.ui.activitylog.detail.ActivityLogDetailNavigationEv import org.wordpress.android.ui.utils.HtmlMessageUtils import org.wordpress.android.util.AppLog import org.wordpress.android.util.AppLog.T.ACTIVITY_LOG +import org.wordpress.android.util.toFormattedDateString +import org.wordpress.android.util.toFormattedTimeString import org.wordpress.android.viewmodel.Event import org.wordpress.android.viewmodel.ResourceProvider import org.wordpress.android.viewmodel.SingleLiveEvent From 71c3a07b45605f8f5c93ac8b65ef48db96d49133 Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Mon, 5 Jul 2021 15:19:52 +0300 Subject: [PATCH 23/23] Build: Update fluxc tag to 1.21.0-beta-3 This 'FluxC' tag updates FluxC to that 'develop' version where 'RewindStatusModel.Reason' enum become available. This step is required in order to determine whether or not to hide the restore option for the 'UNAVAILABLE' rewind state when the reason is 'MULTISITE_NOT_SUPPORTED'. --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 546fa3d76739..6753a9a89423 100644 --- a/build.gradle +++ b/build.gradle @@ -133,7 +133,7 @@ ext { androidxWorkVersion = "2.4.0" daggerVersion = '2.29.1' - fluxCVersion = '0e8ba43d06bd4125c08d413cfa4b560bdf1a5ef5' + fluxCVersion = '1.21.0-beta-3' appCompatVersion = '1.0.2' coreVersion = '1.3.2'