refactor: large treewide renaming

This commit is contained in:
LavaDesu 2025-08-05 00:37:28 +10:00
parent 8c0bff3bc4
commit c6b739e511
Signed by: cilly
GPG key ID: 6500251E087653C9
31 changed files with 206 additions and 174 deletions

View file

@ -18,7 +18,7 @@
<activity <activity
android:exported="true" android:exported="true"
android:configChanges="orientation|screenSize|screenLayout|keyboardHidden|mnc|colorMode|density|fontScale|fontWeightAdjustment|keyboard|layoutDirection|locale|mcc|navigation|smallestScreenSize|touchscreen|uiMode" android:configChanges="orientation|screenSize|screenLayout|keyboardHidden|mnc|colorMode|density|fontScale|fontWeightAdjustment|keyboard|layoutDirection|locale|mcc|navigation|smallestScreenSize|touchscreen|uiMode"
android:name=".MainActivity"> android:name=".ui.MainActivity">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />

View file

@ -1,11 +1,9 @@
package moe.lava.banksia package moe.lava.banksia.ui
import android.os.Bundle import android.os.Bundle
import androidx.activity.ComponentActivity import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge import androidx.activity.enableEdgeToEdge
import androidx.compose.runtime.Composable
import androidx.compose.ui.tooling.preview.Preview
class MainActivity : ComponentActivity() { class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
@ -17,9 +15,3 @@ class MainActivity : ComponentActivity() {
} }
} }
} }
@Preview
@Composable
fun AppAndroidPreview() {
App()
}

View file

@ -1,4 +1,4 @@
package moe.lava.banksia.native package moe.lava.banksia.ui.platform
import android.os.Build import android.os.Build
import androidx.compose.material3.ColorScheme import androidx.compose.material3.ColorScheme

View file

