Commit 0a5baef9 authored by p x's avatar p x
Browse files

登录

parent 09291f32
......@@ -2,8 +2,8 @@ package com.sd.cavphmi.repositorys
import com.google.gson.Gson
import com.sd.cavphmi.bean.ParkLinePlan
import com.sd.cavphmi.bean.OrderBean
import com.sd.cavphmi.bean.SpaceNoBean
import com.sd.cavphmi.bean.VehDetailBean
import com.sd.cavphmi.net.MyResult
import com.sd.cavphmi.net.RequestBodyUtil
import com.sd.cavphmi.net.httpmothod.ClientRetrofitMethod
......@@ -13,7 +13,7 @@ import kotlinx.coroutines.withContext
import retrofit2.HttpException
import javax.inject.Inject
class ParseSocketRepo @Inject constructor(private val clientRetrofitMethod: ClientRetrofitMethod) {
class ParseSocketRepo @Inject constructor(private var clientRetrofitMethod: ClientRetrofitMethod) {
private var gson = Gson()
......@@ -26,16 +26,18 @@ class ParseSocketRepo @Inject constructor(private val clientRetrofitMethod: Clie
}
}
/***订单信息**/
suspend fun getOrderData(carPlate: String?): MyResult<OrderBean> {
if (carPlate.isNullOrEmpty()) {
/***获取车辆详情
* @param id 车辆id
* **/
suspend fun getVehDetail(id: String): MyResult<VehDetailBean> {
if (id.isNullOrEmpty()) {
return MyResult.Error(MyContants.HTTP_ERROR, "error")
}
// if (!orderCalled.getAndSet(true)) {
var map = mapOf("vehiclePlate" to carPlate)
var map = mapOf("id" to id)
var body = RequestBodyUtil.toRequestBody(map)
try {
var bean = clientRetrofitMethod.getOrderData(body)
var bean = clientRetrofitMethod.getVehDetail(body)
return MyResult.Success(bean)
} catch (e: HttpException) {
// println("e.message = ${e.message}")
......@@ -47,52 +49,52 @@ class ParseSocketRepo @Inject constructor(private val clientRetrofitMethod: Clie
// return MyResult.Error(MyContants.ALREADT_ONCE, "")
// }
}
/**测试网络超时***/
suspend fun getTimeOut(): MyResult<Int> {
try {
var star = System.currentTimeMillis()
clientRetrofitMethod.getTimeOut()
var end = System.currentTimeMillis()
return MyResult.Success(end.minus(star).toInt())
} catch (e: HttpException) {
return MyResult.Error(e.code(), e.message() ?: "error")
} catch (e: Exception) {
return MyResult.Error(MyContants.HTTP_ERROR, e.message ?: "error")
}
}
/***查询车位信息
* 苏州hmi用的这个接口判断空闲车位
* ***/
suspend fun getSpaceData(): MyResult<SpaceNoBean> {
var map = mutableMapOf("pageNo" to 20, "pageSize" to 1000)
var body = RequestBodyUtil.toRequestBody(map)
try {
var bean = clientRetrofitMethod.getSpaceData(body)
return MyResult.Success(bean.data)
} catch (e: HttpException) {
//
// /**测试网络超时***/
// suspend fun getTimeOut(): MyResult<Int> {
// try {
// var star = System.currentTimeMillis()
// clientRetrofitMethod.getTimeOut()
// var end = System.currentTimeMillis()
// return MyResult.Success(end.minus(star).toInt())
// } catch (e: HttpException) {
// return MyResult.Error(e.code(), e.message() ?: "error")
// } catch (e: Exception) {
// return MyResult.Error(MyContants.HTTP_ERROR, e.message ?: "error")
// }
// }
//
// /***查询车位信息
// * 苏州hmi用的这个接口判断空闲车位
// * ***/
// suspend fun getSpaceData(): MyResult<SpaceNoBean> {
// var map = mutableMapOf("pageNo" to 20, "pageSize" to 1000)
// var body = RequestBodyUtil.toRequestBody(map)
// try {
// var bean = clientRetrofitMethod.getSpaceData(body)
// return MyResult.Success(bean.data)
// } catch (e: HttpException) {
//// println("e.message = ${e.message}")
// return MyResult.Error(e.code(), e.message() ?: "error")
// } catch (e: Exception) {
// return MyResult.Error(MyContants.HTTP_ERROR, e.message ?: "error")
// }
// }
//
// /***获取路径规划***/
// suspend fun getLinePlaning(vehiclePlate: String = "吉AC242"): MyResult<ParkLinePlan> {
// var map = mutableMapOf("vehiclePlate" to vehiclePlate)
// var body = RequestBodyUtil.toRequestBody(map)
// try {
// var bean = clientRetrofitMethod.getLinePlaning(body)
// return MyResult.Success(bean)
// } catch (e: HttpException) {
// println("e.message = ${e.message}")
return MyResult.Error(e.code(), e.message() ?: "error")
} catch (e: Exception) {
return MyResult.Error(MyContants.HTTP_ERROR, e.message ?: "error")
}
}
/***获取路径规划***/
suspend fun getLinePlaning(vehiclePlate: String = "吉AC242"): MyResult<ParkLinePlan> {
var map = mutableMapOf("vehiclePlate" to vehiclePlate)
var body = RequestBodyUtil.toRequestBody(map)
try {
var bean = clientRetrofitMethod.getLinePlaning(body)
return MyResult.Success(bean)
} catch (e: HttpException) {
println("e.message = ${e.message}")
return MyResult.Error(e.code(), e.message() ?: "error")
} catch (e: Exception) {
return MyResult.Error(MyContants.HTTP_ERROR, e.message ?: "error")
}
}
// return MyResult.Error(e.code(), e.message() ?: "error")
// } catch (e: Exception) {
// return MyResult.Error(MyContants.HTTP_ERROR, e.message ?: "error")
// }
// }
// /**联网车辆状态数据***/
......
package com.sd.cavphmi.ui
import android.os.Bundle
import androidx.activity.viewModels
import com.google.android.material.snackbar.Snackbar
import androidx.appcompat.app.AppCompatActivity
import androidx.navigation.findNavController
import androidx.navigation.ui.AppBarConfiguration
import androidx.navigation.ui.navigateUp
import androidx.navigation.ui.setupActionBarWithNavController
import com.sd.cavphmi.R
import com.sd.cavphmi.databinding.ActivityLoginBinding
import com.sd.cavphmi.utils.SM4CryptoHelper
import com.sd.cavphmi.viewmodels.LoginVm
import com.sd.cavphmi.viewmodels.MainVm
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class LoginActivity : AppCompatActivity() {
private lateinit var binding: ActivityLoginBinding
private val loginVm: LoginVm by viewModels()
private val mainVm: MainVm by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityLoginBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.btLogin.setOnClickListener {
var user = binding.etAccount.text.toString()
var pwd = binding.etPwd.text.toString()
// "4CIHV37pDF8sx0ZXYmYah6HSgys7F7ULSMmm39uzppc"
var key = "Cusc@itmp-sm4key".toByteArray()
var pp = SM4CryptoHelper.encryptECB(key, pwd.toByteArray())
loginVm.login(user, pp, 276135)
}
//获取车辆信息
binding.btVehinfo.setOnClickListener {
mainVm.getVehDetail()
}
}
}
\ No newline at end of file
......@@ -6,9 +6,6 @@ import androidx.lifecycle.ViewModelProvider
import com.sd.cavphmi.BR
import com.sd.cavphmi.R
import com.sd.cavphmi.base.BaseActivity
import com.sd.cavphmi.bean.CarVehicle
import com.sd.cavphmi.bean.ParkBean
import com.sd.cavphmi.bean.VehicleStats
import com.sd.cavphmi.databinding.ActivityMainBinding
import com.sd.cavphmi.intfaces.OnConCan
import com.sd.cavphmi.ui.fragment.CarPanelFragment
......@@ -38,7 +35,7 @@ class MainActivity : BaseActivity<ActivityMainBinding, MainVm>() {
}
private val mockVM: MockVM by viewModels()
private val avpMapVM: AvpMapVM by viewModels()
// private val avpMapVM: AvpMapVM by viewModels()
private lateinit var dialogFragment: ExitAppDialog
......@@ -55,18 +52,11 @@ class MainActivity : BaseActivity<ActivityMainBinding, MainVm>() {
override fun getToData() {
viewModel.startWS()
// viewModel.getOrderData()
// viewModel.getSpaceDataLoc()
}
override fun initListener() {
mockBt()
mockLis()
//订单数据
viewModel.orderBean.observe(this) {
binding.order = it
}
}
private fun mockLis() {
......@@ -88,71 +78,25 @@ class MainActivity : BaseActivity<ActivityMainBinding, MainVm>() {
binding.btV2x.setOnClickListener {
viewModel.subStartV2x()
}
//网联车辆状态
binding.btStatus.setOnClickListener {
viewModel.subVehicleStatus().observe(this) {
// println("time = ${time}")
// topicVehicleStatus(it)
}
}
//感知延时
binding.btPredelay.setOnClickListener {
viewModel.subPreDelay()
//HTTP获取车辆详情
binding.btGetveh.setOnClickListener {
viewModel.getVehDetail()
}
//交通感知事件
binding.btTarpre.setOnClickListener {
viewModel.subTrafficPre().observe(this) {
}
}
//交通信号灯
binding.btTarlight.setOnClickListener {
viewModel.subTrafficLight()
}
// binding.btJubuline.setOnClickListener {
// viewModel.subPartLine()
// }
// binding.btRsi.setOnClickListener {
// viewModel.subRsiEvent()
//网联车辆状态
// binding.btStatus.setOnClickListener {
// viewModel.subVehicleStatus()
// }
}
/**车辆姿态**/
private fun topicVehicle(bean: CarVehicle) {
}
/**联网车辆状态数据**/
private fun topicVehicleStatus(bean: VehicleStats) {
// if ((bean.vehicleData.count()) > 0) {
//交通感知事件
// binding.btTarpre.setOnClickListener {
// viewModel.subTrafficPre()
// }
//交通信号灯
// binding.btTarlight.setOnClickListener {
// viewModel.subTrafficLight()
// }
}
/**停车位变更**/
private fun topicvPoints(bean: ParkBean) {
var curValue = bean.parkingSpace
//
if (viewModel.spaceCode.isNotEmpty()) {
// // 更新停车位的信息
var parkingSpot = viewModel.getParkingSpot(curValue)
// this.$refs.basisCesium.updateParkingSpace(parkingSpot);
} else {
// // 第一次需要添加停车位的效果
// let carPostion = [baseData.mainLocation.lon, baseData.mainLocation.lat];
// // 开启前进自主泊车效果
// let parkingSpot = this.getParkingSpot(curValue);
// this.$refs.basisCesium.addForwardParkingEffect({
// id: baseData.mainCarID,
// carPostion: carPostion,
// spaceInfo: parkingSpot,
// });
}
//
// // 记录 spaceCode 给倒车入库的时候用
viewModel.spaceCode = curValue
//
// this.highlightSpaceEntity(spaceCode)
}
......
......@@ -3,12 +3,24 @@ package com.sd.cavphmi.utils
object MyContants {
// const val IS_DEBUG = true
var HOST = "https://faw.cuscavp.cn:8443"
private val token="111"
private val reType="51world"
var WSHOST = "wss://itg-dev.cu-sc.com:19443/WSPLUSV5/socket?token=${token}&reType=${reType}&"
// var HOST = "https://itg-dev.cu-sc.com:19443/"
//开发环境切勿动
var HOST = "https://itg-yz.cu-sc.com:13443"
// var HOST = "https://itg-yz.cu-sc.com:13443/api/avpweb/"
// private val token="111"
private val WSTOKEN =
"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOiI0MTc0NDY3NGNlOGM0MDZmOTVkZTVkYWYyMWVlOWQ0ZiIsImNyZWF0ZVRpbWUiOjE3NTUwNzYxMTgxMjQsInVzZXJUeXBlIjoxLCJzb3VyY2UiOjAsInB3ZEV4cGlyZWQiOmZhbHNlLCJ1c2VybmFtZSI6ImNoZW5ieTUxIn0.aPYHCxXgQHj4eYGGZnce5MPJCtmMoRcIIHcNXzMMOHE"
//正式环境Token
var HTTP_TOKEN =
"3W6UeYoWsr3Hged3iJDqw5RQrLyTDwDkkX481PIiuYGwPCamTVdGHhmAxaCgHtns4IaNTEynJ8JfY46bvkzoqqDA9YcGUmkMZ31sV7QAVrk91yOPTv9mCvPLUgOeBgRl"
// var HTTP_TOKEN =
// "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOiIyM2UzYWU3MGZhMGQ0ZGZjYTIwNGU0NzcwOGNjNDJiNiIsImNyZWF0ZVRpbWUiOjE3NTUyNDA0MjcyNzksInVzZXJUeXBlIjoxLCJzb3VyY2UiOjAsInB3ZEV4cGlyZWQiOmZhbHNlLCJ1c2VybmFtZSI6InhpYW9wMDAxIn0.uiSdxuI34J_U3IuMywZNs_adaWoV2fqMsnx-vMxVWXo"
// val Authorization =
// "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOiIyM2UzYWU3MGZhMGQ0ZGZjYTIwNGU0NzcwOGNjNDJiNiIsImNyZWF0ZVRpbWUiOjE3NTUyNDA0MjcyNzksInVzZXJUeXBlIjoxLCJzb3VyY2UiOjAsInB3ZEV4cGlyZWQiOmZhbHNlLCJ1c2VybmFtZSI6InhpYW9wMDAxIn0.uiSdxuI34J_U3IuMywZNs_adaWoV2fqMsnx-vMxVWXo"
private val reType = "51world"
var WSHOST = "wss://itg-dev.cu-sc.com:19443/WSPLUSV5/socket?token=${WSTOKEN}&reType=${reType}&"
// var PORT = if (IS_DEBUG) "123" else "34534"
/***感知目标物***/
......
package com.sd.cavphmi.utils;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import java.security.Security;
import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class SM4CryptoHelper {
private static final String ALGORITHM = "SM4";
private static final String TRANSFORMATION_ECB = "SM4/ECB/PKCS7Padding";
private static final String TRANSFORMATION_CBC = "SM4/CBC/PKCS7Padding";
static {
Security.removeProvider(BouncyCastleProvider.PROVIDER_NAME);
Security.addProvider(new BouncyCastleProvider());
}
// ECB模式加密
public static String encryptECB(byte[] key, byte[] data) throws Exception {
Cipher cipher = Cipher.getInstance(TRANSFORMATION_ECB, "BC");
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key, ALGORITHM));
byte[] encrypted = cipher.doFinal(data);
return Base64.getEncoder().encodeToString(encrypted);
}
// CBC模式加密(需IV参数)
public static byte[] encryptCBC(byte[] key, byte[] iv, byte[] data) throws Exception {
Cipher cipher = Cipher.getInstance(TRANSFORMATION_CBC, "BC");
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key, ALGORITHM), new IvParameterSpec(iv));
return cipher.doFinal(data);
}
}
package com.sd.cavphmi.viewmodels
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.sd.cavphmi.net.MyResult
import com.sd.cavphmi.repositorys.AvpDataRepo
import com.sd.cavphmi.utils.MyContants
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.launch
import javax.inject.Inject
@HiltViewModel
class LoginVm @Inject constructor(private var avpDataRepo: AvpDataRepo) : ViewModel() {
fun login(
user: String = "xiaop001",
pwd: String = "E@H^@Lxom7v@VY@x",
verifyCode: Int = 276135
) {
viewModelScope.launch {
var result = avpDataRepo.login(user, pwd, verifyCode)
when (result) {
is MyResult.Success<String> -> {
MyContants.HTTP_TOKEN = result.data
}
else -> {
}
}
}
}
}
\ No newline at end of file
......@@ -3,34 +3,26 @@ package com.sd.cavphmi.viewmodels
import android.content.Context
import androidx.databinding.ObservableField
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.google.gson.Gson
import com.sd.cavphmi.base.MyBaseViewModel
import com.sd.cavphmi.bean.CarVehicle
import com.sd.cavphmi.bean.AllLinePlaningBean
import com.sd.cavphmi.bean.ParkBean
import com.sd.cavphmi.bean.ParkLinePlan
import com.sd.cavphmi.bean.PartLineBean
import com.sd.cavphmi.bean.PerTarget
import com.sd.cavphmi.net.MyResult
import com.sd.cavphmi.net.RequestBodyUtil
import com.sd.cavphmi.repositorys.ParseSocketRepo
import com.sd.cavphmi.utils.FileIoUtils
import com.sd.cavphmi.utils.MyContants
import dagger.hilt.android.lifecycle.HiltViewModel
import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import retrofit2.HttpException
import javax.inject.Inject
@HiltViewModel
class MockVM @Inject constructor(
@ApplicationContext private var context: Context,
private var parseSocketRepo: ParseSocketRepo
) : MyBaseViewModel() {
) : ViewModel() {
private var gson = Gson()
......@@ -66,55 +58,55 @@ class MockVM @Inject constructor(
//感知目标物
fun onSubTargetMock(targetPre: MutableLiveData<PerTarget>) {
viewModelScope.launch {
val parts = mutableListOf<String>()
FileIoUtils.getAssetMock(context, "mock/PerTarget.txt", parts)
parts.forEach { str ->
delay(1000)
var bean = parseSocketRepo.parseDataBean(str, PerTarget::class.java)
println("------模拟感知目标物数据 = ${bean}")
targetPre.value = bean
}
}
// viewModelScope.launch {
// val parts = mutableListOf<String>()
// FileIoUtils.getAssetMock(context, "mock/PerTarget.txt", parts)
// parts.forEach { str ->
// delay(1000)
// var bean = parseSocketRepo.parseDataBean(str, PerTarget::class.java)
// println("------模拟感知目标物数据 = ${bean}")
// targetPre.value = bean
// }
// }
}
//全局路径发生切换
fun onSubLinePlaningMock(allLine: MutableLiveData<AllLinePlaningBean>) {
viewModelScope.launch {
val alls = mutableListOf<String>()
FileIoUtils.getAssetMock(context, "mock/all_line.txt", alls)
alls.forEach { str ->
delay(1000)
var bean = parseSocketRepo.parseDataBean(str, AllLinePlaningBean::class.java)
allLine.value = bean
}
}
fun onSubLinePlaningMock() {
// viewModelScope.launch {
// val alls = mutableListOf<String>()
// FileIoUtils.getAssetMock(context, "mock/all_line.txt", alls)
// alls.forEach { str ->
// delay(1000)
// var bean = parseSocketRepo.parseDataBean(str, AllLinePlaningBean::class.java)
// allLine.value = bean
// }
// }
}
//局部路径
fun onSubPartLineMock(allLine: MutableLiveData<PartLineBean>) {
viewModelScope.launch {
val lines = mutableListOf<String>()
lines.forEach { str ->
delay(1000)
var bean = parseSocketRepo.parseDataBean(str, PartLineBean::class.java)
allLine.value = bean
}
}
fun onSubPartLineMock() {
// viewModelScope.launch {
// val lines = mutableListOf<String>()
// lines.forEach { str ->
// delay(1000)
// var bean = parseSocketRepo.parseDataBean(str, PartLineBean::class.java)
// allLine.value = bean
// }
// }
}
//更新停车位
fun onPointsMock(parkBean: MutableLiveData<ParkBean>) {
viewModelScope.launch {
val points = mutableListOf<String>()
FileIoUtils.getAssetMock(context, "mock/change_park.txt", points)
points.forEach { str ->
delay(1000)
var bean = parseSocketRepo.parseDataBean(str, ParkBean::class.java)
println("------模拟停车位变更 = ${bean}")
parkBean.value = bean
}
}
fun onPointsMock() {
// viewModelScope.launch {
// val points = mutableListOf<String>()
// FileIoUtils.getAssetMock(context, "mock/change_park.txt", points)
// points.forEach { str ->
// delay(1000)
// var bean = parseSocketRepo.parseDataBean(str, ParkBean::class.java)
// println("------模拟停车位变更 = ${bean}")
// parkBean.value = bean
// }
// }
}
......
package com.sd.cavphmi.websockets
import com.sd.cavphmi.viewmodels.MainVm
import org.java_websocket.client.WebSocketClient
import org.java_websocket.drafts.Draft
import org.java_websocket.handshake.ServerHandshake
import protocol.Response
import java.net.URI
import java.nio.ByteBuffer
/*****往来你车辆位姿**/
/*****网联车辆位姿**/
class VecLocWSClient : WebSocketClient {
private val TAG = "-----VecLocWSClient"
......
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<gradient
android:startColor="#1B5BDB40"
android:endColor="#FFFFFF"
android:centerColor="#1B5BDB1A"
android:type="linear"
android:angle="45"/>
</shape>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="20dp"/>
<solid android:color="@color/white"/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/login_bg"
android:fitsSystemWindows="true"
android:orientation="vertical"
tools:context=".ui.LoginActivity">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/white">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="登录"
android:textColor="#3D3D3D"
android:textSize="16sp" />
</RelativeLayout>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="30dp"
android:src="@mipmap/ic_launcher" />
<LinearLayout
android:layout_width="220dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="25dp"
android:background="@drawable/rect_white_20"
android:gravity="center_vertical"
android:paddingHorizontal="10dp"
android:paddingVertical="5dp">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/smartphone_line" />
<EditText
android:id="@+id/et_account"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:background="@null"
android:hint="请输入账号"
android:maxLines="1"
android:text="18501971666"
android:textColor="@color/text_black"
android:textSize="10sp" />
</LinearLayout>
<LinearLayout
android:layout_width="220dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="25dp"
android:background="@drawable/rect_white_20"
android:gravity="center_vertical"
android:paddingHorizontal="10dp"
android:paddingVertical="5dp">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/et_pwd" />
<EditText
android:id="@+id/et_pwd"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:background="@null"
android:hint="请输入密码"
android:inputType="textPassword"
android:maxLines="1"
android:text="vUO2dStZDhbd*88FfT84"
android:textColor="@color/text_black"
android:textSize="10sp" />
</LinearLayout>
<com.google.android.material.button.MaterialButton
android:id="@+id/bt_login"
android:layout_width="220dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="40dp"
android:text="登录"
android:textColor="@color/white"
android:textSize="15sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/bt_vehinfo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="获取车辆信息" />
</LinearLayout>
</LinearLayout>
\ No newline at end of file
......@@ -9,10 +9,6 @@
name="vm"
type="com.sd.cavphmi.viewmodels.MainVm" />
<variable
name="order"
type="com.sd.cavphmi.bean.OrderBean" />
</data>
<RelativeLayout
......@@ -70,10 +66,10 @@
android:text="V2X预警开始" />
<Button
android:id="@+id/bt_predelay"
android:id="@+id/bt_getveh"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="感知延时" />
android:text="HTTP 获取车辆详情" />
<Button
android:id="@+id/bt_tarpre"
......@@ -88,21 +84,6 @@
android:text="交通信号灯" />
<Button
android:id="@+id/bt_allline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="全局路径发生切换"
android:visibility="gone"/>
<Button
android:id="@+id/bt_jubuline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
android:text="局部路径" />
</LinearLayout>
......
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.minedata.minemap.map.MapView
android:id="@+id/mapView"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
<!-- <com.minedata.minemap.map.MapView-->
<!-- android:id="@id/mapView"-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="match_parent"-->
<!-- app:minemap_apiBaseUrl="@string/minemap_apiBaseUrl"-->
<!-- app:minemap_apiUrl="@string/minemap_apiUrl"-->
<!-- app:minemap_apiDynamicDataUrl="@string/minemap_apiDynamicDataUrl"-->
<!-- app:minemap_apiVersion="@string/minemap_apiVersion"-->
<!-- app:minemap_uiLogoGravity="center" />-->
</FrameLayout>
\ No newline at end of file
......@@ -6,13 +6,13 @@
<data>
<variable
name="order"
type="com.sd.cavphmi.bean.OrderBean" />
<!-- <variable-->
<!-- name="order"-->
<!-- type="com.sd.cavphmi.bean.OrderBean" />-->
</data>
<!-- app:showOrderLayout="@{order.avpStatus}"-->
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
......@@ -20,7 +20,7 @@
android:orientation="vertical"
android:padding="15dp"
android:visibility="gone"
app:showOrderLayout="@{order.avpStatus}"
>
<LinearLayout
......@@ -33,11 +33,12 @@
android:layout_height="wrap_content"
android:src="@drawable/bookmark_24" />
<!-- android:text="@{order.orderNo}"-->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:text="@{order.orderNo}"
android:text="@{}"
android:textColor="@color/text_black"
tools:text="32423427364862386482368462" />
......@@ -55,11 +56,12 @@
android:layout_height="wrap_content"
android:src="@drawable/access_alarms_24" />
<!-- order.durationString-->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:text="@{order.durationString}"
android:text="@{}"
android:textColor="@color/text_black"
tools:text="1小时29分钟" />
......@@ -75,12 +77,12 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/access_time_24" />
<!-- {order.enterTime-->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:text="@{order.enterTime}"
android:text="@{}"
android:textColor="@color/text_black"
tools:text="2025-06-18 09:16:51" />
......@@ -97,11 +99,11 @@
android:layout_height="wrap_content"
android:src="@drawable/attach_money_24" />
<!-- app:showOrderCost="@{}"-->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
app:showOrderCost="@{order.actualCost}"
android:textColor="@color/text_black"
tools:text="2025-06-18 09:16:51" />
......
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
<monochrome android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
<monochrome android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment