From 415f42f1116f6a32de7df92ba5d36232bbf8fca8 Mon Sep 17 00:00:00 2001 From: Andrey Date: Mon, 27 May 2024 08:40:41 +0200 Subject: [PATCH 01/33] Attempt to open acitvity with card reader --- WooCommerce/src/main/AndroidManifest.xml | 1 + .../cardreader/WooPosCardReaderActivity.kt | 28 +++++++++++++++++++ .../ui/woopos/cart/WooPosCartNavigation.kt | 6 ++-- .../ui/woopos/cart/WooPosCartScreen.kt | 22 ++++++++++++--- .../root/navigation/WooPosMainFlowGraph.kt | 8 +++++- .../layout/activity_woo_pos_card_reader.xml | 11 ++++++++ 6 files changed, 69 insertions(+), 7 deletions(-) create mode 100644 WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt create mode 100644 WooCommerce/src/main/res/layout/activity_woo_pos_card_reader.xml diff --git a/WooCommerce/src/main/AndroidManifest.xml b/WooCommerce/src/main/AndroidManifest.xml index 366945a42b1..5c1fafbabed 100644 --- a/WooCommerce/src/main/AndroidManifest.xml +++ b/WooCommerce/src/main/AndroidManifest.xml @@ -163,6 +163,7 @@ + Unit + onCheckoutClick: () -> Unit, + onConnectToCardReaderClicked: () -> Unit ) { composable(CART_ROUTE) { val viewModel: WooPosCartViewModel = hiltViewModel() WooPosCartScreen( viewModel = viewModel, - onCheckoutClick = onCheckoutClick + onCheckoutClick = onCheckoutClick, + onConnectToCardReaderClicked = onConnectToCardReaderClicked ) } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cart/WooPosCartScreen.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cart/WooPosCartScreen.kt index 7080802376b..ba92031efc7 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cart/WooPosCartScreen.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cart/WooPosCartScreen.kt @@ -2,13 +2,16 @@ package com.woocommerce.android.ui.woopos.cart import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.height import androidx.compose.material.Button import androidx.compose.material.MaterialTheme import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp import com.woocommerce.android.ui.woopos.util.WooPosPreview @Composable @@ -16,14 +19,19 @@ import com.woocommerce.android.ui.woopos.util.WooPosPreview fun WooPosCartScreen( viewModel: WooPosCartViewModel, onCheckoutClick: () -> Unit, + onConnectToCardReaderClicked: () -> Unit ) { WooPosCartScreen( - onButtonClicked = onCheckoutClick + onCheckoutClick = onCheckoutClick, + onConnectToCardReaderClicked = onConnectToCardReaderClicked, ) } @Composable -private fun WooPosCartScreen(onButtonClicked: () -> Unit) { +private fun WooPosCartScreen( + onCheckoutClick: () -> Unit, + onConnectToCardReaderClicked: () -> Unit, +) { Box( Modifier.fillMaxSize(), contentAlignment = Alignment.Center @@ -34,9 +42,15 @@ private fun WooPosCartScreen(onButtonClicked: () -> Unit) { style = MaterialTheme.typography.h3, color = MaterialTheme.colors.primary, ) - Button(onClick = onButtonClicked) { + Button(onClick = onCheckoutClick) { Text("Checkout") } + + Spacer(modifier = Modifier.height(16.dp)) + + Button(onClick = onConnectToCardReaderClicked) { + Text("Connect to Card Reader") + } } } } @@ -44,5 +58,5 @@ private fun WooPosCartScreen(onButtonClicked: () -> Unit) { @Composable @WooPosPreview fun WooPosCartScreenPreview() { - WooPosCartScreen(onButtonClicked = {}) + WooPosCartScreen(onCheckoutClick = {}, onConnectToCardReaderClicked = {}) } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/navigation/WooPosMainFlowGraph.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/navigation/WooPosMainFlowGraph.kt index cd600a29857..9f0dccaece2 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/navigation/WooPosMainFlowGraph.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/navigation/WooPosMainFlowGraph.kt @@ -1,8 +1,10 @@ package com.woocommerce.android.ui.woopos.root.navigation +import android.content.Intent import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.compose.navigation +import com.woocommerce.android.ui.woopos.cardreader.WooPosCardReaderActivity import com.woocommerce.android.ui.woopos.cart.CART_ROUTE import com.woocommerce.android.ui.woopos.cart.cartScreen import com.woocommerce.android.ui.woopos.checkout.checkoutScreen @@ -18,7 +20,11 @@ fun NavGraphBuilder.checkoutGraph( route = MAIN_GRAPH_ROUTE, ) { cartScreen( - onCheckoutClick = navController::navigateToCheckoutScreen + onCheckoutClick = navController::navigateToCheckoutScreen, + onConnectToCardReaderClicked = { + val intent = Intent(navController.context, WooPosCardReaderActivity::class.java) + navController.context.startActivity(intent) + } ) checkoutScreen( onBackClick = navController::popBackStack diff --git a/WooCommerce/src/main/res/layout/activity_woo_pos_card_reader.xml b/WooCommerce/src/main/res/layout/activity_woo_pos_card_reader.xml new file mode 100644 index 00000000000..e039d394a4b --- /dev/null +++ b/WooCommerce/src/main/res/layout/activity_woo_pos_card_reader.xml @@ -0,0 +1,11 @@ + From a9f776b05dfe2c4316cd03444c820b7e4cd6500e Mon Sep 17 00:00:00 2001 From: samiuelson Date: Mon, 27 May 2024 16:30:16 +0200 Subject: [PATCH 02/33] Add redirect to card reader tutorial --- .../cardreader/WooPosCardReaderActivity.kt | 100 +++++++++++++++--- .../woopos/payment/WooPosPaymentNavigation.kt | 1 + .../ui/woopos/payment/WooPosPaymentScreen.kt | 1 + .../layout/activity_woo_pos_card_reader.xml | 10 +- 4 files changed, 92 insertions(+), 20 deletions(-) create mode 100644 WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/payment/WooPosPaymentNavigation.kt create mode 100644 WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/payment/WooPosPaymentScreen.kt diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt index 0590c9e6178..4870ea6fefd 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt @@ -1,28 +1,102 @@ package com.woocommerce.android.ui.woopos.cardreader import android.os.Bundle +import android.util.Log +import android.view.View import androidx.appcompat.app.AppCompatActivity -import androidx.navigation.findNavController +import androidx.lifecycle.lifecycleScope +import androidx.navigation.fragment.NavHostFragment +import com.google.android.material.snackbar.Snackbar import com.woocommerce.android.R -import com.woocommerce.android.ui.moremenu.MoreMenuFragmentDirections +import com.woocommerce.android.cardreader.config.CardReaderConfigForSupportedCountry +import com.woocommerce.android.tools.SelectedSite +import com.woocommerce.android.ui.orders.creation.OrderCreateEditRepository +import com.woocommerce.android.ui.payments.cardreader.CardReaderCountryConfigProvider import com.woocommerce.android.ui.payments.cardreader.onboarding.CardReaderFlowParam +import com.woocommerce.android.ui.payments.cardreader.onboarding.CardReaderType +import com.woocommerce.android.viewmodel.ResourceProvider import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import org.wordpress.android.fluxc.store.WooCommerceStore +import javax.inject.Inject @AndroidEntryPoint -class WooPosCardReaderActivity : AppCompatActivity() { +class WooPosCardReaderActivity : AppCompatActivity(R.layout.activity_woo_pos_card_reader) { + + @Inject + lateinit var orderCreateEditRepository: OrderCreateEditRepository + + @Inject + lateinit var resourceProvider: ResourceProvider + + @Inject + lateinit var cardReaderCountryConfigProvider: CardReaderCountryConfigProvider + + @Inject + lateinit var wooStore: WooCommerceStore + + @Inject + lateinit var selectedSite: SelectedSite + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_woo_pos_card_reader) - - val navController = findNavController(R.id.woopos_card_reader_nav_host_fragment) - navController.setGraph(R.navigation.nav_graph_payment_flow, intent.extras) - navController.navigate( - MoreMenuFragmentDirections.actionMoreMenuToPaymentFlow( - CardReaderFlowParam.PaymentOrRefund.Payment( - orderId = 1, - paymentType = CardReaderFlowParam.PaymentOrRefund.Payment.PaymentType.SIMPLE, - ) + + val navHostFragment = + supportFragmentManager.findFragmentById(R.id.woopos_card_reader_nav_host_fragment) as NavHostFragment + val navController = navHostFragment.navController + val countryConfig = cardReaderCountryConfigProvider.provideCountryConfigFor( + wooStore.getStoreCountryCode(selectedSite.get()) + ) as CardReaderConfigForSupportedCountry + + navController.addOnDestinationChangedListener { _, destination, _ -> + Log.d("WOOPOS", "current destination: $destination") + } + val navGraph = navController.navInflater.inflate(R.navigation.nav_graph_payment_flow).apply { + setStartDestination(R.id.cardReaderTutorialDialogFragment) + } + + lifecycleScope.launch { + val result = orderCreateEditRepository.createSimplePaymentOrder( + countryConfig.minimumAllowedChargeAmount, + customerNote = resourceProvider.getString(R.string.card_reader_tap_to_pay_test_payment_note), + isTaxable = false, + ) + result.fold( + onSuccess = { + withContext(Dispatchers.Main) { + val args = collectPaymentArgs(it.id) + navController.setGraph( + navGraph, + args + ) + + navController.navigate(R.id.cardReaderTutorialDialogFragment, args) + } + }, + onFailure = { + Snackbar.make( + findViewById(android.R.id.content), + "Failed to create order", + Snackbar.LENGTH_LONG + ).show() + } ) + } + } + + private fun collectPaymentArgs(orderId: Long) = Bundle().apply { + putParcelable( + "cardReaderFlowParam", + CardReaderFlowParam.PaymentOrRefund.Payment( + orderId = orderId, + paymentType = CardReaderFlowParam.PaymentOrRefund.Payment.PaymentType.SIMPLE, + ) + ) + putParcelable( + "cardReaderType", + CardReaderType.EXTERNAL ) } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/payment/WooPosPaymentNavigation.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/payment/WooPosPaymentNavigation.kt new file mode 100644 index 00000000000..b35730bd3ea --- /dev/null +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/payment/WooPosPaymentNavigation.kt @@ -0,0 +1 @@ +package com.woocommerce.android.ui.woopos.payment diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/payment/WooPosPaymentScreen.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/payment/WooPosPaymentScreen.kt new file mode 100644 index 00000000000..b35730bd3ea --- /dev/null +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/payment/WooPosPaymentScreen.kt @@ -0,0 +1 @@ +package com.woocommerce.android.ui.woopos.payment diff --git a/WooCommerce/src/main/res/layout/activity_woo_pos_card_reader.xml b/WooCommerce/src/main/res/layout/activity_woo_pos_card_reader.xml index e039d394a4b..c7dad055558 100644 --- a/WooCommerce/src/main/res/layout/activity_woo_pos_card_reader.xml +++ b/WooCommerce/src/main/res/layout/activity_woo_pos_card_reader.xml @@ -2,10 +2,6 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/woopos_card_reader_nav_host_fragment" android:name="androidx.navigation.fragment.NavHostFragment" - android:layout_width="0dp" - android:layout_height="0dp" - app:defaultNavHost="true" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> + android:layout_width="match_parent" + android:layout_height="match_parent" + app:defaultNavHost="true" /> From 14ea468352da1443843f1755f7afdeb26220a406 Mon Sep 17 00:00:00 2001 From: samiuelson Date: Mon, 27 May 2024 16:35:55 +0200 Subject: [PATCH 03/33] Remove unnecessary navigate --- .../android/ui/woopos/cardreader/WooPosCardReaderActivity.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt index 4870ea6fefd..36df82b2f6e 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt @@ -72,7 +72,6 @@ class WooPosCardReaderActivity : AppCompatActivity(R.layout.activity_woo_pos_car args ) - navController.navigate(R.id.cardReaderTutorialDialogFragment, args) } }, onFailure = { From f06dea965ecfe48af47613a7510297c3cbd13c6f Mon Sep 17 00:00:00 2001 From: samiuelson Date: Mon, 27 May 2024 17:51:16 +0200 Subject: [PATCH 04/33] Fix start destination --- .../cardreader/WooPosCardReaderActivity.kt | 38 ++++++++----------- 1 file changed, 15 insertions(+), 23 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt index 36df82b2f6e..407456295f2 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt @@ -1,10 +1,12 @@ package com.woocommerce.android.ui.woopos.cardreader +import android.graphics.Color +import android.graphics.drawable.ColorDrawable import android.os.Bundle import android.util.Log -import android.view.View import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.lifecycleScope +import androidx.navigation.NavArgument import androidx.navigation.fragment.NavHostFragment import com.google.android.material.snackbar.Snackbar import com.woocommerce.android.R @@ -14,6 +16,7 @@ import com.woocommerce.android.ui.orders.creation.OrderCreateEditRepository import com.woocommerce.android.ui.payments.cardreader.CardReaderCountryConfigProvider import com.woocommerce.android.ui.payments.cardreader.onboarding.CardReaderFlowParam import com.woocommerce.android.ui.payments.cardreader.onboarding.CardReaderType +import com.woocommerce.android.ui.payments.cardreader.tutorial.CardReaderTutorialDialogFragmentArgs import com.woocommerce.android.viewmodel.ResourceProvider import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.Dispatchers @@ -45,16 +48,16 @@ class WooPosCardReaderActivity : AppCompatActivity(R.layout.activity_woo_pos_car val navHostFragment = supportFragmentManager.findFragmentById(R.id.woopos_card_reader_nav_host_fragment) as NavHostFragment - val navController = navHostFragment.navController val countryConfig = cardReaderCountryConfigProvider.provideCountryConfigFor( wooStore.getStoreCountryCode(selectedSite.get()) ) as CardReaderConfigForSupportedCountry + val navController = navHostFragment.navController navController.addOnDestinationChangedListener { _, destination, _ -> - Log.d("WOOPOS", "current destination: $destination") + Log.d("WOOPOS-payment-flow", "current destination: $destination") } val navGraph = navController.navInflater.inflate(R.navigation.nav_graph_payment_flow).apply { - setStartDestination(R.id.cardReaderTutorialDialogFragment) + setStartDestination(R.id.cardReaderStatusCheckerDialogFragment) } lifecycleScope.launch { @@ -66,12 +69,7 @@ class WooPosCardReaderActivity : AppCompatActivity(R.layout.activity_woo_pos_car result.fold( onSuccess = { withContext(Dispatchers.Main) { - val args = collectPaymentArgs(it.id) - navController.setGraph( - navGraph, - args - ) - + navController.setGraph(navGraph, buildPaymentArgs(it.id).toBundle()) } }, onFailure = { @@ -85,17 +83,11 @@ class WooPosCardReaderActivity : AppCompatActivity(R.layout.activity_woo_pos_car } } - private fun collectPaymentArgs(orderId: Long) = Bundle().apply { - putParcelable( - "cardReaderFlowParam", - CardReaderFlowParam.PaymentOrRefund.Payment( - orderId = orderId, - paymentType = CardReaderFlowParam.PaymentOrRefund.Payment.PaymentType.SIMPLE, - ) - ) - putParcelable( - "cardReaderType", - CardReaderType.EXTERNAL - ) - } + private fun buildPaymentArgs(orderId: Long) = CardReaderTutorialDialogFragmentArgs( + CardReaderFlowParam.PaymentOrRefund.Payment( + orderId = orderId, + paymentType = CardReaderFlowParam.PaymentOrRefund.Payment.PaymentType.SIMPLE, + ), + CardReaderType.EXTERNAL + ) } From 01d931fee0799e39d1c5be1fe56f8fe4908abdb2 Mon Sep 17 00:00:00 2001 From: Andrey Date: Wed, 29 May 2024 11:23:19 +0200 Subject: [PATCH 05/33] Facade --- .../ui/woopos/cardreader/CardReaderFacade.kt | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/CardReaderFacade.kt diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/CardReaderFacade.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/CardReaderFacade.kt new file mode 100644 index 00000000000..ee8d8a83476 --- /dev/null +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/CardReaderFacade.kt @@ -0,0 +1,19 @@ +package com.woocommerce.android.ui.woopos.cardreader + +import com.woocommerce.android.cardreader.CardReaderManager +import com.woocommerce.android.cardreader.connection.CardReaderStatus +import kotlinx.coroutines.flow.StateFlow +import javax.inject.Inject + +class CardReaderFacade @Inject constructor(cardReaderManager: CardReaderManager) { + val readerStatus: StateFlow = cardReaderManager.readerStatus + + suspend fun connectToReader() { + + } + + suspend fun collectPayment(orderId: Long) { + + } + +} From 932e47cb4694a9e9489c9abf5a39e3b2a813d6ad Mon Sep 17 00:00:00 2001 From: Andrey Date: Wed, 29 May 2024 11:24:10 +0200 Subject: [PATCH 06/33] Removed unused imports --- .../android/ui/woopos/cardreader/WooPosCardReaderActivity.kt | 3 --- 1 file changed, 3 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt index 407456295f2..b75bad1491c 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt @@ -1,12 +1,9 @@ package com.woocommerce.android.ui.woopos.cardreader -import android.graphics.Color -import android.graphics.drawable.ColorDrawable import android.os.Bundle import android.util.Log import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.lifecycleScope -import androidx.navigation.NavArgument import androidx.navigation.fragment.NavHostFragment import com.google.android.material.snackbar.Snackbar import com.woocommerce.android.R From ab3485ee961e67a5d081970d73b988078078dfb0 Mon Sep 17 00:00:00 2001 From: Andrey Date: Wed, 29 May 2024 11:45:19 +0200 Subject: [PATCH 07/33] Start card reader activity from facade --- .../ui/woopos/cardreader/CardReaderFacade.kt | 19 ------------ .../cardreader/WooPosCardReaderFacade.kt | 29 +++++++++++++++++++ .../android/ui/woopos/root/WooPosActivity.kt | 21 +++++++++++++- .../root/navigation/WooPosMainFlowGraph.kt | 11 +++---- .../woopos/root/navigation/WooPosRootHost.kt | 6 +++- 5 files changed, 58 insertions(+), 28 deletions(-) delete mode 100644 WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/CardReaderFacade.kt create mode 100644 WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderFacade.kt diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/CardReaderFacade.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/CardReaderFacade.kt deleted file mode 100644 index ee8d8a83476..00000000000 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/CardReaderFacade.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.woocommerce.android.ui.woopos.cardreader - -import com.woocommerce.android.cardreader.CardReaderManager -import com.woocommerce.android.cardreader.connection.CardReaderStatus -import kotlinx.coroutines.flow.StateFlow -import javax.inject.Inject - -class CardReaderFacade @Inject constructor(cardReaderManager: CardReaderManager) { - val readerStatus: StateFlow = cardReaderManager.readerStatus - - suspend fun connectToReader() { - - } - - suspend fun collectPayment(orderId: Long) { - - } - -} diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderFacade.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderFacade.kt new file mode 100644 index 00000000000..4f4cc942136 --- /dev/null +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderFacade.kt @@ -0,0 +1,29 @@ +package com.woocommerce.android.ui.woopos.cardreader + +import android.content.Context +import android.content.Intent +import android.util.Log +import com.woocommerce.android.cardreader.CardReaderManager +import com.woocommerce.android.cardreader.connection.CardReaderStatus +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.map +import javax.inject.Inject + +class WooPosCardReaderFacade @Inject constructor( + private val cardReaderManager: CardReaderManager, +) { + val readerStatus: Flow = cardReaderManager.readerStatus.map { + Log.d("CardReaderFacade", "readerStatus: $it") + it + } + + suspend fun connectToReader(context: Context) { + val intent = Intent(context, WooPosCardReaderActivity::class.java) + context.startActivity(intent) + } + + suspend fun collectPayment(orderId: Long) { + + } + +} diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/WooPosActivity.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/WooPosActivity.kt index 90d54ae8196..f2d89379dec 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/WooPosActivity.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/WooPosActivity.kt @@ -1,19 +1,38 @@ package com.woocommerce.android.ui.woopos.root import android.os.Bundle +import android.widget.Toast import androidx.activity.compose.setContent import androidx.appcompat.app.AppCompatActivity import androidx.compose.material.MaterialTheme +import androidx.lifecycle.lifecycleScope +import com.woocommerce.android.ui.woopos.cardreader.WooPosCardReaderFacade import com.woocommerce.android.ui.woopos.root.navigation.WooPosRootHost import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.launch +import javax.inject.Inject @AndroidEntryPoint class WooPosActivity : AppCompatActivity() { + @Inject + lateinit var wooPosCardReaderFacade: WooPosCardReaderFacade + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { MaterialTheme { - WooPosRootHost() + WooPosRootHost( + connectToCardReader = { + lifecycleScope.launch { + wooPosCardReaderFacade.connectToReader(it) + } + lifecycleScope.launch { + wooPosCardReaderFacade.readerStatus.collect { + Toast.makeText(this@WooPosActivity, "Reader status: $it", Toast.LENGTH_SHORT).show() + } + } + } + ) } } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/navigation/WooPosMainFlowGraph.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/navigation/WooPosMainFlowGraph.kt index 9f0dccaece2..d6ae204bf04 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/navigation/WooPosMainFlowGraph.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/navigation/WooPosMainFlowGraph.kt @@ -1,10 +1,9 @@ package com.woocommerce.android.ui.woopos.root.navigation -import android.content.Intent +import android.content.Context import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.compose.navigation -import com.woocommerce.android.ui.woopos.cardreader.WooPosCardReaderActivity import com.woocommerce.android.ui.woopos.cart.CART_ROUTE import com.woocommerce.android.ui.woopos.cart.cartScreen import com.woocommerce.android.ui.woopos.checkout.checkoutScreen @@ -13,7 +12,8 @@ import com.woocommerce.android.ui.woopos.checkout.navigateToCheckoutScreen const val MAIN_GRAPH_ROUTE = "main-graph" fun NavGraphBuilder.checkoutGraph( - navController: NavController + navController: NavController, + onConnectToCardReaderClicked: (Context) -> Unit, ) { navigation( startDestination = CART_ROUTE, @@ -21,10 +21,7 @@ fun NavGraphBuilder.checkoutGraph( ) { cartScreen( onCheckoutClick = navController::navigateToCheckoutScreen, - onConnectToCardReaderClicked = { - val intent = Intent(navController.context, WooPosCardReaderActivity::class.java) - navController.context.startActivity(intent) - } + onConnectToCardReaderClicked = { onConnectToCardReaderClicked(navController.context) }, ) checkoutScreen( onBackClick = navController::popBackStack diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/navigation/WooPosRootHost.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/navigation/WooPosRootHost.kt index 0709b338c4d..802b9b68aaa 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/navigation/WooPosRootHost.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/navigation/WooPosRootHost.kt @@ -1,11 +1,14 @@ package com.woocommerce.android.ui.woopos.root.navigation +import android.content.Context import androidx.compose.runtime.Composable import androidx.navigation.compose.NavHost import androidx.navigation.compose.rememberNavController @Composable -fun WooPosRootHost() { +fun WooPosRootHost( + connectToCardReader: (context: Context) -> Unit, +) { val rootController = rememberNavController() NavHost( @@ -18,6 +21,7 @@ fun WooPosRootHost() { ) { checkoutGraph( navController = rootController, + onConnectToCardReaderClicked = { context -> connectToCardReader(context) }, ) } } From cafa957d625d38047eafc57889bf7dd3f9dbd269 Mon Sep 17 00:00:00 2001 From: Andrey Date: Wed, 29 May 2024 11:48:23 +0200 Subject: [PATCH 08/33] Intent to start activity in connection mode --- .../woopos/cardreader/WooPosCardReaderActivity.kt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt index b75bad1491c..70d3de9a45f 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt @@ -1,5 +1,7 @@ package com.woocommerce.android.ui.woopos.cardreader +import android.content.Context +import android.content.Intent import android.os.Bundle import android.util.Log import androidx.appcompat.app.AppCompatActivity @@ -87,4 +89,17 @@ class WooPosCardReaderActivity : AppCompatActivity(R.layout.activity_woo_pos_car ), CardReaderType.EXTERNAL ) + + companion object { + private const val MODE_KEY = "card_reader_connection_mode" + + private enum class Mode { + CONNECTION, PAYMENT + } + + fun buildIntentForCardReaderConnection(context: Context) = + Intent(context, WooPosCardReaderActivity::class.java).apply { + putExtra(MODE_KEY, Mode.CONNECTION) + } + } } From 750b210f30c0a908ecee4354f5dd07fce3d710d6 Mon Sep 17 00:00:00 2001 From: Andrey Date: Wed, 29 May 2024 12:11:38 +0200 Subject: [PATCH 09/33] Fixed transparent theme --- WooCommerce/src/main/AndroidManifest.xml | 3 ++- .../ui/woopos/cardreader/WooPosCardReaderFacade.kt | 11 ++--------- WooCommerce/src/main/res/values/themes.xml | 9 +++++++++ 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/WooCommerce/src/main/AndroidManifest.xml b/WooCommerce/src/main/AndroidManifest.xml index 5c1fafbabed..98bd6aa2dfb 100644 --- a/WooCommerce/src/main/AndroidManifest.xml +++ b/WooCommerce/src/main/AndroidManifest.xml @@ -163,7 +163,8 @@ - + From c1bef0effa3f3c3d56c937f0bd833df35e53f66c Mon Sep 17 00:00:00 2001 From: Andrey Date: Wed, 29 May 2024 12:34:01 +0200 Subject: [PATCH 10/33] Extracted connection flow and start it via new activity --- .../cardreader/WooPosCardReaderActivity.kt | 92 ++++--------------- .../WooPosCardReaderActivityEvent.kt | 5 + .../WooPosCardReaderActivityViewModel.kt | 26 ++++++ .../woopos/cardreader/WooPosCardReaderMode.kt | 10 ++ .../woopos/payment/WooPosPaymentNavigation.kt | 1 - .../ui/woopos/payment/WooPosPaymentScreen.kt | 1 - .../nav_graph_card_reader_connection_flow.xml | 83 +++++++++++++++++ .../res/navigation/nav_graph_payment_flow.xml | 79 +--------------- 8 files changed, 141 insertions(+), 156 deletions(-) create mode 100644 WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivityEvent.kt create mode 100644 WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivityViewModel.kt create mode 100644 WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderMode.kt delete mode 100644 WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/payment/WooPosPaymentNavigation.kt delete mode 100644 WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/payment/WooPosPaymentScreen.kt create mode 100644 WooCommerce/src/main/res/navigation/nav_graph_card_reader_connection_flow.xml diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt index 70d3de9a45f..e618711c0c4 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt @@ -3,103 +3,43 @@ package com.woocommerce.android.ui.woopos.cardreader import android.content.Context import android.content.Intent import android.os.Bundle -import android.util.Log +import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.NavHostFragment -import com.google.android.material.snackbar.Snackbar import com.woocommerce.android.R -import com.woocommerce.android.cardreader.config.CardReaderConfigForSupportedCountry -import com.woocommerce.android.tools.SelectedSite -import com.woocommerce.android.ui.orders.creation.OrderCreateEditRepository -import com.woocommerce.android.ui.payments.cardreader.CardReaderCountryConfigProvider -import com.woocommerce.android.ui.payments.cardreader.onboarding.CardReaderFlowParam -import com.woocommerce.android.ui.payments.cardreader.onboarding.CardReaderType -import com.woocommerce.android.ui.payments.cardreader.tutorial.CardReaderTutorialDialogFragmentArgs -import com.woocommerce.android.viewmodel.ResourceProvider import dagger.hilt.android.AndroidEntryPoint -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext -import org.wordpress.android.fluxc.store.WooCommerceStore -import javax.inject.Inject @AndroidEntryPoint class WooPosCardReaderActivity : AppCompatActivity(R.layout.activity_woo_pos_card_reader) { - - @Inject - lateinit var orderCreateEditRepository: OrderCreateEditRepository - - @Inject - lateinit var resourceProvider: ResourceProvider - - @Inject - lateinit var cardReaderCountryConfigProvider: CardReaderCountryConfigProvider - - @Inject - lateinit var wooStore: WooCommerceStore - - @Inject - lateinit var selectedSite: SelectedSite + val viewModel: WooPosCardReaderActivityViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - val navHostFragment = - supportFragmentManager.findFragmentById(R.id.woopos_card_reader_nav_host_fragment) as NavHostFragment - val countryConfig = cardReaderCountryConfigProvider.provideCountryConfigFor( - wooStore.getStoreCountryCode(selectedSite.get()) - ) as CardReaderConfigForSupportedCountry + val navHostFragment = supportFragmentManager.findFragmentById( + R.id.woopos_card_reader_nav_host_fragment + ) as NavHostFragment - val navController = navHostFragment.navController - navController.addOnDestinationChangedListener { _, destination, _ -> - Log.d("WOOPOS-payment-flow", "current destination: $destination") - } - val navGraph = navController.navInflater.inflate(R.navigation.nav_graph_payment_flow).apply { - setStartDestination(R.id.cardReaderStatusCheckerDialogFragment) - } + observeEvents(navHostFragment) + } - lifecycleScope.launch { - val result = orderCreateEditRepository.createSimplePaymentOrder( - countryConfig.minimumAllowedChargeAmount, - customerNote = resourceProvider.getString(R.string.card_reader_tap_to_pay_test_payment_note), - isTaxable = false, - ) - result.fold( - onSuccess = { - withContext(Dispatchers.Main) { - navController.setGraph(navGraph, buildPaymentArgs(it.id).toBundle()) - } - }, - onFailure = { - Snackbar.make( - findViewById(android.R.id.content), - "Failed to create order", - Snackbar.LENGTH_LONG - ).show() + private fun observeEvents(navHostFragment: NavHostFragment) { + viewModel.event.observe(this) { event -> + when (event) { + is StartCardReaderConnectionFlow -> { + val navController = navHostFragment.navController + navController.navInflater.inflate(R.navigation.nav_graph_card_reader_connection_flow) } - ) + } } } - private fun buildPaymentArgs(orderId: Long) = CardReaderTutorialDialogFragmentArgs( - CardReaderFlowParam.PaymentOrRefund.Payment( - orderId = orderId, - paymentType = CardReaderFlowParam.PaymentOrRefund.Payment.PaymentType.SIMPLE, - ), - CardReaderType.EXTERNAL - ) - companion object { - private const val MODE_KEY = "card_reader_connection_mode" - - private enum class Mode { - CONNECTION, PAYMENT - } + internal const val WOO_POS_CARD_READER_MODE_KEY = "card_reader_connection_mode" fun buildIntentForCardReaderConnection(context: Context) = Intent(context, WooPosCardReaderActivity::class.java).apply { - putExtra(MODE_KEY, Mode.CONNECTION) + putExtra(WOO_POS_CARD_READER_MODE_KEY, WooPosCardReaderMode.Connection) } } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivityEvent.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivityEvent.kt new file mode 100644 index 00000000000..f9c51691222 --- /dev/null +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivityEvent.kt @@ -0,0 +1,5 @@ +package com.woocommerce.android.ui.woopos.cardreader + +import com.woocommerce.android.viewmodel.MultiLiveEvent + +data object StartCardReaderConnectionFlow : MultiLiveEvent.Event() diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivityViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivityViewModel.kt new file mode 100644 index 00000000000..0c43d5254e1 --- /dev/null +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivityViewModel.kt @@ -0,0 +1,26 @@ +package com.woocommerce.android.ui.woopos.cardreader + +import androidx.lifecycle.SavedStateHandle +import com.woocommerce.android.ui.woopos.cardreader.WooPosCardReaderActivity.Companion.WOO_POS_CARD_READER_MODE_KEY +import com.woocommerce.android.viewmodel.ScopedViewModel +import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject + +@HiltViewModel +class WooPosCardReaderActivityViewModel @Inject constructor( + savedStateHandle: SavedStateHandle +) : ScopedViewModel(savedStateHandle) { + init { + when (savedStateHandle.get(WOO_POS_CARD_READER_MODE_KEY)) { + is WooPosCardReaderMode.Connection -> { + triggerEvent(StartCardReaderConnectionFlow) + } + + is WooPosCardReaderMode.Payment -> { + // TODO: Implement + } + + null -> error("No card reader mode provided") + } + } +} diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderMode.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderMode.kt new file mode 100644 index 00000000000..7f57fb1a874 --- /dev/null +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderMode.kt @@ -0,0 +1,10 @@ +package com.woocommerce.android.ui.woopos.cardreader + +import android.os.Parcelable +import kotlinx.parcelize.Parcelize + +@Parcelize +internal sealed class WooPosCardReaderMode : Parcelable { + data object Connection : WooPosCardReaderMode() + data class Payment(val orderId: Long) : WooPosCardReaderMode() +} diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/payment/WooPosPaymentNavigation.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/payment/WooPosPaymentNavigation.kt deleted file mode 100644 index b35730bd3ea..00000000000 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/payment/WooPosPaymentNavigation.kt +++ /dev/null @@ -1 +0,0 @@ -package com.woocommerce.android.ui.woopos.payment diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/payment/WooPosPaymentScreen.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/payment/WooPosPaymentScreen.kt deleted file mode 100644 index b35730bd3ea..00000000000 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/payment/WooPosPaymentScreen.kt +++ /dev/null @@ -1 +0,0 @@ -package com.woocommerce.android.ui.woopos.payment diff --git a/WooCommerce/src/main/res/navigation/nav_graph_card_reader_connection_flow.xml b/WooCommerce/src/main/res/navigation/nav_graph_card_reader_connection_flow.xml new file mode 100644 index 00000000000..b30fc22ba53 --- /dev/null +++ b/WooCommerce/src/main/res/navigation/nav_graph_card_reader_connection_flow.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/WooCommerce/src/main/res/navigation/nav_graph_payment_flow.xml b/WooCommerce/src/main/res/navigation/nav_graph_payment_flow.xml index c098beace53..23fc45076b4 100644 --- a/WooCommerce/src/main/res/navigation/nav_graph_payment_flow.xml +++ b/WooCommerce/src/main/res/navigation/nav_graph_payment_flow.xml @@ -4,6 +4,7 @@ app:startDestination="@id/selectPaymentMethodFragment"> + - - - - - - - - - - - - - - - - - - - - - Date: Wed, 29 May 2024 12:45:40 +0200 Subject: [PATCH 11/33] Fixed compilation errors caused by extracting connection nav graph --- .../nav_graph_card_reader_connection_flow.xml | 11 +++- .../res/navigation/nav_graph_payment_flow.xml | 62 +++++++++++++++++-- 2 files changed, 66 insertions(+), 7 deletions(-) diff --git a/WooCommerce/src/main/res/navigation/nav_graph_card_reader_connection_flow.xml b/WooCommerce/src/main/res/navigation/nav_graph_card_reader_connection_flow.xml index b30fc22ba53..ad157740305 100644 --- a/WooCommerce/src/main/res/navigation/nav_graph_card_reader_connection_flow.xml +++ b/WooCommerce/src/main/res/navigation/nav_graph_card_reader_connection_flow.xml @@ -77,7 +77,16 @@ android:id="@+id/action_cardReaderTutorialDialogFragment_to_cardReaderPaymentDialogFragment" app:destination="@id/cardReaderPaymentDialogFragment" app:popUpTo="@+id/cardReaderTutorialDialogFragment" - app:popUpToInclusive="true" /> + app:popUpToInclusive="true"> + + + diff --git a/WooCommerce/src/main/res/navigation/nav_graph_payment_flow.xml b/WooCommerce/src/main/res/navigation/nav_graph_payment_flow.xml index 23fc45076b4..f200ca05a34 100644 --- a/WooCommerce/src/main/res/navigation/nav_graph_payment_flow.xml +++ b/WooCommerce/src/main/res/navigation/nav_graph_payment_flow.xml @@ -105,7 +105,16 @@ android:id="@+id/action_cardReaderStatusCheckerDialogFragment_to_cardReaderWelcomeDialogFragment" app:destination="@id/cardReaderWelcomeDialogFragment" app:popUpTo="@+id/cardReaderStatusCheckerDialogFragment" - app:popUpToInclusive="true" /> + app:popUpToInclusive="true" > + + + + app:popUpToInclusive="true" > + + + + app:popUpToInclusive="true"> + + + + app:popUpToInclusive="true" > + + + + app:popExitAnim="@anim/activity_fade_out"> + + + + app:popExitAnim="@anim/activity_fade_out"> + + From c3d6853576622f04defa83ed67f7f237bff54853 Mon Sep 17 00:00:00 2001 From: Andrey Date: Wed, 29 May 2024 12:58:00 +0200 Subject: [PATCH 12/33] Renamed card reader connect flow id to exclude duplicate --- .../res/navigation/nav_graph_card_reader_connection_flow.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WooCommerce/src/main/res/navigation/nav_graph_card_reader_connection_flow.xml b/WooCommerce/src/main/res/navigation/nav_graph_card_reader_connection_flow.xml index ad157740305..2cf1aa4a1c8 100644 --- a/WooCommerce/src/main/res/navigation/nav_graph_card_reader_connection_flow.xml +++ b/WooCommerce/src/main/res/navigation/nav_graph_card_reader_connection_flow.xml @@ -1,6 +1,6 @@ Date: Wed, 29 May 2024 13:13:43 +0200 Subject: [PATCH 13/33] Reverted extraction of the connection nav graph as that causes a lot of risk of breaking the current connection flow --- .../nav_graph_card_reader_connection_flow.xml | 92 ------------ .../res/navigation/nav_graph_payment_flow.xml | 141 +++++++++++------- 2 files changed, 84 insertions(+), 149 deletions(-) delete mode 100644 WooCommerce/src/main/res/navigation/nav_graph_card_reader_connection_flow.xml diff --git a/WooCommerce/src/main/res/navigation/nav_graph_card_reader_connection_flow.xml b/WooCommerce/src/main/res/navigation/nav_graph_card_reader_connection_flow.xml deleted file mode 100644 index 2cf1aa4a1c8..00000000000 --- a/WooCommerce/src/main/res/navigation/nav_graph_card_reader_connection_flow.xml +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/WooCommerce/src/main/res/navigation/nav_graph_payment_flow.xml b/WooCommerce/src/main/res/navigation/nav_graph_payment_flow.xml index f200ca05a34..c098beace53 100644 --- a/WooCommerce/src/main/res/navigation/nav_graph_payment_flow.xml +++ b/WooCommerce/src/main/res/navigation/nav_graph_payment_flow.xml @@ -4,7 +4,6 @@ app:startDestination="@id/selectPaymentMethodFragment"> - - - - + app:popUpToInclusive="true" /> - - - + app:popUpToInclusive="true" /> - - - + app:popUpToInclusive="true" /> - - - + app:popUpToInclusive="true" /> - - - + app:popExitAnim="@anim/activity_fade_out" /> - - + app:popExitAnim="@anim/activity_fade_out" /> + + + + + + + + + + + + + + + + + + + + + Date: Wed, 29 May 2024 13:31:17 +0200 Subject: [PATCH 14/33] pass params from VM --- .../woopos/cardreader/WooPosCardReaderActivity.kt | 13 ++++++++++++- .../cardreader/WooPosCardReaderActivityEvent.kt | 7 ++++++- .../cardreader/WooPosCardReaderActivityViewModel.kt | 9 ++++++++- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt index e618711c0c4..2020e22fb6c 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt @@ -7,6 +7,7 @@ import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity import androidx.navigation.fragment.NavHostFragment import com.woocommerce.android.R +import com.woocommerce.android.ui.payments.cardreader.statuschecker.CardReaderStatusCheckerDialogFragmentArgs import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint @@ -28,7 +29,17 @@ class WooPosCardReaderActivity : AppCompatActivity(R.layout.activity_woo_pos_car when (event) { is StartCardReaderConnectionFlow -> { val navController = navHostFragment.navController - navController.navInflater.inflate(R.navigation.nav_graph_card_reader_connection_flow) + navController.navInflater.inflate(R.navigation.nav_graph_payment_flow).apply { + setStartDestination(R.id.cardReaderStatusCheckerDialogFragment) + }.also { + navController.setGraph( + it, + CardReaderStatusCheckerDialogFragmentArgs( + cardReaderFlowParam = event.cardReaderFlowParam, + cardReaderType = event.cardReaderType, + ).toBundle() + ) + } } } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivityEvent.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivityEvent.kt index f9c51691222..e2a4a440b5f 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivityEvent.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivityEvent.kt @@ -1,5 +1,10 @@ package com.woocommerce.android.ui.woopos.cardreader +import com.woocommerce.android.ui.payments.cardreader.onboarding.CardReaderFlowParam +import com.woocommerce.android.ui.payments.cardreader.onboarding.CardReaderType import com.woocommerce.android.viewmodel.MultiLiveEvent -data object StartCardReaderConnectionFlow : MultiLiveEvent.Event() +data class StartCardReaderConnectionFlow( + val cardReaderFlowParam: CardReaderFlowParam, + val cardReaderType: CardReaderType, +) : MultiLiveEvent.Event() diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivityViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivityViewModel.kt index 0c43d5254e1..9585660e6d0 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivityViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivityViewModel.kt @@ -1,6 +1,8 @@ package com.woocommerce.android.ui.woopos.cardreader import androidx.lifecycle.SavedStateHandle +import com.woocommerce.android.ui.payments.cardreader.onboarding.CardReaderFlowParam +import com.woocommerce.android.ui.payments.cardreader.onboarding.CardReaderType import com.woocommerce.android.ui.woopos.cardreader.WooPosCardReaderActivity.Companion.WOO_POS_CARD_READER_MODE_KEY import com.woocommerce.android.viewmodel.ScopedViewModel import dagger.hilt.android.lifecycle.HiltViewModel @@ -13,7 +15,12 @@ class WooPosCardReaderActivityViewModel @Inject constructor( init { when (savedStateHandle.get(WOO_POS_CARD_READER_MODE_KEY)) { is WooPosCardReaderMode.Connection -> { - triggerEvent(StartCardReaderConnectionFlow) + triggerEvent( + StartCardReaderConnectionFlow( + cardReaderFlowParam = CardReaderFlowParam.CardReadersHub(), + cardReaderType = CardReaderType.EXTERNAL + ) + ) } is WooPosCardReaderMode.Payment -> { From 6575e38cb6e9919c1464a716bb73ffd399eabc67 Mon Sep 17 00:00:00 2001 From: Andrey Date: Wed, 29 May 2024 15:25:08 +0200 Subject: [PATCH 15/33] pass params from VM --- .../cardreader/onboarding/CardReaderOnboardingFragment.kt | 3 +++ .../cardreader/onboarding/CardReaderOnboardingViewModel.kt | 3 +++ .../statuschecker/CardReaderStatusCheckerViewModel.kt | 2 ++ .../cardreader/tutorial/CardReaderTutorialDialogFragment.kt | 3 ++- .../android/ui/payments/hub/PaymentsHubViewModel.kt | 1 + .../payments/methodselection/SelectPaymentMethodViewModel.kt | 2 ++ .../android/ui/woopos/cardreader/WooPosCardReaderActivity.kt | 2 +- ...eaderActivityViewModel.kt => WooPosCardReaderViewModel.kt} | 4 ++-- 8 files changed, 16 insertions(+), 4 deletions(-) rename WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/{WooPosCardReaderActivityViewModel.kt => WooPosCardReaderViewModel.kt} (93%) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/onboarding/CardReaderOnboardingFragment.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/onboarding/CardReaderOnboardingFragment.kt index 2d511e2167f..7609cc670ff 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/onboarding/CardReaderOnboardingFragment.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/onboarding/CardReaderOnboardingFragment.kt @@ -413,6 +413,9 @@ sealed class CardReaderFlowParam : Parcelable { } } + @Parcelize + data object WooPosConnection : CardReaderFlowParam() + sealed class PaymentOrRefund : CardReaderFlowParam() { abstract val orderId: Long diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/onboarding/CardReaderOnboardingViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/onboarding/CardReaderOnboardingViewModel.kt index 079e5a5740a..cc141c638a5 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/onboarding/CardReaderOnboardingViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/onboarding/CardReaderOnboardingViewModel.kt @@ -438,6 +438,9 @@ class CardReaderOnboardingViewModel @Inject constructor( CardReaderOnboardingEvent.ContinueToConnection(params, requireNotNull(arguments.cardReaderType)) ) } + is CardReaderFlowParam.WooPosConnection -> { + error("Unsupported flow param: $params") + } } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/statuschecker/CardReaderStatusCheckerViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/statuschecker/CardReaderStatusCheckerViewModel.kt index 68d0f50228a..936ef06809b 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/statuschecker/CardReaderStatusCheckerViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/statuschecker/CardReaderStatusCheckerViewModel.kt @@ -69,6 +69,7 @@ class CardReaderStatusCheckerViewModel handleOnboardingStatus(param) } } + is CardReaderFlowParam.WooPosConnection -> handleOnboardingStatus(param) } } @@ -87,6 +88,7 @@ class CardReaderStatusCheckerViewModel triggerEvent(StatusCheckerEvent.NavigateToWelcome(param, arguments.cardReaderType)) } } + else -> triggerEvent( StatusCheckerEvent.NavigateToOnboarding( CardReaderOnboardingParams.Failed(param, state), diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/tutorial/CardReaderTutorialDialogFragment.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/tutorial/CardReaderTutorialDialogFragment.kt index 64001b78fc5..73951c436c6 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/tutorial/CardReaderTutorialDialogFragment.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/tutorial/CardReaderTutorialDialogFragment.kt @@ -58,7 +58,8 @@ class CardReaderTutorialDialogFragment : PaymentsBaseDialogFragment(R.layout.car private fun navigateNext() { when (val param = args.cardReaderFlowParam) { - is CardReaderFlowParam.CardReadersHub -> findNavController().popBackStack() + is CardReaderFlowParam.CardReadersHub, + is CardReaderFlowParam.WooPosConnection -> findNavController().popBackStack() is CardReaderFlowParam.PaymentOrRefund -> { val action = CardReaderTutorialDialogFragmentDirections .actionCardReaderTutorialDialogFragmentToCardReaderPaymentDialogFragment(param, args.cardReaderType) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/hub/PaymentsHubViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/hub/PaymentsHubViewModel.kt index 75bf2bbdc4b..2d8d4598a30 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/hub/PaymentsHubViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/hub/PaymentsHubViewModel.kt @@ -507,6 +507,7 @@ class PaymentsHubViewModel @Inject constructor( is PaymentOrRefund -> { // no-op } + is CardReaderFlowParam.WooPosConnection -> error("Unsupported card reader flow param $params") } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodViewModel.kt index 2fd11f7b07d..deb12e81dfa 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodViewModel.kt @@ -28,6 +28,7 @@ import com.woocommerce.android.ui.payments.cardreader.onboarding.CardReaderFlowP import com.woocommerce.android.ui.payments.cardreader.onboarding.CardReaderFlowParam.PaymentOrRefund.Payment.PaymentType.SIMPLE import com.woocommerce.android.ui.payments.cardreader.onboarding.CardReaderFlowParam.PaymentOrRefund.Payment.PaymentType.TRY_TAP_TO_PAY import com.woocommerce.android.ui.payments.cardreader.onboarding.CardReaderFlowParam.PaymentOrRefund.Refund +import com.woocommerce.android.ui.payments.cardreader.onboarding.CardReaderFlowParam.WooPosConnection import com.woocommerce.android.ui.payments.cardreader.onboarding.CardReaderType.BUILT_IN import com.woocommerce.android.ui.payments.cardreader.onboarding.CardReaderType.EXTERNAL import com.woocommerce.android.ui.payments.cardreader.payment.CardReaderPaymentCollectibilityChecker @@ -120,6 +121,7 @@ class SelectPaymentMethodViewModel @Inject constructor( is Refund -> triggerEvent(NavigateToCardReaderRefundFlow(param, EXTERNAL)) } } + is WooPosConnection -> error("Unsupported card reader flow param: $param") } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt index 2020e22fb6c..5bd226122c4 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt @@ -12,7 +12,7 @@ import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint class WooPosCardReaderActivity : AppCompatActivity(R.layout.activity_woo_pos_card_reader) { - val viewModel: WooPosCardReaderActivityViewModel by viewModels() + val viewModel: WooPosCardReaderViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivityViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderViewModel.kt similarity index 93% rename from WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivityViewModel.kt rename to WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderViewModel.kt index 9585660e6d0..c6014466c42 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivityViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderViewModel.kt @@ -9,7 +9,7 @@ import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject @HiltViewModel -class WooPosCardReaderActivityViewModel @Inject constructor( +class WooPosCardReaderViewModel @Inject constructor( savedStateHandle: SavedStateHandle ) : ScopedViewModel(savedStateHandle) { init { @@ -17,7 +17,7 @@ class WooPosCardReaderActivityViewModel @Inject constructor( is WooPosCardReaderMode.Connection -> { triggerEvent( StartCardReaderConnectionFlow( - cardReaderFlowParam = CardReaderFlowParam.CardReadersHub(), + cardReaderFlowParam = CardReaderFlowParam.WooPosConnection, cardReaderType = CardReaderType.EXTERNAL ) ) From 0355768b0925de4de3b2b2a8952fe5c397fb47d0 Mon Sep 17 00:00:00 2001 From: Andrey Date: Wed, 29 May 2024 17:03:23 +0200 Subject: [PATCH 16/33] Figuring out how if tehre is a way to send explicite result from nav host --- .../cardreader/WooPosCardReaderActivity.kt | 45 +++++++++++++++---- .../cardreader/WooPosCardReaderViewModel.kt | 9 +++- 2 files changed, 44 insertions(+), 10 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt index 5bd226122c4..40cec3a046f 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt @@ -3,6 +3,7 @@ package com.woocommerce.android.ui.woopos.cardreader import android.content.Context import android.content.Intent import android.os.Bundle +import android.util.Log import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity import androidx.navigation.fragment.NavHostFragment @@ -22,6 +23,21 @@ class WooPosCardReaderActivity : AppCompatActivity(R.layout.activity_woo_pos_car ) as NavHostFragment observeEvents(navHostFragment) + observeResults(navHostFragment) + } + + private fun observeResults(navHostFragment: NavHostFragment) { + navHostFragment.navController.addOnDestinationChangedListener { _, destination, args -> + Log.d("WooPosCardReaderActivity", "destination: ${destination.label} args: $args") + when (destination.id) { + R.id.cardReaderStatusCheckerDialogFragment -> { + navHostFragment.handleResult( + "connect_to_reader_result", + viewModel::onConnectToReaderResultReceived + ) + } + } + } } private fun observeEvents(navHostFragment: NavHostFragment) { @@ -29,17 +45,16 @@ class WooPosCardReaderActivity : AppCompatActivity(R.layout.activity_woo_pos_car when (event) { is StartCardReaderConnectionFlow -> { val navController = navHostFragment.navController - navController.navInflater.inflate(R.navigation.nav_graph_payment_flow).apply { + val graph = navController.navInflater.inflate(R.navigation.nav_graph_payment_flow).apply { setStartDestination(R.id.cardReaderStatusCheckerDialogFragment) - }.also { - navController.setGraph( - it, - CardReaderStatusCheckerDialogFragmentArgs( - cardReaderFlowParam = event.cardReaderFlowParam, - cardReaderType = event.cardReaderType, - ).toBundle() - ) } + navController.setGraph( + graph, + CardReaderStatusCheckerDialogFragmentArgs( + cardReaderFlowParam = event.cardReaderFlowParam, + cardReaderType = event.cardReaderType, + ).toBundle() + ) } } } @@ -53,4 +68,16 @@ class WooPosCardReaderActivity : AppCompatActivity(R.layout.activity_woo_pos_car putExtra(WOO_POS_CARD_READER_MODE_KEY, WooPosCardReaderMode.Connection) } } + + private fun NavHostFragment.handleResult(key: String, handler: (T) -> Unit) { + val entry = navController.currentBackStackEntry + entry?.savedStateHandle?.let { saveState -> + saveState.getLiveData(key).observe(this.viewLifecycleOwner) { + it?.let { + handler(it) + saveState[key] = null + } + } + } + } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderViewModel.kt index c6014466c42..073565421d2 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderViewModel.kt @@ -1,5 +1,6 @@ package com.woocommerce.android.ui.woopos.cardreader +import android.util.Log import androidx.lifecycle.SavedStateHandle import com.woocommerce.android.ui.payments.cardreader.onboarding.CardReaderFlowParam import com.woocommerce.android.ui.payments.cardreader.onboarding.CardReaderType @@ -27,7 +28,13 @@ class WooPosCardReaderViewModel @Inject constructor( // TODO: Implement } - null -> error("No card reader mode provided") + null -> { + + } } } + + fun onConnectToReaderResultReceived(connected: Boolean) { + Log.d("WooPosCardReaderViewModel", "onConnectToReaderResultReceived: $connected") + } } From d5f30c5c920d07d3f4b060a18f85c303eec16cea Mon Sep 17 00:00:00 2001 From: Andrey Date: Thu, 30 May 2024 11:06:57 +0200 Subject: [PATCH 17/33] Removed attempts to handle cancelation --- .../cardreader/WooPosCardReaderActivity.kt | 28 ------------------- .../cardreader/WooPosCardReaderFacade.kt | 9 ++---- .../cardreader/WooPosCardReaderViewModel.kt | 8 +----- .../android/ui/woopos/root/WooPosActivity.kt | 2 +- 4 files changed, 4 insertions(+), 43 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt index 40cec3a046f..74dbdda0b47 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt @@ -3,7 +3,6 @@ package com.woocommerce.android.ui.woopos.cardreader import android.content.Context import android.content.Intent import android.os.Bundle -import android.util.Log import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity import androidx.navigation.fragment.NavHostFragment @@ -23,21 +22,6 @@ class WooPosCardReaderActivity : AppCompatActivity(R.layout.activity_woo_pos_car ) as NavHostFragment observeEvents(navHostFragment) - observeResults(navHostFragment) - } - - private fun observeResults(navHostFragment: NavHostFragment) { - navHostFragment.navController.addOnDestinationChangedListener { _, destination, args -> - Log.d("WooPosCardReaderActivity", "destination: ${destination.label} args: $args") - when (destination.id) { - R.id.cardReaderStatusCheckerDialogFragment -> { - navHostFragment.handleResult( - "connect_to_reader_result", - viewModel::onConnectToReaderResultReceived - ) - } - } - } } private fun observeEvents(navHostFragment: NavHostFragment) { @@ -68,16 +52,4 @@ class WooPosCardReaderActivity : AppCompatActivity(R.layout.activity_woo_pos_car putExtra(WOO_POS_CARD_READER_MODE_KEY, WooPosCardReaderMode.Connection) } } - - private fun NavHostFragment.handleResult(key: String, handler: (T) -> Unit) { - val entry = navController.currentBackStackEntry - entry?.savedStateHandle?.let { saveState -> - saveState.getLiveData(key).observe(this.viewLifecycleOwner) { - it?.let { - handler(it) - saveState[key] = null - } - } - } - } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderFacade.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderFacade.kt index 007003be978..a782957268d 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderFacade.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderFacade.kt @@ -1,20 +1,15 @@ package com.woocommerce.android.ui.woopos.cardreader import android.content.Context -import android.util.Log import com.woocommerce.android.cardreader.CardReaderManager import com.woocommerce.android.cardreader.connection.CardReaderStatus import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.map import javax.inject.Inject class WooPosCardReaderFacade @Inject constructor( - private val cardReaderManager: CardReaderManager, + cardReaderManager: CardReaderManager, ) { - val readerStatus: Flow = cardReaderManager.readerStatus.map { - Log.d("CardReaderFacade", "readerStatus: $it") - it - } + val readerStatus: Flow = cardReaderManager.readerStatus fun connectToReader(context: Context) { context.startActivity(WooPosCardReaderActivity.buildIntentForCardReaderConnection(context)) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderViewModel.kt index 073565421d2..31cf72d5659 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderViewModel.kt @@ -28,13 +28,7 @@ class WooPosCardReaderViewModel @Inject constructor( // TODO: Implement } - null -> { - - } + null -> Log.d("WooPosCardReaderViewModel", "No card reader mode specified") } } - - fun onConnectToReaderResultReceived(connected: Boolean) { - Log.d("WooPosCardReaderViewModel", "onConnectToReaderResultReceived: $connected") - } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/WooPosActivity.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/WooPosActivity.kt index f2d89379dec..8224af9431c 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/WooPosActivity.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/WooPosActivity.kt @@ -24,7 +24,7 @@ class WooPosActivity : AppCompatActivity() { WooPosRootHost( connectToCardReader = { lifecycleScope.launch { - wooPosCardReaderFacade.connectToReader(it) + wooPosCardReaderFacade.connectToReader(this@WooPosActivity) } lifecycleScope.launch { wooPosCardReaderFacade.readerStatus.collect { From b058315e2a6c725018bad9ab69f6f7c7a2b568df Mon Sep 17 00:00:00 2001 From: Andrey Date: Thu, 30 May 2024 11:09:33 +0200 Subject: [PATCH 18/33] Fixed detekt complains --- .../ui/woopos/cardreader/WooPosCardReaderActivity.kt | 2 +- .../ui/woopos/cardreader/WooPosCardReaderActivityEvent.kt | 2 +- .../ui/woopos/cardreader/WooPosCardReaderViewModel.kt | 6 ++---- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt index 74dbdda0b47..5a81c60cfd7 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt @@ -27,7 +27,7 @@ class WooPosCardReaderActivity : AppCompatActivity(R.layout.activity_woo_pos_car private fun observeEvents(navHostFragment: NavHostFragment) { viewModel.event.observe(this) { event -> when (event) { - is StartCardReaderConnectionFlow -> { + is WooPosCardReaderActivityEvent -> { val navController = navHostFragment.navController val graph = navController.navInflater.inflate(R.navigation.nav_graph_payment_flow).apply { setStartDestination(R.id.cardReaderStatusCheckerDialogFragment) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivityEvent.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivityEvent.kt index e2a4a440b5f..34ebb912821 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivityEvent.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivityEvent.kt @@ -4,7 +4,7 @@ import com.woocommerce.android.ui.payments.cardreader.onboarding.CardReaderFlowP import com.woocommerce.android.ui.payments.cardreader.onboarding.CardReaderType import com.woocommerce.android.viewmodel.MultiLiveEvent -data class StartCardReaderConnectionFlow( +data class WooPosCardReaderActivityEvent( val cardReaderFlowParam: CardReaderFlowParam, val cardReaderType: CardReaderType, ) : MultiLiveEvent.Event() diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderViewModel.kt index 31cf72d5659..2ef5659742b 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderViewModel.kt @@ -17,16 +17,14 @@ class WooPosCardReaderViewModel @Inject constructor( when (savedStateHandle.get(WOO_POS_CARD_READER_MODE_KEY)) { is WooPosCardReaderMode.Connection -> { triggerEvent( - StartCardReaderConnectionFlow( + WooPosCardReaderActivityEvent( cardReaderFlowParam = CardReaderFlowParam.WooPosConnection, cardReaderType = CardReaderType.EXTERNAL ) ) } - is WooPosCardReaderMode.Payment -> { - // TODO: Implement - } + is WooPosCardReaderMode.Payment -> error("Payment mode not implemented yet") null -> Log.d("WooPosCardReaderViewModel", "No card reader mode specified") } From 26e18db0d669a7cc99679683f992589c41cb3f47 Mon Sep 17 00:00:00 2001 From: Andrey Date: Thu, 30 May 2024 11:48:40 +0200 Subject: [PATCH 19/33] Pop back stack instead of going up to handle cancelation/not connected state --- .../CardReaderConnectDialogFragment.kt | 1 + .../connect/CardReaderConnectEvent.kt | 2 ++ .../connect/CardReaderConnectViewModel.kt | 19 ++++++++++++++++++- .../cardreader/WooPosCardReaderViewModel.kt | 3 +-- 4 files changed, 22 insertions(+), 3 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/connect/CardReaderConnectDialogFragment.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/connect/CardReaderConnectDialogFragment.kt index 5e25825c5b0..5989a4af964 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/connect/CardReaderConnectDialogFragment.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/connect/CardReaderConnectDialogFragment.kt @@ -244,6 +244,7 @@ class CardReaderConnectDialogFragment : PaymentsBaseDialogFragment(R.layout.card result = event.data as Boolean, ) } + is CardReaderConnectEvent.PopBackStackForWooPOS -> findNavController().popBackStack() is CardReaderConnectEvent.ShowToast -> ToastUtils.showToast(requireContext(), getString(event.message)) is CardReaderConnectEvent.ShowToastString -> diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/connect/CardReaderConnectEvent.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/connect/CardReaderConnectEvent.kt index 67ac825a809..87de39f23d7 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/connect/CardReaderConnectEvent.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/connect/CardReaderConnectEvent.kt @@ -46,4 +46,6 @@ sealed class CardReaderConnectEvent : MultiLiveEvent.Event() { data class OpenWPComWebView(val url: String) : CardReaderConnectEvent() data class OpenGenericWebView(val url: String) : CardReaderConnectEvent() + + data object PopBackStackForWooPOS : CardReaderConnectEvent() } 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 f3ae59ab1e9..4a15d46862c 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 @@ -35,6 +35,7 @@ import com.woocommerce.android.ui.payments.cardreader.connect.CardReaderConnectE import com.woocommerce.android.ui.payments.cardreader.connect.CardReaderConnectEvent.OpenLocationSettings import com.woocommerce.android.ui.payments.cardreader.connect.CardReaderConnectEvent.OpenPermissionsSettings import com.woocommerce.android.ui.payments.cardreader.connect.CardReaderConnectEvent.OpenWPComWebView +import com.woocommerce.android.ui.payments.cardreader.connect.CardReaderConnectEvent.PopBackStackForWooPOS import com.woocommerce.android.ui.payments.cardreader.connect.CardReaderConnectEvent.RequestBluetoothRuntimePermissions import com.woocommerce.android.ui.payments.cardreader.connect.CardReaderConnectEvent.RequestEnableBluetooth import com.woocommerce.android.ui.payments.cardreader.connect.CardReaderConnectEvent.RequestLocationPermissions @@ -57,6 +58,7 @@ import com.woocommerce.android.ui.payments.cardreader.connect.CardReaderConnectV import com.woocommerce.android.ui.payments.cardreader.connect.CardReaderConnectViewState.MissingMerchantAddressError import com.woocommerce.android.ui.payments.cardreader.connect.CardReaderConnectViewState.MultipleExternalReadersFoundState import com.woocommerce.android.ui.payments.cardreader.connect.CardReaderConnectViewState.ScanningFailedState +import com.woocommerce.android.ui.payments.cardreader.onboarding.CardReaderFlowParam import com.woocommerce.android.ui.payments.cardreader.onboarding.CardReaderOnboardingChecker import com.woocommerce.android.ui.payments.cardreader.onboarding.CardReaderType.BUILT_IN import com.woocommerce.android.ui.payments.cardreader.onboarding.CardReaderType.EXTERNAL @@ -281,6 +283,7 @@ class CardReaderConnectViewModel @Inject constructor( Unit } } + CardReaderStatus.Connecting -> { connectionStarted = true viewState.value = provideConnectingState() @@ -309,13 +312,16 @@ class CardReaderConnectViewModel @Inject constructor( viewState.value = provideScanningState() } } + is ReadersFound -> { tracker.trackReadersDiscovered(discoveryEvent.list.size) onReadersFound(discoveryEvent) } + Succeeded -> { // noop } + is Failed -> { tracker.trackReaderDiscoveryFailed(discoveryEvent.msg) WooLog.e(WooLog.T.CARD_READER, "Scanning failed: ${discoveryEvent.msg}") @@ -330,6 +336,7 @@ class CardReaderConnectViewModel @Inject constructor( triggerEvent(ShowToast(R.string.card_reader_detail_connected_update_failed)) exitFlow(connected = false) } + CardReaderUpdateViewModel.UpdateResult.SUCCESS -> { // noop } @@ -400,6 +407,7 @@ class CardReaderConnectViewModel @Inject constructor( ::onCancelClicked, ::onLearnMoreClicked ) + EXTERNAL -> ExternalReaderScanningState( ::onCancelClicked, ::onLearnMoreClicked @@ -424,6 +432,7 @@ class CardReaderConnectViewModel @Inject constructor( tracker.trackFetchingLocationSucceeded() cardReaderManager.startConnectionToReader(cardReader, result.locationId) } + is CardReaderLocationRepository.LocationIdFetchingResult.Error -> { handleLocationFetchingError(result) } @@ -453,10 +462,12 @@ class CardReaderConnectViewModel @Inject constructor( } ) } + is CardReaderLocationRepository.LocationIdFetchingResult.Error.InvalidPostalCode -> { trackLocationFailureFetching("Invalid Postal Code") viewState.value = InvalidMerchantAddressPostCodeError(::restartFlow) } + is CardReaderLocationRepository.LocationIdFetchingResult.Error.Other -> { trackLocationFailureFetching(result.error) onReaderConnectionFailed() @@ -510,7 +521,13 @@ class CardReaderConnectViewModel @Inject constructor( private fun exitFlow(connected: Boolean) { if (!connected) { - triggerEvent(ExitWithResult(false)) + when (arguments.cardReaderFlowParam) { + is CardReaderFlowParam.CardReadersHub, + is CardReaderFlowParam.PaymentOrRefund.Payment, + is CardReaderFlowParam.PaymentOrRefund.Refund -> triggerEvent(ExitWithResult(false)) + + CardReaderFlowParam.WooPosConnection -> triggerEvent(PopBackStackForWooPOS) + } } else { triggerEvent(ShowCardReaderTutorial(arguments.cardReaderFlowParam, arguments.cardReaderType)) } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderViewModel.kt index 2ef5659742b..75d0a49158e 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderViewModel.kt @@ -1,6 +1,5 @@ package com.woocommerce.android.ui.woopos.cardreader -import android.util.Log import androidx.lifecycle.SavedStateHandle import com.woocommerce.android.ui.payments.cardreader.onboarding.CardReaderFlowParam import com.woocommerce.android.ui.payments.cardreader.onboarding.CardReaderType @@ -26,7 +25,7 @@ class WooPosCardReaderViewModel @Inject constructor( is WooPosCardReaderMode.Payment -> error("Payment mode not implemented yet") - null -> Log.d("WooPosCardReaderViewModel", "No card reader mode specified") + null -> error("WooPosCardReaderMode not found in savedStateHandle") } } } From ed38b02e4c0df1a26dc81c1673c57ed3855ea1e4 Mon Sep 17 00:00:00 2001 From: Andrey Date: Thu, 30 May 2024 15:57:37 +0200 Subject: [PATCH 20/33] In select payment method screen --- .../android/analytics/AnalyticsTracker.kt | 1 + .../onboarding/CardReaderOnboardingFragment.kt | 1 + .../methodselection/SelectPaymentMethodEvent.kt | 2 ++ .../methodselection/SelectPaymentMethodFragment.kt | 2 ++ .../methodselection/SelectPaymentMethodViewModel.kt | 12 +++++++++--- 5 files changed, 15 insertions(+), 3 deletions(-) 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 b59a4149a09..f26e8474e5f 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/analytics/AnalyticsTracker.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/analytics/AnalyticsTracker.kt @@ -381,6 +381,7 @@ class AnalyticsTracker private constructor( const val VALUE_ORDER_CREATION_PAYMENTS_FLOW = "creation" const val VALUE_SCAN_TO_PAY_PAYMENT_FLOW = "scan_to_pay" const val VALUE_TTP_TRY_PAYMENT_FLOW = "tap_to_pay_try_a_payment" + const val VALUE_WOO_POS_PAYMENTS_FLOW = "woo_pos" const val KEY_JITM = "jitm" const val KEY_JITM_COUNT = "count" diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/onboarding/CardReaderOnboardingFragment.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/onboarding/CardReaderOnboardingFragment.kt index 7609cc670ff..2251864a406 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/onboarding/CardReaderOnboardingFragment.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/onboarding/CardReaderOnboardingFragment.kt @@ -429,6 +429,7 @@ sealed class CardReaderFlowParam : Parcelable { ORDER, ORDER_CREATION, TRY_TAP_TO_PAY, + WOO_POS, } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodEvent.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodEvent.kt index a984704284b..b70e2ec4151 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodEvent.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodEvent.kt @@ -36,6 +36,8 @@ data class NavigateToOrderDetails( val orderId: Long ) : MultiLiveEvent.Event() +object NavigateBackToWooPos() : MultiLiveEvent.Event() + data class NavigateToTapToPaySummary( val order: Order ) : MultiLiveEvent.Event() diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodFragment.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodFragment.kt index e96bdf9fa1e..7527fc76528 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodFragment.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodFragment.kt @@ -273,6 +273,8 @@ class SelectPaymentMethodFragment : BaseFragment(R.layout.fragment_select_paymen ) ) } + + is NavigateBackToWooPos -> findNavController().popBackStack() } } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodViewModel.kt index deb12e81dfa..b483ea602a6 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodViewModel.kt @@ -27,6 +27,7 @@ import com.woocommerce.android.ui.payments.cardreader.onboarding.CardReaderFlowP import com.woocommerce.android.ui.payments.cardreader.onboarding.CardReaderFlowParam.PaymentOrRefund.Payment.PaymentType.ORDER_CREATION import com.woocommerce.android.ui.payments.cardreader.onboarding.CardReaderFlowParam.PaymentOrRefund.Payment.PaymentType.SIMPLE import com.woocommerce.android.ui.payments.cardreader.onboarding.CardReaderFlowParam.PaymentOrRefund.Payment.PaymentType.TRY_TAP_TO_PAY +import com.woocommerce.android.ui.payments.cardreader.onboarding.CardReaderFlowParam.PaymentOrRefund.Payment.PaymentType.WOO_POS import com.woocommerce.android.ui.payments.cardreader.onboarding.CardReaderFlowParam.PaymentOrRefund.Refund import com.woocommerce.android.ui.payments.cardreader.onboarding.CardReaderFlowParam.WooPosConnection import com.woocommerce.android.ui.payments.cardreader.onboarding.CardReaderType.BUILT_IN @@ -101,7 +102,6 @@ class SelectPaymentMethodViewModel @Inject constructor( when (param) { is Payment -> { launch { - // stay on screen cardReaderTrackingInfoKeeper.setCountry( wooCommerceStore.getStoreCountryCode(selectedSite.get()) ) @@ -113,7 +113,10 @@ class SelectPaymentMethodViewModel @Inject constructor( cardReaderTrackingInfoKeeper.setCurrency(order.currency) } - showPaymentState() + when (param.paymentType) { + SIMPLE, ORDER, ORDER_CREATION, TRY_TAP_TO_PAY -> showPaymentState() + WOO_POS -> onBtReaderClicked() + } } Unit } @@ -249,6 +252,7 @@ class SelectPaymentMethodViewModel @Inject constructor( val messageIdForPaymentType = when (cardReaderPaymentFlowParam.paymentType) { SIMPLE, TRY_TAP_TO_PAY -> R.string.simple_payments_cash_dlg_message ORDER, ORDER_CREATION -> R.string.existing_order_cash_dlg_message + WOO_POS -> error("Unsupported card reader flow param: $cardReaderPaymentFlowParam") } triggerEvent( MultiLiveEvent.Event.ShowDialog( @@ -448,6 +452,7 @@ class SelectPaymentMethodViewModel @Inject constructor( SIMPLE -> NavigateBackToHub(CardReadersHub()) TRY_TAP_TO_PAY -> NavigateToTapToPaySummary(order.first()) ORDER, ORDER_CREATION -> NavigateBackToOrderList(order.first()) + WOO_POS -> NavigateToWooPos(order.first().id) } ) } @@ -457,7 +462,8 @@ class SelectPaymentMethodViewModel @Inject constructor( SIMPLE -> AnalyticsTracker.VALUE_SIMPLE_PAYMENTS_FLOW ORDER -> AnalyticsTracker.VALUE_ORDER_PAYMENTS_FLOW TRY_TAP_TO_PAY -> AnalyticsTracker.VALUE_TTP_TRY_PAYMENT_FLOW - Payment.PaymentType.ORDER_CREATION -> AnalyticsTracker.VALUE_ORDER_CREATION_PAYMENTS_FLOW + ORDER_CREATION -> AnalyticsTracker.VALUE_ORDER_CREATION_PAYMENTS_FLOW + WOO_POS -> AnalyticsTracker.VALUE_WOO_POS_PAYMENTS_FLOW } private fun onLearnMoreIppClicked() { From b6a99d5e04007a57e32aaf78a031a8af14e8d4cc Mon Sep 17 00:00:00 2001 From: Andrey Date: Thu, 30 May 2024 16:18:39 +0200 Subject: [PATCH 21/33] Collect paymnt button and test order creation --- .../SelectPaymentMethodEvent.kt | 2 +- .../SelectPaymentMethodViewModel.kt | 2 +- .../cardreader/WooPosCardReaderActivity.kt | 5 ++ .../cardreader/WooPosCardReaderFacade.kt | 4 ++ .../cardreader/WooPosCardReaderViewModel.kt | 65 ++++++++++++++++++- .../ui/woopos/cart/WooPosCartNavigation.kt | 6 +- .../ui/woopos/cart/WooPosCartScreen.kt | 24 +++++-- .../android/ui/woopos/root/WooPosActivity.kt | 5 ++ .../root/navigation/WooPosMainFlowGraph.kt | 2 + .../woopos/root/navigation/WooPosRootHost.kt | 2 + 10 files changed, 106 insertions(+), 11 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodEvent.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodEvent.kt index b70e2ec4151..1ee654b579f 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodEvent.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodEvent.kt @@ -36,7 +36,7 @@ data class NavigateToOrderDetails( val orderId: Long ) : MultiLiveEvent.Event() -object NavigateBackToWooPos() : MultiLiveEvent.Event() +object NavigateBackToWooPos : MultiLiveEvent.Event() data class NavigateToTapToPaySummary( val order: Order diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodViewModel.kt index b483ea602a6..d0d312d7288 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodViewModel.kt @@ -452,7 +452,7 @@ class SelectPaymentMethodViewModel @Inject constructor( SIMPLE -> NavigateBackToHub(CardReadersHub()) TRY_TAP_TO_PAY -> NavigateToTapToPaySummary(order.first()) ORDER, ORDER_CREATION -> NavigateBackToOrderList(order.first()) - WOO_POS -> NavigateToWooPos(order.first().id) + WOO_POS -> NavigateBackToWooPos } ) } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt index 5a81c60cfd7..0a5ea3f3dd9 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt @@ -51,5 +51,10 @@ class WooPosCardReaderActivity : AppCompatActivity(R.layout.activity_woo_pos_car Intent(context, WooPosCardReaderActivity::class.java).apply { putExtra(WOO_POS_CARD_READER_MODE_KEY, WooPosCardReaderMode.Connection) } + + fun buildIntentForPayment(context: Context, orderId: Long) = + Intent(context, WooPosCardReaderActivity::class.java).apply { + putExtra(WOO_POS_CARD_READER_MODE_KEY, WooPosCardReaderMode.Payment(orderId)) + } } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderFacade.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderFacade.kt index a782957268d..2818c3f3cc8 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderFacade.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderFacade.kt @@ -14,4 +14,8 @@ class WooPosCardReaderFacade @Inject constructor( fun connectToReader(context: Context) { context.startActivity(WooPosCardReaderActivity.buildIntentForCardReaderConnection(context)) } + + fun collectPayment(context: Context, orderId: Long) { + context.startActivity(WooPosCardReaderActivity.buildIntentForPayment(context, orderId)) + } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderViewModel.kt index 75d0a49158e..2a3049ab7ec 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderViewModel.kt @@ -1,19 +1,34 @@ package com.woocommerce.android.ui.woopos.cardreader +import android.util.Log import androidx.lifecycle.SavedStateHandle +import com.woocommerce.android.R +import com.woocommerce.android.cardreader.config.CardReaderConfigForSupportedCountry +import com.woocommerce.android.model.Order +import com.woocommerce.android.tools.SelectedSite +import com.woocommerce.android.ui.orders.creation.OrderCreateEditRepository +import com.woocommerce.android.ui.payments.cardreader.CardReaderCountryConfigProvider import com.woocommerce.android.ui.payments.cardreader.onboarding.CardReaderFlowParam import com.woocommerce.android.ui.payments.cardreader.onboarding.CardReaderType import com.woocommerce.android.ui.woopos.cardreader.WooPosCardReaderActivity.Companion.WOO_POS_CARD_READER_MODE_KEY +import com.woocommerce.android.viewmodel.ResourceProvider import com.woocommerce.android.viewmodel.ScopedViewModel import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.launch +import org.wordpress.android.fluxc.store.WooCommerceStore import javax.inject.Inject @HiltViewModel class WooPosCardReaderViewModel @Inject constructor( - savedStateHandle: SavedStateHandle + private val orderCreateEditRepository: OrderCreateEditRepository, + private val resourceProvider: ResourceProvider, + private val cardReaderCountryConfigProvider: CardReaderCountryConfigProvider, + private val wooStore: WooCommerceStore, + private val selectedSite: SelectedSite, + savedStateHandle: SavedStateHandle, ) : ScopedViewModel(savedStateHandle) { init { - when (savedStateHandle.get(WOO_POS_CARD_READER_MODE_KEY)) { + when (val mode = savedStateHandle.get(WOO_POS_CARD_READER_MODE_KEY)) { is WooPosCardReaderMode.Connection -> { triggerEvent( WooPosCardReaderActivityEvent( @@ -23,9 +38,53 @@ class WooPosCardReaderViewModel @Inject constructor( ) } - is WooPosCardReaderMode.Payment -> error("Payment mode not implemented yet") + is WooPosCardReaderMode.Payment -> { + if (mode.orderId != -1L) { + val orderId = savedStateHandle.get(WooPosCardReaderMode.Payment::orderId.name)!! + startPaymentFlow(orderId) + } else { + launch { + createTestOrder( + onSuccess = { order -> + startPaymentFlow(order.id) + }, + onFailure = { + Log.e("WooPosCardReaderViewModel", "Failed to create test order") + } + ) + } + } + } null -> error("WooPosCardReaderMode not found in savedStateHandle") } } + + private fun startPaymentFlow(orderId: Long) { + triggerEvent( + WooPosCardReaderActivityEvent( + cardReaderFlowParam = CardReaderFlowParam.PaymentOrRefund.Payment( + orderId = orderId, + paymentType = CardReaderFlowParam.PaymentOrRefund.Payment.PaymentType.WOO_POS + ), + cardReaderType = CardReaderType.EXTERNAL + ) + ) + } + + private suspend fun createTestOrder(onSuccess: (Order) -> Unit, onFailure: () -> Unit) { + val countryConfig = cardReaderCountryConfigProvider.provideCountryConfigFor( + wooStore.getStoreCountryCode(selectedSite.get()) + ) as CardReaderConfigForSupportedCountry + + val result = orderCreateEditRepository.createSimplePaymentOrder( + countryConfig.minimumAllowedChargeAmount, + customerNote = resourceProvider.getString(R.string.card_reader_tap_to_pay_test_payment_note), + isTaxable = false, + ) + result.fold( + onSuccess = { onSuccess(it) }, + onFailure = { onFailure() } + ) + } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cart/WooPosCartNavigation.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cart/WooPosCartNavigation.kt index 6772de4ad46..d46fcf2cb3d 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cart/WooPosCartNavigation.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cart/WooPosCartNavigation.kt @@ -8,7 +8,8 @@ internal const val CART_ROUTE = "cart" internal fun NavGraphBuilder.cartScreen( onCheckoutClick: () -> Unit, - onConnectToCardReaderClicked: () -> Unit + onConnectToCardReaderClicked: () -> Unit, + onCollectPaymentWithCardReader: () -> Unit, ) { composable(CART_ROUTE) { val viewModel: WooPosCartViewModel = hiltViewModel() @@ -16,7 +17,8 @@ internal fun NavGraphBuilder.cartScreen( WooPosCartScreen( viewModel = viewModel, onCheckoutClick = onCheckoutClick, - onConnectToCardReaderClicked = onConnectToCardReaderClicked + onConnectToCardReaderClicked = onConnectToCardReaderClicked, + onCollectPaymentWithCardReader = onCollectPaymentWithCardReader, ) } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cart/WooPosCartScreen.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cart/WooPosCartScreen.kt index ba92031efc7..a2438aeb834 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cart/WooPosCartScreen.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cart/WooPosCartScreen.kt @@ -5,6 +5,7 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding import androidx.compose.material.Button import androidx.compose.material.MaterialTheme import androidx.compose.material.Text @@ -19,11 +20,13 @@ import com.woocommerce.android.ui.woopos.util.WooPosPreview fun WooPosCartScreen( viewModel: WooPosCartViewModel, onCheckoutClick: () -> Unit, - onConnectToCardReaderClicked: () -> Unit + onConnectToCardReaderClicked: () -> Unit, + onCollectPaymentWithCardReader: () -> Unit, ) { WooPosCartScreen( onCheckoutClick = onCheckoutClick, onConnectToCardReaderClicked = onConnectToCardReaderClicked, + onCollectPaymentWithCardReader = onCollectPaymentWithCardReader, ) } @@ -31,10 +34,13 @@ fun WooPosCartScreen( private fun WooPosCartScreen( onCheckoutClick: () -> Unit, onConnectToCardReaderClicked: () -> Unit, + onCollectPaymentWithCardReader: () -> Unit, ) { Box( - Modifier.fillMaxSize(), - contentAlignment = Alignment.Center + Modifier + .fillMaxSize() + .padding(32.dp), + contentAlignment = Alignment.CenterStart ) { Column { Text( @@ -51,6 +57,12 @@ private fun WooPosCartScreen( Button(onClick = onConnectToCardReaderClicked) { Text("Connect to Card Reader") } + + Spacer(modifier = Modifier.height(16.dp)) + + Button(onClick = onCollectPaymentWithCardReader) { + Text("Collect Payment with Card Reader") + } } } } @@ -58,5 +70,9 @@ private fun WooPosCartScreen( @Composable @WooPosPreview fun WooPosCartScreenPreview() { - WooPosCartScreen(onCheckoutClick = {}, onConnectToCardReaderClicked = {}) + WooPosCartScreen( + onCheckoutClick = {}, + onConnectToCardReaderClicked = {}, + onCollectPaymentWithCardReader = {}, + ) } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/WooPosActivity.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/WooPosActivity.kt index 8224af9431c..93ce8770999 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/WooPosActivity.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/WooPosActivity.kt @@ -31,6 +31,11 @@ class WooPosActivity : AppCompatActivity() { Toast.makeText(this@WooPosActivity, "Reader status: $it", Toast.LENGTH_SHORT).show() } } + }, + collectPaymentWithCardReader = { + lifecycleScope.launch { + wooPosCardReaderFacade.collectPayment(this@WooPosActivity, -1) + } } ) } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/navigation/WooPosMainFlowGraph.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/navigation/WooPosMainFlowGraph.kt index d6ae204bf04..aa1b881ca7e 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/navigation/WooPosMainFlowGraph.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/navigation/WooPosMainFlowGraph.kt @@ -14,6 +14,7 @@ const val MAIN_GRAPH_ROUTE = "main-graph" fun NavGraphBuilder.checkoutGraph( navController: NavController, onConnectToCardReaderClicked: (Context) -> Unit, + collectPaymentWithCardReader: (Context) -> Unit, ) { navigation( startDestination = CART_ROUTE, @@ -22,6 +23,7 @@ fun NavGraphBuilder.checkoutGraph( cartScreen( onCheckoutClick = navController::navigateToCheckoutScreen, onConnectToCardReaderClicked = { onConnectToCardReaderClicked(navController.context) }, + onCollectPaymentWithCardReader = { collectPaymentWithCardReader(navController.context) }, ) checkoutScreen( onBackClick = navController::popBackStack diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/navigation/WooPosRootHost.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/navigation/WooPosRootHost.kt index 802b9b68aaa..b578d21d479 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/navigation/WooPosRootHost.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/navigation/WooPosRootHost.kt @@ -8,6 +8,7 @@ import androidx.navigation.compose.rememberNavController @Composable fun WooPosRootHost( connectToCardReader: (context: Context) -> Unit, + collectPaymentWithCardReader: (context: Context) -> Unit, ) { val rootController = rememberNavController() @@ -22,6 +23,7 @@ fun WooPosRootHost( checkoutGraph( navController = rootController, onConnectToCardReaderClicked = { context -> connectToCardReader(context) }, + collectPaymentWithCardReader = { context -> collectPaymentWithCardReader(context) }, ) } } From ccdc8b4187f7f8bf431c297213125e8bdd8c757a Mon Sep 17 00:00:00 2001 From: Andrey Date: Thu, 30 May 2024 16:33:14 +0200 Subject: [PATCH 22/33] Small refactoring of the events. Setting the correct graph --- .../cardreader/WooPosCardReaderActivity.kt | 14 +++++++++- .../WooPosCardReaderActivityEvent.kt | 10 ------- .../WooPosCardReaderConnectionEvent.kt | 23 ++++++++++++++++ .../cardreader/WooPosCardReaderViewModel.kt | 26 +++---------------- 4 files changed, 39 insertions(+), 34 deletions(-) delete mode 100644 WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivityEvent.kt create mode 100644 WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderConnectionEvent.kt diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt index 0a5ea3f3dd9..3ceccbf4d7f 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt @@ -27,7 +27,7 @@ class WooPosCardReaderActivity : AppCompatActivity(R.layout.activity_woo_pos_car private fun observeEvents(navHostFragment: NavHostFragment) { viewModel.event.observe(this) { event -> when (event) { - is WooPosCardReaderActivityEvent -> { + is WooPosCardReaderEvent.Connection -> { val navController = navHostFragment.navController val graph = navController.navInflater.inflate(R.navigation.nav_graph_payment_flow).apply { setStartDestination(R.id.cardReaderStatusCheckerDialogFragment) @@ -40,6 +40,18 @@ class WooPosCardReaderActivity : AppCompatActivity(R.layout.activity_woo_pos_car ).toBundle() ) } + + is WooPosCardReaderEvent.Payment -> { + val navController = navHostFragment.navController + val graph = navController.navInflater.inflate(R.navigation.nav_graph_payment_flow) + navController.setGraph( + graph, + CardReaderStatusCheckerDialogFragmentArgs( + cardReaderFlowParam = event.cardReaderFlowParam, + cardReaderType = event.cardReaderType, + ).toBundle() + ) + } } } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivityEvent.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivityEvent.kt deleted file mode 100644 index 34ebb912821..00000000000 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivityEvent.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.woocommerce.android.ui.woopos.cardreader - -import com.woocommerce.android.ui.payments.cardreader.onboarding.CardReaderFlowParam -import com.woocommerce.android.ui.payments.cardreader.onboarding.CardReaderType -import com.woocommerce.android.viewmodel.MultiLiveEvent - -data class WooPosCardReaderActivityEvent( - val cardReaderFlowParam: CardReaderFlowParam, - val cardReaderType: CardReaderType, -) : MultiLiveEvent.Event() diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderConnectionEvent.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderConnectionEvent.kt new file mode 100644 index 00000000000..d6cc0704332 --- /dev/null +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderConnectionEvent.kt @@ -0,0 +1,23 @@ +package com.woocommerce.android.ui.woopos.cardreader + +import com.woocommerce.android.ui.payments.cardreader.onboarding.CardReaderFlowParam +import com.woocommerce.android.ui.payments.cardreader.onboarding.CardReaderType +import com.woocommerce.android.viewmodel.MultiLiveEvent + +sealed class WooPosCardReaderEvent( + val cardReaderFlowParam: CardReaderFlowParam, + val cardReaderType: CardReaderType +) : MultiLiveEvent.Event() { + data object Connection : WooPosCardReaderEvent( + cardReaderFlowParam = CardReaderFlowParam.WooPosConnection, + cardReaderType = CardReaderType.EXTERNAL + ) + + data class Payment(val orderId: Long) : WooPosCardReaderEvent( + cardReaderFlowParam = CardReaderFlowParam.PaymentOrRefund.Payment( + orderId = orderId, + paymentType = CardReaderFlowParam.PaymentOrRefund.Payment.PaymentType.WOO_POS + ), + cardReaderType = CardReaderType.EXTERNAL + ) +} diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderViewModel.kt index 2a3049ab7ec..adcfa5692e8 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderViewModel.kt @@ -8,8 +8,6 @@ import com.woocommerce.android.model.Order import com.woocommerce.android.tools.SelectedSite import com.woocommerce.android.ui.orders.creation.OrderCreateEditRepository import com.woocommerce.android.ui.payments.cardreader.CardReaderCountryConfigProvider -import com.woocommerce.android.ui.payments.cardreader.onboarding.CardReaderFlowParam -import com.woocommerce.android.ui.payments.cardreader.onboarding.CardReaderType import com.woocommerce.android.ui.woopos.cardreader.WooPosCardReaderActivity.Companion.WOO_POS_CARD_READER_MODE_KEY import com.woocommerce.android.viewmodel.ResourceProvider import com.woocommerce.android.viewmodel.ScopedViewModel @@ -30,23 +28,17 @@ class WooPosCardReaderViewModel @Inject constructor( init { when (val mode = savedStateHandle.get(WOO_POS_CARD_READER_MODE_KEY)) { is WooPosCardReaderMode.Connection -> { - triggerEvent( - WooPosCardReaderActivityEvent( - cardReaderFlowParam = CardReaderFlowParam.WooPosConnection, - cardReaderType = CardReaderType.EXTERNAL - ) - ) + triggerEvent(WooPosCardReaderEvent.Connection) } is WooPosCardReaderMode.Payment -> { if (mode.orderId != -1L) { - val orderId = savedStateHandle.get(WooPosCardReaderMode.Payment::orderId.name)!! - startPaymentFlow(orderId) + triggerEvent(WooPosCardReaderEvent.Payment(mode.orderId)) } else { launch { createTestOrder( onSuccess = { order -> - startPaymentFlow(order.id) + triggerEvent(WooPosCardReaderEvent.Payment(order.id)) }, onFailure = { Log.e("WooPosCardReaderViewModel", "Failed to create test order") @@ -60,18 +52,6 @@ class WooPosCardReaderViewModel @Inject constructor( } } - private fun startPaymentFlow(orderId: Long) { - triggerEvent( - WooPosCardReaderActivityEvent( - cardReaderFlowParam = CardReaderFlowParam.PaymentOrRefund.Payment( - orderId = orderId, - paymentType = CardReaderFlowParam.PaymentOrRefund.Payment.PaymentType.WOO_POS - ), - cardReaderType = CardReaderType.EXTERNAL - ) - ) - } - private suspend fun createTestOrder(onSuccess: (Order) -> Unit, onFailure: () -> Unit) { val countryConfig = cardReaderCountryConfigProvider.provideCountryConfigFor( wooStore.getStoreCountryCode(selectedSite.get()) From d3cee29087469a896f51715c633fe1b9aa2a61cc Mon Sep 17 00:00:00 2001 From: Andrey Date: Thu, 30 May 2024 17:01:13 +0200 Subject: [PATCH 23/33] Hack to hide ui of select payment method fragment --- .../methodselection/SelectPaymentMethodFragment.kt | 10 +++++++--- .../methodselection/SelectPaymentMethodViewModel.kt | 10 ++++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodFragment.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodFragment.kt index 7527fc76528..b113a677e66 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodFragment.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodFragment.kt @@ -58,10 +58,14 @@ class SelectPaymentMethodFragment : BaseFragment(R.layout.fragment_select_paymen inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View { + ): View? { _binding = FragmentSelectPaymentMethodBinding.inflate(inflater, container, false) - setupToolbar() - return binding.root + return if (viewModel.displayUi) { + setupToolbar() + binding.root + } else { + View(requireContext()) + } } private fun setupToolbar() { diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodViewModel.kt index d0d312d7288..16985cd4a2a 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodViewModel.kt @@ -88,6 +88,9 @@ class SelectPaymentMethodViewModel @Inject constructor( private val cardReaderPaymentFlowParam get() = navArgs.cardReaderFlowParam as Payment + val displayUi: Boolean + get() = isWooPOSPaymentFlow() + init { checkStatus() if (FeatureFlag.OTHER_PAYMENT_METHODS.isEnabled()) { @@ -124,6 +127,7 @@ class SelectPaymentMethodViewModel @Inject constructor( is Refund -> triggerEvent(NavigateToCardReaderRefundFlow(param, EXTERNAL)) } } + is WooPosConnection -> error("Unsupported card reader flow param: $param") } } @@ -482,6 +486,12 @@ class SelectPaymentMethodViewModel @Inject constructor( return currencyFormatter.formatCurrency(total, currencyCode) } + private fun isWooPOSPaymentFlow() = if (navArgs.cardReaderFlowParam is Payment) { + (navArgs.cardReaderFlowParam as Payment).paymentType != WOO_POS + } else { + true + } + companion object { private const val DELAY_MS = 1L const val UTM_CAMPAIGN = "feature_announcement_card" From 62c7f6cb273bafd9cb386d7db4930ed35902f834 Mon Sep 17 00:00:00 2001 From: Andrey Date: Thu, 30 May 2024 17:02:59 +0200 Subject: [PATCH 24/33] Fixed detekt complains --- ...ooPosCardReaderConnectionEvent.kt => WooPosCardReaderEvent.kt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/{WooPosCardReaderConnectionEvent.kt => WooPosCardReaderEvent.kt} (100%) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderConnectionEvent.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderEvent.kt similarity index 100% rename from WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderConnectionEvent.kt rename to WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderEvent.kt From 7f3fd8ec2ebe8b441ea6f43e953c9a311464459f Mon Sep 17 00:00:00 2001 From: Andrey Date: Fri, 31 May 2024 10:08:49 +0200 Subject: [PATCH 25/33] Pass result of the payment flow --- .../SelectPaymentMethodEvent.kt | 2 +- .../SelectPaymentMethodFragment.kt | 14 +++++++++- .../SelectPaymentMethodViewModel.kt | 2 +- .../cardreader/WooPosCardReaderActivity.kt | 26 ++++++++++++++++--- .../WooPosCardReaderPaymentResult.kt | 10 +++++++ .../cardreader/WooPosCardReaderViewModel.kt | 4 +++ 6 files changed, 51 insertions(+), 7 deletions(-) create mode 100644 WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderPaymentResult.kt diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodEvent.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodEvent.kt index 1ee654b579f..2de1cc5b53b 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodEvent.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodEvent.kt @@ -36,7 +36,7 @@ data class NavigateToOrderDetails( val orderId: Long ) : MultiLiveEvent.Event() -object NavigateBackToWooPos : MultiLiveEvent.Event() +object ReturnResultToWooPos : MultiLiveEvent.Event() data class NavigateToTapToPaySummary( val order: Order diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodFragment.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodFragment.kt index b113a677e66..b91ab3aebba 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodFragment.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodFragment.kt @@ -33,6 +33,8 @@ import com.woocommerce.android.ui.payments.methodselection.SelectPaymentMethodVi import com.woocommerce.android.ui.payments.methodselection.SelectPaymentMethodViewState.Success import com.woocommerce.android.ui.payments.scantopay.ScanToPayDialogFragment import com.woocommerce.android.ui.payments.taptopay.summary.TapToPaySummaryFragment +import com.woocommerce.android.ui.woopos.cardreader.WooPosCardReaderActivity +import com.woocommerce.android.ui.woopos.cardreader.WooPosCardReaderPaymentResult import com.woocommerce.android.util.ChromeCustomTabUtils import com.woocommerce.android.util.UiHelpers import com.woocommerce.android.viewmodel.MultiLiveEvent.Event.ShowDialog @@ -278,7 +280,17 @@ class SelectPaymentMethodFragment : BaseFragment(R.layout.fragment_select_paymen ) } - is NavigateBackToWooPos -> findNavController().popBackStack() + is ReturnResultToWooPos -> { + parentFragmentManager.setFragmentResult( + WooPosCardReaderActivity.WOO_POS_CARD_PAYMENT_REQUEST_KEY, + Bundle().apply { + putParcelable( + WooPosCardReaderActivity.WOO_POS_CARD_PAYMENT_RESULT_KEY, + WooPosCardReaderPaymentResult.Success, + ) + } + ) + } } } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodViewModel.kt index 16985cd4a2a..78109184a2c 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodViewModel.kt @@ -456,7 +456,7 @@ class SelectPaymentMethodViewModel @Inject constructor( SIMPLE -> NavigateBackToHub(CardReadersHub()) TRY_TAP_TO_PAY -> NavigateToTapToPaySummary(order.first()) ORDER, ORDER_CREATION -> NavigateBackToOrderList(order.first()) - WOO_POS -> NavigateBackToWooPos + WOO_POS -> ReturnResultToWooPos } ) } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt index 3ceccbf4d7f..0d41c3ce42d 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt @@ -7,6 +7,7 @@ import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity import androidx.navigation.fragment.NavHostFragment import com.woocommerce.android.R +import com.woocommerce.android.extensions.parcelable import com.woocommerce.android.ui.payments.cardreader.statuschecker.CardReaderStatusCheckerDialogFragmentArgs import dagger.hilt.android.AndroidEntryPoint @@ -22,6 +23,23 @@ class WooPosCardReaderActivity : AppCompatActivity(R.layout.activity_woo_pos_car ) as NavHostFragment observeEvents(navHostFragment) + observeResult(navHostFragment) + } + + private fun observeResult(navHostFragment: NavHostFragment) { + navHostFragment.childFragmentManager.setFragmentResultListener( + WOO_POS_CARD_PAYMENT_REQUEST_KEY, + this + ) { requestKey, bundle -> + when (requestKey) { + WOO_POS_CARD_PAYMENT_REQUEST_KEY -> { + val result = bundle.parcelable(WOO_POS_CARD_PAYMENT_RESULT_KEY) + viewModel.onPaymentResult(result!!) + } + + else -> error("Unknown request key: $requestKey") + } + } } private fun observeEvents(navHostFragment: NavHostFragment) { @@ -33,8 +51,7 @@ class WooPosCardReaderActivity : AppCompatActivity(R.layout.activity_woo_pos_car setStartDestination(R.id.cardReaderStatusCheckerDialogFragment) } navController.setGraph( - graph, - CardReaderStatusCheckerDialogFragmentArgs( + graph, CardReaderStatusCheckerDialogFragmentArgs( cardReaderFlowParam = event.cardReaderFlowParam, cardReaderType = event.cardReaderType, ).toBundle() @@ -45,8 +62,7 @@ class WooPosCardReaderActivity : AppCompatActivity(R.layout.activity_woo_pos_car val navController = navHostFragment.navController val graph = navController.navInflater.inflate(R.navigation.nav_graph_payment_flow) navController.setGraph( - graph, - CardReaderStatusCheckerDialogFragmentArgs( + graph, CardReaderStatusCheckerDialogFragmentArgs( cardReaderFlowParam = event.cardReaderFlowParam, cardReaderType = event.cardReaderType, ).toBundle() @@ -57,6 +73,8 @@ class WooPosCardReaderActivity : AppCompatActivity(R.layout.activity_woo_pos_car } companion object { + const val WOO_POS_CARD_PAYMENT_REQUEST_KEY = "woo_pos_card_payment_request" + const val WOO_POS_CARD_PAYMENT_RESULT_KEY = "woo_pos_card_payment_result" internal const val WOO_POS_CARD_READER_MODE_KEY = "card_reader_connection_mode" fun buildIntentForCardReaderConnection(context: Context) = diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderPaymentResult.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderPaymentResult.kt new file mode 100644 index 00000000000..1266ad8766a --- /dev/null +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderPaymentResult.kt @@ -0,0 +1,10 @@ +package com.woocommerce.android.ui.woopos.cardreader + +import android.os.Parcelable +import kotlinx.parcelize.Parcelize + +@Parcelize +sealed class WooPosCardReaderPaymentResult : Parcelable { + data object Success : WooPosCardReaderPaymentResult() + data object Failure : WooPosCardReaderPaymentResult() +} diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderViewModel.kt index adcfa5692e8..bc3361861ee 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderViewModel.kt @@ -67,4 +67,8 @@ class WooPosCardReaderViewModel @Inject constructor( onFailure = { onFailure() } ) } + + fun onPaymentResult(result: WooPosCardReaderPaymentResult) { + Log.e("WooPosCardReaderViewModel", "Payment result: $result") + } } From fc88cbfe410d02d56c52e426cc774c2b9c0b0c45 Mon Sep 17 00:00:00 2001 From: Andrey Date: Fri, 31 May 2024 11:18:22 +0200 Subject: [PATCH 26/33] Return result to the root activity via suspend function --- .../cardreader/WooPosCardReaderActivity.kt | 16 +++--- .../cardreader/WooPosCardReaderFacade.kt | 49 ++++++++++++++++--- .../cardreader/WooPosCardReaderViewModel.kt | 4 -- .../android/ui/woopos/root/WooPosActivity.kt | 7 ++- 4 files changed, 56 insertions(+), 20 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt index 0d41c3ce42d..f3b55970ef0 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt @@ -9,6 +9,7 @@ import androidx.navigation.fragment.NavHostFragment import com.woocommerce.android.R import com.woocommerce.android.extensions.parcelable import com.woocommerce.android.ui.payments.cardreader.statuschecker.CardReaderStatusCheckerDialogFragmentArgs +import com.woocommerce.android.ui.payments.methodselection.SelectPaymentMethodFragmentArgs import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint @@ -34,7 +35,11 @@ class WooPosCardReaderActivity : AppCompatActivity(R.layout.activity_woo_pos_car when (requestKey) { WOO_POS_CARD_PAYMENT_REQUEST_KEY -> { val result = bundle.parcelable(WOO_POS_CARD_PAYMENT_RESULT_KEY) - viewModel.onPaymentResult(result!!) + setResult( + RESULT_OK, + Intent().apply { putExtra(WOO_POS_CARD_PAYMENT_RESULT_KEY, result) } + ) + finish() } else -> error("Unknown request key: $requestKey") @@ -51,7 +56,8 @@ class WooPosCardReaderActivity : AppCompatActivity(R.layout.activity_woo_pos_car setStartDestination(R.id.cardReaderStatusCheckerDialogFragment) } navController.setGraph( - graph, CardReaderStatusCheckerDialogFragmentArgs( + graph, + CardReaderStatusCheckerDialogFragmentArgs( cardReaderFlowParam = event.cardReaderFlowParam, cardReaderType = event.cardReaderType, ).toBundle() @@ -62,10 +68,8 @@ class WooPosCardReaderActivity : AppCompatActivity(R.layout.activity_woo_pos_car val navController = navHostFragment.navController val graph = navController.navInflater.inflate(R.navigation.nav_graph_payment_flow) navController.setGraph( - graph, CardReaderStatusCheckerDialogFragmentArgs( - cardReaderFlowParam = event.cardReaderFlowParam, - cardReaderType = event.cardReaderType, - ).toBundle() + graph, + SelectPaymentMethodFragmentArgs(cardReaderFlowParam = event.cardReaderFlowParam).toBundle() ) } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderFacade.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderFacade.kt index 2818c3f3cc8..94c29d897e9 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderFacade.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderFacade.kt @@ -1,21 +1,54 @@ package com.woocommerce.android.ui.woopos.cardreader -import android.content.Context +import android.content.Intent +import androidx.activity.result.ActivityResultLauncher +import androidx.activity.result.contract.ActivityResultContracts +import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.DefaultLifecycleObserver +import androidx.lifecycle.LifecycleOwner import com.woocommerce.android.cardreader.CardReaderManager import com.woocommerce.android.cardreader.connection.CardReaderStatus +import com.woocommerce.android.util.parcelable import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.suspendCancellableCoroutine import javax.inject.Inject +import kotlin.coroutines.Continuation +import kotlin.coroutines.resume + +class WooPosCardReaderFacade @Inject constructor(cardReaderManager: CardReaderManager) : DefaultLifecycleObserver { + private var paymentContinuation: Continuation? = null + private var paymentResultLauncher: ActivityResultLauncher? = null + private var activity: AppCompatActivity? = null + + override fun onCreate(owner: LifecycleOwner) { + activity = owner as AppCompatActivity + paymentResultLauncher = activity?.registerForActivityResult( + ActivityResultContracts.StartActivityForResult() + ) { result -> + val paymentResult = result.data!!.parcelable( + WooPosCardReaderActivity.WOO_POS_CARD_PAYMENT_RESULT_KEY + ) + paymentContinuation?.resume(paymentResult!!) + } + } + + override fun onDestroy(owner: LifecycleOwner) { + super.onDestroy(owner) + activity = null + paymentContinuation = null + paymentResultLauncher = null + } -class WooPosCardReaderFacade @Inject constructor( - cardReaderManager: CardReaderManager, -) { val readerStatus: Flow = cardReaderManager.readerStatus - fun connectToReader(context: Context) { - context.startActivity(WooPosCardReaderActivity.buildIntentForCardReaderConnection(context)) + fun connectToReader() { + activity!!.startActivity(WooPosCardReaderActivity.buildIntentForCardReaderConnection(activity!!)) } - fun collectPayment(context: Context, orderId: Long) { - context.startActivity(WooPosCardReaderActivity.buildIntentForPayment(context, orderId)) + suspend fun collectPayment(orderId: Long): WooPosCardReaderPaymentResult { + return suspendCancellableCoroutine { continuation -> + paymentContinuation = continuation + paymentResultLauncher!!.launch(WooPosCardReaderActivity.buildIntentForPayment(activity!!, orderId)) + } } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderViewModel.kt index bc3361861ee..adcfa5692e8 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderViewModel.kt @@ -67,8 +67,4 @@ class WooPosCardReaderViewModel @Inject constructor( onFailure = { onFailure() } ) } - - fun onPaymentResult(result: WooPosCardReaderPaymentResult) { - Log.e("WooPosCardReaderViewModel", "Payment result: $result") - } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/WooPosActivity.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/WooPosActivity.kt index 93ce8770999..371494a63ce 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/WooPosActivity.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/WooPosActivity.kt @@ -19,12 +19,14 @@ class WooPosActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + lifecycle.addObserver(wooPosCardReaderFacade) + setContent { MaterialTheme { WooPosRootHost( connectToCardReader = { lifecycleScope.launch { - wooPosCardReaderFacade.connectToReader(this@WooPosActivity) + wooPosCardReaderFacade.connectToReader() } lifecycleScope.launch { wooPosCardReaderFacade.readerStatus.collect { @@ -34,7 +36,8 @@ class WooPosActivity : AppCompatActivity() { }, collectPaymentWithCardReader = { lifecycleScope.launch { - wooPosCardReaderFacade.collectPayment(this@WooPosActivity, -1) + val result = wooPosCardReaderFacade.collectPayment(-1) + Toast.makeText(this@WooPosActivity, "Payment result: $result", Toast.LENGTH_SHORT).show() } } ) From 30de778c09f02260d261d4bf5d72393451aa8d90 Mon Sep 17 00:00:00 2001 From: Andrey Date: Fri, 31 May 2024 11:39:01 +0200 Subject: [PATCH 27/33] Crash if activity is null --- .../android/ui/woopos/cardreader/WooPosCardReaderFacade.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderFacade.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderFacade.kt index 94c29d897e9..a32c2f70d5f 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderFacade.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderFacade.kt @@ -22,7 +22,7 @@ class WooPosCardReaderFacade @Inject constructor(cardReaderManager: CardReaderMa override fun onCreate(owner: LifecycleOwner) { activity = owner as AppCompatActivity - paymentResultLauncher = activity?.registerForActivityResult( + paymentResultLauncher = activity!!.registerForActivityResult( ActivityResultContracts.StartActivityForResult() ) { result -> val paymentResult = result.data!!.parcelable( From 8dfeb550aacd3465577c58cdd9ac48c1e227e4e0 Mon Sep 17 00:00:00 2001 From: Andrey Date: Fri, 31 May 2024 12:04:55 +0200 Subject: [PATCH 28/33] Finish activity after the flow is finished --- WooCommerce/src/main/AndroidManifest.xml | 3 ++- .../connect/CardReaderConnectDialogFragment.kt | 8 +++++++- .../tutorial/CardReaderTutorialDialogFragment.kt | 8 +++++++- .../woopos/cardreader/WooPosCardReaderActivity.kt | 14 ++++++++++++++ 4 files changed, 30 insertions(+), 3 deletions(-) diff --git a/WooCommerce/src/main/AndroidManifest.xml b/WooCommerce/src/main/AndroidManifest.xml index 98bd6aa2dfb..aece3b5a748 100644 --- a/WooCommerce/src/main/AndroidManifest.xml +++ b/WooCommerce/src/main/AndroidManifest.xml @@ -163,7 +163,8 @@ - diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/connect/CardReaderConnectDialogFragment.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/connect/CardReaderConnectDialogFragment.kt index 5989a4af964..1b2a4bbef3f 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/connect/CardReaderConnectDialogFragment.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/connect/CardReaderConnectDialogFragment.kt @@ -41,6 +41,7 @@ import com.woocommerce.android.ui.payments.cardreader.connect.CardReaderConnectE import com.woocommerce.android.ui.payments.cardreader.connect.adapter.MultipleCardReadersFoundAdapter import com.woocommerce.android.ui.payments.cardreader.update.CardReaderUpdateDialogFragment import com.woocommerce.android.ui.payments.cardreader.update.CardReaderUpdateViewModel.UpdateResult +import com.woocommerce.android.ui.woopos.cardreader.WooPosCardReaderActivity import com.woocommerce.android.util.ChromeCustomTabUtils import com.woocommerce.android.util.LocationUtils import com.woocommerce.android.util.UiHelpers @@ -244,7 +245,12 @@ class CardReaderConnectDialogFragment : PaymentsBaseDialogFragment(R.layout.card result = event.data as Boolean, ) } - is CardReaderConnectEvent.PopBackStackForWooPOS -> findNavController().popBackStack() + is CardReaderConnectEvent.PopBackStackForWooPOS -> { + parentFragmentManager.setFragmentResult( + WooPosCardReaderActivity.WOO_POS_CARD_CONNECTION_REQUEST_KEY, + Bundle(), + ) + } is CardReaderConnectEvent.ShowToast -> ToastUtils.showToast(requireContext(), getString(event.message)) is CardReaderConnectEvent.ShowToastString -> diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/tutorial/CardReaderTutorialDialogFragment.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/tutorial/CardReaderTutorialDialogFragment.kt index 73951c436c6..5086dbbb075 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/tutorial/CardReaderTutorialDialogFragment.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/tutorial/CardReaderTutorialDialogFragment.kt @@ -15,6 +15,7 @@ import com.woocommerce.android.extensions.navigateSafely import com.woocommerce.android.ui.payments.PaymentsBaseDialogFragment import com.woocommerce.android.ui.payments.cardreader.onboarding.CardReaderFlowParam import com.woocommerce.android.ui.payments.cardreader.onboarding.CardReaderType.BUILT_IN +import com.woocommerce.android.ui.woopos.cardreader.WooPosCardReaderActivity import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject @@ -59,7 +60,12 @@ class CardReaderTutorialDialogFragment : PaymentsBaseDialogFragment(R.layout.car private fun navigateNext() { when (val param = args.cardReaderFlowParam) { is CardReaderFlowParam.CardReadersHub, - is CardReaderFlowParam.WooPosConnection -> findNavController().popBackStack() + is CardReaderFlowParam.WooPosConnection -> { + parentFragmentManager.setFragmentResult( + WooPosCardReaderActivity.WOO_POS_CARD_CONNECTION_REQUEST_KEY, + Bundle(), + ) + } is CardReaderFlowParam.PaymentOrRefund -> { val action = CardReaderTutorialDialogFragmentDirections .actionCardReaderTutorialDialogFragmentToCardReaderPaymentDialogFragment(param, args.cardReaderType) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt index f3b55970ef0..9555e130e85 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderActivity.kt @@ -45,6 +45,19 @@ class WooPosCardReaderActivity : AppCompatActivity(R.layout.activity_woo_pos_car else -> error("Unknown request key: $requestKey") } } + + navHostFragment.childFragmentManager.setFragmentResultListener( + WOO_POS_CARD_CONNECTION_REQUEST_KEY, + this + ) { requestKey, _ -> + when (requestKey) { + WOO_POS_CARD_CONNECTION_REQUEST_KEY -> { + finish() + } + + else -> error("Unknown request key: $requestKey") + } + } } private fun observeEvents(navHostFragment: NavHostFragment) { @@ -78,6 +91,7 @@ class WooPosCardReaderActivity : AppCompatActivity(R.layout.activity_woo_pos_car companion object { const val WOO_POS_CARD_PAYMENT_REQUEST_KEY = "woo_pos_card_payment_request" + const val WOO_POS_CARD_CONNECTION_REQUEST_KEY = "woo_pos_card_connection_request" const val WOO_POS_CARD_PAYMENT_RESULT_KEY = "woo_pos_card_payment_result" internal const val WOO_POS_CARD_READER_MODE_KEY = "card_reader_connection_mode" From b736ee9c94cfa714ba11bf8cc6b28cce450b7782 Mon Sep 17 00:00:00 2001 From: Andrey Date: Mon, 3 Jun 2024 16:16:13 +0200 Subject: [PATCH 29/33] Fixed naming and simplified the condition --- .../methodselection/SelectPaymentMethodViewModel.kt | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodViewModel.kt index f08f12e8a0a..3a5ff92f5e1 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodViewModel.kt @@ -89,7 +89,7 @@ class SelectPaymentMethodViewModel @Inject constructor( get() = navArgs.cardReaderFlowParam as Payment val displayUi: Boolean - get() = isWooPOSPaymentFlow() + get() = !isWooPOSPaymentFlow() init { checkStatus() @@ -483,10 +483,8 @@ class SelectPaymentMethodViewModel @Inject constructor( return currencyFormatter.formatCurrency(total, currencyCode) } - private fun isWooPOSPaymentFlow() = if (navArgs.cardReaderFlowParam is Payment) { - (navArgs.cardReaderFlowParam as Payment).paymentType != WOO_POS - } else { - true + private fun isWooPOSPaymentFlow() = with(navArgs.cardReaderFlowParam) { + this is Payment && paymentType == WOO_POS } companion object { From 60a3f10b8f0004101f4ac0d1d804a8143188fa7a Mon Sep 17 00:00:00 2001 From: Andrey Date: Mon, 3 Jun 2024 16:18:29 +0200 Subject: [PATCH 30/33] View is not nullable Co-authored-by: Samuel Urbanowicz --- .../ui/payments/methodselection/SelectPaymentMethodFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodFragment.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodFragment.kt index d62aaa12c8e..bfe9fb3ed06 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodFragment.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodFragment.kt @@ -61,7 +61,7 @@ class SelectPaymentMethodFragment : BaseFragment(R.layout.fragment_select_paymen inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View? { + ): View { _binding = FragmentSelectPaymentMethodBinding.inflate(inflater, container, false) return if (viewModel.displayUi) { setupToolbar() From fe06a4ead9e06cdae0ae07cb253daab93fa7c1a1 Mon Sep 17 00:00:00 2001 From: Andrey Date: Mon, 3 Jun 2024 16:18:47 +0200 Subject: [PATCH 31/33] Removed redundant super call Co-authored-by: Samuel Urbanowicz --- .../android/ui/woopos/cardreader/WooPosCardReaderFacade.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderFacade.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderFacade.kt index a32c2f70d5f..3bf22888c15 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderFacade.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderFacade.kt @@ -33,7 +33,6 @@ class WooPosCardReaderFacade @Inject constructor(cardReaderManager: CardReaderMa } override fun onDestroy(owner: LifecycleOwner) { - super.onDestroy(owner) activity = null paymentContinuation = null paymentResultLauncher = null From f56268aea6efb80d4a6d8ca258f69fd5fe421191 Mon Sep 17 00:00:00 2001 From: Andrey Date: Mon, 3 Jun 2024 16:20:44 +0200 Subject: [PATCH 32/33] Reader status to the up pf the class --- .../android/ui/woopos/cardreader/WooPosCardReaderFacade.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderFacade.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderFacade.kt index a32c2f70d5f..88f6206918f 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderFacade.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderFacade.kt @@ -20,6 +20,8 @@ class WooPosCardReaderFacade @Inject constructor(cardReaderManager: CardReaderMa private var paymentResultLauncher: ActivityResultLauncher? = null private var activity: AppCompatActivity? = null + val readerStatus: Flow = cardReaderManager.readerStatus + override fun onCreate(owner: LifecycleOwner) { activity = owner as AppCompatActivity paymentResultLauncher = activity!!.registerForActivityResult( @@ -39,8 +41,6 @@ class WooPosCardReaderFacade @Inject constructor(cardReaderManager: CardReaderMa paymentResultLauncher = null } - val readerStatus: Flow = cardReaderManager.readerStatus - fun connectToReader() { activity!!.startActivity(WooPosCardReaderActivity.buildIntentForCardReaderConnection(activity!!)) } From e0dbb5b409471bfb8958f3574aeb0616ac1b18e2 Mon Sep 17 00:00:00 2001 From: Andrey Date: Mon, 3 Jun 2024 16:42:36 +0200 Subject: [PATCH 33/33] Fixed broken back navigation from tutorial fragment --- .../cardreader/tutorial/CardReaderTutorialDialogFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/tutorial/CardReaderTutorialDialogFragment.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/tutorial/CardReaderTutorialDialogFragment.kt index 5086dbbb075..a133fe5aada 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/tutorial/CardReaderTutorialDialogFragment.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/tutorial/CardReaderTutorialDialogFragment.kt @@ -59,7 +59,7 @@ class CardReaderTutorialDialogFragment : PaymentsBaseDialogFragment(R.layout.car private fun navigateNext() { when (val param = args.cardReaderFlowParam) { - is CardReaderFlowParam.CardReadersHub, + is CardReaderFlowParam.CardReadersHub -> findNavController().popBackStack() is CardReaderFlowParam.WooPosConnection -> { parentFragmentManager.setFragmentResult( WooPosCardReaderActivity.WOO_POS_CARD_CONNECTION_REQUEST_KEY,