Skip to content

Commit d0a183e

Browse files
authored
Merge branch 'trunk' into bug/run-DB-query-on-IO-dispatcher
2 parents 7c4ef88 + 1cae610 commit d0a183e

File tree

63 files changed

+1761
-1005
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

63 files changed

+1761
-1005
lines changed

RELEASE-NOTES.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
*** For entries which are touching the Android Wear app's, start entry with `[WEAR]` too.
44
23.7
55
-----
6-
6+
- [Internal] Handle BLUETOOTH_PEER_REMOVED_PAIRING_INFORMATION disconnect reason from Stripe SDK [https://github.com/woocommerce/woocommerce-android/pull/14886]
77

88
23.6
99
-----

WooCommerce/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,7 @@ dependencies {
221221
implementation(libs.androidx.constraintlayout.main)
222222
implementation(libs.androidx.recyclerview.main)
223223
implementation(libs.androidx.recyclerview.selection)
224+
implementation(libs.androidx.swiperefreshlayout)
224225
implementation(libs.androidx.appcompat)
225226
implementation(libs.google.material)
226227
implementation(libs.google.compose.material3)
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.woocommerce.android.ui.bookings
2+
3+
import androidx.lifecycle.SavedStateHandle
4+
import com.woocommerce.android.viewmodel.MultiLiveEvent
5+
import com.woocommerce.android.viewmodel.ScopedViewModel
6+
import javax.inject.Inject
7+
8+
/**
9+
* Activity-scoped ViewModel used to communicate between Booking list and details in split-pane mode.
10+
*/
11+
class BookingsCommunicationViewModel @Inject constructor(
12+
savedState: SavedStateHandle
13+
) : ScopedViewModel(savedState) {
14+
fun pushEvent(event: CommunicationEvent) {
15+
triggerEvent(event)
16+
}
17+
18+
sealed class CommunicationEvent : MultiLiveEvent.Event() {
19+
data class BookingSelected(val bookingId: Long) : CommunicationEvent()
20+
}
21+
}

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/compose/BookingPaymentSection.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.woocommerce.android.ui.bookings.compose
22

33
import androidx.annotation.StringRes
4+
import androidx.compose.animation.AnimatedVisibility
45
import androidx.compose.foundation.background
56
import androidx.compose.foundation.layout.Arrangement
67
import androidx.compose.foundation.layout.Column
@@ -59,7 +60,7 @@ fun BookingPaymentSection(
5960
modifier = Modifier.padding(start = 16.dp)
6061
)
6162
Spacer(modifier = Modifier.height(16.dp))
62-
if (status == BookingStatus.Unpaid) {
63+
AnimatedVisibility(status == BookingStatus.Unpaid) {
6364
WCColoredButton(
6465
onClick = onMarkAsPaid,
6566
text = stringResource(id = R.string.booking_payment_mark_as_paid),
Lines changed: 53 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,26 @@
11
package com.woocommerce.android.ui.bookings.details
22

33
import android.os.Bundle
4+
import android.os.Parcelable
45
import android.view.LayoutInflater
56
import android.view.View
67
import android.view.ViewGroup
8+
import androidx.fragment.app.activityViewModels
79
import androidx.fragment.app.viewModels
10+
import androidx.navigation.findNavController
811
import androidx.navigation.fragment.findNavController
912
import androidx.navigation.fragment.navArgs
13+
import com.woocommerce.android.NavGraphMainDirections
14+
import com.woocommerce.android.R
15+
import com.woocommerce.android.extensions.isTwoPanesShouldBeUsed
1016
import com.woocommerce.android.ui.base.BaseFragment
1117
import com.woocommerce.android.ui.base.UIMessageResolver
18+
import com.woocommerce.android.ui.bookings.BookingsCommunicationViewModel
1219
import com.woocommerce.android.ui.compose.composeView
1320
import com.woocommerce.android.ui.main.AppBarStatus
1421
import com.woocommerce.android.viewmodel.MultiLiveEvent
1522
import dagger.hilt.android.AndroidEntryPoint
23+
import kotlinx.parcelize.Parcelize
1624
import javax.inject.Inject
1725

1826
@AndroidEntryPoint
@@ -23,6 +31,7 @@ class BookingDetailsFragment : BaseFragment() {
2331

2432
private val viewModel: BookingDetailsViewModel by viewModels()
2533
private val args: BookingDetailsFragmentArgs by navArgs()
34+
private val bookingsCommunicationViewModel: BookingsCommunicationViewModel by activityViewModels()
2635

2736
override val activityAppBarStatus: AppBarStatus
2837
get() = AppBarStatus.Hidden
@@ -32,25 +41,14 @@ class BookingDetailsFragment : BaseFragment() {
3241
BookingDetailsScreen(
3342
viewModel = viewModel,
3443
onBack = { findNavController().popBackStack() },
35-
onViewOrder = { orderId ->
36-
findNavController().navigate(
37-
BookingDetailsFragmentDirections
38-
.actionBookingDetailsFragmentToOrderDetailFragment(orderId)
39-
)
40-
},
41-
onViewNotes = {
42-
findNavController().navigate(
43-
BookingDetailsFragmentDirections
44-
.actionBookingDetailsFragmentToBookingNoteFragment(args.bookingId)
45-
)
46-
}
4744
)
4845
}
4946
}
5047

5148
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
5249
super.onViewCreated(view, savedInstanceState)
5350
handleEvents()
51+
handleOnePaneToTwoPaneConversion()
5452
}
5553

5654
private fun handleEvents() {
@@ -59,7 +57,50 @@ class BookingDetailsFragment : BaseFragment() {
5957
is MultiLiveEvent.Event.ShowSnackbar -> {
6058
uiMessageResolver.showSnack(event.message)
6159
}
60+
is BookingDetailsViewModel.NavigateToBookingNote -> {
61+
findNavController().navigate(
62+
BookingDetailsFragmentDirections
63+
.actionBookingDetailsFragmentToBookingNoteFragment(event.bookingId)
64+
)
65+
}
66+
is BookingDetailsViewModel.NavigateToOrder -> {
67+
requireActivity().findNavController(R.id.nav_host_fragment_main).navigate(
68+
NavGraphMainDirections.actionGlobalOrderDetailFragment(
69+
orderId = event.orderId,
70+
ignoreTwoPaneLayoutLogic = true
71+
)
72+
)
73+
}
74+
}
75+
}
76+
}
77+
78+
private fun handleOnePaneToTwoPaneConversion() {
79+
val isScreenLargerThanCompact = requireContext().isTwoPanesShouldBeUsed
80+
val isBookingListFragmentUpInBackStack =
81+
findNavController().previousBackStackEntry?.destination?.id == R.id.bookingListFragment
82+
if (isScreenLargerThanCompact && isBookingListFragmentUpInBackStack) {
83+
when (val mode = args.mode) {
84+
is Mode.ShowBooking -> {
85+
findNavController().popBackStack()
86+
bookingsCommunicationViewModel.pushEvent(
87+
BookingsCommunicationViewModel.CommunicationEvent.BookingSelected(mode.bookingId)
88+
)
89+
}
90+
91+
is Mode.Empty -> {
92+
findNavController().popBackStack()
93+
}
6294
}
6395
}
6496
}
97+
98+
@Parcelize
99+
sealed class Mode : Parcelable {
100+
@Parcelize
101+
data object Empty : Mode()
102+
103+
@Parcelize
104+
data class ShowBooking(val bookingId: Long) : Mode()
105+
}
65106
}

0 commit comments

Comments
 (0)