diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/connect/CardReaderConnectViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/connect/CardReaderConnectViewModel.kt index 91e063f6863..f34f316f5d2 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/connect/CardReaderConnectViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/connect/CardReaderConnectViewModel.kt @@ -73,6 +73,7 @@ import com.woocommerce.android.util.CoroutineDispatchers import com.woocommerce.android.util.WooLog import com.woocommerce.android.viewmodel.MultiLiveEvent.Event import com.woocommerce.android.viewmodel.MultiLiveEvent.Event.ExitWithResult +import com.woocommerce.android.viewmodel.ResourceProvider import com.woocommerce.android.viewmodel.ScopedViewModel import com.woocommerce.android.viewmodel.SingleLiveEvent import com.woocommerce.android.viewmodel.navArgs @@ -96,6 +97,7 @@ class CardReaderConnectViewModel @Inject constructor( private val cardReaderTrackingInfoKeeper: CardReaderTrackingInfoKeeper, private val cardReaderOnboardingChecker: CardReaderOnboardingChecker, private val learnMoreUrlProvider: LearnMoreUrlProvider, + private val resourceProvider: ResourceProvider, ) : ScopedViewModel(savedState) { private val arguments: CardReaderConnectDialogFragmentArgs by savedState.navArgs() private val tracker: PaymentsFlowTracker = when (arguments.cardReaderFlowParam) { @@ -254,6 +256,14 @@ class CardReaderConnectViewModel @Inject constructor( BuildConfig.DEBUG, ) } + cardReaderManager.setupTapToPayUx( + CardReaderManager.TapToPayUxConfig( + primaryColor = R.color.color_primary, + successColor = R.color.woo_green_50, + errorColor = R.color.color_error, + isDarkMode = resourceProvider.isDarkMode(), + ) + ) launch { startScanningIfNotStarted() } @@ -367,7 +377,9 @@ class CardReaderConnectViewModel @Inject constructor( viewState.value = provideScanningState() } else { when (arguments.cardReaderType) { - BUILT_IN -> connectToReader(availableReaders[0]) + BUILT_IN -> { + connectToReader(availableReaders[0]) + } EXTERNAL -> viewState.value = when (availableReaders.size) { 1 -> buildSingleExternalReaderFoundState(availableReaders[0]) else -> buildMultipleExternalReadersFoundState(availableReaders) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/viewmodel/ResourceProvider.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/viewmodel/ResourceProvider.kt index 1755e4a8269..b316080f2fa 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/viewmodel/ResourceProvider.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/viewmodel/ResourceProvider.kt @@ -1,14 +1,13 @@ package com.woocommerce.android.viewmodel import android.content.Context +import android.content.res.Configuration import androidx.annotation.ArrayRes import androidx.annotation.ColorRes import androidx.annotation.DimenRes -import androidx.annotation.RawRes import androidx.annotation.StringRes import androidx.core.content.ContextCompat import com.woocommerce.android.util.StringUtils -import java.io.InputStream import javax.inject.Inject class ResourceProvider @Inject constructor(private val context: Context) { @@ -33,11 +32,6 @@ class ResourceProvider @Inject constructor(private val context: Context) { return resources.getDimensionPixelSize(dimen) } - fun openRawResource(@RawRes rawId: Int): InputStream { - val resources = context.resources - return resources.openRawResource(rawId) - } - fun getQuantityString( quantity: Int, @StringRes default: Int, @@ -51,12 +45,6 @@ class ResourceProvider @Inject constructor(private val context: Context) { one, ) - @StringRes - fun getStringResFromStringName(stringName: String): Int? { - val stringRes = context.resources.getIdentifier(stringName, "string", context.packageName) - return when (stringRes) { - 0 -> null // String not found for given key, return null so it can be handled from calling function - else -> stringRes - } - } + fun isDarkMode() = context.resources.configuration.uiMode and + Configuration.UI_MODE_NIGHT_MASK == Configuration.UI_MODE_NIGHT_YES } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8a65f6b9d20..577816be38c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -92,7 +92,7 @@ sentry = '4.10.0' squareup-javapoet = "1.7.0" squareup-leakcanary = '2.14' squareup-okhttp3 = "4.9.0" -stripe-terminal = '3.7.1' +stripe-terminal = '3.10.2' terl-lazysodium-android = '5.0.2@aar' tinder-statemachine = '0.2.0' volley = "1.1.1" diff --git a/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/CardReaderManager.kt b/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/CardReaderManager.kt index bddf554af87..4826971101e 100644 --- a/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/CardReaderManager.kt +++ b/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/CardReaderManager.kt @@ -1,5 +1,6 @@ package com.woocommerce.android.cardreader +import androidx.annotation.ColorRes import com.woocommerce.android.cardreader.connection.CardReader import com.woocommerce.android.cardreader.connection.CardReaderDiscoveryEvents import com.woocommerce.android.cardreader.connection.CardReaderStatus @@ -42,6 +43,8 @@ interface CardReaderManager { cardReaderTypesToDiscover: CardReaderTypesToDiscover, ): Flow + fun setupTapToPayUx(config: TapToPayUxConfig) + fun startConnectionToReader(cardReader: CardReader, locationId: String) suspend fun disconnectReader(): Boolean @@ -65,4 +68,11 @@ interface CardReaderManager { LOW_BATTERY_SUCCEED_CONNECT, RANDOM } + + data class TapToPayUxConfig( + @ColorRes val primaryColor: Int, + @ColorRes val successColor: Int, + @ColorRes val errorColor: Int, + val isDarkMode: Boolean, + ) } diff --git a/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/CardReaderManagerImpl.kt b/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/CardReaderManagerImpl.kt index b0918d6ab6f..6b7bfe9efb5 100644 --- a/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/CardReaderManagerImpl.kt +++ b/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/CardReaderManagerImpl.kt @@ -88,6 +88,10 @@ internal class CardReaderManagerImpl( return connectionManager.discoverReaders(isSimulated, cardReaderTypesToDiscover) } + override fun setupTapToPayUx(config: CardReaderManager.TapToPayUxConfig) { + connectionManager.setupTapToPayUx(config) + } + override fun startConnectionToReader(cardReader: CardReader, locationId: String) { if (!terminal.isInitialized()) error("Terminal not initialized") connectionManager.startConnectionToReader(cardReader, locationId) diff --git a/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/connection/ConnectionManager.kt b/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/connection/ConnectionManager.kt index 5cb456679ad..06a3e3cdc5e 100644 --- a/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/connection/ConnectionManager.kt +++ b/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/connection/ConnectionManager.kt @@ -11,6 +11,7 @@ import com.stripe.stripeterminal.external.models.ConnectionConfiguration.LocalMo import com.stripe.stripeterminal.external.models.DeviceType import com.stripe.stripeterminal.external.models.Reader import com.stripe.stripeterminal.external.models.TerminalException +import com.woocommerce.android.cardreader.CardReaderManager import com.woocommerce.android.cardreader.connection.CardReader import com.woocommerce.android.cardreader.connection.CardReaderDiscoveryEvents import com.woocommerce.android.cardreader.connection.CardReaderImpl @@ -192,6 +193,10 @@ internal class ConnectionManager( startStateResettingJobIfNeeded(status) } + fun setupTapToPayUx(config: CardReaderManager.TapToPayUxConfig) { + terminal.setupTapToPayUx(config) + } + private fun connectToExternalReader( cardReader: CardReaderImpl, locationId: String, diff --git a/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/wrappers/TerminalWrapper.kt b/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/wrappers/TerminalWrapper.kt index 96c138f7a70..256ebf6d93b 100644 --- a/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/wrappers/TerminalWrapper.kt +++ b/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/wrappers/TerminalWrapper.kt @@ -14,6 +14,8 @@ import com.stripe.stripeterminal.external.callable.RefundCallback import com.stripe.stripeterminal.external.callable.TerminalListener import com.stripe.stripeterminal.external.models.ConnectionConfiguration import com.stripe.stripeterminal.external.models.DiscoveryConfiguration +import com.stripe.stripeterminal.external.models.LocalMobileUxConfiguration +import com.stripe.stripeterminal.external.models.LocalMobileUxConfiguration.Color import com.stripe.stripeterminal.external.models.PaymentIntent import com.stripe.stripeterminal.external.models.PaymentIntentParameters import com.stripe.stripeterminal.external.models.Reader @@ -113,7 +115,35 @@ internal class TerminalWrapper { CardReaderManager.SimulatorUpdateFrequency.LOW_BATTERY_SUCCEED_CONNECT -> { SimulateReaderUpdate.LOW_BATTERY_SUCCEED_CONNECT } + CardReaderManager.SimulatorUpdateFrequency.RANDOM -> SimulateReaderUpdate.RANDOM } } + + fun setupTapToPayUx(config: CardReaderManager.TapToPayUxConfig) { + val uxConfig = LocalMobileUxConfiguration.Builder() + .tapZone( + LocalMobileUxConfiguration.TapZone.Manual.Builder() + .indicator(LocalMobileUxConfiguration.TapZoneIndicator.DEFAULT) + .position(LocalMobileUxConfiguration.TapZonePosition.Default) + .build() + ) + .colors( + LocalMobileUxConfiguration.ColorScheme.Builder() + .primary(Color.Resource(config.primaryColor)) + .success(Color.Resource(config.successColor)) + .error(Color.Resource(config.errorColor)) + .build() + ) + .darkMode( + if (config.isDarkMode) { + LocalMobileUxConfiguration.DarkMode.DARK + } else { + LocalMobileUxConfiguration.DarkMode.LIGHT + } + ) + .build() + + Terminal.getInstance().setLocalMobileUxConfiguration(uxConfig) + } }