@ -1,4 +1,4 @@
package moe.lava.banksia.native.maps package moe.lava.banksia.ui.platform.maps
import android.Manifest import android.Manifest
import android.content.pm.PackageManager import android.content.pm.PackageManager
@ -41,12 +41,11 @@ import com.google.maps.android.compose.rememberCameraPositionState
import com.google.maps.android.compose.rememberMarkerState import com.google.maps.android.compose.rememberMarkerState
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import moe.lava.banksia.R import moe.lava.banksia.R
import moe.lava.banksia.api.ptv.structures.ComposableRouteIcon
import moe.lava.banksia.native.BanksiaTheme
import moe.lava.banksia.ui.BanksiaEvent import moe.lava.banksia.ui.BanksiaEvent
import moe.lava.banksia.ui.components.RouteIcon
import moe.lava.banksia.ui.platform.BanksiaTheme
import moe.lava.banksia.ui.state.MapState import moe.lava.banksia.ui.state.MapState
import moe.lava.banksia.util.BoxedValue import moe.lava.banksia.util.BoxedValue
import com.google.android.gms.maps.model.CameraPosition as GoogleCameraPosition
fun Point.toLatLng(): LatLng = LatLng(this.lat, this.lng) fun Point.toLatLng(): LatLng = LatLng(this.lat, this.lng)
@ -94,19 +93,30 @@ actual fun Maps(
LaunchedEffect(Unit) { LaunchedEffect(Unit) {
fusedLocation.lastLocation.addOnSuccessListener { fusedLocation.lastLocation.addOnSuccessListener {
if (it != null) { if (it != null) {
camPos.position = GoogleCameraPosition(LatLng(it.latitude, it.longitude), 16.0f, 0.0f, 0.0f) camPos.position = com.google.android.gms.maps.model.CameraPosition(
LatLng(
it.latitude,
it.longitude
), 16.0f, 0.0f, 0.0f
)
setLastKnownLocation(Point(it.latitude, it.longitude)) setLastKnownLocation(Point(it.latitude, it.longitude))
} }
} }
} }
GoogleMap( GoogleMap(
modifier = Modifier.fillMaxSize(), modifier = Modifier.Companion.fillMaxSize(),
cameraPositionState = camPos, cameraPositionState = camPos,
mapColorScheme = if (isSystemInDarkTheme()) { ComposeMapColorScheme.DARK } else { mapColorScheme = if (isSystemInDarkTheme()) {
ComposeMapColorScheme.LIGHT }, ComposeMapColorScheme.DARK
} else {
ComposeMapColorScheme.LIGHT
},
properties = DefaultMapProperties.copy( properties = DefaultMapProperties.copy(
mapStyleOptions = MapStyleOptions.loadRawResourceStyle(LocalContext.current, R.raw.def_mapstyle), mapStyleOptions = MapStyleOptions.loadRawResourceStyle(
LocalContext.current,
R.raw.def_mapstyle
),
isMyLocationEnabled = checkLocationPermission(), isMyLocationEnabled = checkLocationPermission(),
), ),
uiSettings = DefaultMapUiSettings.copy( uiSettings = DefaultMapUiSettings.copy(
@ -114,7 +124,7 @@ actual fun Maps(
myLocationButtonEnabled = false, myLocationButtonEnabled = false,
mapToolbarEnabled = false, mapToolbarEnabled = false,
), ),
contentPadding = WindowInsets.safeDrawing.add(extInsets).asPaddingValues() contentPadding = WindowInsets.Companion.safeDrawing.add(extInsets).asPaddingValues()
) { ) {
// [TODO]: Slight lag when routes with many stops such as the 901 bus is set // [TODO]: Slight lag when routes with many stops such as the 901 bus is set
for (marker in state.stops) { for (marker in state.stops) {
@ -130,7 +140,7 @@ actual fun Maps(
} }
) { ) {
Box( Box(
modifier = Modifier modifier = Modifier.Companion
.size(12.dp) .size(12.dp)
.clip(CircleShape) .clip(CircleShape)
.background(BanksiaTheme.colors.surface) .background(BanksiaTheme.colors.surface)
@ -150,7 +160,7 @@ actual fun Maps(
false false
} }
) { ) {
ComposableRouteIcon( RouteIcon(
size = 30.dp, size = 30.dp,
routeType = marker.type, routeType = marker.type,
) )

View file

@ -1,51 +0,0 @@
package moe.lava.banksia.native.maps
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import kotlinx.coroutines.flow.Flow
import moe.lava.banksia.api.ptv.structures.PtvRouteType
import moe.lava.banksia.ui.BanksiaEvent
import moe.lava.banksia.ui.state.MapState
import moe.lava.banksia.util.BoxedValue
sealed class Marker {
abstract val point: Point
data class Stop(
override val point: Point,
val id: Int,
val type: PtvRouteType,
val colour: Color,
) : Marker()
data class Vehicle(
override val point: Point,
val ref: String,
val type: PtvRouteType,
) : Marker()
}
data class Point(val lat: Double, val lng: Double)
data class Polyline(val points: List<Point>, val colour: Color)
data class CameraPositionBounds(val northeast: Point, val southwest: Point)
data class CameraPosition(
val centre: Point = Point(-37.8136, 144.9631),
val bounds: CameraPositionBounds? = null,
)
@Composable
expect fun getScreenHeight(): Int
@OptIn(ExperimentalMaterial3Api::class)
@Composable
expect fun Maps(
modifier: Modifier = Modifier,
state: MapState,
onEvent: (BanksiaEvent) -> Unit,
cameraPositionFlow: Flow<BoxedValue<CameraPosition>>,
setLastKnownLocation: (Point) -> Unit,
extInsets: WindowInsets,
)

View file

@ -1,4 +1,4 @@
package moe.lava.banksia package moe.lava.banksia.ui
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.WindowInsets
@ -41,19 +41,16 @@ import dev.icerock.moko.geo.compose.BindLocationTrackerEffect
import dev.icerock.moko.geo.compose.LocationTrackerAccuracy import dev.icerock.moko.geo.compose.LocationTrackerAccuracy
import dev.icerock.moko.geo.compose.rememberLocationTrackerFactory import dev.icerock.moko.geo.compose.rememberLocationTrackerFactory
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import moe.lava.banksia.native.BanksiaTheme
import moe.lava.banksia.native.maps.Maps
import moe.lava.banksia.native.maps.Point
import moe.lava.banksia.native.maps.getScreenHeight
import moe.lava.banksia.resources.Res import moe.lava.banksia.resources.Res
import moe.lava.banksia.resources.my_location_24 import moe.lava.banksia.resources.my_location_24
import moe.lava.banksia.ui.BanksiaEvent import moe.lava.banksia.ui.layout.InfoPanel
import moe.lava.banksia.ui.BanksiaViewModel import moe.lava.banksia.ui.layout.Searcher
import moe.lava.banksia.ui.InfoPanel import moe.lava.banksia.ui.platform.BanksiaTheme
import moe.lava.banksia.ui.Searcher import moe.lava.banksia.ui.platform.maps.Maps
import moe.lava.banksia.ui.platform.maps.Point
import moe.lava.banksia.ui.platform.maps.getScreenHeight
import moe.lava.banksia.ui.state.InfoPanelState import moe.lava.banksia.ui.state.InfoPanelState
import org.jetbrains.compose.resources.painterResource import org.jetbrains.compose.resources.painterResource
import org.jetbrains.compose.ui.tooling.preview.Preview
import kotlin.coroutines.cancellation.CancellationException import kotlin.coroutines.cancellation.CancellationException
import kotlin.math.roundToInt import kotlin.math.roundToInt
@ -61,7 +58,6 @@ val MELBOURNE = Point(-37.8136, 144.9631)
@OptIn(ExperimentalMaterial3Api::class, ExperimentalComposeUiApi::class) @OptIn(ExperimentalMaterial3Api::class, ExperimentalComposeUiApi::class)
@Composable @Composable
@Preview
fun App( fun App(
viewModel: BanksiaViewModel = viewModel() viewModel: BanksiaViewModel = viewModel()
) { ) {
@ -91,7 +87,8 @@ fun App(
) { ) {
val offset = runCatching { sheetState.requireOffset() } val offset = runCatching { sheetState.requireOffset() }
val scaffoldOffset = offset.getOrDefault(0.0f).roundToInt() val scaffoldOffset = offset.getOrDefault(0.0f).roundToInt()
(getScreenHeight() - scaffoldOffset - WindowInsets.safeDrawing.getBottom(LocalDensity.current)).coerceAtLeast(0) (getScreenHeight() - scaffoldOffset - WindowInsets.Companion.safeDrawing.getBottom(
LocalDensity.current)).coerceAtLeast(0)
} else 0 } else 0
LaunchedEffect(infoState) { LaunchedEffect(infoState) {
@ -111,7 +108,7 @@ fun App(
BottomSheetScaffold( BottomSheetScaffold(
scaffoldState = scaffoldState, scaffoldState = scaffoldState,
sheetPeekHeight = (handleHeight + peekHeight) * peekHeightMultiplier, sheetPeekHeight = (handleHeight + peekHeight) * peekHeightMultiplier,
modifier = Modifier.fillMaxSize(), modifier = Modifier.Companion.fillMaxSize(),
sheetContent = { sheetContent = {
InfoPanel( InfoPanel(
state = infoState, state = infoState,
@ -122,20 +119,20 @@ fun App(
sheetDragHandle = { sheetDragHandle = {
val density = LocalDensity.current val density = LocalDensity.current
Box( Box(
Modifier Modifier.Companion
.fillMaxWidth() .fillMaxWidth()
.padding(horizontal = 10.dp) .padding(horizontal = 10.dp)
.onSizeChanged { .onSizeChanged {
handleHeight = with(density) { it.height.toDp() } handleHeight = with(density) { it.height.toDp() }
} }
) { ) {
BottomSheetDefaults.DragHandle(modifier = Modifier.align(Alignment.Center)) BottomSheetDefaults.DragHandle(modifier = Modifier.Companion.align(Alignment.Companion.Center))
} }
}, },
sheetSwipeEnabled = sheetSwipeEnabled, sheetSwipeEnabled = sheetSwipeEnabled,
) { ) {
Maps( Maps(
modifier = Modifier.fillMaxSize(), modifier = Modifier.Companion.fillMaxSize(),
state = mapState, state = mapState,
onEvent = viewModel::handleEvent, onEvent = viewModel::handleEvent,
cameraPositionFlow = viewModel.cameraChangeEmitter, cameraPositionFlow = viewModel.cameraChangeEmitter,
@ -178,8 +175,12 @@ fun App(
} }
Box( Box(
Modifier.windowInsetsPadding(WindowInsets.safeContent.add(WindowInsets(bottom = extInsets))), Modifier.Companion.windowInsetsPadding(
contentAlignment = Alignment.BottomEnd WindowInsets.Companion.safeContent.add(
WindowInsets(bottom = extInsets)
)
),
contentAlignment = Alignment.Companion.BottomEnd
) { ) {
FloatingActionButton( FloatingActionButton(
containerColor = MaterialTheme.colorScheme.surfaceContainer, containerColor = MaterialTheme.colorScheme.surfaceContainer,

View file

@ -18,19 +18,19 @@ import kotlinx.datetime.Instant
import moe.lava.banksia.api.ptv.PtvService import moe.lava.banksia.api.ptv.PtvService
import moe.lava.banksia.api.ptv.structures.PtvRoute import moe.lava.banksia.api.ptv.structures.PtvRoute
import moe.lava.banksia.api.ptv.structures.PtvRouteType import moe.lava.banksia.api.ptv.structures.PtvRouteType
import moe.lava.banksia.api.ptv.structures.getProperties import moe.lava.banksia.ui.components.getUIProperties
import moe.lava.banksia.log import moe.lava.banksia.ui.platform.maps.CameraPosition
import moe.lava.banksia.native.maps.CameraPosition import moe.lava.banksia.ui.platform.maps.CameraPositionBounds
import moe.lava.banksia.native.maps.CameraPositionBounds import moe.lava.banksia.ui.platform.maps.Marker
import moe.lava.banksia.native.maps.Marker import moe.lava.banksia.ui.platform.maps.Point
import moe.lava.banksia.native.maps.Point import moe.lava.banksia.ui.platform.maps.Polyline
import moe.lava.banksia.native.maps.Polyline
import moe.lava.banksia.ui.state.InfoPanelState import moe.lava.banksia.ui.state.InfoPanelState
import moe.lava.banksia.ui.state.MapState import moe.lava.banksia.ui.state.MapState
import moe.lava.banksia.ui.state.SearchState import moe.lava.banksia.ui.state.SearchState
import moe.lava.banksia.util.BoxedValue import moe.lava.banksia.util.BoxedValue
import moe.lava.banksia.util.BoxedValue.Companion.box import moe.lava.banksia.util.BoxedValue.Companion.box
import moe.lava.banksia.util.LoopFlow.Companion.waitUntilSubscribed import moe.lava.banksia.util.LoopFlow.Companion.waitUntilSubscribed
import moe.lava.banksia.util.log
sealed class BanksiaEvent { sealed class BanksiaEvent {
data object DismissState : BanksiaEvent() data object DismissState : BanksiaEvent()
@ -256,7 +256,7 @@ class BanksiaViewModel : ViewModel() {
ptvService.route(route.routeId, true) ptvService.route(route.routeId, true)
else else
route route
val colour = routeWithGeo.routeType.getProperties().colour val colour = routeWithGeo.routeType.getUIProperties().colour
val polylines = mutableListOf<Polyline>() val polylines = mutableListOf<Polyline>()
val allPoints = mutableListOf<Point>() val allPoints = mutableListOf<Point>()
@ -309,7 +309,7 @@ class BanksiaViewModel : ViewModel() {
private suspend fun buildStops(route: PtvRoute) { private suspend fun buildStops(route: PtvRoute) {
val stops = ptvService.stopsByRoute(route.routeId, route.routeType) val stops = ptvService.stopsByRoute(route.routeId, route.routeType)
val colour = route.routeType.getProperties().colour val colour = route.routeType.getUIProperties().colour
val markers = stops val markers = stops
.filter { it.stopLatitude != null && it.stopLongitude != null } .filter { it.stopLatitude != null && it.stopLongitude != null }

View file

@ -1,4 +1,4 @@
package moe.lava.banksia.api.ptv.structures package moe.lava.banksia.ui.components
import androidx.compose.foundation.Image import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
@ -11,6 +11,7 @@ import androidx.compose.ui.draw.drawBehind
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import moe.lava.banksia.api.ptv.structures.PtvRouteType
import moe.lava.banksia.resources.Res import moe.lava.banksia.resources.Res
import moe.lava.banksia.resources.bus import moe.lava.banksia.resources.bus
import moe.lava.banksia.resources.bus_background import moe.lava.banksia.resources.bus_background
@ -31,7 +32,8 @@ data class RouteTypeProperties(
val background: DrawableResource, val background: DrawableResource,
val icon: DrawableResource, val icon: DrawableResource,
) )
fun PtvRouteType.getProperties(): RouteTypeProperties {
fun PtvRouteType.getUIProperties(): RouteTypeProperties {
val colour = when (this) { val colour = when (this) {
PtvRouteType.TRAIN -> Color(0xFF0072CE) PtvRouteType.TRAIN -> Color(0xFF0072CE)
PtvRouteType.TRAM -> Color(0xFF78BE20) PtvRouteType.TRAM -> Color(0xFF78BE20)
@ -40,34 +42,25 @@ fun PtvRouteType.getProperties(): RouteTypeProperties {
} }
val (drawable, background, icon) = when (this) { val (drawable, background, icon) = when (this) {
PtvRouteType.TRAM -> Triple( PtvRouteType.TRAM -> Triple(
Res.drawable.tram, Res.drawable.tram_background, Res.drawable.tram_icon) Res.drawable.tram, Res.drawable.tram_background, Res.drawable.tram_icon
)
PtvRouteType.TRAIN, PtvRouteType.VLINE -> Triple( PtvRouteType.TRAIN, PtvRouteType.VLINE -> Triple(
Res.drawable.train, Res.drawable.train_background, Res.drawable.train_icon) Res.drawable.train, Res.drawable.train_background, Res.drawable.train_icon
)
PtvRouteType.BUS, PtvRouteType.NIGHT_BUS -> Triple( PtvRouteType.BUS, PtvRouteType.NIGHT_BUS -> Triple(
Res.drawable.bus, Res.drawable.bus_background, Res.drawable.bus_icon) Res.drawable.bus, Res.drawable.bus_background, Res.drawable.bus_icon
)
} }
return RouteTypeProperties(colour, drawable, background, icon) return RouteTypeProperties(colour, drawable, background, icon)
} }
const val ICON_PADDING = 0.25f
@Preview
@Composable @Composable
private fun RouteIconPreview() { fun RouteIcon(
Row { modifier: Modifier = Modifier.Companion,
ComposableRouteIcon(routeType = PtvRouteType.TRAIN)
ComposableRouteIcon(routeType = PtvRouteType.TRAM)
ComposableRouteIcon(routeType = PtvRouteType.BUS)
}
}
@Composable
fun ComposableRouteIcon(
modifier: Modifier = Modifier,
size: Dp = 40.dp, size: Dp = 40.dp,
routeType: PtvRouteType, routeType: PtvRouteType,
) { ) {
val properties = routeType.getProperties() val properties = routeType.getUIProperties()
Image( Image(
painter = painterResource(properties.icon), painter = painterResource(properties.icon),
contentDescription = null, contentDescription = null,
@ -81,5 +74,15 @@ fun ComposableRouteIcon(
) )
} }
const val ICON_PADDING = 0.25f
@Preview
@Composable @Composable
inline fun PtvRouteType.ComposableIcon(modifier: Modifier = Modifier) = ComposableRouteIcon(modifier, routeType = this) private fun RouteIconPreview() {
Row {
RouteIcon(routeType = PtvRouteType.TRAIN)
RouteIcon(routeType = PtvRouteType.TRAM)
RouteIcon(routeType = PtvRouteType.BUS)
}
}

View file

@ -1,4 +1,4 @@
package moe.lava.banksia.ui package moe.lava.banksia.ui.layout
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
@ -29,7 +29,8 @@ import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.coerceAtMost import androidx.compose.ui.unit.coerceAtMost
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import moe.lava.banksia.api.ptv.structures.ComposableRouteIcon import moe.lava.banksia.ui.BanksiaEvent
import moe.lava.banksia.ui.components.RouteIcon
import moe.lava.banksia.ui.state.InfoPanelState import moe.lava.banksia.ui.state.InfoPanelState
@Composable @Composable
@ -44,7 +45,7 @@ fun InfoPanel(
val localDensity = LocalDensity.current val localDensity = LocalDensity.current
Column( Column(
Modifier Modifier.Companion
.fillMaxWidth() .fillMaxWidth()
.padding(horizontal = 24.dp) .padding(horizontal = 24.dp)
.heightIn(max = 250.dp) .heightIn(max = 250.dp)
@ -63,10 +64,10 @@ fun InfoPanel(
if (state.loading) if (state.loading)
CircularProgressIndicator( CircularProgressIndicator(
modifier = Modifier.width(32.dp).align(Alignment.CenterEnd) modifier = Modifier.Companion.width(32.dp).align(Alignment.Companion.CenterEnd)
) )
} }
Spacer(Modifier.windowInsetsBottomHeight(WindowInsets.safeContent)) Spacer(Modifier.Companion.windowInsetsBottomHeight(WindowInsets.Companion.safeContent))
} }
} }
@ -75,14 +76,14 @@ private inline fun RouteInfoPanel(
state: InfoPanelState.Route, state: InfoPanelState.Route,
onEvent: (BanksiaEvent) -> Unit, onEvent: (BanksiaEvent) -> Unit,
) { ) {
Column(Modifier.fillMaxWidth()) { Column(Modifier.Companion.fillMaxWidth()) {
Row { Row {
ComposableRouteIcon(routeType = state.type) RouteIcon(routeType = state.type)
Text( Text(
state.name, state.name,
style = MaterialTheme.typography.titleLarge, style = MaterialTheme.typography.titleLarge,
fontWeight = FontWeight.SemiBold, fontWeight = FontWeight.Companion.SemiBold,
textAlign = TextAlign.Start textAlign = TextAlign.Companion.Start
) )
} }
} }
@ -93,14 +94,14 @@ private inline fun RunInfoPanel(
state: InfoPanelState.Run, state: InfoPanelState.Run,
onEvent: (BanksiaEvent) -> Unit, onEvent: (BanksiaEvent) -> Unit,
) { ) {
Column(Modifier.fillMaxWidth()) { Column(Modifier.Companion.fillMaxWidth()) {
Row { Row {
ComposableRouteIcon(routeType = state.type) RouteIcon(routeType = state.type)
Text( Text(
"${state.direction} via ${state.routeName ?: "..."}", "${state.direction} via ${state.routeName ?: "..."}",
style = MaterialTheme.typography.titleLarge, style = MaterialTheme.typography.titleLarge,
fontWeight = FontWeight.SemiBold, fontWeight = FontWeight.Companion.SemiBold,
textAlign = TextAlign.Start textAlign = TextAlign.Companion.Start
) )
} }
} }
@ -111,29 +112,38 @@ private inline fun StopInfoPanel(
state: InfoPanelState.Stop, state: InfoPanelState.Stop,
onEvent: (BanksiaEvent) -> Unit, onEvent: (BanksiaEvent) -> Unit,
) { ) {
Column(Modifier.fillMaxWidth()) { Column(Modifier.Companion.fillMaxWidth()) {
Text( Text(
state.name, state.name,
style = MaterialTheme.typography.titleLarge, style = MaterialTheme.typography.titleLarge,
fontWeight = FontWeight.SemiBold, fontWeight = FontWeight.Companion.SemiBold,
textAlign = TextAlign.Start textAlign = TextAlign.Companion.Start
) )
state.subname?.let { state.subname?.let {
Text( Text(
"/ $it", "/ $it",
modifier = Modifier.padding(start = 5.dp), modifier = Modifier.Companion.padding(start = 5.dp),
style = MaterialTheme.typography.titleSmall, style = MaterialTheme.typography.titleSmall,
color = Color.Gray, color = Color.Companion.Gray,
fontWeight = FontWeight.SemiBold, fontWeight = FontWeight.Companion.SemiBold,
textAlign = TextAlign.Start textAlign = TextAlign.Companion.Start
) )
} }
state.departures?.let { state.departures?.let {
Spacer(Modifier.height(5.dp)) Spacer(Modifier.Companion.height(5.dp))
it.forEach { (name, formatted) -> it.forEach { (name, formatted) ->
Row(verticalAlignment = Alignment.CenterVertically) { Row(verticalAlignment = Alignment.Companion.CenterVertically) {
Text(name, style = MaterialTheme.typography.titleMedium, fontWeight = FontWeight.SemiBold) Text(
Text(formatted, maxLines = 1, overflow = TextOverflow.Ellipsis, modifier = Modifier.padding(horizontal = 5.dp)) name,
style = MaterialTheme.typography.titleMedium,
fontWeight = FontWeight.Companion.SemiBold
)
Text(
formatted,
maxLines = 1,
overflow = TextOverflow.Companion.Ellipsis,
modifier = Modifier.Companion.padding(horizontal = 5.dp)
)
} }
} }
} }

View file

@ -1,4 +1,4 @@
package moe.lava.banksia.ui package moe.lava.banksia.ui.layout
import androidx.compose.animation.core.animateDpAsState import androidx.compose.animation.core.animateDpAsState
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
@ -23,7 +23,8 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import moe.lava.banksia.api.ptv.structures.ComposableRouteIcon import moe.lava.banksia.ui.BanksiaEvent
import moe.lava.banksia.ui.components.RouteIcon
import moe.lava.banksia.ui.state.SearchState import moe.lava.banksia.ui.state.SearchState
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@ -43,16 +44,16 @@ fun Searcher(
label = "padding" label = "padding"
) )
Box(modifier = Modifier.fillMaxSize()) { Box(modifier = Modifier.Companion.fillMaxSize()) {
SearchBar( SearchBar(
modifier = Modifier modifier = Modifier.Companion
.align(Alignment.TopCenter) .align(Alignment.Companion.TopCenter)
.fillMaxWidth() .fillMaxWidth()
.padding(horizontal = animatedPadding), .padding(horizontal = animatedPadding),
shadowElevation = 6.dp, // Elevation level 3 shadowElevation = 6.dp, // Elevation level 3
inputField = { inputField = {
SearchBarDefaults.InputField( SearchBarDefaults.InputField(
modifier = Modifier.padding(horizontal = 20.dp - animatedPadding), modifier = Modifier.Companion.padding(horizontal = 20.dp - animatedPadding),
query = state.text, query = state.text,
onQueryChange = { onEvent(BanksiaEvent.SearchUpdate(it)) }, onQueryChange = { onEvent(BanksiaEvent.SearchUpdate(it)) },
onSearch = {}, onSearch = {},
@ -64,7 +65,13 @@ fun Searcher(
Icon( Icon(
imageVector = Icons.Default.Clear, imageVector = Icons.Default.Clear,
contentDescription = null, contentDescription = null,
modifier = Modifier.clickable { onEvent(BanksiaEvent.SearchUpdate("")) } modifier = Modifier.Companion.clickable {
onEvent(
BanksiaEvent.SearchUpdate(
""
)
)
}
) )
} }
) )
@ -72,15 +79,15 @@ fun Searcher(
expanded = expanded, expanded = expanded,
onExpandedChange = onExpandedChange, onExpandedChange = onExpandedChange,
) { ) {
LazyColumn(modifier = Modifier.fillMaxWidth()) { LazyColumn(modifier = Modifier.Companion.fillMaxWidth()) {
for (entry in state.entries) { for (entry in state.entries) {
item { item {
ListItem( ListItem(
headlineContent = { Text(entry.mainText) }, headlineContent = { Text(entry.mainText) },
supportingContent = { entry.subText?.let { Text(it) } }, supportingContent = { entry.subText?.let { Text(it) } },
leadingContent = { ComposableRouteIcon(routeType = entry.routeType) }, leadingContent = { RouteIcon(routeType = entry.routeType) },
colors = ListItemDefaults.colors(containerColor = Color.Transparent), colors = ListItemDefaults.colors(containerColor = Color.Companion.Transparent),
modifier = Modifier modifier = Modifier.Companion
.fillMaxWidth() .fillMaxWidth()
.padding(horizontal = 16.dp, vertical = 4.dp) .padding(horizontal = 16.dp, vertical = 4.dp)
.clickable { .clickable {

View file

@ -1,4 +1,4 @@
package moe.lava.banksia.native package moe.lava.banksia.ui.platform
import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.material3.ColorScheme import androidx.compose.material3.ColorScheme

View file

@ -0,0 +1,6 @@
package moe.lava.banksia.ui.platform.maps
data class CameraPosition(
val centre: Point = Point(-37.8136, 144.9631),
val bounds: CameraPositionBounds? = null,
)

View file

@ -0,0 +1,3 @@
package moe.lava.banksia.ui.platform.maps
data class CameraPositionBounds(val northeast: Point, val southwest: Point)

View file

@ -0,0 +1,24 @@
package moe.lava.banksia.ui.platform.maps
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import kotlinx.coroutines.flow.Flow
import moe.lava.banksia.ui.BanksiaEvent
import moe.lava.banksia.ui.state.MapState
import moe.lava.banksia.util.BoxedValue
@Composable
expect fun getScreenHeight(): Int
@OptIn(ExperimentalMaterial3Api::class)
@Composable
expect fun Maps(
modifier: Modifier = Modifier.Companion,
state: MapState,
onEvent: (BanksiaEvent) -> Unit,
cameraPositionFlow: Flow<BoxedValue<CameraPosition>>,
setLastKnownLocation: (Point) -> Unit,
extInsets: WindowInsets,
)

View file

@ -0,0 +1,21 @@
package moe.lava.banksia.ui.platform.maps
import androidx.compose.ui.graphics.Color
import moe.lava.banksia.api.ptv.structures.PtvRouteType
sealed class Marker {
abstract val point: Point
data class Stop(
override val point: Point,
val id: Int,
val type: PtvRouteType,
val colour: Color,
) : Marker()
data class Vehicle(
override val point: Point,
val ref: String,
val type: PtvRouteType,
) : Marker()
}

View file

@ -0,0 +1,3 @@
package moe.lava.banksia.ui.platform.maps
data class Point(val lat: Double, val lng: Double)

View file

@ -0,0 +1,5 @@
package moe.lava.banksia.ui.platform.maps
import androidx.compose.ui.graphics.Color
data class Polyline(val points: List<Point>, val colour: Color)

View file

@ -1,7 +1,7 @@
package moe.lava.banksia.ui.state package moe.lava.banksia.ui.state
import moe.lava.banksia.native.maps.Marker import moe.lava.banksia.ui.platform.maps.Marker
import moe.lava.banksia.native.maps.Polyline import moe.lava.banksia.ui.platform.maps.Polyline
data class MapState( data class MapState(
val stops: List<Marker.Stop> = listOf(), val stops: List<Marker.Stop> = listOf(),

View file

@ -1,4 +1,4 @@
package moe.lava.banksia package moe.lava.banksia.ui
import androidx.compose.ui.window.ComposeUIViewController import androidx.compose.ui.window.ComposeUIViewController

View file

@ -1,4 +1,4 @@
package moe.lava.banksia.native package moe.lava.banksia.ui.platform
import androidx.compose.material3.ColorScheme import androidx.compose.material3.ColorScheme
import androidx.compose.material3.darkColorScheme import androidx.compose.material3.darkColorScheme

View file

@ -1,4 +1,4 @@
package moe.lava.banksia.native.maps package moe.lava.banksia.ui.platform.maps
import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api

View file

@ -7,7 +7,7 @@ plugins {
group = "moe.lava.banksia" group = "moe.lava.banksia"
version = "1.0.0" version = "1.0.0"
application { application {
mainClass.set("moe.lava.banksia.ApplicationKt") mainClass.set("moe.lava.banksia.server.ApplicationKt")
applicationDefaultJvmArgs = listOf("-Dio.ktor.development=${extra["io.ktor.development"] ?: "false"}") applicationDefaultJvmArgs = listOf("-Dio.ktor.development=${extra["io.ktor.development"] ?: "false"}")
} }

View file

@ -1,4 +1,4 @@
package moe.lava.banksia package moe.lava.banksia.server
import io.ktor.server.application.Application import io.ktor.server.application.Application
import io.ktor.server.engine.embeddedServer import io.ktor.server.engine.embeddedServer

View file

@ -1,4 +1,4 @@
package moe.lava.banksia package moe.lava.banksia.util
import android.util.Log import android.util.Log

View file

@ -24,10 +24,10 @@ import moe.lava.banksia.api.ptv.structures.PtvRoute
import moe.lava.banksia.api.ptv.structures.PtvRouteType import moe.lava.banksia.api.ptv.structures.PtvRouteType
import moe.lava.banksia.api.ptv.structures.PtvRun import moe.lava.banksia.api.ptv.structures.PtvRun
import moe.lava.banksia.api.ptv.structures.PtvStop import moe.lava.banksia.api.ptv.structures.PtvStop
import moe.lava.banksia.error
import moe.lava.banksia.log
import moe.lava.banksia.util.CacheMap import moe.lava.banksia.util.CacheMap
import moe.lava.banksia.util.LoopFlow.Companion.initWith import moe.lava.banksia.util.LoopFlow.Companion.initWith
import moe.lava.banksia.util.error
import moe.lava.banksia.util.log
import moe.lava.banksia.util.loopFlow import moe.lava.banksia.util.loopFlow
import okio.ByteString.Companion.encodeUtf8 import okio.ByteString.Companion.encodeUtf8
import kotlin.random.Random import kotlin.random.Random

View file

@ -3,7 +3,6 @@ package moe.lava.banksia.util
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import moe.lava.banksia.error
class CacheMap<K, V>( class CacheMap<K, V>(
coroutineScope: CoroutineScope, coroutineScope: CoroutineScope,

View file

@ -1,5 +1,5 @@
package moe.lava.banksia package moe.lava.banksia.util
expect fun log(tag: String, msg: String)
fun error(tag: String, throwable: Throwable) = error(tag, "", throwable) fun error(tag: String, throwable: Throwable) = error(tag, "", throwable)
expect fun log(tag: String, msg: String)
expect fun error(tag: String, msg: String, throwable: Throwable? = null) expect fun error(tag: String, msg: String, throwable: Throwable? = null)

View file

@ -7,7 +7,6 @@ import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.FlowCollector import kotlinx.coroutines.flow.FlowCollector
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.first
import moe.lava.banksia.log
import kotlin.experimental.ExperimentalTypeInference import kotlin.experimental.ExperimentalTypeInference
@OptIn(ExperimentalCoroutinesApi::class) @OptIn(ExperimentalCoroutinesApi::class)

View file

@ -1,4 +1,4 @@
package moe.lava.banksia package moe.lava.banksia.util
actual fun log(tag: String, msg: String) { actual fun log(tag: String, msg: String) {
TODO("Not yet implemented") TODO("Not yet implemented")

View file

@ -1,4 +1,4 @@
package moe.lava.banksia package moe.lava.banksia.util
actual fun log(tag: String, msg: String) { actual fun log(tag: String, msg: String) {
println("[$tag] $msg") println("[$tag] $msg")