Skip to content

Commit

Permalink
Merge branch 'trunk' into 12676-whats-new-dialog-is-too-narrow-on-a-t…
Browse files Browse the repository at this point in the history
…ablet
  • Loading branch information
kidinov authored Oct 1, 2024
2 parents 9b74c5b + ed9b240 commit 788a384
Show file tree
Hide file tree
Showing 122 changed files with 4,235 additions and 3,289 deletions.
68 changes: 0 additions & 68 deletions .buildkite/commands/dependency-tree-diff.sh

This file was deleted.

4 changes: 3 additions & 1 deletion .buildkite/pipeline.yml
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,11 @@ steps:
- label: "Dependency Tree Diff"
command: |
cp gradle.properties-example gradle.properties
.buildkite/commands/dependency-tree-diff.sh
comment_with_dependency_diff 'woocommerce' 'vanillaReleaseRuntimeClasspath'
if: build.pull_request.id != null
plugins: [$CI_TOOLKIT]
artifact_paths:
- "**/build/reports/diff/*"

########################################
- group: "🛠 Prototype Builds"
Expand Down
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
<!--
Contains editorialized release notes. Raw release notes should go into `RELEASE-NOTES.txt`.
-->
## 20.6
We're excited to bring you new features in our WooCommerce app! Users can now set a password to protect products when signed in with site credentials, enhancing security for WooCommerce 8.1.0 and above. Also, promoting a Blaze product from the campaign detail will now trigger a smoother native flow. Enjoy the updates!

## 20.5
We’re excited to bring you a smoother experience with our latest update! We've resolved an issue that prevented renaming Product Variation Attributes and fixed a bug related to notification removal. Plus, users can now easily select product images when creating Blaze ads, and the Blaze feature is now fully enabled for sites with the Blaze for WooCommerce plugin active. Enjoy the improvements!

