From 89f15fc95da7d1babd53e906686f013c3f5f5925 Mon Sep 17 00:00:00 2001 From: AbigailLabanok <113201330+AbigailLabanok@users.noreply.github.com> Date: Wed, 25 Mar 2026 22:38:10 -0400 Subject: [PATCH 1/8] working on deeplinking --- app/src/main/AndroidManifest.xml | 4 +++ .../components/home/EateryDetailsContent.kt | 29 ++++++++++++++++++- .../transit/ui/viewmodels/HomeViewModel.kt | 4 +-- 3 files changed, 34 insertions(+), 3 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3ed5633a..6c420dd5 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,4 +37,8 @@ android:value="${BACKEND_URL}" /> + + + + \ No newline at end of file diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/EateryDetailsContent.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/EateryDetailsContent.kt index de6a68eb..1d5ca0c6 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/EateryDetailsContent.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/EateryDetailsContent.kt @@ -1,5 +1,8 @@ package com.cornellappdev.transit.ui.components.home +import android.content.ActivityNotFoundException +import android.content.Intent +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer @@ -13,9 +16,11 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp +import androidx.core.content.ContextCompat.startActivity import com.cornellappdev.transit.R import com.cornellappdev.transit.models.ecosystem.Eatery import com.cornellappdev.transit.ui.theme.DividerGray @@ -28,6 +33,7 @@ import com.cornellappdev.transit.util.StringUtils.createDeepLink import com.cornellappdev.transit.util.TimeUtils.isOpenAnnotatedStringFromOperatingHours import com.cornellappdev.transit.util.TimeUtils.rotateOperatingHours import com.cornellappdev.transit.util.getAboutContent +import androidx.core.net.toUri @Composable fun EateryDetailsContent( @@ -88,11 +94,32 @@ fun EateryDetailsContent( val (annotatedString, inlineContent) = stringResource(R.string.view_menu).createDeepLink(R.drawable.eaterylink) + val context = LocalContext.current + Text( text = annotatedString, inlineContent = inlineContent, style = Style.heading2, - color = TransitBlue + color = TransitBlue, + modifier = Modifier.clickable( + onClick = { + val eateryPackage = "com.cornellappdev.eatery" + val eateryUri = "eatery://open-eatery?id=${eatery.id}".toUri() + val deepLinkIntent = Intent(Intent.ACTION_VIEW,eateryUri) + + try { + context.startActivity(deepLinkIntent) + } catch (e1: ActivityNotFoundException) { + val playStoreIntent = Intent(Intent.ACTION_VIEW, "market://details?id=$eateryPackage".toUri()) + + try { + context.startActivity(playStoreIntent) + } catch (e2: ActivityNotFoundException) { + + } + } + } + ) ) Spacer(modifier = Modifier.height(24.dp)) diff --git a/app/src/main/java/com/cornellappdev/transit/ui/viewmodels/HomeViewModel.kt b/app/src/main/java/com/cornellappdev/transit/ui/viewmodels/HomeViewModel.kt index 6e6a7865..8bc02807 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/viewmodels/HomeViewModel.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/viewmodels/HomeViewModel.kt @@ -128,10 +128,10 @@ class HomeViewModel @Inject constructor( getLongitude = { it.longitude } ), libraries = sortApiResponse( - response = libraries, + response = libraries.withExcludedLibrariesRemoved(), getLatitude = { it.latitude }, getLongitude = { it.longitude } - ).withExcludedLibrariesRemoved(), + ), eateries = sortApiResponse( response = eateries, getLatitude = { it.latitude }, From 45a6488d9f8d987c167ab44e7379bb6b86b7d3a7 Mon Sep 17 00:00:00 2001 From: AbigailLabanok <113201330+AbigailLabanok@users.noreply.github.com> Date: Wed, 25 Mar 2026 23:09:41 -0400 Subject: [PATCH 2/8] fixed sorting for the libraries --- .../transit/ui/viewmodels/HomeViewModel.kt | 41 +++++++++++++------ 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/transit/ui/viewmodels/HomeViewModel.kt b/app/src/main/java/com/cornellappdev/transit/ui/viewmodels/HomeViewModel.kt index 8bc02807..190fb580 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/viewmodels/HomeViewModel.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/viewmodels/HomeViewModel.kt @@ -53,11 +53,18 @@ class HomeViewModel @Inject constructor( ) : ViewModel() { val libraryCardsFlow: StateFlow>> = - routeRepository.libraryFlow.map { response -> + combine( + routeRepository.libraryFlow, + locationRepository.currentLocation + ) { response, location -> + val usersLocation = location?.let { LatLng(it.latitude, it.longitude) } when (val filteredResponse = response.withExcludedLibrariesRemoved()) { is ApiResponse.Success -> { + val sortedLibraries = filteredResponse.data.sortedBy { + numericalDistanceToPlace(it.latitude, it.longitude, usersLocation) + } ApiResponse.Success( - filteredResponse.data + sortedLibraries .map { it.toLibraryCardUiState() } ) } @@ -117,6 +124,9 @@ class HomeViewModel @Inject constructor( gymRepository.gymFlow, locationRepository.currentLocation ) { printers, libraries, eateries, gyms, location -> + val userLocation = location?.let { LatLng(it.latitude, it.longitude) } + + StaticPlaces( printers = sortApiResponse( response = if (printers is ApiResponse.Success) { @@ -125,23 +135,27 @@ class HomeViewModel @Inject constructor( printers }, getLatitude = { it.latitude }, - getLongitude = { it.longitude } + getLongitude = { it.longitude }, + userLocation = userLocation ), libraries = sortApiResponse( response = libraries.withExcludedLibrariesRemoved(), getLatitude = { it.latitude }, - getLongitude = { it.longitude } + getLongitude = { it.longitude }, + userLocation = userLocation ), eateries = sortApiResponse( response = eateries, getLatitude = { it.latitude }, getLongitude = { it.longitude }, + userLocation = userLocation, getIsOpen = { TimeUtils.getOpenStatus(it.operatingHours()).isOpen } ), gyms = sortApiResponse( response = gyms, getLatitude = { it.latitude }, getLongitude = { it.longitude }, + userLocation = userLocation, getIsOpen = { TimeUtils.getOpenStatus(it.operatingHours()).isOpen } ) ) @@ -453,14 +467,14 @@ class HomeViewModel @Inject constructor( /** * Returns a numerical distance from a location to the current location if both exist, otherwise returns Double.MAX_VALUE */ - fun numericalDistanceToPlace(latitude: Double?, longitude: Double?): Double { - val currentLocationSnapshot = currentLocation.value - return if (currentLocationSnapshot != null && latitude != null && longitude != null) { + fun numericalDistanceToPlace( + latitude: Double?, + longitude: Double?, + userLocation: LatLng? + ): Double { + return if (userLocation != null && latitude != null && longitude != null) { calculateDistance( - LatLng( - currentLocationSnapshot.latitude, - currentLocationSnapshot.longitude - ), LatLng(latitude, longitude) + userLocation, LatLng(latitude, longitude) ) } else { Double.MAX_VALUE @@ -474,15 +488,16 @@ class HomeViewModel @Inject constructor( response: ApiResponse>, getLatitude: (T) -> Double?, getLongitude: (T) -> Double?, + userLocation: LatLng?, getIsOpen: ((T) -> Boolean)? = null ): ApiResponse> { if (response is ApiResponse.Success) { val sortedData = response.data.sortedWith( if (getIsOpen != null) { compareByDescending { getIsOpen(it) } - .thenBy { numericalDistanceToPlace(getLatitude(it),getLongitude(it)) } + .thenBy { numericalDistanceToPlace(getLatitude(it),getLongitude(it), userLocation) } } else { - compareBy { numericalDistanceToPlace(getLatitude(it),getLongitude(it)) } + compareBy { numericalDistanceToPlace(getLatitude(it),getLongitude(it), userLocation) } } ) return ApiResponse.Success(sortedData) From d318e93d226ad05c643b10a4847364b8e51fd1ef Mon Sep 17 00:00:00 2001 From: AbigailLabanok <113201330+AbigailLabanok@users.noreply.github.com> Date: Mon, 13 Apr 2026 02:10:41 -0400 Subject: [PATCH 3/8] added general linking + fixed filtering --- app/src/main/AndroidManifest.xml | 9 ++++----- .../ui/components/home/EateryDetailsContent.kt | 17 +++++++++-------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6c420dd5..60c15c16 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -6,6 +6,10 @@ + + + + - @@ -37,8 +40,4 @@ android:value="${BACKEND_URL}" /> - - - - \ No newline at end of file diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/EateryDetailsContent.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/EateryDetailsContent.kt index 1d5ca0c6..fc2fe130 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/EateryDetailsContent.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/EateryDetailsContent.kt @@ -20,7 +20,6 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp -import androidx.core.content.ContextCompat.startActivity import com.cornellappdev.transit.R import com.cornellappdev.transit.models.ecosystem.Eatery import com.cornellappdev.transit.ui.theme.DividerGray @@ -103,18 +102,20 @@ fun EateryDetailsContent( color = TransitBlue, modifier = Modifier.clickable( onClick = { - val eateryPackage = "com.cornellappdev.eatery" - val eateryUri = "eatery://open-eatery?id=${eatery.id}".toUri() - val deepLinkIntent = Intent(Intent.ACTION_VIEW,eateryUri) + val eateryPackage = "com.cornellappdev.android.eatery" try { - context.startActivity(deepLinkIntent) - } catch (e1: ActivityNotFoundException) { - val playStoreIntent = Intent(Intent.ACTION_VIEW, "market://details?id=$eateryPackage".toUri()) - + val intent = context.packageManager.getLaunchIntentForPackage(eateryPackage) + if (intent != null) { + context.startActivity(intent) + } + } catch (e: ActivityNotFoundException) { try { + val playStoreIntent = Intent(Intent.ACTION_VIEW, "market://details?id=$eateryPackage".toUri()) + playStoreIntent.setPackage("com.android.vending") context.startActivity(playStoreIntent) } catch (e2: ActivityNotFoundException) { + context.startActivity(Intent(Intent.ACTION_VIEW, "https://play.google.com/store/apps/details?id=$eateryPackage}".toUri())) } } From 28c11cc61a3d13c85318a84209fc71e62c8e2cf9 Mon Sep 17 00:00:00 2001 From: AbigailLabanok <113201330+AbigailLabanok@users.noreply.github.com> Date: Mon, 13 Apr 2026 02:22:25 -0400 Subject: [PATCH 4/8] added general linking for uplift --- app/src/main/AndroidManifest.xml | 1 + .../components/home/EateryDetailsContent.kt | 10 +++---- .../ui/components/home/GymDetailsContent.kt | 28 ++++++++++++++++++- 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 60c15c16..3d5551e4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,6 +8,7 @@ + Date: Sun, 26 Apr 2026 20:04:38 -0400 Subject: [PATCH 5/8] made shared function for deeplinking --- .../home/DetailedPlaceSheetContent.kt | 10 ++++++++ .../components/home/EateryDetailsContent.kt | 21 ++-------------- .../ui/components/home/GymDetailsContent.kt | 21 ++-------------- .../cornellappdev/transit/util/IntentUtils.kt | 25 +++++++++++++++++++ uplift-android | 1 + 5 files changed, 40 insertions(+), 38 deletions(-) create mode 100644 app/src/main/java/com/cornellappdev/transit/util/IntentUtils.kt create mode 160000 uplift-android diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/DetailedPlaceSheetContent.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/DetailedPlaceSheetContent.kt index cc8ddb87..193be0a7 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/DetailedPlaceSheetContent.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/DetailedPlaceSheetContent.kt @@ -24,6 +24,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.vectorResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewParameter @@ -40,6 +41,7 @@ import com.cornellappdev.transit.ui.theme.SecondaryText import com.cornellappdev.transit.ui.theme.Style import com.cornellappdev.transit.ui.theme.TransitBlue import com.cornellappdev.transit.util.BOTTOM_SHEET_MAX_HEIGHT_PERCENT +import com.cornellappdev.transit.util.IntentUtils.openDeepLink @Composable fun DetailedPlaceSheetContent( @@ -51,6 +53,8 @@ fun DetailedPlaceSheetContent( modifier: Modifier = Modifier, distanceStringToPlace: (Double?, Double?) -> String ) { + val context = LocalContext.current + Column( modifier = modifier .fillMaxWidth() @@ -98,6 +102,9 @@ fun DetailedPlaceSheetContent( onFavoriteClick = { onFavoriteStarClick(ecosystemPlace.toPlace()) }, + onDeepLinkClick = { + context.openDeepLink("com.cornellappdev.android.eatery") + }, distanceString = distanceStringToPlace( ecosystemPlace.latitude, ecosystemPlace.longitude @@ -122,6 +129,9 @@ fun DetailedPlaceSheetContent( onFavoriteClick = { onFavoriteStarClick(ecosystemPlace.toPlace()) }, + onDeepLinkClick = { + context.openDeepLink("com.cornellappdev.uplift") + }, distanceString = distanceStringToPlace( ecosystemPlace.latitude, ecosystemPlace.longitude diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/EateryDetailsContent.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/EateryDetailsContent.kt index 00e02fb9..33b0b412 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/EateryDetailsContent.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/EateryDetailsContent.kt @@ -39,6 +39,7 @@ fun EateryDetailsContent( eatery: Eatery, isFavorite: Boolean, onFavoriteClick: () -> Unit, + onDeepLinkClick: () -> Unit, distanceString: String, ) { Column( @@ -93,31 +94,13 @@ fun EateryDetailsContent( val (annotatedString, inlineContent) = stringResource(R.string.view_menu).createDeepLink(R.drawable.eaterylink) - val context = LocalContext.current - Text( text = annotatedString, inlineContent = inlineContent, style = Style.heading2, color = TransitBlue, modifier = Modifier.clickable( - onClick = { - val eateryPackage = "com.cornellappdev.android.eatery" - val eateryIntent = context.packageManager.getLaunchIntentForPackage(eateryPackage) - - if (eateryIntent != null) { - context.startActivity(eateryIntent) - } else { - try { - val playStoreIntent = Intent(Intent.ACTION_VIEW, "market://details?id=$eateryPackage".toUri()) - playStoreIntent.setPackage("com.android.vending") - context.startActivity(playStoreIntent) - } catch (e2: ActivityNotFoundException) { - context.startActivity(Intent(Intent.ACTION_VIEW, "https://play.google.com/store/apps/details?id=$eateryPackage}".toUri())) - - } - } - } + onClick = onDeepLinkClick ) ) diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/GymDetailsContent.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/GymDetailsContent.kt index baeb3ab9..a26c1871 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/GymDetailsContent.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/GymDetailsContent.kt @@ -44,6 +44,7 @@ fun GymDetailsContent( gym: UpliftGym, isFavorite: Boolean, onFavoriteClick: () -> Unit, + onDeepLinkClick: () -> Unit, distanceString: String ) { val isOpen = getOpenStatus(gym.operatingHours()).isOpen @@ -102,31 +103,13 @@ fun GymDetailsContent( val (annotatedString, inlineContent) = stringResource(R.string.view_gym).createDeepLink(R.drawable.upliftlink) - val context = LocalContext.current - Text( text = annotatedString, inlineContent = inlineContent, style = Style.heading2, color = TransitBlue, modifier = Modifier.clickable( - onClick = { - val upliftPackage = "com.cornellappdev.uplift" - val upliftIntent = context.packageManager.getLaunchIntentForPackage(upliftPackage) - - if (upliftIntent != null ) { - context.startActivity(upliftIntent) - } else { - try { - val playStoreIntent = Intent(Intent.ACTION_VIEW, "market://details?id=$upliftPackage".toUri()) - playStoreIntent.setPackage("com.android.vending") - context.startActivity(playStoreIntent) - } catch (e: ActivityNotFoundException) { - context.startActivity(Intent(Intent.ACTION_VIEW, "https://play.google.com/store/apps/details?id=$upliftPackage}".toUri())) - - } - } - } + onClick = onDeepLinkClick ) ) diff --git a/app/src/main/java/com/cornellappdev/transit/util/IntentUtils.kt b/app/src/main/java/com/cornellappdev/transit/util/IntentUtils.kt new file mode 100644 index 00000000..65b064a7 --- /dev/null +++ b/app/src/main/java/com/cornellappdev/transit/util/IntentUtils.kt @@ -0,0 +1,25 @@ +package com.cornellappdev.transit.util + +import android.content.ActivityNotFoundException +import android.content.Context +import android.content.Intent +import androidx.core.net.toUri + +object IntentUtils { + fun Context.openDeepLink(packageName: String) { + val launchIntent = packageManager.getLaunchIntentForPackage(packageName) + + if (launchIntent != null) { + startActivity(launchIntent) + } else { + try { + val playStoreIntent = Intent(Intent.ACTION_VIEW, "market://details?id=$packageName".toUri()) + playStoreIntent.setPackage("com.android.vending") + startActivity(playStoreIntent) + } catch (e2: ActivityNotFoundException) { + startActivity(Intent(Intent.ACTION_VIEW, "https://play.google.com/store/apps/details?id=$packageName}".toUri())) + + } + } + } +} \ No newline at end of file diff --git a/uplift-android b/uplift-android new file mode 160000 index 00000000..4e814635 --- /dev/null +++ b/uplift-android @@ -0,0 +1 @@ +Subproject commit 4e814635671da30990bea4d07ac603510ca29dbc From f1a2fb473bd3a57246ec60f9eeb1b562c6ffb447 Mon Sep 17 00:00:00 2001 From: AbigailLabanok <113201330+AbigailLabanok@users.noreply.github.com> Date: Sun, 26 Apr 2026 20:49:24 -0400 Subject: [PATCH 6/8] fixed minor issues in intentUtils --- .../cornellappdev/transit/util/IntentUtils.kt | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/transit/util/IntentUtils.kt b/app/src/main/java/com/cornellappdev/transit/util/IntentUtils.kt index 65b064a7..e557aa70 100644 --- a/app/src/main/java/com/cornellappdev/transit/util/IntentUtils.kt +++ b/app/src/main/java/com/cornellappdev/transit/util/IntentUtils.kt @@ -3,6 +3,7 @@ package com.cornellappdev.transit.util import android.content.ActivityNotFoundException import android.content.Context import android.content.Intent +import android.util.Log import androidx.core.net.toUri object IntentUtils { @@ -12,13 +13,19 @@ object IntentUtils { if (launchIntent != null) { startActivity(launchIntent) } else { + val playStoreIntent = Intent(Intent.ACTION_VIEW, "market://details?id=$packageName".toUri()) + .setPackage("com.android.vending") + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) try { - val playStoreIntent = Intent(Intent.ACTION_VIEW, "market://details?id=$packageName".toUri()) - playStoreIntent.setPackage("com.android.vending") startActivity(playStoreIntent) - } catch (e2: ActivityNotFoundException) { - startActivity(Intent(Intent.ACTION_VIEW, "https://play.google.com/store/apps/details?id=$packageName}".toUri())) - + } catch (e: ActivityNotFoundException) { + val webStoreIntent = Intent(Intent.ACTION_VIEW, "https://play.google.com/store/apps/details?id=$packageName".toUri()) + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + try { + startActivity(webStoreIntent) + } catch (e2: ActivityNotFoundException) { + Log.e("IntentUtils","no handler for play store web URL" ,e2) + } } } } From d0bc7a301b00a601732b2d3837217989ed33ed85 Mon Sep 17 00:00:00 2001 From: AbigailLabanok <113201330+AbigailLabanok@users.noreply.github.com> Date: Sun, 26 Apr 2026 22:22:41 -0400 Subject: [PATCH 7/8] deleted random folder + made TextButtons --- .../ui/components/home/EateryDetailsContent.kt | 18 ++++++++++-------- .../ui/components/home/GymDetailsContent.kt | 18 ++++++++++-------- uplift-android | 1 - 3 files changed, 20 insertions(+), 17 deletions(-) delete mode 160000 uplift-android diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/EateryDetailsContent.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/EateryDetailsContent.kt index 33b0b412..7000afc7 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/EateryDetailsContent.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/EateryDetailsContent.kt @@ -13,6 +13,7 @@ import androidx.compose.foundation.layout.size import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.Text +import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -94,15 +95,16 @@ fun EateryDetailsContent( val (annotatedString, inlineContent) = stringResource(R.string.view_menu).createDeepLink(R.drawable.eaterylink) - Text( - text = annotatedString, - inlineContent = inlineContent, - style = Style.heading2, - color = TransitBlue, - modifier = Modifier.clickable( - onClick = onDeepLinkClick + TextButton( + onClick = onDeepLinkClick + ) { + Text( + text = annotatedString, + inlineContent = inlineContent, + style = Style.heading2, + color = TransitBlue, ) - ) + } Spacer(modifier = Modifier.height(24.dp)) diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/GymDetailsContent.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/GymDetailsContent.kt index a26c1871..519dfccc 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/GymDetailsContent.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/GymDetailsContent.kt @@ -13,6 +13,7 @@ import androidx.compose.foundation.layout.size import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.Text +import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -103,15 +104,16 @@ fun GymDetailsContent( val (annotatedString, inlineContent) = stringResource(R.string.view_gym).createDeepLink(R.drawable.upliftlink) - Text( - text = annotatedString, - inlineContent = inlineContent, - style = Style.heading2, - color = TransitBlue, - modifier = Modifier.clickable( - onClick = onDeepLinkClick + TextButton( + onClick = onDeepLinkClick + ) { + Text( + text = annotatedString, + inlineContent = inlineContent, + style = Style.heading2, + color = TransitBlue, ) - ) + } Spacer(modifier = Modifier.height(24.dp)) diff --git a/uplift-android b/uplift-android deleted file mode 160000 index 4e814635..00000000 --- a/uplift-android +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 4e814635671da30990bea4d07ac603510ca29dbc From f994c10b80d0772712500596cb06b30fd2531769 Mon Sep 17 00:00:00 2001 From: Ryan Cheung Date: Mon, 27 Apr 2026 00:21:10 -0400 Subject: [PATCH 8/8] no more grace period for arrive by --- app/build.gradle.kts | 4 ++-- .../transit/util/RouteOptionsDisplayProcessor.kt | 12 +++++------- .../cornellappdev/transit/util/TransitConstants.kt | 1 - 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index ee748569..75727174 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -25,8 +25,8 @@ android { applicationId = "com.cornellappdev.transit" minSdk = 26 targetSdk = 36 - versionCode = 10 - versionName = "2.0" + versionCode = 11 + versionName = "2.1" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { diff --git a/app/src/main/java/com/cornellappdev/transit/util/RouteOptionsDisplayProcessor.kt b/app/src/main/java/com/cornellappdev/transit/util/RouteOptionsDisplayProcessor.kt index 307f33e1..8b03d060 100644 --- a/app/src/main/java/com/cornellappdev/transit/util/RouteOptionsDisplayProcessor.kt +++ b/app/src/main/java/com/cornellappdev/transit/util/RouteOptionsDisplayProcessor.kt @@ -258,13 +258,13 @@ private fun Route.effectiveArrivalInstantOrNull( return endInstant.plusSeconds(delaySeconds.toLong()) } -/** True when route arrives on or before provided cutoff (including grace already applied by caller). */ +/** True when route arrives on or before provided cutoff (strict, no grace period). */ private fun Route.arrivesBy( - cutoffWithGrace: Instant, + cutoff: Instant, diagnostics: RouteProcessingDiagnostics? = null, ): Boolean { val arrivalInstant = effectiveArrivalInstantOrNull(diagnostics) ?: return false - return !arrivalInstant.isAfter(cutoffWithGrace) + return !arrivalInstant.isAfter(cutoff) } /** Comparator for Arrive By ordering: latest departure first, then shorter distance. */ @@ -333,7 +333,7 @@ private fun compareByEffectiveLeaveTime( /** * Section-level Arrive By filtering and ordering. - * Keeps routes that arrive by cutoff (with grace), then sorts by latest departure first. + * Keeps routes that arrive by cutoff, then sorts by latest departure first. */ private fun List?.filterAndSortRoutesForArriveBy( cutoff: Instant, @@ -341,10 +341,8 @@ private fun List?.filterAndSortRoutesForArriveBy( ): List? { if (this == null) return null - val cutoffWithGrace = cutoff.plus(Duration.ofMinutes(ARRIVE_BY_CUTOFF_GRACE_MINUTES)) - return this - .filter { route -> route.arrivesBy(cutoffWithGrace, diagnostics) } + .filter { route -> route.arrivesBy(cutoff, diagnostics) } .sortedWith(::compareArriveByRoutes) } diff --git a/app/src/main/java/com/cornellappdev/transit/util/TransitConstants.kt b/app/src/main/java/com/cornellappdev/transit/util/TransitConstants.kt index 54ba13f0..a49ccfd2 100644 --- a/app/src/main/java/com/cornellappdev/transit/util/TransitConstants.kt +++ b/app/src/main/java/com/cornellappdev/transit/util/TransitConstants.kt @@ -22,7 +22,6 @@ const val LEAVE_CUTOFF_HORIZON_MINUTES = 45L const val LEAVE_CUTOFF_GRACE_MINUTES = 2L -const val ARRIVE_BY_CUTOFF_GRACE_MINUTES = 2L // Hide transit options when walking arrives at the same time or sooner (+ tie buffer). const val WALKING_TRANSIT_TIE_MINUTES = 1L