diff --git a/WooCommerce/src/main/AndroidManifest.xml b/WooCommerce/src/main/AndroidManifest.xml
index 8969e4cfb5a..6e75c9bba77 100644
--- a/WooCommerce/src/main/AndroidManifest.xml
+++ b/WooCommerce/src/main/AndroidManifest.xml
@@ -14,8 +14,10 @@
-
-
+
+
@@ -47,16 +49,17 @@
+ android:windowSoftInputMode="adjustResize">
-
@@ -65,19 +68,20 @@
-
+
-
+
-
-
-
-
+
+
+
+
-
+
+
@@ -94,15 +98,15 @@
-
-
+
+
+ android:exported="true"
+ android:theme="@style/LoginTheme">
@@ -155,7 +159,8 @@
+ tools:replace="android:screenOrientation" />
+
+ android:exported="false"
+ android:permission="android.permission.BIND_JOB_SERVICE" />
-
+
-
-
+
diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/moremenu/MoreMenuFragment.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/moremenu/MoreMenuFragment.kt
index 9cdf4192c7a..d26af1b66ea 100644
--- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/moremenu/MoreMenuFragment.kt
+++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/moremenu/MoreMenuFragment.kt
@@ -1,5 +1,6 @@
package com.woocommerce.android.ui.moremenu
+import android.content.Intent
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
@@ -20,6 +21,7 @@ import com.woocommerce.android.ui.main.AppBarStatus
import com.woocommerce.android.ui.main.MainActivity
import com.woocommerce.android.ui.moremenu.MoreMenuViewModel.MoreMenuEvent.NavigateToSettingsEvent
import com.woocommerce.android.ui.moremenu.MoreMenuViewModel.MoreMenuEvent.NavigateToSubscriptionsEvent
+import com.woocommerce.android.ui.moremenu.MoreMenuViewModel.MoreMenuEvent.NavigateToWooPosEvent
import com.woocommerce.android.ui.moremenu.MoreMenuViewModel.MoreMenuEvent.OpenBlazeCampaignCreationEvent
import com.woocommerce.android.ui.moremenu.MoreMenuViewModel.MoreMenuEvent.OpenBlazeCampaignListEvent
import com.woocommerce.android.ui.moremenu.MoreMenuViewModel.MoreMenuEvent.StartSitePickerEvent
@@ -30,6 +32,7 @@ import com.woocommerce.android.ui.moremenu.MoreMenuViewModel.MoreMenuEvent.ViewP
import com.woocommerce.android.ui.moremenu.MoreMenuViewModel.MoreMenuEvent.ViewReviewsEvent
import com.woocommerce.android.ui.moremenu.MoreMenuViewModel.MoreMenuEvent.ViewStoreEvent
import com.woocommerce.android.ui.payments.cardreader.onboarding.CardReaderFlowParam
+import com.woocommerce.android.ui.woopos.root.WooPosActivity
import com.woocommerce.android.util.ChromeCustomTabUtils
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch
@@ -99,9 +102,15 @@ class MoreMenuFragment : TopLevelFragment() {
is ViewPayments -> navigateToPayments()
is OpenBlazeCampaignCreationEvent -> openBlazeCreationFlow()
is OpenBlazeCampaignListEvent -> openBlazeCampaignList()
+ is NavigateToWooPosEvent -> openWooPos()
}
}
}
+
+ private fun openWooPos() {
+ startActivity(Intent(requireContext(), WooPosActivity::class.java))
+ }
+
private fun openBlazeCampaignList() {
findNavController().navigateSafely(
MoreMenuFragmentDirections.actionMoreMenuToBlazeCampaignListFragment()
diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/moremenu/MoreMenuViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/moremenu/MoreMenuViewModel.kt
index 3736c1aa4fa..81b54b2e4ce 100644
--- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/moremenu/MoreMenuViewModel.kt
+++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/moremenu/MoreMenuViewModel.kt
@@ -28,6 +28,7 @@ import com.woocommerce.android.ui.payments.taptopay.TapToPayAvailabilityStatus
import com.woocommerce.android.ui.payments.taptopay.isAvailable
import com.woocommerce.android.ui.plans.domain.SitePlan
import com.woocommerce.android.ui.plans.repository.SitePlanRepository
+import com.woocommerce.android.ui.woopos.IsWooPosEnabled
import com.woocommerce.android.viewmodel.MultiLiveEvent
import com.woocommerce.android.viewmodel.ResourceProvider
import com.woocommerce.android.viewmodel.ScopedViewModel
@@ -57,6 +58,7 @@ class MoreMenuViewModel @Inject constructor(
private val moreMenuNewFeatureHandler: MoreMenuNewFeatureHandler,
private val tapToPayAvailabilityStatus: TapToPayAvailabilityStatus,
private val isBlazeEnabled: IsBlazeEnabled,
+ private val isWooPosEnabled: IsWooPosEnabled,
) : ScopedViewModel(savedState) {
val moreMenuViewState =
combine(
@@ -133,6 +135,15 @@ class MoreMenuViewModel @Inject constructor(
icon = R.drawable.ic_more_menu_inbox,
isEnabled = moreMenuRepository.isInboxEnabled(),
onClick = ::onInboxButtonClick
+ ),
+ MenuUiButton(
+ title = R.string.more_menu_button_woo_pos,
+ description = R.string.more_menu_button_woo_pos_description,
+ icon = R.drawable.ic_more_menu_payments,
+ isEnabled = isWooPosEnabled(),
+ onClick = {
+ triggerEvent(MoreMenuEvent.NavigateToWooPosEvent)
+ }
)
)
@@ -316,5 +327,6 @@ class MoreMenuViewModel @Inject constructor(
object ViewReviewsEvent : MoreMenuEvent()
object ViewInboxEvent : MoreMenuEvent()
object ViewCouponsEvent : MoreMenuEvent()
+ object NavigateToWooPosEvent : MoreMenuEvent()
}
}
diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/IsWooPosEnabled.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/IsWooPosEnabled.kt
new file mode 100644
index 00000000000..9e7ef857473
--- /dev/null
+++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/IsWooPosEnabled.kt
@@ -0,0 +1,8 @@
+package com.woocommerce.android.ui.woopos
+
+import com.woocommerce.android.util.FeatureFlag
+import javax.inject.Inject
+
+class IsWooPosEnabled @Inject constructor() {
+ operator fun invoke() = FeatureFlag.WOO_POS.isEnabled()
+}
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
new file mode 100644
index 00000000000..274c599943b
--- /dev/null
+++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/WooPosActivity.kt
@@ -0,0 +1,29 @@
+package com.woocommerce.android.ui.woopos.root
+
+import android.os.Bundle
+import androidx.activity.compose.setContent
+import androidx.appcompat.app.AppCompatActivity
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.material.MaterialTheme
+import androidx.compose.material.Text
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+
+class WooPosActivity : AppCompatActivity() {
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContent {
+ Box(
+ Modifier.fillMaxSize(),
+ contentAlignment = Alignment.Center
+ ) {
+ Text(
+ text = "Woo POS!",
+ style = MaterialTheme.typography.h3,
+ color = MaterialTheme.colors.primary,
+ )
+ }
+ }
+ }
+}
diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/util/FeatureFlag.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/util/FeatureFlag.kt
index 261cffa4e29..8a6db970eff 100644
--- a/WooCommerce/src/main/kotlin/com/woocommerce/android/util/FeatureFlag.kt
+++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/util/FeatureFlag.kt
@@ -6,6 +6,7 @@ import android.content.Context
* "Feature flags" are used to hide in-progress features from release versions
*/
enum class FeatureFlag {
+ WOO_POS,
DB_DOWNGRADE,
MORE_MENU_INBOX,
WC_SHIPPING_BANNER,
@@ -28,6 +29,7 @@ enum class FeatureFlag {
OTHER_PAYMENT_METHODS,
MORE_MENU_INBOX,
+ WOO_POS,
WC_SHIPPING_BANNER,
BETTER_CUSTOMER_SEARCH_M2,
ORDER_CREATION_AUTO_TAX_RATE,
diff --git a/WooCommerce/src/main/res/values/strings.xml b/WooCommerce/src/main/res/values/strings.xml
index 1aa7cfaea3d..2a0023651b1 100644
--- a/WooCommerce/src/main/res/values/strings.xml
+++ b/WooCommerce/src/main/res/values/strings.xml
@@ -3660,6 +3660,9 @@
Settings
Update your preferences
+ Woo Pos
+ Temporary entry point to POS mode
+
diff --git a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/moremenu/MoreMenuViewModelTests.kt b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/moremenu/MoreMenuViewModelTests.kt
index 7e0dbb0e4b6..e92b4c183bc 100644
--- a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/moremenu/MoreMenuViewModelTests.kt
+++ b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/moremenu/MoreMenuViewModelTests.kt
@@ -9,6 +9,7 @@ import com.woocommerce.android.ui.moremenu.domain.MoreMenuRepository
import com.woocommerce.android.ui.payments.taptopay.TapToPayAvailabilityStatus
import com.woocommerce.android.ui.plans.domain.SitePlan
import com.woocommerce.android.ui.plans.repository.SitePlanRepository
+import com.woocommerce.android.ui.woopos.IsWooPosEnabled
import com.woocommerce.android.util.captureValues
import com.woocommerce.android.util.runAndCaptureValues
import com.woocommerce.android.viewmodel.BaseUnitTest
@@ -72,6 +73,9 @@ class MoreMenuViewModelTests : BaseUnitTest() {
private val isBlazeEnabled: IsBlazeEnabled = mock {
onBlocking { invoke() } doReturn true
}
+ private val isWooPosEnabled: IsWooPosEnabled = mock {
+ on { invoke() } doReturn true
+ }
private val blazeCampaignsStore: BlazeCampaignsStore = mock()
@@ -92,6 +96,7 @@ class MoreMenuViewModelTests : BaseUnitTest() {
blazeCampaignsStore = blazeCampaignsStore,
tapToPayAvailabilityStatus = tapToPayAvailabilityStatus,
isBlazeEnabled = isBlazeEnabled,
+ isWooPosEnabled = isWooPosEnabled,
)
}
@@ -402,4 +407,35 @@ class MoreMenuViewModelTests : BaseUnitTest() {
assertThat(event).isEqualTo(MoreMenuViewModel.MoreMenuEvent.OpenBlazeCampaignListEvent)
}
+
+ @Test
+ fun `given isWooPosEnabled returns false, when building state, then WooPOS button is not displayed`() =
+ testBlocking {
+ // GIVEN
+ setup {
+ whenever(isWooPosEnabled.invoke()).thenReturn(false)
+ }
+
+ // WHEN
+ val states = viewModel.moreMenuViewState.captureValues()
+
+ // THEN
+ assertThat(states.last().generalMenuItems.first { it.title == R.string.more_menu_button_woo_pos }.isEnabled)
+ .isFalse()
+ }
+
+ @Test
+ fun `given isWooPosEnabled returns true, when building state, then WooPOS button is displayed`() = testBlocking {
+ // GIVEN
+ setup {
+ whenever(isWooPosEnabled.invoke()).thenReturn(true)
+ }
+
+ // WHEN
+ val states = viewModel.moreMenuViewState.captureValues()
+
+ // THEN
+ assertThat(states.last().generalMenuItems.first { it.title == R.string.more_menu_button_woo_pos }.isEnabled)
+ .isTrue()
+ }
}