Expand Down
7 changes: 7 additions & 0 deletions RELEASE-NOTES.txt
Original file line number Diff line number Diff line change
@@ -1,10 +1,17 @@
*** PLEASE FOLLOW THIS FORMAT: [<priority indicator, more stars = higher priority>] <description> [<PR URL>]
*** Use [*****] to indicate smoke tests of all critical flows should be run on the final APK before release (e.g. major library or targetSdk updates).
*** For entries which are touching the Android Wear app's, start entry with `[WEAR]` too.
20.7
-----
- [**] Improve barcode scanner reading accuracy [https://github.com/woocommerce/woocommerce-android/pull/12673]
- [*] [Login] Fix an issue where the app doesn't show the correct error screen when application passwords are disabled [https://github.com/woocommerce/woocommerce-android/pull/12717]
- [**] Fixed bug with coupons disappearing from the order creation screen unexpectedly [https://github.com/woocommerce/woocommerce-android/pull/12724]

20.6
-----
- [*] Users can set a password to protect products when signed in using site credentials (compatible with WooCommerce 8.1.0 and higher) [https://github.com/woocommerce/woocommerce-android/pull/12642]
- [*] [Internal] Revert the UserAgent ANR fix to confirm if it's causing the WebView related crash [https://github.com/woocommerce/woocommerce-android/pull/12697]
- [*] When promoting a Blaze product from campaign detail webview, the native flow will be triggered [https://github.com/woocommerce/woocommerce-android/pull/12648]

20.5
-----
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ class AppConfigModule {
fun provideAppSecrets() = AppSecrets(BuildConfig.OAUTH_APP_ID, BuildConfig.OAUTH_APP_SECRET)

@Provides
@Singleton
fun provideUserAgent(appContext: Context) = UserAgent(appContext, USER_AGENT_APPNAME)

@Provides
Expand Down
Original file line number Diff line number Diff line change
@@ -1,28 +1,28 @@
package com.woocommerce.android.wear.ui

import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.pager.rememberPagerState
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.navigation.NavController
import com.google.android.horologist.compose.pager.PagerScreen
import com.woocommerce.android.wear.ui.orders.list.OrdersListScreen
import com.woocommerce.android.wear.ui.orders.list.OrdersListViewModel
import com.woocommerce.android.wear.ui.stats.StoreStatsScreen
import com.woocommerce.android.wear.ui.stats.StoreStatsViewModel

@OptIn(ExperimentalFoundationApi::class)
@Composable
fun MyStoreScreen(
storeStatsViewModel: StoreStatsViewModel,
ordersListViewModel: OrdersListViewModel
navController: NavController
) {
val pageState = rememberPagerState(pageCount = { 2 })
PagerScreen(
state = pageState,
modifier = Modifier.fillMaxSize()
) { page ->
when (page) {
STATS_PAGE -> StoreStatsScreen(viewModel = storeStatsViewModel)
ORDERS_PAGE -> OrdersListScreen(viewModel = ordersListViewModel)
STATS_PAGE -> StoreStatsScreen()
ORDERS_PAGE -> OrdersListScreen(navController = navController)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,8 @@ import com.woocommerce.android.wear.ui.NavRoutes.LOGIN
import com.woocommerce.android.wear.ui.NavRoutes.MY_STORE
import com.woocommerce.android.wear.ui.NavRoutes.ORDER_DETAILS
import com.woocommerce.android.wear.ui.login.LoginScreen
import com.woocommerce.android.wear.ui.login.LoginViewModel
import com.woocommerce.android.wear.ui.orders.details.OrderDetailsScreen
import com.woocommerce.android.wear.ui.orders.details.OrderDetailsViewModel
import com.woocommerce.android.wear.ui.orders.list.OrdersListViewModel
import com.woocommerce.android.wear.ui.stats.StoreStatsViewModel

@Composable
fun WooWearNavHost(
Expand All @@ -29,20 +26,10 @@ fun WooWearNavHost(
startDestination = startDestination
) {
composable(LOGIN.route) {
val viewModel: LoginViewModel = hiltViewModel<LoginViewModel, LoginViewModel.Factory> {
it.create(navController)
}
LoginScreen(viewModel)
LoginScreen(navController)
}
composable(MY_STORE.route) {
val storeStatsViewModel = hiltViewModel<StoreStatsViewModel>()
val ordersListViewModel = hiltViewModel<OrdersListViewModel, OrdersListViewModel.Factory> {
it.create(navController)
}
MyStoreScreen(
storeStatsViewModel = storeStatsViewModel,
ordersListViewModel = ordersListViewModel
)
MyStoreScreen(navController)
}
composable(
route = ORDER_DETAILS.withArgs(ORDER_ID),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,10 @@ package com.woocommerce.android.wear.ui.login

import com.woocommerce.android.wear.extensions.combineWithTimeout
import com.woocommerce.android.wear.phone.PhoneConnectionRepository
import com.woocommerce.android.wear.ui.login.FetchSiteData.LoginRequestState.Logged
import com.woocommerce.android.wear.ui.login.FetchSiteData.LoginRequestState.Timeout
import com.woocommerce.android.wear.ui.login.FetchSiteData.LoginRequestState.Waiting
import com.woocommerce.android.wear.ui.login.LoginViewModel.LoginState
import com.woocommerce.android.wear.ui.login.LoginViewModel.LoginState.Logged
import com.woocommerce.android.wear.ui.login.LoginViewModel.LoginState.Timeout
import com.woocommerce.android.wear.ui.login.LoginViewModel.LoginState.Waiting
import com.woocommerce.commons.MessagePath.REQUEST_APP_SETTINGS
import com.woocommerce.commons.MessagePath.REQUEST_SITE
import kotlinx.coroutines.flow.Flow
Expand All @@ -14,7 +15,7 @@ class FetchSiteData @Inject constructor(
private val phoneRepository: PhoneConnectionRepository,
private val loginRepository: LoginRepository
) {
suspend operator fun invoke(): Flow<LoginRequestState> {
suspend operator fun invoke(): Flow<LoginState> {
if (phoneRepository.isPhoneConnectionAvailable()) {
phoneRepository.sendMessage(REQUEST_APP_SETTINGS)
phoneRepository.sendMessage(REQUEST_SITE)
Expand All @@ -29,10 +30,4 @@ class FetchSiteData @Inject constructor(
}
}
}

enum class LoginRequestState {
Logged,
Waiting,
Timeout
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.navigation.NavController
import androidx.navigation.compose.rememberNavController
import androidx.wear.compose.material.Button
import androidx.wear.compose.material.ButtonDefaults
import androidx.wear.compose.material.Text
Expand All @@ -31,19 +34,28 @@ import androidx.wear.tooling.preview.devices.WearDevices
import com.woocommerce.android.R
import com.woocommerce.android.wear.compose.theme.WooTheme
import com.woocommerce.android.wear.compose.theme.WooTypography
import com.woocommerce.android.wear.ui.NavRoutes
import com.woocommerce.android.wear.ui.NavRoutes.MY_STORE
import com.woocommerce.android.wear.ui.login.LoginViewModel.LoginState
import com.woocommerce.android.wear.ui.login.LoginViewModel.LoginState.Logged
import com.woocommerce.android.wear.ui.login.LoginViewModel.LoginState.Timeout
import com.woocommerce.android.wear.ui.login.LoginViewModel.LoginState.Waiting

@Composable
fun LoginScreen(viewModel: LoginViewModel) {
fun LoginScreen(navController: NavController) {
val viewModel: LoginViewModel = hiltViewModel()
val viewState by viewModel.viewState.observeAsState()
LoginScreen(
isLoading = viewState?.isLoading ?: false,
loginState = viewState?.loginState ?: Waiting,
navController = navController,
onTryAgainClicked = viewModel::reloadData
)
}

@Composable
fun LoginScreen(
isLoading: Boolean,
loginState: LoginState,
navController: NavController,
onTryAgainClicked: () -> Unit,
modifier: Modifier = Modifier
) {
Expand All @@ -54,11 +66,19 @@ fun LoginScreen(
.fillMaxSize(),
contentAlignment = Alignment.Center
) {
if (isLoading) {
TimeText()
LoginLoadingScreen(modifier)
} else {
LoginInstructionsScreen(onTryAgainClicked, modifier)
when (loginState) {
Logged -> {
navController.navigate(MY_STORE.route) {
popUpTo(NavRoutes.LOGIN.route) { inclusive = true }
}
}
Timeout -> {
LoginInstructionsScreen(onTryAgainClicked, modifier)
}
Waiting -> {
TimeText()
LoginLoadingScreen(modifier)
}
}
}
}
Expand Down Expand Up @@ -137,7 +157,8 @@ private fun LoginLoadingScreen(
@Composable
fun PreviewError() {
LoginScreen(
isLoading = false,
loginState = Timeout,
navController = rememberNavController(),
onTryAgainClicked = {}
)
}
Expand All @@ -147,7 +168,8 @@ fun PreviewError() {
@Composable
fun PreviewLoading() {
LoginScreen(
isLoading = true,
loginState = Waiting,
navController = rememberNavController(),
onTryAgainClicked = {}
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,31 +3,25 @@ package com.woocommerce.android.wear.ui.login
import android.os.Parcelable
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.asLiveData
import androidx.navigation.NavHostController
import com.woocommerce.android.wear.analytics.AnalyticsTracker
import com.woocommerce.android.wear.extensions.getStateFlow
import com.woocommerce.android.wear.ui.NavRoutes
import com.woocommerce.android.wear.ui.NavRoutes.MY_STORE
import com.woocommerce.android.wear.ui.login.FetchSiteData.LoginRequestState.Logged
import com.woocommerce.android.wear.ui.login.FetchSiteData.LoginRequestState.Timeout
import com.woocommerce.android.wear.ui.login.FetchSiteData.LoginRequestState.Waiting
import com.woocommerce.android.wear.ui.login.LoginViewModel.LoginState.Logged
import com.woocommerce.android.wear.ui.login.LoginViewModel.LoginState.Timeout
import com.woocommerce.android.wear.ui.login.LoginViewModel.LoginState.Waiting
import com.woocommerce.android.wear.viewmodel.WearViewModel
import com.woocommerce.commons.WearAnalyticsEvent.WATCH_STORE_DATA_FAILED
import com.woocommerce.commons.WearAnalyticsEvent.WATCH_STORE_DATA_REQUESTED
import com.woocommerce.commons.WearAnalyticsEvent.WATCH_STORE_DATA_SUCCEEDED
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import kotlinx.parcelize.Parcelize
import javax.inject.Inject

@HiltViewModel(assistedFactory = LoginViewModel.Factory::class)
class LoginViewModel @AssistedInject constructor(
@HiltViewModel
class LoginViewModel @Inject constructor(
private val fetchSiteData: FetchSiteData,
private val analyticsTracker: AnalyticsTracker,
@Assisted private val navController: NavHostController,
savedState: SavedStateHandle
) : WearViewModel() {
@Suppress("ForbiddenComment")
Expand All @@ -45,33 +39,26 @@ class LoginViewModel @AssistedInject constructor(

private fun requestSiteData() {
analyticsTracker.track(WATCH_STORE_DATA_REQUESTED)
_viewState.update { it.copy(isLoading = true) }
launch {
fetchSiteData().collect { loginState ->
_viewState.update { it.copy(loginState = loginState) }
when (loginState) {
Logged -> {
analyticsTracker.track(WATCH_STORE_DATA_SUCCEEDED)
navController.navigate(MY_STORE.route) {
popUpTo(NavRoutes.LOGIN.route) { inclusive = true }
}
}
Timeout -> {
analyticsTracker.track(WATCH_STORE_DATA_FAILED)
_viewState.update { it.copy(isLoading = false) }
}
Waiting -> _viewState.update { it.copy(isLoading = true) }
Logged -> analyticsTracker.track(WATCH_STORE_DATA_SUCCEEDED)
Timeout -> analyticsTracker.track(WATCH_STORE_DATA_FAILED)
else -> { /* Do nothing */ }
}
}
}
}

@Parcelize
data class ViewState(
val isLoading: Boolean = true
val loginState: LoginState = Waiting,
) : Parcelable

@AssistedFactory
interface Factory {
fun create(navController: NavHostController): LoginViewModel
enum class LoginState {
Logged,
Waiting,
Timeout
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,6 @@ class OrdersRepository @Inject constructor(
.takeUnless { it.isError }
?.model
?.map { it.toAppModel() }
?: emptyList()

suspend fun getStoredOrders(
selectedSite: SiteModel
Expand Down
Loading

0 comments on commit 788a384

Please sign in to comment.