diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/AppPrefs.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/AppPrefs.kt index fb2fe7a004c0..78ad5b7f9b06 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/AppPrefs.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/AppPrefs.kt @@ -138,7 +138,8 @@ object AppPrefs { IS_SITE_WPCOM_SUSPENDED, JETPACK_APP_PASSWORDS_ENABLED, WOO_POS_LOCAL_CATALOG_ENABLED, - CLIENT_SIDE_BANNER_HIDDEN + CLIENT_SIDE_BANNER_HIDDEN, + WOO_CORE_PUSH_DEVICE_UUID } /** @@ -325,6 +326,10 @@ object AppPrefs { get() = getBoolean(UndeletablePrefKey.WOO_POS_SURVEY_NOTIFICATION_POTENTIAL_USER_SHOWN, false) set(value) = setBoolean(UndeletablePrefKey.WOO_POS_SURVEY_NOTIFICATION_POTENTIAL_USER_SHOWN, value) + var wooCorePushDeviceUUID: String + get() = getString(DeletablePrefKey.WOO_CORE_PUSH_DEVICE_UUID, "") + set(value) = setString(DeletablePrefKey.WOO_CORE_PUSH_DEVICE_UUID, value) + fun getProductSortingChoice(currentSiteId: Int) = getString(getProductSortingKey(currentSiteId)).orNullIfEmpty() fun setProductSortingChoice(currentSiteId: Int, value: String) { diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/AppPrefsWrapper.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/AppPrefsWrapper.kt index 7a3bdb216d3e..c72cf0b21260 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/AppPrefsWrapper.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/AppPrefsWrapper.kt @@ -48,6 +48,8 @@ open class AppPrefsWrapper @Inject constructor() { var jetpackAppPasswordsEnabled by AppPrefs::jetpackAppPasswordsEnabled + var wooCorePushDeviceUUID by AppPrefs::wooCorePushDeviceUUID + fun getAppInstallationDate() = AppPrefs.installationDate fun getReceiptUrl(localSiteId: Int, remoteSiteId: Long, selfHostedSiteId: Long, orderId: Long) = diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/notifications/push/PushNotificationRepository.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/notifications/push/PushNotificationRepository.kt new file mode 100644 index 000000000000..47a81da7d195 --- /dev/null +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/notifications/push/PushNotificationRepository.kt @@ -0,0 +1,38 @@ +package com.woocommerce.android.notifications.push + +import com.woocommerce.android.AppPrefsWrapper +import com.woocommerce.android.BuildConfig +import com.woocommerce.android.extensions.orNullIfEmpty +import com.woocommerce.android.tools.SelectedSite +import com.woocommerce.android.util.WooLog +import org.wordpress.android.fluxc.network.rest.wpcom.wc.pushnotifications.PushNotificationsStore +import java.util.UUID +import javax.inject.Inject + +class PushNotificationRepository @Inject constructor( + private val pushNotificationsStore: PushNotificationsStore, + private val selectedSite: SelectedSite, + private val appPrefsWrapper: AppPrefsWrapper +) { + suspend fun registerPushToken(token: String) { + WooLog.d( + tag = WooLog.T.NOTIFS, + message = "Registering FCM token in Woo Core instance${if (BuildConfig.DEBUG) ": $token" else ""}" + ) + selectedSite.getIfExists()?.let { + val uuid = appPrefsWrapper.wooCorePushDeviceUUID.orNullIfEmpty() ?: generateAndStoreUUID() + pushNotificationsStore.registerPushToken( + site = it, + token = token, + deviceUuid = uuid + ) + // TODO ensure any WP.com token already registered is removed + } ?: run { WooLog.w(WooLog.T.NOTIFS, "No selected site, skipping PN registration") } + } + + private fun generateAndStoreUUID(): String { + return UUID.randomUUID().toString().also { + appPrefsWrapper.wooCorePushDeviceUUID = it + } + } +} diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/notifications/push/RegisterDevice.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/notifications/push/RegisterDevice.kt index 940be6bb8c84..83374d29556f 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/notifications/push/RegisterDevice.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/notifications/push/RegisterDevice.kt @@ -4,6 +4,7 @@ import com.woocommerce.android.AppPrefsWrapper import com.woocommerce.android.BuildConfig import com.woocommerce.android.notifications.push.RegisterDevice.Mode.FORCEFULLY import com.woocommerce.android.notifications.push.RegisterDevice.Mode.IF_NEEDED +import com.woocommerce.android.util.FeatureFlag import com.woocommerce.android.util.WooLog import org.wordpress.android.fluxc.store.AccountStore import org.wordpress.android.fluxc.store.GetDeviceRegistrationStatus @@ -14,6 +15,7 @@ class RegisterDevice @Inject constructor( private val accountStore: AccountStore, private val notificationRepository: NotificationRepository, private val getDeviceRegistrationStatus: GetDeviceRegistrationStatus, + private val pushNotificationRepository: PushNotificationRepository ) { suspend operator fun invoke(mode: Mode) { when (mode) { @@ -22,6 +24,7 @@ class RegisterDevice @Inject constructor( sendToken() } } + FORCEFULLY -> sendToken() } @@ -33,8 +36,12 @@ class RegisterDevice @Inject constructor( private suspend fun sendToken() { val token = appPrefsWrapper.getFCMToken() - if (accountStore.hasAccessToken() && token.isNotEmpty()) { - notificationRepository.registerDevice(token) + if (token.isNotEmpty()) { + if (FeatureFlag.WOO_PUSH_NOTIFICATIONS_SYSTEM.isEnabled()) { + pushNotificationRepository.registerPushToken(token) + } else if (accountStore.hasAccessToken()) { + notificationRepository.registerDevice(token) + } } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/util/FeatureFlag.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/util/FeatureFlag.kt index 16d7f1dc0547..d6df880b47a2 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/util/FeatureFlag.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/util/FeatureFlag.kt @@ -14,6 +14,7 @@ enum class FeatureFlag { CLIENT_SIDE_POS_BANNER, POS_REFUNDS, WOO_POS_LOCAL_CATALOG_FILE_APPROACH, + WOO_PUSH_NOTIFICATIONS_SYSTEM, WOO_POS_PRODUCT_VISIBILITY_FILTERING; fun isEnabled(context: Context? = null): Boolean { @@ -30,7 +31,8 @@ enum class FeatureFlag { POS_REFUNDS, WOO_POS_PRODUCT_VISIBILITY_FILTERING -> PackageUtils.isDebugBuild() - WOO_POS_LOCAL_CATALOG_FILE_APPROACH -> false + WOO_POS_LOCAL_CATALOG_FILE_APPROACH, + WOO_PUSH_NOTIFICATIONS_SYSTEM -> false } } } diff --git a/WooCommerce/src/test/kotlin/com/woocommerce/android/notifications/push/RegisterDeviceTest.kt b/WooCommerce/src/test/kotlin/com/woocommerce/android/notifications/push/RegisterDeviceTest.kt index a3b913deaae1..6f8e59fa305e 100644 --- a/WooCommerce/src/test/kotlin/com/woocommerce/android/notifications/push/RegisterDeviceTest.kt +++ b/WooCommerce/src/test/kotlin/com/woocommerce/android/notifications/push/RegisterDeviceTest.kt @@ -31,11 +31,16 @@ class RegisterDeviceTest : BaseUnitTest() { private val getDeviceRegistrationStatus: GetDeviceRegistrationStatus = mock { on { invoke() } doReturn UNREGISTERED } + private val pushNotificationRepository: PushNotificationRepository = mock() @Before fun setUp() { sut = RegisterDevice( - appPrefs, accountStore, notificationRepository, getDeviceRegistrationStatus + appPrefs, + accountStore, + notificationRepository, + getDeviceRegistrationStatus, + pushNotificationRepository ) }