Files
rider-pro-android-app/app/src/main/java/com/aiosman/riderpro/Street.kt

237 lines
9.2 KiB
Kotlin
Raw Normal View History

2024-06-22 04:25:20 +08:00
package com.aiosman.riderpro
2024-07-19 15:24:11 +08:00
import android.content.pm.PackageManager
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.result.contract.ActivityResultContracts
2024-06-22 04:25:20 +08:00
import androidx.compose.foundation.Image
2024-07-19 15:24:11 +08:00
import androidx.compose.foundation.background
2024-07-13 17:41:51 +08:00
import androidx.compose.foundation.clickable
2024-07-19 15:24:11 +08:00
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.WindowInsets
2024-06-22 04:25:20 +08:00
import androidx.compose.foundation.layout.fillMaxSize
2024-07-19 15:24:11 +08:00
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.navigationBars
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.BasicTextField
import androidx.compose.material3.Button
import androidx.compose.material3.Icon
import androidx.compose.material3.Text
2024-06-22 04:25:20 +08:00
import androidx.compose.runtime.Composable
2024-07-19 15:24:11 +08:00
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
2024-06-22 04:25:20 +08:00
import androidx.compose.ui.Modifier
2024-07-19 15:24:11 +08:00
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalDensity
2024-06-22 04:25:20 +08:00
import androidx.compose.ui.res.painterResource
2024-07-19 15:24:11 +08:00
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.core.content.ContextCompat
import com.google.android.gms.location.FusedLocationProviderClient
import com.google.android.gms.location.LocationServices
2024-06-22 04:25:20 +08:00
import com.google.android.gms.maps.model.CameraPosition
import com.google.android.gms.maps.model.LatLng
import com.google.maps.android.compose.GoogleMap
2024-07-19 15:24:11 +08:00
import com.google.maps.android.compose.MapProperties
import com.google.maps.android.compose.MapUiSettings
2024-06-22 04:25:20 +08:00
import com.google.maps.android.compose.MarkerComposable
import com.google.maps.android.compose.MarkerState
import com.google.maps.android.compose.rememberCameraPositionState
@Composable
2024-07-19 15:24:11 +08:00
fun StreetPage() {
2024-07-13 17:41:51 +08:00
val navController = LocalNavController.current
2024-07-19 15:24:11 +08:00
val context = LocalContext.current
val fusedLocationClient: FusedLocationProviderClient =
LocationServices.getFusedLocationProviderClient(context)
var currentLocation by remember { mutableStateOf<LatLng?>(null) }
val navigationBarHeight = with(LocalDensity.current) {
WindowInsets.navigationBars.getBottom(this).toDp()
}
2024-06-22 04:25:20 +08:00
val cameraPositionState = rememberCameraPositionState {
2024-07-19 15:24:11 +08:00
position = CameraPosition.fromLatLngZoom(currentLocation ?: LatLng(0.0, 0.0), 10f)
2024-06-22 04:25:20 +08:00
}
2024-07-19 15:24:11 +08:00
var hasLocationPermission by remember { mutableStateOf(false) }
var searchText by remember { mutableStateOf("") }
val permissionLauncher = rememberLauncherForActivityResult(
contract = ActivityResultContracts.RequestPermission(),
onResult = { isGranted ->
hasLocationPermission = isGranted
if (isGranted) {
fusedLocationClient.lastLocation.addOnSuccessListener { location ->
if (location != null) {
currentLocation = LatLng(location.latitude, location.longitude)
}
}
}
}
)
LaunchedEffect(Unit) {
when (PackageManager.PERMISSION_GRANTED) {
ContextCompat.checkSelfPermission(
context,
android.Manifest.permission.ACCESS_FINE_LOCATION
) -> {
fusedLocationClient.lastLocation.addOnSuccessListener { location ->
if (location != null) {
currentLocation = LatLng(location.latitude, location.longitude)
}
}
hasLocationPermission = true
}
else -> {
permissionLauncher.launch(android.Manifest.permission.ACCESS_FINE_LOCATION)
}
}
}
LaunchedEffect(currentLocation) {
cameraPositionState.position =
CameraPosition.fromLatLngZoom(currentLocation ?: LatLng(0.0, 0.0), 10f)
}
Box(
modifier = Modifier.fillMaxSize().padding(bottom = 56.dp + navigationBarHeight)
2024-06-22 04:25:20 +08:00
) {
2024-07-19 15:24:11 +08:00
GoogleMap(
modifier = Modifier.fillMaxSize(),
cameraPositionState = cameraPositionState,
properties = MapProperties(
isMyLocationEnabled = hasLocationPermission,
),
uiSettings = MapUiSettings(
compassEnabled = true,
myLocationButtonEnabled = false,
zoomControlsEnabled = false
)
) {
countries.forEach { position ->
MarkerComposable(
state = MarkerState(position = LatLng(position.lat, position.lng)),
onClick = { it ->
navController.navigate("LocationDetail")
true
}
) {
Image(
painter = painterResource(id = R.drawable.rider_pro_map_mark),
contentDescription = "",
)
}
}
}
Image(
painter = painterResource(id = R.drawable.rider_pro_my_location),
contentDescription = "",
modifier = Modifier
.align(Alignment.BottomStart)
.padding(start = 16.dp, bottom = 16.dp + navigationBarHeight) .clickable {
currentLocation?.let {
cameraPositionState.position = CameraPosition.fromLatLngZoom(it, cameraPositionState.position.zoom)
}
2024-07-13 17:41:51 +08:00
}
2024-07-19 15:24:11 +08:00
)
Box(
modifier = Modifier
.align(Alignment.BottomEnd)
.padding(end = 16.dp, bottom = 16.dp + navigationBarHeight)
) {
Box(
modifier = Modifier
.size(48.dp)
.clip(CircleShape)
.background(color = Color(0xffda3832))
2024-06-22 04:25:20 +08:00
) {
Image(
2024-07-19 15:24:11 +08:00
painter = painterResource(id = R.drawable.rider_pro_new_post_add_pic),
2024-06-22 04:25:20 +08:00
contentDescription = "",
2024-07-19 15:24:11 +08:00
modifier = Modifier
.align(Alignment.Center).size(36.dp),
colorFilter = ColorFilter.tint(Color.White)
2024-06-22 04:25:20 +08:00
)
}
}
2024-07-19 15:24:11 +08:00
Box(
modifier = Modifier
.fillMaxWidth()
.align(Alignment.TopCenter)
.padding(top = 64.dp, start = 16.dp,end=16.dp)
) {
Box(
modifier = Modifier.background(Color.White).padding(16.dp),
) {
Box(
modifier = Modifier
.fillMaxWidth()
.clip(RoundedCornerShape(16.dp))
.background(Color(0xfff7f7f7))
.padding(vertical = 8.dp, horizontal = 16.dp)
) {
Row(
modifier = Modifier.fillMaxWidth(),
verticalAlignment = Alignment.CenterVertically
) {
Icon(
painter = painterResource(id = R.drawable.rider_pro_search_location),
contentDescription = "",
tint = Color(0xffc6c6c6),
modifier = Modifier.size(24.dp)
)
Spacer(modifier = Modifier.width(8.dp))
Box(
modifier = Modifier
.fillMaxWidth()
) {
if (searchText.isEmpty()){
Text(
text = "Please enter a search location",
color = Color(0xffc6c6c6),
fontSize = 16.sp,
modifier = Modifier.padding(start = 8.dp)
)
}
BasicTextField(
value = searchText,
onValueChange = {
searchText = it
},
modifier = Modifier
.fillMaxWidth(),
textStyle = TextStyle(
fontSize = 16.sp,
fontWeight = FontWeight.Normal
)
)
}
}
}
}
}
2024-06-22 04:25:20 +08:00
}
2024-07-19 15:24:11 +08:00
2024-06-22 04:25:20 +08:00
}