Merge branch 'dev_robotaxi-d_230809_6.0.0' of gitlab.zhidaoauto.com:SCA/L4HA/AndroidApp/MoGoEagleEye into dev_robotaxi-d_230809_6.0.0

This commit is contained in:
aibingbing
2023-08-14 17:52:23 +08:00
82 changed files with 3122 additions and 1132 deletions

View File

@@ -1,22 +0,0 @@
package com.mogo.och.bus.passenger;
import androidx.annotation.IdRes;
import androidx.fragment.app.FragmentActivity;
import com.mogo.eagle.core.function.api.base.IMoGoFunctionProvider;
/**
* 网约车抽象接口
*
* Created on 2022/3/29
*/
interface IMogoOCH extends IMoGoFunctionProvider {
/**
* 初始化网约车容器
*
* @param activity
* @param containerId 容器ID
*/
void createCoverage(FragmentActivity activity, @IdRes int containerId);
}

View File

@@ -5,6 +5,7 @@ import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import androidx.fragment.app.FragmentManager
import com.alibaba.android.arouter.facade.annotation.Route
import com.mogo.eagle.core.function.api.base.IMoGoFunctionProvider
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager.getMapUIController
import com.mogo.eagle.core.function.call.setting.CallerMoGoUiSettingManager.stepInDayMode
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
@@ -18,11 +19,10 @@ import com.mogo.och.bus.passenger.ui.MainFragment
* Created on 2022/3/29
*/
@Route(path = CharterPassengerConst.PATH)
class MogoOCHBusPassenger : IMogoOCH {
class MogoOCHBusPassenger : IMoGoFunctionProvider {
private var mActivity: FragmentActivity? = null
private var mContainerId = 0
private var mPassengerFragment: MainFragment? = null
override fun createCoverage(activity: FragmentActivity, containerId: Int) {}
override fun createCoverage(activity: FragmentActivity?, containerId: Int?): Fragment? {
mActivity = activity
mContainerId = containerId!!
@@ -42,15 +42,6 @@ class MogoOCHBusPassenger : IMogoOCH {
}
/**
* 进入鹰眼模式,设置手势缩放地图失效
*/
private fun stepIntoVrMode() {
d(SceneConstant.M_TAXI_P + TAG, "进入vr模式")
getMapUIController()?.stepInVrMode(true) // 白天模式
stepInDayMode() //白天模式 状态栏字体颜色变黑
}
private fun showFragment() {
val supportFragmentManager: FragmentManager? = mActivity?.supportFragmentManager

View File

@@ -1,3 +0,0 @@
package com.mogo.och.bus.passenger.bean.event
data class DebugView(val type: String)

View File

@@ -0,0 +1,5 @@
package com.mogo.och.bus.passenger.callback
interface IClearViewCallback {
fun goneAllView()
}

View File

@@ -19,7 +19,6 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager.updateAutopilotControlParameters
import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager
import com.mogo.eagle.core.network.utils.GsonUtil
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.e
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
@@ -187,7 +186,7 @@ object CharterPassengerModel {
// 3、车控页面、
// 4、打开选择线路页面
BizLoopManager.removeLoopFunction(TAGLOGIN)
CallerLogger.d(M_BUS_P + TAG, "结束登录状态轮询")
d(M_BUS_P + TAG, "结束登录状态轮询")
// 启动订单轮
startOrderLoop()
} else {
@@ -195,7 +194,7 @@ object CharterPassengerModel {
TAGLOGIN,
LoopInfo(3, ::queryLoginStatus)
)
CallerLogger.d(M_BUS_P + TAG, "启动登录状态轮询")
d(M_BUS_P + TAG, "启动登录状态轮询")
}
}
})
@@ -225,7 +224,7 @@ object CharterPassengerModel {
}
override fun onAutopilotArriveAtStation(arrivalNotification: MessagePad.ArrivalNotification?) {
CallerLogger.d(M_BUS_P + TAG, "底盘给到站信息")
d(M_BUS_P + TAG, "底盘给到站信息")
arriveDest()
}
}
@@ -323,7 +322,7 @@ object CharterPassengerModel {
//监听网络变化,避免启动机器时无网导致无法更新订单信息
private val mNetWorkIntentListener = IMogoIntentListener { intentStr, intent ->
CallerLogger.d(M_BUS_P + TAG, "onIntentReceived = %s", intentStr)
d(M_BUS_P + TAG, "onIntentReceived = %s", intentStr)
if (ConnectivityManager.CONNECTIVITY_ACTION == intentStr) {
if (NetworkUtils.isConnected(mContext)) {
queryLoginStatus()
@@ -341,7 +340,7 @@ object CharterPassengerModel {
TAGORDER,
LoopInfo(3, ::queryOrder)
)
CallerLogger.d(M_BUS_P + TAG, "启动订单轮询")
d(M_BUS_P + TAG, "启动订单轮询")
}
/**
@@ -349,7 +348,7 @@ object CharterPassengerModel {
*/
private fun endOrderLoop() {
BizLoopManager.removeLoopFunction(TAGORDER)
CallerLogger.d(M_BUS_P + TAG, "结束订单轮询")
d(M_BUS_P + TAG, "结束订单轮询")
}
/**
@@ -359,7 +358,7 @@ object CharterPassengerModel {
BusPassengerServiceManager.queryOrderInfo(
mContext, object : OchCommonServiceCallback<OrderInfoResponse> {
override fun onSuccess(data: OrderInfoResponse?) {
CallerLogger.d(M_BUS_P + TAG, "订单信息:$data")
d(M_BUS_P + TAG, "订单信息:$data")
if (data?.data == null) {
if (orderInfo != null) {
// 启动车辆服务状态
@@ -386,7 +385,7 @@ object CharterPassengerModel {
//设置车模
if (this.orderInfo?.productType != orderData.productType) {
this.carTypeChageListener?.setCarChangeListener(orderData.productType)
CallerLogger.d(M_BUS_P + TAG, "设置车模")
d(M_BUS_P + TAG, "设置车模")
}
if (this.orderInfo?.siteId != orderData.siteId) {
val coordinateConverterWgsToGcj =
@@ -440,11 +439,11 @@ object CharterPassengerModel {
)
// 小于15m到站
if (calculateLineDistance < CharterPassengerConst.ARRIVE_AT_START_STATION_DISTANCE && calculateLineDistance > 0) {
CallerLogger.d(M_BUS_P + TAG, "小于15米到站1")
d(M_BUS_P + TAG, "小于15米到站1")
arriveDest()
}
if (calculateLineDistance < CharterPassengerConst.ARRIVE_SOON_AT_START_STATION_DISTANCE && calculateLineDistance > 0) {
CallerLogger.d(M_BUS_P + TAG, "小于100米到站")
d(M_BUS_P + TAG, "小于100米到站")
arriveDestSoon()
}
}
@@ -490,7 +489,7 @@ object CharterPassengerModel {
*/
private fun startCarStatusLoop() {
BizLoopManager.setLoopFunction(TAGCARSTATUS, LoopInfo(3, ::queryCarStatus))
CallerLogger.d(M_BUS_P + TAG, "启动车态轮询")
d(M_BUS_P + TAG, "启动车态轮询")
}
/**
@@ -498,7 +497,7 @@ object CharterPassengerModel {
*/
private fun endCarStatusLoop() {
BizLoopManager.removeLoopFunction(TAGCARSTATUS)
CallerLogger.d(M_BUS_P + TAG, "结束车态轮询")
d(M_BUS_P + TAG, "结束车态轮询")
}
/**
@@ -552,7 +551,7 @@ object CharterPassengerModel {
TAGCALIBRATION,
LoopInfo(120, ::queryBusinessTime, immediately = true)
)
CallerLogger.d(M_BUS_P + TAG, "启动时间校准轮询")
d(M_BUS_P + TAG, "启动时间校准轮询")
}
/**
@@ -560,7 +559,7 @@ object CharterPassengerModel {
*/
private fun endCalibrationLoop() {
BizLoopManager.removeLoopFunction(TAGCALIBRATION)
CallerLogger.d(M_BUS_P + TAG, "结束时间校准轮询")
d(M_BUS_P + TAG, "结束时间校准轮询")
}
/**
@@ -597,7 +596,7 @@ object CharterPassengerModel {
.getString(R.string.m1_end_order_5min), 2
)
VoiceManager.surplus5min(VoiceFocusManager.getVoiceCmdCallBack())
CallerLogger.d(M_BUS_P + TAG, "倒计时5分钟${it.orderNo}")
d(M_BUS_P + TAG, "倒计时5分钟${it.orderNo}")
SharedPrefs.getInstance(mContext)
.putBoolean("${it.orderNo}$min5Speak", true)
}
@@ -615,7 +614,7 @@ object CharterPassengerModel {
} else {
invokeOrderLeftTimeListeners(millisUntilFinished)
}
CallerLogger.d(M_BUS_P + TAG, "订单倒计时${millisUntilFinished}")
d(M_BUS_P + TAG, "订单倒计时${millisUntilFinished}")
}
}
}
@@ -636,8 +635,8 @@ object CharterPassengerModel {
//设置全局轨迹信息
locusInfo = data.data
CallerLogger.d(M_BUS_P + TAG, "查询自动驾驶轨迹信息")
CallerLogger.d(
d(M_BUS_P + TAG, "查询自动驾驶轨迹信息")
d(
M_BUS_P + TAG, GsonUtil.jsonFromObject(
locusInfo
)
@@ -657,7 +656,7 @@ object CharterPassengerModel {
*/
private fun startCalculateDistanceLoop() {
BizLoopManager.setLoopFunction(TAGDISTANCE, LoopInfo(1, ::calculateDistance))
CallerLogger.d(M_BUS_P + TAG, "开始路距计算")
d(M_BUS_P + TAG, "开始路距计算")
}
/**
@@ -668,7 +667,7 @@ object CharterPassengerModel {
*/
private fun endCalculateDistanceLoop() {
BizLoopManager.removeLoopFunction(TAGDISTANCE)
CallerLogger.d(M_BUS_P + TAG, "结束路距计算")
d(M_BUS_P + TAG, "结束路距计算")
}
/**
@@ -678,17 +677,17 @@ object CharterPassengerModel {
//mLocation gcj坐标
mLocationGCJ02?.let {
orderInfo?.let { order ->
CallerLogger.d(M_BUS_P + "calculateDistance", "订单信息:$order")
d(M_BUS_P + "calculateDistance", "订单信息:$order")
if (order.siteId == null || order.siteId == 0L ||
order.wgs84Lat == null || order.wgs84Lat == 0.0 ||
order.wgs84Lon == null || order.wgs84Lon == 0.0
) {
CallerLogger.d(M_BUS_P + "calculateDistance", "站点信息未获得")
d(M_BUS_P + "calculateDistance", "站点信息未获得")
return
}
newCheckedSite?.let {
if (it.siteId != order.siteId) {
CallerLogger.d(M_BUS_P + "calculateDistance", "站点和已选不吻合")
d(M_BUS_P + "calculateDistance", "站点和已选不吻合")
return
}
}
@@ -710,11 +709,11 @@ object CharterPassengerModel {
mogoLocation.longitude,
mogoLocation.latitude
)
CallerLogger.d(M_BUS_P + "calculateDistance", "两点距离和站点的直线距离:${lastSumLength}")
d(M_BUS_P + "calculateDistance", "两点距离和站点的直线距离:${lastSumLength}")
if (lastSumLength > 100) {
if (mRoutePoints == null || mRoutePoints?.size == 0) {
//ToastCharterUtils.showLong("缺少轨迹数据暂停计算")
CallerLogger.d(
d(
M_BUS_P + "calculateDistance两点距离",
"缺少轨迹数据"
)
@@ -727,11 +726,11 @@ object CharterPassengerModel {
it,
mogoLocation
)
CallerLogger.d(
d(
M_BUS_P + TAG,
"使用轨迹轨迹:${mRoutePoints?.size}--第一个点${mRoutePoints!![0]}--最后一个点:${mRoutePoints!!.last()}"
)
CallerLogger.d(M_BUS_P + "calculateDistance", "轨迹计算的距离$templastSumLength")
d(M_BUS_P + "calculateDistance", "轨迹计算的距离$templastSumLength")
if (templastSumLength > 100) {
lastSumLength = templastSumLength
}
@@ -740,16 +739,16 @@ object CharterPassengerModel {
val lastTime: Double =
lastSumLength / CharterPassengerConst.Charter_AVERAGE_SPEED * 3.6 //秒
CallerLogger.d(
d(
M_BUS_P + "calculateDistance",
"最终信息:lastSumLength: ${lastSumLength}lastTime : $lastTime thread = ${Thread.currentThread().name}"
)
if (lastSumLength < CharterPassengerConst.ARRIVE_SOON_AT_START_STATION_DISTANCE && lastSumLength > 0) {
CallerLogger.d(M_BUS_P + TAG, "小于100米到站2")
d(M_BUS_P + TAG, "小于100米到站2")
arriveDestSoon()
}
if (lastSumLength < CharterPassengerConst.ARRIVE_AT_START_STATION_DISTANCE && lastSumLength > 0) {
CallerLogger.d(M_BUS_P + TAG, "小于15米到站2")
d(M_BUS_P + TAG, "小于15米到站2")
arriveDest()
return
}
@@ -766,7 +765,7 @@ object CharterPassengerModel {
private fun setOrderStatus(orderStatus: OrderStatusEnum) {
if (this.orderStatus != orderStatus) {
CallerLogger.d(M_BUS_P + TAG, "${this.orderInfo?.orderNo}新的状态:$orderStatus")
d(M_BUS_P + TAG, "${this.orderInfo?.orderNo}新的状态:$orderStatus")
this.orderStatus = orderStatus
for (callback in orderStatusChangeListeners.values) {
callback.onStatusChange(this.orderStatus)
@@ -825,7 +824,7 @@ object CharterPassengerModel {
}
}
for (mutableEntry in distanceMap) {
CallerLogger.d(M_BUS_P + TAG, "距离:${mutableEntry.key}-----第几个站点${mutableEntry.value}")
d(M_BUS_P + TAG, "距离:${mutableEntry.key}-----第几个站点${mutableEntry.value}")
}
var middle = -1
if (distanceMap.size >= 2) {
@@ -905,7 +904,7 @@ object CharterPassengerModel {
if (order != null && lineId != null && siteId != null) {
val requestSuccessSign = "${siteId}$endKey"
val requestIngSign = "${siteId}$endKeyRequestIng"//正在请求中
CallerLogger.d(
d(
M_BUS_P + BaseDPMsg.TAG,
"requestSuccessSign${isSuccess(requestSuccessSign)}---requestIngSign${
isSuccess(
@@ -983,7 +982,7 @@ object CharterPassengerModel {
OchCommonConst.BUSINESS_STRING,
GsonUtils.toJson(msg).toByteArray()
)
CallerLogger.d(M_BUS_P + BaseDPMsg.TAG, "到站发送数据${msg}")
d(M_BUS_P + BaseDPMsg.TAG, "到站发送数据${msg}")
}
RxUtils.disposeSubscribe(switchLine5minWait)
@@ -1031,7 +1030,7 @@ object CharterPassengerModel {
fun cleanbroadcastListInfo(checkSite: SiteInfoResponse.SiteInfo?) {
RxUtils.disposeSubscribe(switchLine5minWait)
switchLine5minWait = RxUtils.createSubscribe(5 * 60 * 1000) {
CallerLogger.d(M_BUS_P + BaseDPMsg.TAG, "5分钟倒计时可以选择线路了")
d(M_BUS_P + BaseDPMsg.TAG, "5分钟倒计时可以选择线路了")
}
newCheckedSite = checkSite
cleanRoutePoints()
@@ -1088,7 +1087,7 @@ object CharterPassengerModel {
val parameters = initAutopilotControlParameters()
if (null == parameters) {
ToastCharterUtils.showShort("请选择站点")
CallerLogger.e(
e(
SceneConstant.M_BUS + TAG,
"行程日志-AutopilotControlParameters is empty."
)
@@ -1097,7 +1096,7 @@ object CharterPassengerModel {
ToastCharterUtils.showShort("启动自动驾驶中")
cleanRoutePoints()
startAutoPilot(parameters)
CallerLogger.d(
d(
SceneConstant.M_BUS + TAG,
"行程日志-开启自动驾驶====" + GsonUtil.jsonFromObject(parameters)
+ " startLatLon=" + parameters.startName + "endLatLon=" + parameters.endName +
@@ -1110,7 +1109,7 @@ object CharterPassengerModel {
private fun initAutopilotControlParameters(): AutopilotControlParameters? {
if (!checkCurrentOCHOrder()) {
CallerLogger.e(M_BUS_P + TAG, "no order or order is empty.")
e(M_BUS_P + TAG, "no order or order is empty.")
return null
}
mLocationGCJ02?.let {

View File

@@ -22,7 +22,7 @@ import com.mogo.och.bus.passenger.model.IOrderStatusChangeListener
import com.mogo.och.bus.passenger.model.OrderStatusEnum
import com.mogo.och.common.module.manager.loopmanager.BizLoopManager
import com.mogo.och.bus.passenger.net.BusPassengerServiceManager
import com.mogo.och.bus.passenger.ui.dialogfragment.fragment.M1OrderLineFragment
import com.mogo.och.bus.passenger.ui.selectline.M1OrderLineFragment
import com.mogo.och.common.module.bean.dpmsg.BaseDPMsg
import com.mogo.och.common.module.bean.dpmsg.ChangeDestMsg
import com.mogo.och.common.module.bean.dpmsg.DPMsgType

View File

@@ -5,7 +5,7 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import com.mogo.och.bus.passenger.ui.dialogfragment.fragment.M1SoftFragment
import com.mogo.och.bus.passenger.ui.softcontrol.M1SoftFragment
import com.mogo.och.bus.passenger.utils.ToastCharterUtils
import com.mogo.och.common.module.manager.devicemanage.LightAirconditionDoorCallback
import com.mogo.och.common.module.manager.devicemanage.LightAirconditionDoorStatusManager

View File

@@ -1,6 +1,6 @@
package com.mogo.och.bus.passenger.presenter
import com.mogo.och.bus.passenger.ui.dialogfragment.fragment.M1VideoFragment
import com.mogo.och.bus.passenger.ui.video.M1VideoFragment
class BusPassengerFunctionVideoPresenter(view: M1VideoFragment?) :
BusBasePassengerFunctionDevicePresenter<M1VideoFragment?>(view)

View File

@@ -7,7 +7,6 @@ import android.view.View
import androidx.lifecycle.LifecycleOwner
import com.amap.api.maps.model.LatLng
import com.mogo.commons.voice.AIAssist
import com.mogo.eagle.core.data.map.MogoLocation
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager
@@ -23,8 +22,6 @@ import com.mogo.och.bus.passenger.bean.response.LineInfoResponse
import com.mogo.och.bus.passenger.bean.response.OrderInfoResponse
import com.mogo.och.bus.passenger.bean.response.SiteInfoResponse
import com.mogo.och.bus.passenger.bean.response.TrajectoriesResponse
import com.mogo.och.bus.passenger.callback.IBusPassengerControllerStatusCallback
import com.mogo.och.bus.passenger.callback.IDistanceCallback
import com.mogo.och.bus.passenger.callback.IOrderChangeCallback
import com.mogo.och.bus.passenger.model.CharterPassengerModel
import com.mogo.och.bus.passenger.model.IOrderStatusChangeListener
@@ -32,23 +29,20 @@ import com.mogo.och.bus.passenger.model.OrderStatusEnum
import com.mogo.och.bus.passenger.receive.DriverMessage
import com.mogo.och.bus.passenger.ui.MainFragment
import com.mogo.och.bus.passenger.utils.ToastCharterUtils
import com.mogo.och.bus.passenger.view.MakerWithSiteName
import com.mogo.och.bus.passenger.view.MakerWithSiteNamewithCheck
import com.mogo.och.bus.passenger.ui.overmapview.MakerWithSiteName
import com.mogo.och.bus.passenger.ui.overmapview.MakerWithSiteNamewithCheck
import com.mogo.och.common.module.biz.network.OchCommonServiceCallback
import com.mogo.och.common.module.manager.StopSideStatusManager
import com.mogo.och.common.module.manager.devicemanage.LightAirconditionDoorCallback
import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil
import com.mogo.och.common.module.utils.DateTimeUtil
import com.mogo.och.common.module.utils.NumberFormatUtil
import com.mogo.och.common.module.voice.VoiceNotice
import me.jessyan.autosize.utils.AutoSizeUtils
import java.util.concurrent.ConcurrentHashMap
import kotlin.math.ceil
class BusPassengerPresenter(view: MainFragment?) :
BusBasePassengerFunctionDevicePresenter<MainFragment?>(view),
IDistanceCallback, IOrderChangeCallback, IOrderStatusChangeListener,
StopSideStatusManager.OCHPlanningActionsCallback, LightAirconditionDoorCallback, IBusPassengerControllerStatusCallback {
IOrderChangeCallback, IOrderStatusChangeListener,
StopSideStatusManager.OCHPlanningActionsCallback, LightAirconditionDoorCallback {
private val lindIdAndView = ConcurrentHashMap<Long, MakerWithSiteNamewithCheck?>()
@@ -57,12 +51,11 @@ class BusPassengerPresenter(view: MainFragment?) :
const val KEY4SHOWNOVICEGUIDANCE = "showNoviceGuidanceOrderNor"
}
override fun onCreate(owner: LifecycleOwner) {
super.onCreate(owner)
CharterPassengerModel.init()
// 定位监听
CharterPassengerModel.setStationDistanceListener(TAG, this)
CharterPassengerModel.setControllerStatusCallback(TAG,this)
CharterPassengerModel.setCarTypeChangeListener(this)
CharterPassengerModel.setStatusChangeListener(TAG, this)
CallerTelematicListenerManager.addListener(TAG, DriverMessage)
@@ -73,71 +66,25 @@ class BusPassengerPresenter(view: MainFragment?) :
override fun onDestroy(owner: LifecycleOwner) {
super.onDestroy(owner)
CharterPassengerModel.setStationDistanceListener(TAG, null)
CharterPassengerModel.setCarTypeChangeListener(null)
CallerTelematicListenerManager.removeListener(TAG)
StopSideStatusManager.removeListener(TAG)
}
override fun onCarLocationChanged(location: MogoLocation?) {
location?.let {
setSpeed(it.gnssSpeed)
}
}
private fun setSpeed(speed: Float) {
UiThreadHandler.post {
val speedKM = (Math.abs(speed) * 3.6f).toInt()
mView?.setSpeed(speedKM.toString())
}
}
private fun setDistanceAndTime(
distance: String,
distanceUnit: String,
leftTime: String,
arriveTime: String
) {
UiThreadHandler.post {
mView?.setDistanceAndTime(distance, distanceUnit, leftTime, arriveTime)
}
}
/**
* 计算剩余距离和剩余时间
*/
override fun setDistancecAndTime(meters: Long, timeInSecond: Long) {
if (meters < 0 && timeInSecond < 0) {
setDistanceAndTime("--", context.getString(R.string.m1_distance_unit_km), "--", "--")
return
}
var dis: String? = "0"
var disUnit = "KM"
if (meters > 0) {
if (meters / 1000 < 1) {
disUnit = context.getString(R.string.m1_distance_unit_m)
dis = Math.round(meters.toFloat()).toString()
} else {
disUnit = context.getString(R.string.m1_distance_unit_km)
dis = NumberFormatUtil.formatLong(meters.toDouble() / 1000)
}
}
val time = ceil(timeInSecond / 60f).toInt()
val arriveTime = DateTimeUtil.getAfterSecondTime(timeInSecond.toInt())
setDistanceAndTime(dis.toString(), disUnit, time.toString(), arriveTime)
}
override fun setCarChangeListener(productType: Int?) {
when (productType) {
OrderInfoResponse.M1_LOVE -> {
mView?.setCarModle(R.raw.aiqinghao)
}
OrderInfoResponse.M1_FAMILY -> {
mView?.setCarModle(R.raw.jiatinghao)
}
OrderInfoResponse.M1_FRIENDLY -> {
mView?.setCarModle(R.raw.pengyouhao)
}
else -> {
mView?.setCarModle(R.raw.m1)
}
@@ -157,33 +104,36 @@ class BusPassengerPresenter(view: MainFragment?) :
clearShowNoviceGuidanceSharedPrefs()
}
}
OrderStatusEnum.OrderNoLine -> {
CallerOrderListenerManager.invokeOrderRemoval();
showNoviceGuidance()
}
OrderStatusEnum.OrdersWithLine -> {}
OrderStatusEnum.NoOrderUse -> {
when (CallerAutoPilotStatusListenerManager.getState()) {
IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE -> {// 不可自动驾驶
ToastCharterUtils.showShort("设备未就绪请稍等,请安全员主动停止车辆")
}
IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE -> {//
ToastCharterUtils.showShort("因车辆正在人工驾驶中无法靠边停车,请安全员主动停止车辆")
}
IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING -> {
// 靠边停车 订单结束 靠边停车
CallerAutoPilotControlManager.sendPlanningCmd(1)
}
IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING -> {
ToastCharterUtils.showShort("因车辆正在平行驾驶中无法靠边停车,请安全员主动停止车辆")
}
else -> {}
}
UiThreadHandler.post {
UiThreadHandler.post {
mView?.showOpenAndCloseDoor()
setDistancecAndTime(-1, -1)
}
mView?.showOpenAndCloseDoor()
}
}
}
@@ -196,21 +146,21 @@ class BusPassengerPresenter(view: MainFragment?) :
private fun showNoviceGuidance() {
CallerLogger.d(M_BUS_P + TAG, "showNoviceGuidance")
val currentOrderInfo = CharterPassengerModel.getCurrentOrderInfo()
currentOrderInfo?.orderNo?.let {order->
currentOrderInfo?.orderNo?.let { order ->
val stringSet = SharedPrefs.getInstance(context).getStringSet(KEY4SHOWNOVICEGUIDANCE)
if(stringSet==null){
if (stringSet == null) {
}else{
} else {
if (stringSet.contains(order)) {
return
}else{
} else {
}
}
UiThreadHandler.post({
mView?.showNoviceGuidanceFragment()
},UiThreadHandler.MODE.QUEUE)
}, UiThreadHandler.MODE.QUEUE)
}
}
@@ -236,15 +186,18 @@ class BusPassengerPresenter(view: MainFragment?) :
StopSideStatusManager.Status.NOSTART -> {
ToastCharterUtils.showShort(errorInfo)
}
StopSideStatusManager.Status.START -> {
VoiceNotice.showNotice(
context.getString(R.string.m1_stop_site_zh),
AIAssist.LEVEL0
)
}
StopSideStatusManager.Status.DOING -> {
// 正在靠边停车
}
StopSideStatusManager.Status.EndingSuccess -> {
ToastCharterUtils.showShort("靠边停车成功")
VoiceNotice.showNotice(
@@ -252,6 +205,7 @@ class BusPassengerPresenter(view: MainFragment?) :
AIAssist.LEVEL0
)
}
StopSideStatusManager.Status.EndingFaile -> {
ToastCharterUtils.showShort("车辆系统繁忙,请稍后再试")
}
@@ -273,65 +227,90 @@ class BusPassengerPresenter(view: MainFragment?) :
lineInfo: LineInfoResponse.LineInfo,
sites: List<SiteInfoResponse.SiteInfo>
) {
CharterPassengerModel.getLineTrajectory(lineInfo.lineId!!,object : OchCommonServiceCallback<TrajectoriesResponse> {
override fun onSuccess(data: TrajectoriesResponse?) {
if (null != data && 0 == data.code) {
data.data?.let {
CallerLogger.d(M_BUS_P + TAG, "getLineTrajectory轨迹点${data.data.size}")
val trajectoryList = mutableListOf<LatLng>()
it.forEach {latLngMain ->
trajectoryList.add(latLngMain.exchangeData())
CharterPassengerModel.getLineTrajectory(lineInfo.lineId!!,
object : OchCommonServiceCallback<TrajectoriesResponse> {
override fun onSuccess(data: TrajectoriesResponse?) {
if (null != data && 0 == data.code) {
data.data?.let {
CallerLogger.d(
M_BUS_P + TAG,
"getLineTrajectory轨迹点${data.data.size}"
)
val trajectoryList = mutableListOf<LatLng>()
it.forEach { latLngMain ->
trajectoryList.add(latLngMain.exchangeData())
}
drawStationInfo(sites)
mView?.drawOverMapViewTrajectory(trajectoryList)
}
drawStationInfo(sites)
mView?.drawOverMapViewTrajectory(trajectoryList)
}
}
}
override fun onFail(code: Int, msg: String) {
ToastCharterUtils.showShort("$code:$msg")
}
})
override fun onFail(code: Int, msg: String) {
ToastCharterUtils.showShort("$code:$msg")
}
})
}
fun drawStationInfo(sites: List<SiteInfoResponse.SiteInfo>){
fun drawStationInfo(sites: List<SiteInfoResponse.SiteInfo>) {
val stationsList: MutableList<SiteMarkerBean> = mutableListOf()
val stationsNameList: MutableList<SiteMarkerBean> = mutableListOf()
val stationIcon = BitmapFactory.decodeResource(context.resources, R.drawable.map_staton_icon)
val stationIcon =
BitmapFactory.decodeResource(context.resources, R.drawable.map_staton_icon)
sites.forEach {
stationsList.add(SiteMarkerBean(LatLng(it.GcjLat!!,it.GcjLon!!),stationIcon,0.5f,1f))
val bitmap = getBitmap(it.siteId!!,it.siteName ?: "", it.isCheck)
stationsNameList.add(SiteMarkerBean(LatLng(it.GcjLat,it.GcjLon),bitmap,0.0f,0.2f))
stationsList.add(
SiteMarkerBean(
LatLng(it.GcjLat!!, it.GcjLon!!),
stationIcon,
0.5f,
1f
)
)
val bitmap = getBitmap(it.siteId!!, it.siteName ?: "", it.isCheck)
stationsNameList.add(SiteMarkerBean(LatLng(it.GcjLat, it.GcjLon), bitmap, 0.0f, 0.2f))
}
mView?.drawOverMapViewStation(stationsList,stationsNameList)
mView?.drawOverMapViewStation(stationsList, stationsNameList)
}
private fun getBitmap(siteId:Long,siteName: String,isCheck:Boolean): Bitmap {
private fun getBitmap(siteId: Long, siteName: String, isCheck: Boolean): Bitmap {
var siteView = lindIdAndView[siteId]
if(siteView==null){
if (siteView == null) {
val marker = MakerWithSiteName(context)
marker.setTextAndCheck(siteName,isCheck)
marker.setTextAndCheck(siteName, isCheck)
marker.measure(
View.MeasureSpec.makeMeasureSpec(AutoSizeUtils.dp2px(context, 145f), View.MeasureSpec.UNSPECIFIED),
View.MeasureSpec.makeMeasureSpec(AutoSizeUtils.dp2px(context, 34f), View.MeasureSpec.EXACTLY)
View.MeasureSpec.makeMeasureSpec(
AutoSizeUtils.dp2px(context, 145f),
View.MeasureSpec.UNSPECIFIED
),
View.MeasureSpec.makeMeasureSpec(
AutoSizeUtils.dp2px(context, 34f),
View.MeasureSpec.EXACTLY
)
)
marker.layout(0, 0, marker.measuredWidth, marker.measuredHeight)
val bitmap = Bitmap.createBitmap(marker.width, marker.height, Bitmap.Config.ARGB_8888)
marker.draw(Canvas(bitmap))
siteView = MakerWithSiteNamewithCheck(isCheck,marker,bitmap)
siteView = MakerWithSiteNamewithCheck(isCheck, marker, bitmap)
lindIdAndView[siteId] = siteView
}else{
} else {
CallerLogger.d(M_BUS_P + TAG, "缓存View:$siteName---${siteView.isCheck}-----$isCheck")
if (siteView.isCheck != isCheck) {
val marker = siteView.makerWithSiteName
marker.setTextAndCheck(siteName,isCheck)
marker.setTextAndCheck(siteName, isCheck)
marker.measure(
View.MeasureSpec.makeMeasureSpec(AutoSizeUtils.dp2px(context, 145f), View.MeasureSpec.UNSPECIFIED),
View.MeasureSpec.makeMeasureSpec(AutoSizeUtils.dp2px(context, 34f), View.MeasureSpec.UNSPECIFIED)
View.MeasureSpec.makeMeasureSpec(
AutoSizeUtils.dp2px(context, 145f),
View.MeasureSpec.UNSPECIFIED
),
View.MeasureSpec.makeMeasureSpec(
AutoSizeUtils.dp2px(context, 34f),
View.MeasureSpec.UNSPECIFIED
)
)
marker.layout(0, 0, marker.measuredWidth, marker.measuredHeight)
val bitmap = Bitmap.createBitmap(marker.width, marker.height, Bitmap.Config.ARGB_8888)
val bitmap =
Bitmap.createBitmap(marker.width, marker.height, Bitmap.Config.ARGB_8888)
marker.draw(Canvas(bitmap))
siteView.isCheck = isCheck
siteView.bitmapView = bitmap
@@ -351,7 +330,10 @@ class BusPassengerPresenter(view: MainFragment?) :
it.wgs84Lat!!
)
val latLng = LatLng(coordinateConverterWgsToGcj.latitude, coordinateConverterWgsToGcj.longitude)
val latLng = LatLng(
coordinateConverterWgsToGcj.latitude,
coordinateConverterWgsToGcj.longitude
)
mView?.drawEndStation(latLng)
}
}

View File

@@ -9,7 +9,7 @@ import com.mogo.eagle.core.utilcode.util.GsonUtils
import com.mogo.och.bus.passenger.utils.ToastCharterUtils
import com.mogo.och.bus.passenger.callback.ITimeCallback
import com.mogo.och.bus.passenger.model.CharterPassengerModel
import com.mogo.och.bus.passenger.ui.dialogfragment.fragment.OrderInfoFragment
import com.mogo.och.bus.passenger.ui.orderinfo.OrderInfoFragment
import com.mogo.och.common.module.bean.dpmsg.BaseDPMsg
import com.mogo.och.common.module.bean.dpmsg.EndOrderMsg
import com.mogo.och.common.module.biz.constant.OchCommonConst

View File

@@ -3,7 +3,7 @@ package com.mogo.och.bus.passenger.provider;
import android.content.Context;
import android.view.View;
import com.mogo.och.bus.passenger.view.statusbar.StatusBarView;
import com.mogo.och.bus.passenger.ui.statusbar.StatusBarView;
import androidx.annotation.NonNull;

View File

@@ -11,25 +11,21 @@ import com.mogo.commons.mvp.MvpFragment
import com.mogo.eagle.core.data.config.HdMapBuildConfig
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager.getMapUIController
import com.mogo.eagle.core.function.hmi.ui.msgbox.MMsgBoxButtonView
import com.mogo.eagle.core.function.hmi.ui.setting.ToggleDebugView
import com.mogo.eagle.core.function.view.SiteMarkerBean
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS_P
import com.mogo.och.bus.passenger.utils.ToastCharterUtils
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import com.mogo.map.uicontroller.VisualAngleMode
import com.mogo.och.bus.passenger.R
import com.mogo.och.bus.passenger.bean.event.DebugView
import com.mogo.och.bus.passenger.bean.event.EventLineSites
import com.mogo.och.bus.passenger.bean.response.OrderInfoResponse
import com.mogo.och.bus.passenger.model.CharterPassengerModel
import com.mogo.och.bus.passenger.callback.IClearViewCallback
import com.mogo.och.bus.passenger.presenter.BusPassengerPresenter
import com.mogo.och.bus.passenger.ui.bottom.BottomBar
import com.mogo.och.bus.passenger.ui.bottom.BottomClickView
import com.mogo.och.common.module.manager.debug.DebugViewWatchDogFragment
import com.mogo.och.bus.passenger.ui.dialogfragment.M1CarUserNoOrderFragment
import com.mogo.och.bus.passenger.ui.dialogfragment.M1ContainFragment
import com.mogo.och.bus.passenger.ui.dialogfragment.NoviceGuidanceFragment
import com.mogo.och.bus.passenger.view.statusbar.StatusBarView
import com.mogo.och.common.module.biz.constant.LoginStatusManager
import kotlinx.android.synthetic.main.m1_main_fragment.*
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
@@ -44,7 +40,6 @@ class MainFragment :
MvpFragment<MainFragment?, BusPassengerPresenter?>() {
private var bpFunctionGroupDialogFragment: WeakReference<M1ContainFragment>? = null
private var debugViewWatchDogFragment: WeakReference<DebugViewWatchDogFragment>? = null
private var m1CarUserNoOrderFragment: WeakReference<M1CarUserNoOrderFragment>? = null
private var noviceGuidanceFragment: WeakReference<NoviceGuidanceFragment>? = null
@@ -55,6 +50,12 @@ class MainFragment :
BitmapFactory.decodeResource(AbsMogoApplication.getApp().resources,
R.drawable.charter_p_trajectory_line)
private val goneView = object : IClearViewCallback{
override fun goneAllView() {
bb_boorombar.setCheckIndex(BottomBar.SelectView.NONE)
}
}
override fun getLayoutId(): Int {
return R.layout.m1_main_fragment
}
@@ -89,23 +90,28 @@ class MainFragment :
})
bb_boorombar.setSettingClickListener{
openSettingPage(M1ContainFragment.SETTINGSOFTTAB)
}
bb_boorombar.setOrderInfoClickListener{
if (LoginStatusManager.isLogin()) {
if(mPresenter?.haveOrder()==true){
openSettingPage(M1ContainFragment.ORDERINFO)
}else{
ToastCharterUtils.showShort("请确认订单")
bb_boorombar.setCheckChangeListener(object :BottomBar.ApplyClickLintener{
override fun onApplyClick(selectItem: BottomBar.SelectView) {
when (selectItem) {
BottomBar.SelectView.ORDERINFO -> showBizView(orderinfo = true)
BottomBar.SelectView.SETTING -> showBizView(softControl = true)
BottomBar.SelectView.LINE -> showBizView(selectLine = true)
//BottomBar.SelectView.VIDEO -> TODO()
else ->{
showBizView()
}
}
}else{
ToastCharterUtils.showShort(AbsMogoApplication.getApp().getString(R.string.m1_please_login_driver))
}
}
bb_boorombar.setLineClickListener{
openSettingPage(M1ContainFragment.SELECTLINE)
}
})
bb_boorombar.setApplyClickListener(object : BottomClickView.ApplyClickLintener{
override fun onApplyClick() {
bb_boorombar.setCheckIndex(BottomBar.SelectView.NONE)
}
})
biz_orderinfo.goneViewListener = goneView
biz_softcontrol.goneViewListener = goneView
biz_selectline.goneViewListener = goneView
aciv_enter_video.setOnClickListener{
openSettingPage(M1ContainFragment.VIDEOTAB)
}
@@ -119,34 +125,27 @@ class MainFragment :
controller.changeZoom2(0.8f)
}
}
}
debug_arrive_dest.setOnClickListener {
CharterPassengerModel.arriveDest()
}
debug_show_noviceGuidance.setOnClickListener {
showNoviceGuidanceFragment()
}
debug_change_modle.setOnClickListener {
ToastCharterUtils.showShort("因车辆正在人工驾驶中无法靠边停车,请安全员主动停止车辆")
when (HdMapBuildConfig.currentCarVrIconRes) {
R.raw.aiqinghao -> {
mPresenter?.setCarChangeListener(OrderInfoResponse.M1_FAMILY)
}
R.raw.jiatinghao -> {
mPresenter?.setCarChangeListener(OrderInfoResponse.M1_FRIENDLY)
}
R.raw.pengyouhao -> {
mPresenter?.setCarChangeListener(0)
}
else -> {
mPresenter?.setCarChangeListener(OrderInfoResponse.M1_LOVE)
}
}
fun setCarMode(type: Int){
mPresenter?.setCarChangeListener(type)
}
private fun showBizView(orderinfo:Boolean=false,softControl:Boolean=false,selectLine:Boolean=false){
if(orderinfo){
biz_orderinfo.visibility = View.VISIBLE
}else{
biz_orderinfo.visibility = View.GONE
}
debug_show_endview.setOnClickListener {
showOpenAndCloseDoor()
if(softControl){
biz_softcontrol.visibility = View.VISIBLE
}else{
biz_softcontrol.visibility = View.GONE
}
if(selectLine){
biz_selectline.visibility = View.VISIBLE
}else{
biz_selectline.visibility = View.GONE
}
}
@@ -158,31 +157,6 @@ class MainFragment :
M1ContainFragment.openSettingPage(childFragmentManager,parentFragmentManager,bpFunctionGroup,tab)
}
private fun showDebugView() {
if (debugViewWatchDogFragment?.get() == null) {
debugViewWatchDogFragment = WeakReference(DebugViewWatchDogFragment.newInstance())
}
val debugViewFragment = debugViewWatchDogFragment?.get()
DebugViewWatchDogFragment.showDebugView(childFragmentManager,parentFragmentManager,debugViewFragment)
}
fun setSpeed(speed: String) {
tv_speed.text = speed
}
fun setDistanceAndTime(
distance: String,
distanceUnit: String,
leftTime:String,
arriveTime:String
) {
tv_distance.text = distance
tv_distance_unit.text = distanceUnit
tv_distance_surplus_time.text = leftTime
tv_distance_arrive_time.text = arriveTime
}
fun setCarModle(rawInfo: Int){
getMapUIController()?.changeCurrentIcon(rawInfo)
HdMapBuildConfig.currentCarVrIconRes = rawInfo
@@ -283,28 +257,6 @@ class MainFragment :
}
}
@Subscribe(threadMode = ThreadMode.MAIN)
fun changeDebugView(debugView: DebugView) {
when (debugView.type) {
StatusBarView.bizz -> {
if(group_debug.visibility==View.GONE||
group_debug.visibility==View.INVISIBLE){
group_debug.visibility = View.VISIBLE
}else{
group_debug.visibility = View.GONE
}
}
else -> {
if (ToggleDebugView.toggleDebugView.isShowIng()) {
ToggleDebugView.toggleDebugView.dismiss()
}else {
showDebugView()
}
}
}
}
fun drawOverMapViewStation(stationsList: MutableList<SiteMarkerBean>,siteMarkers: List<SiteMarkerBean>?){
omvOverMap?.clearSiteMarkers()
omvOverMap?.clearSiteNameViews()
@@ -318,6 +270,7 @@ class MainFragment :
}
companion object {
public const val TAG = "BusPassengerRouteFragment"
const val TAG = "BusPassengerRouteFragment"
}
}

View File

@@ -1,9 +1,10 @@
package com.mogo.och.bus.passenger.ui.view.bottom
package com.mogo.och.bus.passenger.ui.bottom
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import androidx.constraintlayout.widget.ConstraintLayout
import com.mogo.eagle.core.utilcode.kotlin.onClick
import com.mogo.och.bus.passenger.R
import kotlinx.android.synthetic.main.m1_bottom_bar.view.*
@@ -18,33 +19,40 @@ class BottomBar @JvmOverloads constructor(
setBackgroundResource(R.drawable.charter_p_bottom_bar_bg)
}
private var checkIndex = SelectView.VIDEO
private var checkIndex = SelectView.NONE
private var overMapViewApply:ApplyClickLintener?=null
override fun onAttachedToWindow() {
super.onAttachedToWindow()
cl_order_time.onClick {
setCheckIndex(SelectView.ORDERINFO)
}
actv_setting.onClick {
setCheckIndex(SelectView.SETTING)
}
actv_line.onClick {
setCheckIndex(SelectView.LINE)
}
}
fun setOrderInfoClickListener(click:OnClickListener){
cl_order_time.setOnClickListener(click)
}
fun setSettingClickListener(click:OnClickListener){
actv_setting.setOnClickListener(click)
}
fun setLineClickListener(click:OnClickListener){
actv_line.setOnClickListener(click)
fun setCheckChangeListener(overMapViewApply:ApplyClickLintener){
this.overMapViewApply = overMapViewApply
}
fun setApplyClickListener(click:BottomClickView.ApplyClickLintener){
fun setApplyClickListener(click: BottomClickView.ApplyClickLintener){
aciv_center_image.applyClickListener=click
actv_stop_site.applyClickListener=click
actv_close_door.applyClickListener=click
actv_open_door.applyClickListener=click
}
fun setCheckIndex(index:SelectView){
fun setCheckIndex(index: SelectView){
if(checkIndex==index){
return
checkIndex = SelectView.NONE
}else{
checkIndex = index
}
checkIndex = index
overMapViewApply?.onApplyClick(checkIndex)
if(checkIndex == SelectView.ORDERINFO){
cl_order_time_press.visibility = VISIBLE
cl_order_time.setCheck(true)
@@ -66,7 +74,11 @@ class BottomBar @JvmOverloads constructor(
}
enum class SelectView{
ORDERINFO,SETTING,LINE,VIDEO
NONE,ORDERINFO,SETTING,LINE,VIDEO
}
interface ApplyClickLintener{
fun onApplyClick(selectItem:SelectView)
}
}

View File

@@ -1,4 +1,4 @@
package com.mogo.och.bus.passenger.ui.view.bottom
package com.mogo.och.bus.passenger.ui.bottom
import android.content.Context
import android.util.AttributeSet

View File

@@ -1,4 +1,4 @@
package com.mogo.och.bus.passenger.ui.view.bottom
package com.mogo.och.bus.passenger.ui.bottom
import android.annotation.SuppressLint
import android.content.Context
@@ -28,7 +28,7 @@ open class BottomClickView @JvmOverloads constructor(
private var normalDrawable: Int = -1
private var backageView: View? = null
var applyClickListener:ApplyClickLintener?=null
var applyClickListener: ApplyClickLintener?=null
init {
LayoutInflater.from(context).inflate(R.layout.m1_bottom_stop_site, this, true)

View File

@@ -1,4 +1,4 @@
package com.mogo.och.bus.passenger.ui.view.bottom
package com.mogo.och.bus.passenger.ui.bottom
import android.content.Context
import android.util.AttributeSet
@@ -16,7 +16,6 @@ import com.mogo.och.bus.passenger.model.OrderStatusEnum
import com.mogo.och.common.module.utils.DateTimeUtil
import kotlinx.android.synthetic.main.m1_bottom_orderinfo.view.*
import java.util.UUID
import kotlin.random.Random
open class BottomOrderInfoView @JvmOverloads constructor(
context: Context,

View File

@@ -1,10 +1,10 @@
package com.mogo.och.bus.passenger.ui.view.bottom.impl
package com.mogo.och.bus.passenger.ui.bottom.impl
import android.content.Context
import android.util.AttributeSet
import com.mogo.eagle.core.utilcode.util.ActivityUtils
import com.mogo.och.bus.passenger.R
import com.mogo.och.bus.passenger.ui.view.bottom.BottomClickView
import com.mogo.och.bus.passenger.ui.bottom.BottomClickView
import com.mogo.och.common.module.manager.devicemanage.LightAirconditionDoorManager
import com.mogo.och.common.module.utils.SoundPoolHelper

View File

@@ -1,4 +1,4 @@
package com.mogo.och.bus.passenger.ui.view.bottom.impl
package com.mogo.och.bus.passenger.ui.bottom.impl
import android.annotation.SuppressLint
import android.content.Context
@@ -6,7 +6,6 @@ import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.MotionEvent
import android.view.View
import androidx.appcompat.widget.AppCompatTextView
import androidx.constraintlayout.widget.ConstraintLayout
import com.mogo.commons.AbsMogoApplication
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
@@ -20,7 +19,7 @@ import com.mogo.och.bus.passenger.utils.ToastCharterUtils
import com.mogo.och.bus.passenger.R
import com.mogo.och.bus.passenger.callback.ICharterPassengerAutoStatusChangeCallback
import com.mogo.och.bus.passenger.model.CharterPassengerModel
import com.mogo.och.bus.passenger.ui.view.bottom.BottomClickView
import com.mogo.och.bus.passenger.ui.bottom.BottomClickView
import com.mogo.och.common.module.manager.devicemanage.LightAirconditionDoorStatusManager
import com.mogo.och.common.module.utils.RxUtils
import com.mogo.och.common.module.utils.SoundPoolHelper

View File

@@ -1,11 +1,10 @@
package com.mogo.och.bus.passenger.ui.view.bottom.impl
package com.mogo.och.bus.passenger.ui.bottom.impl
import android.content.Context
import android.util.AttributeSet
import androidx.appcompat.widget.AppCompatTextView
import com.mogo.eagle.core.utilcode.util.ActivityUtils
import com.mogo.och.bus.passenger.R
import com.mogo.och.bus.passenger.ui.view.bottom.BottomClickView
import com.mogo.och.bus.passenger.ui.bottom.BottomClickView
import com.mogo.och.common.module.manager.devicemanage.LightAirconditionDoorManager
import com.mogo.och.common.module.utils.SoundPoolHelper

View File

@@ -1,4 +1,4 @@
package com.mogo.och.bus.passenger.ui.view.bottom.impl
package com.mogo.och.bus.passenger.ui.bottom.impl
import android.content.Context
import android.util.AttributeSet
@@ -8,7 +8,7 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListener
import com.mogo.eagle.core.utilcode.util.ActivityUtils
import com.mogo.och.bus.passenger.utils.ToastCharterUtils
import com.mogo.och.bus.passenger.R
import com.mogo.och.bus.passenger.ui.view.bottom.BottomClickView
import com.mogo.och.bus.passenger.ui.bottom.BottomClickView
import com.mogo.och.common.module.utils.SoundPoolHelper
class StopSiteView @JvmOverloads constructor(

View File

@@ -0,0 +1,3 @@
package com.mogo.och.bus.passenger.ui.debugview
data class DebugEvent(val type: String)

View File

@@ -0,0 +1,131 @@
package com.mogo.och.bus.passenger.ui.debugview
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.fragment.app.FragmentActivity
import com.mogo.eagle.core.data.config.HdMapBuildConfig
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
import com.mogo.eagle.core.function.hmi.ui.setting.ToggleDebugView
import com.mogo.eagle.core.utilcode.util.ActivityUtils
import com.mogo.och.bus.passenger.R
import com.mogo.och.bus.passenger.ui.debugview.DebugView
import com.mogo.och.bus.passenger.bean.response.OrderInfoResponse
import com.mogo.och.bus.passenger.model.CharterPassengerModel
import com.mogo.och.bus.passenger.ui.MainFragment
import com.mogo.och.bus.passenger.ui.statusbar.StatusBarView
import com.mogo.och.bus.passenger.utils.ToastCharterUtils
import com.mogo.och.common.module.manager.debug.DebugViewWatchDogFragment
import kotlinx.android.synthetic.main.m1_p_debug.view.debug_arrive_dest
import kotlinx.android.synthetic.main.m1_p_debug.view.debug_change_modle
import kotlinx.android.synthetic.main.m1_p_debug.view.debug_show_endview
import kotlinx.android.synthetic.main.m1_p_debug.view.debug_show_noviceGuidance
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
import java.lang.ref.WeakReference
class DebugView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr), IMoGoAutopilotStatusListener {
companion object {
const val TAG = "DebugView"
}
init {
LayoutInflater.from(context).inflate(R.layout.m1_p_debug, this, true)
visibility = GONE
}
private var fragment: MainFragment?=null
private var debugViewWatchDogFragment: WeakReference<DebugViewWatchDogFragment>? = null
override fun onAttachedToWindow() {
super.onAttachedToWindow()
EventBus.getDefault().register(this)
val activityByContext = ActivityUtils.getActivityByContext(context)
if(activityByContext is FragmentActivity){
val fragment = activityByContext.supportFragmentManager.findFragmentByTag(MainFragment.TAG)
if(fragment is MainFragment){
this.fragment = fragment
}
}
debug_arrive_dest.setOnClickListener {
CharterPassengerModel.arriveDest()
}
debug_show_noviceGuidance.setOnClickListener {
fragment?.showNoviceGuidanceFragment()
}
debug_change_modle.setOnClickListener {
ToastCharterUtils.showShort("因车辆正在人工驾驶中无法靠边停车,请安全员主动停止车辆")
when (HdMapBuildConfig.currentCarVrIconRes) {
R.raw.aiqinghao -> {
fragment?.setCarMode(OrderInfoResponse.M1_FAMILY)
}
R.raw.jiatinghao -> {
fragment?.setCarMode(OrderInfoResponse.M1_FRIENDLY)
}
R.raw.pengyouhao -> {
fragment?.setCarMode(0)
}
else -> {
fragment?.setCarMode(OrderInfoResponse.M1_LOVE)
}
}
}
debug_show_endview.setOnClickListener {
fragment?.showOpenAndCloseDoor()
}
}
@Subscribe(threadMode = ThreadMode.MAIN)
fun changeOverview(debugEvent: DebugEvent) {
when (debugEvent.type) {
StatusBarView.bizz -> {
if(visibility== View.GONE||
visibility== View.INVISIBLE){
visibility = View.VISIBLE
}else{
visibility = View.GONE
}
}
else -> {
if (ToggleDebugView.toggleDebugView.isShowIng()) {
ToggleDebugView.toggleDebugView.dismiss()
}else {
showDebugView()
}
}
}
}
private fun showDebugView() {
if (debugViewWatchDogFragment?.get() == null) {
debugViewWatchDogFragment = WeakReference(DebugViewWatchDogFragment.newInstance())
}
val debugViewFragment = debugViewWatchDogFragment?.get()
fragment?.let {
DebugViewWatchDogFragment.showDebugView(it.childFragmentManager,it.parentFragmentManager,debugViewFragment)
}
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
EventBus.getDefault().unregister(this)
}
}

View File

@@ -17,12 +17,12 @@ import com.mogo.eagle.core.utilcode.util.*
import com.mogo.och.bus.passenger.R
import com.mogo.och.bus.passenger.bean.event.EventLineSites
import com.mogo.och.bus.passenger.presenter.BusPassengerFunctionPresenter
import com.mogo.och.bus.passenger.ui.dialogfragment.fragment.M1OrderLineFragment
import com.mogo.och.bus.passenger.ui.dialogfragment.fragment.M1SoftFragment
import com.mogo.och.bus.passenger.ui.dialogfragment.fragment.M1VideoFragment
import com.mogo.och.bus.passenger.ui.dialogfragment.fragment.OrderInfoFragment
import com.mogo.och.bus.passenger.ui.view.bottom.BottomBar
import com.mogo.och.bus.passenger.ui.view.bottom.BottomClickView
import com.mogo.och.bus.passenger.ui.selectline.M1OrderLineFragment
import com.mogo.och.bus.passenger.ui.softcontrol.M1SoftFragment
import com.mogo.och.bus.passenger.ui.video.M1VideoFragment
import com.mogo.och.bus.passenger.ui.orderinfo.OrderInfoFragment
import com.mogo.och.bus.passenger.ui.bottom.BottomBar
import com.mogo.och.bus.passenger.ui.bottom.BottomClickView
import com.mogo.och.bus.passenger.utils.ToastCharterUtils
import com.mogo.och.common.module.biz.constant.LoginStatusManager
import com.mogo.och.common.module.manager.debug.DebugViewWatchDogFragment
@@ -114,45 +114,45 @@ class M1ContainFragment :
cl_container.setOnClickListener {
dismissAllowingStateLoss()
}
bb_bottom_bar.setSettingClickListener{
CallerLogger.d(M_BUS_P+ TAG, "initViews---$tab")
if(tab==SETTINGSOFTTAB) {
dismissAllowingStateLoss()
}else{
tab = SETTINGSOFTTAB
setCheckView()
}
}
bb_bottom_bar.setLineClickListener{
CallerLogger.d(M_BUS_P+ TAG, "initViews---$tab")
if(tab==SELECTLINE) {
dismissAllowingStateLoss()
}else{
tab = SELECTLINE
setCheckView()
}
}
bb_bottom_bar.setOrderInfoClickListener{
if (LoginStatusManager.isLogin()) {
if(mPresenter?.haveOrder()==true){
}else{
ToastCharterUtils.showShort("请确认订单")
return@setOrderInfoClickListener
}
}else{
ToastCharterUtils.showShort(AbsMogoApplication.getApp().getString(R.string.m1_please_login_driver))
return@setOrderInfoClickListener
}
CallerLogger.d(M_BUS_P+ TAG, "initViews---$tab")
if(tab==ORDERINFO) {
dismissAllowingStateLoss()
}else{
tab = ORDERINFO
setCheckView()
}
}
// bb_bottom_bar.setSettingClickListener{
// CallerLogger.d(M_BUS_P+ TAG, "initViews---$tab")
// if(tab==SETTINGSOFTTAB) {
// dismissAllowingStateLoss()
// }else{
// tab = SETTINGSOFTTAB
// setCheckView()
// }
// }
// bb_bottom_bar.setLineClickListener{
// CallerLogger.d(M_BUS_P+ TAG, "initViews---$tab")
// if(tab==SELECTLINE) {
// dismissAllowingStateLoss()
// }else{
// tab = SELECTLINE
// setCheckView()
// }
// }
// bb_bottom_bar.setOrderInfoClickListener{
// if (LoginStatusManager.isLogin()) {
// if(mPresenter?.haveOrder()==true){
//
// }else{
// ToastCharterUtils.showShort("请确认订单")
// return@setOrderInfoClickListener
// }
// }else{
// ToastCharterUtils.showShort(AbsMogoApplication.getApp().getString(R.string.m1_please_login_driver))
// return@setOrderInfoClickListener
// }
//
// CallerLogger.d(M_BUS_P+ TAG, "initViews---$tab")
// if(tab==ORDERINFO) {
// dismissAllowingStateLoss()
// }else{
// tab = ORDERINFO
// setCheckView()
// }
// }
bb_bottom_bar.setApplyClickListener(object : BottomClickView.ApplyClickLintener{
override fun onApplyClick() {
dismissAllowingStateLoss()

View File

@@ -0,0 +1,69 @@
package com.mogo.och.bus.passenger.ui.itinerary
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.findViewTreeViewModelStoreOwner
import com.mogo.och.bus.passenger.R
import kotlinx.android.synthetic.main.m1_itinerary_info.view.tv_distance
import kotlinx.android.synthetic.main.m1_itinerary_info.view.tv_distance_arrive_time
import kotlinx.android.synthetic.main.m1_itinerary_info.view.tv_distance_surplus_time
import kotlinx.android.synthetic.main.m1_itinerary_info.view.tv_distance_unit
import kotlinx.android.synthetic.main.m1_itinerary_info.view.tv_speed
class ItineraryView : ConstraintLayout, ItineraryViewModel.ItineraryViewCallback {
private val TAG = "ItineraryView"
constructor(context: Context) : super(context)
constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet)
constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int) : super(context, attributeSet, defStyleAttr)
constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int, defStyleRes: Int) : super(context, attributeSet, defStyleAttr, defStyleRes)
private fun initView() {
LayoutInflater.from(context).inflate(R.layout.m1_itinerary_info, this, true)
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
val viewModel = findViewTreeViewModelStoreOwner()?.let {
ViewModelProvider(it).get(ItineraryViewModel::class.java)
}
viewModel?.setDistanceCallback(this)
}
override fun setSpeed(speed: String) {
tv_speed.text = speed
}
override fun setDistanceAndTime(
distance: String,
distanceUnit: String,
leftTime:String,
arriveTime:String
) {
tv_distance.text = distance
tv_distance_unit.text = distanceUnit
tv_distance_surplus_time.text = leftTime
tv_distance_arrive_time.text = arriveTime
}
init {
try {
initView()
} catch (e: Exception) {
e.printStackTrace()
}
}
}

View File

@@ -0,0 +1,107 @@
package com.mogo.och.bus.passenger.ui.itinerary
import androidx.lifecycle.ViewModel
import com.mogo.commons.AbsMogoApplication
import com.mogo.eagle.core.data.map.MogoLocation
import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Listener
import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import com.mogo.och.bus.passenger.R
import com.mogo.och.bus.passenger.callback.IDistanceCallback
import com.mogo.och.bus.passenger.model.CharterPassengerModel
import com.mogo.och.bus.passenger.model.IOrderStatusChangeListener
import com.mogo.och.bus.passenger.model.OrderStatusEnum
import com.mogo.och.common.module.utils.DateTimeUtil
import com.mogo.och.common.module.utils.NumberFormatUtil
import kotlin.math.abs
import kotlin.math.ceil
class ItineraryViewModel : ViewModel(), IMoGoChassisLocationGCJ02Listener, IDistanceCallback,
IOrderStatusChangeListener {
private val TAG = ItineraryViewModel::class.java.simpleName
private var viewCallback: ItineraryViewCallback? = null
init {
CallerChassisLocationGCJ02ListenerManager.addListener(TAG, 4, this)
CharterPassengerModel.setStationDistanceListener(TAG, this)
CharterPassengerModel.setStatusChangeListener(TAG, this)
}
override fun onCleared() {
super.onCleared()
this.viewCallback = null
CallerChassisLocationGCJ02ListenerManager.removeListener(TAG)
CharterPassengerModel.setStationDistanceListener(TAG, null)
CharterPassengerModel.setStatusChangeListener(TAG, null)
}
fun setDistanceCallback(viewCallback: ItineraryViewCallback) {
this.viewCallback = viewCallback
}
override fun onChassisLocationGCJ02(mogoLocation: MogoLocation?) {
mogoLocation?.let {
UiThreadHandler.post {
val speedKM = (abs(it.gnssSpeed) * 3.6f).toInt()
viewCallback?.setSpeed(speedKM.toString())
}
}
}
override fun setDistancecAndTime(meters: Long, timeInSecond: Long) {
val unitKm = AbsMogoApplication.getApp().getString(R.string.m1_distance_unit_km)
if (meters < 0 && timeInSecond < 0) {
setDistanceAndTime("--", unitKm, "--", "--")
return
}
var dis: String? = "0"
var disUnit = "KM"
if (meters > 0) {
if (meters / 1000 < 1) {
disUnit = AbsMogoApplication.getApp().getString(R.string.m1_distance_unit_m)
dis = Math.round(meters.toFloat()).toString()
} else {
disUnit = unitKm
dis = NumberFormatUtil.formatLong(meters.toDouble() / 1000)
}
}
val time = ceil(timeInSecond / 60f).toInt()
val arriveTime = DateTimeUtil.getAfterSecondTime(timeInSecond.toInt())
setDistanceAndTime(dis.toString(), disUnit, time.toString(), arriveTime)
}
private fun setDistanceAndTime(
distance: String,
distanceUnit: String,
leftTime: String,
arriveTime: String
) {
UiThreadHandler.post {
viewCallback?.setDistanceAndTime(distance, distanceUnit, leftTime, arriveTime)
}
}
override fun onStatusChange(currentStatus: OrderStatusEnum) {
when (currentStatus) {
OrderStatusEnum.NoOrderUse -> {
UiThreadHandler.post {
setDistancecAndTime(-1, -1)
}
}
else ->{}
}
}
interface ItineraryViewCallback {
fun setSpeed(speed: String)
fun setDistanceAndTime(
distance: String,
distanceUnit: String,
leftTime: String,
arriveTime: String
)
}
}

View File

@@ -1,4 +1,4 @@
package com.mogo.och.bus.passenger.ui.dialogfragment.fragment
package com.mogo.och.bus.passenger.ui.orderinfo
import android.os.Bundle
import android.view.View

View File

@@ -0,0 +1,111 @@
package com.mogo.och.bus.passenger.ui.orderinfo
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.findViewTreeViewModelStoreOwner
import com.mogo.eagle.core.utilcode.kotlin.onClick
import com.mogo.och.bus.passenger.R
import com.mogo.och.bus.passenger.callback.IClearViewCallback
import kotlinx.android.synthetic.main.m1_devices_fragment.view.actv_contain_order
import kotlinx.android.synthetic.main.m1_devices_fragment.view.actv_end_order
import kotlinx.android.synthetic.main.m1_devices_fragment.view.actv_end_order_submit
import kotlinx.android.synthetic.main.m1_devices_fragment.view.actv_left_time
import kotlinx.android.synthetic.main.m1_devices_fragment.view.actv_order_phone
import kotlinx.android.synthetic.main.m1_devices_fragment.view.actv_order_times
import kotlinx.android.synthetic.main.m1_devices_fragment.view.cl_order_info
import kotlinx.android.synthetic.main.m1_devices_fragment.view.cl_order_info_endorder_comfit
class OrderInfoView : ConstraintLayout, OrderInfoViewModel.ItineraryViewCallback {
private val TAG = "OrderInfoView"
constructor(context: Context) : super(context)
constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet)
constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int) : super(
context,
attributeSet,
defStyleAttr
)
constructor(
context: Context,
attributeSet: AttributeSet,
defStyleAttr: Int,
defStyleRes: Int
) : super(context, attributeSet, defStyleAttr, defStyleRes){
initView()
}
var goneViewListener: IClearViewCallback?=null
private fun initView() {
LayoutInflater.from(context).inflate(R.layout.m1_devices_fragment, this, true)
onClick {
setViewGone()
}
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
val viewModel = findViewTreeViewModelStoreOwner()?.let {
ViewModelProvider(it).get(OrderInfoViewModel::class.java)
}
viewModel?.setDistanceCallback(this)
actv_end_order_submit.setOnClickListener {
viewModel?.endOrder()
}
actv_contain_order.setOnClickListener {
setViewGone()
}
actv_end_order.setOnClickListener {
cl_order_info.visibility = View.GONE
cl_order_info_endorder_comfit.visibility = View.VISIBLE
}
}
override fun setViewGone(){
goneViewListener?.goneAllView()
}
override fun setLeftTime(leftTime:String){
actv_left_time.text = "剩余时间 $leftTime"
}
override fun setStartTimeAndEndTime(startTime:String,endTime:String){
actv_order_times.text = "$startTime-$endTime"
}
override fun setPhone(phone:String){
if(phone.length>8) {
//截取电话号码前三位
val phoneNumPre = phone.substring(0, 3);
//截取电话号码后四位
val phoneNumFix = phone.substring(7);
actv_order_phone.text = "$phoneNumPre****$phoneNumFix"
}else{
actv_order_phone.text = phone
}
}
init {
try {
initView()
} catch (e: Exception) {
e.printStackTrace()
}
}
}

View File

@@ -0,0 +1,91 @@
package com.mogo.och.bus.passenger.ui.orderinfo
import androidx.lifecycle.ViewModel
import com.mogo.eagle.core.data.BaseData
import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.eagle.core.utilcode.util.GsonUtils
import com.mogo.och.bus.passenger.callback.ITimeCallback
import com.mogo.och.bus.passenger.model.CharterPassengerModel
import com.mogo.och.bus.passenger.utils.ToastCharterUtils
import com.mogo.och.common.module.bean.dpmsg.BaseDPMsg
import com.mogo.och.common.module.bean.dpmsg.EndOrderMsg
import com.mogo.och.common.module.biz.constant.OchCommonConst
import com.mogo.och.common.module.biz.network.OchCommonServiceCallback
import com.mogo.och.common.module.utils.DateTimeUtil
class OrderInfoViewModel: ViewModel(), ITimeCallback {
private val TAG = OrderInfoViewModel::class.java.simpleName
private var viewCallback:ItineraryViewCallback?=null
init {
CharterPassengerModel.setOrderLeftTimeListeners(TAG,this)
}
override fun onCleared() {
super.onCleared()
this.viewCallback = null
CharterPassengerModel.setOrderLeftTimeListeners(TAG,null)
}
fun setDistanceCallback(viewCallback:ItineraryViewCallback){
this.viewCallback = viewCallback
getDataInfo()
}
private fun getDataInfo() {
val currentOrderInfo = CharterPassengerModel.getCurrentOrderInfo()
currentOrderInfo?.let {
viewCallback?.setPhone(it.passengerPhone?:"")
try {
viewCallback?.setStartTimeAndEndTime(
DateTimeUtil.formatLongToString(it.startTime!!, DateTimeUtil.HH_mm),
DateTimeUtil.formatLongToString(it.endTime!!, DateTimeUtil.HH_mm))
}catch (e:Exception){
e.printStackTrace()
}
}
}
override fun setOrderTimeCallBack(timeInSecond: Long) {
val leftTime = DateTimeUtil.second2Time(timeInSecond)
viewCallback?.setLeftTime(leftTime)
}
fun endOrder() {
CharterPassengerModel.endOrder(object : OchCommonServiceCallback<BaseData> {
override fun onSuccess(data: BaseData?) {
if (null != data && 0 == data.code) {
ToastCharterUtils.showShort("结束成功")
CharterPassengerModel.setEndOrderStatus()
viewCallback?.setViewGone()
val msg = EndOrderMsg(
CharterPassengerModel.getCurrentOrderInfo()?.orderNo?:"",
)
CallerTelematicManager.sendMsgToServer(
OchCommonConst.BUSINESS_STRING,
GsonUtils.toJson(msg).toByteArray()
)
CallerLogger.d(SceneConstant.M_BUS_P + BaseDPMsg.TAG, "发送数据:结束订单${msg}")
}
}
override fun onFail(code: Int, msg: String) {
ToastCharterUtils.showShort("$code:$msg")
}
})
}
interface ItineraryViewCallback{
fun setPhone(phone:String)
fun setViewGone()
fun setLeftTime(leftTime:String)
fun setStartTimeAndEndTime(startTime:String,endTime:String)
}
}

View File

@@ -1,4 +1,4 @@
package com.mogo.och.bus.passenger.view
package com.mogo.och.bus.passenger.ui.overmapview
import android.content.Context
import android.graphics.Bitmap
@@ -8,6 +8,9 @@ import androidx.constraintlayout.widget.ConstraintLayout
import com.mogo.och.bus.passenger.R
import kotlinx.android.synthetic.main.view_maker_sitename.view.*
/**
* 全览地图中使用的view
*/
class MakerWithSiteName @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
@@ -28,4 +31,4 @@ class MakerWithSiteName @JvmOverloads constructor(
}
}
data class MakerWithSiteNamewithCheck(var isCheck: Boolean,val makerWithSiteName:MakerWithSiteName,var bitmapView: Bitmap)
data class MakerWithSiteNamewithCheck(var isCheck: Boolean, val makerWithSiteName: MakerWithSiteName, var bitmapView: Bitmap)

View File

@@ -1,4 +1,4 @@
package com.mogo.och.bus.passenger.ui.dialogfragment.fragment
package com.mogo.och.bus.passenger.ui.selectline
import android.animation.ObjectAnimator
import android.graphics.drawable.AnimationDrawable
@@ -16,12 +16,11 @@ import com.mogo.och.bus.passenger.R
import com.mogo.och.bus.passenger.bean.response.LineInfoResponse
import com.mogo.och.bus.passenger.bean.response.SiteInfoResponse
import com.mogo.och.bus.passenger.model.CharterPassengerModel
import com.mogo.och.bus.passenger.model.OrderStatusEnum
import com.mogo.och.bus.passenger.presenter.BusPassengerFunctionOrderPresenter
import com.mogo.och.bus.passenger.ui.adapter.OrderLineItemAdapter
import com.mogo.och.bus.passenger.ui.adapter.OrderSiteItemAdapter
import com.mogo.och.bus.passenger.ui.selectline.adapter.OrderLineItemAdapter
import com.mogo.och.bus.passenger.ui.selectline.adapter.OrderSiteItemAdapter
import com.mogo.och.bus.passenger.ui.dialogfragment.M1ContainFragment
import com.mogo.och.bus.passenger.view.BottomDecoration
import com.mogo.och.bus.passenger.ui.selectline.layoutmanage.BottomDecoration
import com.mogo.och.common.module.utils.RxUtils
import io.reactivex.disposables.Disposable
import kotlinx.android.synthetic.main.m1_order_fragment.*

View File

@@ -0,0 +1,278 @@
package com.mogo.och.bus.passenger.ui.selectline
import android.animation.ObjectAnimator
import android.content.Context
import android.graphics.drawable.AnimationDrawable
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import android.view.animation.LinearInterpolator
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.findViewTreeViewModelStoreOwner
import androidx.recyclerview.widget.LinearLayoutManager
import com.elegant.utils.UiThreadHandler
import com.mogo.eagle.core.utilcode.kotlin.onClick
import com.mogo.och.bus.passenger.R
import com.mogo.och.bus.passenger.bean.response.LineInfoResponse
import com.mogo.och.bus.passenger.bean.response.SiteInfoResponse
import com.mogo.och.bus.passenger.callback.IClearViewCallback
import com.mogo.och.bus.passenger.model.CharterPassengerModel
import com.mogo.och.bus.passenger.ui.selectline.adapter.OrderLineItemAdapter
import com.mogo.och.bus.passenger.ui.selectline.adapter.OrderSiteItemAdapter
import com.mogo.och.bus.passenger.ui.selectline.layoutmanage.BottomDecoration
import com.mogo.och.bus.passenger.utils.ToastCharterUtils
import com.mogo.och.common.module.utils.RxUtils
import io.reactivex.disposables.Disposable
import kotlinx.android.synthetic.main.m1_order_fragment.view.aciv_driver_refuse_group
import kotlinx.android.synthetic.main.m1_order_fragment.view.g_lines_sites_data
import kotlinx.android.synthetic.main.m1_order_fragment.view.g_loading_group
import kotlinx.android.synthetic.main.m1_order_fragment.view.g_side_cancle_submit_group
import kotlinx.android.synthetic.main.m1_order_fragment.view.group_driver_agrenn_line
import kotlinx.android.synthetic.main.m1_order_fragment.view.iv_loading_wait_driver
import kotlinx.android.synthetic.main.m1_order_fragment.view.lsv_line_site
import kotlinx.android.synthetic.main.m1_order_fragment.view.m1_order_loading
import kotlinx.android.synthetic.main.m1_order_fragment.view.m1_order_neterror
import kotlinx.android.synthetic.main.m1_order_fragment.view.m1_order_noorder
import kotlinx.android.synthetic.main.m1_order_fragment.view.rlv_line_list
import kotlinx.android.synthetic.main.m1_order_fragment.view.rv_site_list
import kotlinx.android.synthetic.main.m1_order_fragment.view.tv_site_cancle
import kotlinx.android.synthetic.main.m1_order_fragment.view.tv_site_submit
import kotlinx.android.synthetic.main.m1_order_loading.view.iv_loading_wait_ent
import me.jessyan.autosize.utils.AutoSizeUtils
class SelectLineView : ConstraintLayout, SelectLineViewModel.SelectLineViewCallback {
private val TAG = "OrderInfoView"
constructor(context: Context) : super(context)
constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet)
constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int) : super(
context,
attributeSet,
defStyleAttr
)
constructor(
context: Context,
attributeSet: AttributeSet,
defStyleAttr: Int,
defStyleRes: Int
) : super(context, attributeSet, defStyleAttr, defStyleRes)
var goneViewListener: IClearViewCallback?=null
private lateinit var lineAdapter: OrderLineItemAdapter
private lateinit var siteAdapter: OrderSiteItemAdapter
private val lineList = mutableListOf<LineInfoResponse.LineInfo>()
private val siteList = mutableListOf<SiteInfoResponse.SiteInfo>()
private var subscribeDirverAgree: Disposable? = null
private var subscribeDirverRefuse: Disposable? = null
private val loadingAni =
ObjectAnimator.ofFloat(iv_loading_wait_ent, "rotation", 0f, 90f, 180f, 270f, 360f)
.apply {
repeatCount = -1
interpolator = LinearInterpolator()
duration = 1000
}
private fun initView() {
LayoutInflater.from(context).inflate(R.layout.m1_order_fragment, this, true)
onClick {
setViewGone()
}
lineAdapter = OrderLineItemAdapter(context, lineList)
siteAdapter = OrderSiteItemAdapter(context, siteList)
loadingAni.target = iv_loading_wait_ent
rlv_line_list.layoutManager =
LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)
rlv_line_list.addItemDecoration(
BottomDecoration(
AutoSizeUtils.dp2px(context, 60f)
)
)
rlv_line_list.adapter = lineAdapter
rv_site_list.layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)
rv_site_list.addItemDecoration(
BottomDecoration(
AutoSizeUtils.dp2px(context, 90f)
)
)
rv_site_list.adapter = siteAdapter
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
val viewModel = findViewTreeViewModelStoreOwner()?.let {
ViewModelProvider(it).get(SelectLineViewModel::class.java)
}
viewModel?.setVIewCallback(this)
lineAdapter.checkChangeListener = object : OrderLineItemAdapter.CheckListener {
override fun canSwitchLine(): Boolean {
return true
}
override fun onCheckListener(lineInfo: LineInfoResponse.LineInfo) {
viewModel?.checkLineClick(lineInfo)
siteAdapter.clearCheck()
}
}
siteAdapter.checkChangeListener = object : OrderSiteItemAdapter.CheckListener {
override fun canSwitchLine(): Boolean {
return viewModel?.canSwitchLine()?:true
}
override fun onCheckListener(siteInfo: SiteInfoResponse.SiteInfo?) {
// 设置临时选中的
viewModel?.checkSiteClick(siteInfo)
}
}
tv_site_cancle.onClick {
viewModel?.resetData()
}
tv_site_submit.onClick {
CharterPassengerModel.switchLine5minWait?.let {
if (!it.isDisposed) {
ToastCharterUtils.showShort("选择线路后5分钟内不可用选")
return@onClick
}
}
viewModel?.changeSites(siteList)
}
}
private fun showSelectData() {
UiThreadHandler.post {
g_lines_sites_data?.visibility = View.VISIBLE
g_loading_group?.visibility = View.GONE
group_driver_agrenn_line?.visibility = View.GONE
aciv_driver_refuse_group?.visibility = View.GONE
}
}
override fun hideDataWaitDriverMsg() {
g_lines_sites_data?.visibility = View.GONE
g_loading_group?.visibility = View.VISIBLE
iv_loading_wait_driver?.let {
val animationDrawable = it.drawable as AnimationDrawable
animationDrawable.start()
}
}
override fun setVisableByTrun(
showBiz: Boolean,
showNetError: Boolean,
showNorOrder: Boolean,
showLoading: Boolean
) {
if(showBiz){
// 选择线路页面
m1_order_noorder?.visibility = View.GONE
m1_order_neterror?.visibility = View.GONE
lsv_line_site?.visibility = View.VISIBLE
m1_order_loading?.visibility = View.GONE
return
}
if(showNetError){
m1_order_noorder?.visibility = View.GONE
m1_order_neterror?.visibility = View.VISIBLE
lsv_line_site?.visibility = View.GONE
m1_order_loading?.visibility = View.GONE
return
}
if(showNorOrder){
m1_order_noorder?.visibility = View.VISIBLE
m1_order_neterror?.visibility = View.GONE
lsv_line_site?.visibility = View.GONE
m1_order_loading?.visibility = View.GONE
return
}
if(showLoading){
m1_order_noorder?.visibility = View.GONE
m1_order_neterror?.visibility = View.GONE
lsv_line_site?.visibility = View.GONE
m1_order_loading?.visibility = View.VISIBLE
if (!loadingAni.isRunning) {
loadingAni.start()
}
}
}
override fun hideDataDriverAgree() {
group_driver_agrenn_line?.visibility = View.VISIBLE
aciv_driver_refuse_group?.visibility = View.GONE
g_loading_group?.visibility = View.GONE
g_lines_sites_data?.let {
it.visibility = View.GONE
subscribeDirverAgree = RxUtils.createSubscribe(3_000) {
setViewGone()
}
}
}
override fun setEnableSiteStatus(cancleAndSubmit: Boolean) {
if (cancleAndSubmit) {
g_side_cancle_submit_group?.visibility = View.VISIBLE
} else {
g_side_cancle_submit_group?.visibility = View.GONE
}
}
override fun lineAdapterSubmit(lineInfo: LineInfoResponse.LineInfo) {
lineAdapter.submitLine(lineInfo)
}
override fun hideDataDriverRefuse() {
group_driver_agrenn_line?.visibility = View.GONE
aciv_driver_refuse_group?.visibility = View.VISIBLE
g_loading_group?.visibility = View.GONE
g_lines_sites_data?.let {
it.visibility = View.GONE
subscribeDirverRefuse = RxUtils.createSubscribe(3_000) {
showSelectData()
}
}
}
override fun lineAdapterSetData(
lineInfo: List<LineInfoResponse.LineInfo>,
checkLine: LineInfoResponse.LineInfo?
) {
lineAdapter.setDataList(lineInfo,checkLine)
}
override fun siteAdapterEnableIndex(index: Int) {
siteAdapter.setEnableIndex(index)
}
override fun siteAdapterSetData(siteInfo: List<SiteInfoResponse.SiteInfo>) {
siteAdapter.setDataList(siteInfo)
}
private fun setViewGone(){
goneViewListener?.goneAllView()
}
init {
try {
initView()
} catch (e: Exception) {
e.printStackTrace()
}
}
}

View File

@@ -0,0 +1,419 @@
package com.mogo.och.bus.passenger.ui.selectline
import androidx.lifecycle.ViewModel
import com.elegant.utils.UiThreadHandler
import com.mogo.commons.AbsMogoApplication
import com.mogo.eagle.core.data.BaseData
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
import com.mogo.eagle.core.function.api.telematic.IReceivedMsgListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager
import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager
import com.mogo.eagle.core.function.call.telematic.CallerTelematicListenerManager
import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.eagle.core.utilcode.util.GsonUtils
import com.mogo.och.bus.passenger.bean.event.EventLineSites
import com.mogo.och.bus.passenger.bean.response.LineInfoListResponse
import com.mogo.och.bus.passenger.bean.response.LineInfoResponse
import com.mogo.och.bus.passenger.bean.response.SiteInfoResponse
import com.mogo.och.bus.passenger.callback.ITimeCallback
import com.mogo.och.bus.passenger.model.CharterPassengerModel
import com.mogo.och.bus.passenger.model.IOrderStatusChangeListener
import com.mogo.och.bus.passenger.model.OrderStatusEnum
import com.mogo.och.bus.passenger.net.BusPassengerServiceManager
import com.mogo.och.bus.passenger.presenter.BusPassengerFunctionOrderPresenter
import com.mogo.och.bus.passenger.utils.ToastCharterUtils
import com.mogo.och.common.module.bean.dpmsg.BaseDPMsg
import com.mogo.och.common.module.bean.dpmsg.ChangeDestMsg
import com.mogo.och.common.module.bean.dpmsg.DPMsgType
import com.mogo.och.common.module.bean.dpmsg.EndOrderMsg
import com.mogo.och.common.module.bean.dpmsg.LineSite
import com.mogo.och.common.module.biz.constant.OchCommonConst
import com.mogo.och.common.module.biz.network.OchCommonServiceCallback
import com.mogo.och.common.module.manager.StopSideStatusManager
import com.mogo.och.common.module.manager.loopmanager.BizLoopManager
import com.mogo.och.common.module.manager.loopmanager.LoopInfo
import com.mogo.och.common.module.utils.DateTimeUtil
import com.mogo.och.common.module.utils.RxUtils
import io.reactivex.disposables.Disposable
import org.greenrobot.eventbus.EventBus
class SelectLineViewModel : ViewModel(), IOrderStatusChangeListener {
private val TAG = SelectLineViewModel::class.java.simpleName
private val TAGLINELOOP = "LineSiteViewLineLoop"
private var viewCallback: SelectLineViewCallback? = null
// 成功提交给后台得线路
private var checkLine: LineInfoResponse.LineInfo? = null
// 成功提交给后台得终点站点
private var checkSite: SiteInfoResponse.SiteInfo? = null
// 下一个站点
private var currentSite: SiteInfoResponse.SiteInfo? = null
// 向司机端端提交的临时线路
private var tempCheckLine: LineInfoResponse.LineInfo? = null
// 向司机端临时提交的终点站点
private var tempCheckSite: SiteInfoResponse.SiteInfo? = null
private var subscribeSelectLine: Disposable? = null
private var subscribeSelectSite: Disposable? = null
/**
* 接收司机屏反馈信息
*/
private val msgReceived = object : IReceivedMsgListener {
override fun onReceivedMsg(type: Int, byteArray: ByteArray) {
UiThreadHandler.post {
if (type == OchCommonConst.BUSINESS_STRING) {
val msg = GsonUtils.fromJson(
String(byteArray),
BaseDPMsg::class.java
) as BaseDPMsg
if (msg.type == DPMsgType.TYPE_CHANGE_DEST.type) {
val msg = GsonUtils.fromJson(
String(byteArray),
ChangeDestMsg::class.java
) as ChangeDestMsg
CallerLogger.d(
SceneConstant.M_BUS_P + BaseDPMsg.TAG,
"接受数据:切换站点${msg}"
)
if (msg.isConfirmed) {
if (msg.arriveStatus == 2) {
return@post
}
ToastCharterUtils.showShort("站点确定")
viewCallback?.setEnableSiteStatus(true)
checkLine = tempCheckLine
checkSite = tempCheckSite
tempCheckLine = null
tempCheckSite = null
checkLine?.let {
viewCallback?.lineAdapterSubmit(it)
}
viewCallback?.hideDataDriverAgree()
CharterPassengerModel.cleanbroadcastListInfo(checkSite)
CharterPassengerModel.queryOrder()
} else {
ToastCharterUtils.showShort("司机端拒绝请重新选择")
viewCallback?.hideDataDriverRefuse()
}
RxUtils.disposeSubscribe(subscribeSelectSite)
BizLoopManager.removeLoopFunction(BusPassengerFunctionOrderPresenter.TAGLINELOOP)
}
}
}
}
}
init {
CharterPassengerModel.setStatusChangeListener(TAG, this)
CallerTelematicListenerManager.addListener(TAG, msgReceived)
}
override fun onCleared() {
super.onCleared()
this.viewCallback = null
RxUtils.disposeSubscribe(subscribeSelectLine)
RxUtils.disposeSubscribe(subscribeSelectSite)
BizLoopManager.removeLoopFunction(TAGLINELOOP)
CharterPassengerModel.setStatusChangeListener(TAG, null)
CallerTelematicListenerManager.removeListener(TAG)
}
override fun onStatusChange(currentStatus: OrderStatusEnum) {
UiThreadHandler.post {
needRunUI(currentStatus)
}
}
fun setVIewCallback(viewCallback: SelectLineViewCallback) {
this.viewCallback = viewCallback
val currentOrderStatus = CharterPassengerModel.getCurrentOrderStatus()
needRunUI(currentOrderStatus)
extracted()
}
fun checkLineClick(lineInfo: LineInfoResponse.LineInfo) {
checkLine4View()
tempCheckLine = lineInfo
querySitesByLineId(lineInfo)
}
private fun checkLine4View() {
tempCheckSite = null
viewCallback?.setEnableSiteStatus(false)
}
private fun extracted() {
val currentOrderStatus = CharterPassengerModel.getCurrentOrderStatus()
if (currentOrderStatus == OrderStatusEnum.OrderNoLine || currentOrderStatus == OrderStatusEnum.OrdersWithLine) {
val hasSetLineAndSite = CharterPassengerModel.hasSetLineAndSite()
if (hasSetLineAndSite != null) {// 已经设置了线路和站点
checkLine = hasSetLineAndSite.first
checkSite = hasSetLineAndSite.second
}
viewCallback?.setEnableSiteStatus(false)
queryLineList()
}
}
private fun needRunUI(currentStatus: OrderStatusEnum) {
when (currentStatus) {
OrderStatusEnum.OrderNoLine -> {
viewCallback?.setVisableByTrun(showBiz = true)
extracted()
}
OrderStatusEnum.OrdersWithLine -> {
viewCallback?.setVisableByTrun(showBiz = true)
}
else -> {
viewCallback?.setVisableByTrun(showNorOrder = true)
}
}
}
private fun queryLineList() {
viewCallback?.setVisableByTrun(showLoading = true)
BusPassengerServiceManager.queryLineList(AbsMogoApplication.getApp(), object :
OchCommonServiceCallback<LineInfoListResponse> {
override fun onSuccess(data: LineInfoListResponse?) {
if (data?.data == null) return
viewCallback?.setVisableByTrun(showBiz = true)
viewCallback?.lineAdapterSetData(data.data, checkLine)
}
override fun onFail(code: Int, msg: String) {
ToastCharterUtils.showShort("查询线路失败")
viewCallback?.setVisableByTrun(showNetError = true)
}
override fun onError() {
super.onError()
viewCallback?.setVisableByTrun(showNetError = true)
}
})
}
fun changeSites(siteList: MutableList<SiteInfoResponse.SiteInfo>) {
if (!CallerTelematicManager.getClientConnStatus()) {
ToastCharterUtils.showLong("乘客屏无法连接司机屏请联系安全员")
return
}
val sentDataSite: MutableList<LineSite> = mutableListOf()
siteList.forEach {
sentDataSite.add(it.copy2Mas())
}
tempCheckSite?.let { siteInfo ->
val orderNo = CharterPassengerModel.getCurrentOrderInfo()?.orderNo ?: ""
val msg = ChangeDestMsg(
orderNo,
siteInfo.lineId!!.toInt(),
siteInfo.lineName!!,
currentSite!!.siteId!!.toInt(),
currentSite!!.siteName!!,
siteInfo.siteId!!.toInt(),
siteInfo.siteName!!,
false,
1,
0,
sentDataSite
)
CallerTelematicManager.sendMsgToServer(
OchCommonConst.BUSINESS_STRING,
GsonUtils.toJson(msg).toByteArray()
)
CallerLogger.d(SceneConstant.M_BUS_P + BaseDPMsg.TAG, "发送数据:切换站点${msg}")
}
viewCallback?.hideDataWaitDriverMsg()
// 启动查看和司机端链接
BizLoopManager.setLoopFunction(
BusPassengerFunctionOrderPresenter.TAGLINELOOP,
LoopInfo(3, ::checkServerStatus)
)
RxUtils.disposeSubscribe(subscribeSelectSite)
subscribeSelectSite = RxUtils.createSubscribe(120_000) {
ToastCharterUtils.showShort("请联系安全员确认")
viewCallback?.hideDataDriverRefuse()
}
}
private fun querySitesByLineId(checkLine: LineInfoResponse.LineInfo) {
BusPassengerServiceManager.queryLineSiteList(
AbsMogoApplication.getApp(),
checkLine.lineId.toString(),
object : OchCommonServiceCallback<SiteInfoResponse> {
override fun onSuccess(data: SiteInfoResponse?) {
if (data?.data == null) return
val siteInfos = data.data
EventBus.getDefault().post(EventLineSites(checkLine, siteInfos, false))
if (siteInfos.isNotEmpty()) {
// 计算当前站点是那个
val calculateCurrentSite =
CharterPassengerModel.calculateCurrentSite(siteInfos)
val first = calculateCurrentSite.first// 可用站点
if (first < 0) {
// 所有站点不可用
currentSite = siteInfos[siteInfos.size - 1]
currentSite!!.isNear = calculateCurrentSite.second
viewCallback?.siteAdapterEnableIndex(siteInfos.size - 1)
} else {
//
val index = if (first == 0) {
0
} else if (first <= siteInfos.size - 1) {
first - 1
} else {
siteInfos.size - 1
}
currentSite = siteInfos[index]
currentSite!!.isNear = calculateCurrentSite.second
viewCallback?.siteAdapterEnableIndex(index)
}
siteInfos.forEach {
if (it.siteId == checkSite?.siteId) {
it.isCheck = true
return@forEach
}
}
}
viewCallback?.siteAdapterSetData(siteInfos)
}
override fun onFail(code: Int, msg: String?) {
ToastCharterUtils.showShort("查询站点失败")
viewCallback?.setVisableByTrun(showNetError = true)
}
override fun onError() {
super.onError()
ToastCharterUtils.showShort("查询站点失败")
viewCallback?.setVisableByTrun(showNetError = true)
}
})
}
private fun checkServerStatus() {
if (!CallerTelematicManager.getClientConnStatus()) {
ToastCharterUtils.showShort("断开和司机端连接、请联系安全员")
BizLoopManager.removeLoopFunction(BusPassengerFunctionOrderPresenter.TAGLINELOOP)
viewCallback?.hideDataDriverRefuse()
CallerLogger.d(
SceneConstant.M_BUS_P + BusPassengerFunctionOrderPresenter.TAG,
"endAni666"
)
}
}
/**
* 重置数据
*/
fun resetData() {
tempCheckLine = null
tempCheckSite = null
if(checkLine==null){// 没有提交线路
queryLineList()
viewCallback?.setEnableSiteStatus(true)
}else{
checkLine?.let {
viewCallback?.setEnableSiteStatus(false)
viewCallback?.lineAdapterSubmit(it)
querySitesByLineId(it)
}
}
}
fun checkSiteClick(siteInfo: SiteInfoResponse.SiteInfo?) {
tempCheckSite = siteInfo
if(checkSite!=null){
checkSite?.let {
if (it.siteId == siteInfo?.siteId) {// 站点相同 隐藏所有提交按钮
viewCallback?.setEnableSiteStatus(false)
} else {
if(it.lineId == siteInfo?.lineId){// 线路相同显示单独提交
viewCallback?.setEnableSiteStatus(true)
}else{
if(siteInfo==null){//没有选站点隐藏所有提交
viewCallback?.setEnableSiteStatus(false)
}else {
viewCallback?.setEnableSiteStatus(true)
}
}
}
}
}else{
viewCallback?.setEnableSiteStatus(true)
}
}
fun canSwitchLine():Boolean {
val gnssSpeed =
CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().gnssSpeed
if (gnssSpeed < 0.5) {
when (CallerAutoPilotStatusListenerManager.getState()) {
IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE -> {// 不可自动驾驶
return true
}
IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE -> {//
return true
}
IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING -> {
// 自动驾驶中
return when (StopSideStatusManager.stopSiteStatus) {
StopSideStatusManager.Status.EndingSuccess -> {
true
}
else ->{
ToastCharterUtils.showShort("自动驾驶中无法切换线路")
false
}
}
}
IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING -> {
ToastCharterUtils.showShort("因车辆正在平行驾驶中无法切换线路")
return false
}
else -> {}
}
} else {
ToastCharterUtils.showShort("请停车后再修改目的地~")
return false
}
return true
}
interface SelectLineViewCallback {
fun hideDataWaitDriverMsg()
fun setVisableByTrun(
showBiz: Boolean = false,
showNetError: Boolean = false,
showNorOrder: Boolean = false,
showLoading: Boolean = false
)
fun hideDataDriverAgree()
fun setEnableSiteStatus(cancleAndSubmit: Boolean)
fun lineAdapterSubmit(lineInfo: LineInfoResponse.LineInfo)
fun hideDataDriverRefuse()
fun lineAdapterSetData(
lineInfo: List<LineInfoResponse.LineInfo>,
checkLine: LineInfoResponse.LineInfo?
)
fun siteAdapterEnableIndex(index: Int)
fun siteAdapterSetData(siteInfo: List<SiteInfoResponse.SiteInfo>)
}
}

View File

@@ -1,4 +1,4 @@
package com.mogo.och.bus.passenger.ui.adapter
package com.mogo.och.bus.passenger.ui.selectline.adapter
import android.content.Context
import android.view.LayoutInflater

View File

@@ -1,4 +1,4 @@
package com.mogo.och.bus.passenger.ui.adapter
package com.mogo.och.bus.passenger.ui.selectline.adapter
import android.content.Context
import android.view.LayoutInflater
@@ -11,7 +11,6 @@ import androidx.recyclerview.widget.RecyclerView
import com.mogo.och.bus.passenger.utils.ToastCharterUtils
import com.mogo.och.bus.passenger.R
import com.mogo.och.bus.passenger.bean.event.EventLineSites
import com.mogo.och.bus.passenger.bean.response.LineInfoResponse
import com.mogo.och.bus.passenger.bean.response.SiteInfoResponse
import org.greenrobot.eventbus.EventBus

View File

@@ -1,4 +1,4 @@
package com.mogo.och.bus.passenger.view;
package com.mogo.och.bus.passenger.ui.selectline.layoutmanage;
import android.graphics.Rect;
import android.view.View;

View File

@@ -1,4 +1,4 @@
package com.mogo.och.bus.passenger.view;
package com.mogo.och.bus.passenger.ui.selectline.layoutmanage;
import android.content.Context;
import android.util.DisplayMetrics;

View File

@@ -1,4 +1,4 @@
package com.mogo.och.bus.passenger.ui.dialogfragment.fragment
package com.mogo.och.bus.passenger.ui.softcontrol
import android.animation.ObjectAnimator
import android.animation.ValueAnimator
@@ -27,10 +27,10 @@ import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import com.mogo.och.bus.passenger.R
import com.mogo.och.bus.passenger.bean.Temperature
import com.mogo.och.bus.passenger.presenter.BusPassengerFunctionSoftPresenter
import com.mogo.och.bus.passenger.ui.adapter.TemperatureAdapter
import com.mogo.och.bus.passenger.ui.layoutmanage.PagerCenterSnapHelper
import com.mogo.och.bus.passenger.view.HorizontalDecoration
import com.mogo.och.bus.passenger.view.PickerLayoutManager
import com.mogo.och.bus.passenger.ui.softcontrol.adapter.TemperatureAdapter
import com.mogo.och.bus.passenger.ui.softcontrol.layoutmanage.PagerCenterSnapHelper
import com.mogo.och.bus.passenger.ui.softcontrol.layoutmanage.HorizontalDecoration
import com.mogo.och.bus.passenger.ui.selectline.layoutmanage.PickerLayoutManager
import com.mogo.och.common.module.utils.SoundPoolHelper
import com.mogo.och.common.module.wigets.MineGradientDrawable
import io.reactivex.Observable
@@ -239,11 +239,7 @@ class M1SoftFragment :
pickerLayoutManager.scaleDownDistance = 0.8f
val data = getData()
val adapter = TemperatureAdapter(
requireContext(),
data,
rv_aircondition_temperature
)
val adapter = TemperatureAdapter(requireContext(), data, rv_aircondition_temperature)
val snapHelper = PagerCenterSnapHelper()
snapHelper.attachToRecyclerView(rv_aircondition_temperature)
rv_aircondition_temperature.layoutManager = pickerLayoutManager

View File

@@ -0,0 +1,762 @@
package com.mogo.och.bus.passenger.ui.softcontrol
import android.animation.ObjectAnimator
import android.animation.ValueAnimator
import android.annotation.SuppressLint
import android.content.Context
import android.graphics.BitmapFactory
import android.graphics.drawable.ClipDrawable
import android.graphics.drawable.LayerDrawable
import android.media.AudioManager
import android.util.AttributeSet
import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.view.animation.LinearInterpolator
import android.widget.RadioButton
import android.widget.SeekBar
import android.widget.TextView
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.content.ContextCompat
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.findViewTreeViewModelStoreOwner
import com.mogo.eagle.core.utilcode.kotlin.onClick
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr
import com.mogo.eagle.core.utilcode.util.ClickUtils
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import com.mogo.och.bus.passenger.R
import com.mogo.och.bus.passenger.bean.Temperature
import com.mogo.och.bus.passenger.callback.IClearViewCallback
import com.mogo.och.bus.passenger.ui.selectline.layoutmanage.PickerLayoutManager
import com.mogo.och.bus.passenger.ui.softcontrol.adapter.TemperatureAdapter
import com.mogo.och.bus.passenger.ui.softcontrol.layoutmanage.HorizontalDecoration
import com.mogo.och.bus.passenger.ui.softcontrol.layoutmanage.PagerCenterSnapHelper
import com.mogo.och.bus.passenger.utils.ToastCharterUtils
import com.mogo.och.common.module.utils.RxUtils
import com.mogo.och.common.module.utils.SoundPoolHelper
import com.mogo.och.common.module.wigets.MineGradientDrawable
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import kotlinx.android.synthetic.main.m1_soft_fragment.view.dbv_wind
import kotlinx.android.synthetic.main.m1_soft_fragment.view.g_aircondition_setting
import kotlinx.android.synthetic.main.m1_soft_fragment.view.g_light_setting
import kotlinx.android.synthetic.main.m1_soft_fragment.view.g_voice_setting
import kotlinx.android.synthetic.main.m1_soft_fragment.view.iv_bottom_light_setting
import kotlinx.android.synthetic.main.m1_soft_fragment.view.iv_end_voice
import kotlinx.android.synthetic.main.m1_soft_fragment.view.iv_loading
import kotlinx.android.synthetic.main.m1_soft_fragment.view.iv_temperature_select
import kotlinx.android.synthetic.main.m1_soft_fragment.view.iv_top_light_setting
import kotlinx.android.synthetic.main.m1_soft_fragment.view.iv_voice
import kotlinx.android.synthetic.main.m1_soft_fragment.view.rb_pattern_automatic
import kotlinx.android.synthetic.main.m1_soft_fragment.view.rb_pattern_heating
import kotlinx.android.synthetic.main.m1_soft_fragment.view.rb_pattern_refrigeration
import kotlinx.android.synthetic.main.m1_soft_fragment.view.rb_pattern_ventilate
import kotlinx.android.synthetic.main.m1_soft_fragment.view.rb_wind_speed_high
import kotlinx.android.synthetic.main.m1_soft_fragment.view.rb_wind_speed_low
import kotlinx.android.synthetic.main.m1_soft_fragment.view.rb_wind_speed_middle
import kotlinx.android.synthetic.main.m1_soft_fragment.view.rg_select_function
import kotlinx.android.synthetic.main.m1_soft_fragment.view.rg_setting_pattern
import kotlinx.android.synthetic.main.m1_soft_fragment.view.rg_setting_windspeed
import kotlinx.android.synthetic.main.m1_soft_fragment.view.rv_aircondition_temperature
import kotlinx.android.synthetic.main.m1_soft_fragment.view.sb_voice_bar
import kotlinx.android.synthetic.main.m1_soft_fragment.view.tv_aircondition_switch
import kotlinx.android.synthetic.main.m1_soft_fragment.view.tv_current_voice_value
import kotlinx.android.synthetic.main.m1_soft_fragment.view.tv_light_atmosphere
import kotlinx.android.synthetic.main.m1_soft_fragment.view.tv_light_top_01
import kotlinx.android.synthetic.main.m1_soft_fragment.view.tv_light_top_02
import kotlinx.android.synthetic.main.m1_soft_fragment.view.tv_setting_aircondition
import kotlinx.android.synthetic.main.m1_soft_fragment.view.tv_temperature_title
import me.jessyan.autosize.utils.AutoSizeUtils
import java.util.concurrent.TimeUnit
class SoftControlView : ConstraintLayout, SoftControlViewModel.SoftControlCallback {
private val TAG = "OrderInfoView"
private var viewModel:SoftControlViewModel?=null
constructor(context: Context) : super(context)
constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet)
constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int) : super(
context,
attributeSet,
defStyleAttr
)
constructor(
context: Context,
attributeSet: AttributeSet,
defStyleAttr: Int,
defStyleRes: Int
) : super(context, attributeSet, defStyleAttr, defStyleRes)
var goneViewListener: IClearViewCallback?=null
private var currentTemperature: Temperature? = null
private var subscribeAir: Disposable? = null
private var subscribeLightTop1: Disposable? = null
private var subscribeLightTop2: Disposable? = null
private var subscribeAtmosphere: Disposable? = null
private var subscribeAnimator: Disposable? = null
private var animator1: ObjectAnimator? = null
private val loadingAni = ObjectAnimator.ofFloat(iv_loading, "rotation", 0f, 90f ,180f, 270f, 360f).apply {
repeatCount = -1
interpolator = LinearInterpolator()
duration = 1000
}
private fun initView() {
LayoutInflater.from(context).inflate(R.layout.m1_soft_fragment, this, true)
onClick {
setViewGone()
}
}
private fun setViewGone(){
goneViewListener?.goneAllView()
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
viewModel = findViewTreeViewModelStoreOwner()?.let {
ViewModelProvider(it).get(SoftControlViewModel::class.java)
}
rg_select_function.setOnCheckedChangeListener { _, checkedId ->
when (checkedId) {
R.id.tv_setting_aircondition -> {
g_light_setting.visibility = View.GONE
g_voice_setting.visibility = View.GONE
if(loadingAni.isRunning){
iv_loading.visibility = View.VISIBLE
g_aircondition_setting.visibility = View.GONE
}else{
g_aircondition_setting.visibility = View.VISIBLE
}
}
R.id.tv_setting_lighting -> {
g_light_setting.visibility = View.VISIBLE
g_voice_setting.visibility = View.GONE
g_aircondition_setting.visibility = View.GONE
iv_loading.visibility = View.GONE
}
R.id.tv_setting_voice -> {
g_voice_setting.visibility = View.VISIBLE
g_aircondition_setting.visibility = View.GONE
g_light_setting.visibility = View.GONE
iv_loading.visibility = View.GONE
}
else -> {}
}
if(rb_pattern_heating.isChecked){
iv_temperature_select.visibility = View.GONE
}
}
rg_select_function.check(R.id.tv_setting_aircondition)
setAirconditionListener(viewModel)
setAirConditionAni()
setLightListener(viewModel)
setVoiceInfo()
}
fun setWind(check: RadioButton, resource:Int){
check.isChecked = true
dbv_wind.setDrawableImage(BitmapFactory.decodeResource(resources,resource))
}
/**
* 关闭暖风机
*/
private fun closeHeater() {
CallerLogger.d(SceneConstant.M_BUS_P + M1SoftFragment.TAG, "关闭暖风")
heaterAirEnable(true)
viewModel?.closeHeader()
}
private fun heaterAirEnable(enable: Boolean) {
tv_temperature_title.isEnabled = enable
rv_aircondition_temperature.isEnabled = enable
val layoutManager = rv_aircondition_temperature.layoutManager
if (layoutManager is PickerLayoutManager) {
layoutManager.setHorizontallyScroll(enable)
}
val adapter = rv_aircondition_temperature.adapter as TemperatureAdapter
if(enable){
adapter.setEnable(true)
if(tv_setting_aircondition.isChecked) {
if(iv_loading.visibility==View.GONE){
iv_temperature_select.visibility = View.VISIBLE
}
}
rb_wind_speed_low.setTextColor(ContextCompat.getColorStateList(context,R.color.bus_p_function_airconditon_pattern_text_color_selector))
}else{
adapter.setEnable(false)
iv_temperature_select.visibility = View.GONE
rb_wind_speed_low.setTextColor(ContextCompat.getColor(context,R.color.bus_p_m1_6647576e))
}
}
/**
* 开启暖风机
*/
private fun openHeater() {
CallerLogger.d(SceneConstant.M_BUS_P + M1SoftFragment.TAG, "打开暖风")
heaterAirEnable(false)
closeAircondition()//关闭空调
val switch: Int
when (rg_setting_windspeed.checkedRadioButtonId) {
R.id.rb_wind_speed_low -> {
rb_wind_speed_middle.tag = M1SoftFragment.touchTag
rb_wind_speed_middle.toggle()
switch = 1
}
R.id.rb_wind_speed_middle -> {
switch = 1
}
R.id.rb_wind_speed_high -> {
switch = 2
}
else -> {
rb_wind_speed_middle.tag = M1SoftFragment.touchTag
rb_wind_speed_middle.toggle()
switch = 1
}
}
if (!tv_aircondition_switch.isChecked) {
return
}
viewModel?.openAndSetHeader(switch)
}
/**
* 关闭空调
*/
private fun closeAircondition() {
CallerLogger.d(SceneConstant.M_BUS_P + M1SoftFragment.TAG, "关闭空调")
var modeCmd = 0
var windSpeedCmd = 0
val temperatureCmd = currentTemperature?.value ?: 26
closeHeater()//关闭暖风
when (rg_setting_pattern.checkedRadioButtonId) {
R.id.rb_pattern_automatic -> modeCmd = 1 // 自动
R.id.rb_pattern_refrigeration -> modeCmd = 2 // 制冷
R.id.rb_pattern_ventilate -> modeCmd = 3 // 通风
else -> {}
}
when (rg_setting_windspeed.checkedRadioButtonId) {
R.id.rb_wind_speed_low -> windSpeedCmd = 1 // 1档
R.id.rb_wind_speed_middle -> windSpeedCmd = 2 // 2档
R.id.rb_wind_speed_high -> windSpeedCmd = 3 // 3档
else -> {}
}
viewModel?.closeAircondition(modeCmd, windSpeedCmd, temperatureCmd)
}
fun showAni(){
iv_loading.visibility = View.VISIBLE
loadingAni.target = iv_loading
loadingAni.start()
g_aircondition_setting.visibility = View.GONE
subscribeAnimator = Observable.timer(10000, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
loadingAni.cancel()
iv_loading.visibility = View.GONE
if(tv_setting_aircondition.isChecked){
g_aircondition_setting.visibility = View.VISIBLE
if(rb_pattern_heating.isChecked){
iv_temperature_select.visibility = View.GONE
}
}
}
}
/**
* 开启空调
*/
private fun openAircondition() {
CallerLogger.d(SceneConstant.M_BUS_P + M1SoftFragment.TAG, "打开空调")
var modeCmd = 0
var windSpeedCmd = 0
val temperatureCmd = currentTemperature?.value ?: 26
closeHeater()//关闭暖风
when (rg_setting_pattern.checkedRadioButtonId) {
R.id.rb_pattern_automatic -> modeCmd = 1 // 自动
R.id.rb_pattern_refrigeration -> modeCmd = 2 // 制冷
R.id.rb_pattern_ventilate -> modeCmd = 3 // 通风
else -> {}
}
when (rg_setting_windspeed.checkedRadioButtonId) {
R.id.rb_wind_speed_low -> windSpeedCmd = 1 // 1档
R.id.rb_wind_speed_middle -> windSpeedCmd = 2 // 2档
R.id.rb_wind_speed_high -> windSpeedCmd = 3 // 3档
else -> {}
}
if (!tv_aircondition_switch.isChecked) {
return
}
viewModel?.openAndSetAircondition(modeCmd, windSpeedCmd, temperatureCmd)
}
private fun setCheckAir(adapter: TemperatureAdapter, tag:Temperature){
adapter.setCheckIndex(tag.index)
currentTemperature = tag
if (rv_aircondition_temperature.tag == M1SoftFragment.touchTag) {
rv_aircondition_temperature.tag = null
return
} else {
SoundPoolHelper.getSoundPoolHelper()
.playSoundWithRedId(context, R.raw.bus_di)
}
openAircondition()
}
// region 灯
private fun setLightListener(viewModel: SoftControlViewModel?) {
tv_light_top_01.setOnCheckedChangeListener { buttonView, isChecked ->
if(!buttonView.isPressed){
return@setOnCheckedChangeListener
}
tv_light_top_01.isEnabled = false
subscribeLightTop1 = Observable.timer(2000, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
tv_light_top_01.isEnabled = true
}
SoundPoolHelper.getSoundPoolHelper().playSoundWithRedId(context, R.raw.bus_di)
viewModel?.setLightData1(isChecked)
setLightTop1View(isChecked,true)
setLightView(isChecked,tv_light_top_02.isChecked)
}
tv_light_top_02.setOnCheckedChangeListener { buttonView, isChecked ->
if(!buttonView.isPressed){
return@setOnCheckedChangeListener
}
tv_light_top_02.isEnabled = false
subscribeLightTop2 = Observable.timer(2000, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
tv_light_top_02.isEnabled = true
}
SoundPoolHelper.getSoundPoolHelper().playSoundWithRedId(context, R.raw.bus_di)
viewModel?.setLightData2(isChecked)
setLightTop2View(isChecked,true)
setLightView(tv_light_top_01.isChecked,isChecked)
}
tv_light_atmosphere.setOnCheckedChangeListener { buttonView, isChecked ->
if(!buttonView.isPressed){
return@setOnCheckedChangeListener
}
tv_light_atmosphere.isEnabled = false
subscribeAtmosphere = Observable.timer(2000, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
tv_light_atmosphere.isEnabled = true
}
SoundPoolHelper.getSoundPoolHelper().playSoundWithRedId(context, R.raw.bus_di)
viewModel?.setAtmosphereLightData2(isChecked)
setLightAtmosphereView(isChecked,true)
}
}
override fun setLightTop1View(leftLight: Boolean, isFirst: Boolean){
tv_light_top_01?.let {
if (leftLight) {
tv_light_top_01.text = context.getString(R.string.bus_p_m1_close_light1)
tv_light_top_01.isChecked = true
if(!isFirst) ToastCharterUtils.showShort("打开顶灯1")
} else {
tv_light_top_01.text = context.getString(R.string.bus_p_m1_open_light1)
tv_light_top_01.isChecked = false
if(!isFirst) ToastCharterUtils.showShort("关闭顶灯1")
}
}
}
override fun setLightTop2View(rightLight: Boolean, isFirst: Boolean){
tv_light_top_02?.let {
if (rightLight) {
tv_light_top_02.text = context.getString(R.string.bus_p_m1_close_light2)
tv_light_top_02.isChecked = true
if(!isFirst) ToastCharterUtils.showShort("打开顶灯2")
} else {
tv_light_top_02.text = context.getString(R.string.bus_p_m1_open_light2)
tv_light_top_02.isChecked = false
if(!isFirst) ToastCharterUtils.showShort("关闭顶灯2")
}
}
}
override fun setLightAtmosphereView(atmosphereLight: Boolean, isFirst: Boolean){
tv_light_atmosphere?.let {
if (atmosphereLight) {
tv_light_atmosphere.text = context.getString(R.string.bus_p_m1_close_atmosphere)
tv_light_atmosphere.isChecked = true
iv_bottom_light_setting.setImageResource(R.drawable.bus_p_function_atmosphere_select)
if(!isFirst) ToastCharterUtils.showShort("打开氛围灯")
} else {
tv_light_atmosphere.text = context.getString(R.string.bus_p_m1_open_atmosphere)
tv_light_atmosphere.isChecked = false
iv_bottom_light_setting.setImageResource(R.drawable.bus_p_function_atmosphere_nor)
if(!isFirst) ToastCharterUtils.showShort("关闭氛围灯")
}
}
}
/**
* 灯的UI发生变化
*/
override fun setLightView(leftLight: Boolean, rightLight: Boolean) {
iv_top_light_setting?.let {
if (leftLight && rightLight) {
iv_top_light_setting.setImageResource(R.drawable.bus_p_function_light_middle_selected)// 都打开
} else if (!leftLight && !rightLight) {
iv_top_light_setting.setImageResource(R.drawable.bus_p_function_light_nor)// 都关闭
} else {
if (leftLight) {
iv_top_light_setting.setImageResource(R.drawable.bus_p_function_light_select_left)// 左面开
}
if (rightLight) {
iv_top_light_setting.setImageResource(R.drawable.bus_p_function_light_select_right)// 左面开
}
}
}
}
// endregion
// region 声音
private var mAudioManager: AudioManager? = null
private var mMaxVolume: Int? = 100
@SuppressLint("NewApi")
private fun setVoiceInfo() {
val dp2px = AutoSizeUtils.dp2px(context, 26f)//进度条高度
val color2CBFFC = ContextCompat.getColor(context, R.color.bus_p_m1_2cbffc)
val color1060FF = ContextCompat.getColor(context, R.color.bus_p_m1_1060ff)
val color96A5C2 = ContextCompat.getColor(context, R.color.bus_p_m1_96a5c2)
val temp03 = MineGradientDrawable(color2CBFFC, color1060FF, dp2px)
val scaleDrawable3 = ClipDrawable(temp03, Gravity.START, ClipDrawable.HORIZONTAL)
val temp01 = MineGradientDrawable(color96A5C2, color96A5C2, dp2px)
val arr = arrayOf(temp01, scaleDrawable3)
val ld = LayerDrawable(arr)
ld.setDrawableByLayerId(android.R.id.background, temp01)
ld.setDrawableByLayerId(android.R.id.progress, scaleDrawable3)
sb_voice_bar.setProgressDrawableTiled(ld)
sb_voice_bar.max = 100
sb_voice_bar.min = 5
sb_voice_bar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
tv_current_voice_value.text = "$progress%"
if (fromUser) {
mMaxVolume?.let {
var currnetValue = ((progress.toFloat() / 100) * it).toInt()
if (currnetValue <= 0) {
currnetValue = 1
}
mAudioManager?.setStreamVolume(
AudioManager.STREAM_MUSIC,
currnetValue,
AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE
)
}
}
if (progress == 0) {
iv_voice.setImageResource(R.drawable.bus_p_function_voice_middle_select)
iv_end_voice.setImageResource(R.drawable.bus_p_function_voice_min)
} else {
iv_voice.setImageResource(R.drawable.bus_p_function_voice_middle_selected)
iv_end_voice.setImageResource(R.drawable.bus_p_function_voice_max)
}
}
override fun onStartTrackingTouch(seekBar: SeekBar?) {}
override fun onStopTrackingTouch(seekBar: SeekBar?) {}
})
context?.let {
mAudioManager = it.getSystemService(Context.AUDIO_SERVICE) as AudioManager
mMaxVolume = mAudioManager?.getStreamMaxVolume(AudioManager.STREAM_MUSIC)
val mCurrentVolume = mAudioManager?.getStreamVolume(AudioManager.STREAM_MUSIC)
mMaxVolume?.let { max ->
mCurrentVolume?.let { current ->
if (current == 1) {
sb_voice_bar.progress = 5
tv_current_voice_value.text = "5%"
} else {
val fl = current.toFloat() / max * 100
sb_voice_bar.progress = fl.toInt()
tv_current_voice_value.text = "${fl.toInt()}%"
}
}
}
}
}
// endregion
private fun setAirConditionAni() {
dbv_wind.post {
dbv_wind?.let {
val measuredHeight = it.measuredHeight
animator1 = ObjectAnimator.ofInt(it, "showHeight", 0, measuredHeight).apply {
duration = 1000
repeatCount = ValueAnimator.INFINITE
if(rg_setting_windspeed.checkedRadioButtonId!=0&&tv_aircondition_switch.isChecked){
start()
}
}
}
}
}
private fun setAirconditionListener(viewModel: SoftControlViewModel?) {
// 开关空调或暖风机
tv_aircondition_switch.setOnCheckedChangeListener { buttonView, isChecked ->
if(!buttonView.isPressed){
return@setOnCheckedChangeListener
}
SoundPoolHelper.getSoundPoolHelper().playSoundWithRedId(context, R.raw.bus_di)
if(isChecked){//打开
tv_aircondition_switch.setText("关闭空调")
if (rg_setting_pattern.checkedRadioButtonId == R.id.rb_pattern_heating) {
openHeater()// 打开暖风机
} else {
openAircondition()// 打开空调
}
showAni()
}else{// 关闭
tv_aircondition_switch.setText("打开空调")
closeHeater()// 关闭暖风机
closeAircondition()//关闭空调
}
}
// 模式调节
rg_setting_pattern.setOnCheckedChangeListener { group, checkedId ->
CallerLogger.d(SceneConstant.M_BUS_P + M1SoftFragment.TAG, "调节模式")
when (checkedId) {
R.id.rb_pattern_heating -> {
if(!rb_pattern_heating.isPressed){
return@setOnCheckedChangeListener
}
SoundPoolHelper.getSoundPoolHelper().playSoundWithRedId(context, R.raw.bus_di)
openHeater()
}
R.id.rb_pattern_automatic->{
if(!rb_pattern_automatic.isPressed){
return@setOnCheckedChangeListener
}
SoundPoolHelper.getSoundPoolHelper().playSoundWithRedId(context, R.raw.bus_di)
openAircondition()
}
R.id.rb_pattern_refrigeration->{
if(!rb_pattern_refrigeration.isPressed){
return@setOnCheckedChangeListener
}
SoundPoolHelper.getSoundPoolHelper().playSoundWithRedId(context, R.raw.bus_di)
openAircondition()
}
R.id.rb_pattern_ventilate->{
if(!rb_pattern_ventilate.isPressed){
return@setOnCheckedChangeListener
}
SoundPoolHelper.getSoundPoolHelper().playSoundWithRedId(context, R.raw.bus_di)
openAircondition()
}
else -> {
openAircondition()
}
}
if(tv_aircondition_switch.isChecked) {
showAni()
}
}
// 风速调节
rg_setting_windspeed.setOnCheckedChangeListener { group, checkedId ->
when (checkedId) {
R.id.rb_wind_speed_low-> {
if(!rb_wind_speed_low.isPressed){
return@setOnCheckedChangeListener
}
}
R.id.rb_wind_speed_middle-> {
if(!rb_wind_speed_middle.isPressed){
return@setOnCheckedChangeListener
}
}
R.id.rb_wind_speed_high-> {
if(!rb_wind_speed_high.isPressed){
return@setOnCheckedChangeListener
}
}
else -> {}
}
SoundPoolHelper.getSoundPoolHelper().playSoundWithRedId(context, R.raw.bus_di)
if (rg_setting_pattern.checkedRadioButtonId == R.id.rb_pattern_heating) {//暖风机
openHeater()
} else {
openAircondition()
}
}
val pickerLayoutManager =
PickerLayoutManager(
context,
PickerLayoutManager.HORIZONTAL,
false
)
pickerLayoutManager.isChangeAlpha = true
pickerLayoutManager.scaleDownBy = 0.29f
pickerLayoutManager.scaleDownDistance = 0.8f
val data = getData()
val adapter = TemperatureAdapter(context, data, rv_aircondition_temperature)
val snapHelper = PagerCenterSnapHelper()
snapHelper.attachToRecyclerView(rv_aircondition_temperature)
rv_aircondition_temperature.layoutManager = pickerLayoutManager
rv_aircondition_temperature.adapter = adapter
HorizontalDecoration.distance = SharedPrefsMgr.getInstance(context).getInt(
HorizontalDecoration.distancekey,0)
val space = AutoSizeUtils.dp2px(context, 15f)
rv_aircondition_temperature.addItemDecoration(
HorizontalDecoration(
space,
data.size - 1
)
)
pickerLayoutManager.setOnScrollStopListener { view ->
if (view is TextView) {
// 未拖到中点、自动滚动到中点会短时间触发两次
val tag = view.tag
if (tag is Temperature) {
RxUtils.disposeSubscribe(subscribeAir)
if(tag.index==0||tag.index==adapter.data.size-1){
subscribeAir = Observable.timer(200, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
setCheckAir(adapter,tag)
}
}else {
if (ClickUtils.isClickTooFrequent(rv_aircondition_temperature)) {
return@setOnScrollStopListener
}
setCheckAir(adapter,tag)
}
}
}
}
if(HorizontalDecoration.distance!=0){
rv_aircondition_temperature.scrollToPosition(data.size-1)
adapter.setCheckIndex(data.size-1)
}
}
fun getData(): MutableList<Temperature> {
val mutableListOf = mutableListOf<Temperature>()
mutableListOf.add(Temperature(0, 16, "16°"))
mutableListOf.add(Temperature(1, 17, "17°"))
mutableListOf.add(Temperature(2, 18, "18°"))
mutableListOf.add(Temperature(3, 19, "19°"))
mutableListOf.add(Temperature(4, 20, "20°"))
mutableListOf.add(Temperature(5, 21, "21°"))
mutableListOf.add(Temperature(6, 22, "22°"))
mutableListOf.add(Temperature(7, 23, "23°"))
mutableListOf.add(Temperature(8, 24, "24°"))
mutableListOf.add(Temperature(9, 25, "25°"))
mutableListOf.add(Temperature(10, 26, "26°"))
return mutableListOf
}
init {
try {
initView()
} catch (e: Exception) {
e.printStackTrace()
}
}
/**
* 根据车的状态会写页面状态
*/
override fun setAirconditionHeaterView(
airIsOpen: Boolean,
heaterIsOpen: Boolean,
temperatureCmd: Int,
pattern: Int,
windSpeed: Int
) {
tv_aircondition_switch?.let {
if (!airIsOpen && !heaterIsOpen) {
tv_aircondition_switch.text = "打开空调"
tv_aircondition_switch.isChecked = false
dbv_wind.visibility = View.GONE
} else {
tv_aircondition_switch.text = "关闭空调"
tv_aircondition_switch.isChecked = true
dbv_wind.visibility = View.VISIBLE
}
if (airIsOpen) {
val adapter = rv_aircondition_temperature.adapter
if (adapter is TemperatureAdapter) {
adapter.data.forEach {
if (it.value == temperatureCmd) {
rv_aircondition_temperature.tag = M1SoftFragment.touchTag
UiThreadHandler.postDelayed({
rv_aircondition_temperature?.smoothScrollToPosition(it.index)
},500)
}
}
}
when (pattern) {//1: 自动模式, 2: 制冷模式, 3: 通风模式(仅送风,无温度)
1 -> {rb_pattern_automatic.isChecked = true}
2 -> {rb_pattern_refrigeration.isChecked = true}
3 -> {rb_pattern_ventilate.isChecked = true}
else -> {}
}
heaterAirEnable(true)
when (windSpeed) {//1: 1档2: 2档3:3档
1 -> {
setWind(rb_wind_speed_low,R.drawable.bus_pm1_aircondition_wind_low)
}
2 -> {
setWind(rb_wind_speed_middle,R.drawable.bus_pm1_aircondition_wind_middle)
}
3 -> {
setWind(rb_wind_speed_high,R.drawable.bus_pm1_aircondition_wind_high)
}
else -> {}
}
}
if (heaterIsOpen) {
rb_pattern_heating.isChecked = true
heaterAirEnable(false)
when (windSpeed) {//1: 1档2: 2档
1 -> {
setWind(rb_wind_speed_middle,R.drawable.bus_pm1_warm_wind_middle)
}
2 -> {
setWind(rb_wind_speed_high,R.drawable.bus_pm1_warm_wind_high)
}
else -> {}
}
}
}
}
}

