Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -255,7 +255,14 @@ class EditFavoritesPageTest : KoinTest {
val favorites = setOf(RouteStopDirection(route.id, sampleStop.id, 0))
val viewModel =
MockFavoritesViewModel(
FavoritesViewModel.State(false, favorites, routeCardData, routeCardData, null)
FavoritesViewModel.State(
false,
favorites,
false,
routeCardData,
routeCardData,
null,
)
)

composeTestRule.setContent {
Expand All @@ -276,7 +283,7 @@ class EditFavoritesPageTest : KoinTest {
fun testShowsEmptyView() {
val viewModel =
MockFavoritesViewModel(
FavoritesViewModel.State(false, emptySet(), emptyList(), emptyList(), null)
FavoritesViewModel.State(false, emptySet(), false, emptyList(), emptyList(), null)
)

composeTestRule.setContent {
Expand All @@ -303,6 +310,7 @@ class EditFavoritesPageTest : KoinTest {
FavoritesViewModel.State(
false,
favorites,
false,
combinedRouteCardData,
combinedRouteCardData,
null,
Expand All @@ -314,6 +322,7 @@ class EditFavoritesPageTest : KoinTest {
FavoritesViewModel.State(
false,
setOf(RouteStopDirection(greenLine.id, greenLineStop.id, 0)),
false,
greenLineRouteCardData,
greenLineRouteCardData,
null,
Expand Down Expand Up @@ -367,6 +376,7 @@ class EditFavoritesPageTest : KoinTest {
FavoritesViewModel.State(
false,
favorites,
false,
combinedRouteCardData,
combinedRouteCardData,
null,
Expand All @@ -379,6 +389,7 @@ class EditFavoritesPageTest : KoinTest {
FavoritesViewModel.State(
false,
updatedFavorites,
false,
if (updatedFavorites.size == 1) greenLineRouteCardData
else combinedRouteCardData,
if (updatedFavorites.size == 1) greenLineRouteCardData
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
package com.mbta.tid.mbta_app.android.favorites

import androidx.compose.ui.test.junit4.createComposeRule
import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
import com.mbta.tid.mbta_app.android.component.ErrorBannerViewModel
import com.mbta.tid.mbta_app.model.ObjectCollectionBuilder
import com.mbta.tid.mbta_app.model.response.AlertsStreamDataResponse
import com.mbta.tid.mbta_app.model.response.GlobalResponse
import com.mbta.tid.mbta_app.repositories.MockErrorBannerStateRepository
import com.mbta.tid.mbta_app.viewModel.FavoritesViewModel
import com.mbta.tid.mbta_app.viewModel.IToastViewModel
import com.mbta.tid.mbta_app.viewModel.MockFavoritesViewModel
import com.mbta.tid.mbta_app.viewModel.ToastViewModel
import dev.mokkery.MockMode
import dev.mokkery.matcher.any
import dev.mokkery.mock
import dev.mokkery.resetCalls
import dev.mokkery.verify
import dev.mokkery.verify.VerifyMode
import kotlinx.coroutines.runBlocking
import org.junit.Rule
import org.junit.Test

class FavoritesViewTest {

@get:Rule val composeTestRule = createComposeRule()

@Test
fun testShowsToast() = runBlocking {
val favoritesVM =
MockFavoritesViewModel(
initialState =
FavoritesViewModel.State(
false,
emptySet(),
true,
emptyList(),
emptyList(),
null,
)
)
val toastVM = mock<IToastViewModel>(MockMode.autofill)

val objects = ObjectCollectionBuilder()

composeTestRule.setContent {
FavoritesView(
openSheetRoute = {},
favoritesViewModel = favoritesVM,
errorBannerViewModel =
ErrorBannerViewModel(errorRepository = MockErrorBannerStateRepository()),
toastViewModel = toastVM,
alertData = AlertsStreamDataResponse(objects),
globalResponse = GlobalResponse(objects),
targetLocation = null,
setLastLocation = { _ -> },
setIsTargeting = { _ -> },
)
}

verify(VerifyMode.exhaustiveOrder) {
toastVM.showToast(
ToastViewModel.Toast(
"Favorite stops replaces the prior starred routes feature.",
ToastViewModel.Duration.Indefinite,
any(),
null,
null,
)
)
}
resetCalls(toastVM)

composeTestRule.onNodeWithText("Add stops").performClick()

verify(VerifyMode.exhaustiveOrder) { toastVM.hideToast() }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,13 @@ import com.mbta.tid.mbta_app.android.promo.PromoPage
import com.mbta.tid.mbta_app.android.state.getGlobalData
import com.mbta.tid.mbta_app.android.state.subscribeToAlerts
import com.mbta.tid.mbta_app.android.util.SettingsCache
import com.mbta.tid.mbta_app.model.FeaturePromo
import com.mbta.tid.mbta_app.model.SheetRoutes
import com.mbta.tid.mbta_app.model.response.AlertsStreamDataResponse
import com.mbta.tid.mbta_app.network.PhoenixSocket
import com.mbta.tid.mbta_app.repositories.IAccessibilityStatusRepository
import com.mbta.tid.mbta_app.repositories.Settings
import com.mbta.tid.mbta_app.viewModel.IFavoritesViewModel
import com.mbta.tid.mbta_app.viewModel.MapViewModel
import io.github.dellisd.spatialk.geojson.Position
import org.koin.androidx.compose.koinViewModel
Expand All @@ -49,6 +51,7 @@ import org.koin.compose.koinInject
fun ContentView(
socket: PhoenixSocket = koinInject(),
viewModel: ContentViewModel = koinViewModel(),
favoritesViewModel: IFavoritesViewModel = koinInject(),
mapViewModel: MapViewModel = koinInject(),
accessibilityStatusRepository: IAccessibilityStatusRepository = koinInject(),
) {
Expand Down Expand Up @@ -101,6 +104,14 @@ fun ContentView(
onPauseOrDispose { socket.detach() }
}

LaunchedEffect(pendingFeaturePromos) {
pendingFeaturePromos?.let {
if (it.contains(FeaturePromo.EnhancedFavorites)) {
favoritesViewModel.setIsFirstExposureToNewFavorites(true)
}
}
}

val analytics: Analytics = koinInject()

val colorScheme =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,15 @@ import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.ButtonDefaults
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.LifecycleResumeEffect
Expand All @@ -32,6 +34,8 @@ import com.mbta.tid.mbta_app.model.routeDetailsPage.RouteDetailsContext
import com.mbta.tid.mbta_app.model.routeDetailsPage.RoutePickerPath
import com.mbta.tid.mbta_app.viewModel.FavoritesViewModel
import com.mbta.tid.mbta_app.viewModel.IFavoritesViewModel
import com.mbta.tid.mbta_app.viewModel.IToastViewModel
import com.mbta.tid.mbta_app.viewModel.ToastViewModel
import io.github.dellisd.spatialk.geojson.Position
import kotlin.time.Duration.Companion.seconds

Expand All @@ -42,14 +46,18 @@ fun FavoritesView(
setIsTargeting: (Boolean) -> Unit,
favoritesViewModel: IFavoritesViewModel,
errorBannerViewModel: ErrorBannerViewModel,
toastViewModel: IToastViewModel,
alertData: AlertsStreamDataResponse?,
globalResponse: GlobalResponse?,
targetLocation: Position?,
) {
val now by timer(updateInterval = 5.seconds)
val state by favoritesViewModel.models.collectAsState()
val context = LocalContext.current

fun onAddFavorites() {
favoritesViewModel.setIsFirstExposureToNewFavorites(false)
toastViewModel.hideToast()
openSheetRoute(SheetRoutes.RoutePicker(RoutePickerPath.Root, RouteDetailsContext.Favorites))
}

Expand Down Expand Up @@ -78,10 +86,23 @@ fun FavoritesView(
state.loadedLocation?.let { setLastLocation(it) }
setIsTargeting(false)
}
LaunchedEffect(state.shouldShowFirstTimeToast) {
if (state.shouldShowFirstTimeToast) {
toastViewModel.showToast(
ToastViewModel.Toast(
context.getString(R.string.favorite_stops_first_time_toast_message),
onClose = {
favoritesViewModel.setIsFirstExposureToNewFavorites(false)
toastViewModel.hideToast()
},
)
)
}
}

val routeCardData = state.routeCardData

Column(verticalArrangement = Arrangement.spacedBy(8.dp)) {
Column() {
SheetHeader(
title = stringResource(R.string.favorites_link),
rightActionContents = {
Expand All @@ -100,7 +121,7 @@ fun FavoritesView(
},
)

ErrorBanner(errorBannerViewModel)
ErrorBanner(errorBannerViewModel, modifier = Modifier.padding(top = 8.dp))
RouteCardList(
routeCardData = routeCardData,
emptyView = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,9 @@ import com.mbta.tid.mbta_app.android.util.Typography
@Composable
fun NoFavoritesView(onAddStops: () -> Unit, showAddStops: Boolean = true) {
Column(
modifier = Modifier.fillMaxWidth().height(IntrinsicSize.Min).padding(top = 24.dp),
modifier = Modifier.fillMaxWidth().height(IntrinsicSize.Min),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.spacedBy(32.dp),
verticalArrangement = Arrangement.spacedBy(10.dp),
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Decreasing the spacing here b/c otherwise the toast blocks the "Add stops" button. Confirmed this change with design.

) {
Text(
stringResource(R.string.no_stops_added),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,15 @@ import com.mbta.tid.mbta_app.android.favorites.FavoritesView
import com.mbta.tid.mbta_app.android.util.managedTargetLocation
import com.mbta.tid.mbta_app.model.SheetRoutes
import com.mbta.tid.mbta_app.viewModel.IFavoritesViewModel
import com.mbta.tid.mbta_app.viewModel.IToastViewModel
import org.koin.compose.koinInject

@Composable
fun FavoritesPage(
openSheetRoute: (SheetRoutes) -> Unit,
favoritesViewModel: IFavoritesViewModel,
errorBannerViewModel: ErrorBannerViewModel,
toastViewModel: IToastViewModel = koinInject(),
nearbyTransit: NearbyTransit,
) {
val targetLocation by managedTargetLocation(nearbyTransit)
Expand All @@ -22,6 +25,7 @@ fun FavoritesPage(
{ nearbyTransit.isTargeting = it },
favoritesViewModel,
errorBannerViewModel,
toastViewModel,
nearbyTransit.alertData,
nearbyTransit.globalResponse,
targetLocation,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,7 @@
<string name="facility_issue">Problema en las instalaciones</string>
<string name="facility_issue_sentence_case">Problema en las instalaciones</string>
<string name="favorite_stop">parada favorita</string>
<string name="favorite_stops_first_time_toast_message">Las paradas favoritas reemplazan la función de rutas destacadas anterior.</string>
<string name="favorites_link">Favoritos</string>
<string name="favorites_toast_add">&lt;b>%1$s %2$s&lt;/b> en &lt;b>%3$s&lt;/b> añadido a Favoritos</string>
<string name="favorites_toast_add_fallback">Añadido a favoritos</string>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,7 @@
<string name="facility_issue">Problème d’infrastructure</string>
<string name="facility_issue_sentence_case">Problème d’infrastructure</string>
<string name="favorite_stop">arrêt préféré</string>
<string name="favorite_stops_first_time_toast_message">Les arrêts favoris remplacent la fonctionnalité d’itinéraires favoris précédente.</string>
<string name="favorites_link">Favoris</string>
<string name="favorites_toast_add">&lt;b>%1$s %2$s&lt;/b> à &lt;b>%3$s&lt;/b> ajouté aux favoris</string>
<string name="favorites_toast_add_fallback">Ajouté aux favoris</string>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,7 @@
<string name="facility_issue">Pwoblèm Lokal</string>
<string name="facility_issue_sentence_case">Pwoblèm lokal</string>
<string name="favorite_stop">arè pi renmen</string>
<string name="favorite_stops_first_time_toast_message">Estasyon pi renmen yo ranplase karakteristik wout ak zetwal anvan an.</string>
<string name="favorites_link">Favori</string>
<string name="favorites_toast_add">&lt;b>%1$s %2$s&lt;/b> nan &lt;b>%3$s&lt;/b> ajoute nan Favorites</string>
<string name="favorites_toast_add_fallback">Te ajoute nan Favoris</string>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,7 @@
<string name="facility_issue">Problema nas instalações</string>
<string name="facility_issue_sentence_case">Problema nas instalações</string>
<string name="favorite_stop">parada favorita</string>
<string name="favorite_stops_first_time_toast_message">As paradas favoritas substituem o recurso anterior de rotas marcadas com estrela.</string>
<string name="favorites_link">Favoritos</string>
<string name="favorites_toast_add">&lt;b>%1$s %2$s&lt;/b> em &lt;b>%3$s&lt;/b> adicionado aos favoritos</string>
<string name="favorites_toast_add_fallback">Adicionado aos favoritos</string>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@
<string name="facility_issue">Vấn đề về cơ sở vật chất</string>
<string name="facility_issue_sentence_case">Vấn đề về cơ sở vật chất</string>
<string name="favorite_stop">điểm dừng yêu thích</string>
<string name="favorite_stops_first_time_toast_message">Điểm dừng yêu thích thay thế tính năng tuyến đường có dấu sao trước đó.</string>
<string name="favorites_link">Yêu thích</string>
<string name="favorites_toast_add">&lt;b>%1$s %2$s&lt;/b> tại &lt;b>%3$s&lt;/b> đã được thêm vào mục Yêu thích</string>
<string name="favorites_toast_add_fallback">Đã thêm vào mục Yêu thích</string>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@
<string name="facility_issue">设施问题</string>
<string name="facility_issue_sentence_case">设施问题</string>
<string name="favorite_stop">最喜欢的一站</string>
<string name="favorite_stops_first_time_toast_message">收藏站点取代了之前的加星标路线功能。</string>
<string name="favorites_link">收藏夹</string>
<string name="favorites_toast_add">&lt;b>%1$s %2$s&lt;/b> 位于 &lt;b>%3$s&lt;/b> 已添加到收藏夹</string>
<string name="favorites_toast_add_fallback">已添加到收藏夹</string>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@
<string name="facility_issue">設施問題</string>
<string name="facility_issue_sentence_case">設施問題</string>
<string name="favorite_stop">最喜歡的一站</string>
<string name="favorite_stops_first_time_toast_message">收藏站點取代了先前的加星標路線功能。</string>
<string name="favorites_link">收藏夾</string>
<string name="favorites_toast_add">&lt;b>%1$s %2$s&lt;/b> 位於 &lt;b>%3$s&lt;/b> 已新增至收藏夾</string>
<string name="favorites_toast_add_fallback">已加入到收藏夾</string>
Expand Down
1 change: 1 addition & 0 deletions androidApp/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,7 @@
<string name="facility_issue">Facility Issue</string>
<string name="facility_issue_sentence_case">Facility issue</string>
<string name="favorite_stop">favorite stop</string>
<string name="favorite_stops_first_time_toast_message">Favorite stops replaces the prior starred routes feature.</string>
<string name="favorites_link">Favorites</string>
<string name="favorites_toast_add">&lt;b&gt;%1$s %2$s&lt;/b&gt; at &lt;b&gt;%3$s&lt;/b&gt; added to Favorites</string>
<string name="favorites_toast_add_fallback">Added to Favorites</string>
Expand Down
Loading
Loading