refactor: large treewide renaming
This commit is contained in:
parent
8c0bff3bc4
commit
c6b739e511
31 changed files with 206 additions and 174 deletions
|
|
@ -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" />
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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()
|
|
||||||
}
|
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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,
|
||||||
)
|
)
|
||||||
|
|
@ -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,
|
|
||||||
)
|
|
||||||
|
|
@ -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,
|
||||||
|
|
@ -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 }
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -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)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -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 {
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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,
|
||||||
|
)
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
package moe.lava.banksia.ui.platform.maps
|
||||||
|
|
||||||
|
data class CameraPositionBounds(val northeast: Point, val southwest: Point)
|
||||||
|
|
@ -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,
|
||||||
|
)
|
||||||
|
|
@ -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()
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
package moe.lava.banksia.ui.platform.maps
|
||||||
|
|
||||||
|
data class Point(val lat: Double, val lng: Double)
|
||||||
|
|
@ -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)
|
||||||
|
|
@ -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(),
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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"}")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package moe.lava.banksia
|
package moe.lava.banksia.util
|
||||||
|
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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")
|
||||||
|
|
@ -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")
|
||||||
Loading…
Add table
Add a link
Reference in a new issue