View File

@@ -0,0 +1,270 @@
package com.mogo.och.bus.passenger.ui.softcontrol
import androidx.lifecycle.ViewModel
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS_P
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import com.mogo.och.bus.passenger.utils.ToastCharterUtils
import com.mogo.och.common.module.manager.devicemanage.LightAirconditionDoorCallback
import com.mogo.och.common.module.manager.devicemanage.LightAirconditionDoorStatusManager
import com.mogo.och.common.module.manager.devicemanage.data.AirconditionStatus
import com.mogo.och.common.module.manager.devicemanage.data.HeaterStatue
import com.mogo.och.common.module.manager.devicemanage.data.LightStatus
import com.mogo.och.common.module.utils.RxUtils
import io.reactivex.disposables.Disposable
class SoftControlViewModel: ViewModel(), LightAirconditionDoorCallback {
private val TAG = SoftControlViewModel::class.java.simpleName
private var viewCallback:SoftControlCallback?=null
private var subscribeLightTop1: Disposable?=null
private var subscribeLightTop2: Disposable?=null
private var subscribeLightAtmosphere: Disposable?=null
private var airconditionDisposable: Disposable?=null
private var heaterDisposable: Disposable?=null
init {
}
override fun onCleared() {
super.onCleared()
this.viewCallback = null
LightAirconditionDoorStatusManager.removeListener(TAG)
}
fun setViewCallback(viewCallback:SoftControlCallback){
this.viewCallback = viewCallback
LightAirconditionDoorStatusManager.addListener(TAG, this)
}
/**
* 空调状态变化
*/
override fun onAirconditionStatusCallback(heaterIsOpen: Boolean, airconditionStatus: AirconditionStatus, isFirst: Boolean) {
CallerLogger.d(M_BUS_P + TAG,
"回写--空调开关:${LightAirconditionDoorStatusManager.airconditionStatus.isOpen}" +
"空调温度:${LightAirconditionDoorStatusManager.airconditionStatus.temperature}" +
"空调模式:${LightAirconditionDoorStatusManager.airconditionStatus.pattert}" +
"空调风速:${LightAirconditionDoorStatusManager.airconditionStatus.windSpeed}")
UiThreadHandler.post {
if(airconditionStatus.isOpen){
viewCallback?.setAirconditionHeaterView(
airconditionStatus.isOpen,
heaterIsOpen,
airconditionStatus.temperature,
airconditionStatus.pattert,
airconditionStatus.windSpeed
)
}else{
viewCallback?.setAirconditionHeaterView(
airconditionStatus.isOpen,
heaterIsOpen,
airconditionStatus.temperature,
0,
0
)
}
}
}
/**
* 暖风机状态变化
*/
override fun onHeaterStatusCallback(airconditionIsOpen:Boolean, heaterStatue: HeaterStatue, isFirst: Boolean) {
CallerLogger.d(M_BUS_P + TAG,
"回写--暖风机开关:${heaterStatue.isOpen}" +
"风速:${heaterStatue.windSpeed}")
UiThreadHandler.post {
if(heaterStatue.isOpen) {
viewCallback?.setAirconditionHeaterView(
airconditionIsOpen,
heaterStatue.isOpen,
0,
0,
heaterStatue.windSpeed
)
}else{
viewCallback?.setAirconditionHeaterView(
airconditionIsOpen,
heaterStatue.isOpen,
0,
0,
0
)
}
}
}
/**
* 灯状态变化
*/
override fun onLightTop1Callback(lightStatus: LightStatus, isFirst: Boolean) {
CallerLogger.d(M_BUS_P + TAG,
"回写--顶灯1开关:${lightStatus.isOpenLight1}" +
"顶灯2开关:${lightStatus.isOpenLight2}" +
"氛围灯开关:${lightStatus.isOpenatmosphere}")
UiThreadHandler.post {
viewCallback?.setLightTop1View(lightStatus.isOpenLight1,isFirst)
}
}
/**
* 灯状态变化
*/
override fun onLightTop2Callback(lightStatus: LightStatus, isFirst: Boolean) {
CallerLogger.d(M_BUS_P + TAG,
"回写--顶灯1开关:${lightStatus.isOpenLight1}" +
"顶灯2开关:${lightStatus.isOpenLight2}" +
"氛围灯开关:${lightStatus.isOpenatmosphere}")
UiThreadHandler.post {
viewCallback?.setLightTop2View(lightStatus.isOpenLight2,isFirst)
viewCallback?.setLightView(lightStatus.isOpenLight1,lightStatus.isOpenLight2)
}
}
/**
* 灯状态变化
*/
override fun onLightAtmosphereCallback(lightStatus: LightStatus, isFirst: Boolean) {
CallerLogger.d(M_BUS_P + TAG,
"回写--顶灯1开关:${lightStatus.isOpenLight1}" +
"顶灯2开关:${lightStatus.isOpenLight2}" +
"氛围灯开关:${lightStatus.isOpenatmosphere}")
UiThreadHandler.post {
viewCallback?.setLightAtmosphereView(lightStatus.isOpenatmosphere,isFirst)
}
}
/**
* 设置空调
*/
fun openAndSetAircondition(modeCmd: Int, windSpeedCmd: Int, temperatureCmd: Int) {
CallerLogger.d(M_BUS_P + TAG, "" +
"打开空调,模式$modeCmd--档位${windSpeedCmd}--温度:$temperatureCmd")
CallerAutoPilotControlManager.sendRoboBusJinlvM1AirConditionerCmd(1,modeCmd,windSpeedCmd,temperatureCmd)
RxUtils.disposeSubscribe(airconditionDisposable)
airconditionDisposable = RxUtils.createSubscribe(10000){
if (!LightAirconditionDoorStatusManager.airconditionStatus.isOpen&&
LightAirconditionDoorStatusManager.airconditionStatus.windSpeed!=windSpeedCmd&&
LightAirconditionDoorStatusManager.airconditionStatus.temperature!=temperatureCmd&&
LightAirconditionDoorStatusManager.airconditionStatus.pattert!=modeCmd) {
ToastCharterUtils.showShort("控制系统繁忙,请稍后再试")
}
}
}
fun closeAircondition(modeCmd: Int, windSpeedCmd: Int, temperatureCmd: Int) {
CallerLogger.d(M_BUS_P + TAG, "关闭空调")
CallerAutoPilotControlManager.sendRoboBusJinlvM1AirConditionerCmd(2,modeCmd,windSpeedCmd,temperatureCmd)
RxUtils.disposeSubscribe(airconditionDisposable)
airconditionDisposable = RxUtils.createSubscribe(10000){
if (LightAirconditionDoorStatusManager.airconditionStatus.isOpen) {
ToastCharterUtils.showShort("控制系统繁忙,请稍后再试")
}
}
}
/**
* 设置暖风
*/
fun openAndSetHeader(windSpeedCmd: Int) {
CallerLogger.d(M_BUS_P + TAG, "打开暖风机、档位${windSpeedCmd}")
CallerAutoPilotControlManager.sendRoboBusJinlvM1HeaderCmd(1,windSpeedCmd)
RxUtils.disposeSubscribe(heaterDisposable)
heaterDisposable = RxUtils.createSubscribe(10000){
if (!LightAirconditionDoorStatusManager.heaterStatue.isOpen&&
LightAirconditionDoorStatusManager.heaterStatue.windSpeed!=windSpeedCmd) {
ToastCharterUtils.showShort("暖风机操作未生效,请稍后重试吧~")
}
}
}
fun closeHeader(){
CallerLogger.d(M_BUS_P + TAG, "关闭暖风机")
CallerAutoPilotControlManager.sendRoboBusJinlvM1HeaderCmd(2,0)
RxUtils.disposeSubscribe(heaterDisposable)
heaterDisposable = RxUtils.createSubscribe(10000){
if (LightAirconditionDoorStatusManager.heaterStatue.isOpen) {
ToastCharterUtils.showShort("暖风机操作未生效,请稍后重试吧~")//还是开着的
}
}
}
fun setLightData1(leftLight: Boolean){
CallerLogger.d(M_BUS_P + TAG, "顶灯2:$leftLight")
RxUtils.disposeSubscribe(subscribeLightTop1)
subscribeLightTop1 = if(leftLight){
CallerAutoPilotControlManager.sendRoboBusJinlvM1MainLamp1Cmd(1)
RxUtils.createSubscribe{
if (!LightAirconditionDoorStatusManager.lightStatus.isOpenLight1) {
ToastCharterUtils.showShort("控制系统繁忙,请稍后再试")
}
}
}else{
CallerAutoPilotControlManager.sendRoboBusJinlvM1MainLamp1Cmd(2)
RxUtils.createSubscribe{
if (LightAirconditionDoorStatusManager.lightStatus.isOpenLight1) {
ToastCharterUtils.showShort("控制系统繁忙,请稍后再试")
}
}
}
}
fun setLightData2(rightLight: Boolean){
CallerLogger.d(M_BUS_P + TAG, "顶灯1:$rightLight")
RxUtils.disposeSubscribe(subscribeLightTop2)
subscribeLightTop2 = if(rightLight){
CallerAutoPilotControlManager.sendRoboBusJinlvM1MainLamp2Cmd(1)
RxUtils.createSubscribe{
if (!LightAirconditionDoorStatusManager.lightStatus.isOpenLight2) {
ToastCharterUtils.showShort("控制系统繁忙,请稍后再试")
}
}
}else{
CallerAutoPilotControlManager.sendRoboBusJinlvM1MainLamp2Cmd(2)
RxUtils.createSubscribe{
if (LightAirconditionDoorStatusManager.lightStatus.isOpenLight2) {
ToastCharterUtils.showShort("控制系统繁忙,请稍后再试")
}
}
}
}
fun setAtmosphereLightData2(atmosphereLight: Boolean){
CallerLogger.d(M_BUS_P + TAG, "氛围灯:$atmosphereLight")
RxUtils.disposeSubscribe(subscribeLightAtmosphere)
subscribeLightAtmosphere = if (atmosphereLight) {
CallerAutoPilotControlManager.sendRoboBusJinlvM1SmallLampCmd(1)
RxUtils.createSubscribe{
if (!LightAirconditionDoorStatusManager.lightStatus.isOpenatmosphere) {
ToastCharterUtils.showShort("控制系统繁忙,请稍后再试")
}
}
} else {
CallerAutoPilotControlManager.sendRoboBusJinlvM1SmallLampCmd(2)
RxUtils.createSubscribe{
if (LightAirconditionDoorStatusManager.lightStatus.isOpenatmosphere) {
ToastCharterUtils.showShort("控制系统繁忙,请稍后再试")
}
}
}
}
interface SoftControlCallback{
/**
* 根据车的状态会写页面状态
*/
fun setAirconditionHeaterView(
airIsOpen: Boolean,
heaterIsOpen: Boolean,
temperatureCmd: Int,
pattern: Int,
windSpeed: Int
)
fun setLightTop1View(leftLight: Boolean, isFirst: Boolean)
fun setLightTop2View(rightLight: Boolean, isFirst: Boolean)
fun setLightView(leftLight: Boolean, rightLight: Boolean)
fun setLightAtmosphereView(atmosphereLight: Boolean, isFirst: Boolean)
}
}

