Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
p x
SuZhouAvp
Commits
827d0a40
Commit
827d0a40
authored
Jun 18, 2025
by
p x
Browse files
集成一部分http
parent
aa341738
Changes
33
Hide whitespace changes
Inline
Side-by-side
app/src/main/java/com/sd/cavphmi/utils/FileIoUtils.kt
View file @
827d0a40
package
com.sd.
shupathwebview
.utils
package
com.sd.
cavphmi
.utils
import
android.content.ContentValues
import
android.content.Context
...
...
@@ -49,26 +49,29 @@ object FileIoUtils {
suspend
fun
getAssetMock
(
context
:
Context
,
fileName
:
String
,
dst
:
MutableList
<
String
>):
Int
{
val
assetManager
=
context
.
assets
var
bf
:
BufferedReader
?
=
null
try
{
val
inputReader
=
InputStreamReader
(
assetManager
.
open
(
fileName
))
bf
=
BufferedReader
(
inputReader
)
var
line
=
""
while
(!
bf
.
run
{
line
=
readLine
()
return
@run
line
}.
isNullOrEmpty
())
{
dst
.
add
(
line
)
return
withContext
(
Dispatchers
.
IO
)
{
val
assetManager
=
context
.
assets
var
bf
:
BufferedReader
?
=
null
try
{
val
inputReader
=
InputStreamReader
(
assetManager
.
open
(
fileName
))
bf
=
BufferedReader
(
inputReader
)
var
line
=
""
while
(!
bf
.
run
{
line
=
readLine
()
return
@run
line
}.
isNullOrEmpty
())
{
dst
.
add
(
line
)
}
bf
?.
close
()
return
@withContext
1
}
catch
(
e
:
IOException
)
{
e
.
printStackTrace
()
}
finally
{
bf
?.
close
()
}
bf
?.
close
()
return
1
}
catch
(
e
:
IOException
)
{
e
.
printStackTrace
()
}
finally
{
bf
?.
close
()
return
@withContext
0
}
return
0
}
/**
...
...
app/src/main/java/com/sd/cavphmi/utils/MobileUtils.kt
View file @
827d0a40
package
com.
ltzw.adasdriver
.utils
package
com.
sd.cavphmi
.utils
import
android.os.Build
...
...
app/src/main/java/com/sd/cavphmi/utils/MyContants.kt
View file @
827d0a40
...
...
@@ -3,7 +3,7 @@ package com.sd.cavphmi.utils
object
MyContants
{
const
val
IS_DEBUG
=
true
var
HOST
=
if
(
IS_DEBUG
)
"https://
sip-avp.isungent
.cn:8443"
else
""
var
HOST
=
if
(
IS_DEBUG
)
"https://
faw.cuscavp
.cn:8443"
else
""
// var PORT = if (IS_DEBUG) "123" else "34534"
//wss://faw.cuscavp.cn:8443/socket/ws?clientSource=100 长春
...
...
@@ -11,5 +11,7 @@ object MyContants {
if
(
IS_DEBUG
)
"wss://faw.cuscavp.cn:8443/socket/ws?clientSource=100"
else
""
/***已经**/
const
val
ALREADT_ONCE
=
-
1
}
\ No newline at end of file
app/src/main/java/com/sd/cavphmi/utils/SystemUtils.kt
View file @
827d0a40
...
...
@@ -9,6 +9,9 @@ import android.net.Uri
import
android.os.Build
import
android.os.PowerManager
import
android.provider.Settings
import
android.telephony.PhoneStateListener
import
android.telephony.SignalStrength
import
android.telephony.TelephonyCallback
import
android.telephony.TelephonyManager
import
android.view.View
import
android.view.WindowManager
...
...
@@ -17,7 +20,6 @@ import android.widget.EditText
import
androidx.annotation.RequiresPermission
import
androidx.core.content.ContextCompat
import
androidx.core.content.FileProvider
import
com.ltzw.adasdriver.utils.MobileUtils
import
java.io.File
...
...
@@ -69,7 +71,8 @@ object SystemUtils {
fun
getAppVersionName
(
context
:
Context
):
String
{
var
version
=
"0"
try
{
version
=
context
.
packageManager
.
getPackageInfo
(
context
.
packageName
,
0
).
versionName
.
toString
()
version
=
context
.
packageManager
.
getPackageInfo
(
context
.
packageName
,
0
).
versionName
.
toString
()
}
catch
(
e
:
PackageManager
.
NameNotFoundException
)
{
throw
RuntimeException
(
"the application not found"
)
}
...
...
@@ -208,6 +211,7 @@ object SystemUtils {
"doc"
->
type
=
"application/msword"
"docx"
->
type
=
"application/vnd.openxmlformats-officedocument.wordprocessingml.document"
"xls"
,
"xlsx"
->
type
=
"application/vnd.ms-excel"
"txt"
->
type
=
"text/plain"
else
->
type
=
"*/*"
...
...
@@ -242,9 +246,11 @@ object SystemUtils {
"ppt"
->
type
=
"application/vnd.ms-powerpoint"
"pptx"
->
type
=
"application/vnd.openxmlformats-officedocument.presentationml.presentation"
"doc"
->
type
=
"application/msword"
"docx"
->
type
=
"application/vnd.openxmlformats-officedocument.wordprocessingml.document"
"xls"
->
type
=
"application/vnd.ms-excel"
"xlsx"
->
type
=
"application/vnd.ms-excel"
"txt"
->
type
=
"text/plain"
...
...
@@ -293,4 +299,13 @@ object SystemUtils {
}
fun
getMobileNetworkSignal
(
context
:
Context
)
:
Int
{
var
telephonyManager
=
context
.
getSystemService
(
Context
.
TELEPHONY_SERVICE
)
as
TelephonyManager
var
signalStrength
=
telephonyManager
.
signalStrength
var
list
=
signalStrength
?.
cellSignalStrengths
return
1
}
}
\ No newline at end of file
app/src/main/java/com/sd/cavphmi/viewmodels/MainVm.kt
View file @
827d0a40
package
com.sd.cavphmi.viewmodels
import
android.content.Context
import
android.telephony.PhoneStateListener
import
android.telephony.SignalStrength
import
android.telephony.TelephonyCallback
import
android.telephony.TelephonyManager
import
androidx.databinding.ObservableField
import
androidx.lifecycle.LiveData
import
androidx.lifecycle.MutableLiveData
...
...
@@ -8,36 +12,36 @@ 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.OrderBean
import
com.sd.cavphmi.bean.PerTarget
import
com.sd.cavphmi.bean.ReqBean
import
com.sd.cavphmi.bean.SpaceNoBean
import
com.sd.cavphmi.bean.VToXImgBean
import
com.sd.cavphmi.bean.VehicleStats
import
com.sd.cavphmi.bean.WebSetBean
import
com.sd.cavphmi.net.MyResult
import
com.sd.cavphmi.repositorys.ParseSocketRepo
import
com.sd.cavphmi.repositorys.SpaceNoRepo
import
com.sd.cavphmi.utils.DateUtils
import
com.sd.cavphmi.utils.FileIoUtils
import
com.sd.cavphmi.utils.MyContants
import
com.sd.cavphmi.utils.SystemUtils
import
com.sd.cavphmi.utils.ToastHelper
import
com.sd.cavphmi.websockets.MyWebSocketClient
import
com.sd.shupathwebview.utils.FileIoUtils
import
dagger.hilt.android.lifecycle.HiltViewModel
import
dagger.hilt.android.qualifiers.ApplicationContext
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.launch
import
kotlinx.coroutines.withContext
import
org.java_websocket.handshake.ServerHandshake
import
protocol.Response
import
java.net.URI
import
java.nio.ByteBuffer
import
java.util.Timer
import
java.util.TimerTask
import
javax.inject.Inject
@HiltViewModel
class
MainVm
@Inject
constructor
(
@ApplicationContext
var
context
:
Context
,
@ApplicationContext
private
var
context
:
Context
,
private
var
parseSocketRepo
:
ParseSocketRepo
// var spaceNoRepo: SpaceNoRepo
// var spaceNoRepo: SpaceNoRepo
,
)
:
MyBaseViewModel
()
{
private
var
client
:
MyWebSocketClient
?
=
null
...
...
@@ -54,19 +58,64 @@ class MainVm @Inject constructor(
//感知目标物
var
targetPre
=
MutableLiveData
<
PerTarget
>()
//订单信息
var
orderBean
=
MutableLiveData
<
OrderBean
>()
//驾驶模式
var
driveMode
=
ObservableField
(
""
)
//航向角
var
heading
=
ObservableField
(
550
)
//速度
var
speed
=
ObservableField
(
0f
)
fun
startWS
()
{
val
httpHeaders
=
mutableMapOf
<
String
,
String
>()
httpHeaders
.
put
(
"Cookie"
,
"username=nemo"
)
//当前时间
var
curTime
=
ObservableField
(
""
)
//网络延时时间差
var
timeOutDiff
=
ObservableField
(-
1
)
// Timer 可用于执行延迟任务或循环任务
private
var
curTimer
=
Timer
()
// Timer 可用于执行延迟任务或循环任务
private
var
netSingTimer
=
Timer
()
/***获取当前时间**/
fun
getCurrentTime
()
{
curTimer
.
schedule
(
object
:
TimerTask
()
{
override
fun
run
()
{
var
time
=
DateUtils
.
getCurrentTime12HourFormat
()
curTime
.
set
(
time
)
}
},
2000
,
1000
*
60
)
}
/***获取信号强度**/
fun
getMobileNetworkSignal
()
{
netSingTimer
.
schedule
(
object
:
TimerTask
()
{
override
fun
run
()
{
viewModelScope
.
launch
{
var
result
=
parseSocketRepo
.
getTimeOut
()
when
(
result
)
{
is
MyResult
.
Success
<
Int
>
->
{
timeOutDiff
.
set
(
result
.
data
)
// println("-------时间差---- = ${result.data}")
}
else
->
{
// println("-------Error---- = ${result.msg}")
}
}
}
}
},
5000
,
1000
*
60
)
}
fun
startWS
()
{
// val httpHeaders = mutableMapOf<String, String>()
// httpHeaders.put("Cookie", "username=nemo")
try
{
client
=
MyWebSocketClient
(
URI
(
MyContants
.
WS_HOST
))
client
?.
onSocketCb
=
onSocketCb
...
...
@@ -77,7 +126,15 @@ class MainVm @Inject constructor(
}
}
fun
closeWS
()
{
/***清理资源***/
fun
cleanRes
()
{
curTimer
.
cancel
()
netSingTimer
.
cancel
()
closeWS
()
}
private
fun
closeWS
()
{
if
(
client
?.
isOpen
?:
false
)
{
client
?.
close
()
}
...
...
@@ -86,7 +143,6 @@ class MainVm @Inject constructor(
private
var
onSocketCb
=
object
:
MyWebSocketClient
.
OnSocketCb
{
override
fun
onOpen
(
handshakedata
:
ServerHandshake
?)
{
println
(
"--------Thread.currentThread() = ${Thread.currentThread()}"
)
}
override
fun
onClose
(
code
:
Int
,
reason
:
String
?,
remote
:
Boolean
)
{
...
...
@@ -101,17 +157,29 @@ class MainVm @Inject constructor(
override
fun
onVehicle
(
res
:
Response
.
SocketResponse
)
{
viewModelScope
.
launch
{
val
bean
=
parseSocketRepo
.
gen
DataBean
(
res
.
data
,
CarVehicle
::
class
.
java
)
parseSocketRepo
.
parse
DataBean
(
res
.
data
,
CarVehicle
::
class
.
java
)
println
(
"---车辆位姿数据 = ${bean}"
)
var
result
=
parseSocketRepo
.
getOrderData
(
bean
.
vehicleData
?.
get
(
0
)
?.
vehiclePlate
?:
""
)
when
(
result
)
{
is
MyResult
.
Success
<
OrderBean
>
->
{
println
(
"-------订单信息---- = ${result.data}"
)
orderBean
.
value
=
result
.
data
}
else
->
{
// println("-------Error---- = ${result.msg}")
}
}
carVehicle
.
value
=
bean
FileIoUtils
.
writeToFile
(
gson
.
toJson
(
bean
),
"carvehicle.txt"
)
//
FileIoUtils.writeToFile(gson.toJson(bean), "carvehicle.txt")
}
}
override
fun
onVehicleStats
(
res
:
Response
.
SocketResponse
)
{
viewModelScope
.
launch
{
val
bean
=
parseSocketRepo
.
gen
DataBean
(
res
.
data
,
VehicleStats
::
class
.
java
)
parseSocketRepo
.
parse
DataBean
(
res
.
data
,
VehicleStats
::
class
.
java
)
println
(
"---联网车辆状态数据 = ${bean}"
)
vehicleStat
.
value
=
bean
...
...
@@ -121,10 +189,10 @@ class MainVm @Inject constructor(
override
fun
onTarget
(
res
:
Response
.
SocketResponse
)
{
viewModelScope
.
launch
{
var
bean
=
parseSocketRepo
.
gen
DataBean
(
res
.
data
,
PerTarget
::
class
.
java
)
var
bean
=
parseSocketRepo
.
parse
DataBean
(
res
.
data
,
PerTarget
::
class
.
java
)
println
(
"---感知目标物数据 = ${bean}"
)
targetPre
.
value
=
bean
FileIoUtils
.
writeToFile
(
gson
.
toJson
(
bean
),
"target.txt"
)
//
FileIoUtils.writeToFile(gson.toJson(bean), "target.txt")
}
}
...
...
app/src/main/java/com/sd/cavphmi/viewmodels/MockVM.kt
0 → 100644
View file @
827d0a40
package
com.sd.cavphmi.viewmodels
import
android.content.Context
import
androidx.lifecycle.MutableLiveData
import
androidx.lifecycle.viewModelScope
import
com.sd.cavphmi.base.MyBaseViewModel
import
com.sd.cavphmi.bean.CarVehicle
import
com.sd.cavphmi.bean.OrderBean
import
com.sd.cavphmi.net.MyResult
import
com.sd.cavphmi.repositorys.ParseSocketRepo
import
com.sd.cavphmi.utils.FileIoUtils
import
dagger.hilt.android.lifecycle.HiltViewModel
import
dagger.hilt.android.qualifiers.ApplicationContext
import
kotlinx.coroutines.delay
import
kotlinx.coroutines.launch
import
javax.inject.Inject
@HiltViewModel
class
MockVM
@Inject
constructor
(
@ApplicationContext
var
context
:
Context
,
private
var
parseSocketRepo
:
ParseSocketRepo
)
:
MyBaseViewModel
()
{
//车辆位姿数据
var
carVehicle
=
MutableLiveData
<
CarVehicle
>()
//订单信息
var
orderBean
=
MutableLiveData
<
OrderBean
>()
fun
onVehicleMock
()
{
viewModelScope
.
launch
{
var
dst
=
mutableListOf
<
String
>()
FileIoUtils
.
getAssetMock
(
context
,
"mock/carvehicle.txt"
,
dst
)
dst
.
forEach
{
str
->
delay
(
3000
)
val
bean
=
parseSocketRepo
.
parseDataBean
(
str
,
CarVehicle
::
class
.
java
)
println
(
"---模拟车辆位姿数据 = ${bean}"
)
var
result
=
parseSocketRepo
.
getOrderData
(
bean
.
vehicleData
?.
get
(
0
)
?.
vehiclePlate
?:
""
)
when
(
result
)
{
is
MyResult
.
Success
<
OrderBean
>
->
{
println
(
"-------订单信息---- = ${result.data}"
)
orderBean
.
value
=
result
.
data
}
else
->
{
// println("-------Error---- = ${result.msg}")
}
}
carVehicle
.
value
=
bean
}
}
}
}
\ No newline at end of file
app/src/main/res/drawable-anydpi/access_alarms_24.xml
0 → 100644
View file @
827d0a40
<vector
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:height=
"24dp"
android:tint=
"#000000"
android:viewportHeight=
"24"
android:viewportWidth=
"24"
android:width=
"24dp"
>
<path
android:fillColor=
"@android:color/white"
android:pathData=
"M22,5.7l-4.6,-3.9 -1.3,1.5 4.6,3.9L22,5.7zM7.9,3.4L6.6,1.9 2,5.7l1.3,1.5 4.6,-3.8zM12.5,8L11,8v6l4.7,2.9 0.8,-1.2 -4,-2.4L12.5,8zM12,4c-5,0 -9,4 -9,9s4,9 9,9 9,-4 9,-9 -4,-9 -9,-9zM12,20c-3.9,0 -7,-3.1 -7,-7s3.1,-7 7,-7 7,3.1 7,7 -3.1,7 -7,7z"
/>
</vector>
app/src/main/res/drawable-anydpi/access_time_24.xml
0 → 100644
View file @
827d0a40
<vector
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:height=
"24dp"
android:tint=
"#000000"
android:viewportHeight=
"24"
android:viewportWidth=
"24"
android:width=
"24dp"
>
<path
android:fillColor=
"@android:color/white"
android:pathData=
"M11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8z"
/>
<path
android:fillColor=
"@android:color/white"
android:pathData=
"M12.5,7H11v6l5.25,3.15 0.75,-1.23 -4.5,-2.67z"
/>
</vector>
app/src/main/res/drawable-anydpi/attach_money_24.xml
0 → 100644
View file @
827d0a40
<vector
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:height=
"24dp"
android:tint=
"#000000"
android:viewportHeight=
"24"
android:viewportWidth=
"24"
android:width=
"24dp"
>
<path
android:fillColor=
"@android:color/white"
android:pathData=
"M11.8,10.9c-2.27,-0.59 -3,-1.2 -3,-2.15 0,-1.09 1.01,-1.85 2.7,-1.85 1.78,0 2.44,0.85 2.5,2.1h2.21c-0.07,-1.72 -1.12,-3.3 -3.21,-3.81V3h-3v2.16c-1.94,0.42 -3.5,1.68 -3.5,3.61 0,2.31 1.91,3.46 4.7,4.13 2.5,0.6 3,1.48 3,2.41 0,0.69 -0.49,1.79 -2.7,1.79 -2.06,0 -2.87,-0.92 -2.98,-2.1h-2.2c0.12,2.19 1.76,3.42 3.68,3.83V21h3v-2.15c1.95,-0.37 3.5,-1.5 3.5,-3.55 0,-2.84 -2.43,-3.81 -4.7,-4.4z"
/>
</vector>
app/src/main/res/drawable-anydpi/bookmark_24.xml
0 → 100644
View file @
827d0a40
<vector
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:height=
"24dp"
android:tint=
"#000000"
android:viewportHeight=
"24"
android:viewportWidth=
"24"
android:width=
"24dp"
>
<path
android:fillColor=
"@android:color/white"
android:pathData=
"M17,3H7c-1.1,0 -1.99,0.9 -1.99,2L5,21l7,-3 7,3V5c0,-1.1 -0.9,-2 -2,-2z"
/>
</vector>
app/src/main/res/drawable/order_bg.xml
0 → 100644
View file @
827d0a40
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android=
"http://schemas.android.com/apk/res/android"
>
<corners
android:radius=
"10dp"
/>
<solid
android:color=
"#80E4E4EB"
/>
<stroke
android:width=
"2dp"
android:color=
"#c4cdd6"
/>
</shape>
\ No newline at end of file
app/src/main/res/layout/activity_main.xml
View file @
827d0a40
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:app=
"http://schemas.android.com/apk/res-auto"
xmlns:bind=
"http://schemas.android.com/apk/res-auto"
xmlns:tools=
"http://schemas.android.com/tools"
>
<data>
...
...
@@ -9,6 +10,10 @@
name=
"vm"
type=
"com.sd.cavphmi.viewmodels.MainVm"
/>
<variable
name=
"order"
type=
"com.sd.cavphmi.bean.OrderBean"
/>
</data>
<RelativeLayout
...
...
@@ -64,8 +69,9 @@
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginLeft=
"2dp"
android:text=
"场外行驶"
android:textColor=
"#3c62e3"
/>
android:textColor=
"#3c62e3"
app:showAvpStatus=
"@{order.avpStatus}"
tools:text=
"场外行驶"
/>
</LinearLayout>
...
...
@@ -103,17 +109,17 @@
<ImageView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:src=
"@drawable/xinhao1"
/>
app:showXinhao=
"@{vm.timeOutDiff}"
/>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width=
"
match_par
ent"
android:layout_width=
"
wrap_cont
ent"
android:layout_height=
"match_parent"
android:layout_below=
"@+id/ll_head"
android:layout_alignParentRight=
"true"
android:orientation=
"vertical"
android:src=
"#907867"
>
...
...
@@ -151,19 +157,18 @@
android:id=
"@+id/bt_chewei"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"
更新
停车位"
/>
android:text=
"停车位
变更
"
/>
</LinearLayout>
<RelativeLayout
android:layout_width=
"280dp"
android:layout_height=
"
wrap_content
"
android:layout_height=
"
70dp
"
android:layout_centerHorizontal=
"true"
>
<ImageView
android:layout_width=
"match_parent"
android:layout_height=
"
wrap_cont
ent"
android:layout_height=
"
match_par
ent"
android:adjustViewBounds=
"true"
android:src=
"@drawable/speed"
/>
...
...
@@ -173,16 +178,17 @@
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_centerHorizontal=
"true"
android:layout_marginTop=
"2dp"
android:layout_marginTop=
"5dp"
android:text=
"@{vm.curTime}"
android:textColor=
"@color/text_black"
tools:text=
"9:19"
/>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_
below=
"@id/tv_tim
e"
android:layout_
alignParentBottom=
"tru
e"
android:layout_centerHorizontal=
"true"
android:layout_margin
Top=
"10
dp"
android:layout_margin
Bottom=
"5
dp"
android:textColor=
"@color/text_black"
android:textSize=
"12sp"
app:showSpeed=
"@{vm.speed}"
...
...
@@ -192,6 +198,15 @@
</RelativeLayout>
<include
layout=
"@layout/order_detail"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_below=
"@+id/ll_head"
android:layout_marginLeft=
"15dp"
android:layout_marginTop=
"15dp"
bind:order=
"@{order}"
/>
</RelativeLayout>
</layout>
...
...
app/src/main/res/layout/order_detail.xml
0 → 100644
View file @
827d0a40
<?xml version="1.0" encoding="utf-8"?>
<layout
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"
>
<data>
<variable
name=
"order"
type=
"com.sd.cavphmi.bean.OrderBean"
/>
</data>
<LinearLayout
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:background=
"@drawable/order_bg"
android:orientation=
"vertical"
android:padding=
"15dp"
android:visibility=
"gone"
app:showOrderLayout=
"@{order.avpStatus}"
>
<LinearLayout
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:gravity=
"center_vertical"
>
<ImageView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:src=
"@drawable/bookmark_24"
/>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginLeft=
"5dp"
android:text=
"@{order.orderNo}"
android:textColor=
"@color/text_black"
tools:text=
"32423427364862386482368462"
/>
</LinearLayout>
<LinearLayout
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"10dp"
android:gravity=
"center_vertical"
>
<ImageView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:src=
"@drawable/access_alarms_24"
/>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginLeft=
"5dp"
android:text=
"@{order.durationString}"
android:textColor=
"@color/text_black"
tools:text=
"1小时29分钟"
/>
</LinearLayout>
<LinearLayout
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"10dp"
android:gravity=
"center_vertical"
>
<ImageView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:src=
"@drawable/access_time_24"
/>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginLeft=
"5dp"
android:text=
"@{order.enterTime}"
android:textColor=
"@color/text_black"
tools:text=
"2025-06-18 09:16:51"
/>
</LinearLayout>
<LinearLayout
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"10dp"
android:gravity=
"center_vertical"
>
<ImageView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:src=
"@drawable/attach_money_24"
/>
<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"
/>
</LinearLayout>
</LinearLayout>
</layout>
\ No newline at end of file
Prev
1
2
Next
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment