From 4e27ecab331690dead3d6d1ffb94aa657a2460a0 Mon Sep 17 00:00:00 2001 From: Ondrej Ruttkay Date: Wed, 24 May 2023 21:33:46 +0200 Subject: [PATCH 1/8] Add a new plan upgrade source (notification) --- .../com/woocommerce/android/analytics/AnalyticsTracker.kt | 1 + .../login/storecreation/dispatcher/PlanUpgradeStartFragment.kt | 2 +- .../storecreation/dispatcher/PlanUpgradeStartViewModel.kt | 3 +++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/analytics/AnalyticsTracker.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/analytics/AnalyticsTracker.kt index 209ae3d015c8..8d4a5cc1dbc4 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/analytics/AnalyticsTracker.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/analytics/AnalyticsTracker.kt @@ -500,6 +500,7 @@ class AnalyticsTracker private constructor(private val context: Context) { // -- Free Trial const val VALUE_BANNER = "banner" const val VALUE_UPGRADES_SCREEN = "upgrades_screen" + const val VALUE_NOTIFICATION = "notification" // -- Store Onboarding const val ONBOARDING_TASK_KEY = "task" diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/storecreation/dispatcher/PlanUpgradeStartFragment.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/storecreation/dispatcher/PlanUpgradeStartFragment.kt index 3e67b413a77c..4072f44ff126 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/storecreation/dispatcher/PlanUpgradeStartFragment.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/storecreation/dispatcher/PlanUpgradeStartFragment.kt @@ -57,6 +57,6 @@ class PlanUpgradeStartFragment : BaseFragment() { } enum class PlanUpgradeStartSource { - BANNER, UPGRADES_SCREEN + BANNER, UPGRADES_SCREEN, NOTIFICATION } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/storecreation/dispatcher/PlanUpgradeStartViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/storecreation/dispatcher/PlanUpgradeStartViewModel.kt index 6c92818c0126..7b9676dd7f2c 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/storecreation/dispatcher/PlanUpgradeStartViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/storecreation/dispatcher/PlanUpgradeStartViewModel.kt @@ -4,12 +4,14 @@ import androidx.lifecycle.SavedStateHandle import com.woocommerce.android.analytics.AnalyticsEvent import com.woocommerce.android.analytics.AnalyticsTracker.Companion.KEY_SOURCE import com.woocommerce.android.analytics.AnalyticsTracker.Companion.VALUE_BANNER +import com.woocommerce.android.analytics.AnalyticsTracker.Companion.VALUE_NOTIFICATION import com.woocommerce.android.analytics.AnalyticsTracker.Companion.VALUE_UPGRADES_SCREEN import com.woocommerce.android.analytics.AnalyticsTrackerWrapper import com.woocommerce.android.tools.SelectedSite import com.woocommerce.android.ui.common.wpcomwebview.WPComWebViewAuthenticator import com.woocommerce.android.ui.common.wpcomwebview.WPComWebViewViewModel import com.woocommerce.android.ui.login.storecreation.dispatcher.PlanUpgradeStartFragment.PlanUpgradeStartSource.BANNER +import com.woocommerce.android.ui.login.storecreation.dispatcher.PlanUpgradeStartFragment.PlanUpgradeStartSource.NOTIFICATION import com.woocommerce.android.ui.login.storecreation.dispatcher.PlanUpgradeStartFragment.PlanUpgradeStartSource.UPGRADES_SCREEN import com.woocommerce.android.ui.plans.domain.SitePlan import com.woocommerce.android.ui.plans.repository.SitePlanRepository @@ -37,6 +39,7 @@ class PlanUpgradeStartViewModel @Inject constructor( KEY_SOURCE to when (navArgs.source) { BANNER -> VALUE_BANNER UPGRADES_SCREEN -> VALUE_UPGRADES_SCREEN + NOTIFICATION -> VALUE_NOTIFICATION } ) From ad0184f7f13cfacaa460c694fd20ab03e83903a2 Mon Sep 17 00:00:00 2001 From: Ondrej Ruttkay Date: Wed, 24 May 2023 21:34:28 +0200 Subject: [PATCH 2/8] Add a new 1-day-before-expiration notification data class --- .../notifications/local/LocalNotification.kt | 28 ++++++++++++------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/notifications/local/LocalNotification.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/notifications/local/LocalNotification.kt index 85ea3b875df3..bbf0844f7a1f 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/notifications/local/LocalNotification.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/notifications/local/LocalNotification.kt @@ -12,12 +12,14 @@ sealed class LocalNotification( val delay: Long, val delayUnit: TimeUnit ) { + open val data: String? = null val id = type.hashCode() - abstract fun getTitleString(resourceProvider: ResourceProvider): String abstract fun getDescriptionString(resourceProvider: ResourceProvider): String - open val data: String? = null + open fun getTitleString(resourceProvider: ResourceProvider): String { + return resourceProvider.getString(title) + } data class StoreCreationFinishedNotification( val name: String @@ -28,10 +30,6 @@ sealed class LocalNotification( delay = 5, delayUnit = TimeUnit.MINUTES ) { - override fun getTitleString(resourceProvider: ResourceProvider): String { - return resourceProvider.getString(title) - } - override fun getDescriptionString(resourceProvider: ResourceProvider): String { return resourceProvider.getString(description, name) } @@ -44,14 +42,24 @@ sealed class LocalNotification( delay = 24, delayUnit = TimeUnit.HOURS ) { - override fun getTitleString(resourceProvider: ResourceProvider): String { - return resourceProvider.getString(title) - } + override val data: String = storeName override fun getDescriptionString(resourceProvider: ResourceProvider): String { return resourceProvider.getString(description, name, storeName) } + } - override val data: String = storeName + data class FreeTrialExpiringNotification(val expiryDate: String, val siteId: Long) : LocalNotification( + title = R.string.local_notification_one_day_before_free_trial_expires_title, + description = R.string.local_notification_one_day_before_free_trial_expires_description, + type = LocalNotificationType.FREE_TRIAL_EXPIRING, + delay = 13, + delayUnit = TimeUnit.SECONDS + ) { + override val data: String = siteId.toString() + + override fun getDescriptionString(resourceProvider: ResourceProvider): String { + return resourceProvider.getString(description, expiryDate) + } } } From 7342a24dfb9b8217aeac901432cc716b8c31af87 Mon Sep 17 00:00:00 2001 From: Ondrej Ruttkay Date: Wed, 24 May 2023 21:35:16 +0200 Subject: [PATCH 3/8] Add a precondition check for the expiring notification --- .../local/LocalNotificationScheduler.kt | 5 ++++- .../local/PreconditionCheckWorker.kt | 16 ++++++++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/notifications/local/LocalNotificationScheduler.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/notifications/local/LocalNotificationScheduler.kt index 5c3073ce907f..aa89ab809fce 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/notifications/local/LocalNotificationScheduler.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/notifications/local/LocalNotificationScheduler.kt @@ -42,7 +42,10 @@ class LocalNotificationScheduler @Inject constructor( } private fun buildPreconditionCheckWorkRequest(notification: LocalNotification): OneTimeWorkRequest { - val conditionData = workDataOf(LOCAL_NOTIFICATION_TYPE to notification.type.value) + val conditionData = workDataOf( + LOCAL_NOTIFICATION_TYPE to notification.type.value, + LOCAL_NOTIFICATION_DATA to notification.data + ) return OneTimeWorkRequestBuilder() .setInputData(conditionData) .addTag(notification.type.value) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/notifications/local/PreconditionCheckWorker.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/notifications/local/PreconditionCheckWorker.kt index 8c19eff46989..aec82b7c2b1b 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/notifications/local/PreconditionCheckWorker.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/notifications/local/PreconditionCheckWorker.kt @@ -7,7 +7,10 @@ import androidx.hilt.work.HiltWorker import androidx.work.WorkManager import androidx.work.Worker import androidx.work.WorkerParameters +import com.woocommerce.android.extensions.isFreeTrial +import com.woocommerce.android.notifications.local.LocalNotificationScheduler.Companion.LOCAL_NOTIFICATION_DATA import com.woocommerce.android.notifications.local.LocalNotificationScheduler.Companion.LOCAL_NOTIFICATION_TYPE +import com.woocommerce.android.tools.SelectedSite import com.woocommerce.android.util.WooLog.T.NOTIFICATIONS import com.woocommerce.android.util.WooLogWrapper import com.woocommerce.android.util.WooPermissionUtils @@ -18,16 +21,25 @@ import dagger.assisted.AssistedInject class PreconditionCheckWorker @AssistedInject constructor( @Assisted private val appContext: Context, @Assisted workerParams: WorkerParameters, - private val wooLogWrapper: WooLogWrapper + private val wooLogWrapper: WooLogWrapper, + private val selectedSite: SelectedSite ) : Worker(appContext, workerParams) { override fun doWork(): Result { val type = inputData.getString(LOCAL_NOTIFICATION_TYPE) + val data = inputData.getString(LOCAL_NOTIFICATION_DATA) return when { !canDisplayNotifications -> cancelWork("Notifications permission not granted. Cancelling work.") type == null -> cancelWork("Notification check data is invalid") type == LocalNotificationType.STORE_CREATION_FINISHED.value -> Result.success() type == LocalNotificationType.STORE_CREATION_INCOMPLETE.value -> Result.success() - type == LocalNotificationType.FREE_TRIAL_EXPIRING.value -> Result.success() + type == LocalNotificationType.FREE_TRIAL_EXPIRING.value -> { + val site = selectedSite.get() + if (site.isFreeTrial && site.siteId == data?.toLongOrNull()) { + Result.success() + } else { + cancelWork("Store plan upgraded or a different site. Cancelling work.") + } + } type == LocalNotificationType.FREE_TRIAL_EXPIRED.value -> Result.success() else -> { cancelWork("Unknown notification $type. Cancelling work.") From 2cd0349b0d2c415f30c8a00ee6f8bdfb2266a7df Mon Sep 17 00:00:00 2001 From: Ondrej Ruttkay Date: Wed, 24 May 2023 21:36:14 +0200 Subject: [PATCH 4/8] Schedule the notification 1 day before trial expiration from store creation --- .../StoreInstallationViewModel.kt | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/storecreation/installation/StoreInstallationViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/storecreation/installation/StoreInstallationViewModel.kt index c30112f8ebcb..b581c2797e54 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/storecreation/installation/StoreInstallationViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/storecreation/installation/StoreInstallationViewModel.kt @@ -10,6 +10,8 @@ import com.woocommerce.android.R.string import com.woocommerce.android.analytics.AnalyticsEvent import com.woocommerce.android.analytics.AnalyticsTracker import com.woocommerce.android.analytics.AnalyticsTrackerWrapper +import com.woocommerce.android.notifications.local.LocalNotification.FreeTrialExpiringNotification +import com.woocommerce.android.notifications.local.LocalNotificationScheduler import com.woocommerce.android.tools.SelectedSite import com.woocommerce.android.ui.login.storecreation.NewStore import com.woocommerce.android.ui.login.storecreation.StoreCreationErrorType @@ -18,7 +20,10 @@ import com.woocommerce.android.ui.login.storecreation.installation.ObserveSiteIn import com.woocommerce.android.ui.login.storecreation.installation.StoreInstallationViewModel.ViewState.ErrorState import com.woocommerce.android.ui.login.storecreation.installation.StoreInstallationViewModel.ViewState.StoreCreationLoadingState import com.woocommerce.android.ui.login.storecreation.installation.StoreInstallationViewModel.ViewState.SuccessState +import com.woocommerce.android.util.DateUtils import com.woocommerce.android.util.FeatureFlag +import com.woocommerce.android.util.IsRemoteFeatureFlagEnabled +import com.woocommerce.android.util.RemoteFeatureFlag.LOCAL_NOTIFICATION_1D_BEFORE_FREE_TRIAL_EXPIRES import com.woocommerce.android.viewmodel.MultiLiveEvent.Event import com.woocommerce.android.viewmodel.MultiLiveEvent.Event.Exit import com.woocommerce.android.viewmodel.ScopedViewModel @@ -32,6 +37,8 @@ import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import kotlinx.parcelize.Parcelize import org.wordpress.android.fluxc.utils.extensions.slashJoin +import java.time.LocalDateTime +import java.time.format.DateTimeFormatter import javax.inject.Inject @HiltViewModel @@ -45,6 +52,8 @@ class StoreInstallationViewModel @Inject constructor( private val storeInstallationLoadingTimer: StoreInstallationLoadingTimer, private val installationTransactionLauncher: InstallationTransactionLauncher, private val observeSiteInstallation: ObserveSiteInstallation, + private val localNotificationScheduler: LocalNotificationScheduler, + private val isRemoteFeatureFlagEnabled: IsRemoteFeatureFlagEnabled ) : ScopedViewModel(savedStateHandle) { private val newStoreUrl @@ -97,6 +106,8 @@ class StoreInstallationViewModel @Inject constructor( installationTransactionLauncher.onStoreInstalled(properties) _viewState.update { SuccessState(newStoreWpAdminUrl) } + + scheduleDeferredNotifications() } is InstallationState.Failure -> { @@ -128,6 +139,17 @@ class StoreInstallationViewModel @Inject constructor( } } + private fun scheduleDeferredNotifications() { + if (isRemoteFeatureFlagEnabled(LOCAL_NOTIFICATION_1D_BEFORE_FREE_TRIAL_EXPIRES)) { + val in14days = LocalDateTime.now() + .plusDays(14) + .format(DateTimeFormatter.ofPattern("EEEE, MMMM d")) + localNotificationScheduler.scheduleNotification( + FreeTrialExpiringNotification(in14days, selectedSite.get().siteId) + ) + } + } + private fun loadNewStore() { launch { combine( From 9367c97ebcbb858fab30f16cb2c6819ae57a4bc0 Mon Sep 17 00:00:00 2001 From: Ondrej Ruttkay Date: Wed, 24 May 2023 21:36:47 +0200 Subject: [PATCH 5/8] Trigger the store plan upgrade on notification tap --- .../com/woocommerce/android/ui/main/MainActivity.kt | 2 ++ .../android/ui/main/MainActivityViewModel.kt | 12 ++++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/main/MainActivity.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/main/MainActivity.kt index c11b9d346456..4a0bf3001592 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/main/MainActivity.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/main/MainActivity.kt @@ -86,6 +86,7 @@ import com.woocommerce.android.ui.main.MainActivityViewModel.ViewOrderList import com.woocommerce.android.ui.main.MainActivityViewModel.ViewPayments import com.woocommerce.android.ui.main.MainActivityViewModel.ViewReviewDetail import com.woocommerce.android.ui.main.MainActivityViewModel.ViewReviewList +import com.woocommerce.android.ui.main.MainActivityViewModel.ViewStorePlanUpgrade import com.woocommerce.android.ui.main.MainActivityViewModel.ViewTapToPay import com.woocommerce.android.ui.main.MainActivityViewModel.ViewUrlInWebView import com.woocommerce.android.ui.main.MainActivityViewModel.ViewZendeskTickets @@ -742,6 +743,7 @@ class MainActivity : is ViewUrlInWebView -> navigateToWebView(event) is RequestNotificationsPermission -> requestNotificationsPermission() is ShortcutOpenStoreCreation -> shortcutOpenStoreCreation(event.storeName) + is ViewStorePlanUpgrade -> startUpgradeFlowFactory.create(navController).invoke(event.source) ViewPayments -> showPayments() ViewTapToPay -> showTapToPaySummary() ShortcutOpenPayments -> shortcutShowPayments() diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/main/MainActivityViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/main/MainActivityViewModel.kt index a8bfa168dee3..7d1eb59faa5b 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/main/MainActivityViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/main/MainActivityViewModel.kt @@ -21,6 +21,8 @@ import com.woocommerce.android.notifications.push.NotificationMessageHandler import com.woocommerce.android.tools.SelectedSite import com.woocommerce.android.tools.SiteConnectionType.Jetpack import com.woocommerce.android.tools.connectionType +import com.woocommerce.android.ui.login.storecreation.dispatcher.PlanUpgradeStartFragment.PlanUpgradeStartSource +import com.woocommerce.android.ui.login.storecreation.dispatcher.PlanUpgradeStartFragment.PlanUpgradeStartSource.NOTIFICATION import com.woocommerce.android.ui.main.MainActivityViewModel.MoreMenuBadgeState.Hidden import com.woocommerce.android.ui.main.MainActivityViewModel.MoreMenuBadgeState.NewFeature import com.woocommerce.android.ui.main.MainActivityViewModel.MoreMenuBadgeState.UnseenReviews @@ -251,8 +253,13 @@ class MainActivityViewModel @Inject constructor( mapOf(AnalyticsTracker.KEY_TYPE to notification.tag) ) - if (notification.tag == LocalNotificationType.STORE_CREATION_INCOMPLETE.value) { - triggerEvent(ShortcutOpenStoreCreation(storeName = notification.data)) + when (notification.tag) { + LocalNotificationType.STORE_CREATION_INCOMPLETE.value -> { + triggerEvent(ShortcutOpenStoreCreation(storeName = notification.data)) + } + LocalNotificationType.FREE_TRIAL_EXPIRING.value -> { + triggerEvent(ViewStorePlanUpgrade(NOTIFICATION)) + } } } @@ -267,6 +274,7 @@ class MainActivityViewModel @Inject constructor( object ShortcutOpenPayments : Event() object ShortcutOpenOrderCreation : Event() data class ShortcutOpenStoreCreation(val storeName: String?) : Event() + data class ViewStorePlanUpgrade(val source: PlanUpgradeStartSource) : Event() data class RestartActivityForNotification(val pushId: Int, val notification: Notification) : Event() data class RestartActivityForAppLink(val data: Uri) : Event() data class ShowFeatureAnnouncement(val announcement: FeatureAnnouncement) : Event() From f7df6833164a5de1a26b22f7561a0154c18bd440 Mon Sep 17 00:00:00 2001 From: Ondrej Ruttkay Date: Wed, 24 May 2023 21:40:04 +0200 Subject: [PATCH 6/8] Fix ktlint issues --- .../installation/StoreInstallationViewModel.kt | 7 +++++-- .../name/StoreNamePickerViewModelTest.kt | 11 ----------- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/storecreation/installation/StoreInstallationViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/storecreation/installation/StoreInstallationViewModel.kt index b581c2797e54..ac83e0785c46 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/storecreation/installation/StoreInstallationViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/storecreation/installation/StoreInstallationViewModel.kt @@ -20,7 +20,6 @@ import com.woocommerce.android.ui.login.storecreation.installation.ObserveSiteIn import com.woocommerce.android.ui.login.storecreation.installation.StoreInstallationViewModel.ViewState.ErrorState import com.woocommerce.android.ui.login.storecreation.installation.StoreInstallationViewModel.ViewState.StoreCreationLoadingState import com.woocommerce.android.ui.login.storecreation.installation.StoreInstallationViewModel.ViewState.SuccessState -import com.woocommerce.android.util.DateUtils import com.woocommerce.android.util.FeatureFlag import com.woocommerce.android.util.IsRemoteFeatureFlagEnabled import com.woocommerce.android.util.RemoteFeatureFlag.LOCAL_NOTIFICATION_1D_BEFORE_FREE_TRIAL_EXPIRES @@ -56,6 +55,10 @@ class StoreInstallationViewModel @Inject constructor( private val isRemoteFeatureFlagEnabled: IsRemoteFeatureFlagEnabled ) : ScopedViewModel(savedStateHandle) { + companion object { + const val TRIAL_LENGTH_IN_DAYS = 14L + } + private val newStoreUrl get() = selectedSite.get().url @@ -142,7 +145,7 @@ class StoreInstallationViewModel @Inject constructor( private fun scheduleDeferredNotifications() { if (isRemoteFeatureFlagEnabled(LOCAL_NOTIFICATION_1D_BEFORE_FREE_TRIAL_EXPIRES)) { val in14days = LocalDateTime.now() - .plusDays(14) + .plusDays(TRIAL_LENGTH_IN_DAYS) .format(DateTimeFormatter.ofPattern("EEEE, MMMM d")) localNotificationScheduler.scheduleNotification( FreeTrialExpiringNotification(in14days, selectedSite.get().siteId) diff --git a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/login/storecreation/name/StoreNamePickerViewModelTest.kt b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/login/storecreation/name/StoreNamePickerViewModelTest.kt index 5b7a16aa64e0..4a13b68ddeac 100644 --- a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/login/storecreation/name/StoreNamePickerViewModelTest.kt +++ b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/login/storecreation/name/StoreNamePickerViewModelTest.kt @@ -19,8 +19,6 @@ import org.junit.Test import org.mockito.kotlin.doReturn import org.mockito.kotlin.mock import org.mockito.kotlin.verify -import org.mockito.kotlin.whenever -import org.wordpress.android.fluxc.model.AccountModel import org.wordpress.android.fluxc.store.AccountStore @OptIn(ExperimentalCoroutinesApi::class) @@ -142,13 +140,4 @@ internal class StoreNamePickerViewModelTest : BaseUnitTest() { // Then assertThat(latestEvent).isEqualTo(MultiLiveEvent.Event.NavigateToHelpScreen(HelpOrigin.STORE_CREATION)) } - - - companion object { - val TEST_ACCOUNT = AccountModel().apply { - userId = 123L - email = "mail@a8c.com" - userName = "username" - } - } } From f72e8443e3b10b4482f14cdc24f9fc780fe82309 Mon Sep 17 00:00:00 2001 From: Ondrej Ruttkay Date: Wed, 24 May 2023 21:43:10 +0200 Subject: [PATCH 7/8] Fix the notification delay unit to days --- .../android/notifications/local/LocalNotification.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/notifications/local/LocalNotification.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/notifications/local/LocalNotification.kt index bbf0844f7a1f..575f61583794 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/notifications/local/LocalNotification.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/notifications/local/LocalNotification.kt @@ -54,7 +54,7 @@ sealed class LocalNotification( description = R.string.local_notification_one_day_before_free_trial_expires_description, type = LocalNotificationType.FREE_TRIAL_EXPIRING, delay = 13, - delayUnit = TimeUnit.SECONDS + delayUnit = TimeUnit.DAYS ) { override val data: String = siteId.toString() From edd6326e8471b9d8a6af753f063a914d820ba255 Mon Sep 17 00:00:00 2001 From: Ondrej Ruttkay Date: Thu, 25 May 2023 11:27:08 +0200 Subject: [PATCH 8/8] Fix the broken test --- .../login/storecreation/StoreInstallationViewModelTest.kt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/login/storecreation/StoreInstallationViewModelTest.kt b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/login/storecreation/StoreInstallationViewModelTest.kt index acf1f2a10c9e..73e256408db8 100644 --- a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/login/storecreation/StoreInstallationViewModelTest.kt +++ b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/login/storecreation/StoreInstallationViewModelTest.kt @@ -6,6 +6,7 @@ import com.woocommerce.android.R.string import com.woocommerce.android.analytics.AnalyticsEvent import com.woocommerce.android.analytics.AnalyticsTracker import com.woocommerce.android.analytics.AnalyticsTrackerWrapper +import com.woocommerce.android.notifications.local.LocalNotificationScheduler import com.woocommerce.android.tools.SelectedSite import com.woocommerce.android.ui.login.storecreation.StoreCreationErrorType.STORE_LOADING_FAILED import com.woocommerce.android.ui.login.storecreation.StoreCreationErrorType.STORE_NOT_READY @@ -18,6 +19,7 @@ import com.woocommerce.android.ui.login.storecreation.installation.StoreInstalla import com.woocommerce.android.ui.login.storecreation.installation.StoreInstallationViewModel.ViewState.StoreCreationLoadingState import com.woocommerce.android.ui.login.storecreation.installation.StoreInstallationViewModel.ViewState.SuccessState import com.woocommerce.android.util.FeatureFlag +import com.woocommerce.android.util.IsRemoteFeatureFlagEnabled import com.woocommerce.android.viewmodel.BaseUnitTest import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.MutableSharedFlow @@ -44,6 +46,8 @@ class StoreInstallationViewModelTest : BaseUnitTest() { private val storeInstallationLoadingTimer: StoreInstallationLoadingTimer = mock() private val installationTransactionLauncher: InstallationTransactionLauncher = mock() private val observeSiteInstallation: ObserveSiteInstallation = mock() + private val localNotificationScheduler: LocalNotificationScheduler = mock() + private val isRemoteFeatureFlagEnabled: IsRemoteFeatureFlagEnabled = mock() private lateinit var viewModel: StoreInstallationViewModel @@ -66,7 +70,9 @@ class StoreInstallationViewModelTest : BaseUnitTest() { selectedSite, storeInstallationLoadingTimer, installationTransactionLauncher, - observeSiteInstallation + observeSiteInstallation, + localNotificationScheduler, + isRemoteFeatureFlagEnabled ) viewModel.viewState.observeForever {} }