View File

@@ -1,4 +1,4 @@
package com.mogo.och.bus.passenger.ui.adapter;
package com.mogo.och.bus.passenger.ui.softcontrol.adapter;
import android.content.Context;
import android.graphics.Color;

View File

@@ -1,4 +1,4 @@
package com.mogo.och.bus.passenger.ui.layoutmanage;
package com.mogo.och.bus.passenger.ui.softcontrol.layoutmanage;
import android.graphics.PointF;
import android.os.Build;

View File

@@ -1,4 +1,4 @@
package com.mogo.och.bus.passenger.ui.layoutmanage;
package com.mogo.och.bus.passenger.ui.softcontrol.layoutmanage;
import android.view.View;

View File

@@ -1,4 +1,4 @@
package com.mogo.och.bus.passenger.ui.layoutmanage;
package com.mogo.och.bus.passenger.ui.softcontrol.layoutmanage;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

View File

@@ -1,4 +1,4 @@
package com.mogo.och.bus.passenger.view;
package com.mogo.och.bus.passenger.ui.softcontrol.layoutmanage;
import android.graphics.Rect;
import android.view.View;
@@ -8,7 +8,7 @@ import androidx.recyclerview.widget.RecyclerView;
import com.mogo.commons.AbsMogoApplication;
import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr;
import com.mogo.och.bus.passenger.ui.adapter.TemperatureAdapter;
import com.mogo.och.bus.passenger.ui.softcontrol.adapter.TemperatureAdapter;
public class HorizontalDecoration extends RecyclerView.ItemDecoration {
private int space = 0;

View File

@@ -1,4 +1,4 @@
package com.mogo.och.bus.passenger.ui.layoutmanage;
package com.mogo.och.bus.passenger.ui.softcontrol.layoutmanage;
public class ItemTransformation {

View File

@@ -1,4 +1,4 @@
package com.mogo.och.bus.passenger.ui.layoutmanage
package com.mogo.och.bus.passenger.ui.softcontrol.layoutmanage
import android.view.View
import androidx.recyclerview.widget.OrientationHelper

View File

@@ -1,4 +1,4 @@
package com.mogo.och.bus.passenger.view
package com.mogo.och.bus.passenger.ui.softcontrol.view
import android.content.Context
import android.graphics.Bitmap

View File

@@ -1,4 +1,4 @@
package com.mogo.och.bus.passenger.view;
package com.mogo.och.bus.passenger.ui.softcontrol.view;
import android.content.Context;
import android.graphics.Bitmap;
@@ -18,27 +18,15 @@ import java.lang.ref.WeakReference;
public class DrawableCheckBox extends androidx.appcompat.widget.AppCompatCheckBox {
public DrawableCheckBox(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}
public DrawableCheckBox(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
public DrawableCheckBox(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
@Override
@@ -59,11 +47,8 @@ public class DrawableCheckBox extends androidx.appcompat.widget.AppCompatCheckBo
int y = getWidth();
canvas.translate((getWidth() - bodyWidth) / 2, 0);
}
}
super.onDraw(canvas);
}

View File

@@ -1,4 +1,4 @@
package com.mogo.och.bus.passenger.view.statusbar
package com.mogo.och.bus.passenger.ui.statusbar
import android.content.Context
import android.util.AttributeSet

View File

@@ -1,4 +1,4 @@
package com.mogo.och.bus.passenger.view.statusbar
package com.mogo.och.bus.passenger.ui.statusbar
import android.annotation.SuppressLint
import android.content.Context
@@ -23,7 +23,8 @@ import com.mogo.eagle.core.function.hmi.ui.widget.DemoModeView
import com.mogo.eagle.core.utilcode.util.ClickUtils
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import com.mogo.och.bus.passenger.R
import com.mogo.och.bus.passenger.bean.event.DebugView
import com.mogo.och.bus.passenger.ui.debugview.DebugEvent
import com.mogo.och.bus.passenger.ui.debugview.DebugView
import kotlinx.android.synthetic.main.m1_statusview_datetime.view.*
import me.jessyan.autosize.utils.AutoSizeUtils
import org.greenrobot.eventbus.EventBus
@@ -52,7 +53,7 @@ class StatusBarView @JvmOverloads constructor(
mHits[mHits.size - 1] = SystemClock.uptimeMillis()
if (mHits[0] >= (SystemClock.uptimeMillis() - DURATION)) {
mHits = LongArray(COUNTS) //重新初始化数组
EventBus.getDefault().post(DebugView(type))
EventBus.getDefault().post(DebugEvent(type))
}
}

View File

@@ -1,4 +1,4 @@
package com.mogo.och.bus.passenger.view
package com.mogo.och.bus.passenger.ui.toast
import android.content.Context
import android.util.AttributeSet

View File

@@ -1,4 +1,4 @@
package com.mogo.och.bus.passenger.view
package com.mogo.och.bus.passenger.ui.video
import android.app.Activity
import android.content.Context
@@ -47,8 +47,8 @@ class ConsultVideoPlayer : StandardGSYVideoPlayer {
private lateinit var layoutBottom: ConstraintLayout
private lateinit var vPpenLeft: View
private var fullVideoPlayer:ConsultVideoPlayer?=null
var smalllPlayer:ConsultVideoPlayer?=null
private var fullVideoPlayer: ConsultVideoPlayer?=null
var smalllPlayer: ConsultVideoPlayer?=null
private var currentTime = 0
@@ -457,7 +457,7 @@ class ConsultVideoPlayer : StandardGSYVideoPlayer {
return Math.ceil((25 * context.resources.displayMetrics.density).toDouble()).toInt()
}
fun clearFullscreenLayout(gsyVideoPlayer:ConsultVideoPlayer) {
fun clearFullscreenLayout(gsyVideoPlayer: ConsultVideoPlayer) {
mIfCurrentIsFullscreen = false
val delay = 100
gsyVideoPlayer.smalllPlayer = null

View File

@@ -1,4 +1,4 @@
package com.mogo.och.bus.passenger.ui.dialogfragment.fragment
package com.mogo.och.bus.passenger.ui.video
import android.os.Bundle
import android.view.View
@@ -7,11 +7,10 @@ import com.mogo.commons.mvp.MvpFragment
import com.mogo.och.bus.passenger.R
import com.mogo.och.bus.passenger.bean.TaxiPassengerVideoPlay
import com.mogo.och.bus.passenger.presenter.BusPassengerFunctionVideoPresenter
import com.mogo.och.bus.passenger.ui.adapter.RecyclerVideoAdapter
import com.mogo.och.bus.passenger.ui.layoutmanage.CarouselLayoutManager
import com.mogo.och.bus.passenger.ui.layoutmanage.CarouselZoomPostLayoutListener
import com.mogo.och.bus.passenger.ui.layoutmanage.CenterScrollListener
import com.mogo.och.bus.passenger.view.ConsultVideoPlayer
import com.mogo.och.bus.passenger.ui.video.adapter.RecyclerVideoAdapter
import com.mogo.och.bus.passenger.ui.softcontrol.layoutmanage.CarouselLayoutManager
import com.mogo.och.bus.passenger.ui.softcontrol.layoutmanage.CarouselZoomPostLayoutListener
import com.mogo.och.bus.passenger.ui.softcontrol.layoutmanage.CenterScrollListener
import com.shuyu.gsyvideoplayer.video.base.GSYVideoView
import kotlinx.android.synthetic.main.m1_video_fragment.*
import kotlin.math.floor
@@ -67,7 +66,7 @@ class M1VideoFragment :
}
override fun pageStop() {
val (_: kotlin.Int, player) = getPlayer(carouselLayoutManager)
val (_, player) = getPlayer(carouselLayoutManager)
if (player is ConsultVideoPlayer) {
player.onVideoPause()
}
@@ -92,7 +91,7 @@ class M1VideoFragment :
rvVideoPlaylist
)
recyclerVideoAdapter.setOnThumbImageClilckListener {
val (_: kotlin.Int, player) = getPlayer(carouselLayoutManager)
val (_, player) = getPlayer(carouselLayoutManager)
if (player is ConsultVideoPlayer) {
player.onVideoReset()
player.thumbImageViewLayout.visibility = View.VISIBLE

View File

@@ -1,4 +1,4 @@
package com.mogo.och.bus.passenger.ui.adapter;
package com.mogo.och.bus.passenger.ui.video.adapter;
import android.content.Context;
import android.view.View;
@@ -6,7 +6,7 @@ import android.view.View;
import androidx.recyclerview.widget.RecyclerView;
import com.mogo.och.bus.passenger.R;
import com.mogo.och.bus.passenger.view.ConsultVideoPlayer;
import com.mogo.och.bus.passenger.ui.video.ConsultVideoPlayer;
import com.shuyu.gsyvideoplayer.builder.GSYVideoOptionBuilder;
public class RecyclerItemVideoHolder extends RecyclerView.ViewHolder {

View File

@@ -1,4 +1,4 @@
package com.mogo.och.bus.passenger.ui.adapter;
package com.mogo.och.bus.passenger.ui.video.adapter;
import android.content.Context;
import android.view.LayoutInflater;

View File

@@ -1,18 +0,0 @@
package com.mogo.och.bus.passenger.ui.view
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import androidx.constraintlayout.widget.ConstraintLayout
import com.mogo.eagle.core.function.hmi.ui.widget.BlueToothView
import com.mogo.och.bus.passenger.R
class EndOrderView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr) {
init {
LayoutInflater.from(context).inflate(R.layout.m1_order_end, this, true)
}
}

View File

@@ -2,10 +2,9 @@ package com.mogo.och.bus.passenger.utils
import android.annotation.SuppressLint
import android.app.Activity
import android.content.Context
import android.view.View
import android.view.WindowManager
import com.mogo.och.bus.passenger.view.ConsultVideoPlayer
import com.mogo.och.bus.passenger.ui.video.ConsultVideoPlayer
import com.shuyu.gsyvideoplayer.GSYVideoManager
import java.lang.Exception

View File

@@ -3,7 +3,7 @@ package com.mogo.och.bus.passenger.utils
import android.view.View
import com.mogo.eagle.core.utilcode.util.ActivityUtils
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.och.bus.passenger.view.ToastCharterView
import com.mogo.och.bus.passenger.ui.toast.ToastCharterView
import me.jessyan.autosize.utils.AutoSizeUtils
object ToastCharterUtils {

View File

@@ -1,70 +0,0 @@
package com.mogo.och.bus.passenger.view;
import android.graphics.Canvas;
import android.graphics.Path;
import android.graphics.RectF;
import android.graphics.Region;
import android.os.Build;
import android.view.ViewTreeObserver;
import androidx.recyclerview.widget.RecyclerView;
/**
* 为RecyclerView设置圆角
*/
public class RecyclerViewCornerRadius extends RecyclerView.ItemDecoration {
public static final String TAG = "RecyclerViewCornerRadius";
private RectF rectF;
private Path path;
private int topLeftRadius = 0;
private int topRightRadius = 0;
private int bottomLeftRadius = 0;
private int bottomRightRadius = 0;
public RecyclerViewCornerRadius(final RecyclerView recyclerView) {
recyclerView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
rectF = new RectF(0, 0, recyclerView.getMeasuredWidth(), recyclerView.getMeasuredHeight());
path = new Path();
path.reset();
path.addRoundRect(rectF, new float[]{
topLeftRadius, topLeftRadius,
topRightRadius, topRightRadius,
bottomLeftRadius, bottomLeftRadius,
bottomRightRadius, bottomRightRadius
}, Path.Direction.CCW);
recyclerView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
});
}
public void setCornerRadius(int radius) {
this.topLeftRadius = radius;
this.topRightRadius = radius;
this.bottomLeftRadius = radius;
this.bottomRightRadius = radius;
}
public void setCornerRadius(int topLeftRadius, int topRightRadius, int bottomLeftRadius, int bottomRightRadius) {
this.topLeftRadius = topLeftRadius;
this.topRightRadius = topRightRadius;
this.bottomLeftRadius = bottomLeftRadius;
this.bottomRightRadius = bottomRightRadius;
}
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
c.clipRect(rectF);
if (Build.VERSION.SDK_INT >= 28) {
c.clipPath(path);
} else {
c.clipPath(path, Region.Op.REPLACE);
}
}
}

View File

@@ -8,7 +8,7 @@
tools:ignore="MissingDefaultResource">
<com.mogo.och.bus.passenger.ui.view.bottom.impl.GoViewWithArrive
<com.mogo.och.bus.passenger.ui.bottom.impl.GoViewWithArrive
android:id="@+id/aciv_center_image"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
@@ -26,7 +26,7 @@
android:layout_height="@dimen/dp_107"/>
<com.mogo.och.bus.passenger.ui.view.bottom.impl.StopSiteView
<com.mogo.och.bus.passenger.ui.bottom.impl.StopSiteView
android:id="@+id/actv_stop_site"
app:backageViewId="@+id/actv_stop_site_press"
app:selectedDrawable="@drawable/charter_p_bottom_stopsite_press"
@@ -48,7 +48,7 @@
android:layout_width="@dimen/dp_359"
android:layout_height="@dimen/dp_107"/>
<com.mogo.och.bus.passenger.ui.view.bottom.impl.CloseDoorView
<com.mogo.och.bus.passenger.ui.bottom.impl.CloseDoorView
android:id="@+id/actv_close_door"
app:backageViewId="@+id/actv_close_door_press"
app:selectedDrawable="@drawable/charter_p_bottom_closedoor_press"
@@ -70,7 +70,7 @@
android:layout_width="@dimen/dp_359"
android:layout_height="@dimen/dp_107"/>
<com.mogo.och.bus.passenger.ui.view.bottom.impl.OpenDoorView
<com.mogo.och.bus.passenger.ui.bottom.impl.OpenDoorView
android:id="@+id/actv_open_door"
android:gravity="center"
app:backageViewId="@+id/actv_open_door_press"
@@ -93,7 +93,7 @@
android:layout_width="@dimen/dp_359"
android:layout_height="@dimen/dp_107"/>
<com.mogo.och.bus.passenger.ui.view.bottom.BottomOrderInfoView
<com.mogo.och.bus.passenger.ui.bottom.BottomOrderInfoView
android:id="@+id/cl_order_time"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@+id/actv_setting"
@@ -112,7 +112,7 @@
android:layout_width="@dimen/dp_359"
android:layout_height="@dimen/dp_107"/>
<com.mogo.och.bus.passenger.ui.view.bottom.BottomCheckView
<com.mogo.och.bus.passenger.ui.bottom.BottomCheckView
android:id="@+id/actv_setting"
app:backageViewId="@+id/actv_setting_press"
app:selectedDrawable="@drawable/charter_p_bottom_softsettiing_press"
@@ -135,7 +135,7 @@
android:layout_width="@dimen/dp_359"
android:layout_height="@dimen/dp_107"/>
<com.mogo.och.bus.passenger.ui.view.bottom.BottomCheckView
<com.mogo.och.bus.passenger.ui.bottom.BottomCheckView
android:id="@+id/actv_line"
app:backageViewId="@+id/actv_line_press"
app:selectedDrawable="@drawable/charter_p_bottom_line_press"

View File

@@ -14,7 +14,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<com.mogo.och.bus.passenger.ui.view.bottom.BottomBar
<com.mogo.och.bus.passenger.ui.bottom.BottomBar
android:id="@+id/bb_bottom_bar"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"

View File

@@ -0,0 +1,146 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto">
<!-- 速度 -->
<LinearLayout
android:id="@+id/ll_car_speed"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="@dimen/dp_74"
android:layout_marginStart="@dimen/dp_29"
android:layout_width="@dimen/dp_152"
android:background="@drawable/bus_p_car_speed"
android:orientation="vertical"
android:layout_height="@dimen/dp_152">
<TextView
android:id="@+id/tv_speed"
android:text="0"
android:textSize="@dimen/dp_60"
android:gravity="center"
android:layout_marginTop="@dimen/dp_12"
android:textColor="@color/bus_p_m1_f5fbff"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView
android:textSize="@dimen/dp_19"
android:text="@string/bus_p_m1_speed_unit"
android:layout_marginTop="-10dp"
android:layout_gravity="center_horizontal"
android:textColor="@android:color/white"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
<!-- 距离、剩余时间、到达时间 -->
<androidx.constraintlayout.widget.ConstraintLayout
app:layout_constraintTop_toBottomOf="@+id/ll_car_speed"
app:layout_constraintStart_toStartOf="@+id/ll_car_speed"
app:layout_constraintEnd_toEndOf="@+id/ll_car_speed"
android:background="@drawable/bus_p_distance_info_bg"
android:layout_width="@dimen/dp_115"
android:layout_height="@dimen/dp_346">
<TextView
android:id="@+id/tv_distance"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toTopOf="@+id/tv_distance_unit"
app:layout_constraintVertical_chainStyle="packed"
android:fontFamily="@font/din"
android:text="--"
android:textSize="@dimen/dp_37"
android:textColor="@color/bus_p_m1_203555"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/tv_distance_unit"
app:layout_constraintTop_toBottomOf="@+id/tv_distance"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toTopOf="@+id/v_line_01"
android:text="@string/m1_distance_unit_km"
android:textSize="@dimen/dp_17"
android:textColor="@color/bus_p_m1_112b57"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<View
android:id="@+id/v_line_01"
android:background="@android:color/transparent"
app:layout_constraintVertical_bias="0.33"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_1"/>
<TextView
android:id="@+id/tv_distance_surplus_time"
app:layout_constraintTop_toBottomOf="@+id/v_line_01"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintVertical_chainStyle="packed"
app:layout_constraintBottom_toTopOf="@+id/tv_distance_surplus_time_unit"
app:layout_constraintHorizontal_chainStyle="packed"
android:text="--"
android:fontFamily="@font/din"
android:textSize="@dimen/dp_37"
android:textColor="@color/bus_p_m1_203555"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/tv_distance_surplus_time_unit"
app:layout_constraintTop_toBottomOf="@+id/tv_distance_surplus_time"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toTopOf="@+id/v_line_02"
android:text="@string/m1_arrive_left_time"
android:textSize="@dimen/dp_17"
android:textColor="@color/bus_p_m1_112b57"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<View
android:id="@+id/v_line_02"
android:background="@android:color/transparent"
app:layout_constraintVertical_bias="0.66"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_1"/>
<TextView
android:id="@+id/tv_distance_arrive_time"
app:layout_constraintTop_toTopOf="@+id/v_line_02"
app:layout_constraintBottom_toTopOf="@+id/tv_distance_arrive_time_unit"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintVertical_chainStyle="packed"
android:text="--"
android:fontFamily="@font/din"
android:textSize="@dimen/dp_37"
android:textColor="@color/bus_p_m1_203555"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/tv_distance_arrive_time_unit"
app:layout_constraintTop_toBottomOf="@+id/tv_distance_arrive_time"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:text="@string/m1_reach_time"
android:textSize="@dimen/dp_17"
android:textColor="@color/bus_p_m1_112b57"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -57,146 +57,43 @@
app:layout_constraintEnd_toEndOf="@+id/mapBizView"
app:layout_constraintStart_toStartOf="parent" />
<!-- 速度 -->
<LinearLayout
android:id="@+id/ll_car_speed"
app:layout_constraintStart_toStartOf="parent"
<com.mogo.och.bus.passenger.ui.itinerary.ItineraryView
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="@dimen/dp_74"
android:layout_marginStart="@dimen/dp_29"
android:layout_width="@dimen/dp_152"
android:background="@drawable/bus_p_car_speed"
android:orientation="vertical"
android:layout_height="@dimen/dp_152">
app:layout_constraintStart_toStartOf="parent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/tv_speed"
android:text="0"
android:textSize="@dimen/dp_60"
android:gravity="center"
android:layout_marginTop="@dimen/dp_12"
android:textColor="@color/bus_p_m1_f5fbff"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView
android:textSize="@dimen/dp_19"
android:text="@string/bus_p_m1_speed_unit"
android:layout_marginTop="-10dp"
android:layout_gravity="center_horizontal"
android:textColor="@android:color/white"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
<!-- 距离、剩余时间、到达时间 -->
<androidx.constraintlayout.widget.ConstraintLayout
app:layout_constraintTop_toBottomOf="@+id/ll_car_speed"
app:layout_constraintStart_toStartOf="@+id/ll_car_speed"
app:layout_constraintEnd_toEndOf="@+id/ll_car_speed"
android:background="@drawable/bus_p_distance_info_bg"
android:layout_width="@dimen/dp_115"
android:layout_height="@dimen/dp_346">
<com.mogo.och.bus.passenger.ui.orderinfo.OrderInfoView
android:id="@+id/biz_orderinfo"
android:layout_width="match_parent"
android:visibility="gone"
android:layout_height="0dp"
android:paddingBottom="@dimen/dp_34_5"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@+id/bb_boorombar" />
<TextView
android:id="@+id/tv_distance"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toTopOf="@+id/tv_distance_unit"
app:layout_constraintVertical_chainStyle="packed"
android:fontFamily="@font/din"
android:text="--"
android:textSize="@dimen/dp_37"
android:textColor="@color/bus_p_m1_203555"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<com.mogo.och.bus.passenger.ui.softcontrol.SoftControlView
android:id="@+id/biz_softcontrol"
android:layout_width="match_parent"
android:visibility="gone"
android:paddingBottom="@dimen/dp_34_5"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@+id/bb_boorombar"
android:layout_height="0dp"/>
<TextView
android:id="@+id/tv_distance_unit"
app:layout_constraintTop_toBottomOf="@+id/tv_distance"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toTopOf="@+id/v_line_01"
android:text="@string/m1_distance_unit_km"
android:textSize="@dimen/dp_17"
android:textColor="@color/bus_p_m1_112b57"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<View
android:id="@+id/v_line_01"
android:background="@android:color/transparent"
app:layout_constraintVertical_bias="0.33"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_1"/>
<TextView
android:id="@+id/tv_distance_surplus_time"
app:layout_constraintTop_toBottomOf="@+id/v_line_01"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintVertical_chainStyle="packed"
app:layout_constraintBottom_toTopOf="@+id/tv_distance_surplus_time_unit"
app:layout_constraintHorizontal_chainStyle="packed"
android:text="--"
android:fontFamily="@font/din"
android:textSize="@dimen/dp_37"
android:textColor="@color/bus_p_m1_203555"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/tv_distance_surplus_time_unit"
app:layout_constraintTop_toBottomOf="@+id/tv_distance_surplus_time"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toTopOf="@+id/v_line_02"
android:text="@string/m1_arrive_left_time"
android:textSize="@dimen/dp_17"
android:textColor="@color/bus_p_m1_112b57"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<View
android:id="@+id/v_line_02"
android:background="@android:color/transparent"
app:layout_constraintVertical_bias="0.66"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_1"/>
<TextView
android:id="@+id/tv_distance_arrive_time"
app:layout_constraintTop_toTopOf="@+id/v_line_02"
app:layout_constraintBottom_toTopOf="@+id/tv_distance_arrive_time_unit"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintVertical_chainStyle="packed"
android:text="--"
android:fontFamily="@font/din"
android:textSize="@dimen/dp_37"
android:textColor="@color/bus_p_m1_203555"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/tv_distance_arrive_time_unit"
app:layout_constraintTop_toBottomOf="@+id/tv_distance_arrive_time"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:text="@string/m1_reach_time"
android:textSize="@dimen/dp_17"
android:textColor="@color/bus_p_m1_112b57"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</androidx.constraintlayout.widget.ConstraintLayout>
<com.mogo.och.bus.passenger.ui.selectline.SelectLineView
android:id="@+id/biz_selectline"
android:layout_width="0dp"
android:visibility="gone"
android:paddingBottom="@dimen/dp_34_5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="@+id/mapBizView"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@+id/bb_boorombar"
android:layout_height="0dp"/>
<com.mogo.och.bus.passenger.ui.view.bottom.BottomBar
<com.mogo.och.bus.passenger.ui.bottom.BottomBar
android:id="@+id/bb_boorombar"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
@@ -245,50 +142,12 @@
app:layout_constraintEnd_toEndOf="@+id/viewBusPM1MsgBoxButton"
app:layout_constraintTop_toBottomOf="@+id/viewBusPM1MsgBoxButton"/>
<TextView
android:text="到站"
android:id="@+id/debug_arrive_dest"
<com.mogo.och.bus.passenger.ui.debugview.DebugView
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="@dimen/dp_47"
app:layout_constraintEnd_toEndOf="@+id/mapBizView"
android:visibility="gone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:text="展示引导页面"
android:id="@+id/debug_show_noviceGuidance"
app:layout_constraintTop_toBottomOf="@+id/debug_arrive_dest"
android:layout_marginTop="@dimen/dp_17"
app:layout_constraintEnd_toEndOf="@+id/mapBizView"
android:visibility="gone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:text="切换模型"
android:id="@+id/debug_change_modle"
app:layout_constraintTop_toBottomOf="@+id/debug_show_noviceGuidance"
android:layout_marginTop="@dimen/dp_17"
app:layout_constraintEnd_toEndOf="@+id/mapBizView"
android:visibility="gone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:text="显示结束页面"
android:id="@+id/debug_show_endview"
app:layout_constraintTop_toBottomOf="@+id/debug_change_modle"
android:layout_marginTop="@dimen/dp_17"
app:layout_constraintEnd_toEndOf="@+id/mapBizView"
android:visibility="gone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<androidx.constraintlayout.widget.Group
android:id="@+id/group_debug"
app:constraint_referenced_ids="debug_arrive_dest,debug_show_noviceGuidance,debug_change_modle,debug_show_endview"
android:visibility="gone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -8,14 +8,12 @@
<!-- 订单主页面 -->
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_width="@dimen/dp_936"
android:layout_height="@dimen/dp_500"
android:layout_marginStart="@dimen/dp_286"
android:background="@drawable/charter_p_select_line_bg"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintDimensionRatio="936:500"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintWidth_percent="0.4875">
app:layout_constraintStart_toStartOf="parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/lsv_line_site"

View File

@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout"
tools:ignore="MissingDefaultResource">
<TextView
android:text="到站"
android:id="@+id/debug_arrive_dest"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:text="展示引导页面"
android:id="@+id/debug_show_noviceGuidance"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:text="切换模型"
android:id="@+id/debug_change_modle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:text="显示结束页面"
android:id="@+id/debug_show_endview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</androidx.appcompat.widget.LinearLayoutCompat>

View File

@@ -82,7 +82,7 @@
app:layout_constraintStart_toStartOf="@+id/gl_left"
app:layout_constraintTop_toTopOf="parent" />
<com.mogo.och.bus.passenger.view.DrawBitmapView
<com.mogo.och.bus.passenger.ui.softcontrol.view.DrawBitmapView
android:id="@+id/dbv_wind"
android:layout_width="0dp"
android:layout_height="0dp"
@@ -91,7 +91,7 @@
app:layout_constraintHeight_percent="0.5"
app:layout_constraintStart_toStartOf="@+id/iv_aircondition" />
<com.mogo.och.bus.passenger.view.DrawableCheckBox
<com.mogo.och.bus.passenger.ui.softcontrol.view.DrawableCheckBox
android:id="@+id/tv_aircondition_switch"
android:layout_width="0dp"
android:layout_height="@dimen/dp_76"

View File

@@ -52,7 +52,7 @@
android:layout_marginStart="@dimen/dp_80" />
<!--魔方连接状态-->
<com.mogo.och.bus.passenger.view.statusbar.M1BlueToothView
<com.mogo.och.bus.passenger.ui.statusbar.M1BlueToothView
android:id="@+id/blueToothView"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"

View File

@@ -4,7 +4,7 @@
android:layout_width="@dimen/dp_1300"
android:layout_height="@dimen/dp_731">
<com.mogo.och.bus.passenger.view.ConsultVideoPlayer
<com.mogo.och.bus.passenger.ui.video.ConsultVideoPlayer
android:id="@+id/video_item_player"
android:layout_gravity="center"
android:layout_width="@dimen/dp_1300"

View File

@@ -144,7 +144,7 @@
</androidx.constraintlayout.widget.ConstraintLayout>
<com.mogo.och.bus.passenger.ui.view.bottom.BottomBar
<com.mogo.och.bus.passenger.ui.bottom.BottomBar
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"

View File

@@ -1,6 +1,6 @@
package com.mogo.och.taxi.constant/**
* Created on 2023/8/7
* taskType = 1 虚拟任务(演练), = 2 接驾任务(运营), = 3 //送驾任务(运营)
* taskType = 1 虚拟任务(演练任务), = 2 接驾任务(运营), = 3 //送驾任务(运营)
*/
enum class TaskTypeEnum(val code: Int) {
None(0),

View File

@@ -59,6 +59,8 @@ import com.mogo.och.common.module.manager.distancemamager.ITrajectoryListener
import com.mogo.och.common.module.manager.distancemamager.TrajectoryAndDistanceManager.addDistanceListener
import com.mogo.och.common.module.manager.distancemamager.TrajectoryAndDistanceManager.addTrajectoryListener
import com.mogo.och.common.module.manager.distancemamager.TrajectoryAndDistanceManager.setStationPoint
import com.mogo.och.common.module.map.AmapNaviToDestinationModel
import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil.coordinateConverterWgsToGcjLocations
import com.mogo.och.taxi.bean.ContrailListRespBean
import com.mogo.och.taxi.bean.OrderDetail
import com.mogo.och.taxi.bean.PrepareTaskRespBean
@@ -103,13 +105,14 @@ object TaxiModel {
private var mContext: Context? = null
private var mCurrentTaskAndOrder : QueryCurrentTaskRespBean.Result? = null //当前任务和订单
private var mCurrentTaskAndOrder: QueryCurrentTaskRespBean.Result? = null //当前任务和订单
private var mUntruthTask : StartServiceRespBean.Result? = null // 前往出车点的伪任务, 后台并不算做真正的任务
private var mUntruthTask: StartServiceRespBean.Result? = null // 前往出车点的伪任务, 后台并不算做真正的任务
private var mOrderContrails : MutableList<ContrailListRespBean.Result>? = null // 运营单(接驾任务和送驾任务的轨迹集合)
private var mOrderContrails: MutableList<ContrailListRespBean.Result>? =
null // 运营单(接驾任务和送驾任务的轨迹集合)
private var mCurTaskContrail : ContrailListRespBean.Result? = null //当前在跑的任务的轨迹信息
private var mCurTaskContrail: ContrailListRespBean.Result? = null //当前在跑的任务的轨迹信息
private var mADASStatusCallback //Model->Presenter自动驾驶状态相关
: ITaxiADASStatusCallback? = null
@@ -196,8 +199,6 @@ object TaxiModel {
}
fun release() {
// startOrStopOrderLoop(false)
startOrStopCalculateRouteInfo(false)
releaseListeners()
loginService = null
}
@@ -272,15 +273,19 @@ object TaxiModel {
return valueOf(order.orderStatus)
}
fun getCurTaskAndOrder(): QueryCurrentTaskRespBean.Result?{
return mCurrentTaskAndOrder
fun getCurTaskAndOrder(): QueryCurrentTaskRespBean.Result? {
return mCurrentTaskAndOrder
}
fun getCurOrderContrails(): MutableList<ContrailListRespBean.Result>?{
fun getCurUntruthTask(): StartServiceRespBean.Result? {
return mUntruthTask
}
fun getCurOrderContrails(): MutableList<ContrailListRespBean.Result>? {
return mOrderContrails
}
fun getCurTaskContrail(): ContrailListRespBean.Result?{
fun getCurTaskContrail(): ContrailListRespBean.Result? {
return mCurTaskContrail
}
@@ -298,7 +303,7 @@ object TaxiModel {
val currentOrder = mCurrentTaskAndOrder!!.order
if (currentOrder != null){
if (currentOrder != null) {
if (currentOrder!!.orderStatus == TaxiOrderStatusEnum.OnTheWayToEnd.code) {
if (FunctionBuildConfig.isDemoMode) {
// 当美化模式(演示模式)开启时: 订单对应自动驾驶开启后置true
@@ -316,7 +321,7 @@ object TaxiModel {
}
clearAutopilotControlParameters()
}
}else{
} else {
if (FunctionBuildConfig.isDemoMode) {
d(SceneConstant.M_TAXI + TAG, "setIPCDemoModefalse")
setIPCDemoMode(false)
@@ -343,18 +348,17 @@ object TaxiModel {
updateAutopilotControlParameters(null)
}
fun updateCurrentTaskAndOrder(result: QueryCurrentTaskRespBean.Result?){
fun updateCurrentTaskAndOrder(result: QueryCurrentTaskRespBean.Result?) {
mCurrentTaskAndOrder = result
updateNativeCurrentOrder(result)
}
fun updateUntruthTask(untruthTask : StartServiceRespBean.Result?) {
fun updateUntruthTask(untruthTask: StartServiceRespBean.Result?) {
mUntruthTask = untruthTask
}
//清除任务订单信息
fun clearCurrentOCHOrder() {
startOrStopCalculateRouteInfo(false)
mCurrentTaskAndOrder = null
clearAutopilotControlParameters()
TaxiTrajectoryManager.getInstance().syncTrajectoryInfo()
@@ -395,7 +399,7 @@ object TaxiModel {
return
}
if (mCurTaskContrail == null){
if (mCurTaskContrail == null) {
e(SceneConstant.M_TAXI + TAG, "no order or order is empty.")
ToastUtils.showShort("轨迹信息不存在!")
}
@@ -468,7 +472,7 @@ object TaxiModel {
return null
}
if (mCurTaskContrail == null){
if (mCurTaskContrail == null) {
e(SceneConstant.M_TAXI + TAG, "curTaskContrail is empty.")
return null
}
@@ -488,11 +492,16 @@ object TaxiModel {
if (parameters.autoPilotLine == null) {
parameters.autoPilotLine = AutopilotControlParameters.AutoPilotLine(
mCurrentTaskAndOrder!!.lineId,
mCurTaskContrail!!.csvFileUrl, mCurTaskContrail!!.csvFileMd5,
mCurTaskContrail!!.txtFileUrl, mCurTaskContrail!!.txtFileMd5,
mCurTaskContrail!!.contrailSaveTime, "", // todo 这里原来传的是carModel, 现在没有这个信息, 是否传businessType
mCurTaskContrail!!.csvFileUrlDPQP, mCurTaskContrail!!.csvFileMd5DPQP,
mCurTaskContrail!!.txtFileUrlDPQP, mCurTaskContrail!!.txtFileMd5DPQP,
mCurTaskContrail!!.csvFileUrl,
mCurTaskContrail!!.csvFileMd5,
mCurTaskContrail!!.txtFileUrl,
mCurTaskContrail!!.txtFileMd5,
mCurTaskContrail!!.contrailSaveTime,
"", // todo 这里原来传的是carModel, 现在没有这个信息, 是否传businessType
mCurTaskContrail!!.csvFileUrlDPQP,
mCurTaskContrail!!.csvFileMd5DPQP,
mCurTaskContrail!!.txtFileUrlDPQP,
mCurTaskContrail!!.txtFileMd5DPQP,
mCurTaskContrail!!.contrailSaveTimeDPQP
)
}
@@ -521,7 +530,7 @@ object TaxiModel {
).toDouble()
i(SceneConstant.M_TAXI + TAG, "judgeTaskStartStation() distance = $distance")
if (distance <= TaxiUnmannedConst.ARRIVE_AT_START_STATION_DISTANCE) {
arriveSite(startSite.siteId,false)
arriveSite(startSite.siteId, false)
}
}
}
@@ -574,11 +583,11 @@ object TaxiModel {
//位置变化时通过围栏判断是否到达x点
if (null == mogoLocation) return
if (mUntruthTask != null){
judgeUntruthStation(mUntruthTask,mogoLocation)
if (mUntruthTask != null) {
judgeUntruthStation(mUntruthTask, mogoLocation)
}
if (checkCurrentTask()){
if (checkCurrentTask()) {
judgeTaskStartStation(mogoLocation)
judgeTaskEndSiteStation(mogoLocation)
}
@@ -589,45 +598,56 @@ object TaxiModel {
}
}
private fun judgeUntruthStation(virtualTask: StartServiceRespBean.Result?, currentLocation: MogoLocation) {
private fun judgeUntruthStation(
virtualTask: StartServiceRespBean.Result?,
currentLocation: MogoLocation
) {
if (mUntruthTask == null || virtualTask == null) return
val distance = CoordinateUtils.calculateLineDistance(
virtualTask.gcjLon, virtualTask.gcjLat,
currentLocation.longitude, currentLocation.latitude
).toDouble()
i(SceneConstant.M_TAXI + TAG, "judgeEndStation() ${virtualTask.siteName} distance = $distance")
i(
SceneConstant.M_TAXI + TAG,
"judgeEndStation() ${virtualTask.siteName} distance = $distance"
)
if (distance <= TaxiUnmannedConst.ARRIVE_AT_START_STATION_DISTANCE) { // 15米内到站
arriveSite(virtualTask.siteId, true)
}
}
private fun arriveSite(siteId: Long, isArriveEndSite: Boolean) {
arriveSite(mContext!!,siteId,object : OchCommonServiceCallback<BaseData>{
/**
* 到站(起点、终点)
* isArriveEndSite true 终点, false 起点
*/
fun arriveSite(siteId: Long, isArriveEndSite: Boolean) {
arriveSite(mContext!!, siteId, object : OchCommonServiceCallback<BaseData> {
override fun onSuccess(data: BaseData?) {
if (data == null || data.code != 0) return
d(SceneConstant.M_TAXI + TAG,GsonUtil.jsonFromObject(data))
d(SceneConstant.M_TAXI + TAG, GsonUtil.jsonFromObject(data))
mUntruthTask = null
if (isArriveEndSite){
if (isArriveEndSite) {
//到目的站后去查询下一个任务
startPrepareTask(siteId)
cleanStation()
}
}
override fun onFail(code: Int, msg: String?) {
d(SceneConstant.M_TAXI + TAG,"$code $msg")
d(SceneConstant.M_TAXI + TAG, "$code $msg")
}
})
}
private fun startTask(lineId: Long) {
startTask(mContext!!, lineId,object : OchCommonServiceCallback<BaseData>{
startTask(mContext!!, lineId, object : OchCommonServiceCallback<BaseData> {
override fun onSuccess(data: BaseData?) {
d(SceneConstant.M_TAXI + TAG,GsonUtil.jsonFromObject(data))
d(SceneConstant.M_TAXI + TAG, GsonUtil.jsonFromObject(data))
}
override fun onFail(code: Int, msg: String?) {
d(SceneConstant.M_TAXI + TAG,"$code $msg")
d(SceneConstant.M_TAXI + TAG, "$code $msg")
}
})
@@ -635,20 +655,20 @@ object TaxiModel {
private fun startPrepareTask(siteId: Long) {
UiThreadHandler.postDelayed({
prepareTask(mContext!!,siteId,object : OchCommonServiceCallback<PrepareTaskRespBean>{
prepareTask(mContext!!, siteId, object : OchCommonServiceCallback<PrepareTaskRespBean> {
override fun onSuccess(data: PrepareTaskRespBean?) {
d(SceneConstant.M_TAXI + TAG,GsonUtil.jsonFromObject(data))
d(SceneConstant.M_TAXI + TAG, GsonUtil.jsonFromObject(data))
if (data == null || data.code != 0) return
//去下载轨迹, 下发给工控机下载
queryTaskContrail(Array(1) { data.lineId })
}
override fun onFail(code: Int, msg: String?) {
d(SceneConstant.M_TAXI + TAG,"$code $msg")
d(SceneConstant.M_TAXI + TAG, "$code $msg")
}
})
},TIMER_PREPARE_TASK_INTERVAL)
}, TIMER_PREPARE_TASK_INTERVAL)
}
private fun judgeTaskEndSiteStation(currentLocation: MogoLocation) {
@@ -687,7 +707,7 @@ object TaxiModel {
return
}
i(SceneConstant.M_TAXI + TAG, "judgeEndStation() = 刚过站且在15m内")
arriveSite(endSite.siteId,true)
arriveSite(endSite.siteId, true)
}
}
}
@@ -720,7 +740,7 @@ object TaxiModel {
ToastUtils.showShort("订单状态不匹配该操作!")
return
}
arriveSite(mCurrentTaskAndOrder?.startSite!!.siteId,false)
arriveSite(mCurrentTaskAndOrder?.startSite!!.siteId, false)
}
fun setArriveAtEndStation() {
@@ -728,11 +748,11 @@ object TaxiModel {
ToastUtils.showShort("无任务!")
return
}
arriveSite(mCurrentTaskAndOrder?.endSite!!.siteId,true)
arriveSite(mCurrentTaskAndOrder?.endSite!!.siteId, true)
}
fun toStartTask() {
if (!checkCurrentTask()){
if (!checkCurrentTask()) {
ToastUtils.showShort("无任务!")
return
}
@@ -832,7 +852,10 @@ object TaxiModel {
override fun onAutopilotSNRequest() {}
override fun onAutopilotArriveAtStation(arrivalNotification: ArrivalNotification?) {
i(SceneConstant.M_TAXI + TAG, "onAutopilotArriveAtStation = " + arrivalNotification.toString())
i(
SceneConstant.M_TAXI + TAG,
"onAutopilotArriveAtStation = " + arrivalNotification.toString()
)
if (((arrivalNotification == null) || !checkCurrentTask()
|| (getCurOrderStatus() === TaxiOrderStatusEnum.ArriveAtEnd))
) {
@@ -855,8 +878,8 @@ object TaxiModel {
private fun arriveTerminal() {
if (!checkCurrentOrder()) return
val endSite = mCurrentTaskAndOrder!!.order!!.orderEndSite
if (endSite != null){
arriveSite(endSite.siteId,true)
if (endSite != null) {
arriveSite(endSite.siteId, true)
}
}
@@ -880,29 +903,27 @@ object TaxiModel {
*
*/
fun setRouteLineMarker() {
// TODO: 设置地图上的marker 只设置有明确站点marker ,当前执行的任务或者订单的,但是不设置虚拟任务的
// val currentOCHOrder = getCurrentOrder()
// if (currentOCHOrder != null) {
// if ((currentOCHOrder.startSiteGcjPoint == null) || currentOCHOrder.startSiteGcjPoint.isEmpty() || (currentOCHOrder.startSiteGcjPoint.size < 2) || (
// currentOCHOrder.endSiteGcjPoint == null) || currentOCHOrder.endSiteGcjPoint.isEmpty() || (currentOCHOrder.endSiteGcjPoint.size < 2)
// ) {
// cleanLineMarker()
// return
// }
// val startStation = LatLng(
// currentOCHOrder.startSiteGcjPoint[1],
// currentOCHOrder.startSiteGcjPoint[0]
// )
// val endStation = LatLng(
// currentOCHOrder.endSiteGcjPoint[1],
// currentOCHOrder.endSiteGcjPoint[0]
// )
// if (mAutopilotPlanningCallback != null) {
// mAutopilotPlanningCallback!!.setLineMarker(startStation, endStation)
// }
val curTaskAndOrder = getCurTaskAndOrder()
if (curTaskAndOrder != null) {
if (curTaskAndOrder.startSite == null || curTaskAndOrder.endSite == null) {
cleanLineMarker()
return
}
val startStation = LatLng(
curTaskAndOrder.startSite!!.gcjLat,
curTaskAndOrder.startSite!!.gcjLon
)
val endStation = LatLng(
curTaskAndOrder.endSite!!.gcjLat,
curTaskAndOrder.endSite!!.gcjLon
)
if (mAutopilotPlanningCallback != null) {
mAutopilotPlanningCallback!!.setLineMarker(startStation, endStation)
}
}
}
fun cleanLineMarker() {
private fun cleanLineMarker() {
if (mAutopilotPlanningCallback != null) {
mAutopilotPlanningCallback!!.setLineMarker(null, null)
}
@@ -914,30 +935,29 @@ object TaxiModel {
* @param models
*/
fun updateOrderRouteInfo(models: List<MessagePad.Location>) {
// if (models.isEmpty()) return
// if (mCurrentOrder == null) return
// d(SceneConstant.M_TAXI + TAG, "--------计算出sumLength开始---------- ")
//
// //转换成高德坐标系
// if (mRoutePoints!!.size > 0) {
// mRoutePoints.clear()
// }
// mRoutePoints.addAll(coordinateConverterWgsToGcjLocations(mContext, models))
// startDynamicCalculateRouteInfo()
if (models.isEmpty()) return
if (mCurrentTaskAndOrder == null || mCurrentTaskAndOrder!!.startSite == null
|| mCurrentTaskAndOrder!!.endSite == null) return
d(SceneConstant.M_TAXI + TAG, "--------计算出sumLength开始---------- ")
//转换成高德坐标系
if (mRoutePoints!!.size > 0) {
mRoutePoints.clear()
}
mRoutePoints.addAll(coordinateConverterWgsToGcjLocations(mContext, models))
startDynamicCalculateRouteInfo()
}
private fun startDynamicCalculateRouteInfo() {
// d(
// SceneConstant.M_TAXI + TAG,
// "--------mCurrentOCHOrder---------- $mCurrentOrder"
// )
// d(SceneConstant.M_TAXI + TAG, "--------mRoutePoints.size---------- " + mRoutePoints!!.size)
// //开启实时计算剩余距离,剩余时间,预计时间
// startOrStopCalculateRouteInfo(true)
// AmapNaviToDestinationModel.getInstance(mContext).destroyAmaNavi()
// if (mOrderStatusCallback != null) {
// mOrderStatusCallback!!.onNaviToEnd(false, false)
// }
d(
SceneConstant.M_TAXI + TAG,
"--------mCurrentTaskAndOrder---------- $mCurrentTaskAndOrder"
)
d(SceneConstant.M_TAXI + TAG, "--------mRoutePoints.size---------- " + mRoutePoints!!.size)
AmapNaviToDestinationModel.getInstance(mContext).destroyAmaNavi()
if (mOrderStatusCallback != null) {
mOrderStatusCallback!!.onNaviToEnd(false, false)
}
}
private fun updateDistance(lastSumLength: Float) {
@@ -947,15 +967,12 @@ object TaxiModel {
("---lastSumLength: " + lastSumLength + "----lastTime : " + lastTime
+ " thread = " + Thread.currentThread().name)
)
// if (mCurrentOrder != null) {
// mCurrentOrder!!.decreaseTravelDistance(lastSumLength.toDouble())
// }
// if (mOrderStatusCallback != null) {
// mOrderStatusCallback!!.onCurrentOrderDistToEndChanged(
// lastSumLength.toLong(),
// lastTime.toLong()
// )
// }
if (mOrderStatusCallback != null) {
mOrderStatusCallback!!.onCurrentOrderDistToEndChanged(
lastSumLength.toLong(),
lastTime.toLong()
)
}
}
private val distanceListener: IDistanceListener = object : IDistanceListener {
@@ -981,15 +998,15 @@ object TaxiModel {
var temp: LatLng?
for (mogoLocation: MogoLocation in routeArrivied) {
temp = LatLng(
mogoLocation.getLatitude(),
mogoLocation.getLongitude()
mogoLocation.latitude,
mogoLocation.longitude
)
routeArriviedTemp.add(temp)
}
for (mogoLocation: MogoLocation in routeArriving) {
temp = LatLng(
mogoLocation.getLatitude(),
mogoLocation.getLongitude()
mogoLocation.latitude,
mogoLocation.longitude
)
routeArrivingTemp.add(temp)
}
@@ -1003,21 +1020,6 @@ object TaxiModel {
}
}
/**
* 开始轮询计算剩余里程和时间
*
* @param isStart
*/
private fun startOrStopCalculateRouteInfo(isStart: Boolean) {
d(SceneConstant.M_TAXI + TAG, "startOrStopOrderLoop() $isStart")
if (isStart) {
TaxiModelLoopManager.getInstance().startCalculateRouteInfoLoop()
} else {
mRoutePoints!!.clear()
TaxiModelLoopManager.getInstance().stopCalculateRouteInfoLoop()
}
}
// 登出
fun logout() {
loginService!!.loginOut(getChassisLocationGCJ02().latitude, getChassisLocationGCJ02().longitude)
@@ -1025,12 +1027,13 @@ object TaxiModel {
//导航去订单终点目的地
fun startNaviToEndStation(isShow: Boolean) {
if (mRoutePoints!!.size > 0) { //使用自驾轨迹
if (mRoutePoints == null) return
if (mRoutePoints.size > 0) { //使用自驾轨迹
if (mOrderStatusCallback != null) {
mOrderStatusCallback!!.onNaviToEnd(false, isShow)
}
} else { //若直接要显示导航地图则直接导航, 若不是则2s后若无轨迹数据使用高德导航
if (isShow && mRoutePoints.size == 0 && mOrderStatusCallback != null) {
if (isShow && mOrderStatusCallback != null) {
mOrderStatusCallback!!.onNaviToEnd(true, true)
} else {
UiThreadHandler.postDelayed({
@@ -1041,21 +1044,30 @@ object TaxiModel {
}
}
}
fun setStation() {
// val currentOCHOrder = getCurrentOrder()
// if (currentOCHOrder != null) {
// val startStation = MogoLocation()
// startStation.longitude = currentOCHOrder.startSiteGcjPoint[0]
// startStation.latitude = currentOCHOrder.startSiteGcjPoint[1]
// val endStation = MogoLocation()
// endStation.longitude = currentOCHOrder.endSiteGcjPoint[0]
// endStation.latitude = currentOCHOrder.endSiteGcjPoint[1]
// setStationPoint(startStation, endStation, currentOCHOrder.lineId)
// }
fun updateStation() {
if (mCurrentTaskAndOrder == null) return
if (mCurrentTaskAndOrder!!.startSite != null && mCurrentTaskAndOrder!!.endSite != null
&& mCurrentTaskAndOrder!!.currentStatus <= TaskStatusEnum.StartTask.code){
setStation()
}else{
cleanStation()
}
}
fun cleanStation() {
private fun setStation() {
val curTaskAndOrder = getCurTaskAndOrder() ?: return
if (curTaskAndOrder.startSite != null && curTaskAndOrder.endSite != null) {
val startStation = MogoLocation()
startStation.longitude = curTaskAndOrder.startSite!!.gcjLon
startStation.latitude = curTaskAndOrder.startSite!!.gcjLat
val endStation = MogoLocation()
endStation.longitude = curTaskAndOrder.endSite!!.gcjLon
endStation.latitude = curTaskAndOrder.endSite!!.gcjLat
setStationPoint(startStation, endStation, curTaskAndOrder.lineId)
}
}
private fun cleanStation() {
setStationPoint(null, null, -1L)
}

View File

@@ -1,87 +0,0 @@
package com.mogo.och.taxi.model;
import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI;
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
import com.mogo.och.taxi.constant.TaxiUnmannedConst;
import java.util.concurrent.TimeUnit;
import io.reactivex.Observable;
import io.reactivex.ObservableEmitter;
import io.reactivex.ObservableOnSubscribe;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Consumer;
import io.reactivex.schedulers.Schedulers;
/**
* Created on 2021/9/10
*
* 管理轮询逻辑(订单轮询、新单轮询、新单抢单结果轮询等等)
*/
public class TaxiModelLoopManager {
private static final String TAG = TaxiModelLoopManager.class.getSimpleName();
private static final class SingletonHolder {
private static final TaxiModelLoopManager INSTANCE = new TaxiModelLoopManager();
}
public static TaxiModelLoopManager getInstance() {
return SingletonHolder.INSTANCE;
}
private CompositeDisposable mCalculateRouteDisposable; //每隔2s计算一次剩余里程和时间
public void startCalculateRouteInfoLoop() {
CallerLogger.INSTANCE.i(M_TAXI + TAG, "startCalculateRouteInfoLoop()");
if (mCalculateRouteDisposable != null) return;
mCalculateRouteDisposable = new CompositeDisposable();
Disposable disposable = loopDynamicCalculateRouteInfo()
.doOnSubscribe(new Consumer<Disposable>() {
@Override
public void accept(Disposable disposable) throws Exception {
}
}).doOnError(new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
}
})
.delay(TaxiUnmannedConst.LOOP_CALCULATEROUTE_2S, TimeUnit.MILLISECONDS, true) // 设置delayError为true表示出现错误的时候也需要延迟5s进行通知达到无论是请求正常还是请求失败都是5s后重新订阅即重新请求。
.subscribeOn(Schedulers.io())
.repeat() // repeat保证请求成功后能够重新订阅。
.retry() // retry保证请求失败后能重新订阅
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Exception {
}
});
mCalculateRouteDisposable.add(disposable);
}
private Observable<Integer> loopDynamicCalculateRouteInfo(){
return Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
if (emitter.isDisposed()) return;
// TaxiModel.INSTANCE.dynamicCalculateRouteInfo();
emitter.onComplete();
}
});
}
public void stopCalculateRouteInfoLoop() {
if (mCalculateRouteDisposable != null) {
CallerLogger.INSTANCE.i(M_TAXI + TAG, "stopCalculateRouteInfoLoop()");
mCalculateRouteDisposable.dispose();
mCalculateRouteDisposable = null;
}
}
}

View File

@@ -25,6 +25,7 @@ import com.mogo.och.taxi.constant.TaxiOrderStatusEnum
import com.mogo.och.taxi.constant.TaxiUnmannedConst
import com.mogo.och.taxi.constant.TaxtServingStatusManager
import com.mogo.och.taxi.network.CarServiceManager
import com.mogo.och.taxi.network.CarServiceManager.cancelOrder
import com.mogo.och.taxi.network.CarServiceManager.contrailList
import com.mogo.och.taxi.network.CarServiceManager.queryCarOrderByOrderNo
import com.mogo.och.taxi.ui.unmanned.TaskAndOrderUiState
@@ -72,8 +73,31 @@ class TaxiUnmannedViewModel : BaseViewModel<UnmannedState, UnmannedIntent>(){
}
is UnmannedIntent.CloseOrderByDriver -> {
if (mCurrentTaskAndOrder != null && mCurrentTaskAndOrder!!.order != null){
val site = mCurrentTaskAndOrder!!.order!!.orderEndSite;
TaxiModel.arriveSite(site!!.siteId,true)
}
}
is UnmannedIntent.CancelOrder -> {// 取消订单, 暂未加取消类型和原因
handleCancelOrder()
}
}
}
private fun handleCancelOrder() {
if (mCurrentTaskAndOrder != null && mCurrentTaskAndOrder!!.order != null){
cancelOrder(mContext, mCurrentTaskAndOrder!!.order!!.orderNo,
object : OchCommonServiceCallback<BaseData>{
override fun onSuccess(data: BaseData?) {
d(SceneConstant.M_TAXI + TAG, "handleCancelOrder() = onSuccess")
}
override fun onFail(code: Int, msg: String?) {
d(SceneConstant.M_TAXI + TAG, "handleCancelOrder() $code $msg")
}
})
}
}
@@ -93,7 +117,7 @@ class TaxiUnmannedViewModel : BaseViewModel<UnmannedState, UnmannedIntent>(){
//需要将虚拟任务停掉, 虚拟任务会再开始接单后获取新的
updateUntruthTask(null)
if (mCurrentTaskAndOrder != null){
if (mCurrentTaskAndOrder != null && mCurrentTaskAndOrder!!.endSite != null){
VoiceNotice.showNotice("暂停接单啦!要完成当前订单哦")
}else{
VoiceNotice.showNotice("暂停接单啦")
@@ -129,7 +153,9 @@ class TaxiUnmannedViewModel : BaseViewModel<UnmannedState, UnmannedIntent>(){
}
override fun onFail(code: Int, msg: String?) {
ToastUtilsOch.showWithCodeMessage(code, msg)
ToastUtilsOch.showWithCodeMessage(code,
"$msg curLatitude = ${CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().latitude}" +
" curLongitude = ${CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().longitude}")
}
override fun onError() {
@@ -175,20 +201,14 @@ class TaxiUnmannedViewModel : BaseViewModel<UnmannedState, UnmannedIntent>(){
}
private fun updateUntruthTask(result: StartServiceRespBean.Result?) {
TaxiModel.updateUntruthTask(result)
sendUiState {
copy(
taskAndOrderUiState = TaskAndOrderUiState.UNTRUTHTASK(result)
)
}
}
private fun updateTaskAndOrderUi() {
sendUiState {
copy(
taskAndOrderUiState = TaskAndOrderUiState.TASKANDORDER(mCurrentTaskAndOrder)
taskAndOrderUiState = TaskAndOrderUiState.TASKANDORDER(mCurrentTaskAndOrder,
TaxiModel.getCurUntruthTask())
)
}
}
@@ -197,7 +217,8 @@ class TaxiUnmannedViewModel : BaseViewModel<UnmannedState, UnmannedIntent>(){
sendUiState {
copy(
taskAndOrderUiState = TaskAndOrderUiState.TASKANDORDER(null)
taskAndOrderUiState = TaskAndOrderUiState.TASKANDORDER(null,
TaxiModel.getCurUntruthTask())
)
}
}
@@ -253,6 +274,8 @@ class TaxiUnmannedViewModel : BaseViewModel<UnmannedState, UnmannedIntent>(){
TaxiModel.updateCurrentTaskAndOrder(result)
TaxiModel.updateStation()
updateTaskAndOrderUi()
}
@@ -265,7 +288,7 @@ class TaxiUnmannedViewModel : BaseViewModel<UnmannedState, UnmannedIntent>(){
/**
* 查询接驾/送驾任务轨迹集合
* 注: 运营单刚来的时候, 有可能还在运行一个演练, 要先跑完演练才跑运营单
* 注: 运营单刚来的时候, 有可能还在运行一个演练任务, 要先跑完演练任务才跑运营单
*/
private fun queryOrderContrails(planningLines: Array<Long>?) {
if (planningLines == null) return

View File

@@ -161,7 +161,7 @@ public class TaxiPresenter extends Presenter<TaxiFragment> implements ITaxiADASS
@Override
public void onCurrentOrderDistToEndChanged(long meters, long timeInSecond) {
runOnUIThread(() -> mView.onCurrentOrderDistToEndChanged(meters,timeInSecond));
}
@Override

View File

@@ -22,6 +22,7 @@ import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager.getOverla
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import com.mogo.map.overlay.core.Level
import com.mogo.map.overlay.point.Point
import com.mogo.och.common.module.map.AmapNaviToDestinationModel
@@ -36,6 +37,7 @@ import com.mogo.och.taxi.bean.OrderDetail
import com.mogo.och.taxi.bean.OrderQueryRouteInfoRespBean
import com.mogo.och.taxi.bean.QueryCurrentTaskRespBean
import com.mogo.och.taxi.bean.StartServiceRespBean
import com.mogo.och.taxi.constant.TaskStatusEnum
import com.mogo.och.taxi.constant.TaskTypeEnum
import com.mogo.och.taxi.constant.TaxiOrderStatusEnum
import com.mogo.och.taxi.constant.TaxiUnmannedConst.Companion.TAXI_END_MAP_MAKER
@@ -87,8 +89,8 @@ class TaxiBeingTaskFragment : BaseFragment(),
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
d("viewmodel ==", "TaxiBeingTaskFragment onCreate")
mViewModel = ViewModelProvider(this, ViewModelProvider.NewInstanceFactory()).get(TaxiUnmannedViewModel::class.java)
d("viewModel ==", "TaxiBeingTaskFragment onCreate")
mViewModel = ViewModelProvider(this, ViewModelProvider.NewInstanceFactory())[TaxiUnmannedViewModel::class.java]
}
override fun initViews() {
@@ -105,34 +107,35 @@ class TaxiBeingTaskFragment : BaseFragment(),
//监听返回的数据状态
lifecycleScope.launchWhenStarted {
mViewModel.uiStateFlow.map {it.taskAndOrderUiState}.collect {state ->
d(TAG,"uiStateFlow: $state")
when(state){
mViewModel.uiStateFlow.map {it.taskAndOrderUiState}.collect {taskAndOrderUiState ->
d(TAG,"uiStateFlow-taskAndOrderUiState: $taskAndOrderUiState")
when(taskAndOrderUiState){
is TaskAndOrderUiState.INIT -> {
}
is TaskAndOrderUiState.TASKANDORDER -> {
mCurrentTaskAndOrder = state.model
if (state.model == null && mCurrentUntruthTask == null){
isHaveBeingOrder(false)
return@collect
}
updateCurrentOrderStatusChanged(state.model)
}
is TaskAndOrderUiState.UNTRUTHTASK -> {
mCurrentUntruthTask = state.untruthTask
if (state.untruthTask == null && mCurrentTaskAndOrder == null){
mCurrentUntruthTask = taskAndOrderUiState.untruthTask
mCurrentTaskAndOrder = taskAndOrderUiState.taskAndOrder
if ((taskAndOrderUiState.untruthTask == null && mCurrentTaskAndOrder != null
&& mCurrentTaskAndOrder!!.endSite == null) || mCurrentTaskAndOrder == null){
isHaveBeingOrder(false)
return@collect
}
isHaveBeingOrder(true)
updateUntruthTask(state.untruthTask)
if (taskAndOrderUiState.untruthTask != null){
updateUntruthTask(taskAndOrderUiState.untruthTask)
}else{
updateCurrentOrderStatusChanged(taskAndOrderUiState.taskAndOrder)
}
}
is TaskAndOrderUiState.ORDERCANCEL -> {
updateOrderCancelUi(state.isCancel)
updateOrderCancelUi(taskAndOrderUiState.isCancel)
onCurrentOrderCancelDone()
}
}
}
@@ -148,13 +151,20 @@ class TaxiBeingTaskFragment : BaseFragment(),
if (untruthTask == null) return
updateUntruthTaskView()
updateUntruthTaskUIData(untruthTask.siteName)
updateUntruthTaskOtherInfo()
}
private fun updateUntruthTaskOtherInfo() {
if (mCurrentUntruthTask != null){
startNaviToStation(false, mCurrentUntruthTask!!.gcjLat,
mCurrentUntruthTask!!.gcjLon)
}
}
private fun updateUntruthTaskUIData(siteName: String) {
taskStatus.text = resources.getString(R.string.task_start_to_virtual_site)
startStationName.text = resources.getString(R.string.task_current_loc)
endStationName.text = siteName
// TODO("剩余历程和时间导航去更新taskOtherInfo")
}
private fun updateUntruthTaskView() {
@@ -179,6 +189,26 @@ class TaxiBeingTaskFragment : BaseFragment(),
naviToEnd.setOnClickListener(this)
}
private fun updateRemainDistanceAndTime(isVoicePlay: Boolean){
//根据任务状态计算剩余历程和时间
if (mCurrentTaskAndOrder == null) return
if (mCurrentTaskAndOrder!!.endSite != null
&& mCurrentTaskAndOrder!!.currentStatus == TaskStatusEnum.StartTask.code){
startNaviToStation(isVoicePlay,mCurrentTaskAndOrder!!.endSite!!.gcjLat,
mCurrentTaskAndOrder!!.endSite!!.gcjLat)
return
}
if (mCurrentTaskAndOrder!!.startSite != null
&& mCurrentTaskAndOrder!!.currentStatus == TaskStatusEnum.GetTask.code){ //演练任务和送驾任务
startNaviToStation(isVoicePlay,mCurrentTaskAndOrder!!.startSite!!.gcjLat,
mCurrentTaskAndOrder!!.startSite!!.gcjLat)
}
}
/**
* 任务和订单信息
*/
@@ -193,7 +223,7 @@ class TaxiBeingTaskFragment : BaseFragment(),
/**
* 根据任务类型判断任务显示,
* 虚拟单, 显示在进行中 前往上车点
* 演练,显示演练, 同时有订单显示在待服务中
* 演练任务,显示演练任务, 同时有订单显示在待服务中
* 当前任务是接驾任务,显示订单状态+运营单 订单显示在进行中, 任务不再显示
*/
val taskType = taskAndOrder.taskType // 任务类型
@@ -212,7 +242,6 @@ class TaxiBeingTaskFragment : BaseFragment(),
taskTypeTv.text = resources.getString(R.string.task_exercise)
startStationName.text = startSite.siteName
endStationName.text = endSite.siteName
// TODO("剩余历程和时间导航去更新taskOtherInfo")
}
TaskTypeEnum.ToOrderEndTask.code,TaskTypeEnum.ToOrderStartTask.code -> {// 送驾/接驾任务任务
if (order == null) return
@@ -222,9 +251,10 @@ class TaxiBeingTaskFragment : BaseFragment(),
startStationName.text = order.orderStartSite?.siteName
endStationName.text = order.orderEndSite?.siteName
updateOrderUI(order)
// TODO("剩余历程和时间导航去更新taskOtherInfo")
}
}
updateRemainDistanceAndTime(false)
}
private fun updateOrderUI(order: OrderDetail) {
@@ -232,7 +262,7 @@ class TaxiBeingTaskFragment : BaseFragment(),
when(order.orderStatus){
TaxiOrderStatusEnum.None.code -> { //无
// TODO("显示无订单页面")
isHaveBeingOrder(false)
}
TaxiOrderStatusEnum.Cancel.code -> { //取消
@@ -263,8 +293,6 @@ class TaxiBeingTaskFragment : BaseFragment(),
R.raw.end_marker
)
}
clearSmallMapRouteLine()
}
TaxiOrderStatusEnum.JourneyCompleted.code -> { //服务完成
taskStatus.text = resources.getString(R.string.task_start_end_site)
@@ -302,7 +330,6 @@ class TaxiBeingTaskFragment : BaseFragment(),
R.raw.end_marker
)
}
clearSmallMapRouteLine()
}
TaxiOrderStatusEnum.OnTheWayToEnd.code -> { //送驾中
taskStatus.text = resources.getString(R.string.task_start_end_site)
@@ -427,25 +454,19 @@ class TaxiBeingTaskFragment : BaseFragment(),
private fun updateUIShowStatus(taskType: Int, currentStatus: Int, order: OrderDetail?) {
when (taskType) {
TaskTypeEnum.VirtualTask.code -> { //演练
taskStatus.visibility = View.VISIBLE
taskTypeTv.visibility = View.VISIBLE
TaskTypeEnum.VirtualTask.code -> { //演练任务
cancelOrder.visibility = View.GONE
orderPhoneAndNum.visibility = View.GONE
startStationName.visibility = View.VISIBLE
endStationName.visibility = View.VISIBLE
taskClickBtn.visibility = View.GONE
// currentStatus 0空闲 1:获取任务 2:开始任务 3:到达目的地
naviToStart.visibility = View.GONE
naviToEnd.visibility = if (currentStatus == 2) View.VISIBLE else View.GONE
taskOtherInfo.visibility = if (currentStatus == 0) View.GONE else View.VISIBLE
naviToEnd.visibility = if (currentStatus >= TaskStatusEnum.StartTask.code) View.VISIBLE else View.GONE
taskOtherInfo.visibility = if (currentStatus == TaskStatusEnum.GetTask.code) View.GONE else View.VISIBLE
}
TaskTypeEnum.ToOrderEndTask.code,TaskTypeEnum.ToOrderStartTask.code -> {// 运营单(接驾任务、送驾任务)
if (order == null) return
taskStatus.visibility = View.VISIBLE
taskTypeTv.visibility = View.VISIBLE
cancelOrder.visibility = View.VISIBLE
orderPhoneAndNum.visibility = View.VISIBLE
startStationName.visibility = View.VISIBLE
endStationName.visibility = View.VISIBLE
taskClickBtn.visibility = View.VISIBLE
// orderStatus: 0 订单创建(为派单), 10 已派上司机(司机去往上车点), 20 司机到达上车点,
// 30 乘客到达上车点, 40 服务中(去往目的地), 50 到达目的地, 60 已完成, 70 已取消
@@ -577,11 +598,6 @@ class TaxiBeingTaskFragment : BaseFragment(),
closeOrderDialog.show()
}
// showNotice(
// mActivity!!.getString(
// R.string.module_och_taxi_new_order
// )
private fun clearOrderTag() {
taskOtherInfo.text = "距离 - - 公里,用时 - - 分"
}
@@ -600,13 +616,10 @@ class TaxiBeingTaskFragment : BaseFragment(),
if (being) {
noTaskData.visibility = View.GONE
mBeingOrderLayout.visibility = View.VISIBLE
// mTaxiFragment!!.changeOperationViewVisible(View.GONE)
clearSmallMapRouteLine()
} else {
noTaskData.visibility = View.VISIBLE
noOrderDataTv.text = "暂无进行中订单"
mBeingOrderLayout.visibility = View.GONE
// mTaxiFragment!!.changeOperationViewVisible(View.VISIBLE)
}
} catch (e: NullPointerException) { //可能会出现订单信息已经轮询回来,但进行中页面控件还未初始化完成的情况
TaxiModel.clearCurrentOCHOrder()
@@ -618,37 +631,20 @@ class TaxiBeingTaskFragment : BaseFragment(),
d(SceneConstant.M_TAXI + TAG, taskStatus.text.toString())
startOrEndService()
} else if (v.id == cancelOrder.id) {
if (mCurrentTaskAndOrder != null && mCurrentTaskAndOrder!!.order != null){
TaxiOrderCancelDialog(mActivity,
mCurrentTaskAndOrder!!.order!!.orderNo,mCurrentTaskAndOrder!!.order!!.orderStatus).show()
}
} else if (v.id == naviToStart.id) {
if (mTaxiFragment != null) {
showNaviToStartStationFragment()
}
} else if (v.id == naviToEnd.id) {
if (mTaxiFragment != null) {
showNaviToEndStationFragment(true)
if (mCurrentTaskAndOrder!!.order != null){
TaxiOrderCancelDialog(mActivity,mCurrentTaskAndOrder!!.order!!.orderStatus
) { type, reason ->
mViewModel.sendUiIntent(UnmannedIntent.CancelOrder(type,reason))
}
.show()
}
} else if (v.id == naviToStart.id || v.id == naviToEnd.id) {
showNaviToEndStationFragment(true)
}
}
/**
* 显示/隐藏 前往乘客上车点的导航
**/
private fun showNaviToStartStationFragment() {
// if (mCurrentTaskAndOrder != null &&
// mCurrentTaskAndOrder!!.order.orderStatus == TaxiOrderStatusEnum.OnTheWayToStart.code
// ) {
// val orderStartStationLat = mCurrentOrder!!.startSiteGcjPoint[1]
// val orderStartStationLng = mCurrentOrder!!.startSiteGcjPoint[0]
// mTaxiFragment!!.showAmapNaviToStationFragment(true)
// startNaviToStation(true, orderStartStationLat, orderStartStationLng)
// }
}
/**
* 显示/隐藏 前往乘客目的地的导航
* 显示/隐藏 前往任务目的地的导航
*
* @param isShow
*/
@@ -656,23 +652,25 @@ class TaxiBeingTaskFragment : BaseFragment(),
mTaxiFragment!!.startNaviToEndStation(isShow)
}
fun onCurrentOrderCancelDone() {
private fun onCurrentOrderCancelDone() {
//去除起终点
if (mCurrentTaskAndOrder != null) {
// setOrRemoveMapMaker(
// false,
// TaxiUnmannedConst.TAXI_START_MAP_MAKER,
// mCurrentOrder!!.startSitePoint,
// R.raw.star_marker
// )
// setOrRemoveMapMaker(
// false,
// TaxiUnmannedConst.TAXI_END_MAP_MAKER,
// mCurrentOrder!!.endSitePoint,
// R.raw.end_marker
// )
if (mCurrentTaskAndOrder != null && mCurrentTaskAndOrder!!.startSite != null
&& mCurrentTaskAndOrder!!.endSite != null) {
setOrRemoveMapMaker(
false,
TAXI_START_MAP_MAKER,
mCurrentTaskAndOrder!!.startSite!!.gcjLat,
mCurrentTaskAndOrder!!.startSite!!.gcjLon,
R.raw.star_marker
)
setOrRemoveMapMaker(
false,
TAXI_END_MAP_MAKER,
mCurrentTaskAndOrder!!.endSite!!.gcjLat,
mCurrentTaskAndOrder!!.endSite!!.gcjLon,
R.raw.end_marker
)
}
clearSmallMapRouteLine()
//提交取消订单后的回调
ToastUtils.showShort("订单取消成功")
//更新界面
@@ -681,10 +679,6 @@ class TaxiBeingTaskFragment : BaseFragment(),
clearOrderTag()
}
private fun clearSmallMapRouteLine() {
// CallerSmpManager.clearPolyline();
}
/**
* 订单流转debug START
*/
@@ -698,11 +692,6 @@ class TaxiBeingTaskFragment : BaseFragment(),
@RequiresApi(Build.VERSION_CODES.N)
override fun onCurrentNaviDistAndTimeChanged(meters: Int, timeInSecond: Long) {
updateDistanceAndTime(meters.toLong(), timeInSecond)
// if (mCurrentTaskAndOrder != null
// && mCurrentTaskAndOrder!!.order.orderStatus == TaxiOrderStatusEnum.OnTheWayToEnd.code
// ) {
// mTaxiFragment!!.reportToEndDisAndTime(meters, timeInSecond)
// }
}
override fun reInitNaviAmap(isPlay: Boolean, isRestart: Boolean) {
@@ -714,42 +703,39 @@ class TaxiBeingTaskFragment : BaseFragment(),
mTaxiFragment!!.showAmapNaviToStationFragment(false)
return
}
// UiThreadHandler.postDelayed({
// if (mCurrentTaskAndOrder != null &&
// mCurrentTaskAndOrder!!.order.orderStatus == TaxiOrderStatusEnum.OnTheWayToStart.code
// ) {
// val orderStartStationLat = mCurrentOrder!!.startSiteGcjPoint[1]
// val orderStartStationLng = mCurrentOrder!!.startSiteGcjPoint[0]
// startNaviToStation(false, orderStartStationLat, orderStartStationLng)
// }
// }, 2000)
// UiThreadHandler.postDelayed({
// if (mCurrentTaskAndOrder != null &&
// mCurrentTaskAndOrder!!.order.orderStatus == TaxiOrderStatusEnum.OnTheWayToStart.code
// ) {
// if (naviToStart.visibility == View.GONE) {
// naviToStart.visibility = View.VISIBLE
// }
// }
// if (mCurrentTaskAndOrder != null &&
// mCurrentTaskAndOrder!!.order.orderStatus == TaxiOrderStatusEnum.OnTheWayToEnd.code
// ) {
// if (naviToEnd.visibility == View.GONE) {
// naviToEnd.visibility = View.VISIBLE
// }
// }
// }, 3000)
UiThreadHandler.postDelayed({
updateRemainDistanceAndTime(false)
}, 2000)
UiThreadHandler.postDelayed({
if (mCurrentTaskAndOrder != null &&
mCurrentTaskAndOrder!!.currentStatus == TaskStatusEnum.GetTask.code
) {
if (naviToStart.visibility == View.GONE) {
naviToStart.visibility = View.VISIBLE
}
}
if (mCurrentTaskAndOrder != null &&
mCurrentTaskAndOrder!!.currentStatus == TaskStatusEnum.StartTask.code
) {
if (naviToEnd.visibility == View.GONE) {
naviToEnd.visibility = View.VISIBLE
}
}
}, 3000)
}
fun onNaviToEndAmap(isShow: Boolean) {
// if (mCurrentOrder != null &&
// mCurrentOrder!!.orderStatus == TaxiOrderStatusEnum.OnTheWayToEnd.code
// ) {
// val orderEndStationLat = mCurrentOrder!!.endSiteGcjPoint[1]
// val orderEndStationLng = mCurrentOrder!!.endSiteGcjPoint[0]
// mTaxiFragment!!.showAmapNaviToStationFragment(isShow)
// startNaviToStation(isShow, orderEndStationLat, orderEndStationLng)
// }
if (mCurrentTaskAndOrder == null) return
mTaxiFragment!!.showAmapNaviToStationFragment(
if (mCurrentTaskAndOrder!!.currentStatus == TaskStatusEnum.StartTask.code)
isShow else true
)
updateRemainDistanceAndTime(
if (mCurrentTaskAndOrder!!.currentStatus == TaskStatusEnum.StartTask.code)
isShow else true
)
}
/**

View File

@@ -1,12 +1,14 @@
package com.mogo.och.taxi.ui
import android.annotation.SuppressLint
import android.os.Build
import android.os.Bundle
import android.text.TextUtils
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.annotation.RequiresApi
import androidx.fragment.app.FragmentTransaction
import androidx.lifecycle.ViewModelProvider
import com.alibaba.android.arouter.launcher.ARouter
@@ -19,7 +21,6 @@ import com.mogo.och.common.module.biz.constant.OchCommonConst
import com.mogo.och.common.module.biz.provider.LoginService
import com.mogo.och.taxi.R
import com.mogo.och.taxi.base.BaseTaxiTabFragment
import com.mogo.och.taxi.constant.TaxiOrderStatusEnum
import com.mogo.och.taxi.model.TaxiModel
import com.mogo.och.taxi.model.TaxiUnmannedViewModel
import com.mogo.och.taxi.network.LoginBusImpl
@@ -28,7 +29,6 @@ import com.mogo.och.taxi.ui.unmanned.UnmannedIntent
import com.mogo.och.taxi.utils.TPRouteDataTestUtils
import kotlinx.android.synthetic.main.taxi_base_fragment.module_mogo_och_operation_status
import kotlinx.android.synthetic.main.taxi_base_fragment.taxi_driver_role_tv
import kotlinx.coroutines.flow.map
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
@@ -241,6 +241,12 @@ class TaxiFragment : BaseTaxiTabFragment<TaxiFragment, TaxiPresenter>(),
}
}
@RequiresApi(Build.VERSION_CODES.N)
fun onCurrentOrderDistToEndChanged(meters: Long, timeInSecond: Long) {
if (null == serverOrdersFragmentWR || serverOrdersFragmentWR!!.get() == null) return
serverOrdersFragmentWR!!.get()!!.onCurrentOrderDistToEndChanged(meters, timeInSecond)
}
private fun testRouteInfoUpload() {
TPRouteDataTestUtils.converToRouteData()
}

View File

@@ -38,20 +38,18 @@ public class TaxiOrderCancelDialog extends AlertDialog implements View.OnClickLi
private static final String TAG = "OCHTaxiOrderCancelDial";
protected WeakReference<Context> contextWeakReference;
private GridView mContentView;
private TextView mCancelCommitTv;
private TextView mDialogCancelTv;
private String mCurrentReason = "";
private ContentAdapter mContentAdapter;
private int mOrderStatus;//1预约单其他为即时单的状态 主要是控制乘客上车 乘客下车这几个选项的显示
private String[] mContentArrays;
private String mOrderNo;
protected TaxiOrderCancelDialog(Context context, String orderNo, int orderStatus) {
private CommitReasonListener mCommitListener = null;
protected TaxiOrderCancelDialog(Context context, int orderStatus,CommitReasonListener commitListener) {
super(context,R.style.OrderCancelDialog);
mOrderNo = orderNo;
this.mOrderStatus = orderStatus;
contextWeakReference = new WeakReference<>(context);
this.mCommitListener = commitListener;
initReasonArray();
}
@@ -86,15 +84,6 @@ public class TaxiOrderCancelDialog extends AlertDialog implements View.OnClickLi
}
}
protected TaxiOrderCancelDialog(Context context, boolean cancelable, OnCancelListener cancelListener) {
super(context, cancelable, cancelListener);
}
protected TaxiOrderCancelDialog(Context context, int themeResId) {
super(context, themeResId);
}
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -122,11 +111,10 @@ public class TaxiOrderCancelDialog extends AlertDialog implements View.OnClickLi
window.setAttributes(params);
}
@RequiresApi(api = Build.VERSION_CODES.M)
private void initView() {
mContentView = findViewById(R.id.module_och_taxi_order_cancel_content_gv);
mCancelCommitTv = findViewById(R.id.order_cancel_commit_tv);
mDialogCancelTv = findViewById(R.id.order_dialog_cancel_tv);
GridView mContentView = findViewById(R.id.module_och_taxi_order_cancel_content_gv);
TextView mCancelCommitTv = findViewById(R.id.order_cancel_commit_tv);
TextView mDialogCancelTv = findViewById(R.id.order_dialog_cancel_tv);
mContentAdapter = new ContentAdapter(contextWeakReference.get(), mContentArrays);
mContentView.setAdapter(mContentAdapter);
mContentView.setSelector(new ColorDrawable(Color.TRANSPARENT));
@@ -140,12 +128,9 @@ public class TaxiOrderCancelDialog extends AlertDialog implements View.OnClickLi
public void onClick(View v) {
if (v.getId() == R.id.order_cancel_commit_tv) {//bt commit
if (!TextUtils.isEmpty(mCurrentReason) && TaxiOrderCancelReasons.getType(mCurrentReason) != 0) {
if (1 == mOrderStatus){//订单
// mOchTaxiFragmentWeak.get().cancelOrderById(mOrderNo, TaxiOrderCancelReasons.getType(mCurrentReason),mCurrentReason);
//todo 取消还未执行的订单
}else {//任务
//todo 取消正在执行的任务
// mOchTaxiFragmentWeak.get().cancelCurOrder(TaxiOrderCancelReasons.getType(mCurrentReason),mCurrentReason);
//todo 取消正在执行的任务
if (mCommitListener != null){
mCommitListener.cancelCurOrder(TaxiOrderCancelReasons.getType(mCurrentReason),mCurrentReason);
}
dismiss();
}else {
@@ -161,13 +146,13 @@ public class TaxiOrderCancelDialog extends AlertDialog implements View.OnClickLi
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
CallerLogger.INSTANCE.d(M_TAXI + TAG,"mCurrentReason ="+ mContentArrays[position]);
mCurrentReason = mContentArrays[position];
// GradientDrawable background = (GradientDrawable) mCancelBt.getBackground();//GradientDrawable是Drawable的子类
// background.setColor(Color.parseColor("#2B6EFF"));
// mCancelBt.setTextColor(Color.parseColor("#FFFFFF"));
// mCancelBt.setClickable(true);
mContentAdapter.notifyCurrentReasons(mCurrentReason);
}
interface CommitReasonListener{
void cancelCurOrder(int type, String reason);
}
class ContentAdapter extends BaseAdapter{
private Context context;

View File

@@ -70,7 +70,7 @@ class TaxiReserveOrderFragment : BaseFragment() {
}
is TaskAndOrderUiState.TASKANDORDER -> {
updateOrderChanged(state.model)
updateOrderChanged(state.taskAndOrder)
}
}
}

View File

@@ -3,10 +3,12 @@ package com.mogo.och.taxi.ui
import android.annotation.SuppressLint
import android.graphics.Color
import android.graphics.Typeface
import android.os.Build
import android.os.Bundle
import android.util.TypedValue
import android.view.View
import android.widget.TextView
import androidx.annotation.RequiresApi
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentPagerAdapter
@@ -155,6 +157,12 @@ class TaxiServerOrdersFragment : BaseFragment(){
beingTaskFragment!!.onNaviToEndAmap(isShow)
}
@RequiresApi(Build.VERSION_CODES.N)
fun onCurrentOrderDistToEndChanged(meters: Long, timeInSecond: Long) {
if (null == beingTaskFragment) return
beingTaskFragment!!.updateDistanceAndTime(meters, timeInSecond)
}
companion object {
const val TAG = "TaxiServerOrdersFragment"
fun newInstance(): TaxiServerOrdersFragment {

View File

@@ -8,29 +8,11 @@ import com.mogo.och.taxi.base.IUiIntent
*/
sealed class UnmannedIntent: IUiIntent{
//获取接单/暂停接单状态
object GetReceivingOrderState : UnmannedIntent()
//开始接单 、 暂停接单
object StartOrPauseReceivingOrder : UnmannedIntent()
//获取当前任务信息
object GetCurrentTask : UnmannedIntent()
//到站获取下一个执行的任务信息
object GetNextTask: UnmannedIntent()
//开始接单后获取要前往的虚拟站点
object GetVirtualStation: UnmannedIntent()
//开始执行任务
object StartTask: UnmannedIntent()
//到达乘客上车点
object ArrivedOrderStartStation: UnmannedIntent()
//到达乘客下车点
object ArrivedOrderEndStation: UnmannedIntent()
//取消订单
class CancelOrder(type: Int, reason: String) : UnmannedIntent()
//订单服务完成
object JourneyCompleted: UnmannedIntent()

View File

@@ -1,27 +1,15 @@
package com.mogo.och.taxi.ui.unmanned
import com.mogo.och.taxi.base.IUiState
import com.mogo.och.taxi.bean.OrderDetail
import com.mogo.och.taxi.bean.QueryCurrentTaskRespBean
import com.mogo.och.taxi.bean.Site
import com.mogo.och.taxi.bean.StartServiceRespBean
sealed class TaskUiState {
object INIT : TaskUiState()
data class SUCCESS(val models: List<Site>) : TaskUiState()
}
sealed class OrderUiState {
object INIT : OrderUiState()
data class SUCCESS(val models: List<OrderDetail>) : OrderUiState()
}
data class UnmannedState(val taskAndOrderUiState: TaskAndOrderUiState) : IUiState
sealed class TaskAndOrderUiState {
object INIT : TaskAndOrderUiState()
data class TASKANDORDER(val model: QueryCurrentTaskRespBean.Result?) : TaskAndOrderUiState()//演练、接驾、送驾任务
data class TASKANDORDER(val taskAndOrder: QueryCurrentTaskRespBean.Result?, val untruthTask: StartServiceRespBean.Result?) : TaskAndOrderUiState()//演练任务、接驾、送驾任务
data class UNTRUTHTASK(val untruthTask: StartServiceRespBean.Result?) : TaskAndOrderUiState()//伪任务
data class ORDERCANCEL(var isCancel: Boolean) : TaskAndOrderUiState()//伪任务
data class ORDERCANCEL(var isCancel: Boolean) : TaskAndOrderUiState()//取消订单
}
data class UnmannedState(val taskAndOrderUiState: TaskAndOrderUiState) : IUiState

View File

@@ -94,6 +94,7 @@
android:layout_width="@dimen/dp_48"
android:layout_height="@dimen/dp_48"
android:src="@drawable/taxi_navi_icon"
app:layout_goneMarginEnd="@dimen/dp_40"
app:layout_constraintRight_toRightOf="@+id/cancelOrder"
app:layout_constraintTop_toTopOf="@+id/startStationName"
app:layout_constraintBottom_toBottomOf="@id/startStationName"/>
@@ -103,6 +104,7 @@
android:layout_width="@dimen/dp_48"
android:layout_height="@dimen/dp_48"
android:src="@drawable/taxi_navi_icon"
app:layout_goneMarginEnd="@dimen/dp_40"
app:layout_constraintRight_toRightOf="@+id/cancelOrder"
app:layout_constraintTop_toTopOf="@+id/endStationName"
app:layout_constraintBottom_toBottomOf="@id/endStationName"/>