Merge branch 'dev_robotaxi-d_230711_3.4.0' into dev_20230708_unmanned_3.5.0

# Conflicts:
#	core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/RomaBusView.kt
#	core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/RomaPassengerView.kt
#	core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/RomaTaxiView.kt
#	core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/ai/AiCloudIdentifyDataManager.kt
#	gradle.properties
This commit is contained in:
wangmingjun
2023-08-01 09:57:11 +08:00
662 changed files with 9613 additions and 9793 deletions

View File

@@ -380,7 +380,7 @@ public class OrderModel {
private final OchAdasStartFailureCallback mAdasStartFailureListener = new OchAdasStartFailureCallback() {
@Override
public void onStartAutopilotFailure(@NotNull String startFailedCode, @NonNull String startFailedMessage) {
BusAnalyticsManager.getInstance().triggerStartAutopilotFailureEventByAdas(startFailedCode, startFailedMessage);
BusAnalyticsManager.INSTANCE.triggerStartAutopilotFailureEventByAdas(startFailedCode, startFailedMessage);
if (mADASStatusCallback != null && !FunctionBuildConfig.isDemoMode){
CallerLogger.INSTANCE.e( M_BUS + TAG, "mAdasStartFailureListener = "+startFailedMessage );
mADASStatusCallback.onStartAdasFailure();
@@ -661,6 +661,13 @@ public class OrderModel {
CallerLogger.INSTANCE.e(M_BUS + TAG, "isPassStartAutopilotCommand = " +
FunctionBuildConfig.isPassStartAutopilotCommand);
if(CallerAutoPilotStatusListenerManager.INSTANCE.getState()
== IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING){
ToastUtils.showShort("自驾中、请勿重复启动");
return;
}
if (!FunctionBuildConfig.isDemoMode && !OCHAdasAbilityManager.getInstance().getAutopilotAbilityStatus()) {
ToastUtils.showLong(OCHAdasAbilityManager.getInstance().getAutopilotUnAbilityReason() +
", 请稍候重试");
@@ -1190,7 +1197,7 @@ public class OrderModel {
}
BusStationBean currentStation = stationList.get(backgroundCurrentStationIndex);
BusStationBean nextStation = stationList.get(backgroundCurrentStationIndex + 1);
BusAnalyticsManager.getInstance().triggerStartAutopilotEvent(isRestart, send,
BusAnalyticsManager.INSTANCE.triggerStartAutopilotEvent(isRestart, send,
currentStation.getName(), nextStation.getName(), currentLineId);
}
@@ -1200,7 +1207,7 @@ public class OrderModel {
}
BusStationBean currentStation = stationList.get(backgroundCurrentStationIndex);
BusStationBean nextStation = stationList.get(backgroundCurrentStationIndex + 1);
BusAnalyticsManager.getInstance().triggerUnableStartAPReasonEvent(
BusAnalyticsManager.INSTANCE.triggerUnableStartAPReasonEvent(
currentStation.getName(), nextStation.getName(), currentLineId,
OCHAdasAbilityManager.getInstance().getAutopilotUnAbilityReason());
}

View File

@@ -1,146 +0,0 @@
package com.mogo.och.bus.util;
import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS;
import android.text.TextUtils;
import com.mogo.cloud.passport.MoGoAiCloudClientConfig;
import com.mogo.commons.debug.DebugConfig;
import com.mogo.eagle.core.data.app.AppConfigInfo;
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener;
import com.mogo.commons.utils.MogoAnalyticUtils;
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager;
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
import com.mogo.eagle.core.utilcode.util.DateTimeUtils;
import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
import com.mogo.och.bus.constant.BusConst;
import java.util.HashMap;
/**
* OCH Bus埋点工具
*
* Created on 2022/3/24
*/
public class BusAnalyticsManager {
private static final class SingletonHolder {
private static final BusAnalyticsManager INSTANCE = new BusAnalyticsManager();
}
public static BusAnalyticsManager getInstance() {
return BusAnalyticsManager.SingletonHolder.INSTANCE;
}
private String mStartAutopilotKey;
private HashMap<String, Object> mStartAutopilotParams = new HashMap<>();
private Runnable startAutopilotRunnable = () -> {
// 15s内未开启上报失败埋点
triggerStartAutopilotFailureEvent("", "15s后app等待超时");
};
public void triggerStartAutopilotFailureEventByAdas(String failCode, String failMsg){
removeWaitingCallback();
triggerStartAutopilotFailureEvent(failCode, failMsg);
}
private void triggerStartAutopilotFailureEvent(String failCode, String failMsg){
if (mStartAutopilotParams.isEmpty()) return;
CallerLogger.INSTANCE.e( M_BUS + "triggerStartAutopilotFailureEvent", failMsg );
if (CallerAutoPilotStatusListenerManager.INSTANCE.getState() !=
IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING){
mStartAutopilotParams.put(BusConst.EVENT_PARAM_START_FAILURE_CODE, failCode);
mStartAutopilotParams.put(BusConst.EVENT_PARAM_START_FAILURE_MSG, failMsg);
}
mStartAutopilotParams.put(BusConst.EVENT_PARAM_START_RESULT
, CallerAutoPilotStatusListenerManager.INSTANCE.getState() ==
IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING);
MogoAnalyticUtils.INSTANCE.track(mStartAutopilotKey, mStartAutopilotParams);
clearStartAutopilotParams();//清空参数数据,防止误传
}
private void removeWaitingCallback() {
if (startAutopilotRunnable != null) {
UiThreadHandler.removeCallbacks(startAutopilotRunnable);
}
}
public void clearStartAutopilotFailureMSG(){
mStartAutopilotParams.put(BusConst.EVENT_PARAM_START_FAILURE_CODE, "");
mStartAutopilotParams.put(BusConst.EVENT_PARAM_START_FAILURE_MSG, "");
}
private void clearStartAutopilotParams(){
mStartAutopilotParams.clear();
}
/**
* 触发'开启自动驾驶'埋点流程
* 开启自动驾驶15s内成功则发送成功埋点否则发送失败埋点
* @param restart false点击'滑动出发'启动)/true接管后点击'自动驾驶'按钮启动)
* @param send 是否直接发送埋点15s内开启成功则直接发送成功埋点
*/
public void triggerStartAutopilotEvent(
boolean restart, boolean send, String startName, String endName, int lineId) {
mStartAutopilotKey = restart ?
BusConst.EVENT_KEY_RESTART_AUTOPILOT : BusConst.EVENT_KEY_START_SERVICE;
String sn = MoGoAiCloudClientConfig.getInstance().getSn();
String plateNum = AppConfigInfo.INSTANCE.getPlateNumber();
String dateTime = DateTimeUtils.getTimeText(
System.currentTimeMillis(), DateTimeUtils.yyyy_MM_dd_HH_mm_ss);
mStartAutopilotParams.put(BusConst.EVENT_PARAM_SN, sn);
mStartAutopilotParams.put(BusConst.EVENT_PARAM_PLATE_NUM, TextUtils.isEmpty(plateNum) ? "" : plateNum);
mStartAutopilotParams.put(BusConst.EVENT_PARAM_ENV_ONLINE,
DebugConfig.getNetMode() == DebugConfig.NET_MODE_RELEASE ? true : false);
mStartAutopilotParams.put(BusConst.EVENT_PARAM_TIME, dateTime);
mStartAutopilotParams.put(BusConst.EVENT_PARAM_START_NAME, startName);
mStartAutopilotParams.put(BusConst.EVENT_PARAM_END_NAME, endName);
mStartAutopilotParams.put(BusConst.EVENT_PARAM_LINE_ID, lineId);
if (send) {
if (mStartAutopilotParams.isEmpty()) return;
// 开启成功,上报埋点
clearStartAutopilotFailureMSG();
removeWaitingCallback();
mStartAutopilotParams.put(BusConst.EVENT_PARAM_START_RESULT, true);
MogoAnalyticUtils.INSTANCE.track(mStartAutopilotKey, mStartAutopilotParams);
clearStartAutopilotParams();//清空参数数据,防止误传
} else {
UiThreadHandler.postDelayed(startAutopilotRunnable, BusConst.LOOP_PERIOD_15S);
}
}
/**
* 触发"无法开启自驾已知异常"埋点
* @param startName
* @param endName
* @param lineId
*/
public void triggerUnableStartAPReasonEvent(String startName, String endName, int lineId,
String reason) {
String sn = MoGoAiCloudClientConfig.getInstance().getSn();
String plateNum = AppConfigInfo.INSTANCE.getPlateNumber();
String dateTime = DateTimeUtils.getTimeText(
System.currentTimeMillis(), DateTimeUtils.yyyy_MM_dd_HH_mm_ss);
HashMap<String, Object> params = new HashMap<>();
params.put(BusConst.EVENT_PARAM_SN, sn);
params.put(BusConst.EVENT_PARAM_PLATE_NUM, TextUtils.isEmpty(plateNum) ? "" : plateNum);
params.put(BusConst.EVENT_PARAM_ENV_ONLINE,
DebugConfig.getNetMode() == DebugConfig.NET_MODE_RELEASE ? true : false);
params.put(BusConst.EVENT_PARAM_TIME, dateTime);
params.put(BusConst.EVENT_PARAM_START_NAME, startName);
params.put(BusConst.EVENT_PARAM_END_NAME, endName);
params.put(BusConst.EVENT_PARAM_LINE_ID, lineId);
params.put(BusConst.EVENT_PARAM_UNABLE_START_REASON, reason);
MogoAnalyticUtils.INSTANCE.track(BusConst.EVENT_KEY_AP_UNABLE_START_REASON, params);
}
}

View File

@@ -0,0 +1,108 @@
package com.mogo.och.bus.util
import android.text.TextUtils
import com.mogo.cloud.passport.MoGoAiCloudClientConfig
import com.mogo.commons.debug.DebugConfig
import com.mogo.commons.utils.MogoAnalyticUtils
import com.mogo.eagle.core.data.app.AppConfigInfo
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager
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.DateTimeUtils
import com.mogo.och.bus.constant.BusConst
import com.mogo.och.common.module.utils.RxUtils
import io.reactivex.disposables.Disposable
/**
* OCH Bus埋点工具
*
* Created on 2022/3/24
*/
object BusAnalyticsManager {
private var mStartAutopilotKey: String? = null
private val mStartAutopilotParams = HashMap<String, Any>()
var startAutopiloTimeOut: Disposable? = null
fun triggerStartAutopilotFailureEventByAdas(failCode: String, failMsg: String) {
RxUtils.disposeSubscribe(startAutopiloTimeOut)
triggerStartAutopilotFailureEvent(failCode, failMsg)
}
private fun clearStartAutopilotParams() {
mStartAutopilotParams.clear()
}
private fun triggerStartAutopilotFailureEvent(failCode: String, failMsg: String) {
if (mStartAutopilotParams.isEmpty()) return
CallerLogger.e(SceneConstant.M_BUS + "triggerStartAutopilotFailureEvent", failMsg)
if (CallerAutoPilotStatusListenerManager.getState() != IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) {
mStartAutopilotParams[BusConst.EVENT_PARAM_START_FAILURE_CODE] = failCode
mStartAutopilotParams[BusConst.EVENT_PARAM_START_FAILURE_MSG] = failMsg
}
mStartAutopilotParams[BusConst.EVENT_PARAM_START_RESULT] =
CallerAutoPilotStatusListenerManager.getState() == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING
MogoAnalyticUtils.track(mStartAutopilotKey, mStartAutopilotParams)
clearStartAutopilotParams() //清空参数数据,防止误传
}
/**
* 触发'开启自动驾驶'埋点流程
* 开启自动驾驶15s内成功则发送成功埋点否则发送失败埋点
* @param restart false点击'滑动出发'启动)/true接管后点击'自动驾驶'按钮启动)
* @param send 是否直接发送埋点15s内开启成功则直接发送成功埋点
*/
fun triggerStartAutopilotEvent(
restart: Boolean, send: Boolean, startName: String, endName: String, lineId: Int
) {
mStartAutopilotKey = if (restart) BusConst.EVENT_KEY_RESTART_AUTOPILOT else BusConst.EVENT_KEY_START_SERVICE
if (send) {
if (mStartAutopilotParams.isEmpty()) return
// 开启成功,上报埋点
mStartAutopilotParams[BusConst.EVENT_PARAM_START_FAILURE_CODE] = ""
mStartAutopilotParams[BusConst.EVENT_PARAM_START_FAILURE_MSG] = ""
RxUtils.disposeSubscribe(startAutopiloTimeOut)
mStartAutopilotParams[BusConst.EVENT_PARAM_START_RESULT] = true
MogoAnalyticUtils.track(mStartAutopilotKey, mStartAutopilotParams)
clearStartAutopilotParams() //清空参数数据,防止误传
} else {
val plateNum = AppConfigInfo.plateNumber
mStartAutopilotParams[BusConst.EVENT_PARAM_SN] = MoGoAiCloudClientConfig.getInstance().sn
mStartAutopilotParams[BusConst.EVENT_PARAM_PLATE_NUM] = if (TextUtils.isEmpty(plateNum)) "" else plateNum
mStartAutopilotParams[BusConst.EVENT_PARAM_ENV_ONLINE] = DebugConfig.getNetMode() == DebugConfig.NET_MODE_RELEASE
mStartAutopilotParams[BusConst.EVENT_PARAM_TIME] = DateTimeUtils.getTimeText(DateTimeUtils.yyyy_MM_dd_HH_mm_ss)
mStartAutopilotParams[BusConst.EVENT_PARAM_START_NAME] = startName
mStartAutopilotParams[BusConst.EVENT_PARAM_END_NAME] = endName
mStartAutopilotParams[BusConst.EVENT_PARAM_LINE_ID] = lineId
startAutopiloTimeOut = RxUtils.createSubscribeOnOwnThread(BusConst.LOOP_PERIOD_15S) {
// 15s内未开启上报失败埋点
triggerStartAutopilotFailureEvent("", "15s后app等待超时")
}
}
}
/**
* 触发"无法开启自驾已知异常"埋点
* @param startName
* @param endName
* @param lineId
*/
fun triggerUnableStartAPReasonEvent(
startName: String, endName: String, lineId: Int,
reason: String
) {
val plateNum = AppConfigInfo.plateNumber
val params = HashMap<String, Any>()
params[BusConst.EVENT_PARAM_SN] = MoGoAiCloudClientConfig.getInstance().sn
params[BusConst.EVENT_PARAM_PLATE_NUM] = if (TextUtils.isEmpty(plateNum)) "" else plateNum
params[BusConst.EVENT_PARAM_ENV_ONLINE] = DebugConfig.getNetMode() == DebugConfig.NET_MODE_RELEASE
params[BusConst.EVENT_PARAM_TIME] = DateTimeUtils.getTimeText(DateTimeUtils.yyyy_MM_dd_HH_mm_ss)
params[BusConst.EVENT_PARAM_START_NAME] = startName
params[BusConst.EVENT_PARAM_END_NAME] = endName
params[BusConst.EVENT_PARAM_LINE_ID] = lineId
params[BusConst.EVENT_PARAM_UNABLE_START_REASON] = reason
MogoAnalyticUtils.track(BusConst.EVENT_KEY_AP_UNABLE_START_REASON, params)
}
}

View File

@@ -93,6 +93,10 @@ public class BusTrajectoryManager {
// 5. 轨迹管理_轨迹下载超时
CallerLogger.INSTANCE.d(M_BUS + TAG, "onAutopilotGuardian() 轨迹下载超时");
// ToastUtils.showShort("轨迹下载超时");
} else if ("ISSM_FUNC_AUTO_PILOT_READY".equals(guardianInfo.getCode())) {
// 收到ssm的自动驾驶变为ready再次下发轨迹下载.解决域控重启或者102域控启动太早107节点初始化未完成导致的轨迹未进行下载。
CallerLogger.INSTANCE.d(M_BUS + TAG, "onAutopilotGuardian() ssm ready再次发起下载");
syncTrajectoryInfo();
}
}

View File

@@ -30,7 +30,7 @@ import com.mogo.och.common.module.manager.loopmanager.LoopInfo
import com.mogo.och.bus.passenger.bean.response.*
import com.mogo.och.bus.passenger.callback.*
import com.mogo.och.bus.passenger.constant.CharterPassengerConst
import com.mogo.och.common.module.manager.loopmanager.BusPassengerModelLoopManager
import com.mogo.och.common.module.manager.loopmanager.BizLoopManager
import com.mogo.och.bus.passenger.net.BusPassengerServiceManager
import com.mogo.och.bus.passenger.utils.ToastCharterUtils
import com.mogo.och.bus.passenger.utils.VoiceFocusManager
@@ -186,12 +186,12 @@ object CharterPassengerModel {
// 2 、打开空调暖风机灯设置页面
// 3、车控页面、
// 4、打开选择线路页面
BusPassengerModelLoopManager.removeLoopFunction(TAGLOGIN)
BizLoopManager.removeLoopFunction(TAGLOGIN)
CallerLogger.d(M_BUS_P + TAG, "结束登录状态轮询")
// 启动订单轮
startOrderLoop()
} else {
BusPassengerModelLoopManager.setLoopFunction(
BizLoopManager.setLoopFunction(
TAGLOGIN,
LoopInfo(3, ::queryLoginStatus)
)
@@ -337,7 +337,7 @@ object CharterPassengerModel {
* 启动订单轮训
*/
private fun startOrderLoop() {
BusPassengerModelLoopManager.setLoopFunction(
BizLoopManager.setLoopFunction(
TAGORDER,
LoopInfo(3, ::queryOrder)
)
@@ -348,7 +348,7 @@ object CharterPassengerModel {
* 启动订单轮训
*/
private fun endOrderLoop() {
BusPassengerModelLoopManager.removeLoopFunction(TAGORDER)
BizLoopManager.removeLoopFunction(TAGORDER)
CallerLogger.d(M_BUS_P + TAG, "结束订单轮询")
}
@@ -489,7 +489,7 @@ object CharterPassengerModel {
* 启动订单轮训
*/
private fun startCarStatusLoop() {
BusPassengerModelLoopManager.setLoopFunction(TAGCARSTATUS, LoopInfo(3, ::queryCarStatus))
BizLoopManager.setLoopFunction(TAGCARSTATUS, LoopInfo(3, ::queryCarStatus))
CallerLogger.d(M_BUS_P + TAG, "启动车态轮询")
}
@@ -497,7 +497,7 @@ object CharterPassengerModel {
* 启动订单轮训
*/
private fun endCarStatusLoop() {
BusPassengerModelLoopManager.removeLoopFunction(TAGCARSTATUS)
BizLoopManager.removeLoopFunction(TAGCARSTATUS)
CallerLogger.d(M_BUS_P + TAG, "结束车态轮询")
}
@@ -548,7 +548,7 @@ object CharterPassengerModel {
* 启动时间校准轮训
*/
private fun startCalibrationLoop() {
BusPassengerModelLoopManager.setLoopFunction(
BizLoopManager.setLoopFunction(
TAGCALIBRATION,
LoopInfo(120, ::queryBusinessTime, immediately = true)
)
@@ -559,7 +559,7 @@ object CharterPassengerModel {
* 停止时间校准轮训
*/
private fun endCalibrationLoop() {
BusPassengerModelLoopManager.removeLoopFunction(TAGCALIBRATION)
BizLoopManager.removeLoopFunction(TAGCALIBRATION)
CallerLogger.d(M_BUS_P + TAG, "结束时间校准轮询")
}
@@ -656,7 +656,7 @@ object CharterPassengerModel {
* 启动路距计算
*/
private fun startCalculateDistanceLoop() {
BusPassengerModelLoopManager.setLoopFunction(TAGDISTANCE, LoopInfo(1, ::calculateDistance))
BizLoopManager.setLoopFunction(TAGDISTANCE, LoopInfo(1, ::calculateDistance))
CallerLogger.d(M_BUS_P + TAG, "开始路距计算")
}
@@ -667,7 +667,7 @@ object CharterPassengerModel {
* ③ 到站成功后
*/
private fun endCalculateDistanceLoop() {
BusPassengerModelLoopManager.removeLoopFunction(TAGDISTANCE)
BizLoopManager.removeLoopFunction(TAGDISTANCE)
CallerLogger.d(M_BUS_P + TAG, "结束路距计算")
}

View File

@@ -20,7 +20,7 @@ import com.mogo.och.bus.passenger.bean.response.SiteInfoResponse
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.manager.loopmanager.BusPassengerModelLoopManager
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.common.module.bean.dpmsg.BaseDPMsg
@@ -102,80 +102,84 @@ class BusPassengerFunctionOrderPresenter(view: M1OrderLineFragment?) :
}
private fun querySitesByLineId(checkLine: LineInfoResponse.LineInfo) {
BusPassengerServiceManager.queryLineSiteList(
context,
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
mView?.siteAdapterEnableIndex(siteInfos.size-1)
}else{
//
val index = if(first==0) {
0
}else if (first <= siteInfos.size-1) {
first-1
} else {
siteInfos.size - 1
context?.let {
BusPassengerServiceManager.queryLineSiteList(
context,
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
mView?.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
mView?.siteAdapterEnableIndex(index)
}
currentSite = siteInfos[index]
currentSite!!.isNear = calculateCurrentSite.second
mView?.siteAdapterEnableIndex(index)
}
siteInfos.forEach {
if (it.siteId == checkSite?.siteId) {
it.isCheck = true
return@forEach
siteInfos.forEach {
if (it.siteId == checkSite?.siteId) {
it.isCheck = true
return@forEach
}
}
}
mView?.siteAdapterSetData(siteInfos)
}
mView?.siteAdapterSetData(siteInfos)
override fun onFail(code: Int, msg: String?) {
ToastCharterUtils.showShort("查询站点失败")
mView?.setVisableByTrun(showNetError = true)
}
override fun onError() {
super.onError()
ToastCharterUtils.showShort("查询站点失败")
mView?.setVisableByTrun(showNetError = true)
}
})
}
}
private fun queryLineList() {
mView?.setVisableByTrun(showLoading = true)
context?.let {
BusPassengerServiceManager.queryLineList(it, object :
OchCommonServiceCallback<LineInfoListResponse> {
override fun onSuccess(data: LineInfoListResponse?) {
if (data?.data == null) return
mView?.setVisableByTrun(showBiz = true)
mView?.lineAdapterSetData(data.data,checkLine)
}
override fun onFail(code: Int, msg: String?) {
ToastCharterUtils.showShort("查询站点失败")
override fun onFail(code: Int, msg: String) {
ToastCharterUtils.showShort("查询线路失败")
mView?.setVisableByTrun(showNetError = true)
}
override fun onError() {
super.onError()
ToastCharterUtils.showShort("查询站点失败")
mView?.setVisableByTrun(showNetError = true)
}
})
}
private fun queryLineList() {
mView?.setVisableByTrun(showLoading = true)
BusPassengerServiceManager.queryLineList(context, object :
OchCommonServiceCallback<LineInfoListResponse> {
override fun onSuccess(data: LineInfoListResponse?) {
if (data?.data == null) return
mView?.setVisableByTrun(showBiz = true)
mView?.lineAdapterSetData(data.data,checkLine)
}
override fun onFail(code: Int, msg: String) {
ToastCharterUtils.showShort("查询线路失败")
mView?.setVisableByTrun(showNetError = true)
}
override fun onError() {
super.onError()
mView?.setVisableByTrun(showNetError = true)
}
})
}
}
override fun onResume(owner: LifecycleOwner) {
@@ -187,7 +191,7 @@ class BusPassengerFunctionOrderPresenter(view: M1OrderLineFragment?) :
CallerLogger.d(M_BUS_P + TAG, "onDestroy")
RxUtils.disposeSubscribe(subscribeSelectLine)
RxUtils.disposeSubscribe(subscribeSelectSite)
BusPassengerModelLoopManager.removeLoopFunction(TAGLINELOOP)
BizLoopManager.removeLoopFunction(TAGLINELOOP)
CharterPassengerModel.setStatusChangeListener(TAG,null)
CallerTelematicListenerManager.removeListener(TAG)
}
@@ -230,7 +234,7 @@ class BusPassengerFunctionOrderPresenter(view: M1OrderLineFragment?) :
mView?.hideDataDriverRefuse()
}
RxUtils.disposeSubscribe(subscribeSelectSite)
BusPassengerModelLoopManager.removeLoopFunction(TAGLINELOOP)
BizLoopManager.removeLoopFunction(TAGLINELOOP)
}
}
}
@@ -270,7 +274,7 @@ class BusPassengerFunctionOrderPresenter(view: M1OrderLineFragment?) :
}
mView?.hideDataWaitDriverMsg()
// 启动查看和司机端链接
BusPassengerModelLoopManager.setLoopFunction(
BizLoopManager.setLoopFunction(
TAGLINELOOP,
LoopInfo(3, ::checkServerStatus)
)
@@ -284,7 +288,7 @@ class BusPassengerFunctionOrderPresenter(view: M1OrderLineFragment?) :
private fun checkServerStatus() {
if (!CallerTelematicManager.getClientConnStatus()) {
ToastCharterUtils.showShort("断开和司机端连接、请联系安全员")
BusPassengerModelLoopManager.removeLoopFunction(TAGLINELOOP)
BizLoopManager.removeLoopFunction(TAGLINELOOP)
mView?.hideDataDriverRefuse()
CallerLogger.d(M_BUS_P + TAG, "endAni666")
}

View File

@@ -1,13 +0,0 @@
package com.mogo.och.bus.passenger.presenter
import com.mogo.och.bus.passenger.ui.dialogfragment.DebugViewWatchDogFragment
import com.mogo.och.bus.passenger.ui.dialogfragment.M1CarUserNoOrderFragment
class DebugWatchDogPresenter(view: DebugViewWatchDogFragment?) :
BusBasePassengerFunctionDevicePresenter<DebugViewWatchDogFragment?>(view){
companion object {
private const val TAG = "BusPassengerFunctionPresenter"
}
}

View File

@@ -9,7 +9,6 @@ import com.amap.api.maps.model.LatLng
import com.mogo.commons.AbsMogoApplication
import com.mogo.commons.mvp.MvpFragment
import com.mogo.eagle.core.data.config.HdMapBuildConfig
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager
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
@@ -25,7 +24,7 @@ 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.presenter.BusPassengerPresenter
import com.mogo.och.bus.passenger.ui.dialogfragment.DebugViewWatchDogFragment
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

View File

@@ -25,6 +25,7 @@ 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.utils.ToastCharterUtils
import com.mogo.och.common.module.biz.constant.LoginStatusManager
import com.mogo.och.common.module.manager.debug.DebugViewWatchDogFragment
import kotlinx.android.synthetic.main.m1_contain_fragment.*
import org.greenrobot.eventbus.EventBus

View File

@@ -2,6 +2,7 @@ package com.mogo.och.bus.passenger.ui.dialogfragment.fragment
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
@@ -31,7 +32,7 @@ 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.common.module.utils.SoundPoolHelper
import com.yangyakun.main.ui.loading.drawable.MineGradientDrawable
import com.mogo.och.common.module.wigets.MineGradientDrawable
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
@@ -476,7 +477,7 @@ class M1SoftFragment :
CallerLogger.d(SceneConstant.M_BUS_P + TAG, "打开暖风")
heaterAirEnable(false)
closeAircondition()//关闭空调
var switch = 1;
val switch: Int
when (rg_setting_windspeed.checkedRadioButtonId) {
R.id.rb_wind_speed_low -> {
rb_wind_speed_middle.tag = touchTag
@@ -615,12 +616,12 @@ class M1SoftFragment :
// region 声音
private var mAudioManager: AudioManager? = null
private var mMaxVolume: Int? = 100;
private var mMaxVolume: Int? = 100
@SuppressLint("NewApi")
private fun setVoiceInfo() {
val dp2px = AutoSizeUtils.dp2px(context, 26f)//进度条高度
R.color.bus_p_m1_47576e
val color2CBFFC = ContextCompat.getColor(requireContext(), R.color.bus_p_m1_2cbffc)
val color1060FF = ContextCompat.getColor(requireContext(), R.color.bus_p_m1_1060ff)
val color96A5C2 = ContextCompat.getColor(requireContext(), R.color.bus_p_m1_96a5c2)
@@ -641,7 +642,7 @@ class M1SoftFragment :
mMaxVolume?.let {
var currnetValue = ((progress.toFloat() / 100) * it).toInt()
if (currnetValue <= 0) {
currnetValue = 1;
currnetValue = 1
}
mAudioManager?.setStreamVolume(
AudioManager.STREAM_MUSIC,

View File

@@ -93,8 +93,8 @@ class ConsultVideoPlayer : StandardGSYVideoPlayer {
// layoutParams.height = 320
// mTopContainer.layoutParams = layoutParams
val background = layoutBottom.background as GradientDrawable
val x = arrayOf(12f, 12f,12f, 12f,12f, 12f,12f, 12f)
background.cornerRadii = x.toFloatArray()
val x = floatArrayOf(12f, 12f,12f, 12f,12f, 12f,12f, 12f)
background.cornerRadii = x
layoutBottom.background = background
//fullscreenButton.setPadding(0,0,0,0)

View File

@@ -78,6 +78,10 @@ object CharterTrajectoryManager {
// 5. 轨迹管理_轨迹下载超时
d(SceneConstant.M_CHARTER_D + TAG, "onAutopilotGuardian() 轨迹下载超时")
// ToastUtils.showShort("轨迹下载超时");
} else if ("ISSM_FUNC_AUTO_PILOT_READY" == guardianInfo.getCode()) {
// 收到ssm的自动驾驶变为ready再次下发轨迹下载.解决域控重启或者102域控启动太早107节点初始化未完成导致的轨迹未进行下载。
d(SceneConstant.M_CHARTER_D + TAG, "onAutopilotGuardian() ssm ready再次发起下载")
syncTrajectoryInfo(get().getBusOrderResult()?.lineId!!)
}
}

View File

@@ -860,4 +860,8 @@ class DriverM1Model {
return mCurrentRoute
}
fun getBusOrderResult(): QueryCurrentOrderResponse.Result?{
return mCurrentOrder
}
}

View File

@@ -2,27 +2,36 @@ package com.mogo.och.common.module.manager;
import android.content.Context;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo;
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotActionsListener;
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatisticsListener;
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;
import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotActionsListenerManager;
import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotStatisticsListenerManager;
import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
import com.mogo.och.common.module.callback.OchAdasStartFailureCallback;
import com.zhjt.mogo.adas.data.bean.AutopilotStatistics;
import mogo.telematics.pad.MessagePad;
import mogo_msg.MogoReportMsg;
import system_master.SystemStatusInfo;
/**
* Created on 2022/10/9
* 工控机状态信息回调(判断是否能否启动自动驾驶的回调)
* 目前定的是3秒回调一次
*/
public class OCHAdasAbilityManager implements IMoGoAutopilotActionsListener, IMoGoAutopilotStatisticsListener {
public class OCHAdasAbilityManager implements IMoGoAutopilotActionsListener, IMoGoAutopilotStatisticsListener, IMoGoAutopilotStatusListener {
private static final String TAG = OCHAdasAbilityManager.class.getSimpleName();
private boolean isAutopilotAbility = true;
private String autopilotAbilityReason = "";
private boolean isAutopilotAbility;
private String autopilotAbilityReason;
private String startFailedCode = "";
private String startFailedMessage = "";
@@ -37,6 +46,7 @@ public class OCHAdasAbilityManager implements IMoGoAutopilotActionsListener, IMo
}
public void init(Context context) {
ipcConnectStatusChanged();
initListeners();
}
@@ -64,11 +74,18 @@ public class OCHAdasAbilityManager implements IMoGoAutopilotActionsListener, IMo
//2022.10.9 工控机状态信息回调(判断是否能否启动自动驾驶的回调), 目前定的是3秒回调一次
CallerAutopilotActionsListenerManager.INSTANCE.addListener(TAG, this);
CallerAutopilotStatisticsListenerManager.INSTANCE.addListener(TAG,this);
CallerAutoPilotStatusListenerManager.INSTANCE.addListener(TAG, this);
}
private void releaseListeners() {
CallerAutopilotActionsListenerManager.INSTANCE.removeListener(this);
CallerAutopilotStatisticsListenerManager.INSTANCE.removeListener(this);
CallerAutoPilotStatusListenerManager.INSTANCE.removeListener(this);
}
private void ipcConnectStatusChanged() {
this.isAutopilotAbility = CallerAutoPilotControlManager.INSTANCE.isConnected();
this.autopilotAbilityReason = isAutopilotAbility ? "" : "未连接自动驾驶系统";
}
@Override
@@ -95,4 +112,41 @@ public class OCHAdasAbilityManager implements IMoGoAutopilotActionsListener, IMo
public void release() {
releaseListeners();
}
@Override
public void onAutopilotIpcConnectStatusChanged(int status, @Nullable String reason) {
ipcConnectStatusChanged();
}
@Override
public void onAutopilotStatusResponse(@NonNull AutopilotStatusInfo autoPilotStatusInfo) {
}
@Override
public void onAutopilotStatusResponse(int state) {
}
@Override
public void onAutopilotDockerInfo(@NonNull String dockerVersion) {
}
@Override
public void onAutopilotArriveAtStation(@Nullable MessagePad.ArrivalNotification arrivalNotification) {
}
@Override
public void onAutopilotSNRequest() {
}
@Override
public void onAutopilotGuardian(@Nullable MogoReportMsg.MogoReportMessage guardianInfo) {
}
@Override
public void onAutopilotStatusRespByQuery(@NonNull SystemStatusInfo.StatusInfo status) {
}
@Override
public void onAutopilotRouteLineId(long lineId) {
}
}

View File

@@ -1,4 +1,4 @@
package com.mogo.och.bus.passenger.ui.dialogfragment
package com.mogo.och.common.module.manager.debug
import android.content.DialogInterface
import android.os.Bundle
@@ -17,10 +17,8 @@ import com.mogo.eagle.core.utilcode.util.AppStateManager
import com.mogo.eagle.core.utilcode.util.BarUtils
import com.mogo.eagle.core.utilcode.util.ClickUtils
import com.mogo.eagle.core.utilcode.util.KeyboardUtils
import com.mogo.och.bus.passenger.utils.ToastCharterUtils
import com.mogo.och.bus.passenger.R
import com.mogo.och.bus.passenger.presenter.DebugWatchDogPresenter
import com.mogo.och.bus.passenger.ui.MainFragment
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.och.common.module.R
import kotlinx.android.synthetic.main.m1_debugview_pass.*
/**
@@ -45,7 +43,7 @@ class DebugViewWatchDogFragment :
actv_password_submit.setOnClickListener {
val text = acet_close.text
if(text==null||text.isEmpty()){
ToastCharterUtils.showShort("请输入密码")
ToastUtils.showShort("请输入密码")
}else{
if(text.toString() == "123987"){
dismissAllowingStateLoss()
@@ -54,7 +52,7 @@ class DebugViewWatchDogFragment :
}
ToggleDebugView.toggleDebugView.toggle(requireContext())
}else{
ToastCharterUtils.showShort("请输入正确密码")
ToastUtils.showShort("请输入正确密码")
}
}
}

View File

@@ -0,0 +1,12 @@
package com.mogo.och.common.module.manager.debug
import com.mogo.commons.mvp.Presenter
class DebugWatchDogPresenter(view: DebugViewWatchDogFragment?) :
Presenter<DebugViewWatchDogFragment?>(view){
companion object {
private const val TAG = "BusPassengerFunctionPresenter"
}
}

View File

@@ -6,7 +6,8 @@ interface IDistanceListener {
/**
* @param distance 距离终点坐标的距离
*/
fun distanceCallback(distance: Float)
fun distanceCallback(distance: Float){}
fun stationDistanceCallback(stationDistance:Float){}
}
interface ITrajectoryListener{

View File

@@ -12,10 +12,11 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.e
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_OCHCOMMON
import com.mogo.eagle.core.utilcode.util.CoordinateUtils
import com.mogo.och.common.module.manager.loopmanager.BusPassengerModelLoopManager
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.CoordinateCalculateRouteUtil
import com.zhjt.service.chain.ChainLog
import io.reactivex.schedulers.Schedulers
import mogo.telematics.pad.MessagePad
import java.util.concurrent.ConcurrentHashMap
@@ -56,8 +57,11 @@ object TrajectoryAndDistanceManager: IMoGoPlanningRottingListener{
@Volatile
private var mRoutePoints: MutableList<MogoLocation>? = ArrayList()
// 0-1 1-2 2-3 各个轨迹点的距离
private var mRoutePointsDistance: MutableList<Float>? = ArrayList()
// 所有轨迹点距离的和
private var maxDistanceAllPoint:Double = 0.0
private val stationDistance: ConcurrentHashMap<String, Float> = ConcurrentHashMap()
@Volatile
private var lineId:Long? = null
@@ -154,14 +158,17 @@ object TrajectoryAndDistanceManager: IMoGoPlanningRottingListener{
this.endStationInfo.stationPoint = null
this.startStationInfo.stationPoint = null
this.lineId = null
stationDistance.clear()
}else{
if(isSameStation(this.startStationInfo.stationPoint,startStationInfo)&&
isSameStation(this.endStationInfo.stationPoint,endStationInfo)){
if(this.lineId!=lineId){
resetStation()
stationDistance.clear()
}
}else{
resetStation()
stationDistance.clear()
}
this.endStationInfo.stationPoint = endStationInfo
this.startStationInfo.stationPoint = startStationInfo
@@ -214,7 +221,9 @@ object TrajectoryAndDistanceManager: IMoGoPlanningRottingListener{
* 启动路距计算
*/
private fun startCalculateDistanceLoop() {
BusPassengerModelLoopManager.setLoopFunction(TAGDISTANCE, LoopInfo(1, ::calculateDistance))
BizLoopManager.setLoopFunction(TAGDISTANCE, LoopInfo(1, ::calculateDistance,
scheduler = Schedulers.computation()
))
d(SceneConstant.M_BUS_P + TAG, "开始路距计算")
}
@@ -222,7 +231,7 @@ object TrajectoryAndDistanceManager: IMoGoPlanningRottingListener{
* 结束启动路距计算
*/
private fun endCalculateDistanceLoop() {
BusPassengerModelLoopManager.removeLoopFunction(TAGDISTANCE)
BizLoopManager.removeLoopFunction(TAGDISTANCE)
d(SceneConstant.M_BUS_P + TAG, "结束路距计算")
}
@@ -269,6 +278,22 @@ object TrajectoryAndDistanceManager: IMoGoPlanningRottingListener{
writeLog(calculateData, locationInfo)
}
try {
if (endStationInfo.stationPoint != null
&& endStationInfo.isNext!= null
&& endStationInfo.index != null
&& endStationInfo.distance != null
&& startStationInfo.stationPoint != null
&& startStationInfo.isNext != null
&& startStationInfo.index != null
&& startStationInfo.distance != null
) {
calculateStationDistance()
}
}catch (e:Exception){
e(M_OCHCOMMON+ TAG,"计算两个站点间的距离")
}
val carLocationInfo:Triple<Int,Boolean?,Float>
if(endStationInfo.isNext==true){
// 计算车的位置在轨迹中的信息 这个是一个变量可以缓存
@@ -331,6 +356,56 @@ object TrajectoryAndDistanceManager: IMoGoPlanningRottingListener{
}
/**
* 计算站点间距离
*/
private fun calculateStationDistance() {
var lastSumLength = 0f
val key = getKey()
if (stationDistance[key] !=null) {
return
}
val stationIndex = endStationInfo.index?:0
if (startStationInfo.index!! < stationIndex-1) {
// subList 是[) 需要的是[]
val subList = mRoutePoints!!.subList(startStationInfo.index!!, stationIndex + 1)
// 轨迹点所有的距离
lastSumLength = CoordinateCalculateRouteUtil.calculateRouteSumLength(subList)
val stationDistance = endStationInfo.distance ?: 0f
if (endStationInfo.isNext == true) {// isNext = true
lastSumLength -= stationDistance
} else {// isNext = false
lastSumLength += stationDistance
}
if (startStationInfo.isNext==true) {// 是否是下一个 true 下一个
lastSumLength += startStationInfo.distance!!
} else {
lastSumLength -= startStationInfo.distance!!
}
} else {
val lastPoints = endStationInfo.stationPoint
lastSumLength = CoordinateUtils.calculateLineDistance(
startStationInfo.stationPoint!!.longitude, startStationInfo.stationPoint!!.latitude,
lastPoints!!.longitude, lastPoints.latitude
)
}
d(M_OCHCOMMON+ TAG,"两站点距离:$lastSumLength")
stationDistance[key] = lastSumLength
if(distanceListeners.size>0) {
distanceListeners.forEach {
//val tag = it.key
val listener = it.value
listener.stationDistanceCallback(lastSumLength)
}
}
}
private fun getKey(): String {
return "${startStationInfo.stationPoint!!.longitude}${startStationInfo.stationPoint!!.latitude}${endStationInfo.stationPoint!!.longitude}${endStationInfo.stationPoint!!.latitude}"
}
private fun invokeDistance(
carLocationInfo: Triple<Int, Boolean?, Float>,

View File

@@ -4,6 +4,7 @@ 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.common.module.utils.RxUtils
import io.reactivex.Observable
import io.reactivex.Observer
import io.reactivex.disposables.Disposable
import io.reactivex.schedulers.Schedulers
import java.util.concurrent.ConcurrentHashMap
@@ -14,7 +15,7 @@ import java.util.concurrent.TimeUnit
*
* 管理轮询逻辑订单轮询新单轮询新单抢单结果轮询等等
*/
object BusPassengerModelLoopManager {
object BizLoopManager {
private val TAG = "BusPassengerModelLoopManager"
@@ -66,8 +67,21 @@ object BusPassengerModelLoopManager {
aLong?.let {
if (it % loopInfo.interval == 0L) {
try {
loopInfo.function.invoke()
CallerLogger.d(TAG, "${aLong}对象${loopInfo}正在执行方法${tag}")
if(loopInfo.scheduler!=null) {
Observable.just(tag).observeOn(loopInfo.scheduler)
.subscribe(object :Observer<String>{
override fun onSubscribe(d: Disposable) {}
override fun onError(e: Throwable) {}
override fun onComplete() {
loopInfo.function.invoke()
CallerLogger.d(TAG, "${aLong}正在执行方法${tag}_${Thread.currentThread().name}")
}
override fun onNext(t: String) {}
})
}else{
loopInfo.function.invoke()
CallerLogger.d(TAG, "${aLong}正在执行方法${tag}_${Thread.currentThread().name}")
}
}catch (e:Throwable){
e.printStackTrace()
CallerLogger.e(TAG,"$tag:--$e")

View File

@@ -1,3 +1,11 @@
package com.mogo.och.common.module.manager.loopmanager
data class LoopInfo(val interval:Long,val function: () -> Unit,val immediately:Boolean=false)
import io.reactivex.Scheduler
/**
* interval 轮训间隔
* function 轮询执行的方法
* immediately 是否立刻执行
* scheduler 轮训执行的线程
*/
data class LoopInfo(val interval:Long,val function: () -> Unit,val immediately:Boolean=false,var scheduler: Scheduler? = null)

View File

@@ -193,57 +193,57 @@ class CommonAmapNaviVIew @JvmOverloads constructor(
amapNaviView.onDestroy()
}
var array = arrayOf(
"直行车道",
"左转车道",
"左转或直行车道",
"右转车道",
"右转或直行车道",
"左掉头车道",
"左转或者右转车道",
" 左转或右转或直行车道",
"右转掉头车道",
"直行或左转掉头车道",
"直行或右转掉头车道",
"左转或左掉头车道",
"右转或右掉头车道",
"直行并且车道扩展",
"左转+左掉头+扩展",
"不可以选择该车道",
"直行+左转+左掉头车道",
"右转+左掉头",
"左转+右转+左掉头",
"直行+右转+左掉头",
"左转+右掉头",
"公交车道",
"空车道",
"可变车道"
)
// var array = arrayOf(
// "直行车道",
// "左转车道",
// "左转或直行车道",
// "右转车道",
// "右转或直行车道",
// "左掉头车道",
// "左转或者右转车道",
// " 左转或右转或直行车道",
// "右转掉头车道",
// "直行或左转掉头车道",
// "直行或右转掉头车道",
// "左转或左掉头车道",
// "右转或右掉头车道",
// "直行并且车道扩展",
// "左转+左掉头+扩展",
// "不可以选择该车道",
// "直行+左转+左掉头车道",
// "右转+左掉头",
// "左转+右转+左掉头",
// "直行+右转+左掉头",
// "左转+右掉头",
// "公交车道",
// "空车道",
// "可变车道"
// )
var actions = arrayOf(
"直行",
"左转",
"左转或直行",
"右转",
"右转或这行",
"左掉头",
"左转或者右转",
" 左转或右转或直行",
"右转掉头",
"直行或左转掉头",
"直行或右转掉头",
"左转或左掉头",
"右转或右掉头",
"直行并且车道扩展",
"左转+左掉头+扩展",
"不可以选择",
"直行+左转+左掉头",
"右转+左掉头",
"左转+右转+左掉头",
"直行+右转+左掉头",
"左转+右掉头",
"公交车道",
"空车道",
"可变车道"
)
// var actions = arrayOf(
// "直行",
// "左转",
// "左转或直行",
// "右转",
// "右转或这行",
// "左掉头",
// "左转或者右转",
// " 左转或右转或直行",
// "右转掉头",
// "直行或左转掉头",
// "直行或右转掉头",
// "左转或左掉头",
// "右转或右掉头",
// "直行并且车道扩展",
// "左转+左掉头+扩展",
// "不可以选择",
// "直行+左转+左掉头",
// "右转+左掉头",
// "左转+右转+左掉头",
// "直行+右转+左掉头",
// "左转+右掉头",
// "公交车道",
// "空车道",
// "可变车道"
// )
}

View File

@@ -1,11 +1,19 @@
package com.mogo.och.common.module.utils
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import io.reactivex.exceptions.UndeliverableException
import io.reactivex.plugins.RxJavaPlugins
import java.io.IOException
import java.util.concurrent.TimeUnit
import io.reactivex.functions.Consumer
object RxUtils {
private const val TAG = "RxUtils"
fun disposeSubscribe(subscribe: Disposable?) {
subscribe?.let {
if (!it.isDisposed) {
@@ -21,6 +29,12 @@ object RxUtils {
function.invoke()
}
}
fun createSubscribeOnOwnThread(delay: Long=2000, function: () -> Unit): Disposable? {
return Observable.timer(delay, TimeUnit.MILLISECONDS)
.subscribe {
function.invoke()
}
}
fun isDisposed(disposable: Disposable?):Boolean{
if(disposable!=null){
@@ -29,4 +43,41 @@ object RxUtils {
return false
}
// 调用Disposable.dispose() 时候会出现InterruptedException 导致出现崩溃
// The exception could not be delivered to the consumer because it has already canceled/disposed the flow or the excTeption has nowhere to go to begin with
fun errCatch(){
RxJavaPlugins.setErrorHandler(Consumer { e ->
if (e is UndeliverableException) {
CallerLogger.d(SceneConstant.M_OCHCOMMON + TAG, "UndeliverableException")
return@Consumer
}
if (e is IOException) { //
// fine, irrelevant network problem or API that throws on cancellation
CallerLogger.d(SceneConstant.M_OCHCOMMON + TAG, "IOException")
return@Consumer
}
if (e is InterruptedException) {
// fine, some blocking code was interrupted by a dispose call
CallerLogger.d(SceneConstant.M_OCHCOMMON + TAG, "InterruptedException")
return@Consumer
}
if (e is NullPointerException || e is IllegalArgumentException) {
// that's likely a bug in the application
CallerLogger.d(
SceneConstant.M_OCHCOMMON + TAG,
"NullPointerException or IllegalArgumentException"
)
Thread.currentThread().uncaughtExceptionHandler?.uncaughtException(Thread.currentThread(), e)
return@Consumer
}
if (e is IllegalStateException) {
// that's a bug in RxJava or in a custom operator
CallerLogger.d(SceneConstant.M_OCHCOMMON + TAG, "IllegalStateException")
Thread.currentThread().uncaughtExceptionHandler?.uncaughtException(Thread.currentThread(), e)
return@Consumer
}
CallerLogger.d(SceneConstant.M_OCHCOMMON + TAG, "Undeliverable exception")
})
}
}

View File

@@ -1,8 +1,7 @@
package com.yangyakun.main.ui.loading.drawable
package com.mogo.och.common.module.wigets
import android.graphics.*
import android.graphics.drawable.Drawable
import android.util.Log
import androidx.core.graphics.toRectF
/**
@@ -18,7 +17,7 @@ class MineGradientDrawable(colorStart: Int = Color.BLUE,colorEnd:Int = Color.RED
private var colorWith = 4f
private var transparentWidth = 4f
private var index = arrayOf(0.53,0.76,0.92)
private var index = doubleArrayOf(0.53,0.76,0.92)
private var tartHeight = 0
private var heightDex = 0
@@ -29,9 +28,8 @@ class MineGradientDrawable(colorStart: Int = Color.BLUE,colorEnd:Int = Color.RED
this.colorStart = colorStart
this.colorEnd = colorEnd
this.tartHeight = height
Color.TRANSPARENT
mPaint.isAntiAlias = true
index.forEachIndexed { index, d ->
index.forEachIndexed { _, d ->
currendDex += (1-d)/2
}
}
@@ -51,14 +49,13 @@ class MineGradientDrawable(colorStart: Int = Color.BLUE,colorEnd:Int = Color.RED
var countstep = 0
while (true){
val rectF = rect.toRectF()
var height = 0f
height = if(rect.height()>tartHeight){
val height: Float = if(rect.height()>tartHeight){
tartHeight.toFloat()
}else{
rectF.bottom - rectF.top
}
// 计算前几个和后几个特殊高度递增和递减
var dex = 0f;
var dex = 0f
if(countstep<currendDex.size){
dex = (height * currendDex[countstep]).toFloat()
}

View File

@@ -2,5 +2,5 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="@dimen/dp_22"/>
<solid android:color="@color/bus_p_m1_e0efff"/>
<solid android:color="@color/common_e0efff"/>
</shape>

View File

@@ -2,5 +2,5 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="@dimen/dp_16"/>
<solid android:color="@color/bus_p_m1_b8c2d7"/>
<solid android:color="@color/common_b8c2d7"/>
</shape>

View File

@@ -2,5 +2,5 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="@dimen/dp_22"/>
<solid android:color="@color/bus_p_m1_b8c2d8"/>
<solid android:color="@color/common_b8c2d8"/>
</shape>

View File

@@ -2,5 +2,5 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="@dimen/dp_16"/>
<solid android:color="@color/bus_p_m1_1466FB"/>
<solid android:color="@color/common_1466FB"/>
</shape>

View File

@@ -4,7 +4,7 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/bus_p_m1_80000000"
android:background="@color/common_80000000"
tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout">
<androidx.appcompat.widget.AppCompatImageView

View File

@@ -14,4 +14,10 @@
<color name="qr_line_bg_color">#66B8BFE8</color>
<color name="qr_bg_color">#3B4577</color>
<color name="common_80000000">#80000000</color>
<color name="common_1466FB">#1466FB</color>
<color name="common_e0efff">#E0EFFF</color>
<color name="common_b8c2d7">#B8C2D7</color>
<color name="common_b8c2d8">#B8C2D8</color>
</resources>

View File

@@ -92,6 +92,10 @@ public class BusTrajectoryManager {
// 5. 轨迹管理_轨迹下载超时
CallerLogger.INSTANCE.d(M_BUS + TAG, "onAutopilotGuardian() 轨迹下载超时");
// ToastUtils.showShort("轨迹下载超时");
} else if ("ISSM_FUNC_AUTO_PILOT_READY".equals(guardianInfo.getCode())) {
// 收到ssm的自动驾驶变为ready再次下发轨迹下载.解决域控重启或者102域控启动太早107节点初始化未完成导致的轨迹未进行下载。
CallerLogger.INSTANCE.d(M_BUS + TAG, "onAutopilotGuardian() ssm ready再次发起下载");
syncTrajectoryInfo();
}
}

View File

@@ -1,21 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.mogo.och.taxi.passenger">
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
<uses-permission android:name="android.permission.WRITE_SETTINGS"
tools:ignore="ProtectedPermissions" />
<application>
<activity
android:name=".ui.video.VideoActivity"
android:launchMode="singleTask"
android:process=":video"
android:theme="@style/ActivityTranslucentVideo"
android:exported="false" />
<service android:name=".mulprocess.EmptyService"
android:process=":video" />
<provider
android:name=".mulprocess.BinderProvider"
android:authorities="com.mogo.och.taxi.passenger.leftmenu"
android:exported="false" />
</application>
</manifest>

View File

@@ -1,12 +0,0 @@
// ICallback.aidl
package com.mogo.och.taxi.passenger.mulprocess;
// Declare any non-default types here with import statements
interface ICallback {
void onResult(long meters, long timeInSecond,float speed);
void postEvent(int type);
}

View File

@@ -1,19 +0,0 @@
// ILeftMenuService.aidl
package com.mogo.och.taxi.passenger.mulprocess;
import com.mogo.och.taxi.passenger.mulprocess.ICallback;
// Declare any non-default types here with import statements
interface ILeftMenuService {
/**
* Pass the selected item to the main process
*/
void transmissionIndex(int index);
void registerCallback(in ICallback cb);
void unRegisterCallback(in ICallback cb);
}

Binary file not shown.

Binary file not shown.

View File

@@ -63,19 +63,6 @@ public class TaxiPassengerOrderQueryRespBean extends BaseData {
public String txtFileMd5DPQP = ""; //轨迹文件md5默认“”
public long contrailSaveTimeDPQP; //上传轨迹完成时间戳ms用于MEC本地手动导入轨迹验证时不会被云端轨迹覆盖
// !!!接口中暂无此字段仅用于本地实现逻辑使用起始站目的站距离km
public double travelDistance;
/**
* @param distance
*/
public void decreaseTravelDistance( double distance ) {
travelDistance = ( ( float ) distance / 1000f );
if ( travelDistance < 0 ) {
travelDistance = 0;
}
}
@Override
public int compareTo(Result o) {
boolean isEqual = this.orderNo.equals(o.orderNo);
@@ -97,7 +84,7 @@ public class TaxiPassengerOrderQueryRespBean extends BaseData {
public int hashCode() {
return Objects.hash(orderNo, orderType, orderStatus, businessType, startSiteId,
startSiteAddr, startSitePoint, startSiteGcjPoint, endSiteId, endSiteAddr,
endSitePoint, endSiteGcjPoint, carNumber, createTime, startTime, travelDistance);
endSitePoint, endSiteGcjPoint, carNumber, createTime, startTime);
}
}
}

View File

@@ -1,20 +0,0 @@
package com.mogo.och.taxi.passenger.callback;
/**
* Created on 2021/9/8
*
* Model->Presenter回调ADAS相关自动驾驶状态回调到达终点等等
*/
public interface IOCHTaxiPassengerADASStatusCallback {
// 自动驾驶触发的已到达目的地:暂未用到
void onAutopilotArriveEnd();
// 自动驾驶可用状态
void onAutopilotEnable();
// 自动驾驶不可用状态
void onAutopilotDisable();
// 自动驾驶运行中
void onAutopilotRunning();
}

View File

@@ -1,18 +0,0 @@
package com.mogo.och.taxi.passenger.callback;
import com.amap.api.maps.model.LatLng;
import com.mogo.eagle.core.data.map.MogoLocation;
import java.util.List;
import mogo.telematics.pad.MessagePad;
/**
* @author: wangmingjun
* @date: 2021/11/1
*/
public interface IOCHTaxiPassengerAutopilotPlanningCallback {
void setLineMarker(LatLng startStation,LatLng endStation);
void routeResultByServer(List<LatLng> routeArriviedTemp, List<LatLng> routeArrivingTemp, MogoLocation location);
void showRottingMapView();
}

View File

@@ -1,15 +0,0 @@
package com.mogo.och.taxi.passenger.callback;
import com.mogo.eagle.core.data.map.MogoLocation;
/**
* Created on 2021/9/10
*
* Model->Presenter回调状态控制器监听accOn、adas ui show、voice ui show、push ui show、v2x ui show等等
*/
public interface IOCHTaxiPassengerControllerStatusCallback {
// 是否vr map模式
void onVRModeChanged(boolean isVRMode);
// 自车定位
void onCarLocationChanged(MogoLocation location);
}

View File

@@ -1,23 +1,21 @@
package com.mogo.och.taxi.passenger.callback;
package com.mogo.och.taxi.passenger.callback
import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRespBean;
import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRespBean
/**
* Created on 2021/9/8
*
* Model->Presenter回调订单相关进行中/待服务单变更当前进行单状态变更新到预约单抢单抢单结果状态等等
*/
public interface IOCHTaxiPassengerOrderStatusCallback {
interface IOCHTaxiPassengerOrderStatusCallback {
// 当前进行单状态变更:新到进行中订单、进行中单状态变更
void onCurrentOrderStatusChanged(TaxiPassengerOrderQueryRespBean.Result order);
fun onCurrentOrderStatusChanged(order: TaxiPassengerOrderQueryRespBean.Result?){}
// 当前位置距离上车点的距离(米)、预估时间(秒)
void onCurrentOrderDistToEndChanged(long meters, long timeInSecond);
//当前路名字
void onCurrentRoadName(String currentRoadName);
fun onCurrentOrderDistToEndChanged(meters: Long, timeInSecond: Long,stationDistance:Int){}
// 司机已确认开启自动驾驶环境
void onDriverHasCheckedPilotCondition(boolean isBoarded);
}
fun onDriverHasCheckedPilotCondition(isBoarded: Boolean){}
fun onMessageGo2OverMapview(){}
}

View File

@@ -1,5 +0,0 @@
package com.mogo.och.taxi.passenger.callback;
public interface ITPClickStartAutopilotCallback {
void onClickCallback();
}

View File

@@ -1,7 +0,0 @@
package com.mogo.och.taxi.passenger.callback;
import com.mogo.och.taxi.passenger.bean.TaxiPassengerScoreUpdateOrderReqBean;
public interface ITaxiPassengerScoreCallback {
void onScoreCallback(TaxiPassengerScoreUpdateOrderReqBean taxiPassengerScoreUpdateOrderReqBean);
}

View File

@@ -20,18 +20,15 @@ class TaxiPassengerConst {
const val LOOP_PERIOD_1S = 1 * 1000L
const val LOOP_DELAY = 100L
// 订单信息
const val SP_KEY_OCH_TAXI_ORDER = "SP_KEY_OCH_TAXI_ORDER"
// 订单总里程
const val SP_KEY_ORDER_SUM_DIS = "SP_KEY_ORDER_SUM_DIS"
//实时查询订单剩余时间 和 剩余里程 轮询间隔2s
const val LOOP_CALCULATEROUTE_2S = 2 * 1000L
// 开始服务启动自动驾驶等待时间(埋点上传)
const val LOOP_PERIOD_15S = 15 * 1000L
const val TAXI_AVERAGE_SPEED = 38
// 埋点key接管后点击'自动驾驶'按钮启动
const val EVENT_KEY_RESTART_AUTOPILOT = "event_key_och_taxi_restart_autopilot"
// 埋点key开始服务开启自动驾驶成功/失败)

View File

@@ -35,7 +35,7 @@ enum class TaxiPassengerOrderStatusEnum(val code: Int) {
companion object {
@JvmStatic
fun valueOf(code: Int): TaxiPassengerOrderStatusEnum? {
fun valueOf(code: Int): TaxiPassengerOrderStatusEnum {
for (value in values()) {
if (value.code == code) {
return value

View File

@@ -1,16 +0,0 @@
package com.mogo.och.taxi.passenger.event;
public class UIStatus {
public static final int LIVE = 0;
public static final int OVERVIEW = 1;
public static final int CONSULT = 2;
public static final int MOVIE = 3;
public int status = LIVE;
public UIStatus(int status) {
this.status = status;
}
}

View File

@@ -0,0 +1,194 @@
package com.mogo.och.taxi.passenger.model
import com.elegant.network.utils.GsonUtil
import com.mogo.commons.voice.AIAssist
import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters
import com.mogo.eagle.core.data.config.FunctionBuildConfig
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
import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager
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.ToastUtils
import com.mogo.och.common.module.biz.network.OchCommonServiceCallback
import com.mogo.och.common.module.manager.OCHAdasAbilityManager
import com.mogo.och.common.module.utils.PinYinUtil
import com.mogo.och.common.module.voice.VoiceNotice
import com.mogo.och.taxi.passenger.bean.TaxiPassengerBaseRespBean
import com.mogo.och.taxi.passenger.bean.TaxiPassengerStartReqBean
import com.mogo.och.taxi.passenger.constant.TaxiPassengerOrderStatusEnum
import com.mogo.och.taxi.passenger.network.TaxiPassengerServiceManager
import com.mogo.och.taxi.passenger.utils.TaxiPassengerAnalyticsManager
object AutopilotManager : IMoGoAutopilotStatusListener {
private const val TAG = "AutopilotManager"
init {
CallerAutoPilotStatusListenerManager.addListener(TAG, this)
}
//检测当前订单
private fun checkCurrentOCHOrder(): Boolean {
return TaxiPassengerModel.currentOCHOrder != null && TaxiPassengerModel.currentOCHOrder!!.startSiteGcjPoint != null && TaxiPassengerModel.currentOCHOrder!!.endSiteGcjPoint != null
}
fun startAutopilot() {
if (!checkCurrentOCHOrder()) {
CallerLogger.e(
SceneConstant.M_TAXI_P + TAG,
"no order or order is empty."
)
ToastUtils.showShort("当前订单不存在或异常!")
return
}
if (TaxiPassengerModel.currentOCHOrder!!.orderStatus == TaxiPassengerOrderStatusEnum.UserArriveAtStart.code) {
startServicePilotDone()
}
if (!FunctionBuildConfig.isDemoMode && !OCHAdasAbilityManager.getInstance().autopilotAbilityStatus) {
ToastUtils.showLong(
OCHAdasAbilityManager.getInstance().autopilotUnAbilityReason +
", 请稍候重试"
)
TaxiPassengerAnalyticsManager.getInstance().triggerUnableStartAPReasonEvent(
TaxiPassengerModel.currentOCHOrder!!.startSiteAddr,
TaxiPassengerModel.currentOCHOrder!!.endSiteAddr,
TaxiPassengerModel.currentOCHOrder!!.orderNo,
OCHAdasAbilityManager.getInstance().autopilotUnAbilityReason
)
return
}
val parameters = initAutopilotControlParameters()
if (parameters == null) {
CallerLogger.d(
SceneConstant.M_TAXI_P + TAG,
"AutopilotControlParameters is empty."
)
return
}
CallerAutoPilotControlManager.startAutoPilot(parameters)
CallerLogger.d(
SceneConstant.M_TAXI_P + TAG,
"start autopilot with parameter: %s",
GsonUtil.jsonFromObject(parameters)
+ " ,startSiteName=" + TaxiPassengerModel.currentOCHOrder!!.startSiteAddr
+ " ,endSiteName=" + TaxiPassengerModel.currentOCHOrder!!.endSiteAddr
)
TaxiPassengerAnalyticsManager.getInstance().triggerStartAutopilotEvent(
false,
false,
TaxiPassengerModel.currentOCHOrder!!.startSiteAddr,
TaxiPassengerModel.currentOCHOrder!!.endSiteAddr,
TaxiPassengerModel.currentOCHOrder!!.orderNo
)
}
private fun initAutopilotControlParameters(): AutopilotControlParameters? {
if (!checkCurrentOCHOrder()) {
CallerLogger.e(
SceneConstant.M_TAXI_P + TAG,
"no order or order is empty."
)
ToastUtils.showShort("当前订单不存在或异常!")
return null
}
val parameters = AutopilotControlParameters()
val startWgsLon = TaxiPassengerModel.currentOCHOrder!!.startSitePoint[0]
val startWgsLat = TaxiPassengerModel.currentOCHOrder!!.startSitePoint[1]
val endWgsLon = TaxiPassengerModel.currentOCHOrder!!.endSitePoint[0]
val endWgsLat = TaxiPassengerModel.currentOCHOrder!!.endSitePoint[1]
parameters.vehicleType = TaxiPassengerModel.currentOCHOrder!!.businessType
parameters.startName =
PinYinUtil.getPinYinHeadChar(TaxiPassengerModel.currentOCHOrder!!.startSiteAddr) // 起点名称拼音首字母大写科学城B区2号门KXCBQ2HM
parameters.endName =
PinYinUtil.getPinYinHeadChar(TaxiPassengerModel.currentOCHOrder!!.endSiteAddr) // 终点名称拼音首字母大写科学城C区三号门KXCCQSHM
parameters.startLatLon =
AutopilotControlParameters.AutoPilotLonLat(startWgsLat, startWgsLon)
parameters.endLatLon = AutopilotControlParameters.AutoPilotLonLat(endWgsLat, endWgsLon)
if (parameters.autoPilotLine == null) {
parameters.autoPilotLine = AutopilotControlParameters.AutoPilotLine(
TaxiPassengerModel.currentOCHOrder!!.lineId,
TaxiPassengerModel.currentOCHOrder!!.csvFileUrl,
TaxiPassengerModel.currentOCHOrder!!.csvFileMd5,
TaxiPassengerModel.currentOCHOrder!!.txtFileUrl,
TaxiPassengerModel.currentOCHOrder!!.txtFileMd5,
TaxiPassengerModel.currentOCHOrder!!.contrailSaveTime,
TaxiPassengerModel.currentOCHOrder!!.carModel,
TaxiPassengerModel.currentOCHOrder!!.csvFileUrlDPQP,
TaxiPassengerModel.currentOCHOrder!!.csvFileMd5DPQP,
TaxiPassengerModel.currentOCHOrder!!.txtFileUrlDPQP,
TaxiPassengerModel.currentOCHOrder!!.txtFileMd5DPQP,
TaxiPassengerModel.currentOCHOrder!!.contrailSaveTimeDPQP
)
}
return parameters
}
/**
* 将业务订单信息保存,鹰眼可取用
*/
fun updateAutopilotControlParameters() {
val parameters = initAutopilotControlParameters()
if (null == parameters) {
CallerLogger.e(
SceneConstant.M_TAXI_P + TAG,
"AutopilotControlParameters is empty."
)
return
}
CallerLogger.d(
SceneConstant.M_TAXI_P + TAG,
"AutopilotControlParameters is update."
)
CallerAutoPilotStatusListenerManager.updateAutopilotControlParameters(parameters)
}
fun clearAutopilotControlParameters() {
CallerLogger.d(
SceneConstant.M_TAXI_P + TAG,
"AutopilotControlParameters is clear."
)
CallerAutoPilotStatusListenerManager.updateAutopilotControlParameters(null)
}
override fun onAutopilotStatusResponse(state: Int) {
// 启动自驾成功
when (state) {
IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING -> {
if (TaxiPassengerModel.currentOCHOrder != null && TaxiPassengerModel.curOrderStatus === TaxiPassengerOrderStatusEnum.UserArriveAtStart) {
TaxiPassengerAnalyticsManager.getInstance().triggerStartAutopilotEvent(
false,
true,
TaxiPassengerModel.currentOCHOrder!!.startSiteAddr,
TaxiPassengerModel.currentOCHOrder!!.endSiteAddr,
TaxiPassengerModel.currentOCHOrder!!.orderNo
)
startServicePilotDone()
}
}
else -> {}
}
}
/**
* 乘客屏启动自动驾驶成功
*/
fun startServicePilotDone() {
if (TaxiPassengerModel.currentOCHOrder == null) return
val result = TaxiPassengerStartReqBean.Result()
val currentLocation = CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02()
result.lat = currentLocation.latitude
result.lon = currentLocation.longitude
TaxiPassengerServiceManager.startServicePilotDone(
TaxiPassengerModel.currentOCHOrder!!.orderNo, result,
object : OchCommonServiceCallback<TaxiPassengerBaseRespBean> {
override fun onSuccess(data: TaxiPassengerBaseRespBean) {
VoiceNotice.showNotice("坐稳扶好,我们出发咯!", AIAssist.LEVEL2)
}
override fun onFail(code: Int, msg: String) {}
})
}
}

View File

@@ -1,125 +0,0 @@
package com.mogo.och.taxi.passenger.model;
import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI_P;
import android.content.Context;
import com.amap.api.services.core.AMapException;
import com.amap.api.services.core.LatLonPoint;
import com.amap.api.services.geocoder.GeocodeResult;
import com.amap.api.services.geocoder.GeocodeSearch;
import com.amap.api.services.geocoder.RegeocodeQuery;
import com.amap.api.services.geocoder.RegeocodeResult;
import com.amap.api.services.geocoder.RegeocodeRoad;
import com.mogo.eagle.core.network.utils.GsonUtil;
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerNaviChangedCallback;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
/**
* @author: wangmingjun
* @date: 2021/12/6
*/
public class TaxiPassengerGeocodeSearchModel implements GeocodeSearch.OnGeocodeSearchListener {
private final String TAG = TaxiPassengerGeocodeSearchModel.class.getSimpleName();
private static Context mContext;
private IOCHTaxiPassengerNaviChangedCallback mNaviChangedCallback;
GeocodeSearch mGeocodeSearch = null;
private String roadName = "";
private Timer timer ;
TimerTask timerTask;
public static TaxiPassengerGeocodeSearchModel getInstance(Context context) {
mContext = context;
return SingletonHolder.INSTANCE;
}
private static final class SingletonHolder {
private static final TaxiPassengerGeocodeSearchModel INSTANCE = new TaxiPassengerGeocodeSearchModel();
}
private TaxiPassengerGeocodeSearchModel(){
}
public void initGeocodeSearch(){
//通过经纬度逆地理编码得到位置
try {
mGeocodeSearch = new GeocodeSearch(mContext);
mGeocodeSearch.setOnGeocodeSearchListener(this);
} catch (AMapException e) {
e.printStackTrace();
}
timer = new Timer();
timerTask = new TimerTask() {
@Override
public void run() {
if (mNaviChangedCallback != null){
CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "roadName道路名称: " + roadName);
mNaviChangedCallback.onCurrentRoadName(roadName);
}
}
};
try{
timer.schedule(timerTask,500,2000);
}catch (Exception e){
e.printStackTrace();
}
}
public void searchLocationInfo(double lat, double lon){
if (null != mGeocodeSearch){
LatLonPoint latLng = new LatLonPoint(lat, lon);
//第一个参数表示一个Latlng第二参数表示范围多少米第三个参数表示是火系坐标系还是GPS原生坐标系
RegeocodeQuery query = new RegeocodeQuery(latLng, 200, GeocodeSearch.AMAP);
mGeocodeSearch.getFromLocationAsyn(query);
}
}
public void destroyGeocodeSearch(){
CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "destroyGeocodeSearch");
if (mGeocodeSearch != null){
mGeocodeSearch = null;
}
if (mNaviChangedCallback != null){
mNaviChangedCallback = null;
}
if (null != timer){
timer.cancel();
}
if (null != timerTask){
timerTask = null;
}
roadName = "";
}
public void setOCHTaciNaviChangedCallback(IOCHTaxiPassengerNaviChangedCallback callback){
this.mNaviChangedCallback = callback;
}
@Override
public void onRegeocodeSearched(RegeocodeResult regeocodeResult, int i) {//更新频率几十 ms, 暂定更新UI为2s一次
if (regeocodeResult != null) {
List<RegeocodeRoad> roads = regeocodeResult.getRegeocodeAddress().getRoads();
CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "位置roads" + GsonUtil.jsonFromObject(roads));
if (roads != null && roads.size() > 0){
roadName = roads.get(0).getName();//当前路的名字
// mNaviChangedCallback.onCurrentRoadName(roads.get(0).getName());
}
}
}
@Override
public void onGeocodeSearched(GeocodeResult geocodeResult, int i) {
}
}

View File

@@ -0,0 +1,385 @@
package com.mogo.och.taxi.passenger.model
import android.annotation.SuppressLint
import android.content.Context
import android.net.ConnectivityManager
import com.mogo.aicloud.services.socket.MogoAiCloudSocketManager
import com.mogo.commons.module.intent.IMogoIntentListener
import com.mogo.commons.module.intent.IntentManager
import com.mogo.commons.voice.AIAssist
import com.mogo.eagle.core.data.map.MogoLocation
import com.mogo.eagle.core.function.api.datacenter.msgbox.IMsgBoxEventListener
import com.mogo.eagle.core.function.call.biz.CallerFuncBizManager
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxEventListenerManager
import com.mogo.eagle.core.function.call.order.CallerOrderListenerManager
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.Companion.M_TAXI_P
import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr
import com.mogo.eagle.core.utilcode.util.NetworkUtils
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.och.common.module.biz.network.OchCommonServiceCallback
import com.mogo.och.common.module.callback.OchAdasStartFailureCallback
import com.mogo.och.common.module.manager.AbnormalFactorsLoopManager
import com.mogo.och.common.module.manager.OCHAdasAbilityManager
import com.mogo.och.common.module.manager.distancemamager.IDistanceListener
import com.mogo.och.common.module.manager.distancemamager.TrajectoryAndDistanceManager
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.RxUtils
import com.mogo.och.common.module.voice.VoiceNotice
import com.mogo.och.taxi.passenger.bean.TaxiPassengerBaseRespBean
import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRemainingResp
import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRespBean
import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrdersInServiceQueryRespBean
import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerOrderStatusCallback
import com.mogo.och.taxi.passenger.callback.ITaxiPassengerCommonCallback
import com.mogo.och.taxi.passenger.constant.TaxiPassengerConst
import com.mogo.och.taxi.passenger.constant.TaxiPassengerOrderStatusEnum
import com.mogo.och.taxi.passenger.constant.TaxiPassengerOrderStatusEnum.Companion.valueOf
import com.mogo.och.taxi.passenger.network.TaxiPassengerServiceManager
import com.mogo.och.taxi.passenger.utils.TaxiPassengerAnalyticsManager
import java.util.concurrent.ConcurrentHashMap
/**
* Created by pangfan on 2021/8/19
*
* 网约车 - 出租车业务逻辑处理
*/
@SuppressLint("StaticFieldLeak")
object TaxiPassengerModel {
private var mContext: Context? = null
private val TAG = TaxiPassengerModel::class.java.simpleName
private const val STARTREADYTOAUTOPILOT = "startReadyToAutopilot"
private const val MINANDWAITSERVICE = "mInAndWaitService"
private const val MQUERYORDERREMAINING = "mQueryOrderRemaining"
// 获取当前订单
@Volatile
var currentOCHOrder: TaxiPassengerOrderQueryRespBean.Result? = null//当前订单
private val mOrderStatusCallbackMap: MutableMap<String, IOCHTaxiPassengerOrderStatusCallback> = ConcurrentHashMap()
fun setOrderStatusCallback(tag: String?, callback: IOCHTaxiPassengerOrderStatusCallback?) {
if (tag == null || "" == tag) return
if (callback == null) {
mOrderStatusCallbackMap.remove(tag)
return
}
mOrderStatusCallbackMap[tag] = callback
}
fun init(context: Context) {
mContext = context.applicationContext
initListeners()
RxUtils.errCatch()
startOrStopOrderLoop()
}
/**
* 订单轮询 初始化主Fragment的Presenter init 调用
*/
private fun startOrStopOrderLoop() {
if (NetworkUtils.isConnected(mContext)) {
startOrStopOrderLoop(true)
}
}
/**
* 关闭订单轮训 页面摧毁时
*/
fun release() {
startOrStopOrderLoop(false)
//startOrStopQueryOrderRemaining(false)
releaseListeners()
}
private fun initListeners() {
// 2021.11.1重构自动驾驶 实现接口 IMoGoAutopilotStatusListener 注册监听 替换IMogoAdasOCHCallback接口
IntentManager.getInstance().registerIntentListener(ConnectivityManager.CONNECTIVITY_ACTION, mNetWorkIntentListener)
AbnormalFactorsLoopManager.startLoopAbnormalFactors(mContext!!)
//开启自驾后 异常信息返回
OCHAdasAbilityManager.getInstance().setAdasStartFailureCallback(mAdasStartFailureListener)
CallerMsgBoxEventListenerManager.addListener(TAG, iMsgBoxEventListener)
TrajectoryAndDistanceManager.addDistanceListener(TAG, distanceListener)
}
private fun releaseListeners() {
MogoAiCloudSocketManager.getInstance(mContext).unregisterLifecycleListener(10010)
AbnormalFactorsLoopManager.stopLoopAbnormalFactors()
OCHAdasAbilityManager.getInstance().setAdasStartFailureCallback(null)
CallerMsgBoxEventListenerManager.removeListener(iMsgBoxEventListener)
TrajectoryAndDistanceManager.removeListener(TAG)
}
/**
* 订单轮训
* @param start true 开启订单轮训
* false 关闭订单轮训
*/
private fun startOrStopOrderLoop(start: Boolean) {
d(M_TAXI_P + TAG, "startOrStopOrderLoop() $start")
if (start) {
BizLoopManager.setLoopFunction(MINANDWAITSERVICE,LoopInfo(2, TaxiPassengerModel::queryInAndWaitOrders))
} else {
BizLoopManager.removeLoopFunction(MINANDWAITSERVICE)
}
}
/**
* 查询订单状态:进行中/待服务轮询防止因crash导致应用重启、断网没收到推送等
*
* 注只有在本地缓存mCurrentOCHOrder为null时已完成or已取消有明确结果或id相同且status不同时
* 才更新最新进行中单到本地
*/
private fun queryInAndWaitOrders() {
TaxiPassengerServiceManager.queryOrdersInAndWaitService(
object : OchCommonServiceCallback<TaxiPassengerOrdersInServiceQueryRespBean> {
override fun onSuccess(data: TaxiPassengerOrdersInServiceQueryRespBean) {
if (data.data == null) {
if(currentOCHOrder!=null){
queryCurOrderStatus()
}
return
}
//1. 处理进行中订单
if (data.data.servicing != null && data.data.servicing.isNotEmpty()) {
// 1.1. 当存在进行中单时对本地currentOrder进行更新
val currentOrder = data.data.servicing[0]
if(currentOCHOrder==null||currentOCHOrder?.orderStatus!=currentOrder.orderStatus){
currentOCHOrder = currentOrder
orderStatusChange()
}else {
currentOCHOrder = currentOrder
}
}else{
if(currentOCHOrder!=null){
queryCurOrderStatus()
}
}
}
override fun onError() {
e(M_TAXI_P + TAG, "queryInAndWaitOrders onError")
}
override fun onFail(code: Int, msg: String) {
e(M_TAXI_P + TAG, "queryInAndWaitOrders$code$msg")
}
})
}
//仅用于轮询时查到本地有mCurrentOCHOrder但请求结果无进行中单or orderId不一致是复查本地currentOrder
private fun queryCurOrderStatus() {
currentOCHOrder?.orderNo?.let {
TaxiPassengerServiceManager.queryOrderById(
mContext!!, it,
object : OchCommonServiceCallback<TaxiPassengerOrderQueryRespBean> {
override fun onSuccess(data: TaxiPassengerOrderQueryRespBean) {
if (data.data != null && currentOCHOrder != null && currentOCHOrder!!.orderNo == data.data.orderNo) {
if (data.data.orderStatus == TaxiPassengerOrderStatusEnum.Cancel.code || data.data.orderStatus == TaxiPassengerOrderStatusEnum.JourneyCompleted.code || data.data.orderStatus == TaxiPassengerOrderStatusEnum.None.code) {
currentOCHOrder = data.data
orderStatusChange()
currentOCHOrder = null
} else {
currentOCHOrder = data.data
orderStatusChange()
}
}
}
override fun onFail(code: Int, msg: String) {}
})
}
}
// 获取当前订单状态
val curOrderStatus: TaxiPassengerOrderStatusEnum
get() {
val order: TaxiPassengerOrderQueryRespBean.Result =
currentOCHOrder
?: return TaxiPassengerOrderStatusEnum.None
return valueOf(order.orderStatus)
}
//监听网络变化,避免启动机器时无网导致无法更新订单信息
private val distanceListener: IDistanceListener = object : IDistanceListener {
var allDistance = 0f
override fun stationDistanceCallback(stationDistance: Float) {
allDistance = stationDistance
}
override fun distanceCallback(distance: Float) {
val lastTime: Double = distance / TaxiPassengerConst.TAXI_AVERAGE_SPEED * 3.6 //秒
for (callback in mOrderStatusCallbackMap.values) {
callback.onCurrentOrderDistToEndChanged(distance.toLong(),lastTime.toLong(),allDistance.toInt())
}
}
}
private val mNetWorkIntentListener = IMogoIntentListener { intentStr, intent ->
d(M_TAXI_P + TAG, "onIntentReceived = %s", intentStr)
if (ConnectivityManager.CONNECTIVITY_ACTION == intentStr) {
if (NetworkUtils.isConnected(mContext)) {
startOrStopOrderLoop(true)
}
}
}
private val mAdasStartFailureListener: OchAdasStartFailureCallback = object : OchAdasStartFailureCallback {
override fun onStartAutopilotFailure(startFailedCode: String, startFailedMessage: String) {
TaxiPassengerAnalyticsManager.getInstance().triggerStartAutopilotFailureEventByAdas(startFailedCode, startFailedMessage)
}
}
private val iMsgBoxEventListener: IMsgBoxEventListener = object : IMsgBoxEventListener {
override fun onSummaryClickEvent() {
if (currentOCHOrder == null) {
ToastUtils.showLong("行程已结束")
} else {
for (callback in mOrderStatusCallbackMap.values) {
callback.onMessageGo2OverMapview()
}
}
}
}
fun checkPhoneAndUpdateStatus(
phoneTail: String?,
commonCallback: ITaxiPassengerCommonCallback?
) {
if (currentOCHOrder == null) return
TaxiPassengerServiceManager.checkPhoneAndUpdateOrderStatus(
currentOCHOrder!!.orderNo,
phoneTail, object : OchCommonServiceCallback<TaxiPassengerBaseRespBean> {
override fun onSuccess(data: TaxiPassengerBaseRespBean) {
if (data.code == 0 && currentOCHOrder != null) {
currentOCHOrder!!.orderStatus = TaxiPassengerOrderStatusEnum.UserArriveAtStart.code
//乘客验证成功,更新订单状态为 "乘客已上车", 立马弹出乘客开始行程页面,不再等待轮询
orderStatusChange()
VoiceNotice.showNotice("验证成功!关闭车门并佩戴安全带后开启行程吧!", AIAssist.LEVEL2)
}
commonCallback?.onCommonCallback()
}
override fun onFail(code: Int, msg: String) {
ToastUtils.showLong("当前网络异常,请重新验证;若始终异常,请您在手机端取消行程,给您带来不便,十分抱歉!")
e(
M_TAXI_P + TAG,
"提交用户输入的手机后4位、并进行状态扭转 后台结果错误$code$msg"
)
}
})
}
fun orderStatusChange(){
orderStatusChangeInner()
if (mOrderStatusCallbackMap.isNotEmpty()) {
d(M_TAXI_P + TAG, "最新的状态${curOrderStatus}")
for (callback in mOrderStatusCallbackMap.values) {
callback.onCurrentOrderStatusChanged(currentOCHOrder)
}
}
}
private fun orderStatusChangeInner() {
when (curOrderStatus) {
TaxiPassengerOrderStatusEnum.OnTheWayToStart -> {
}
TaxiPassengerOrderStatusEnum.ArriveAtStart -> {
}
TaxiPassengerOrderStatusEnum.UserArriveAtStart -> {
//开启轮询司机是否已准备好开启自动驾驶的环境
setStation()
}
TaxiPassengerOrderStatusEnum.OnTheWayToEnd -> {
CallerFuncBizManager.bizProvider.queryV2XEvents() //全览模式的V2X事件轮询开始
//startOrStopQueryOrderRemaining(true)
AutopilotManager.updateAutopilotControlParameters()
startOrStopReadyToAutopilotLoop(false)
setStation()
CallerOrderListenerManager.invokeOrderStatus(true)
}
TaxiPassengerOrderStatusEnum.ArriveAtEnd -> {
AutopilotManager.clearAutopilotControlParameters()
//startOrStopQueryOrderRemaining(false)
CallerOrderListenerManager.invokeOrderStatus(false)
cleanStation()
}
TaxiPassengerOrderStatusEnum.JourneyCompleted -> {
AutopilotManager.clearAutopilotControlParameters()
//startOrStopQueryOrderRemaining(false)
cleanStation()
}
TaxiPassengerOrderStatusEnum.Cancel -> {
AutopilotManager.clearAutopilotControlParameters()
//startOrStopQueryOrderRemaining(false)
startOrStopReadyToAutopilotLoop(false)
cleanStation()
}
TaxiPassengerOrderStatusEnum.None -> TODO()
}
}
/**
* 查询司机是否已确认可开启自动驾驶
*/
private fun loopQueryPilotStatus() {
if (currentOCHOrder == null) return
TaxiPassengerServiceManager.queryPilotStatus(
currentOCHOrder!!.orderNo,
object : OchCommonServiceCallback<TaxiPassengerBaseRespBean> {
override fun onSuccess(data: TaxiPassengerBaseRespBean) {
if (data.code == 0 && data.data == true) {
updateAutopilotStatus(true)
startOrStopReadyToAutopilotLoop(false)
}
}
override fun onFail(code: Int, msg: String) {
updateAutopilotStatus(false)
}
})
}
fun updateAutopilotStatus(isBoarded: Boolean) {
if (mOrderStatusCallbackMap.isNotEmpty()) {
for (callback in mOrderStatusCallbackMap.values) {
callback.onDriverHasCheckedPilotCondition(isBoarded)
}
}
}
fun startOrStopReadyToAutopilotLoop(isStart: Boolean) {
if (isStart) {
BizLoopManager.setLoopFunction(STARTREADYTOAUTOPILOT, LoopInfo(1, TaxiPassengerModel::loopQueryPilotStatus))
CallerLogger.i(M_TAXI_P + TAG, "startReadyToAutopilot()")
} else {
BizLoopManager.removeLoopFunction(STARTREADYTOAUTOPILOT)
CallerLogger.i(M_TAXI_P + TAG, "stopReadyToAutopilot()")
}
}
fun setStation() {
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]
TrajectoryAndDistanceManager.setStationPoint(startStation, endStation, currentOCHOrder!!.lineId)
}
}
fun cleanStation() {
TrajectoryAndDistanceManager.setStationPoint(null, null, -1L)
}
}

View File

@@ -1,114 +0,0 @@
package com.mogo.och.taxi.passenger.model;
import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI_P;
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
import com.mogo.och.taxi.passenger.constant.TaxiPassengerConst;
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 TaxiPassengerModelLoopManager {
private static final String TAG = TaxiPassengerModelLoopManager.class.getSimpleName();
private static final class SingletonHolder {
private static final TaxiPassengerModelLoopManager INSTANCE = new TaxiPassengerModelLoopManager();
}
public static TaxiPassengerModelLoopManager getInstance() {
return SingletonHolder.INSTANCE;
}
private Disposable mInAndWaitServiceDisposable; //进行中、待服务订单列表轮询
private Disposable mQueryOrderRemainingDisposable; //心跳轮询
private CompositeDisposable mRouteWipeDisposable; //轨迹擦除
private Disposable mReadyToAutopilotDisposable; //轮询是否可开启自动驾驶
public void startReadyToAutopilot() {
if (mReadyToAutopilotDisposable != null && !mReadyToAutopilotDisposable.isDisposed()) {
return;
}
CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "startReadyToAutopilot()");
mReadyToAutopilotDisposable = Observable.interval(TaxiPassengerConst.LOOP_DELAY,
TaxiPassengerConst.LOOP_PERIOD_1S, TimeUnit.MILLISECONDS)
.map((aLong -> aLong + 1))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(aLong -> TaxiPassengerModel.getInstance().loopQueryPilotStatus());
}
public void stopReadyToAutopilot() {
if (mReadyToAutopilotDisposable != null) {
CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "stopReadyToAutopilot()");
mReadyToAutopilotDisposable.dispose();
mReadyToAutopilotDisposable = null;
}
}
public void stopRouteAndWipe() {
if (mRouteWipeDisposable != null) {
CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "stopRouteAndWipe()");
mRouteWipeDisposable.dispose();
mRouteWipeDisposable = null;
}
}
public void startInAndWaitOrdersLoop() {
if (mInAndWaitServiceDisposable != null && !mInAndWaitServiceDisposable.isDisposed()) {
return;
}
CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "startInAndWaitOrdersLoop()");
mInAndWaitServiceDisposable = Observable.interval(TaxiPassengerConst.LOOP_DELAY,
TaxiPassengerConst.LOOP_PERIOD_2S, TimeUnit.MILLISECONDS)
.map((aLong -> aLong + 1))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(aLong -> TaxiPassengerModel.getInstance().queryInAndWaitOrders());
}
public void stopInAndWaitOrdersLoop() {
if (mInAndWaitServiceDisposable != null) {
CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "stopInAndWaitOrdersLoop()");
mInAndWaitServiceDisposable.dispose();
mInAndWaitServiceDisposable = null;
}
}
/**
* 轮训查下 查询订单剩余里程和时间
*/
public void startQueryOrderRemainingLoop() {
if (mQueryOrderRemainingDisposable != null && !mQueryOrderRemainingDisposable.isDisposed()) {
return;
}
CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "startQueryOrderRemainingLoop()");
mQueryOrderRemainingDisposable = Observable.interval(TaxiPassengerConst.LOOP_DELAY,
TaxiPassengerConst.LOOP_CALCULATEROUTE_2S, TimeUnit.MILLISECONDS)
.map((aLong -> aLong + 1))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(aLong -> TaxiPassengerModel.getInstance().queryOrderRemaining());
}
public void stopQueryOrderRemainingLoop() {
if (mQueryOrderRemainingDisposable != null) {
CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "stopQueryOrderRemainingLoop()");
mQueryOrderRemainingDisposable.dispose();
mQueryOrderRemainingDisposable = null;
}
}
}

View File

@@ -1,64 +0,0 @@
package com.mogo.och.taxi.passenger.mulprocess;
import android.database.MatrixCursor;
import android.os.Bundle;
import android.os.IBinder;
import android.os.Parcel;
import android.os.Parcelable;
public class BinderCursor extends MatrixCursor {
static final String KEY_BINDER = "binder";
Bundle mBinderExtra = new Bundle();
public static class BinderParcelable implements Parcelable {
public IBinder mBinder;
public static final Creator<BinderParcelable> CREATOR = new Creator<BinderParcelable>() {
@Override
public BinderParcelable createFromParcel(Parcel source) {
return new BinderParcelable(source);
}
@Override
public BinderParcelable[] newArray(int size) {
return new BinderParcelable[size];
}
};
BinderParcelable(IBinder binder) {
mBinder = binder;
}
BinderParcelable(Parcel source) {
mBinder = source.readStrongBinder();
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeStrongBinder(mBinder);
}
}
public BinderCursor(String[] columnNames, IBinder binder) {
super(columnNames);
if (binder != null) {
Parcelable value = new BinderParcelable(binder);
mBinderExtra.putParcelable(KEY_BINDER, value);
}
}
@Override
public Bundle getExtras() {
return mBinderExtra;
}
}

View File

@@ -1,55 +0,0 @@
package com.mogo.och.taxi.passenger.mulprocess;
import static android.os.Binder.getCallingUid;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.IBinder;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
public class BinderProvider extends ContentProvider {
public static final String TAG = BinderProvider.class.getSimpleName();
public static final String AUTHORITY = "com.mogo.och.taxi.passenger.leftmenu";
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/binder");
public static final String SERVICE_LEFTMENU = "lefmenu";
@Override
public boolean onCreate() {
return true;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
getCallingUid();
IBinder binder;
if (selectionArgs[0].equals(BinderProvider.SERVICE_LEFTMENU)) {
binder = new OrderServiceImpl();
} else {
return null;
}
BinderCursor cursor = new BinderCursor(new String[]{"service"}, binder);
return cursor;
}
@Override
public String getType(Uri uri) {return null;}
@Override
public Uri insert(Uri uri, ContentValues values) {return null;}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {return 0;}
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {return 0;}
}

View File

@@ -1,22 +0,0 @@
package com.mogo.och.taxi.passenger.mulprocess
import android.app.Service
import android.content.Context
import android.content.Intent
import android.os.IBinder
class EmptyService: Service() {
companion object{
fun startService(context: Context){
//预加载视频进程
val intent = Intent(context, EmptyService::class.java)
context.startService(intent)
}
}
override fun onBind(intent: Intent?): IBinder? {
// 加载进程的空Service
return null
}
}

View File

@@ -1,35 +0,0 @@
package com.mogo.och.taxi.passenger.mulprocess;
import android.os.RemoteException;
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.taxi.passenger.ui.leftmenu.LeftMenuOpen;
import com.mogo.och.taxi.passenger.ui.leftmenu.OverlayLeftViewUtils;
public class OrderServiceImpl extends ILeftMenuService.Stub {
public static final String TAG = "mulprocessOrderServiceImpl";
@Override
public void transmissionIndex(int index) throws RemoteException {
CallerLogger.INSTANCE.d(SceneConstant.M_TAXI_P + TAG, "跨进程 transmissionIndex"+index);
UiThreadHandler.post(() -> {
OverlayLeftViewUtils.INSTANCE.transmissionIndexGet(index);
});
}
@Override
public void registerCallback(ICallback cb) throws RemoteException {
CallerLogger.INSTANCE.d(SceneConstant.M_TAXI_P + TAG, "跨进程 registerCallback");
LeftMenuOpen.INSTANCE.registerCallbackHost(cb);
}
@Override
public void unRegisterCallback(ICallback cb) throws RemoteException {
CallerLogger.INSTANCE.d(SceneConstant.M_TAXI_P + TAG, "跨进程 unRegisterCallback");
LeftMenuOpen.INSTANCE.unregisterCallbackHost(cb);
}
}

View File

@@ -1,128 +0,0 @@
package com.mogo.och.taxi.passenger.network;
import com.mogo.och.taxi.passenger.bean.TaxiPassengerAllStarWorld;
import com.mogo.och.taxi.passenger.bean.TaxiPassengerBaseRespBean;
import com.mogo.och.taxi.passenger.bean.TaxiPassengerCheckPhoneUpdateOrderReqBean;
import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRemainingResp;
import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryReqBean;
import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRespBean;
import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrdersInServiceQueryRespBean;
import com.mogo.och.taxi.passenger.bean.TaxiPassengerQueryOrderRouteResp;
import com.mogo.och.taxi.passenger.bean.TaxiPassengerScoreUpdateOrderReqBean;
import com.mogo.och.taxi.passenger.bean.TaxiPassengerStartReqBean;
import io.reactivex.Observable;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.Header;
import retrofit2.http.Headers;
import retrofit2.http.POST;
import retrofit2.http.Query;
/**
* Created by pangfan on 2021/8/19
*
* 网约车-出租车接口定义
*/
interface TaxiPassengerServiceApi {
/**
* 查询全部服务中/待服务订单没有的时候返回code 0空列表
* @param driverSn
* @return
*/
@Headers( {"Content-type:application/json;charset=UTF-8"} )
@GET("/autopilot-car-hailing/order/v2/driver/taxi/passenger/orderInService/query")
Observable<TaxiPassengerOrdersInServiceQueryRespBean> queryOrdersInAndWaitService(@Header("appId") String appId, @Header("ticket") String ticket, @Query("driverSn") String driverSn);
/**
* 通过orderNo查询订单信息用于本地已经有orderNo时
* @param data
* @return
* @deprecated v2.1_0930需求中暂不再使用此接口
*/
@Headers( {"Content-type:application/json;charset=UTF-8"} )
@POST( "/autopilot-car-hailing/order/v2/driver/taxi/passenger/queryOrderById" )
Observable<TaxiPassengerOrderQueryRespBean> queryOrderById(@Header ("appId") String appId,@Header("ticket") String ticket,@Body TaxiPassengerOrderQueryReqBean data);
/**
* 查询订单剩余里程和时间
* @param appId
* @param ticket
* @param orderNo
* @return
*/
@Headers( {"Content-type:application/json;charset=UTF-8"} )
@GET("/autopilot-car-hailing/order/v2/driver/taxi/queryOrderRemaining")
Observable<TaxiPassengerOrderQueryRemainingResp> queryOrderRemaining(@Header("appId") String appId, @Header("ticket") String ticket, @Query("orderNo") String orderNo);
/**
* 查询订单全路径
* @param appId
* @param ticket
* @param orderNo
* @return
*/
@Headers( {"Content-type:application/json;charset=UTF-8"} )
// @GET( "/autopilot-car-hailing/api/v1/driver/serviceStatus/query" )
@GET( "/autopilot-car-hailing/order/v2/driver/taxi/passenger/orderRoute" )
Observable<TaxiPassengerQueryOrderRouteResp> queryOrderRoute(@Header ("appId") String appId, @Header("ticket") String ticket, @Query("orderNo") String orderNo);
/**
* 提交用户输入的手机后4位、并进行状态扭转
* @param data
* @return
*/
@Headers( {"Content-type:application/json;charset=UTF-8"} )
@POST( "/autopilot-car-hailing/cab/flow/v1/driver/taxi/passenger/verification/phone" )
Observable<TaxiPassengerBaseRespBean> checkPhoneAndUpdateOrderStatus(@Header ("appId") String appId, @Header("ticket") String ticket, @Body TaxiPassengerCheckPhoneUpdateOrderReqBean data);
/**
* 对订单进行打分 1-5分 加上文案评论
* @param data
* @return
*/
@Headers( {"Content-type:application/json;charset=UTF-8"} )
@POST( "/autopilot-car-hailing/evaluation/info/driver/taxi/submit" )
Observable<TaxiPassengerBaseRespBean> arrivedAndScore(@Header ("appId") String appId, @Header("ticket") String ticket, @Body TaxiPassengerScoreUpdateOrderReqBean data);
/**
* 获取星星对应的文案(所有文案)
* @return
*/
@Headers( {"Content-type:application/json;charset=UTF-8"} )
@GET( "/autopilot-car-hailing/evaluation/label/driver/taxi/list" )
Observable<TaxiPassengerAllStarWorld> getWorldAllStar(@Header ("appId") String appId, @Header("ticket") String ticket);
/**
* 获取星星对应的文案(和星星一一对应)
* @return
*/
@Headers( {"Content-type:application/json;charset=UTF-8"} )
@GET( "/autopilot-car-hailing/evaluation/label/driver/taxi/listByStar" )
Observable<TaxiPassengerAllStarWorld> getWorldByStar(@Header ("appId") String appId, @Header("ticket") String ticket,@Query("star") String star);
/**
* 查询司机是否已确认可开启自动驾驶
* @param appId
* @param ticket
* @param orderNo
* @return
*/
@Headers( {"Content-type:application/json;charset=UTF-8"} )
@GET( "/autopilot-car-hailing/cab/flow/v1/driver/taxi/pilot/status" )
Observable<TaxiPassengerBaseRespBean> queryPilotStatus(@Header ("appId") String appId
, @Header("ticket") String ticket,@Query("orderNo") String orderNo);
/**
* 乘客屏启动自动驾驶成功
* @param appId
* @param ticket
* @param data
* @return
*/
@Headers( {"Content-type:application/json;charset=UTF-8"} )
@POST( "/autopilot-car-hailing/cab/flow/v1/driver/taxi/passenger/startServicePilot" )
Observable<TaxiPassengerBaseRespBean> startServicePilotDone(@Header ("appId") String appId
, @Header("ticket") String ticket,@Body TaxiPassengerStartReqBean data);
}

View File

@@ -0,0 +1,146 @@
package com.mogo.och.taxi.passenger.network
import com.mogo.cloud.passport.MoGoAiCloudClientConfig
import com.mogo.och.taxi.passenger.bean.TaxiPassengerAllStarWorld
import com.mogo.och.taxi.passenger.bean.TaxiPassengerBaseRespBean
import com.mogo.och.taxi.passenger.bean.TaxiPassengerCheckPhoneUpdateOrderReqBean
import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRemainingResp
import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryReqBean
import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRespBean
import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrdersInServiceQueryRespBean
import com.mogo.och.taxi.passenger.bean.TaxiPassengerScoreUpdateOrderReqBean
import com.mogo.och.taxi.passenger.bean.TaxiPassengerStartReqBean
import io.reactivex.Observable
import retrofit2.http.Body
import retrofit2.http.GET
import retrofit2.http.Header
import retrofit2.http.Headers
import retrofit2.http.POST
import retrofit2.http.Query
/**
* Created by pangfan on 2021/8/19
*
* 网约车-出租车接口定义
*/
internal interface TaxiPassengerServiceApi {
/**
* 查询全部服务中/待服务订单没有的时候返回code 0空列表
* @param driverSn
* @return
*/
@Headers("Content-type:application/json;charset=UTF-8")
@GET("/autopilot-car-hailing/order/v2/driver/taxi/passenger/orderInService/query")
fun queryOrdersInAndWaitService(
@Header("appId") appId: String = MoGoAiCloudClientConfig.getInstance().serviceAppId,
@Header("ticket") ticket: String=MoGoAiCloudClientConfig.getInstance().token,
@Query("driverSn") driverSn: String
): Observable<TaxiPassengerOrdersInServiceQueryRespBean>
/**
* 通过orderNo查询订单信息用于本地已经有orderNo时
* @param data
* @return
*/
@Headers("Content-type:application/json;charset=UTF-8")
@POST("/autopilot-car-hailing/order/v2/driver/taxi/passenger/queryOrderById")
fun queryOrderById(
@Header("appId") appId: String = MoGoAiCloudClientConfig.getInstance().serviceAppId,
@Header("ticket") ticket: String=MoGoAiCloudClientConfig.getInstance().token,
@Body data: TaxiPassengerOrderQueryReqBean
): Observable<TaxiPassengerOrderQueryRespBean>
/**
* 查询订单剩余里程和时间
* @param appId
* @param ticket
* @param orderNo
* @return
*/
@Headers("Content-type:application/json;charset=UTF-8")
@GET("/autopilot-car-hailing/order/v2/driver/taxi/queryOrderRemaining")
fun queryOrderRemaining(
@Header("appId") appId: String = MoGoAiCloudClientConfig.getInstance().serviceAppId,
@Header("ticket") ticket: String=MoGoAiCloudClientConfig.getInstance().token,
@Query("orderNo") orderNo: String
): Observable<TaxiPassengerOrderQueryRemainingResp>
/**
* 提交用户输入的手机后4位、并进行状态扭转
* @param data
* @return
*/
@Headers("Content-type:application/json;charset=UTF-8")
@POST("/autopilot-car-hailing/cab/flow/v1/driver/taxi/passenger/verification/phone")
fun checkPhoneAndUpdateOrderStatus(
@Header("appId") appId: String = MoGoAiCloudClientConfig.getInstance().serviceAppId,
@Header("ticket") ticket: String=MoGoAiCloudClientConfig.getInstance().token,
@Body data: TaxiPassengerCheckPhoneUpdateOrderReqBean?
): Observable<TaxiPassengerBaseRespBean>
/**
* 对订单进行打分 1-5分 加上文案评论
* @param data
* @return
*/
@Headers("Content-type:application/json;charset=UTF-8")
@POST("/autopilot-car-hailing/evaluation/info/driver/taxi/submit")
fun arrivedAndScore(
@Header("appId") appId: String = MoGoAiCloudClientConfig.getInstance().serviceAppId,
@Header("ticket") ticket: String=MoGoAiCloudClientConfig.getInstance().token,
@Body data: TaxiPassengerScoreUpdateOrderReqBean
): Observable<TaxiPassengerBaseRespBean>
/**
* 获取星星对应的文案(所有文案)
* @return
*/
@Headers("Content-type:application/json;charset=UTF-8")
@GET("/autopilot-car-hailing/evaluation/label/driver/taxi/list")
fun getWorldAllStar(
@Header("appId") appId: String = MoGoAiCloudClientConfig.getInstance().serviceAppId,
@Header("ticket") ticket: String=MoGoAiCloudClientConfig.getInstance().token,
): Observable<TaxiPassengerAllStarWorld>
/**
* 获取星星对应的文案(和星星一一对应)
* @return
*/
@Headers("Content-type:application/json;charset=UTF-8")
@GET("/autopilot-car-hailing/evaluation/label/driver/taxi/listByStar")
fun getWorldByStar(
@Header("appId") appId: String = MoGoAiCloudClientConfig.getInstance().serviceAppId,
@Header("ticket") ticket: String=MoGoAiCloudClientConfig.getInstance().token,
@Query("star") star: String
): Observable<TaxiPassengerAllStarWorld>
/**
* 查询司机是否已确认可开启自动驾驶
* @param appId
* @param ticket
* @param orderNo
* @return
*/
@Headers("Content-type:application/json;charset=UTF-8")
@GET("/autopilot-car-hailing/cab/flow/v1/driver/taxi/pilot/status")
fun queryPilotStatus(
@Header("appId") appId: String = MoGoAiCloudClientConfig.getInstance().serviceAppId,
@Header("ticket") ticket: String=MoGoAiCloudClientConfig.getInstance().token,
@Query("orderNo") orderNo: String
): Observable<TaxiPassengerBaseRespBean>
/**
* 乘客屏启动自动驾驶成功
* @param appId
* @param ticket
* @param data
* @return
*/
@Headers("Content-type:application/json;charset=UTF-8")
@POST("/autopilot-car-hailing/cab/flow/v1/driver/taxi/passenger/startServicePilot")
fun startServicePilotDone(
@Header("appId") appId: String = MoGoAiCloudClientConfig.getInstance().serviceAppId,
@Header("ticket") ticket: String= MoGoAiCloudClientConfig.getInstance().token,
@Body data: TaxiPassengerStartReqBean
): Observable<TaxiPassengerBaseRespBean>
}

View File

@@ -1,40 +1,61 @@
package com.mogo.och.taxi.passenger.network
import android.content.Context
import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager.getServerToken
import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrdersInServiceQueryRespBean
import com.mogo.cloud.passport.MoGoAiCloudClientConfig
import com.mogo.commons.AbsMogoApplication
import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager
import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRemainingResp
import com.mogo.och.taxi.passenger.bean.TaxiPassengerQueryOrderRouteResp
import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRespBean
import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryReqBean
import com.mogo.och.taxi.passenger.bean.TaxiPassengerBaseRespBean
import com.mogo.och.taxi.passenger.bean.TaxiPassengerCheckPhoneUpdateOrderReqBean
import com.mogo.och.taxi.passenger.bean.TaxiPassengerScoreUpdateOrderReqBean
import com.mogo.och.taxi.passenger.bean.TaxiPassengerAllStarWorld
import com.mogo.och.taxi.passenger.bean.TaxiPassengerStartReqBean
import com.mogo.eagle.core.network.MoGoRetrofitFactory
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_TAXI_P
import com.mogo.och.common.module.biz.constant.OchCommonConst
import com.mogo.och.common.module.biz.network.OchCommonServiceCallback
import com.mogo.och.common.module.biz.network.OchCommonSubscribeImpl
import com.mogo.och.common.module.biz.network.interceptor.transformTry
import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryReqBean
import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRespBean
/**
* Created by pangfan on 2021/8/19
*/
object TaxiPassengerServiceManager {
private val mOCHTaxiServiceApi: TaxiPassengerServiceApi = MoGoRetrofitFactory.getInstance(OchCommonConst.getBaseUrl()).create(
TaxiPassengerServiceApi::class.java
)
private val mOCHTaxiServiceApi: TaxiPassengerServiceApi =
MoGoRetrofitFactory.getInstance(OchCommonConst.getBaseUrl()).create(TaxiPassengerServiceApi::class.java)
private const val TAG = "TaxiPassengerServiceManager"
private var draiverSnCacher = ""
/**
* 获取司机端的sn
* 获取Bus司机端的sn
* @return
*/
private val driverAppSn: String
get() = getServerToken()
val draiverSn: String
get(){
val serverToken = CallerTelematicManager.getServerToken()
if (serverToken != draiverSnCacher && serverToken.isNotEmpty()) {
draiverSnCacher = serverToken
}
return draiverSnCacher
}
val context:Context
get() {
return AbsMogoApplication.getApp()
}
private fun beforeNet():Boolean{
if (draiverSn.isBlank()) {
CallerLogger.e(M_TAXI_P + TAG, "没有司机屏sn 请稍等在请求")
return true
}
return false
}
/**
* 查询全部服务中/待服务订单列表
* @param context
@@ -42,14 +63,12 @@ object TaxiPassengerServiceManager {
*/
@JvmStatic
fun queryOrdersInAndWaitService(
context: Context,
callback: OchCommonServiceCallback<TaxiPassengerOrdersInServiceQueryRespBean>?
) {
mOCHTaxiServiceApi.queryOrdersInAndWaitService(
MoGoAiCloudClientConfig.getInstance().serviceAppId,
MoGoAiCloudClientConfig.getInstance().token,
driverAppSn
) //获取到司机端的sn
if(beforeNet()){
return
}
mOCHTaxiServiceApi.queryOrdersInAndWaitService(driverSn = draiverSn) //获取到司机端的sn
.transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "queryOrdersInAndWaitService"))
}
@@ -62,31 +81,70 @@ object TaxiPassengerServiceManager {
*/
@JvmStatic
fun queryOrderRemaining(
context: Context,
orderNo: String?,
orderNo: String,
callback: OchCommonServiceCallback<TaxiPassengerOrderQueryRemainingResp>?
) {
mOCHTaxiServiceApi.queryOrderRemaining(
MoGoAiCloudClientConfig.getInstance().serviceAppId,
MoGoAiCloudClientConfig.getInstance().token,
orderNo
)
mOCHTaxiServiceApi.queryOrderRemaining(orderNo= orderNo)
.transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "queryOrderRemaining"))
}
@JvmStatic
fun queryOrderRouteList(
context: Context,
fun checkPhoneAndUpdateOrderStatus(
orderNo: String?,
callback: OchCommonServiceCallback<TaxiPassengerQueryOrderRouteResp>?
phone: String?,
callback: OchCommonServiceCallback<TaxiPassengerBaseRespBean>?
) {
mOCHTaxiServiceApi.queryOrderRoute(
MoGoAiCloudClientConfig.getInstance().serviceAppId,
MoGoAiCloudClientConfig.getInstance().token,
orderNo
)
mOCHTaxiServiceApi.checkPhoneAndUpdateOrderStatus(data= TaxiPassengerCheckPhoneUpdateOrderReqBean(orderNo, phone))
.transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "queryOrderRouteList"))
.subscribe(OchCommonSubscribeImpl(context, callback, "checkPhoneAndUpdateOrderStatus"))
}
@JvmStatic
fun arrivedAndScore(
taxiPassengerScoreUpdateOrderReqBean: TaxiPassengerScoreUpdateOrderReqBean,
callback: OchCommonServiceCallback<TaxiPassengerBaseRespBean>?
) {
mOCHTaxiServiceApi.arrivedAndScore(data = taxiPassengerScoreUpdateOrderReqBean)
.transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "checkPhoneAndUpdateOrderStatus"))
}
@JvmStatic
fun getAllScoreWorld(
callback: OchCommonServiceCallback<TaxiPassengerAllStarWorld>?
) {
mOCHTaxiServiceApi.getWorldAllStar()
.transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "arrivedAndScore"))
}
@JvmStatic
fun queryPilotStatus(
orderNo: String,
callback: OchCommonServiceCallback<TaxiPassengerBaseRespBean>?
) {
mOCHTaxiServiceApi.queryPilotStatus(orderNo = orderNo)
.transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "queryPilotStatus"))
}
@JvmStatic
fun startServicePilotDone(
orderNo: String?, loc: TaxiPassengerStartReqBean.Result?,
callback: OchCommonServiceCallback<TaxiPassengerBaseRespBean>?
) {
if(beforeNet()){
return
}
mOCHTaxiServiceApi.startServicePilotDone(data = TaxiPassengerStartReqBean(draiverSn, orderNo, loc))
.transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "startServicePilotDone"))
}
@JvmStatic
fun getWorldByStar(
start: String,
callback: OchCommonServiceCallback<TaxiPassengerAllStarWorld>?
) {
mOCHTaxiServiceApi.getWorldByStar(star=start)
.transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "checkPhoneAndUpdateOrderStatus"))
}
/**
@@ -96,104 +154,19 @@ object TaxiPassengerServiceManager {
* @param callback
*/
@JvmStatic
@Deprecated("v2.1_0930需求中暂不再使用此接口")
fun queryOrderById(
context: Context, orderNo: String?,
callback: OchCommonServiceCallback<TaxiPassengerOrderQueryRespBean>?
) {
if(beforeNet()){
return
}
mOCHTaxiServiceApi.queryOrderById(
MoGoAiCloudClientConfig.getInstance().serviceAppId,
MoGoAiCloudClientConfig.getInstance().token,
TaxiPassengerOrderQueryReqBean(driverAppSn, orderNo)
data=TaxiPassengerOrderQueryReqBean(draiverSn, orderNo)
)
.transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "queryOrderById"))
}
@JvmStatic
fun checkPhoneAndUpdateOrderStatus(
context: Context,
orderNo: String?,
phone: String?,
callback: OchCommonServiceCallback<TaxiPassengerBaseRespBean>?
) {
mOCHTaxiServiceApi.checkPhoneAndUpdateOrderStatus(
MoGoAiCloudClientConfig.getInstance().serviceAppId,
MoGoAiCloudClientConfig.getInstance().token,
TaxiPassengerCheckPhoneUpdateOrderReqBean(orderNo, phone)
)
.transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "checkPhoneAndUpdateOrderStatus"))
}
@JvmStatic
fun arrivedAndScore(
context: Context,
taxiPassengerScoreUpdateOrderReqBean: TaxiPassengerScoreUpdateOrderReqBean?,
callback: OchCommonServiceCallback<TaxiPassengerBaseRespBean>?
) {
mOCHTaxiServiceApi.arrivedAndScore(
MoGoAiCloudClientConfig.getInstance().serviceAppId,
MoGoAiCloudClientConfig.getInstance().token,
taxiPassengerScoreUpdateOrderReqBean
)
.transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "checkPhoneAndUpdateOrderStatus"))
}
@JvmStatic
fun getAllScoreWorld(
context: Context,
callback: OchCommonServiceCallback<TaxiPassengerAllStarWorld>?
) {
mOCHTaxiServiceApi.getWorldAllStar(
MoGoAiCloudClientConfig.getInstance().serviceAppId,
MoGoAiCloudClientConfig.getInstance().token
)
.transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "arrivedAndScore"))
}
@JvmStatic
fun queryPilotStatus(
context: Context,
orderNo: String?,
callback: OchCommonServiceCallback<TaxiPassengerBaseRespBean>?
) {
mOCHTaxiServiceApi.queryPilotStatus(
MoGoAiCloudClientConfig.getInstance().serviceAppId,
MoGoAiCloudClientConfig.getInstance().token,
orderNo
)
.transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "queryPilotStatus"))
}
@JvmStatic
fun startServicePilotDone(
context: Context,
orderNo: String?,
loc: TaxiPassengerStartReqBean.Result?,
callback: OchCommonServiceCallback<TaxiPassengerBaseRespBean>?
) {
mOCHTaxiServiceApi.startServicePilotDone(
MoGoAiCloudClientConfig.getInstance().serviceAppId,
MoGoAiCloudClientConfig.getInstance().token,
TaxiPassengerStartReqBean(
driverAppSn, orderNo, loc
)
)
.transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "startServicePilotDone"))
}
@JvmStatic
fun getWorldByStar(
context: Context,
start: String?,
callback: OchCommonServiceCallback<TaxiPassengerAllStarWorld>?
) {
mOCHTaxiServiceApi.getWorldByStar(
MoGoAiCloudClientConfig.getInstance().serviceAppId,
MoGoAiCloudClientConfig.getInstance().token,
start
)
.transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "checkPhoneAndUpdateOrderStatus"))
}
}

View File

@@ -1,268 +0,0 @@
package com.mogo.och.taxi.passenger.presenter;
import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI_P;
import android.os.Looper;
import androidx.annotation.NonNull;
import androidx.lifecycle.LifecycleOwner;
import com.mogo.commons.AbsMogoApplication;
import com.mogo.commons.mvp.Presenter;
import com.mogo.eagle.core.data.map.MogoLocation;
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener;
import com.mogo.eagle.core.function.call.order.CallerOrderListenerManager;
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
import com.mogo.och.common.module.manager.OCHAdasAbilityManager;
import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRespBean;
import com.mogo.och.taxi.passenger.bean.TaxiPassengerScoreUpdateOrderReqBean;
import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerADASStatusCallback;
import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerControllerStatusCallback;
import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerOrderStatusCallback;
import com.mogo.och.taxi.passenger.callback.ITaxiPassengerCommonCallback;
import com.mogo.och.taxi.passenger.constant.TaxiPassengerOrderStatusEnum;
import com.mogo.och.taxi.passenger.model.TaxiPassengerGeocodeSearchModel;
import com.mogo.och.taxi.passenger.model.TaxiPassengerModel;
import com.mogo.och.taxi.passenger.ui.TaxiPassengerBaseFragment;
import com.mogo.och.taxi.passenger.ui.leftmenu.LeftMenuOpen;
/**
* @author: wangmingjun
* @date: 2022/3/4
*/
public class BaseTaxiPassengerPresenter extends Presenter<TaxiPassengerBaseFragment> implements
IOCHTaxiPassengerADASStatusCallback, IOCHTaxiPassengerControllerStatusCallback,
IOCHTaxiPassengerOrderStatusCallback {
private static final String TAG = BaseTaxiPassengerPresenter.class.getSimpleName();
private volatile TaxiPassengerOrderQueryRespBean.Result mCurrentPassengerOrder = null; //当前订单
public BaseTaxiPassengerPresenter(TaxiPassengerBaseFragment view) {
super(view);
TaxiPassengerModel.getInstance().init(AbsMogoApplication.getApp());
OCHAdasAbilityManager.getInstance().init(AbsMogoApplication.getApp());
initListeners();
}
@Override
public void onCreate( @NonNull LifecycleOwner owner ) {
super.onCreate( owner );
CallerLogger.INSTANCE.d( M_TAXI_P + TAG, "网约车-出租车拿到订单" );
}
@Override
public void onDestroy( @NonNull LifecycleOwner owner ) {
super.onDestroy( owner );
releaseListeners();
TaxiPassengerModel.getInstance().release();
OCHAdasAbilityManager.getInstance().release();
}
private void initListeners() {
TaxiPassengerModel.getInstance().setADASStatusCallback(this);
TaxiPassengerModel.getInstance().setOrderStatusCallback("BaseTaxiPassengerPresenter",this);
TaxiPassengerModel.getInstance().setControllerStatusCallback("BaseTaxiPassengerPresenter",this);
}
private void releaseListeners() {
TaxiPassengerModel.getInstance().setADASStatusCallback(null);
TaxiPassengerModel.getInstance().setOrderStatusCallback("BaseTaxiPassengerPresenter",null);
TaxiPassengerModel.getInstance().setControllerStatusCallback("BaseTaxiPassengerPresenter",null);
}
private void runOnUIThread( Runnable executor ) {
if ( executor == null ) {
return;
}
if ( Looper.myLooper() != Looper.getMainLooper() ) {
UiThreadHandler.post( executor );
} else {
executor.run();
}
}
// 获取当前订单状态
public TaxiPassengerOrderStatusEnum getCurOrderStatus() {
return TaxiPassengerModel.getInstance().getCurOrderStatus();
}
public void startOrStopOrderLoop(){
TaxiPassengerModel.getInstance().startOrStopOrderLoop();
}
@Override
public void onAutopilotArriveEnd() {
}
@Override
public void onAutopilotEnable() {
runOnUIThread(() -> mView.onAutopilotStatusChanged(
IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE));
}
@Override
public void onAutopilotDisable() {
runOnUIThread(() -> mView.onAutopilotStatusChanged(
IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE));
}
@Override
public void onAutopilotRunning() {
runOnUIThread(() -> mView.onAutopilotStatusChanged(
IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING));
}
@Override
public void onVRModeChanged(boolean isVRMode) {
runOnUIThread(() -> mView.switchVRFlatMode(isVRMode));
}
@Override
public void onCarLocationChanged(MogoLocation location) {
// 速度不用展示
// LeftMenuOpen.INSTANCE.callCallBack(-1,-1,location.getSpeed());
}
@Override
public void onCurrentOrderStatusChanged(TaxiPassengerOrderQueryRespBean.Result order) {
// CallerLogger.INSTANCE.d(M_TAXI_P + TAG, GsonUtil.jsonFromObject(order));
if (mCurrentPassengerOrder == null){
mCurrentPassengerOrder = order; //当前无订单
updateOrderView(order);
}else if (mCurrentPassengerOrder.orderStatus != order.orderStatus) {
mCurrentPassengerOrder = order;
updateOrderView(order);
}
}
@Override
public void onCurrentOrderDistToEndChanged(long meters, long timeInSecond) {
LeftMenuOpen.INSTANCE.callCallBack(meters,timeInSecond,-1);
}
@Override
public void onCurrentRoadName(String currentRoadName) {
}
@Override
public void onDriverHasCheckedPilotCondition(boolean isBoarded) {
CallerLogger.INSTANCE.d(M_TAXI_P+TAG,"isBoarded = "+isBoarded);
runOnUIThread(() -> {
mView.updateStartAutopilotBtnStatus(isBoarded);
});
}
private void updateOrderView(TaxiPassengerOrderQueryRespBean.Result order) {
CallerLogger.INSTANCE.d(M_TAXI_P+TAG,"updateOrderView = "+order.orderStatus);
// 70 取消订单
if (TaxiPassengerOrderStatusEnum.Cancel.getCode() == order.orderStatus){
runOnUIThread(() -> {
mView.showOrHideServingOrderFragment(false,true);
mView.showOrHideOverMapViewFragment(false);
mView.showOrHideStartAutopilotView(false,false);
mView.showOrHidePressengerCheckPager(false, "",
"", "", "", "");
mView.showOrHideArrivedEndLayout(false,"","");
});
TaxiPassengerModel.getInstance().recoverNaviInfo();
TaxiPassengerGeocodeSearchModel.getInstance(getContext()).destroyGeocodeSearch();
TaxiPassengerModel.getInstance().startOrStopReadyToAutopilotLoop(false);
TaxiPassengerModel.getInstance().cleanStation();
return;
}
// 20 司机到达上车点
if (TaxiPassengerOrderStatusEnum.ArriveAtStart.getCode() == order.orderStatus) {
runOnUIThread(() -> {
mView.preOrderThankPageTenlogic(order.startSiteAddr,
order.endSiteAddr, order.passengerNum, order.carNumber, order.passengerPhone);
});
return;
}
// TODO: 2022/6/10 若乘客端确认已经上车,则显示开始行程按钮 并且不可点击 暗
// TODO: 2022/6/10 乘客已上车 需要开启轮询司机确认可以开启自动驾驶的接口
// TODO: 2022/6/10 若司机端已经确认,则显示开始行程按钮 并且可点击,第二步的轮询停止
//TODO: 2022/6/10 若订单取消或者隐藏则关掉开始行程界面,轮询也要取消
if (TaxiPassengerOrderStatusEnum.UserArriveAtStart.getCode() == order.orderStatus){
runOnUIThread(() ->{
CallerLogger.INSTANCE.d(M_TAXI_P+TAG,"UserArriveAtStart");
mView.showOrHideStartAutopilotView(true,false);
});
//开启轮询司机是否已准备好开启自动驾驶的环境
TaxiPassengerModel.getInstance().startDriverReadyToAutopilotLoop();
TaxiPassengerModel.getInstance().setStation();
}
if (TaxiPassengerOrderStatusEnum.OnTheWayToEnd.getCode() == order.orderStatus){
runOnUIThread(() ->{
mView.showOrHideStartAutopilotView(false,false);
mView.showOrHideServingOrderFragment(true,true);
});
TaxiPassengerModel.getInstance().startOrStopReadyToAutopilotLoop(false);
TaxiPassengerModel.getInstance().setStation();
}
// 30 用户到达上车点 并通过了手机号后四位验证
// 40 服务中
if (TaxiPassengerOrderStatusEnum.UserArriveAtStart.getCode() == order.orderStatus
|| TaxiPassengerOrderStatusEnum.OnTheWayToEnd.getCode() == order.orderStatus){
runOnUIThread(() -> {
mView.showOrHideArrivedEndLayout(false,"","");
mView.showOrHidePressengerCheckPager(false, "",
"", "", "", "");
if(TaxiPassengerOrderStatusEnum.OnTheWayToEnd.getCode() == order.orderStatus){
CallerOrderListenerManager.INSTANCE.invokeOrderStatus(true);
}
});
return;
}
// 50 到达终点 乘客可以评价
if (TaxiPassengerOrderStatusEnum.ArriveAtEnd.getCode() == order.orderStatus){
TaxiPassengerModel.getInstance().recoverNaviInfo();
TaxiPassengerModel.getInstance().startOrStopRouteAndWipe(false);
TaxiPassengerGeocodeSearchModel.getInstance(getContext()).destroyGeocodeSearch();
mView.showOrHideOverMapViewFragment(false);
runOnUIThread(() -> {
mView.showOrHideServingOrderFragment(false,true);
mView.showOrHideArrivedEndLayout(true, order.endSiteAddr,order.orderNo);
CallerOrderListenerManager.INSTANCE.invokeOrderStatus(false);
});
TaxiPassengerModel.getInstance().cleanStation();
return;
}
// 60 服务完成 页面
if (TaxiPassengerOrderStatusEnum.JourneyCompleted.getCode() == order.orderStatus){
TaxiPassengerGeocodeSearchModel.getInstance(getContext()).destroyGeocodeSearch();
mCurrentPassengerOrder = null;
TaxiPassengerModel.getInstance().cleanStation();
return;
}
}
public void checkAndUpdateStatus(String phone){
TaxiPassengerModel.getInstance().checkPhoneAndUpdateStatus(phone, new ITaxiPassengerCommonCallback() {
@Override
public void onCommonCallback() {
mView.showOrHidePressengerCheckPager(false,"","","","","");
}
});
}
/**
* 封装请求
*/
public void arrivedAndScore(TaxiPassengerScoreUpdateOrderReqBean taxiPassengerScoreUpdateOrderReqBean){
TaxiPassengerModel.getInstance().arrivedAndScore(taxiPassengerScoreUpdateOrderReqBean,aBoolean -> mView.showArrivedEndLayout2Thank(aBoolean));
}
/**
* 开启自动驾驶
*/
public void startAutopilot(){
TaxiPassengerModel.getInstance().startAutopilot();
}
}

View File

@@ -0,0 +1,160 @@
package com.mogo.och.taxi.passenger.presenter
import androidx.lifecycle.LifecycleOwner
import com.mogo.commons.AbsMogoApplication
import com.mogo.commons.mvp.Presenter
import com.mogo.eagle.core.function.call.biz.CallerFuncBizManager
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.UiThreadHandler
import com.mogo.och.common.module.manager.OCHAdasAbilityManager
import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRespBean
import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerOrderStatusCallback
import com.mogo.och.taxi.passenger.constant.TaxiPassengerOrderStatusEnum
import com.mogo.och.taxi.passenger.model.AutopilotManager
import com.mogo.och.taxi.passenger.model.TaxiPassengerModel
import com.mogo.och.taxi.passenger.ui.TaxiPassengerBaseFragment
/**
* @author: wangmingjun
* @date: 2022/3/4
*/
class BaseTaxiPassengerPresenter(view: TaxiPassengerBaseFragment?) :
Presenter<TaxiPassengerBaseFragment?>(view), IOCHTaxiPassengerOrderStatusCallback {
init {
TaxiPassengerModel.init(AbsMogoApplication.getApp())
OCHAdasAbilityManager.getInstance().init(AbsMogoApplication.getApp())
initListeners()
}
override fun onCreate(owner: LifecycleOwner) {
super.onCreate(owner)
d(SceneConstant.M_TAXI_P + TAG, "网约车-出租车拿到订单")
}
override fun onDestroy(owner: LifecycleOwner) {
super.onDestroy(owner)
releaseListeners()
TaxiPassengerModel.release()
OCHAdasAbilityManager.getInstance().release()
}
private fun initListeners() {
TaxiPassengerModel.setOrderStatusCallback("BaseTaxiPassengerPresenter", this)
}
private fun releaseListeners() {
TaxiPassengerModel.setOrderStatusCallback("BaseTaxiPassengerPresenter", null)
}
override fun onCurrentOrderStatusChanged(order: TaxiPassengerOrderQueryRespBean.Result?) {
order?.let {
updateOrderView(order)
}
}
override fun onCurrentOrderDistToEndChanged(
meters: Long,
timeInSecond: Long,
stationDistance: Int
) {
}
private fun updateOrderView(order: TaxiPassengerOrderQueryRespBean.Result?) {
order?.let {
setItineraryVisibility()
when (TaxiPassengerModel.curOrderStatus) {
TaxiPassengerOrderStatusEnum.ArriveAtStart -> {
// 20 司机到达上车点
mView?.showOrHideArrivedEndLayout(isShow = false)
mView?.showOrHidePressengerCheckPager(true, order.startSiteAddr,
order.endSiteAddr, order.passengerNum, order.carNumber, order.passengerPhone)
mView?.showOrHideStartAutopilotView(isShow = false)
}
TaxiPassengerOrderStatusEnum.UserArriveAtStart -> {
// 30 乘客到达上车点
mView?.showOrHideArrivedEndLayout(isShow = false)
mView?.showOrHidePressengerCheckPager(isShow = false)
mView?.showOrHideStartAutopilotView(isShow = true)
}
TaxiPassengerOrderStatusEnum.OnTheWayToEnd -> {
// 服务中(去往目的地)
mView?.showOrHideArrivedEndLayout(isShow = false)
mView?.showOrHidePressengerCheckPager(isShow = false)
mView?.showOrHideStartAutopilotView(isShow = false)
overMapViewShow()
}
TaxiPassengerOrderStatusEnum.ArriveAtEnd -> {
// 50 到达终点 乘客可以评价
mView?.showOrHideArrivedEndLayout(true)
mView?.showOrHidePressengerCheckPager(isShow = false)
mView?.showOrHideStartAutopilotView(isShow = false)
overMapViewClear()
}
TaxiPassengerOrderStatusEnum.JourneyCompleted -> {
// 60 行程完成
mView?.showOrHideStartAutopilotView(isShow = false)
mView?.showOrHidePressengerCheckPager(isShow = false)
mView?.showOrHideArrivedEndLayout(false)
overMapViewClear()
}
TaxiPassengerOrderStatusEnum.Cancel -> {
// 70 取消订单
mView?.showOrHideStartAutopilotView(isShow = false)
mView?.showOrHidePressengerCheckPager(isShow = false)
mView?.showOrHideArrivedEndLayout(isShow = false)
overMapViewClear()
}
else -> {}
}
}
}
private fun overMapViewShow(){
CallerFuncBizManager.bizProvider.getAllV2XEvents()
}
private fun overMapViewClear(){
CallerFuncBizManager.bizProvider.stopQueryV2XEvents()
mView?.showOrHideOverMapView()
}
fun checkAndUpdateStatus(phone: String?) {
TaxiPassengerModel.checkPhoneAndUpdateStatus(phone) {
mView?.showOrHidePressengerCheckPager(isShow = false)
}
}
/**
* 开启自动驾驶
*/
fun startAutopilot() {
AutopilotManager.startAutopilot()
}
fun setItineraryVisibility() {
UiThreadHandler.post {
when (TaxiPassengerModel.curOrderStatus) {
TaxiPassengerOrderStatusEnum.None,
TaxiPassengerOrderStatusEnum.OnTheWayToStart,
TaxiPassengerOrderStatusEnum.ArriveAtStart,
TaxiPassengerOrderStatusEnum.JourneyCompleted,
TaxiPassengerOrderStatusEnum.ArriveAtEnd,
TaxiPassengerOrderStatusEnum.Cancel -> mView?.showOrHideServingOrderFragment(false)
TaxiPassengerOrderStatusEnum.UserArriveAtStart,
TaxiPassengerOrderStatusEnum.OnTheWayToEnd -> mView?.showOrHideServingOrderFragment(true)
}
}
}
override fun onMessageGo2OverMapview() {
mView?.showOverMapView()
}
companion object {
private val TAG = BaseTaxiPassengerPresenter::class.java.simpleName
}
}

View File

@@ -1,176 +0,0 @@
package com.mogo.och.taxi.passenger.presenter;
import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI_P;
import android.os.Build;
import android.os.Looper;
import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.lifecycle.LifecycleOwner;
import com.amap.api.maps.model.LatLng;
import com.mogo.commons.mvp.Presenter;
import com.mogo.eagle.core.data.map.MogoLocation;
import com.mogo.eagle.core.function.call.biz.CallerFuncBizManager;
import com.mogo.eagle.core.network.utils.GsonUtil;
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRespBean;
import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerAutopilotPlanningCallback;
import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerControllerStatusCallback;
import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerOrderStatusCallback;
import com.mogo.och.taxi.passenger.callback.ITaxiPassengerVeloctityCallback;
import com.mogo.och.taxi.passenger.constant.TaxiPassengerOrderStatusEnum;
import com.mogo.och.taxi.passenger.model.TaxiPassengerGeocodeSearchModel;
import com.mogo.och.taxi.passenger.model.TaxiPassengerModel;
import com.mogo.och.taxi.passenger.ui.TaxiPassengerServingOrderFragment;
import java.util.List;
import mogo.telematics.pad.MessagePad;
/**
* @author: wangmingjun
* @date: 2022/3/14
*/
public class TaxiPassengerServingOrderPresenter extends Presenter<TaxiPassengerServingOrderFragment>
implements IOCHTaxiPassengerAutopilotPlanningCallback, IOCHTaxiPassengerOrderStatusCallback
, IOCHTaxiPassengerControllerStatusCallback, ITaxiPassengerVeloctityCallback {
private static final String TAG = TaxiPassengerServingOrderPresenter.class.getSimpleName();
private volatile TaxiPassengerOrderQueryRespBean.Result mCurrentPassengerOrder = null; //当前订单
public TaxiPassengerServingOrderPresenter(TaxiPassengerServingOrderFragment view) {
super(view);
initListener();
}
@Override
public void onResume(@NonNull LifecycleOwner owner) {
super.onResume(owner);
}
private void initListener() {
// 设置起点和终点marker和实时车辆位置
TaxiPassengerModel.getInstance().setMoGoAutopilotPlanningListener(this);
TaxiPassengerModel.getInstance().setOrderStatusCallback("TaxiPassengerServingOrderPresenter",this);
TaxiPassengerModel.getInstance().setControllerStatusCallback("TaxiPassengerServingOrderPresenter",this);
// 获取道路限速
TaxiPassengerModel.getInstance().setVeloctityCallback(this);
}
public void releaseListener(){
TaxiPassengerModel.getInstance().setMoGoAutopilotPlanningListener(null);
TaxiPassengerModel.getInstance().setOrderStatusCallback("TaxiPassengerServingOrderPresenter",null);
TaxiPassengerModel.getInstance().setControllerStatusCallback("TaxiPassengerServingOrderPresenter",null);
TaxiPassengerModel.getInstance().setVeloctityCallback(null);
}
@Override
public void setLineMarker(LatLng startStation,LatLng endStation) {
if (startStation == null || endStation == null) return;
runOnUIThread(() -> mView.setLineMarker(startStation,endStation));
}
@Override
public void routeResultByServer(List<LatLng> routeArriviedTemp, List<LatLng> routeArrivingTemp, MogoLocation location) {
runOnUIThread(() ->mView.routeResultByServer(routeArriviedTemp,routeArrivingTemp,location));
}
@Override
public void showRottingMapView() {
runOnUIThread(() ->mView.showRottingMapView());
}
@Override
public void onCurrentOrderStatusChanged(TaxiPassengerOrderQueryRespBean.Result order) {
CallerLogger.INSTANCE.d(M_TAXI_P + TAG, GsonUtil.jsonFromObject(order));
if (mCurrentPassengerOrder == null || mCurrentPassengerOrder.orderStatus != order.orderStatus){
if (TaxiPassengerOrderStatusEnum.OnTheWayToEnd.getCode() == order.orderStatus){
TaxiPassengerModel.getInstance().startOrStopQueryOrderRemaining(true);
if (mCurrentPassengerOrder == null){
TaxiPassengerModel.getInstance().queryOrderRouteList();
}
TaxiPassengerModel.getInstance().updateAutopilotControlParameters();
CallerFuncBizManager.getBizProvider().queryV2XEvents();//全览模式的V2X事件轮询开始
CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "OnTheWayToEnd");
}
if (TaxiPassengerOrderStatusEnum.Cancel.getCode() == order.orderStatus
|| TaxiPassengerOrderStatusEnum.ArriveAtEnd.getCode() == order.orderStatus
|| TaxiPassengerOrderStatusEnum.JourneyCompleted.getCode() == order.orderStatus){
TaxiPassengerModel.getInstance().startOrStopQueryOrderRemaining(false);
TaxiPassengerModel.getInstance().clearAutopilotControlParameters();
CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "Cancel or ArriveAtEnd or JourneyCompleted");
}
mCurrentPassengerOrder = order; //当前无订单
runOnUIThread(() ->mView.updateOrderStatusView(order));
}
}
@RequiresApi(api = Build.VERSION_CODES.N)
@Override
public void onCurrentOrderDistToEndChanged(long meters, long timeInSecond) {
runOnUIThread(() -> mView.onCurrentOrderDistToEndChanged(meters, timeInSecond));
}
@Override
public void onCurrentRoadName(String currentRoadName) {
runOnUIThread(() -> mView.onCurrentRoadName(currentRoadName));
}
@Override
public void onDriverHasCheckedPilotCondition(boolean isBoarded) {
}
@Override
public void onVRModeChanged(boolean isVRMode) {
}
private long startTime = 0;
private static final long TIMEINTERVAL = 4000;
@Override
public void onCarLocationChanged(MogoLocation location) {
if (location != null){
runOnUIThread(() -> mView.onCarLocationChanged(location));
long currentTimeMillis = System.currentTimeMillis();
if(currentTimeMillis-startTime<TIMEINTERVAL){
return;
}
CallerLogger.INSTANCE.d(M_TAXI_P + TAG,"onCarLocationChanged 获取当前路的信息");
startTime = currentTimeMillis;
TaxiPassengerGeocodeSearchModel.getInstance(getContext()).searchLocationInfo(location.getLatitude(),location.getLongitude());
}
}
@Override
public void onLimitingVelocityChange(int limitingVelocity) {
mView.onLimitingVelocityChange(limitingVelocity);
}
@Override
public void onDestroy(@NonNull LifecycleOwner owner) {
super.onDestroy(owner);
releaseListener();
}
private void runOnUIThread( Runnable executor ) {
if ( executor == null ) {
return;
}
if ( Looper.myLooper() != Looper.getMainLooper() ) {
UiThreadHandler.post( executor );
} else {
executor.run();
}
}
}

View File

@@ -0,0 +1,33 @@
package com.mogo.och.taxi.passenger.provider;
import android.content.Context;
import android.view.View;
import androidx.annotation.NonNull;
import com.alibaba.android.arouter.facade.annotation.Route;
import com.mogo.eagle.core.data.constants.MogoServicePaths;
import com.mogo.eagle.core.function.api.hmi.view.IStatusViewLayout;
import com.mogo.och.taxi.passenger.ui.statusview.StatusBarView;
/**
* @author congtaowang
* @since 2020-01-06
* <p>
* 根据优先级控制显示 window view.
*/
@Route( path = MogoServicePaths.PATH_STATUS_VIEW_MANAGER )
public class StatusViewManager implements IStatusViewLayout {
@NonNull
@Override
public View getStatusView(Context context) {
return new StatusBarView(context);
}
@Override
public void init(Context context) {
}
}

View File

@@ -1,51 +0,0 @@
package com.mogo.och.taxi.passenger.ui;
import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.MotionEvent;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatSeekBar;
/**
* @author: wangmingjun
* @date: 2022/3/21
*/
public class CustomSeekBar extends AppCompatSeekBar {
private boolean touch = false; //是否支持拖动, 默认为不可以
public CustomSeekBar(@NonNull Context context) {
super(context);
}
public CustomSeekBar(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public CustomSeekBar(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected synchronized void onDraw(Canvas canvas) {
super.onDraw(canvas);
}
public void setTouch(boolean touch) {
this.touch = touch;
}
/**
* onTouchEvent 处理
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
if (touch) {
return super.onTouchEvent(event);
}
return false;
}
}

View File

@@ -1,24 +0,0 @@
package com.mogo.och.taxi.passenger.ui
import com.amap.api.maps.model.LatLng
/**
* @author xiaoyuzhou
* @date 2021/6/24 11:33 上午
*/
interface ITaxiPassengerMapDirectionView {
/**
* 绘制路径线
*/
fun drawablePolyline()
/**
* 清除路径线
*/
fun clearPolyline()
/**
* 设置路径中起终点marker
*/
fun setLineMarker(startStation: LatLng, endStation: LatLng)
}

View File

@@ -1,133 +0,0 @@
package com.mogo.och.taxi.passenger.ui
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.mogo.commons.mvp.BaseFragment
import com.mogo.eagle.core.function.call.biz.CallerFuncBizManager
import com.mogo.eagle.core.function.view.OverMapView
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.taxi.passenger.R
import com.mogo.och.taxi.passenger.constant.TaxiPassengerOrderStatusEnum
import com.mogo.och.taxi.passenger.model.TaxiPassengerModel
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import java.util.concurrent.TimeUnit
class OverviewFragment : BaseFragment() {
private var overmapview: OverMapView?=null
private var lifeVisable2User = false
private var finalVisable2User = false
private var subscribe: Disposable?=null
override fun onResume() {
super.onResume()
overmapview?.onResume()
CallerLogger.d(SceneConstant.M_TAXI_P + TAG,"onResume")
lifeVisable2User = true
checkVisable()
}
override fun onPause() {
super.onPause()
overmapview?.onPause()
CallerLogger.d(SceneConstant.M_TAXI_P + TAG,"onPause")
lifeVisable2User = false
checkVisable()
}
private fun checkVisable() {
subscribe?.let {
if (!it.isDisposed) {
it.dispose()
}
}
subscribe = Observable.timer(500, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
if(lifeVisable2User){//展示
if(!finalVisable2User){
CallerLogger.d(SceneConstant.M_TAXI_P + TAG,"正在展示")
finalVisable2User = true
statusChange(TaxiPassengerModel.getInstance().curOrderStatus)
}
}else{//没有展示
if(finalVisable2User){
CallerLogger.d(SceneConstant.M_TAXI_P + TAG,"已经隐藏")
finalVisable2User = false
}
}
}
}
override fun onDestroy() {
super.onDestroy()
overmapview?.onDestroy()
CallerLogger.d(SceneConstant.M_TAXI_P + TAG,"onDestroy")
}
private fun statusChange(currentStatusEnum: TaxiPassengerOrderStatusEnum){
CallerLogger.d(SceneConstant.M_TAXI_P + TAG,"状态变更最新状态:$currentStatusEnum")
when (currentStatusEnum) {
TaxiPassengerOrderStatusEnum.OnTheWayToEnd -> {
CallerFuncBizManager.bizProvider.getAllV2XEvents()
}
TaxiPassengerOrderStatusEnum.ArriveAtEnd,TaxiPassengerOrderStatusEnum.JourneyCompleted,
TaxiPassengerOrderStatusEnum.Cancel -> {
// stop clear
stopAndClear()
}
else -> {}
}
}
private fun stopAndClear(){
CallerFuncBizManager.bizProvider.stopQueryV2XEvents()
UiThreadHandler.post({
overmapview?.clearV2XMarkers()
overmapview?.clearCustomPolyline()
}, UiThreadHandler.MODE.QUEUE)
}
override fun getLayoutId(): Int {
return R.layout.taxi_p_overmap_fragment
}
override fun getTagName(): String {
return TAG
}
override fun initViews() {
}
override fun initViews(savedInstanceState: Bundle?) {
super.initViews(savedInstanceState)
overmapview = findViewById(R.id.overMapView)
overmapview?.onCreateView(savedInstanceState)
CallerLogger.d(SceneConstant.M_TAXI_P + TAG,"onCreateView")
statusChange(TaxiPassengerModel.getInstance().curOrderStatus)
}
companion object{
private const val TAG = "OverviewFragment"
@JvmStatic
fun newInstance(): OverviewFragment {
val args = Bundle()
val fragment = OverviewFragment()
fragment.arguments = args
return fragment
}
}
}

View File

@@ -0,0 +1,180 @@
package com.mogo.och.taxi.passenger.ui
import android.annotation.SuppressLint
import android.content.Context
import android.content.Intent
import android.graphics.drawable.ClipDrawable
import android.graphics.drawable.Drawable
import android.graphics.drawable.LayerDrawable
import android.media.AudioManager
import android.provider.Settings
import android.text.TextUtils
import android.util.AttributeSet
import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.widget.SeekBar
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.content.ContextCompat
import com.mogo.commons.module.intent.IMogoIntentListener
import com.mogo.commons.module.intent.IntentManager
import com.mogo.commons.module.receiver.MogoReceiver
import com.mogo.commons.module.receiver.MogoReceiver.ACTION_VOLUME_CHANGE
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
import com.mogo.eagle.core.function.call.setting.CallerRequestActivityHandleManager
import com.mogo.eagle.core.utilcode.util.BrightnessUtils
import com.mogo.eagle.core.utilcode.util.ThreadUtils
import com.mogo.och.common.module.wigets.MineGradientDrawable
import com.mogo.och.taxi.passenger.R
import kotlinx.android.synthetic.main.taxi_p_setting_view.view.*
import me.jessyan.autosize.utils.AutoSizeUtils
class TaxiPSettingView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr), IMoGoAutopilotStatusListener,
IMogoIntentListener {
companion object {
const val TAG = "TaxiPSettingView"
}
init {
LayoutInflater.from(context).inflate(R.layout.taxi_p_setting_view, this, true)
initView()
}
private var mAudioManager: AudioManager? = null
private var mMaxVolume: Int? = 15
@SuppressLint("NewApi")
private fun initView() {
sb_light_bar.setProgressDrawableTiled(getDrawable())
sb_light_bar.max = 100
sb_light_bar.min = 5
sb_light_bar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
tvSoundPer.text = "$progress%"
if (fromUser) {
if (!Settings.System.canWrite(context)) {
CallerRequestActivityHandleManager.requestPermission(
TAG,
Settings.ACTION_MANAGE_WRITE_SETTINGS
)
return
}
if (BrightnessUtils.isAutoBrightnessEnabled()) {
BrightnessUtils.setBrightness(((progress.toFloat() / 100) * 255).toInt())
} else {
BrightnessUtils.setAutoBrightnessEnabled(true)
}
}
}
override fun onStartTrackingTouch(seekBar: SeekBar?) {}
override fun onStopTrackingTouch(seekBar: SeekBar?) {}
})
sb_light_bar.progress = (BrightnessUtils.getBrightness() * 100) / 255
sb_voice_bar.setProgressDrawableTiled(getDrawable())
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) {
tvVoicePer.text = "$progress%"
if (fromUser) {
mMaxVolume?.let {
var currentValue = ((progress.toFloat() / 100) * it).toInt()
if (currentValue <= 0) {
currentValue = 1
}
mAudioManager?.setStreamVolume(
AudioManager.STREAM_MUSIC,
currentValue,
AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE
)
}
}
}
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)
updateVolume()
}
}
private fun updateVolume() {
val mCurrentVolume = mAudioManager?.getStreamVolume(AudioManager.STREAM_MUSIC)
mMaxVolume?.let { max ->
mCurrentVolume?.let { current ->
if (current == 1) {
sb_voice_bar.progress = 5
tvVoicePer.text = "5%"
} else {
val fl = current.toFloat() / max * 100
sb_voice_bar.progress = fl.toInt()
tvVoicePer.text = "${fl.toInt()}%"
}
}
}
}
private fun getDrawable(): Drawable {
val dp2px = AutoSizeUtils.dp2px(context, 26f)//进度条高度
val color2CBFFC = ContextCompat.getColor(context, R.color.taxi_p_2CBFFC)
val color1060FF = ContextCompat.getColor(context, R.color.taxi_p_1060ff)
val color96A5C2 = ContextCompat.getColor(context, R.color.taxi_p_96a5c2)
val temp03 = MineGradientDrawable(color2CBFFC, color1060FF, dp2px)
val clipDrawable3 = ClipDrawable(temp03, Gravity.START, ClipDrawable.HORIZONTAL)
val temp01 = MineGradientDrawable(color96A5C2, color96A5C2, dp2px)
val arr = arrayOf(temp01, clipDrawable3)
val ld = LayerDrawable(arr)
ld.setDrawableByLayerId(android.R.id.background, temp01)
ld.setDrawableByLayerId(android.R.id.progress, clipDrawable3)
return ld
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
IntentManager.getInstance().registerIntentListener(ACTION_VOLUME_CHANGE, this)
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
IntentManager.getInstance().unregisterIntentListener(ACTION_VOLUME_CHANGE, this)
}
override fun onWindowVisibilityChanged(visibility: Int) {
super.onWindowVisibilityChanged(visibility)
if (visibility == View.VISIBLE) {
sb_light_bar.progress = (BrightnessUtils.getBrightness() * 100) / 255
}
}
override fun onWindowFocusChanged(hasWindowFocus: Boolean) {
super.onWindowFocusChanged(hasWindowFocus)
if (hasWindowFocus) {
sb_light_bar.progress = (BrightnessUtils.getBrightness() * 100) / 255
}
}
override fun onIntentReceived(intentStr: String?, intent: Intent?) {
if (TextUtils.equals(ACTION_VOLUME_CHANGE, intentStr)) {
if (intent!!.getIntExtra(
MogoReceiver.EXTRA_VOLUME_STREAM_TYPE, -1
) == AudioManager.STREAM_MUSIC
) {
ThreadUtils.runOnUiThread {
updateVolume()
}
}
}
}
}

View File

@@ -1,521 +0,0 @@
package com.mogo.och.taxi.passenger.ui;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.FragmentTransaction;
import androidx.lifecycle.Lifecycle;
import com.mogo.commons.module.status.MogoStatusManager;
import com.mogo.commons.mvp.MvpFragment;
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener;
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager;
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager;
import com.mogo.eagle.core.function.hmi.ui.msgbox.PassengerMsgBoxBubbleView;
import com.mogo.eagle.core.function.hmi.ui.msgbox.PassengerMsgBoxButtonView;
import com.mogo.eagle.core.function.hmi.ui.msgbox.PassengerMsgBoxListView;
import com.mogo.eagle.core.function.hmi.ui.widget.RomaPassengerView;
import com.mogo.eagle.core.function.view.MapBizView;
import com.mogo.eagle.core.utilcode.util.DeviceUtils;
import com.mogo.eagle.core.utilcode.util.OverlayViewUtils;
import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
import com.mogo.map.listener.IMogoMapListener;
import com.mogo.map.uicontroller.IMogoMapUIController;
import com.mogo.map.uicontroller.VisualAngleMode;
import com.mogo.och.taxi.passenger.R;
import com.mogo.och.taxi.passenger.callback.ITPClickStartAutopilotCallback;
import com.mogo.och.taxi.passenger.event.UIStatus;
import com.mogo.och.taxi.passenger.mulprocess.EmptyService;
import com.mogo.och.taxi.passenger.presenter.BaseTaxiPassengerPresenter;
import com.mogo.och.taxi.passenger.ui.comment.TaxiPassengerArrivedView;
import com.mogo.och.taxi.passenger.ui.leftmenu.OverlayLeftViewUtils;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import java.lang.ref.WeakReference;
import java.util.Objects;
/**
* 网约车基础Fragment主要负责布局通用界面处理站点面板和通话面板互斥情况
* <p>
* 部分业务放在了此处处理
*
* @author tongchenfei
*/
public class TaxiPassengerBaseFragment extends MvpFragment<TaxiPassengerBaseFragment, BaseTaxiPassengerPresenter>
implements IMogoMapListener, TaxiPassengerTaxiView, ITPClickStartAutopilotCallback {
public static final String TAG = "TaxiPassengerBaseFragment";
private MapBizView mapBizView;
private ImageView mAutopilotImage;
private ImageView mMapswitchBtn;
private RomaPassengerView romaPView;
private WeakReference<TaxiPassengerArrivedView> mArrivedEndView;
private WeakReference<TaxiPassengerCheckView> mArrivedCheckView;
private WeakReference<TaxiPassengerStartAutopilotView> mStartAutopilotView;
protected TaxiPassengerServingOrderFragment ochServingOrderFragment = null;
protected OverviewFragment overviewFragment = null;
//消息盒子
private PassengerMsgBoxButtonView viewPassengerMsgBoxButton;
private PassengerMsgBoxBubbleView viewPassengerMsgBoxBubble;
private PassengerMsgBoxListView viewPassengerMsgBoxList;
private final Handler mHandler = new Handler(Looper.getMainLooper());
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
EventBus.getDefault().register(this);
return super.onCreateView(inflater, container, savedInstanceState);
}
@Override
protected int getLayoutId() {
return R.layout.taxi_p_base_fragment;
}
@Override
public String getTagName() {
return "BaseOchTaxiPassengerFragment";
}
@Override
protected void initViews() {
mapBizView = findViewById(R.id.mapBizView);
mAutopilotImage = findViewById(R.id.module_och_autopilot_iv);
mMapswitchBtn = findViewById(R.id.module_och_taxi_swich_map_iv);
romaPView = findViewById(R.id.romaPView);
if(DeviceUtils.isLenovoModel() || DeviceUtils.isEB5Model()){
romaPView.setVisibility(View.VISIBLE);
}else{
romaPView.setVisibility(View.GONE);
}
updateSwitchMapIcon();
initListener();
onAutopilotStatusChanged(CallerAutoPilotStatusListenerManager.INSTANCE.getState());
switchVRFlatMode(MogoStatusManager.getInstance().isVrMode());
//预加载视频进程
EmptyService.Companion.startService(getContext());
//消息盒子
viewPassengerMsgBoxButton = findViewById(R.id.viewPassengerMsgBoxButton);
viewPassengerMsgBoxBubble = findViewById(R.id.viewPassengerMsgBoxBubble);
viewPassengerMsgBoxList = findViewById(R.id.viewPassengerMsgBoxList);
viewPassengerMsgBoxButton.setClickListener(show -> {
if (show) {
viewPassengerMsgBoxList.setVisibility(View.VISIBLE);
viewPassengerMsgBoxBubble.setVisibility(View.GONE);
viewPassengerMsgBoxBubble.isShowData(false);
} else {
viewPassengerMsgBoxList.setVisibility(View.GONE);
viewPassengerMsgBoxBubble.setVisibility(View.VISIBLE);
viewPassengerMsgBoxBubble.isShowData(true);
}
});
}
@Override
protected void initViews(Bundle savedInstanceState) {
super.initViews(savedInstanceState);
mapBizView.onCreate(savedInstanceState);
}
private void updateSwitchMapIcon() {
IMogoMapUIController controller = CallerMapUIServiceManager.INSTANCE.getMapUIController();
if (controller != null) {
if (controller.getCurrentMapVisualAngle().isLongSight()) {
mMapswitchBtn.setImageResource(R.drawable.taxi_p_switch_map_long);
} else if (controller.getCurrentMapVisualAngle().isMediumSight()) {
mMapswitchBtn.setImageResource(R.drawable.taxi_p_switch_map_medium);
} else {
mMapswitchBtn.setImageResource(R.drawable.taxi_p_switch_map_medium);
}
}
}
private void initListener() {
mMapswitchBtn.setOnClickListener(v -> {
IMogoMapUIController controller = CallerMapUIServiceManager.INSTANCE.getMapUIController();
if (controller != null) {
//切换地图的远近视图
if (controller.getCurrentMapVisualAngle().isLongSight()) {
Objects.requireNonNull(CallerMapUIServiceManager.INSTANCE.getMapUIController()).setLockMode(true);
controller.changeMapVisualAngle(VisualAngleMode.MODE_MEDIUM_SIGHT, null);
mMapswitchBtn.setImageResource(R.drawable.taxi_p_switch_map_medium);
} else if (controller.getCurrentMapVisualAngle().isMediumSight()) {
Objects.requireNonNull(CallerMapUIServiceManager.INSTANCE.getMapUIController()).setLockMode(false);
controller.changeMapVisualAngle(VisualAngleMode.MODE_LONG_SIGHT, null);
mMapswitchBtn.setImageResource(R.drawable.taxi_p_switch_map_long);
} else {
controller.changeMapVisualAngle(VisualAngleMode.MODE_MEDIUM_SIGHT, null);
mMapswitchBtn.setImageResource(R.drawable.taxi_p_switch_map_medium);
}
}
//OverlayLeftViewUtils.INSTANCE.dismissOverlayView();
});
findViewById(R.id.iv_temp).setOnClickListener(view -> {
OverlayLeftViewUtils.INSTANCE.showOverlayView(getActivity(), 0, true, -1, true);
//showOrHideArrivedEndLayout(true, "北京北京北京", "1527481606997577728");
//showOrHidePressengerCheckPager(true, "开始站点开", "开始站点开始站点开始", "2", "京A888888", "18811539480");
//OCHFloatWindowManager.getInstance().ShowFloatWindow(getContext());
});
}
private void initArrivedView() {
mArrivedEndView = new WeakReference<>(new TaxiPassengerArrivedView(getContext()));
mArrivedEndView.get().setITaxiPassengerScoreCallback((taxiPassengerScoreUpdateOrderReqBean) -> getPresenter().arrivedAndScore(taxiPassengerScoreUpdateOrderReqBean));
}
private void initCheckView() {
mArrivedCheckView = new WeakReference<>(new TaxiPassengerCheckView(getContext()));
mArrivedCheckView.get().setITaxiPassengerCommonValueCallback(phoneTail -> getPresenter().checkAndUpdateStatus(phoneTail));
}
@Override
public void onResume() {
super.onResume();
mapBizView.onResume();
// mPresenter.startOrStopOrderLoop();
// showOrHideServingOrderFragment(true,false);
// showOrHideStartAutopilotView(true,true);
}
/**
* VR mode 转换
*
* @param isVRMode
*/
public void switchVRFlatMode(boolean isVRMode) {
if (mRootView != null) {
mRootView.setVisibility(isVRMode ? View.VISIBLE : View.GONE);
}
}
/**
* 改变自动驾驶状态
*
* @param status 2 - running 1 - enable 2 - disable
*/
private int mPrevAPStatus = -1;
public void onAutopilotStatusChanged(int status) {
getActivity().runOnUiThread(() -> {
if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING != status) {
// 1. 主动开启自动驾驶中不为2为0、1则继续loading
return;
}
if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING == status
&& mPrevAPStatus != status) {
// 2. 主动开启自动驾驶中为2则停止loading并isStarting = false
onAutopilotStatusSuccessDone();
}
// 3. 其他过程直接更新
if (mPrevAPStatus != status) {
autopilotStatusAnimchanged(status);
}
mPrevAPStatus = status;
});
}
public void autopilotStatusAnimchanged(int status) {
// mAutopilotTv.setText(isInAutopilot?"自动驾驶":"开启自动驾驶");
if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING == status) {
mAutopilotImage.setImageResource(R.drawable.taxi_p_auto_nor);
} else if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE == status) {
mAutopilotImage.setImageResource(R.drawable.taxi_p_un_auto_nor);
} else {
mAutopilotImage.setImageResource(R.drawable.taxi_p_un_auto_nor);
}
}
private void startAutopilotDone(boolean success) {
mHandler.postDelayed(() -> onAutopilotStatusChanged(CallerAutoPilotStatusListenerManager.INSTANCE.getState()), 1000L);
}
@NonNull
@Override
protected BaseTaxiPassengerPresenter createPresenter() {
return new BaseTaxiPassengerPresenter(this);
}
@Override
public void onLowMemory() {
super.onLowMemory();
mapBizView.onLowMemory();
}
@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
mapBizView.onSaveInstanceState(outState);
}
@Override
public void onPause() {
super.onPause();
mapBizView.onPause();
}
@Override
public void onDestroyView() {
mapBizView.onDestroy();
super.onDestroyView();
EventBus.getDefault().unregister(this);
removeListener();
}
private void removeListener() {
if (mStartAutopilotView == null || mStartAutopilotView.get() == null) {
return;
}
mStartAutopilotView.get().setOnClickStartAutopilotBtnCallback(null);
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void changeOverview(UIStatus uiStatus) {
if (uiStatus.status == UIStatus.LIVE) {
showOrHideOverMapViewFragment(false);
showOrHideServingOrderFragment(true, false);
} else if (uiStatus.status == UIStatus.OVERVIEW) {
showOrHideOverMapViewFragment(true);
showOrHideServingOrderFragment(false, false);
}
}
@Override
public void onMapVisualAngleChanged(VisualAngleMode visualAngleMode) {
//todo ui 切换
}
/**
* 显示或隐藏订单信息
*
* @param isShow
*/
public void showOrHideServingOrderFragment(boolean isShow, boolean showOrHideLefeMenu) {
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
if (isShow) {
if (ochServingOrderFragment == null) {
ochServingOrderFragment = TaxiPassengerServingOrderFragment.newInstance();
}
if (showOrHideLefeMenu) {
OverlayLeftViewUtils.INSTANCE.showOverlayView(getActivity(), 0, true, -1, true);
}
if (ochServingOrderFragment.isHidden()) {
transaction
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.show(ochServingOrderFragment).commitAllowingStateLoss();
return;
}
if (ochServingOrderFragment.isAdded()) {
transaction
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.show(ochServingOrderFragment).commitAllowingStateLoss();
return;
}
transaction
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.add(R.id.module_mogo_och_navi_panel_container, ochServingOrderFragment)
.show(ochServingOrderFragment).commitAllowingStateLoss();
} else {
if (ochServingOrderFragment != null) {
transaction
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE)
.hide(ochServingOrderFragment).commitAllowingStateLoss();
}
if (showOrHideLefeMenu) {
OverlayLeftViewUtils.INSTANCE.dismissOverlayView(true);
}
}
}
/**
* 显示或隐藏全局概览
*
* @param isShow
*/
public void showOrHideOverMapViewFragment(boolean isShow) {
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
if (isShow) {
if (overviewFragment == null) {
overviewFragment = OverviewFragment.newInstance();
}
if (overviewFragment.isHidden()) {
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.show(overviewFragment).commitAllowingStateLoss();
transaction.setMaxLifecycle(overviewFragment, Lifecycle.State.RESUMED);
return;
}
if (overviewFragment.isAdded()) {
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.show(overviewFragment).commitAllowingStateLoss();
transaction.setMaxLifecycle(overviewFragment, Lifecycle.State.RESUMED);
return;
}
transaction
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.add(R.id.fl_container_overview, overviewFragment)
.show(overviewFragment).commitAllowingStateLoss();
transaction.setMaxLifecycle(overviewFragment, Lifecycle.State.RESUMED);
} else {
if (overviewFragment != null) {
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE)
.hide(overviewFragment).commitAllowingStateLoss();
transaction.setMaxLifecycle(overviewFragment, Lifecycle.State.STARTED);
}
}
}
/**
* 显示或者隐藏乘客可点击自动驾驶页面
* 乘客验证成功,页面显示,按钮置于不可点击
* 司机端确认可点击开启自动驾驶, 按钮置为可点击
* 订单前往目的地,页面消失
*
* @param isShow
*/
public void showOrHideStartAutopilotView(boolean isShow, boolean isClickable) {
if (isShow) {
if (mStartAutopilotView == null || mStartAutopilotView.get() == null) {
mStartAutopilotView = new WeakReference<>(new TaxiPassengerStartAutopilotView(getContext()));
}
mStartAutopilotView.get().setOnClickStartAutopilotBtnCallback(this);
OverlayViewUtils.showOverlayView(getActivity(), mStartAutopilotView.get());
updateStartAutopilotBtnStatus(isClickable);
} else {
if (mStartAutopilotView == null || mStartAutopilotView.get() == null) {
return;
}
mStartAutopilotView.get().setOnClickStartAutopilotBtnCallback(null);
mStartAutopilotView.get().closeAllAnimsAndView();
mStartAutopilotView = null;
}
}
public void updateStartAutopilotBtnStatus(boolean isClickable) {
if (mStartAutopilotView == null || mStartAutopilotView.get() == null) {
return;
}
mStartAutopilotView.get().handleStartAutopilotBtnStatus(isClickable);
}
public void onAutopilotStatusSuccessDone() {
if (mStartAutopilotView == null || mStartAutopilotView.get() == null) {
return;
}
mStartAutopilotView.get().onAutopilotStatusSuccess();
}
/**
* 显示或者隐藏到达乘客站点的洁面
* ① 取消订单 可有可无
* ② 到达上车点 隐藏到达终点的页面(上一个订单没有评价)
* ③ 到达目的地 显示到达终点的页面
* ④ debug 使用
*
* @param isShow true 展示 false 隐藏
* @param arrivedEndStation 目的地
* @param orderNo 订单No
*/
public void showOrHideArrivedEndLayout(boolean isShow, String arrivedEndStation, String orderNo) {
if (isShow) {
if (mArrivedEndView == null || mArrivedEndView.get() == null) {
initArrivedView();
}
OverlayViewUtils.showOverlayView(getActivity(), mArrivedEndView.get(), R.style.och_window_anim_alpha);
UiThreadHandler.postDelayed(new Runnable() {
@Override
public void run() {
mArrivedEndView.get().setDataAndStartAnimation(arrivedEndStation, orderNo);
}
//如果在全屏 回收需要300毫秒 后期优化使用单独的播放器
}, 500);
} else {
if (mArrivedEndView == null || mArrivedEndView.get() == null) {
return;
}
OverlayViewUtils.dismissOverlayView(mArrivedEndView.get());
}
}
// 20 司机到达上车点
public void preOrderThankPageTenlogic(String startSiteAddr,
String endSiteAddr,
String passengerNum,
String carNumber,
String phone) {
showOrHideArrivedEndLayout(false, "", "");
showOrHidePressengerCheckPager(true, startSiteAddr,
endSiteAddr, passengerNum, carNumber, phone);
}
/**
* ① 取消订单 到达上车点后乘客取消订单 隐藏乘客验证页面
* ② 司机到达上车点 到达上车点 展示乘客验证页面
* ③ 乘客到达上车点 手机号验证成功后 隐藏乘客验证页面
* ④ debug 使用
*/
public void showOrHidePressengerCheckPager(boolean isShow, String startSiteAddr,
String endSiteAddr,
String passengerNum,
String carNumber,
String phone) {
try {
if (isShow) {
if (mArrivedCheckView == null || mArrivedCheckView.get() == null) {
initCheckView();
}
mArrivedCheckView.get().setData(startSiteAddr, endSiteAddr, passengerNum, carNumber, phone);
OverlayViewUtils.showOverlayView(getActivity(), mArrivedCheckView.get());
} else {
if (mArrivedCheckView == null || mArrivedCheckView.get() == null) {
return;
}
OverlayViewUtils.dismissOverlayView(mArrivedCheckView.get());
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 用户评分后接口回调
*
* @param isSuccess true 打分成功 false 打分失败
*/
public void showArrivedEndLayout2Thank(boolean isSuccess) {
if (mArrivedEndView == null || mArrivedEndView.get() == null) {
initArrivedView();
}
if (isSuccess) {
mArrivedEndView.get().scoreSuccess();
} else {
mArrivedEndView.get().scoreFail();
}
}
@Override
public void onClickCallback() {
mPresenter.startAutopilot();
}
}

View File

@@ -0,0 +1,345 @@
package com.mogo.och.taxi.passenger.ui
import android.os.Bundle
import android.view.View
import com.mogo.commons.mvp.MvpFragment
import com.mogo.commons.voice.AIAssist
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager
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.Companion.M_TAXI_P
import com.mogo.eagle.core.utilcode.util.DeviceUtils
import com.mogo.eagle.core.utilcode.util.OverlayViewUtils
import com.mogo.map.listener.IMogoMapListener
import com.mogo.map.uicontroller.VisualAngleMode
import com.mogo.och.common.module.utils.RxUtils
import com.mogo.och.common.module.voice.VoiceNotice
import com.mogo.och.taxi.passenger.R
import com.mogo.och.taxi.passenger.callback.ITaxiPassengerCommonValueCallback
import com.mogo.och.taxi.passenger.presenter.BaseTaxiPassengerPresenter
import com.mogo.och.taxi.passenger.ui.arrived.ArrivedView
import com.mogo.och.taxi.passenger.ui.bottom.BottomBar
import com.mogo.och.taxi.passenger.ui.check.TaxiPassengerCheckView
import com.mogo.och.taxi.passenger.ui.startautopilot.StartAutopilotView
import com.mogo.och.taxi.passenger.widget.animutils.AnimationsContainer
import kotlinx.android.synthetic.main.taxi_p_base_fragment.*
import java.lang.ref.WeakReference
/**
* 网约车基础Fragment主要负责布局通用界面处理站点面板和通话面板互斥情况
*
*
* 部分业务放在了此处处理
*
* @author tongchenfei
*/
class TaxiPassengerBaseFragment() :
MvpFragment<TaxiPassengerBaseFragment?, BaseTaxiPassengerPresenter?>(), IMogoMapListener,
TaxiPassengerTaxiView {
/**
* 到达目的地
*/
private var mArrivedEndView: WeakReference<ArrivedView?>? = null
/**
* 手机号后四位验证
*/
private var mArrivedCheckView: WeakReference<TaxiPassengerCheckView?>? = null
/**
* 启动自驾页面
*/
private var mStartAutopilotView: WeakReference<StartAutopilotView?>? = null
private var createProgressDialogAnim: AnimationsContainer?=null
override fun getLayoutId(): Int {
return R.layout.taxi_p_base_fragment
}
override fun getTagName(): String {
return "BaseOchTaxiPassengerFragment"
}
override fun initViews() {
initListener()
}
override fun initViews(savedInstanceState: Bundle?) {
super.initViews(savedInstanceState)
mapBizView!!.onCreate(savedInstanceState)
overMapView.onCreateView(savedInstanceState)
overMapView.hideResetView()
createProgressDialogAnim = AnimationsContainer(R.array.xiaozhi_normal, 20,aciv_xiaozhi_normal)
createProgressDialogAnim?.setOnAnimStopListener(object :AnimationsContainer.OnAnimationStoppedListener{
override fun AnimationStopped() {
CallerLogger.d(M_TAXI_P + TAG, "动画暂停")
}
})
}
private fun initListener() {
ck_setting.isChecked = false
ck_setting.setOnCheckedChangeListener { _, isChecked ->
clSettingView.visibility = if(isChecked) View.VISIBLE else View.GONE
}
bottom.setOverMapApplyClick(object : BottomBar.ApplyClickLintener{
override fun onApplyClick(selectItem: BottomBar.SelectView) {
when (selectItem) {
BottomBar.SelectView.PRECISIONMAP -> {
overMapView.visibility = View.GONE
mapBizView.visibility = View.VISIBLE
presenter?.setItineraryVisibility()
ck_setting.visibility = View.VISIBLE
if (DeviceUtils.isLenovoModel() || DeviceUtils.isEB5Model()) {
romaPView.visibility = View.VISIBLE
} else {
romaPView.visibility = View.GONE
}
rv_location_center.visibility = View.VISIBLE
pcnActionView.visibility = View.VISIBLE
CallerHmiManager.showTrafficLightView()
infoVideoView.visibility = View.GONE
CallerHmiManager.showTurnLightView()
}
BottomBar.SelectView.OVERMAPVIEW -> {
overMapView.visibility = View.VISIBLE
mapBizView.visibility = View.GONE
presenter?.setItineraryVisibility()
ck_setting.visibility = View.VISIBLE
romaPView.visibility = View.GONE
rv_location_center.visibility = View.VISIBLE
pcnActionView.visibility = View.VISIBLE
CallerHmiManager.showTrafficLightView()
infoVideoView.visibility = View.GONE
CallerHmiManager.showTurnLightView()
}
BottomBar.SelectView.VIDEO -> {
overMapView.visibility = View.GONE
mapBizView.visibility = View.GONE
presenter?.setItineraryVisibility()
ck_setting.visibility = View.GONE
ck_setting.isChecked = false
romaPView.visibility = View.GONE
rv_location_center.visibility = View.GONE
pcnActionView.visibility = View.GONE
CallerHmiManager.hideTrafficLightView()
infoVideoView.visibility = View.VISIBLE
CallerHmiManager.hideTurnLightView()
}
else -> {}
}
}
})
rv_location_center.onClick {
when (bottom.getCurrentPage()) {
BottomBar.SelectView.PRECISIONMAP -> {
val controller = CallerMapUIServiceManager.getMapUIController()
if (controller != null) {
//切换到地图中间
controller.changeMapVisualAngle(VisualAngleMode.MODE_MEDIUM_SIGHT, null)
// 切换缩放到中视角
controller.changeZoom2(0.8f)
}
}
BottomBar.SelectView.OVERMAPVIEW -> {
overMapView.displayCustomOverView()
}
else -> {}
}
}
view?.viewTreeObserver?.addOnWindowFocusChangeListener {
if(it){
CallerLogger.d(M_TAXI_P + TAG, "windows获取焦点")
createProgressDialogAnim?.start()
}else{
CallerLogger.d(M_TAXI_P + TAG, "window失去焦点")
createProgressDialogAnim?.stop()
}
}
}
private fun initCheckView() {
mArrivedCheckView = WeakReference(TaxiPassengerCheckView(context))
mArrivedCheckView!!.get()!!.iTaxiPassengerCommonValueCallback =
ITaxiPassengerCommonValueCallback { phoneTail: String? ->
getPresenter()!!.checkAndUpdateStatus(phoneTail)
}
}
override fun onResume() {
super.onResume()
mapBizView!!.onResume()
overMapView.onResume()
CallerLogger.d(M_TAXI_P + TAG, "onResume")
createProgressDialogAnim?.start()
}
override fun createPresenter(): BaseTaxiPassengerPresenter {
return BaseTaxiPassengerPresenter(this)
}
override fun onLowMemory() {
super.onLowMemory()
mapBizView!!.onLowMemory()
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
mapBizView!!.onSaveInstanceState(outState)
}
override fun onPause() {
super.onPause()
mapBizView!!.onPause()
overMapView?.onPause()
CallerLogger.d(M_TAXI_P + TAG, "onPause")
createProgressDialogAnim?.stop()
}
override fun onDestroyView() {
mapBizView!!.onDestroy()
overMapView?.onDestroy()
super.onDestroyView()
}
/**
* 显示或隐藏订单信息
*
* @param isShow
*/
fun showOrHideServingOrderFragment(isShow: Boolean) {
when (bottom.getCurrentPage()) {
BottomBar.SelectView.OVERMAPVIEW,BottomBar.SelectView.PRECISIONMAP -> {
if (isShow) {
if(itinerary.visibility!=View.VISIBLE) {
itinerary.visibility = View.VISIBLE
}
} else {
if(itinerary.visibility!=View.GONE) {
itinerary.visibility = View.GONE
}
}
}
BottomBar.SelectView.VIDEO,BottomBar.SelectView.NONE -> {
if(itinerary.visibility!=View.GONE) {
itinerary.visibility = View.GONE
}
}
}
}
/**
* 显示或者隐藏乘客可点击自动驾驶页面
* 乘客验证成功,页面显示,按钮置于不可点击
* 司机端确认可点击开启自动驾驶, 按钮置为可点击
* 订单前往目的地,页面消失
*
* @param isShow
*/
fun showOrHideStartAutopilotView(isShow: Boolean) {
if (isShow) {
exitFullVideoScreen(false)
if (mStartAutopilotView == null || mStartAutopilotView!!.get() == null) {
mStartAutopilotView = WeakReference(StartAutopilotView(requireContext()))
}
mStartAutopilotView?.get()?.let {
OverlayViewUtils.showOverlayView(activity, it)
it.handleStartAutopilotBtnStatus(false)
}
} else {
mStartAutopilotView?.get()?.closeAllAnimsAndView()
mStartAutopilotView = null
}
}
/**
* 显示或者隐藏到达乘客站点的洁面
* ① 取消订单 可有可无
* ② 到达上车点 隐藏到达终点的页面(上一个订单没有评价)
* ③ 到达目的地 显示到达终点的页面
* ④ debug 使用
*
* @param isShow true 展示 false 隐藏
*/
fun showOrHideArrivedEndLayout(isShow: Boolean) {
if (isShow) {
exitFullVideoScreen(true)
if (mArrivedEndView == null || mArrivedEndView!!.get() == null) {
mArrivedEndView = WeakReference(ArrivedView(context))
}
mArrivedEndView?.get()?.let {
OverlayViewUtils.showOverlayView(activity, it, R.style.och_window_anim_alpha)
RxUtils.createSubscribe(500) {
it.setDataAndStartAnimation()
VoiceNotice.showNotice("已到达目的地,带好随身物品,右侧下车更安全!期待下次再见", AIAssist.LEVEL2)
}
}
} else {
mArrivedEndView?.get()?.let {
OverlayViewUtils.dismissOverlayView(it)
}
}
}
private fun exitFullVideoScreen(resetVideoPlayer: Boolean) {
infoVideoView.exitFullScreenMode(resetVideoPlayer)
}
fun showOrHideOverMapView(){
overMapView?.clearV2XMarkers()
overMapView?.clearCustomPolyline()
}
/**
* ① 取消订单 到达上车点后乘客取消订单 隐藏乘客验证页面
* ② 司机到达上车点 到达上车点 展示乘客验证页面
* ③ 乘客到达上车点 手机号验证成功后 隐藏乘客验证页面
* ④ debug 使用
*/
fun showOrHidePressengerCheckPager(
isShow: Boolean,
startSiteAddr: String? = "",
endSiteAddr: String? = "",
passengerNum: String? = "",
carNumber: String? = "",
phone: String? = ""
) {
try {
if (isShow) {
exitFullVideoScreen(false)
if (mArrivedCheckView == null || mArrivedCheckView!!.get() == null) {
initCheckView()
}
mArrivedCheckView!!.get()!!
.setData(startSiteAddr, endSiteAddr, passengerNum, carNumber, phone)
OverlayViewUtils.showOverlayView(activity, mArrivedCheckView!!.get())
} else {
if (mArrivedCheckView == null || mArrivedCheckView!!.get() == null) {
return
}
OverlayViewUtils.dismissOverlayView(mArrivedCheckView!!.get())
}
} catch (e: Exception) {
e.printStackTrace()
}
}
fun showOverMapView() {
bottom.setCheckIndex(BottomBar.SelectView.OVERMAPVIEW)
}
companion object {
@JvmField
val TAG = "TaxiPassengerBaseFragment"
}
}

View File

@@ -1,271 +0,0 @@
package com.mogo.och.taxi.passenger.ui
import android.content.Context
import android.os.Bundle
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.MotionEvent
import android.widget.RelativeLayout
import com.amap.api.maps.AMap
import com.amap.api.maps.CameraUpdate
import com.amap.api.maps.CameraUpdateFactory
import com.amap.api.maps.TextureMapView
import com.amap.api.maps.model.BitmapDescriptor
import com.amap.api.maps.model.BitmapDescriptorFactory
import com.amap.api.maps.model.CameraPosition
import com.amap.api.maps.model.CustomMapStyleOptions
import com.amap.api.maps.model.LatLng
import com.amap.api.maps.model.LatLngBounds
import com.amap.api.maps.model.Marker
import com.amap.api.maps.model.MarkerOptions
import com.amap.api.maps.model.Polyline
import com.amap.api.maps.model.PolylineOptions
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.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager.addListener
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.och.taxi.passenger.R
import com.mogo.och.taxi.passenger.callback.ITaxiPassengerMapViewCallback
import com.mogo.och.taxi.passenger.utils.TaxiPassengerMapAssetStyleUtil
/**
* 乘客屏小地图
*/
class TaxiPassengerMapDirectionView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : RelativeLayout(context, attrs, defStyleAttr), IMoGoChassisLocationGCJ02Listener,
ITaxiPassengerMapDirectionView, AMap.OnCameraChangeListener {
companion object {
//小地图名称
const val TAG = "TaxiPassengerMapDirectionView"
private const val zoomLevel = 13.0f
}
private lateinit var mAMapNaviView: TextureMapView
private lateinit var mAMap: AMap
private lateinit var mCarMarker: Marker
private lateinit var mStartMarker: Marker
private lateinit var mEndMarker: Marker
private lateinit var mArrivedRes: BitmapDescriptor
private lateinit var mUnArrivedRes: BitmapDescriptor
private val mCoordinatesLatLng: MutableList<LatLng> = ArrayList()
private var mPolyline: Polyline? = null
private var mCameraUpdate: CameraUpdate? = null
private var mContext: Context? = null
var textureList: MutableList<BitmapDescriptor?> = ArrayList()
var texIndexList: MutableList<Int> = ArrayList()
private var mITaxiPassengerMapViewCallback: ITaxiPassengerMapViewCallback? = null
private val routeArrivied: MutableList<LatLng> = ArrayList()
private val routeArriving: MutableList<LatLng> = ArrayList()
private var location: MogoLocation? = null
init {
initView(context)
}
fun setTaxiPassengerMapViewCallback(ITaxiPassengerMapViewCallback: ITaxiPassengerMapViewCallback?) {
mITaxiPassengerMapViewCallback = ITaxiPassengerMapViewCallback
}
private fun initView(context: Context) {
d(SceneConstant.M_TAXI_P + TAG, "initView")
mContext = context
LayoutInflater.from(context).inflate(R.layout.taxi_p_map_view, this)
mAMapNaviView = findViewById(R.id.taxi_p_order_amap_view)
initAMapView()
// 注册定位监听
addListener(TAG, 10, this)
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
// 注册定位监听
CallerChassisLocationGCJ02ListenerManager.removeListener(TAG)
}
private fun initAMapView() {
mCameraUpdate = CameraUpdateFactory.zoomTo(zoomLevel)
mAMap = mAMapNaviView.map
// 设置导航地图模式aMap是地图控制器对象。
mAMap.mapType = AMap.MAP_TYPE_NIGHT
// 关闭显示实时路况图层aMap是地图控制器对象。
mAMap.isTrafficEnabled = false
// 设置 锚点 图标
mCarMarker = mAMap.addMarker(MarkerOptions().icon(BitmapDescriptorFactory.fromResource(R.drawable.taxi_p_map_car)).anchor(0.5f, 0.5f))
mStartMarker = mAMap.addMarker(MarkerOptions().icon(BitmapDescriptorFactory.fromResource(R.drawable.taxi_p_map_view_dir_start)))
mEndMarker = mAMap.addMarker(MarkerOptions().icon(BitmapDescriptorFactory.fromResource(R.drawable.taxi_p_map_view_dir_end)))
mArrivedRes = BitmapDescriptorFactory.fromResource(R.drawable.taxi_p_map_arrow_arrived)
mUnArrivedRes = BitmapDescriptorFactory.fromResource(R.drawable.taxi_p_map_arrow_un_arrive)
// 加载自定义样式
val customMapStyleOptions = CustomMapStyleOptions()
.setEnable(true)
.setStyleData(TaxiPassengerMapAssetStyleUtil.getAssetsStyle(context, "map_style.data"))
.setStyleExtraData(TaxiPassengerMapAssetStyleUtil.getAssetsExtraStyle(context, "map_style_extra.data"))
// 设置自定义样式
mAMap.setCustomMapStyle(customMapStyleOptions)
//设置希望展示的地图缩放级别
mAMap.moveCamera(mCameraUpdate)
// 设置地图的样式
mAMap.uiSettings.apply {
isZoomControlsEnabled = false // 地图缩放级别的交换按钮
setAllGesturesEnabled(false) // 所有手势
isMyLocationButtonEnabled = false // 显示默认的定位按钮
setLogoBottomMargin(-150) //设置Logo下边界距离屏幕底部的边距,设置为负值即可
}
mAMap.setOnMapLoadedListener {
d(SceneConstant.M_TAXI_P + TAG, "smp---onMapLoaded")
// 加载自定义样式
val options = CustomMapStyleOptions()
.setEnable(true)
.setStyleData(
TaxiPassengerMapAssetStyleUtil.getAssetsStyle(context, "map_style.data")
)
.setStyleExtraData(
TaxiPassengerMapAssetStyleUtil.getAssetsExtraStyle(context, "map_style_extra.data")
)
// 设置自定义样式
mAMap.setCustomMapStyle(options)
mAMapNaviView.map.setPointToCenter(mAMapNaviView.width / 2, mAMapNaviView.height / 2)
}
//设置地图状态的监听接口
mAMap.setOnCameraChangeListener(this)
}
override fun onInterceptTouchEvent(ev: MotionEvent): Boolean {
return true
}
override fun onChassisLocationGCJ02(mogoLocation: MogoLocation?) {
if (mogoLocation == null) {
return
}
val currentLatLng = LatLng(mogoLocation.latitude, mogoLocation.longitude)
if (mPolyline!=null&&!mPolyline!!.points.isNullOrEmpty()) {
//圈定地图显示范围
val endLatLng = mPolyline!!.points.last()
//存放经纬度
val boundsBuilder = LatLngBounds.Builder().apply {
include(currentLatLng)
include(endLatLng)
}
//第二个参数为四周留空宽度
mAMap.moveCamera(CameraUpdateFactory.newLatLngBoundsRect(boundsBuilder.build(), 100, 100, 100, 100))
} else {
//设置希望展示的地图缩放级别
val cameraPosition = CameraPosition.Builder()
.target(mCarMarker.position)
.tilt(0f)
.bearing(mogoLocation.heading.toFloat())
.zoom(zoomLevel).build()
mAMap.moveCamera(CameraUpdateFactory.newCameraPosition(cameraPosition))
}
//更新车辆位置
mCarMarker.rotateAngle = (360 - mogoLocation.heading).toFloat()
mCarMarker.position = currentLatLng
mCarMarker.setToTop()
}
override fun setLineMarker(startStation:LatLng,endStation:LatLng) {
mStartMarker.isVisible = false
mEndMarker.isVisible = false
mStartMarker.position = startStation
mStartMarker.isVisible = true
mEndMarker.position = endStation
mEndMarker.isVisible = true
}
override fun drawablePolyline() {
if (routeArrivied.isEmpty() && routeArriving.isEmpty()) {
d(SceneConstant.M_TAXI + TAG, "没有点")
return
}
texIndexList.clear()
val allPoints = ArrayList(routeArrivied)
for (i in routeArrivied.indices) {
if (routeArrivied.size > 1 && i < routeArrivied.size - 1) {
texIndexList.add(0)
}
}
texIndexList.add(0)
allPoints.add(LatLng(location!!.latitude, location!!.longitude))
allPoints.addAll(routeArriving)
for (ignored in routeArrivied) {
texIndexList.add(1)
}
if (mPolyline != null) {
mPolyline!!.points = allPoints
mPolyline!!.options.customTextureIndex = texIndexList
return
}
if(textureList.isEmpty()) {
textureList.add(mArrivedRes)
textureList.add(mUnArrivedRes)
}
//设置线段纹理
val polylineOptions = PolylineOptions().apply {
addAll(allPoints)
isUseTexture = true
width(15f)
lineCapType(PolylineOptions.LineCapType.LineCapRound)
customTextureList = textureList
customTextureIndex = texIndexList
}
// 绘制线
mPolyline = mAMap.addPolyline(polylineOptions)
}
override fun clearPolyline() {
if (mPolyline != null) {
mPolyline!!.remove()
mPolyline = null
}
mStartMarker.isVisible = false
mEndMarker.isVisible = false
}
fun onCreateView(savedInstanceState: Bundle?) {
mAMapNaviView.onCreate(savedInstanceState)
}
fun onResume() {
mAMapNaviView.onResume()
}
fun onPause() {
mAMapNaviView.onPause()
}
fun onDestroy() {
mAMapNaviView.onDestroy()
}
fun setCoordinatesLatLng(routeArrivied: List<LatLng>?, routeArriving: List<LatLng>?, location: MogoLocation?) {
this.routeArrivied.clear()
this.routeArrivied.addAll(routeArrivied!!)
this.routeArriving.clear()
this.routeArriving.addAll(routeArriving!!)
this.location = location
}
override fun onCameraChange(cameraPosition: CameraPosition) {
mITaxiPassengerMapViewCallback!!.onCameraChange(cameraPosition.bearing)
}
override fun onCameraChangeFinish(cameraPosition: CameraPosition) {}
}

View File

@@ -1,370 +0,0 @@
package com.mogo.och.taxi.passenger.ui
import android.animation.Animator
import android.animation.AnimatorInflater
import android.os.Build
import android.os.Bundle
import android.view.View
import android.view.animation.Animation
import android.view.animation.RotateAnimation
import android.widget.ImageView
import android.widget.TextView
import androidx.annotation.RequiresApi
import androidx.appcompat.widget.AppCompatSeekBar
import androidx.fragment.app.FragmentTransaction
import com.amap.api.maps.model.LatLng
import com.mogo.commons.mvp.MvpFragment
import com.mogo.eagle.core.data.map.MogoLocation
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
import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import com.mogo.och.common.module.map.AmapNaviToDestinationModel
import com.mogo.och.common.module.map.CommonAmapNaviVIew
import com.mogo.och.common.module.utils.DateTimeUtil
import com.mogo.och.common.module.utils.NumberFormatUtil
import com.mogo.och.common.module.wigets.OCHGradientTextView
import com.mogo.och.common.module.wigets.OCHRadiusImageView
import com.mogo.och.taxi.passenger.R
import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRespBean
import com.mogo.och.taxi.passenger.callback.ITaxiPassengerMapViewCallback
import com.mogo.och.taxi.passenger.constant.TaxiPassengerConst
import com.mogo.och.taxi.passenger.constant.TaxiPassengerOrderStatusEnum
import com.mogo.och.taxi.passenger.model.TaxiPassengerModel
import com.mogo.och.taxi.passenger.presenter.TaxiPassengerServingOrderPresenter
import com.mogo.och.taxi.passenger.utils.TPRouteDataTestUtils
import java.util.Calendar
/**
* @author: wangmingjun
* @date: 2022/3/8
*/
class TaxiPassengerServingOrderFragment :
MvpFragment<TaxiPassengerServingOrderFragment?, TaxiPassengerServingOrderPresenter?>(),
TaxiPassengerTaxiView, ITaxiPassengerMapViewCallback {
private val TAG = TaxiPassengerServingOrderFragment::class.java.simpleName
private var mTPSpeedTv: OCHGradientTextView? = null
private var mTPSpeedTvShadowBg: TextView? = null
private var mTPOrderStatus: TextView? = null
private var mTPOrderStartStation: TextView? = null
private var mTPOrderEndStation: TextView? = null
private var mTPOrderRemainDis: TextView? = null
private var mTPOrderRemainDisUnit: TextView? = null
private var mTPOrderRemainTime: TextView? = null
private var mTPOrderRemainArriveTime: TextView? = null
private var mMapArrowIcon: ImageView? = null
private var mMapRottingView: TaxiPassengerMapDirectionView? = null
private var mAmapNaviVIew: CommonAmapNaviVIew? = null
private var lastBearing = 0f
private var rotateAnimation: RotateAnimation? = null
private var mProgressSeekBar: AppCompatSeekBar? = null
private var mProgessDes: TextView? = null
private var mSpeedLayoutBg: OCHRadiusImageView? = null
@Volatile
private var mLimitingVelocity = 0 // 返回的道路限速值
override fun getLayoutId(): Int {
return R.layout.taxi_p_activity_serving_order_view
}
override fun getTagName(): String {
return "TaxiPassengerServingOrderFragment"
}
override fun initViews() {
mTPSpeedTv = findViewById(R.id.taxi_p_speed_tv)
mTPSpeedTvShadowBg = findViewById(R.id.taxi_p_speed_tv_bg)
mTPSpeedTv!!.setVertrial(true)
mTPSpeedTv!!.setmColorList(
intArrayOf(
resources.getColor(R.color.taxi_p_speed_normal_color1), resources.getColor(
R.color.taxi_p_speed_normal_color2
)
)
)
mTPSpeedTv!!.text = 0.toString()
mTPSpeedTvShadowBg!!.text = 0.toString()
mTPOrderStatus = findViewById(R.id.taxi_p_order_status_tv)
mTPOrderStartStation = findViewById(R.id.taxi_p_order_status_start_station_tv)
mTPOrderEndStation = findViewById(R.id.taxi_p_order_status_end_station_tv)
mTPOrderRemainDis = findViewById(R.id.taxi_p_order_remain_distance)
mTPOrderRemainDisUnit = findViewById(R.id.taxi_p_order_remain_distance_unit)
mTPOrderRemainTime = findViewById(R.id.taxi_p_order_remain_time)
mTPOrderRemainArriveTime = findViewById(R.id.taxi_p_order_remain_arrive_time)
mMapArrowIcon = findViewById(R.id.taxi_p_arrow_nor)
mProgressSeekBar = findViewById(R.id.taxi_p_seekbar)
mProgessDes = findViewById(R.id.taxi_p_progress_des)
mSpeedLayoutBg = findViewById(R.id.taxi_p_speed_bg)
mTPOrderStatus!!.setOnLongClickListener {
TPRouteDataTestUtils.converToRouteData()
true
}
}
override fun initViews(savedInstanceState: Bundle?) {
super.initViews(savedInstanceState)
initRouteNaviView(savedInstanceState)
initAmapNaviView(savedInstanceState)
}
private fun initAmapNaviView(savedInstanceState: Bundle?) {
mAmapNaviVIew = findViewById(R.id.taxi_p_order_amap_navi_view)
mAmapNaviVIew?.onCreate(savedInstanceState)
TaxiPassengerModel.getInstance().startNaviByAmap()
}
private fun initRouteNaviView(savedInstanceState: Bundle?) {
mMapRottingView = findViewById(R.id.taxi_p_order_rotting_map_view)
mMapRottingView?.onCreateView(savedInstanceState)
mMapRottingView?.setTaxiPassengerMapViewCallback(this)
}
override fun createPresenter(): TaxiPassengerServingOrderPresenter {
return TaxiPassengerServingOrderPresenter(this)
}
/**
* 设置进度条最大值为 起点终点首次规划出的值
*/
private fun setSeekBarMax() {
//计算订单起点和终点距离
val maxInt = SharedPrefsMgr.getInstance(requireContext())
.getInt(TaxiPassengerConst.SP_KEY_ORDER_SUM_DIS, 0)
d(SceneConstant.M_TAXI_P + TAG, "maxInt = $maxInt")
mProgressSeekBar!!.max = maxInt
}
/**
* 行驶进度值更新
*/
@RequiresApi(api = Build.VERSION_CODES.N)
private fun updateDriveProcessLoading(progressLoading: Int) {
val progressInt = SharedPrefsMgr.getInstance(requireContext())
.getInt(TaxiPassengerConst.SP_KEY_ORDER_SUM_DIS, 0) - progressLoading
d(SceneConstant.M_TAXI_P + TAG, "progressInt = $progressInt")
mProgressSeekBar?.setProgress(progressInt, true)
mProgressSeekBar?.jumpDrawablesToCurrentState()
}
private fun updateDriveRoadName(currentRoadName: String) {
mProgessDes?.text = currentRoadName
}
override fun onResume() {
super.onResume()
mMapRottingView?.onResume()
mAmapNaviVIew?.onResume()
TaxiPassengerModel.getInstance().initGeocodeSearch()
}
override fun onHiddenChanged(hidden: Boolean) {
super.onHiddenChanged(hidden)
if (hidden) { //fragment 隐藏, 导航取消c
clearPolyline()
TaxiPassengerModel.getInstance().destoryGeocodeSearch()
} else { //fragment 显示, 导航开始
e(SceneConstant.M_TAXI_P + "TaxiPassengerNaviTo", "initGeocodeSearch")
TaxiPassengerModel.getInstance().initGeocodeSearch()
}
}
override fun onPause() {
super.onPause()
mMapRottingView?.onPause()
mAmapNaviVIew?.onPause()
}
override fun onDestroy() {
super.onDestroy()
mMapRottingView?.onDestroy()
mAmapNaviVIew?.onDestroy()
AmapNaviToDestinationModel.getInstance(context).destroyAmaNavi()
TaxiPassengerModel.getInstance().destoryGeocodeSearch()
}
fun showRottingMapView() {
if (mAmapNaviVIew != null && mAmapNaviVIew!!.visibility == View.VISIBLE) {
mAmapNaviVIew!!.visibility = View.GONE
}
if (mMapRottingView != null && mMapRottingView!!.visibility == View.GONE) {
mMapRottingView!!.visibility = View.VISIBLE
}
}
fun setLineMarker(startStation: LatLng?, endStation: LatLng?) {
if (startStation != null && endStation != null) {
UiThreadHandler.post { mMapRottingView?.setLineMarker(startStation, endStation) }
} else {
clearPolyline()
}
}
fun routeResultByServer(
routeArriviedTemp: List<LatLng>?,
routeArrivingTemp: List<LatLng>?,
location: MogoLocation
) {
if (routeArriviedTemp.isNullOrEmpty()||routeArrivingTemp.isNullOrEmpty()) {
clearPolyline()
} else {
drawablePolylineByServerRoute(routeArriviedTemp, routeArrivingTemp,location)
}
}
private fun drawablePolylineByServerRoute(routeArrivied: List<LatLng>?,
routeArriving: List<LatLng>?,
location: MogoLocation?) {
mMapRottingView?.setCoordinatesLatLng(routeArrivied, routeArriving,location)
UiThreadHandler.post { mMapRottingView?.drawablePolyline() }
}
private fun clearPolyline() {
UiThreadHandler.post { mMapRottingView?.clearPolyline() }
}
fun updateOrderStatusView(order: TaxiPassengerOrderQueryRespBean.Result) {
mTPOrderStartStation!!.text = order.startSiteAddr
mTPOrderEndStation!!.text = order.endSiteAddr
if (TaxiPassengerOrderStatusEnum.ArriveAtStart.code == order.orderStatus) {
mTPOrderStatus!!.text = getString(R.string.taxi_p_arrive_to_start)
mTPOrderRemainDis!!.text = "--"
mTPOrderRemainTime!!.text = "--"
mTPOrderRemainArriveTime!!.text = "--"
setSeekBarMax()
return
}
if (TaxiPassengerOrderStatusEnum.OnTheWayToEnd.code == order.orderStatus) {
mTPOrderStatus!!.setText(R.string.taxi_p_start_to_end)
setSeekBarMax()
return
}
}
/**
* 剩余里程,剩余时间,当前定位点所在道路
* @param meters 单位 米
* @param remainTime 单位 秒
*/
@RequiresApi(api = Build.VERSION_CODES.N)
fun onCurrentOrderDistToEndChanged(meters: Long, remainTime: Long) {
var disUnit = "公里"
var remainDis = "0"
if (meters > 0) {
if (meters / 1000 < 1) {
disUnit = ""
remainDis = Math.round(meters.toFloat()).toString()
} else {
disUnit = "公里"
remainDis = NumberFormatUtil.formatLong(meters.toDouble() / 1000)
}
}
val time = Math.ceil(remainTime.toDouble() / 60f).toInt()
val beforeTime = Calendar.getInstance()
beforeTime.add(Calendar.MINUTE, time)
val arriveTime = DateTimeUtil.formatCalendarToString(beforeTime, DateTimeUtil.HH_mm)
updateOrderDisAndTimeView(remainDis, disUnit, time, arriveTime)
updateDriveProcessLoading(meters.toInt())
}
fun onCurrentRoadName(roadName: String) {
updateDriveRoadName(roadName)
}
private fun updateOrderDisAndTimeView(
remainDis: String,
remainDisUnit: String,
remainTime: Int,
arriveTime: String
) {
mTPOrderRemainDis!!.text = remainDis
mTPOrderRemainDisUnit!!.text = remainDisUnit
mTPOrderRemainTime!!.text = remainTime.toString()
mTPOrderRemainArriveTime!!.text = arriveTime
}
fun onCarLocationChanged(location: MogoLocation) {
updateSpeedView(location.gnssSpeed)
}
fun onLimitingVelocityChange(limitingVelocity: Int) {
mLimitingVelocity = limitingVelocity
}
/**
* 更新速度
*
* @param newSpeed
*/
private fun updateSpeedView(newSpeed: Float) {
val speed = (Math.abs(newSpeed) * 3.6f).toInt() // 倒车时工控机反馈定位信息中speed为负值
d(SceneConstant.M_TAXI_P + TAG, "mLimitingVelocity = $mLimitingVelocity")
mTPSpeedTv?.setmColorList(
intArrayOf(
resources.getColor(R.color.taxi_p_speed_normal_color1), resources.getColor(
R.color.taxi_p_speed_normal_color2
)
)
)
mTPSpeedTv?.text = speed.toString()
mTPSpeedTvShadowBg?.text = speed.toString()
mSpeedLayoutBg?.setImageResource(R.drawable.taxi_p_speed_light_green_bg)
}
override fun onCameraChange(bearing: Float) {
startIvCompass(360-bearing)
}
/**
* 设置指南针旋转
*
* @param bearing
*/
private fun startIvCompass(bearing: Float) {
d(SceneConstant.M_TAXI_P + TAG, "startIvCompass: $bearing")
rotateAnimation = RotateAnimation(
lastBearing, bearing, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f
)
rotateAnimation!!.fillAfter = true
mMapArrowIcon!!.startAnimation(rotateAnimation)
lastBearing = bearing
}
override fun onCreateAnimator(transit: Int, enter: Boolean, nextAnim: Int): Animator? {
if (transit == FragmentTransaction.TRANSIT_FRAGMENT_OPEN) {
return if (enter) { //普通的进入的动作
AnimatorInflater.loadAnimator(
context,
R.animator.alpha_hide_show_f
)
} else { //比如一个已经Fragmen被另一个replace是一个进入动作被replace的那个就是false
AnimatorInflater.loadAnimator(
context,
R.animator.alpha_hide_hide_f
)
}
} else if (FragmentTransaction.TRANSIT_FRAGMENT_CLOSE == transit) {
return if (enter) { //之前被replace的重新进入到界面或者Fragment回到栈顶
AnimatorInflater.loadAnimator(
context,
R.animator.alpha_hide_show_f
)
} else { //Fragment退出出栈
AnimatorInflater.loadAnimator(
context,
R.animator.alpha_hide_hide_f
)
}
}
return super.onCreateAnimator(transit, enter, nextAnim)
}
companion object {
@JvmStatic
fun newInstance(): TaxiPassengerServingOrderFragment {
val args = Bundle()
val fragment = TaxiPassengerServingOrderFragment()
fragment.arguments = args
return fragment
}
}
}

View File

@@ -1,289 +0,0 @@
package com.mogo.och.taxi.passenger.ui;
import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI_P;
import android.annotation.SuppressLint;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.elegant.utils.UiThreadHandler;
import com.mogo.commons.AbsMogoApplication;
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
import com.mogo.eagle.core.utilcode.util.OverlayViewUtils;
import com.mogo.eagle.core.utilcode.util.ToastUtils;
import com.mogo.och.common.module.utils.AnimatorDrawableUtil;
import com.mogo.och.common.module.wigets.sfv.FrameSurfaceView;
import com.mogo.och.taxi.passenger.R;
import com.mogo.och.taxi.passenger.callback.ITPClickStartAutopilotCallback;
import java.util.Arrays;
/**
* @author: wangmingjun
* @date: 2022/6/14
*/
public class TaxiPassengerStartAutopilotView extends RelativeLayout implements View.OnClickListener {
private static final String TAG = TaxiPassengerStartAutopilotView.class.getSimpleName();
private TextView mStartAutopilotBtn;
private ImageView mAutopilotBtnBg;
private ImageView mCloseIV;
private ITPClickStartAutopilotCallback mClickCallback;
public boolean isStarting = false;
private static final long TIMER_START_AUTOPILOT_INTERVAL = 20 * 1000L;
private Context mContext;
private View view;
private AnimatorDrawableUtil mAnimationDrawable ;
private AnimatorDrawableUtil mCarAnimationDrawable ;
private ImageView mCarIv;
private Integer[] startingAnimIds = new Integer[]{
R.drawable.light_00000,
R.drawable.light_00001,
R.drawable.light_00002,
R.drawable.light_00003,
R.drawable.light_00004,
R.drawable.light_00005,
R.drawable.light_00006,
R.drawable.light_00007,
R.drawable.light_00008,
R.drawable.light_00009,
R.drawable.light_00010,
R.drawable.light_00011,
R.drawable.light_00012,
R.drawable.light_00013
};
private Integer[] startBtnBgAnimIds = new Integer[]{
R.drawable.image_00000, R.drawable.image_00001, R.drawable.image_00002, R.drawable.image_00003,
R.drawable.image_00004, R.drawable.image_00005, R.drawable.image_00006, R.drawable.image_00007,
R.drawable.image_00008, R.drawable.image_00009, R.drawable.image_00010, R.drawable.image_00011,
R.drawable.image_00012, R.drawable.image_00013,R.drawable.image_00014,R.drawable.image_00015,
R.drawable.image_00016, R.drawable.image_00017,R.drawable.image_00018,R.drawable.image_00019,
R.drawable.image_00020, R.drawable.image_00021,R.drawable.image_00022,R.drawable.image_00023,
R.drawable.image_00024, R.drawable.image_00025,R.drawable.image_00026,R.drawable.image_00027,
R.drawable.image_00028, R.drawable.image_00029,R.drawable.image_00030,R.drawable.image_00031,
R.drawable.image_00032, R.drawable.image_00033,R.drawable.image_00034,R.drawable.image_00035,
R.drawable.image_00036, R.drawable.image_00037,R.drawable.image_00038,R.drawable.image_00039,
R.drawable.image_00040, R.drawable.image_00041,R.drawable.image_00042,R.drawable.image_00043,
R.drawable.image_00044, R.drawable.image_00045,R.drawable.image_00046,R.drawable.image_00047,
R.drawable.image_00048, R.drawable.image_00049,R.drawable.image_00050,R.drawable.image_00051,
R.drawable.image_00052, R.drawable.image_00053,R.drawable.image_00054,R.drawable.image_00055,
R.drawable.image_00056, R.drawable.image_00057,R.drawable.image_00058,R.drawable.image_00059,
R.drawable.image_00060, R.drawable.image_00061,R.drawable.image_00062,R.drawable.image_00063,
R.drawable.image_00064, R.drawable.image_00065,R.drawable.image_00066,R.drawable.image_00067,
R.drawable.image_00068,R.drawable.image_00069,R.drawable.image_00070, R.drawable.image_00071,
R.drawable.image_00072,R.drawable.image_00073, R.drawable.image_00074, R.drawable.image_00075,
R.drawable.image_00076,R.drawable.image_00077,R.drawable.image_00078,R.drawable.image_00079,
R.drawable.image_00080, R.drawable.image_00081, R.drawable.image_00082,R.drawable.image_00083,
R.drawable.image_00084, R.drawable.image_00085, R.drawable.image_00086,R.drawable.image_00087,
R.drawable.image_00088, R.drawable.image_00089, R.drawable.image_00090,R.drawable.image_00091,
R.drawable.image_00092, R.drawable.image_00093, R.drawable.image_00094,R.drawable.image_00095,
R.drawable.image_00096, R.drawable.image_00097, R.drawable.image_00098,R.drawable.image_00099,
};
public TaxiPassengerStartAutopilotView(Context context) {
super(context);
mContext = context;
initView(context);
}
private void initView(Context context) {
view = LayoutInflater.from(context).inflate(R.layout.taxi_p_start_autopilot_view, this,true);
mStartAutopilotBtn = view.findViewById(R.id.taxi_p_start_autopilot);
mStartAutopilotBtn.setOnClickListener(this);
mCloseIV = view.findViewById(R.id.starting_autopilot_view_close);
mCloseIV.setOnClickListener(this);
mAutopilotBtnBg = view.findViewById(R.id.taxi_p_autopilot_btn_bg);
mCarIv = view.findViewById(R.id.taxi_p_autopilot_starting);
// initBtnAnimatonDrawable();
//
// initCarStartingFrame();
}
private void initCarStartingFrame() {
mCarAnimationDrawable = new AnimatorDrawableUtil();
mCarAnimationDrawable.setAnimation(mCarIv,Arrays.asList(startingAnimIds));
}
private void initBtnAnimatonDrawable() {
mAnimationDrawable = new AnimatorDrawableUtil();
mAnimationDrawable.setAnimation(mAutopilotBtnBg,Arrays.asList(startBtnBgAnimIds));
}
public void setOnClickStartAutopilotBtnCallback(ITPClickStartAutopilotCallback clickCallback){
this.mClickCallback = clickCallback;
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.taxi_p_start_autopilot){
//开启动画和自动驾驶
if (!(boolean)mStartAutopilotBtn.getTag()){
ToastUtils.showLong(R.string.taxi_p_start_autopilot_un_click_tip);
return;
}
if (!isStarting){
if (mClickCallback == null){
CallerLogger.INSTANCE.d(M_TAXI_P+TAG,"mClickCallback = null");
return;
}
startOrStopLoadingAnim(true);
mClickCallback.onClickCallback();
}
}else if (v.getId() == R.id.starting_autopilot_view_close){
closeAllAnimsAndView();
}
}
@SuppressLint("UseCompatLoadingForDrawables")
public void handleStartAutopilotBtnStatus(boolean isClickable){
if (mCarIv != null){
mCarIv.setBackgroundResource(R.drawable.light_00000);
}
if (mStartAutopilotBtn == null) return;
updateStartAutopilotBtnStatus(isClickable);
if (isClickable){ //高亮可点击状态下动画一直进行
startAutopilotBgAnimatorDrawable(true);
}else {// 置灰色可点击状态下动画停止
startAutopilotBgAnimatorDrawable(false);
}
}
public void updateStartAutopilotBtnStatus(boolean isClickable){
if (mContext == null) return;
if (isClickable){
mStartAutopilotBtn.setTextColor(
mContext.getResources().getColor(R.color.taxi_p_start_autopilot_txt_color));
mStartAutopilotBtn.setBackground(null);
}else {
mStartAutopilotBtn.setBackground(
mContext.getResources().getDrawable(R.drawable.taxi_p_start_autopilot_txt_btn_bg));
mAutopilotBtnBg.setBackground(null);
mStartAutopilotBtn.setTextColor(
mContext.getResources().getColor(R.color.taxi_p_start_autopilot_txt_un_color));
}
mStartAutopilotBtn.setTag(isClickable);
mStartAutopilotBtn.setText(
mContext.getResources().getString(R.string.taxi_p_start_autopilot_txt));
}
public void startAutopilotBgAnimatorDrawable(boolean isStart){
if (isStart){
if (mAnimationDrawable == null){
initBtnAnimatonDrawable();
}
if (mAnimationDrawable != null){
mAnimationDrawable.start(true, 30, null);
}
}else {
clearBgAnimDrawable();
}
}
private void startingCarBgAnimatorDrawable(boolean isStart){
if (isStart){
if (mCarAnimationDrawable == null){
initCarStartingFrame();
}
mCarIv.setBackgroundResource(0);
mCarAnimationDrawable.start(true,40, null);
}else {
if (mCarAnimationDrawable != null){
mCarAnimationDrawable.stop();
}
mCarIv.setBackgroundResource(R.drawable.light_00000);
}
}
public void startOrStopLoadingAnim(boolean start) {
startingCarBgAnimatorDrawable(start);
if (start) {
isStarting = true;
mStartAutopilotBtn.setText(getResources().getString(R.string.taxi_p_start_autopilot_loading));
mStartAutopilotBtn.setTextColor(getResources().getColor(R.color.taxi_p_start_autopilot_txt_color));
startingAutopilotCountDown();
} else {
clearBgAnimDrawable();
isStarting = false;
handleStartAutopilotBtnStatus(true);
}
}
public void clearBgAnimDrawable() {
if (mAnimationDrawable != null){
mAnimationDrawable.stop();
}
}
public void closeAllAnimsAndView(){
isStarting = false;
clearStartingAnimFrame();
clearBgAnimDrawable();
OverlayViewUtils.dismissOverlayView(this);
mContext = null;
}
public void clearStartingAnimFrame(){
if (mCarAnimationDrawable != null){
mCarAnimationDrawable.stop();
}
}
public void onAutopilotStatusSuccess(){
startOrStopLoadingAnim(false);
}
private void startingAutopilotCountDown() {
UiThreadHandler.postDelayed(new Runnable() {
@Override
public void run() { //未启动成功20s后做处理
if (isStarting){ //判断动画是否在进行
ToastUtils.showLong(R.string.taxi_p_start_autopilot_fail_10s_tip);
// startOrStopLoadingAnim(false);
updateStatusCountDownOver();
}
}
},TIMER_START_AUTOPILOT_INTERVAL);
}
private void updateStatusCountDownOver() {
if (mContext == null) return;
isStarting = false;
startingCarBgAnimatorDrawable(false);
mStartAutopilotBtn.setText(
mContext.getResources().getString(R.string.taxi_p_start_autopilot_txt));
}
@Override
protected void onDetachedFromWindow() {
isStarting = false;
clearStartingAnimFrame();
clearBgAnimDrawable();
mContext = null;
super.onDetachedFromWindow();
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
try {
mContext = AbsMogoApplication.getApp();
}catch (Exception e){
e.printStackTrace();
}
}
}

View File

@@ -1,200 +0,0 @@
package com.mogo.och.taxi.passenger.ui
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import android.widget.LinearLayout
import com.mogo.eagle.core.data.enums.DataSourceType
import com.mogo.eagle.core.data.enums.TrafficLightEnum
import com.mogo.eagle.core.function.api.datacenter.union.IMoGoTrafficLightListener
import com.mogo.eagle.core.function.call.v2x.CallerTrafficLightListenerManager
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import com.mogo.och.taxi.passenger.R
import kotlinx.android.synthetic.main.taxi_p_traffic_light_view.view.*
/**
* Taxi乘客端红绿灯view
*
* Created on 2022/3/14
*/
class TaxiPassengerTrafficLightView @JvmOverloads constructor(
context: Context?,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : LinearLayout(context, attrs, defStyleAttr), IMoGoTrafficLightListener {
companion object {
private const val TAG = "TaxiPassengerTrafficLightView"
}
private var mCurrentLightId = TrafficLightEnum.BLACK
init {
init(context)
}
private fun init(context: Context?) {
LayoutInflater.from(context).inflate(R.layout.taxi_p_traffic_light_view, this, true)
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
CallerTrafficLightListenerManager.addListener(TAG, this)
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
CallerTrafficLightListenerManager.removeListener(TAG)
}
/**
* 展示红绿灯预警
*
* @param checkLightId 0-都是默认1-红2-黄3-绿
* @param lightSource 1:云端下发2:自车感知
*/
override fun showTrafficLight(checkLightId: TrafficLightEnum, lightSource: DataSourceType) {
super.showTrafficLight(checkLightId, lightSource)
mCurrentLightId = checkLightId
updateTrafficLightIcon(checkLightId)
}
/**
* 关闭红绿灯预警展示,并重制灯态
*/
override fun disableTrafficLight() {
super.disableTrafficLight()
UiThreadHandler.post {
mCurrentLightId = TrafficLightEnum.BLACK
this@TaxiPassengerTrafficLightView.visibility = GONE
}
}
/**
* @param redNum 红灯倒计时
* @param yellowNum 黄灯倒计时
* @param greenNum 绿灯倒计时
*/
override fun changeCountdownTrafficLightNum(redNum: Int, yellowNum: Int, greenNum: Int) {
super.changeCountdownTrafficLightNum(redNum, yellowNum, greenNum)
resetView()
when (mCurrentLightId) {
TrafficLightEnum.RED -> changeCountdownRed(redNum)
TrafficLightEnum.YELLOW -> changeCountdownYellow(yellowNum)
TrafficLightEnum.GREEN -> changeCountdownGreen(greenNum)
else -> UiThreadHandler.post { taxi_p_traffic_light_time_tv.text = "" }
}
}
override fun changeCountdownRed(redNum: Int) {
super.changeCountdownRed(redNum)
UiThreadHandler.post {
if (redNum > 0) {
resetView()
taxi_p_traffic_light_time_tv.setVertrial(true)
taxi_p_traffic_light_time_tv.setmColorList(
intArrayOf(
resources.getColor(R.color.taxi_p_traffic_light_red_color_up),
resources.getColor(R.color.taxi_p_traffic_light_red_color_down)
)
)
taxi_p_traffic_light_time_tv.text = redNum.toString()
} else {
disableTrafficLightCountDown()
taxi_p_traffic_light_time_tv.text = ""
}
}
}
override fun changeCountdownGreen(greenNum: Int) {
super.changeCountdownGreen(greenNum)
UiThreadHandler.post {
if (greenNum > 0) {
resetView()
taxi_p_traffic_light_time_tv.setVertrial(true)
taxi_p_traffic_light_time_tv.setmColorList(
intArrayOf(
resources.getColor(R.color.taxi_p_traffic_light_green_color_up),
resources.getColor(R.color.taxi_p_traffic_light_green_color_down)
)
)
taxi_p_traffic_light_time_tv.text = greenNum.toString()
} else {
disableTrafficLightCountDown()
taxi_p_traffic_light_time_tv.text = ""
}
}
}
override fun changeCountdownYellow(yellowNum: Int) {
super.changeCountdownYellow(yellowNum)
UiThreadHandler.post {
if (yellowNum > 0) {
resetView()
taxi_p_traffic_light_time_tv.setVertrial(true)
taxi_p_traffic_light_time_tv.setmColorList(
intArrayOf(
resources.getColor(R.color.taxi_p_traffic_light_yellow_color_up),
resources.getColor(R.color.taxi_p_traffic_light_yellow_color_down)
)
)
taxi_p_traffic_light_time_tv.text = yellowNum.toString()
} else {
disableTrafficLightCountDown()
taxi_p_traffic_light_time_tv.text = ""
}
}
}
/**
* 更新红绿灯icon
*
* @param lightId 0-都是默认1-红2-黄3-绿
*/
private fun updateTrafficLightIcon(lightId: TrafficLightEnum) {
UiThreadHandler.post {
when (lightId) {
TrafficLightEnum.RED -> {
taxi_p_traffic_light_iv.setBackgroundResource(R.drawable.taxi_p_light_red_nor)
this@TaxiPassengerTrafficLightView.visibility = VISIBLE
}
TrafficLightEnum.YELLOW -> {
taxi_p_traffic_light_iv.setBackgroundResource(R.drawable.taxi_p_lightyellow_nor)
this@TaxiPassengerTrafficLightView.visibility = VISIBLE
}
TrafficLightEnum.GREEN -> {
taxi_p_traffic_light_iv.setBackgroundResource(R.drawable.taxi_p_light_green_nor)
this@TaxiPassengerTrafficLightView.visibility = VISIBLE
}
else -> this@TaxiPassengerTrafficLightView.visibility = GONE
}
}
}
override fun disableTrafficLightCountDown() {
super.disableTrafficLightCountDown()
UiThreadHandler.post {
val layoutParams = layoutParams
if (layoutParams is MarginLayoutParams) {
layoutParams.width =
resources.getDimension(R.dimen.taxi_p_traffic_light_icon_size).toInt()
setLayoutParams(layoutParams)
taxi_p_traffic_light_time_tv.visibility = GONE
taxi_p_traffic_light_bg.layoutParams.width =
resources.getDimension(R.dimen.dp_124).toInt()
}
}
}
private fun resetView() {
val layoutParams = layoutParams
if (layoutParams is MarginLayoutParams) {
val lp = layoutParams
lp.width = resources.getDimension(R.dimen.taxi_p_traffic_light_layout_width).toInt()
setLayoutParams(lp)
taxi_p_traffic_light_time_tv.visibility = VISIBLE
taxi_p_traffic_light_bg.layoutParams.width =
resources.getDimension(R.dimen.taxi_p_traffic_light_bg_width).toInt()
}
}
}

View File

@@ -1,93 +0,0 @@
package com.mogo.och.taxi.passenger.ui;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.widget.ImageView;
import android.widget.TextView;
import com.mogo.eagle.core.data.enums.SidePattern;
import com.mogo.eagle.core.function.api.hmi.view.IViewNotification;
import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
import com.mogo.och.taxi.passenger.R;
import org.jetbrains.annotations.Nullable;
/**
* V2X预警事件view通过FloatWindow呈现无需加入到自定义layout中
*
* Created on 2022/3/16
*/
public class TaxiPassengerV2XNotificationView extends IViewNotification {
private ImageView mV2XNotificationIcon;
private TextView mV2XNotificationText;
public TaxiPassengerV2XNotificationView(@Nullable Context context) {
this(context, null, 0);
}
public TaxiPassengerV2XNotificationView(@Nullable Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public TaxiPassengerV2XNotificationView(@Nullable Context context, @Nullable AttributeSet attrs,
int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
private void init(Context context) {
LayoutInflater.from(context).inflate(R.layout.taxi_p_v2x_notification_view, this,
true);
mV2XNotificationIcon = findViewById(R.id.taxi_p_v2x_notification_icon_iv);
mV2XNotificationText = findViewById(R.id.taxi_p_v2x_notification_text_tv);
// 设置View的出场位置
setSidePattern(SidePattern.LEFT);
setLayoutGravity(Gravity.LEFT | Gravity.TOP);
// 设置View的停留位置相对屏幕左上角的位置
// setOffsetX(getResources().
// getDimensionPixelSize(R.dimen.taxi_p_v2x_notification_view_margin_left));
// setOffsetY(getResources().
// getDimensionPixelSize(R.dimen.taxi_p_v2x_notification_view_margin_top));
setPadding(getResources().
getDimensionPixelSize(R.dimen.taxi_p_v2x_notification_view_margin_left), getResources().
getDimensionPixelSize(R.dimen.taxi_p_v2x_notification_view_margin_top), 0, 0);
}
@Override
public void setWarningIcon(int warningIcon) {
super.setWarningIcon(warningIcon);
UiThreadHandler.post(() -> {
mV2XNotificationIcon.setImageResource(warningIcon);
});
}
@Override
public void setWarningIcon(@Nullable Drawable drawable) {
super.setWarningIcon(drawable);
UiThreadHandler.post(() -> {
mV2XNotificationIcon.setImageDrawable(drawable);
});
}
@Override
public void setWarningContent(@Nullable CharSequence warningContent) {
super.setWarningContent(warningContent);
UiThreadHandler.post(() -> {
mV2XNotificationText.setText(warningContent);
});
}
@Override
public void setWarningContent(int warningContentId) {
super.setWarningContent(warningContentId);
UiThreadHandler.post(() -> {
mV2XNotificationText.setText(warningContentId);
});
}
}

View File

@@ -0,0 +1,135 @@
package com.mogo.och.taxi.passenger.ui.arrived
import android.content.*
import android.graphics.BitmapFactory
import android.util.*
import androidx.core.util.Pools
import com.mogo.eagle.core.data.config.*
import com.mogo.eagle.core.function.api.autopilot.*
import com.mogo.eagle.core.function.api.lookaround.*
import com.mogo.eagle.core.function.api.lookaround.data.*
import com.mogo.eagle.core.function.call.autopilot.*
import com.mogo.eagle.core.utilcode.mogo.*
import com.zhjt.mogo.adas.data.*
import com.zhjt.mogo.adas.data.bean.*
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
import kotlinx.coroutines.channels.Channel.Factory.CONFLATED
import kotlinx.coroutines.flow.*
import java.util.concurrent.atomic.AtomicInteger
import kotlin.concurrent.*
internal class AroundProviderImpl: IMoGoBackCameraVideoListener, IMoGoRoboBusJinlvM1StitchedVideoListener {
companion object {
private const val TAG = "AroundProviderImpl"
}
@OptIn(ExperimentalCoroutinesApi::class)
private var channel: Channel<LookAroundData> = Channel(CONFLATED)
get() {
return if (field.isClosedForReceive || field.isClosedForSend) {
Channel(CONFLATED)
} else {
field
}
}
private val pool by lazy { Pools.SynchronizedPool<LookAroundData>(10) }
private val bitmapWidth by lazy { AtomicInteger(0) }
private val bitmapHeight by lazy { AtomicInteger(0) }
//276,319,147,366
private val targetX by lazy { AtomicInteger(0) }
private val targetY by lazy { AtomicInteger(0) }
private val targetWidth by lazy { AtomicInteger(0) }
private val targetHeight by lazy { AtomicInteger(0) }
private val scope by lazy { CoroutineScope(Dispatchers.IO + SupervisorJob()) }
@Volatile
private var job: Job? = null
fun init() {
CallerBackCameraVideoListenerManager.addListener(TAG, this)
CallerRoboBusJinlvM1StitchedVideoListenerManager.addListener(TAG, this)
}
fun removeListener() {
CallerBackCameraVideoListenerManager.removeListener(TAG)
CallerRoboBusJinlvM1StitchedVideoListenerManager.removeListener(TAG)
}
@OptIn(ExperimentalCoroutinesApi::class)
fun flow(): Flow<LookAroundData> = channelFlow {
val iterator = this@AroundProviderImpl.channel.iterator()
while (iterator.hasNext()) {
send(iterator.next())
}
}.flowOn(Dispatchers.IO)
override fun onRoboBusJinlvM1StitchedVideo(data: ByteArray) {
if (bitmapWidth.get() == 0 || bitmapHeight.get() == 0) {
val options = BitmapFactory.Options()
options.inJustDecodeBounds = true
BitmapFactory.decodeByteArray(data,0 , data.size, options)
bitmapWidth.set(options.outWidth)
bitmapHeight.set(options.outHeight)
}
Log.d(TAG, "-- onRoboBusJinlvM1StitchedVideo -- bitmap:[${bitmapWidth.get()}, ${bitmapHeight.get()}] -- data: ${data.size}")
var old = pool.acquire()
try {
if (old == null) {
old = LookAroundData(data, bitmapWidth.get(), bitmapHeight.get(), targetX.get(), targetY.get(), targetWidth.get(), targetHeight.get())
} else {
old.data = data
old.bitmapWidth = bitmapWidth.get()
old.bitmapHeight = bitmapHeight.get()
old.targetX = targetX.get()
old.targetY = targetY.get()
old.targetWidth = targetWidth.get()
old.targetHeight = targetHeight.get()
}
channel.trySend(old)
} finally {
if (old != null) {
pool.release(old)
}
}
}
override fun onBackCameraVideo(data: ByteArray) {
if (bitmapWidth.get() == 0 || bitmapHeight.get() == 0) {
val options = BitmapFactory.Options()
options.inJustDecodeBounds = true
BitmapFactory.decodeByteArray(data,0 , data.size, options)
bitmapWidth.set(options.outWidth)
bitmapHeight.set(options.outHeight)
}
Log.d(TAG, "-- onSweeperFutianBackCameraVideo -- bitmap:[${bitmapWidth.get()}, ${bitmapHeight.get()}] -- data: ${data.size}")
var old = pool.acquire()
try {
if (old == null) {
old = LookAroundData(data, bitmapWidth.get(), bitmapHeight.get(), targetX.get(), targetY.get(), targetWidth.get(), targetHeight.get())
} else {
old.data = data
old.bitmapWidth = bitmapWidth.get()
old.bitmapHeight = bitmapHeight.get()
old.targetX = targetX.get()
old.targetY = targetY.get()
old.targetWidth = targetWidth.get()
old.targetHeight = targetHeight.get()
}
channel.trySend(old)
} finally {
if (old != null) {
pool.release(old)
}
}
}
}

View File

@@ -0,0 +1,131 @@
package com.mogo.och.taxi.passenger.ui.arrived
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import androidx.lifecycle.ViewModelProvider
import com.mogo.commons.AbsMogoApplication
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.CallerLogger.d
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.eagle.core.utilcode.util.OverlayViewUtils
import com.mogo.och.common.module.utils.RxUtils
import com.mogo.och.taxi.passenger.R
import com.mogo.och.taxi.passenger.widget.WindowRelativeLayout
import com.mogo.och.taxi.passenger.widget.animutils.AnimationsContainer
import com.shuyu.gsyvideoplayer.GSYVideoManager
import com.shuyu.gsyvideoplayer.builder.GSYVideoOptionBuilder
import com.shuyu.gsyvideoplayer.listener.GSYSampleCallBack
import io.reactivex.disposables.Disposable
import kotlinx.android.synthetic.main.taxi_p_arrived_end_panel.view.aciv_close
import kotlinx.android.synthetic.main.taxi_p_arrived_end_panel.view.actv_endstation
import kotlinx.android.synthetic.main.taxi_p_arrived_end_panel.view.iv_xiaozhi_belt
import kotlinx.android.synthetic.main.taxi_p_arrived_end_panel.view.svp_frame
import kotlinx.android.synthetic.main.taxi_p_arrived_end_panel.view.v_video_right_rear_view
/**
*
* 评价View
* Created on 2022/5/16
*/
class ArrivedView : WindowRelativeLayout, ArrivedViewModel.ArrivedViewCallback {
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 var subscribe: Disposable?=null
private val gsyVideoOptionBuilder = GSYVideoOptionBuilder()
private var taxiPxiaozhiLove: AnimationsContainer?=null
private fun initView() {
d(SceneConstant.M_TAXI_P + TAG, "initView")
LayoutInflater.from(context).inflate(R.layout.taxi_p_arrived_end_panel, this, true)
svp_frame.setBackgroundResource(R.drawable.tail_ani_0000)
svp_frame.setIsTouchWiget(false)
svp_frame.setIsTouchWigetFull(false)
svp_frame.enableshowProgressDialog = false
svp_frame.enableDoubleClick = false
GSYVideoManager.instance().enableRawPlay(AbsMogoApplication.getApp())
val url = "android.resource://" + context.packageName + "/" + R.raw.end_video
gsyVideoOptionBuilder.setUrl(url)
.setCacheWithPlay(false)
.setPlayTag("TaxiPassengerArrivedView")
.build(svp_frame)
aciv_close.onClick {
OverlayViewUtils.dismissOverlayView(this)
}
taxiPxiaozhiLove = AnimationsContainer(R.array.xiaozhi_love, 20,iv_xiaozhi_belt)
taxiPxiaozhiLove?.setOnAnimStopListener(object :AnimationsContainer.OnAnimationStoppedListener{
override fun AnimationStopped() {
CallerLogger.d(SceneConstant.M_TAXI_P + TAG, "动画暂停")
}
})
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
val viewModel = ViewModelProvider(this).get(ArrivedViewModel::class.java)
viewModel.setViewCallback(this)
taxiPxiaozhiLove?.start()
v_video_right_rear_view.resetView()
}
override fun onDetachedFromWindow() {
svp_frame.setBackgroundResource(R.drawable.tail_ani_0000)
svp_frame.setVideoAllCallBack(null)
svp_frame.onVideoReset()
svp_frame.release()
taxiPxiaozhiLove?.stop()
v_video_right_rear_view.resetView()
super.onDetachedFromWindow()
subscribe?.let {
if (!it.isDisposed) {
it.dispose()
}
}
}
/**
* 设置目的地重置星星状态
*/
fun setDataAndStartAnimation() {
svp_frame.setVideoAllCallBack(object : GSYSampleCallBack() {
override fun onAutoComplete(url: String?, vararg objects: Any?) {
svp_frame.setBackgroundResource(R.drawable.tail_ani_0090)
}
})
svp_frame.startPlayLogic()
RxUtils.createSubscribe(60_000) {
OverlayViewUtils.dismissOverlayView(this@ArrivedView)
}
}
companion object {
const val TAG = "TaxiPassengerArrivedView"
}
init {
try {
initView()
} catch (e: Exception) {
e.printStackTrace()
}
}
override fun setEndStation(stationName: String) {
actv_endstation.text = stationName
}
}

View File

@@ -0,0 +1,32 @@
package com.mogo.och.taxi.passenger.ui.arrived
import androidx.lifecycle.ViewModel
import com.mogo.och.taxi.passenger.model.TaxiPassengerModel
class ArrivedViewModel: ViewModel() {
private val TAG = ArrivedViewModel::class.java.simpleName
private var viewCallback:ArrivedViewCallback?=null
init {
}
fun setViewCallback(viewCallback: ArrivedViewCallback){
this.viewCallback = viewCallback
TaxiPassengerModel.currentOCHOrder?.endSiteAddr?.let {
this.viewCallback?.setEndStation(it)
}
}
override fun onCleared() {
super.onCleared()
this.viewCallback = null
}
interface ArrivedViewCallback{
fun setEndStation(stationName:String)
}
}

View File

@@ -0,0 +1,171 @@
package com.mogo.och.taxi.passenger.ui.arrived
import android.content.*
import android.graphics.*
import android.graphics.Paint.Style.STROKE
import android.os.Handler
import android.os.HandlerThread
import android.os.SystemClock
import android.util.*
import android.view.SurfaceHolder
import android.view.SurfaceView
import android.widget.Toast
import com.mogo.eagle.core.function.api.autopilot.*
import com.mogo.eagle.core.function.api.lookaround.data.*
import com.mogo.eagle.core.function.call.autopilot.*
import com.mogo.eagle.core.function.call.devatools.*
import com.mogo.eagle.core.utilcode.kotlin.*
import com.mogo.eagle.core.utilcode.util.ThreadUtils
import com.mogo.eagle.core.utilcode.util.Utils
import com.mogo.eagle.core.widget.media.video.TextureVideoViewOutlineProvider
import kotlinx.coroutines.*
import kotlinx.coroutines.Runnable
import kotlinx.coroutines.flow.*
import java.util.concurrent.atomic.AtomicReference
import kotlin.math.*
class RightRearCamSurfaceView: SurfaceView, SurfaceHolder.Callback, Runnable {
constructor(context: Context?) : super(context)
constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)
constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
companion object {
private const val TAG = "M1LookAroundView"
}
init {
holder.addCallback(this)
}
private val handler by lazy { AtomicReference<Handler>() }
private val lookAroundDataProvider by lazy { AroundProviderImpl() }
private val bitmapPaint by lazy { Paint(Paint.ANTI_ALIAS_FLAG or Paint.FILTER_BITMAP_FLAG).also { it.xfermode = null } }
@Volatile
private var surfaceWidth = 0
@Volatile
private var surfaceHeight = 0
@Volatile
private var isSurfaceValid = false
@Volatile
private var data: LookAroundData? = null
override fun surfaceCreated(holder: SurfaceHolder) {
val old = handler.get()
if (old == null) {
handler.set(HandlerThread("look-around-drawer").let { it.start(); Handler(it.looper) })
} else {
old.looper.quitSafely()
handler.set(HandlerThread("look-around-drawer").let { it.start(); Handler(it.looper) })
}
handler.get()?.removeCallbacks(this)
handler.get()?.post(this)
isSurfaceValid = true
}
override fun surfaceChanged(holder: SurfaceHolder, format: Int, width: Int, height: Int) {
this.surfaceWidth = width
this.surfaceHeight = height
}
override fun surfaceDestroyed(holder: SurfaceHolder) {
isSurfaceValid = false
}
override fun run() {
var isTimedBlock = false
try {
if (!isSurfaceValid) {
isTimedBlock = true
return
}
if (this.surfaceWidth <= 0 || this.surfaceHeight <= 0) {
isTimedBlock = true
return
}
val data = this.data ?: return
val bitmapWidth = data.bitmapWidth
val bitmapHeight = data.bitmapHeight
val scaleX = this.surfaceWidth * 1.0f / bitmapWidth
val scaleY = this.surfaceHeight * 1.0f / bitmapHeight
val bytes = data.data
if (bytes == null) {
isTimedBlock = true
return
}
val canvas = holder.lockCanvas()
try {
if (canvas == null) {
isTimedBlock = true
return
}
//1. 绘制图片
val bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.size)
if (bitmap == null) {
isTimedBlock = true
return
}
try {
canvas.save()
canvas.scale(scaleX, scaleY)
canvas.drawBitmap(bitmap, 0f, 0f, bitmapPaint)
} finally {
canvas.restore()
if (!bitmap.isRecycled) {
bitmap.recycle()
}
}
} finally {
if (canvas != null) {
holder.unlockCanvasAndPost(canvas)
}
}
} finally {
if (isTimedBlock) {
try {
Thread.sleep(2000)
} catch (ignore: Exception) { }
}
handler.get().post(this)
}
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
Log.d(TAG, "--- 发起订阅 ---")
CallerAutoPilotControlManager.setIsSubscribeBackCameraVideoVideo(1, true)
lookAroundDataProvider.init()
scope.launch(ThreadUtils.getCpuPool().asCoroutineDispatcher()) {
lookAroundDataProvider.flow().also { flow ->
flow.onEach {
Log.d(TAG, "-- onEach ---:$it")
//if (it.isValid()) {
data = it
//}
}.collect()
}
}
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
Log.d(TAG, "--- 取消订阅 ---")
CallerAutoPilotControlManager.setIsSubscribeBackCameraVideoVideo(1, false)
lookAroundDataProvider.removeListener()
handler.get()?.looper?.quitSafely()
}
override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
super.onSizeChanged(w, h, oldw, oldh)
outlineProvider = TextureVideoViewOutlineProvider(36f)
clipToOutline = true
}
}

View File

@@ -0,0 +1,162 @@
package com.mogo.och.taxi.passenger.ui.arrived
import android.content.Context
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.drawable.BitmapDrawable
import android.util.AttributeSet
import android.util.Log
import android.view.LayoutInflater
import androidx.constraintlayout.widget.ConstraintLayout
import com.mogo.eagle.core.function.api.autopilot.IMoGoBackCameraVideoListener
import com.mogo.eagle.core.function.api.autopilot.IMoGoRoboBusJinlvM1StitchedVideoListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager.setIsSubscribeBackCameraVideoVideo
import com.mogo.eagle.core.function.call.autopilot.CallerBackCameraVideoListenerManager
import com.mogo.eagle.core.function.call.autopilot.CallerRoboBusJinlvM1StitchedVideoListenerManager
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.UiThreadHandler
import com.mogo.eagle.core.widget.media.video.TextureVideoViewOutlineProvider
import com.mogo.och.taxi.passenger.R
import kotlinx.android.synthetic.main.taxi_p_right_rear_cam.view.actv_cam_position_group
import kotlinx.android.synthetic.main.taxi_p_right_rear_cam.view.v_video_right_rear
/**
*
* 评价View
* Created on 2022/5/16
*/
class RightRearCamView : ConstraintLayout , IMoGoBackCameraVideoListener,
IMoGoRoboBusJinlvM1StitchedVideoListener,Runnable {
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 var mBitmap: Bitmap? = null
private var mBitmapOptions: BitmapFactory.Options? = null //Bitmap管理类可有效减少Bitmap的OOM问题
private fun initView() {
d(SceneConstant.M_TAXI_P + TAG, "initView")
LayoutInflater.from(context).inflate(R.layout.taxi_p_right_rear_cam, this, true)
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
setIsSubscribeBackCameraVideoVideo(1, true)
CallerBackCameraVideoListenerManager.addListener(TAG, this)
CallerRoboBusJinlvM1StitchedVideoListenerManager.addListener(TAG, this)
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
setIsSubscribeBackCameraVideoVideo(1, false)
CallerBackCameraVideoListenerManager.removeListener(this)
CallerRoboBusJinlvM1StitchedVideoListenerManager.removeListener(this)
}
companion object {
const val TAG = "RightRearCamView"
}
init {
try {
initView()
} catch (e: Exception) {
e.printStackTrace()
}
}
fun resetView(){
actv_cam_position_group.visibility = GONE
v_video_right_rear.setImageResource(R.drawable.taxi_p_right_rear_cam)
}
override fun onBackCameraVideo(data: ByteArray) {
decodeData(data)
}
override fun onRoboBusJinlvM1StitchedVideo(data: ByteArray) {
decodeData(data)
}
var preTime :Long=System.currentTimeMillis()
@Synchronized
private fun decodeData(data: ByteArray){
val currentTimeMillis = System.currentTimeMillis()
val dexTime = currentTimeMillis - preTime
preTime = currentTimeMillis
if(dexTime<20){
return
}
d(SceneConstant.M_TAXI_P + TAG, "图片频率:$dexTime")
if (mBitmapOptions == null) {
val bmp = (v_video_right_rear.drawable as BitmapDrawable).bitmap
val width = bmp.width
val height = bmp.height
val config = bmp.config
mBitmap = Bitmap.createBitmap(width, height, config)
mBitmapOptions = BitmapFactory.Options()
//设置Bitmap内存复用
mBitmapOptions!!.inBitmap = mBitmap //Bitmap复用内存块类似对象池避免不必要的内存分配和回收
mBitmapOptions!!.inMutable = true //解码时返回可变Bitmap
val options = BitmapFactory.Options()
options.inJustDecodeBounds = true
BitmapFactory.decodeByteArray(data, 0, data.size, options)
mBitmapOptions!!.inSampleSize = calculateInSampleSize(options, width, height)
}
mBitmapOptions?.let {
try {
val preTime = System.currentTimeMillis()
BitmapFactory.decodeByteArray(data, 0, data.size, mBitmapOptions)
d(SceneConstant.M_TAXI_P + TAG, "decode时间${System.currentTimeMillis()-preTime}")
UiThreadHandler.post(this)
} catch (e: Exception) {
e.printStackTrace()
}
}
}
private fun calculateInSampleSize(options: BitmapFactory.Options, reqWidth: Int, reqHeight: Int): Int {
val width = options.outWidth
val height = options.outHeight
Log.i(TAG, "calculateInSampleSize: out width and height is $width height $height")
var inSampleWidth = 1
if (height > reqHeight || width > reqWidth) {
val halfHeight = height / 2
val halfWidth = width / 2
// 采样率设置为2的指数
while (halfHeight / inSampleWidth >= reqHeight && halfWidth / inSampleWidth >= reqWidth) {
inSampleWidth *= 2
}
}
while (width/inSampleWidth>reqWidth||height/inSampleWidth>reqHeight){
inSampleWidth++
}
return inSampleWidth
}
override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
super.onSizeChanged(w, h, oldw, oldh)
outlineProvider = TextureVideoViewOutlineProvider(36f)
clipToOutline = true
}
override fun run() {
if(actv_cam_position_group?.visibility == GONE) {
actv_cam_position_group?.visibility = VISIBLE
}
v_video_right_rear?.setImageBitmap(mBitmap)
}
}

View File

@@ -0,0 +1,81 @@
package com.mogo.och.taxi.passenger.ui.bottom
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import androidx.constraintlayout.widget.ConstraintLayout
import com.mogo.och.taxi.passenger.R
import kotlinx.android.synthetic.main.taxi_p_bottom_bar.view.actv_overmap
import kotlinx.android.synthetic.main.taxi_p_bottom_bar.view.actv_precisionmap
import kotlinx.android.synthetic.main.taxi_p_bottom_bar.view.actv_video
class BottomBar @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr) {
private var checkIndex = SelectView.NONE
private var overMapViewApply:ApplyClickLintener?=null
init {
isClickable = true
LayoutInflater.from(context).inflate(R.layout.taxi_p_bottom_bar, this, true)
setBackgroundResource(R.drawable.taxi_p_bottom_bar_bg)
actv_precisionmap.setOnClickListener {
setCheckIndex(SelectView.PRECISIONMAP)
}
actv_overmap.setOnClickListener {
setCheckIndex(SelectView.OVERMAPVIEW)
}
actv_video.setOnClickListener {
setCheckIndex(SelectView.VIDEO)
}
}
fun getCurrentPage():SelectView{
return checkIndex
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
setCheckIndex(SelectView.PRECISIONMAP)
}
fun setOverMapApplyClick(overMapViewApply:ApplyClickLintener){
this.overMapViewApply = overMapViewApply
}
fun setCheckIndex(index: SelectView){
if(checkIndex==index){
return
}else{
checkIndex = index
}
overMapViewApply?.onApplyClick(checkIndex)
if(checkIndex == SelectView.OVERMAPVIEW){
actv_overmap.setCheckItem(true)
}else{
actv_overmap.setCheckItem(false)
}
if(checkIndex == SelectView.VIDEO){
actv_video.setCheckItem(true)
}else{
actv_video.setCheckItem(false)
}
if(checkIndex == SelectView.PRECISIONMAP){
actv_precisionmap.setCheckItem(true)
}else{
actv_precisionmap.setCheckItem(false)
}
}
enum class SelectView{
NONE,PRECISIONMAP,OVERMAPVIEW,VIDEO
}
interface ApplyClickLintener{
fun onApplyClick(selectItem:SelectView)
}
}

View File

@@ -0,0 +1,92 @@
package com.mogo.och.bus.passenger.ui.view.bottom
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.content.ContextCompat
import com.mogo.och.taxi.passenger.R
import kotlinx.android.synthetic.main.m1_bottom_check.view.aciv_center_image
import kotlinx.android.synthetic.main.m1_bottom_check.view.actv_title
open class BottomCheckView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr) {
companion object {
private const val TAG = "StopSiteView"
}
private var backageViewId: Int = -1
private var bottomTitle: String = ""
private var selectedDrawable: Int = -1
private var normalDrawable: Int = -1
private var bottomTitleNormalColor:Int = -1
private var bottomTitleCheckedColor:Int = -1
private var backageView: View? = null
private var isCheck = false
init {
LayoutInflater.from(context).inflate(R.layout.m1_bottom_check, this, true)
try {
val typedArray = context.obtainStyledAttributes(attrs, R.styleable.BottomSelectView)
backageViewId = typedArray.getResourceId(R.styleable.BottomSelectView_backageViewId, -1)
bottomTitle = typedArray.getString(R.styleable.BottomSelectView_bottomTitle) ?: ""
selectedDrawable = typedArray.getResourceId(R.styleable.BottomSelectView_selectedDrawable, -1)
normalDrawable = typedArray.getResourceId(R.styleable.BottomSelectView_normalDrawable, -1)
bottomTitleNormalColor = typedArray.getColor(R.styleable.BottomSelectView_bottomTitleNormalColor,
ContextCompat.getColor(context,R.color.white))
bottomTitleCheckedColor = typedArray.getColor(R.styleable.BottomSelectView_bottomTitleCheckedColor,
ContextCompat.getColor(context,R.color.white))
typedArray.recycle()
initView(context)
} catch (e: Exception) {
e.printStackTrace()
}
}
private fun initView(context: Context) {
if (selectedDrawable > 0) {
aciv_center_image.setImageResource(normalDrawable)
}
actv_title.text = bottomTitle
}
fun setCheckItem(isCheck: Boolean) {
if (isCheck != this.isCheck) {
this.isCheck = isCheck
notifiBackageView()
}
}
private fun notifiBackageView() {
if (isCheck) {
backageView?.visibility = View.VISIBLE
aciv_center_image.setImageResource(selectedDrawable)
actv_title.setTextColor(bottomTitleCheckedColor)
} else {
backageView?.visibility = View.GONE
aciv_center_image.setImageResource(normalDrawable)
actv_title.setTextColor(bottomTitleNormalColor)
}
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
parent?.let {
if (parent is ConstraintLayout) {
if (backageViewId > 0) {
backageView = (parent as ConstraintLayout).findViewById(backageViewId)
}
}
}
if (isCheck) {
backageView?.visibility = View.VISIBLE
}
}
}

View File

@@ -1,4 +1,4 @@
package com.mogo.och.taxi.passenger.ui
package com.mogo.och.taxi.passenger.ui.check
import android.content.Context
import android.graphics.Typeface
@@ -10,11 +10,32 @@ import android.view.LayoutInflater
import android.view.View
import android.widget.RelativeLayout
import android.widget.TextView
import com.mogo.commons.voice.AIAssist
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.och.common.module.voice.VoiceNotice
import com.mogo.och.taxi.passenger.R
import com.mogo.och.taxi.passenger.callback.ITaxiPassengerCommonValueCallback
import kotlinx.android.synthetic.main.taxi_p_passenger_check_panel.view.tv_passenger_count
import kotlinx.android.synthetic.main.taxi_p_passenger_check_panel.view.tv_passenger_end
import kotlinx.android.synthetic.main.taxi_p_passenger_check_panel.view.tv_passenger_start
import kotlinx.android.synthetic.main.taxi_p_passenger_check_panel.view.tv_taxi_passenger_number_back
import kotlinx.android.synthetic.main.taxi_p_passenger_check_panel.view.tv_taxi_passenger_number_eight
import kotlinx.android.synthetic.main.taxi_p_passenger_check_panel.view.tv_taxi_passenger_number_first
import kotlinx.android.synthetic.main.taxi_p_passenger_check_panel.view.tv_taxi_passenger_number_five
import kotlinx.android.synthetic.main.taxi_p_passenger_check_panel.view.tv_taxi_passenger_number_four
import kotlinx.android.synthetic.main.taxi_p_passenger_check_panel.view.tv_taxi_passenger_number_fourth
import kotlinx.android.synthetic.main.taxi_p_passenger_check_panel.view.tv_taxi_passenger_number_nine
import kotlinx.android.synthetic.main.taxi_p_passenger_check_panel.view.tv_taxi_passenger_number_one
import kotlinx.android.synthetic.main.taxi_p_passenger_check_panel.view.tv_taxi_passenger_number_second
import kotlinx.android.synthetic.main.taxi_p_passenger_check_panel.view.tv_taxi_passenger_number_seven
import kotlinx.android.synthetic.main.taxi_p_passenger_check_panel.view.tv_taxi_passenger_number_six
import kotlinx.android.synthetic.main.taxi_p_passenger_check_panel.view.tv_taxi_passenger_number_submit
import kotlinx.android.synthetic.main.taxi_p_passenger_check_panel.view.tv_taxi_passenger_number_third
import kotlinx.android.synthetic.main.taxi_p_passenger_check_panel.view.tv_taxi_passenger_number_three
import kotlinx.android.synthetic.main.taxi_p_passenger_check_panel.view.tv_taxi_passenger_number_two
import kotlinx.android.synthetic.main.taxi_p_passenger_check_panel.view.tv_taxi_passenger_number_zero
/**
* V2X预警事件view通过FloatWindow呈现无需加入到自定义layout中
@@ -33,14 +54,6 @@ class TaxiPassengerCheckView :RelativeLayout, View.OnClickListener {
var iTaxiPassengerCommonValueCallback: ITaxiPassengerCommonValueCallback<String>?=null
private lateinit var tvPassengerCount: TextView
private lateinit var tvPassengerStart: TextView
private lateinit var tvPassengerEnd: TextView
private lateinit var tvTaxiNumber: TextView
private lateinit var tvTaxiPassengerNumberfirst: TextView
private lateinit var tvTaxiPassengerNumberSecond: TextView
private lateinit var tvTaxiPassengerNumberThird: TextView
private lateinit var tvTaxiPassengerNumberFourth: TextView
private var index = 0
private var phone = ""
@@ -50,39 +63,31 @@ class TaxiPassengerCheckView :RelativeLayout, View.OnClickListener {
private fun initView(context: Context) {
d(SceneConstant.M_TAXI_P + TAG, "initView")
LayoutInflater.from(context).inflate(R.layout.taxi_p_passenger_check_panel, this, true)
tvPassengerCount = findViewById(R.id.tv_passenger_count)
tvPassengerStart = findViewById(R.id.tv_passenger_start)
tvPassengerEnd = findViewById(R.id.tv_passenger_end)
tvTaxiNumber = findViewById(R.id.tv_taxi_number)
tvTaxiPassengerNumberfirst = findViewById(R.id.tv_taxi_passenger_number_first)
tvTaxiPassengerNumberSecond = findViewById(R.id.tv_taxi_passenger_number_second)
tvTaxiPassengerNumberThird = findViewById(R.id.tv_taxi_passenger_number_third)
tvTaxiPassengerNumberFourth = findViewById(R.id.tv_taxi_passenger_number_fourth)
keyBoardLogic()
numSelectTextView[0] = tvTaxiPassengerNumberfirst
numSelectTextView[1] = tvTaxiPassengerNumberSecond
numSelectTextView[2] = tvTaxiPassengerNumberThird
numSelectTextView[3] = tvTaxiPassengerNumberFourth
numSelectTextView[0] = tv_taxi_passenger_number_first
numSelectTextView[1] = tv_taxi_passenger_number_second
numSelectTextView[2] = tv_taxi_passenger_number_third
numSelectTextView[3] = tv_taxi_passenger_number_fourth
}
private fun keyBoardLogic() {
findViewById<TextView>(R.id.tv_taxi_passenger_number_one).setOnClickListener(this)
findViewById<TextView>(R.id.tv_taxi_passenger_number_two).setOnClickListener(this)
findViewById<TextView>(R.id.tv_taxi_passenger_number_three).setOnClickListener(this)
findViewById<TextView>(R.id.tv_taxi_passenger_number_four).setOnClickListener(this)
findViewById<TextView>(R.id.tv_taxi_passenger_number_five).setOnClickListener(this)
findViewById<TextView>(R.id.tv_taxi_passenger_number_six).setOnClickListener(this)
findViewById<TextView>(R.id.tv_taxi_passenger_number_seven).setOnClickListener(this)
findViewById<TextView>(R.id.tv_taxi_passenger_number_eight).setOnClickListener(this)
findViewById<TextView>(R.id.tv_taxi_passenger_number_nine).setOnClickListener(this)
findViewById<TextView>(R.id.tv_taxi_passenger_number_zero).setOnClickListener(this)
findViewById<TextView>(R.id.tv_taxi_passenger_number_back).setOnClickListener(this)
findViewById<TextView>(R.id.tv_taxi_passenger_number_submit).setOnClickListener(this)
tv_taxi_passenger_number_one.setOnClickListener(this)
tv_taxi_passenger_number_two.setOnClickListener(this)
tv_taxi_passenger_number_three.setOnClickListener(this)
tv_taxi_passenger_number_four.setOnClickListener(this)
tv_taxi_passenger_number_five.setOnClickListener(this)
tv_taxi_passenger_number_six.setOnClickListener(this)
tv_taxi_passenger_number_seven.setOnClickListener(this)
tv_taxi_passenger_number_eight.setOnClickListener(this)
tv_taxi_passenger_number_nine.setOnClickListener(this)
tv_taxi_passenger_number_zero.setOnClickListener(this)
tv_taxi_passenger_number_back.setOnClickListener(this)
tv_taxi_passenger_number_submit.setOnClickListener(this)
tvTaxiPassengerNumberfirst.setOnClickListener(this)
tvTaxiPassengerNumberSecond.setOnClickListener(this)
tvTaxiPassengerNumberThird.setOnClickListener(this)
tvTaxiPassengerNumberFourth.setOnClickListener(this)
tv_taxi_passenger_number_first.setOnClickListener(this)
tv_taxi_passenger_number_second.setOnClickListener(this)
tv_taxi_passenger_number_third.setOnClickListener(this)
tv_taxi_passenger_number_fourth.setOnClickListener(this)
}
@@ -112,6 +117,7 @@ class TaxiPassengerCheckView :RelativeLayout, View.OnClickListener {
val numberStr = "${numSelect[0]}${numSelect[1]}${numSelect[2]}${numSelect[3]}"
if(!phone.endsWith(numberStr)){
ToastUtils.showLong("请输入正确的手机尾号")
VoiceNotice.showNotice("验证失败!再检查一下吧~", AIAssist.LEVEL2)
return
}
iTaxiPassengerCommonValueCallback?.onCommonCallback(numberStr)
@@ -196,10 +202,9 @@ class TaxiPassengerCheckView :RelativeLayout, View.OnClickListener {
Typeface.NORMAL,100,
resources.getColorStateList(R.color.taxi_p_check_passenger_number) ,null ),
4, 5, Spannable.SPAN_INCLUSIVE_INCLUSIVE)
tvPassengerCount.text = sb
tvPassengerStart.text = "起 点 : $startSiteAddr"
tvPassengerEnd.text = "终 点 : $endSiteAddr"
tvTaxiNumber.text = "蘑菇 " + carNumber + "为您服务"
tv_passenger_count.text = sb
tv_passenger_start.text = "起 点 : $startSiteAddr"
tv_passenger_end.text = "终 点 : $endSiteAddr"
for(i in numSelect.indices){
numSelect[i] = null
}

View File

@@ -1,479 +0,0 @@
package com.mogo.och.taxi.passenger.ui.comment
import android.animation.*
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.Animation
import android.view.animation.AnimationUtils
import android.widget.ImageView
import android.widget.RelativeLayout
import android.widget.TextView
import androidx.appcompat.widget.AppCompatButton
import androidx.appcompat.widget.AppCompatImageView
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.recyclerview.widget.RecyclerView
import com.amap.api.navi.view.PoiInputSearchWidget
import com.google.android.flexbox.FlexWrap
import com.google.android.flexbox.FlexboxLayoutManager
import com.google.android.flexbox.JustifyContent
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.scene.SceneConstant
import com.mogo.eagle.core.utilcode.util.OverlayViewUtils
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.eagle.core.widget.media.video.SimpleVideoPlayer
import com.mogo.och.common.module.biz.network.OchCommonServiceCallback
import com.mogo.och.common.module.wigets.OCHBorderShadowLayout
import com.mogo.och.taxi.passenger.R
import com.mogo.och.taxi.passenger.bean.TaxiPassengerAllStarWorld
import com.mogo.och.taxi.passenger.bean.TaxiPassengerScoreUpdateOrderReqBean
import com.mogo.och.taxi.passenger.callback.ITaxiPassengerCommonCallback
import com.mogo.och.taxi.passenger.callback.ITaxiPassengerScoreCallback
import com.mogo.och.taxi.passenger.network.TaxiPassengerServiceManager
import com.mogo.och.taxi.passenger.ui.comment.adapter.CommentAdapter
import com.mogo.och.taxi.passenger.widget.ResizeAnimation
import com.shuyu.gsyvideoplayer.builder.GSYVideoOptionBuilder
import com.shuyu.gsyvideoplayer.listener.GSYSampleCallBack
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import java.util.concurrent.TimeUnit
/**
*
* 评价View
* Created on 2022/5/16
*/
class TaxiPassengerArrivedView :RelativeLayout, View.OnClickListener {
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 lateinit var mArrivedEndStation: TextView
private lateinit var tvFeel: TextView
private lateinit var ochShadowLayout: OCHBorderShadowLayout
private lateinit var ochThankShadowLayout: OCHBorderShadowLayout
private lateinit var ivStarFirst: ImageView
private lateinit var ivStarSecond: ImageView
private lateinit var ivStarThird: ImageView
private lateinit var ivStarFourth: ImageView
private lateinit var ivStarFifth: ImageView
private lateinit var ivAnimalList: ImageView
private lateinit var btnSubmit: AppCompatButton
private lateinit var rvCommentList: RecyclerView
private lateinit var acivClose: AppCompatImageView
private lateinit var svpFrame: SimpleVideoPlayer
private lateinit var clCommentContain: ConstraintLayout
private var subscribe: Disposable?=null
private var orderNo = ""
private var currentFraction = 1
private val gsyVideoOptionBuilder = GSYVideoOptionBuilder()
var iTaxiPassengerScoreCallback: ITaxiPassengerScoreCallback?=null
var taxiPassengerCommonCallback: ITaxiPassengerCommonCallback?=null
var left2Right: Animation = AnimationUtils.loadAnimation(
context, R.anim.left_to_right
)
var right2Left: Animation = AnimationUtils.loadAnimation(
context, R.anim.right_to_left
)
var alphaAnimation: Animation = AnimationUtils.loadAnimation(
context, R.anim.alpha_hide_show
)
private var allStartOrdered = mutableListOf<ImageView>()
var showThanks:Boolean = false
var allStarWithWorld: TaxiPassengerAllStarWorld?=null
private fun initView(context: Context) {
d(SceneConstant.M_TAXI_P + TAG, "initView")
LayoutInflater.from(context).inflate(R.layout.taxi_p_arrived_end_panel, this, true)
mArrivedEndStation = findViewById(R.id.arrived_end_station)
tvFeel = findViewById(R.id.tv_feel)
ochShadowLayout = findViewById(R.id.och_shadow_layout)
ochThankShadowLayout = findViewById(R.id.och_thank_shadow_layout)
ivAnimalList = findViewById(R.id.iv_animal_list)
acivClose = findViewById(R.id.aciv_close)
svpFrame = findViewById(R.id.svp_frame)
rvCommentList = findViewById(R.id.rv_comment_list)
clCommentContain = findViewById(R.id.cl_comment_contain)
btnSubmit = findViewById(R.id.btn_submit)
svpFrame.setBackgroundResource(R.drawable.tail_ani_0000)
svpFrame.setIsTouchWiget(false)
svpFrame.setIsTouchWigetFull(false)
svpFrame.enableshowProgressDialog = false
svpFrame.enableDoubleClick = false
allStartOrdered = mutableListOf()
initCommentList()
initScore()
findViewById<View>(R.id.tv_please_score).setOnClickListener(this)
acivClose.setOnClickListener {
ochShadowLayout.visibility = View.GONE
OverlayViewUtils.dismissOverlayView(this@TaxiPassengerArrivedView)
}
val url = "android.resource://" + context.packageName + "/" + R.raw.end_video
gsyVideoOptionBuilder.setUrl(url)
.setCacheWithPlay(false)
.setPlayTag("TaxiPassengerArrivedView")
.build(svpFrame)
}
private fun initCommentList() {
val recyclerVideoAdapter = CommentAdapter(context, mutableListOf())
rvCommentList.adapter = recyclerVideoAdapter
val manager = FlexboxLayoutManager(context)
manager.justifyContent = JustifyContent.CENTER
manager.flexWrap = FlexWrap.WRAP
rvCommentList.layoutManager = manager
btnSubmit.setOnClickListener(this)
}
private fun initScore() {
ivStarFirst = findViewById(R.id.iv_star_first)
ivStarSecond = findViewById(R.id.iv_star_second)
ivStarThird = findViewById(R.id.iv_star_third)
ivStarFourth = findViewById(R.id.iv_star_fourth)
ivStarFifth = findViewById(R.id.iv_star_fifth)
ivStarFirst.setOnClickListener(this)
ivStarSecond.setOnClickListener(this)
ivStarThird.setOnClickListener(this)
ivStarFourth.setOnClickListener(this)
ivStarFifth.setOnClickListener(this)
allStartOrdered.add(ivStarFirst)
allStartOrdered.add(ivStarSecond)
allStartOrdered.add(ivStarThird)
allStartOrdered.add(ivStarFourth)
allStartOrdered.add(ivStarFifth)
// 请求文案
requestStarWord()
}
override fun onDetachedFromWindow() {
svpFrame.setBackgroundResource(R.drawable.tail_ani_0000)
svpFrame.setVideoAllCallBack(null)
svpFrame.onVideoReset()
svpFrame.release()
tvFeel.text = ""
rvCommentList.visibility = View.INVISIBLE
btnSubmit.visibility = View.INVISIBLE
clCommentContain.getLayoutParams().height = 748
clCommentContain.requestLayout()
super.onDetachedFromWindow()
subscribe?.let {
if (!it.isDisposed) {
it.dispose()
}
}
}
override fun onClick(v: View?) {
when (v?.id) {
R.id.tv_please_score -> {
//iTaxiPassengerScoreCallback?.onScoreCallback(2,orderNo)
}
R.id.iv_star_first -> {commitAndStartAnimation(1,"非常差")}
R.id.iv_star_second -> {commitAndStartAnimation(2,"")}
R.id.iv_star_third -> {commitAndStartAnimation(3,"一般")}
R.id.iv_star_fourth -> {commitAndStartAnimation(4,"舒适")}
R.id.iv_star_fifth -> {commitAndStartAnimation(5,"非常棒")}
R.id.btn_submit -> {submitScore()}
else -> {}
}
}
/**
* 提交到后台
*/
private fun submitScore() {
val commentAdapter = rvCommentList.adapter as CommentAdapter
val selectComment = commentAdapter.getSelectComment()
if(selectComment.isEmpty()){
ToastUtils.showLong("请选择评价内容")
return
}
iTaxiPassengerScoreCallback?.onScoreCallback(TaxiPassengerScoreUpdateOrderReqBean(orderNo,currentFraction,selectComment))
}
private fun commitAndStartAnimation(fraction: Int,title:String) {
resetStar()
allStartOrdered.forEach {
it.isEnabled = false
}
currentFraction = fraction
tvFeel.text = title
if(allStarWithWorld!=null&&allStarWithWorld!!.data!=null&&allStarWithWorld!!.data!!.size>0){
// 已经请求到总量了
val filter = allStarWithWorld!!.data.filter {
it.isSelect = false
it.star == fraction.toString()
}
val commentAdapter = rvCommentList.adapter as CommentAdapter
commentAdapter.addAll(filter.toMutableList())
startStartAnimation(fraction)
}else{
// 总量请求失败 单独去取
requestStarWordByStar(fraction)
}
}
private var currentAnimarion = 0
private var maxIndex = 0
private fun startStartAnimation(fraction: Int) {
currentAnimarion = 0
maxIndex = fraction-1
try {
animation(fraction)
} catch (e: Exception) {
e.printStackTrace()
}
}
/**
* 星星动画
*/
private fun animation(fraction: Int) {
val showView = allStartOrdered[currentAnimarion]
showView.setImageResource(R.drawable.taxi_p_passenger_star_check)
val alpha = ObjectAnimator.ofFloat(showView, "alpha", 0.1f, 1f)
.setDuration(120)
alpha.addUpdateListener(object : ValueAnimator.AnimatorUpdateListener{
var isStart = false
override fun onAnimationUpdate(animation: ValueAnimator) {
val animatedValue = animation?.getAnimatedValue("alpha")
animatedValue as Float
if(animatedValue>0.45&&!isStart){
isStart = true
//开始下一个
if(currentAnimarion==maxIndex){
return
}
currentAnimarion++
animation(fraction)
}
}
})
val keyframe1 = Keyframe.ofFloat(0f,1f)
val keyframe3 = Keyframe.ofFloat(0.9f,1.2f)
val keyframe4 = Keyframe.ofFloat(1f,1f)
val holderX = PropertyValuesHolder.ofKeyframe(
"scaleX", keyframe1, keyframe3, keyframe4
)
val holderY = PropertyValuesHolder.ofKeyframe(
"scaleY", keyframe1, keyframe3, keyframe4
)
val scaleX = ObjectAnimator.ofPropertyValuesHolder(showView, holderX).setDuration(240)
val scaleY = ObjectAnimator.ofPropertyValuesHolder(showView, holderY).setDuration(240)
val set = AnimatorSet()
set.play(scaleX).with(scaleY).with(alpha)
if(currentAnimarion==maxIndex) {
// 最后一个动画结束后提交积分
set.addListener(object : AnimatorListenerAdapter() {
override fun onAnimationEnd(animation: Animator) {
super.onAnimationEnd(animation)
// 启动变高动画
startChangeHeightAnimarion()
}
})
}
set.start()
}
private fun startChangeHeightAnimarion() {
// 815 除了 点评的高度
val resizeAnimation = ResizeAnimation(clCommentContain,913+rvCommentList.height, clCommentContain.height)
resizeAnimation.duration = 300
resizeAnimation.setAnimationListener(object :Animation.AnimationListener{
override fun onAnimationStart(animation: Animation?) {
rvCommentList.visibility = View.VISIBLE
}
override fun onAnimationEnd(animation: Animation?) {
allStartOrdered.forEach {
it.isEnabled = true
}
if(btnSubmit.visibility==View.GONE||btnSubmit.visibility==View.INVISIBLE) {
btnSubmit.visibility = View.VISIBLE
val showAnimator = ObjectAnimator.ofFloat(btnSubmit, "alpha", 0.1f, 1f)
showAnimator.duration = 600
showAnimator.start()
}
}
override fun onAnimationRepeat(animation: Animation?) {
}
})
clCommentContain.startAnimation(resizeAnimation)
}
/**
* 设置目的地重置星星状态
*/
fun setDataAndStartAnimation(endSiteAddr: String?,orderId:String) {
mArrivedEndStation.text = endSiteAddr
ochThankShadowLayout.visibility = View.GONE
ivAnimalList.visibility = View.GONE
svpFrame.setVideoAllCallBack(object : GSYSampleCallBack() {
override fun onAutoComplete(url: String?, vararg objects: Any?) {
svpFrame.setBackgroundResource(R.drawable.tail_ani_0090)
}
})
svpFrame.startPlayLogic()
postDelayed({
ochShadowLayout.visibility = View.VISIBLE
ochShadowLayout.startAnimation(left2Right)
},1928)
showThanks = false
this.orderNo = orderId
resetStar()
}
/**
* 评论成功 向左移动并消失 消失后感谢页面透明度0-1 然后开始小手的动画
*/
fun scoreSuccess(){
right2Left.setAnimationListener(object :PoiInputSearchWidget.AnimationListenerAdapter(){
override fun onAnimationEnd(p0: Animation?) {
ochShadowLayout.visibility = View.GONE
ochThankShadowLayout.startAnimation(alphaAnimation)
ivAnimalList.startAnimation(alphaAnimation)
alphaAnimation.setAnimationListener(object : PoiInputSearchWidget.AnimationListenerAdapter(){
override fun onAnimationStart(p0: Animation?) {
ochThankShadowLayout.visibility = View.VISIBLE
ivAnimalList.visibility = View.VISIBLE
showThanks = true
}
override fun onAnimationEnd(p0: Animation?) {
val animationDrawable = ivAnimalList.drawable as AnimationDrawable
animationDrawable.start()
}
})
}
})
ochShadowLayout.startAnimation(right2Left)
// 10s 后逻辑
subscribe = Observable.timer(10000, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
// 正在展示感谢页面
if (taxiPassengerCommonCallback == null) {
// 没有用户确定页面
OverlayViewUtils.dismissOverlayView(this@TaxiPassengerArrivedView)
} else {
// 有排队展示的用户确定页面
taxiPassengerCommonCallback?.onCommonCallback()
}
}
}
/**
* 评论失败 重置状态
*/
fun scoreFail(){
scoreSuccess()
// tvFeel.text = ""
// resetStar()
}
private fun resetStar() {
allStartOrdered.forEach {
it.setImageResource(R.drawable.taxi_p_passenger_star)
it.isEnabled = true
}
}
private fun requestStarWord() {
TaxiPassengerServiceManager.getAllScoreWorld(context,
object : OchCommonServiceCallback<TaxiPassengerAllStarWorld> {
override fun onError() {
CallerLogger.e(
SceneConstant.M_TAXI_P + TAG,
"/autopilot-car-hailing/evaluation/label/driver/taxi/list 接口 onError"
)
}
override fun onFail(code: Int, msg: String) {
CallerLogger.e(
SceneConstant.M_TAXI_P + TAG,
"/autopilot-car-hailing/evaluation/label/driver/taxi/list 接口:${code}---${msg}"
)
}
override fun onSuccess(data: TaxiPassengerAllStarWorld?) {
allStarWithWorld = data
}
})
}
private fun requestStarWordByStar(start:Int) {
TaxiPassengerServiceManager.getWorldByStar(context,start.toString(),
object : OchCommonServiceCallback<TaxiPassengerAllStarWorld> {
override fun onError() {
CallerLogger.e(
SceneConstant.M_TAXI_P + TAG,
"/autopilot-car-hailing/evaluation/label/driver/taxi/listByStar 接口 onError"
)
}
override fun onFail(code: Int, msg: String) {
CallerLogger.e(
SceneConstant.M_TAXI_P + TAG,
"/autopilot-car-hailing/evaluation/label/driver/taxi/listByStar 接口:${code}---${msg}"
)
}
override fun onSuccess(data: TaxiPassengerAllStarWorld?) {
if(data?.data != null &&data.data!!.size>0){
val commentAdapter = rvCommentList.adapter as CommentAdapter
commentAdapter.addAll(data.data.toMutableList())
startStartAnimation(start)
}
}
})
}
companion object {
const val TAG = "TaxiPassengerArrivedView"
}
init {
try {
initView(context)
} catch (e: Exception) {
e.printStackTrace()
}
}
}

View File

@@ -1,74 +0,0 @@
package com.mogo.och.taxi.passenger.ui.comment.adapter
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.mogo.och.taxi.passenger.R
import com.mogo.och.taxi.passenger.bean.TaxiPassengerAllStarWorld.TaxiPassengerStarWorld
class CommentAdapter(private val context: Context?,private val itemDataList: MutableList<TaxiPassengerStarWorld>) :
RecyclerView.Adapter<ItemCommentHolder>() {
fun add(taxiPassengerStarWorld: TaxiPassengerStarWorld) {
itemDataList.add(taxiPassengerStarWorld)
notifyItemInserted(itemDataList.size)
}
fun addAll(itemDataList: MutableList<TaxiPassengerStarWorld>){
this.itemDataList.clear()
this.itemDataList.addAll(itemDataList)
// region 临时代码
var needMove:TaxiPassengerStarWorld?=null
itemDataList.forEachIndexed { index, taxiPassengerStarWorld ->
if(taxiPassengerStarWorld.labelInfo=="频繁急停急刹"){
needMove = taxiPassengerStarWorld
return@forEachIndexed
}
}
needMove?.let {
this.itemDataList.remove(it)
this.itemDataList.add(this.itemDataList.size-1,it)
}
// endregion
this.notifyDataSetChanged()
}
fun getSelectComment(): List<TaxiPassengerStarWorld> {
return itemDataList.filter {
if(it.isSelect==null){
it.isSelect = false
}
it.isSelect
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemCommentHolder {
val v = LayoutInflater.from(context).inflate(R.layout.list_comment_item, parent, false)
return ItemCommentHolder(context, v)
}
override fun onBindViewHolder(holder: ItemCommentHolder, position: Int) {
val taxiPassengerStarWorld = itemDataList[position]
holder.commentItem.text = taxiPassengerStarWorld.labelInfo
if (taxiPassengerStarWorld.isSelect!=null&&taxiPassengerStarWorld.isSelect) {
taxiPassengerStarWorld.isSelect = true
holder.commentItem.setBackgroundResource(R.drawable.taxi_p_comment_selected)
} else {
taxiPassengerStarWorld.isSelect = false
holder.commentItem.setBackgroundResource(R.drawable.taxi_p_comment_select)
}
holder.commentItem.setOnClickListener { v: View? ->
taxiPassengerStarWorld.isSelect = !taxiPassengerStarWorld.isSelect
notifyItemChanged(holder.bindingAdapterPosition)
}
}
override fun getItemCount(): Int {
return itemDataList.size
}
companion object {
private const val TAG = "RecyclerBaseAdapter"
}
}

View File

@@ -1,25 +0,0 @@
package com.mogo.och.taxi.passenger.ui.comment.adapter;
import android.content.Context;
import android.view.View;
import android.widget.CheckBox;
import androidx.recyclerview.widget.RecyclerView;
import com.mogo.och.taxi.passenger.R;
public class ItemCommentHolder extends RecyclerView.ViewHolder {
public final static String TAG = "ItemCommentHolder";
protected Context context;
public CheckBox commentItem;
public ItemCommentHolder(Context context, View v) {
super(v);
this.context = context;
commentItem = v.findViewById(R.id.tv_comment);
}
}

View File

@@ -0,0 +1,4 @@
package com.mogo.och.taxi.passenger.ui.debug
class DebugEvent {
}

View File

@@ -0,0 +1,91 @@
package com.mogo.och.taxi.passenger.ui.debug
import android.content.Context
import android.os.SystemClock
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.fragment.app.FragmentActivity
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager
import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager
import com.mogo.eagle.core.function.call.setting.CallerSkinModeListenerManager
import com.mogo.eagle.core.function.hmi.ui.setting.ToggleDebugView
import com.mogo.eagle.core.utilcode.kotlin.onClick
import com.mogo.eagle.core.utilcode.util.ActivityUtils
import com.mogo.och.common.module.manager.debug.DebugViewWatchDogFragment
import com.mogo.och.taxi.passenger.R
import com.mogo.och.taxi.passenger.ui.TaxiPassengerBaseFragment
import kotlinx.android.synthetic.main.taxi_p_debug.view.tv_show_arrive
import kotlinx.android.synthetic.main.taxi_p_debug.view.tv_show_phone_check
import kotlinx.android.synthetic.main.taxi_p_debug.view.tv_show_start_autopilot
import kotlinx.android.synthetic.main.taxi_p_statusview.view.iv_biz_icon
import me.jessyan.autosize.utils.AutoSizeUtils
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.taxi_p_debug, this, true)
visibility = GONE
}
private var fragment:TaxiPassengerBaseFragment?=null
override fun onAttachedToWindow() {
super.onAttachedToWindow()
EventBus.getDefault().register(this)
val activityByContext = ActivityUtils.getActivityByContext(context)
if(activityByContext is FragmentActivity){
val fragment =
activityByContext.supportFragmentManager.findFragmentByTag(TaxiPassengerBaseFragment.TAG)
if(fragment is TaxiPassengerBaseFragment){
this.fragment = fragment
}
}
tv_show_arrive.onClick {
fragment?.showOrHideArrivedEndLayout(true)
}
tv_show_phone_check.onClick {
fragment?.showOrHidePressengerCheckPager(isShow = true,"13号路口终(鹰眼专用)","13号路口终(鹰眼专用)","2","2","18811539480")
}
tv_show_start_autopilot.onClick {
fragment?.showOrHideStartAutopilotView(true)
}
}
@Subscribe(threadMode = ThreadMode.MAIN)
fun changeOverview(debugEvent: DebugEvent) {
if(visibility== VISIBLE){
visibility = GONE
}else{
visibility = VISIBLE
}
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
EventBus.getDefault().unregister(this)
}
}

View File

@@ -1,45 +0,0 @@
package com.mogo.och.taxi.passenger.ui.leftmenu
import android.annotation.SuppressLint
import android.view.MotionEvent
import android.view.View
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
class ItemViewTouchListener :
View.OnTouchListener {
// 判断并放跑点击事件
private var dragTime = 0L
@SuppressLint("ClickableViewAccessibility")
override fun onTouch(view: View, motionEvent: MotionEvent): Boolean {
try {
when (motionEvent.action) {
MotionEvent.ACTION_DOWN -> {
LeftMenuOpen.dragAndOpen(motionEvent.rawX.toInt(),motionEvent.action)
dragTime = System.currentTimeMillis()
}
MotionEvent.ACTION_MOVE -> {
if (LeftMenuOpen.dragAndOpen(motionEvent.rawX.toInt(),motionEvent.action)) {
return false
}
}
MotionEvent.ACTION_UP -> {
LeftMenuOpen.dragAndOpen(motionEvent.rawX.toInt(),motionEvent.action)
if (System.currentTimeMillis() - dragTime > 500) {
dragTime = 0
return true
}
}
else -> {}
}
} catch (e: Exception) {
CallerLogger.e(SceneConstant.M_TAXI_P + TAG, e.message)
e.printStackTrace()
}
return false
}
companion object {
const val TAG = "ItemViewTouchListener"
}
}

View File

@@ -1,448 +0,0 @@
package com.mogo.och.taxi.passenger.ui.leftmenu
import android.annotation.SuppressLint
import android.content.ContentResolver
import android.database.Cursor
import android.os.DeadObjectException
import android.os.IBinder
import android.os.RemoteCallbackList
import android.os.RemoteException
import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_TAXI_P
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import com.mogo.eagle.core.utilcode.util.Utils
import com.mogo.och.common.module.utils.DateTimeUtil
import com.mogo.och.common.module.utils.NumberFormatUtil
import com.mogo.och.taxi.passenger.R
import com.mogo.och.taxi.passenger.event.FinishActivity
import com.mogo.och.taxi.passenger.mulprocess.BinderCursor
import com.mogo.och.taxi.passenger.mulprocess.BinderProvider
import com.mogo.och.taxi.passenger.mulprocess.ICallback
import com.mogo.och.taxi.passenger.mulprocess.ILeftMenuService
import com.mogo.och.taxi.passenger.ui.video.FloatingDistanceInfoUtils
import com.mogo.och.taxi.passenger.ui.video.VideoActivity
import org.greenrobot.eventbus.EventBus
import rx.Observable
import rx.Observer
import rx.exceptions.OnCompletedFailedException
import rx.schedulers.Schedulers
import java.util.*
@SuppressLint("StaticFieldLeak")
object LeftMenuOpen {
const val TAG = "mulprocessLeftMenuOpen"
private var windowView: View? = null
private var wl: WindowManager.LayoutParams? = null
private var windowManager: WindowManager? = null
private var close: ((view: View, windowManager: WindowManager?) -> Unit)? = null
private var open: ((view: View, windowManager: WindowManager?) -> Unit)? = null
// 两部分主进程和子进程
private var dragList = mutableSetOf<View>()
private var orderService: ILeftMenuService? = null
private var icallbacks: RemoteCallbackList<ICallback>? = null
var checkIndex = OverlayLeftViewUtils.LIVE
private var lastClickTime = 0L
private const val FAST_CLICK_DELAY_TIME = 1300 // 防止事件发送过快
fun setValue(
windowView: View,
wl: WindowManager.LayoutParams?,
windowManager: WindowManager?,
close: (view: View, windowManager: WindowManager?) -> Unit,
open: (view: View, windowManager: WindowManager?) -> Unit,
isMainProcess: Boolean
) {
this.open = open
this.close = close
this.windowView = windowView
this.windowManager = windowManager
this.wl = wl
dragList.forEach {
registerDragView(it)
}
if(!isMainProcess) {
registerC()
}
}
fun clearValue() {
this.open = null
this.close = null
this.windowView = null
this.windowManager = null
this.wl = null
orderService = null
val iterator = dragList.iterator()
while (iterator.hasNext()) {
val next = iterator.next()
unRegisterDragView(next,false)
iterator.remove()
}
}
private var x = 0
// 判断并放跑点击事件
private const val DEVIATION = 10
private const val NEGATIVEDEVIATION = -10
fun dragAndOpen(newX: Int, action: Int): Boolean {
when (action) {
MotionEvent.ACTION_DOWN -> {
x = newX
}
MotionEvent.ACTION_MOVE -> {
val nowX = newX
val movedX = nowX - x
x = nowX
wl?.let { it ->
it.x += movedX
if (it.x > 0 || it.x < OverlayLeftViewUtils.DEVIATION_WIDTH) {
it.apply {
x -= movedX
}
return true
}
windowView?.let { windowView ->
windowManager?.let { windowManager ->
if (it.x > NEGATIVEDEVIATION && movedX > 0) {
open?.let { it1 ->
UiThreadHandler.post {
it1(windowView, windowManager)
}
}
} else {
//更新悬浮球控件位置
UiThreadHandler.post {
windowManager.updateViewLayout(windowView, it)
}
}
if (it.x < OverlayLeftViewUtils.DEVIATION_WIDTH + DEVIATION && movedX < 0) {
close?.let { it1 ->
UiThreadHandler.post {
it1(windowView, windowManager)
}
}
} else {
//更新悬浮球控件位置
UiThreadHandler.post {
windowManager.updateViewLayout(windowView, it)
}
}
}
}
}
}
MotionEvent.ACTION_UP -> {
wl?.let { wl ->
val startX = wl.x
if (startX > OverlayLeftViewUtils.DEVIATION_WIDTH / 2 && startX < 0) {
//拖动距离大于一半 自动打开
open?.let {
UiThreadHandler.post {
it(windowView!!, windowManager)
}
}
} else if (startX < OverlayLeftViewUtils.DEVIATION_WIDTH / 2 && startX >= OverlayLeftViewUtils.DEVIATION_WIDTH) {
// 拖动距离小于一半自动关闭
close?.let {
UiThreadHandler.post {
it(windowView!!, windowManager)
}
}
} else {
}
}
}
}
return false
}
fun registerDragView(view: View?) {
if (view != null) {
dragList.add(view)
view.setOnTouchListener(ItemViewTouchListener())
view.setOnClickListener {
open?.let { it1 -> it1(windowView!!, windowManager) }
}
}
}
fun unRegisterDragView(view: View?,remove:Boolean) {
if(remove) {
dragList.remove(view)
}
view?.let {
it.setOnTouchListener(null)
it.setOnClickListener(null)
if(it.id==R.id.ids_video_anchor){
val parent = it.parent as ViewGroup
parent.removeView(it)
}
}
}
fun transmissionIndex(index:Int){
Observable.empty<String?>().subscribeOn(Schedulers.io())
.subscribe(object : Observer<String?> {
override fun onCompleted() {
try {
CallerLogger.d(M_TAXI_P + TAG, "tran--transmissionIndex---$index")
if (orderService == null) {
registerC()
}
orderService?.transmissionIndex(index)
}catch (ill:IllegalStateException){
ill.printStackTrace()
}catch (onCo: OnCompletedFailedException){
onCo.printStackTrace()
}catch (deadobjectexception: DeadObjectException){
deadobjectexception.printStackTrace()
}
}
override fun onError(e: Throwable?) {}
override fun onNext(t: String?) {}
})
}
/**
* 主进程调用
*/
fun registerCallbackHost(cb:ICallback?){
if(icallbacks==null){
icallbacks = RemoteCallbackList<ICallback>()
}
cb?.let {
icallbacks?.register(it)
}
}
/**
* 主进程调用 反注册
*/
fun unregisterCallbackHost(cb:ICallback?){
cb?.let {
icallbacks?.unregister(it)
}
icallbacks?.kill()
icallbacks = null
}
/**
* 子进程调用 注册回调 主进程中调用
* 方便主进程传递到子进程 速度、剩余公里、剩余时间、到达时间
*/
fun registerCallback(cb:ICallback?){
Observable.empty<String?>().subscribeOn(Schedulers.io())
.subscribe(object : Observer<String?> {
override fun onCompleted() {
try {
CallerLogger.d(M_TAXI_P + TAG, "tran--registerCallback--注册")
if (orderService == null) {
registerC()
}
cb?.let {
orderService?.registerCallback(it)
}
}catch (ill:IllegalStateException){
ill.printStackTrace()
}catch (onCo: OnCompletedFailedException){
onCo.printStackTrace()
}catch (deadobjectexception: DeadObjectException){
deadobjectexception.printStackTrace()
}
}
override fun onError(e: Throwable?) {}
override fun onNext(t: String?) {}
})
}
/**
* 子进程调用 反注册
*/
fun unregisterCallback(cb:ICallback?){
Observable.empty<String?>().subscribeOn(Schedulers.io())
.subscribe(object : Observer<String?> {
override fun onCompleted() {
CallerLogger.d(M_TAXI_P + TAG, "tran--unregisterCallback--反注册")
cb?.let {
try {
orderService?.unRegisterCallback(it)
}catch (ill:IllegalStateException){
ill.printStackTrace()
}catch (onCo: OnCompletedFailedException){
onCo.printStackTrace()
}catch (deadobjectexception: DeadObjectException){
deadobjectexception.printStackTrace()
}
}
}
override fun onError(e: Throwable?) {}
override fun onNext(t: String?) {}
})
}
/**
* 主进程调用 向子进程传输 剩余距离、剩余时间、和速度
*/
fun callCallBack(meters: Long,timeInSecond: Long,speed:Float){
if(checkIndex == OverlayLeftViewUtils.CONSULT||checkIndex == OverlayLeftViewUtils.MOVIE) {
if (System.currentTimeMillis() - lastClickTime < FAST_CLICK_DELAY_TIME){
return
}
lastClickTime = System.currentTimeMillis()
Observable.empty<String?>().subscribeOn(Schedulers.io())
.subscribe(object : Observer<String?> {
override fun onCompleted() {
CallerLogger.d(M_TAXI_P + TAG, "callCallBack$meters--$timeInSecond--$speed")
try {
val len = icallbacks?.beginBroadcast()
len?.let {
for (i in 0 until len) {
try {
icallbacks?.getBroadcastItem(i)?.onResult(meters, timeInSecond, speed)
} catch (e: RemoteException) {
e.printStackTrace()
}
}
}
icallbacks?.finishBroadcast()
}catch (e:Exception){
CallerLogger.e(M_TAXI_P + TAG, "callCallBack${e.message}")
}
}
override fun onError(e: Throwable?) {}
override fun onNext(t: String?) {}
})
}
}
fun invoKeyByEventType(typeID:Int){
Observable.empty<String?>().subscribeOn(Schedulers.io())
.subscribe(object : Observer<String?> {
override fun onCompleted() {
val len = icallbacks?.beginBroadcast()
len?.let {
for (i in 0 until it) {
try {
icallbacks?.getBroadcastItem(i)?.postEvent(typeID)
} catch (e: RemoteException) {
e.printStackTrace()
}
}
}
icallbacks?.finishBroadcast()
}
override fun onError(e: Throwable?) {}
override fun onNext(t: String?) {}
})
}
/**
* 主进程、video进程都得调用
* 主进程在显示是主动调用
* video进程在天津View是判断是否调用了
*/
@Synchronized
private fun registerC() {
if(orderService!=null){
return
}
CallerLogger.d(M_TAXI_P + TAG, "tran--registerC--获取jni")
val resolver: ContentResolver = Utils.getApp().contentResolver
val cu = resolver.query(
BinderProvider.CONTENT_URI,
null,
null,
arrayOf(BinderProvider.SERVICE_LEFTMENU),
null
) ?: return
val binder: IBinder = getBinder(cu)
try {
try {
orderService = ILeftMenuService.Stub.asInterface(binder)
}catch (ill:IllegalStateException){
ill.printStackTrace()
}catch (onCo: OnCompletedFailedException){
onCo.printStackTrace()
}catch (deadobjectexception: DeadObjectException){
deadobjectexception.printStackTrace()
}
} catch (e: RemoteException) {
e.printStackTrace()
} finally {
cu.close()
}
}
private fun getBinder(cursor: Cursor): IBinder {
val extras = cursor.extras
extras.classLoader = BinderCursor.BinderParcelable::class.java.classLoader
val w = extras.getParcelable<BinderCursor.BinderParcelable>("binder")
return w!!.mBinder
}
val callBack = object : ICallback.Stub() {
override fun onResult(meters :Long, timeInSecond:Long,speed:Float) {
if(speed<0){
// 距离单位
var disUnit = "公里"
// 距离
var remainDis: String? = "0"
if (meters > 0) {
if (meters / 1000 < 1) {
disUnit = ""
remainDis = Math.round(meters.toFloat()).toString()
} else {
disUnit = "公里"
remainDis = NumberFormatUtil.formatLong(meters.toDouble() / 1000)
}
}
// 剩余时间
val time = Math.ceil(timeInSecond.toDouble() / 60f).toInt()
val beforeTime = Calendar.getInstance()
beforeTime.add(Calendar.MINUTE, time)
//到达时间
val arriveTime = DateTimeUtil.formatCalendarToString(beforeTime, DateTimeUtil.HH_mm)
FloatingDistanceInfoUtils.setDistance(meters,remainDis,disUnit,time,arriveTime)
}else{
FloatingDistanceInfoUtils.setSpeed(speed)
}
}
override fun postEvent(type: Int) {
when (type) {
VideoActivity.EVENT_FINISH -> {
EventBus.getDefault().post(FinishActivity())
}
else -> {}
}
}
}
}

View File

@@ -1,58 +0,0 @@
package com.mogo.och.taxi.passenger.ui.leftmenu
import android.content.Context
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
import android.widget.ImageView
import com.mogo.och.taxi.passenger.ui.leftmenu.model.LeftMenuModel
class ListAdapter(private val context: Context,val list: MutableList<LeftMenuModel>) : BaseAdapter() {
override fun getCount(): Int {
return list.size
}
override fun getItem(position: Int): Any {
return list[position]
}
override fun getItemId(position: Int): Long {
return position.toLong()
}
override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
val imageView = ImageView(context)
val leftMenuModel = list[position]
if (leftMenuModel.isChecked) {
imageView.setImageResource(leftMenuModel.selected)
} else {
imageView.setImageResource(leftMenuModel.select)
}
imageView.setOnClickListener {
setSelectIndex(position,true)
}
return imageView
}
/**
* 多进程调用
*/
fun setSelectIndex(index: Int,needStartActivity: Boolean) {
for (i in list.indices) {
if(index==i){
if(!list[i].isChecked){
list[i].selectListener.onSelect(needStartActivity)
OverlayLeftViewUtils.transmissionIndex(index)
}
}
list[i].isChecked = index == i
}
notifyDataSetChanged()
}
interface OnTabSelectListener {
fun onSelect(isCurrentProcess:Boolean)
}
}

View File

@@ -1,432 +0,0 @@
package com.mogo.och.taxi.passenger.ui.leftmenu
import android.animation.Animator
import android.animation.ValueAnimator
import android.annotation.SuppressLint
import android.app.Activity
import android.content.Context.WINDOW_SERVICE
import android.graphics.PixelFormat
import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.view.WindowManager
import android.view.animation.LinearInterpolator
import android.widget.FrameLayout
import android.widget.ListView
import androidx.appcompat.widget.AppCompatImageView
import androidx.constraintlayout.widget.ConstraintLayout
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.*
import com.mogo.och.taxi.passenger.R
import com.mogo.och.taxi.passenger.constant.TaxiPassengerConst
import com.mogo.och.taxi.passenger.event.FinishActivity
import com.mogo.och.taxi.passenger.event.UIStatus
import com.mogo.och.taxi.passenger.mulprocess.EmptyService
import com.mogo.och.taxi.passenger.ui.leftmenu.model.LeftMenuModel
import com.mogo.och.taxi.passenger.ui.video.VideoActivity
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import org.greenrobot.eventbus.EventBus
import java.util.concurrent.TimeUnit
/**
* 遮罩层工具类
*
* @author mogoauto
*/
@SuppressLint("StaticFieldLeak")
object OverlayLeftViewUtils {
private const val TAG = "OverlayViewUtils"
private var windowManager: WindowManager? = null
@Volatile
private var isShowing = false
private var params:WindowManager.LayoutParams?=null
const val WIDTH = 810
const val DEVIATION_WIDTH = -669
const val LIVE = 0
const val OVERVIEW = 1
const val CONSULT = 2
const val MOVIE = 3
private var overlayView: View?=null
private var subscribe: Disposable?=null
private var subscribeLive: Disposable?=null
private var subscribeOVERVIEW: Disposable?=null
private var acivOpenClose: AppCompatImageView?=null
/**
* 添加覆盖View在Activity上面
*/
@JvmOverloads
fun showOverlayView(context: Activity,checkIndex:Int = LIVE,isOpen: Boolean=true, ani: Int = -1,isMainProcess: Boolean = false) {
if (isShowing) {
return
}
if (windowManager == null) {
windowManager = context.getSystemService(WINDOW_SERVICE) as WindowManager
}
overlayView = LayoutInflater.from(context)
.inflate(R.layout.taxi_p_window_float_interphone, null) as ConstraintLayout
overlayView?.let { view ->
// 设置View显示模式沉浸式的侵入到状态栏导航栏
view.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION)
layoutParams(ani,view, isOpen)
// 如果正在展示中并且lastOverlayView不为null先做移除操作保证覆盖在最上面的View只有一个防止叠加导致无法移除
dismissOverlayView(false)
val vDragField = view.findViewById<View>(R.id.v_drag_field)
acivOpenClose = view.findViewById(R.id.aciv_open_close)
vDragField.setOnTouchListener(ItemViewTouchListener())
vDragField.setOnClickListener {
val start: Int = params!!.x
if (start > DEVIATION_WIDTH /2 && start < 10) {
close(view, windowManager)
} else if (start < DEVIATION_WIDTH /2 && start >= DEVIATION_WIDTH) {
open(view, windowManager)
}
}
val lvSelectItem = view.findViewById<ListView>(R.id.lv_select_item)
val integers = mutableListOf<LeftMenuModel>()
val liveSelected = object :ListAdapter.OnTabSelectListener{
override fun onSelect(isCurrentProcess:Boolean) {
LeftMenuOpen.checkIndex = LIVE
if(isCurrentProcess) {
close(view, windowManager)
}else {
LeftMenuOpen.invoKeyByEventType(VideoActivity.EVENT_FINISH)
}
if(isMainProcess){
//主进程 建议Eventbus实现
subscribeLive = Observable.timer(300, TimeUnit.MILLISECONDS)
.subscribe {
EventBus.getDefault().post(UIStatus(UIStatus.LIVE))
}
}else{
EventBus.getDefault().post(FinishActivity())
}
}
}
val overViewSelected = object :ListAdapter.OnTabSelectListener{
override fun onSelect(isCurrentProcess:Boolean) {
LeftMenuOpen.checkIndex = OVERVIEW
if(isCurrentProcess) {
close(view, windowManager)
}else {
LeftMenuOpen.invoKeyByEventType(VideoActivity.EVENT_FINISH)
}
if(isMainProcess){
//主进程 建议Eventbus实现
subscribeOVERVIEW = Observable.timer(300, TimeUnit.MILLISECONDS)
.subscribe {
EventBus.getDefault().post(UIStatus(UIStatus.OVERVIEW))
CallerLogger.d(SceneConstant.M_TAXI_P + TAG, "发送Eventbus subscribeOVERVIEW")
}
}else{
EventBus.getDefault().post(FinishActivity())
}
}
}
val consultSelect = object :ListAdapter.OnTabSelectListener{
override fun onSelect(isCurrentProcess:Boolean) {
LeftMenuOpen.checkIndex = CONSULT
if(isCurrentProcess) {
close(view, windowManager)
//计算订单起点和终点距离
val sumDis = SharedPrefsMgr.getInstance(context).getInt(TaxiPassengerConst.SP_KEY_ORDER_SUM_DIS, 0)
VideoActivity.startActivity(context, VideoActivity.VIDEOTYPE_CONSULT,sumDis)
}
}
}
val entertainmentSelect = object :ListAdapter.OnTabSelectListener{
override fun onSelect(isCurrentProcess:Boolean) {
LeftMenuOpen.checkIndex = MOVIE
if(isCurrentProcess) {
close(view, windowManager)
val sumDis = SharedPrefsMgr.getInstance(context).getInt(TaxiPassengerConst.SP_KEY_ORDER_SUM_DIS, 0)
VideoActivity.startActivity(context, VideoActivity.VIDEOTYPE_MOIES,sumDis)
}
}
}
integers.add(LeftMenuModel(R.drawable.shape_size_live_select, R.drawable.shape_size_live_selected,false,liveSelected))
integers.add(LeftMenuModel(R.drawable.shape_size_overview_select, R.drawable.shape_size_overview_selected,false,overViewSelected))
integers.add(LeftMenuModel(R.drawable.shape_size_consult_select, R.drawable.shape_size_consult_selected,false,consultSelect))
integers.add(LeftMenuModel(R.drawable.shape_size_entertainment_select, R.drawable.shape_size_entertainment_selected,false,entertainmentSelect))
integers.forEachIndexed { index, leftMenuModel ->
leftMenuModel.isChecked = index == checkIndex
}
lvSelectItem.adapter = ListAdapter(context, integers)
addTarget(context)
LeftMenuOpen.setValue(view, params, windowManager,::close,::open,isMainProcess)
try {
windowManager!!.addView(overlayView, params)
checkProcess()
isShowing = true
} catch (e: WindowManager.BadTokenException) {
isShowing = true;
dismissOverlayView(false)
} catch (e: Exception) {
e.printStackTrace()
}
}
}
private fun addTarget(context: Activity) {
try {
val content =
context.window.decorView.findViewById<FrameLayout>(android.R.id.content)
val textView = View(context)
textView.id = R.id.ids_video_anchor
addDragTarget(textView)
val param: FrameLayout.LayoutParams =
FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT,FrameLayout.LayoutParams.WRAP_CONTENT)
param.gravity = Gravity.CENTER_VERTICAL
param.width = 143
param.height = 308
textView.layoutParams = param
content.addView(textView)
} catch (e: java.lang.Exception) {
e.printStackTrace()
}
}
/**
* 打开状态栏
*/
private fun open(overlayView: View,windowManager: WindowManager?) {
checkProcess()
val valueAnimator = ValueAnimator.ofInt(params!!.x, 0)
valueAnimator.duration = 100
valueAnimator.interpolator = LinearInterpolator()
valueAnimator.addUpdateListener {
params?.x = it.animatedValue as Int
windowManager?.updateViewLayout(overlayView, params)
}
valueAnimator.addListener(object : Animator.AnimatorListener {
override fun onAnimationStart(animation: Animator) {}
override fun onAnimationEnd(animation: Animator) {
acivOpenClose?.apply {
pivotX = (width /2).toFloat()
pivotY = (height /2).toFloat()
rotation = 0f
}
closeByTime(overlayView, windowManager)
params?.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or
WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS or
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
windowManager?.updateViewLayout(overlayView, params)
}
override fun onAnimationCancel(animation: Animator) {}
override fun onAnimationRepeat(animation: Animator) {}
})
valueAnimator.start()
}
private fun checkProcess() {
ThreadPoolService.execute {
val currentProcessName = ProcessUtils.getCurrentProcessName()
if (currentProcessName.contains(":video")) {
return@execute
}
val allBackgroundProcesses = ProcessUtils.getAllBackgroundProcesses()
var haveProcess = false
allBackgroundProcesses.forEach {
if (it.contains(":video")) {
haveProcess = true
return@forEach
}
}
if (!haveProcess) {
EmptyService.startService(Utils.getApp())
}
}
}
fun addDragTarget(view :View?){
LeftMenuOpen.registerDragView(view)
}
fun removeDragTarget(view: View?){
LeftMenuOpen.unRegisterDragView(view,true)
}
/**
*
*/
fun transmissionIndex(index:Int){
// TODO 需要与,杨亚坤,确认为啥要限制仅在主进程
// if(!ProcessUtils.isMainProcess(Utils.getApp())) {
LeftMenuOpen.transmissionIndex(index)
// }
}
fun transmissionIndexGet(index: Int){
overlayView?.let {
val lvSelectItem = it.findViewById<ListView>(R.id.lv_select_item)
val listAdapter = lvSelectItem.adapter as ListAdapter
listAdapter.setSelectIndex(index,false)
}
}
private fun closeByTime(
overlayView: View,
windowManager: WindowManager?
) {
subscribe?.let {
if (!it.isDisposed) {
it.dispose()
}
}
subscribe = Observable.timer(3000, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
if (params?.x == 0) {
close(overlayView, windowManager)
}
}
}
/**
* 关闭状态栏
*/
private fun close(overlayView: View,windowManager: WindowManager?) {
val valueAnimator = ValueAnimator.ofInt(params!!.x, DEVIATION_WIDTH)
valueAnimator.duration = 100
valueAnimator.interpolator = LinearInterpolator()
valueAnimator.addUpdateListener {
params?.let { paramsIn->
paramsIn.x = it.animatedValue as Int
windowManager?.updateViewLayout(overlayView, paramsIn)
}
}
valueAnimator.addListener(object : Animator.AnimatorListener {
override fun onAnimationStart(animation: Animator) {}
override fun onAnimationEnd(animation: Animator) {
acivOpenClose?.apply {
pivotX = (width /2).toFloat()
pivotY = (height /2).toFloat()
rotation = 180f
}
params?.let {
it.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or
WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS or
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE or
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
windowManager?.updateViewLayout(overlayView, it)
}
}
override fun onAnimationCancel(animation: Animator) {}
override fun onAnimationRepeat(animation: Animator) {}
})
valueAnimator.start()
}
private fun layoutParams(ani: Int,view :View,isOpen: Boolean) {
if(params ==null) {
params = WindowManager.LayoutParams()
}
params = WindowManager.LayoutParams()
params?.let {
it.width = WIDTH
it.height = WindowManager.LayoutParams.MATCH_PARENT
it.alpha = 1.0f
it.gravity = Gravity.START or Gravity.CENTER_HORIZONTAL
if(isOpen) {
it.x = 0
}else{
it.x = DEVIATION_WIDTH
}
it.y = 0
it.format = PixelFormat.RGBA_8888
// 设置窗口类型为应用子窗口和PopupWindow同类型
it.type = WindowManager.LayoutParams.TYPE_APPLICATION_SUB_PANEL
// 没有边界限制,允许窗口扩展到屏幕外
it.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or
WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS or
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
if (ani != -1) {
it.windowAnimations = ani
}
closeByTime(view, windowManager)
}
}
fun getStatus():Boolean{
return isShowing
}
/**
* 移除覆盖View在Activity上面
*/
fun dismissOverlayView(isMain:Boolean) {
if (!isShowing) {
return
}
releaseDelay(subscribe)
releaseDelay(subscribeLive)
releaseDelay(subscribeOVERVIEW)
subscribe = null
subscribeLive = null
subscribeOVERVIEW = null
// 管理的要关闭都得关闭
if(isMain) {
LeftMenuOpen.invoKeyByEventType(VideoActivity.EVENT_FINISH)
}
LeftMenuOpen.clearValue()
try {
if (windowManager != null && overlayView != null) {
windowManager!!.removeViewImmediate(overlayView)
params = null
}
if(windowManager!=null){
windowManager = null
}
if(params!=null){
params = null
}
if (overlayView!=null) {
overlayView = null
}
if (acivOpenClose!=null) {
acivOpenClose = null
}
isShowing = false
} catch (e: Exception) {
e.printStackTrace()
}
}
private fun releaseDelay(subscribe: Disposable?) {
subscribe?.let {
if (!it.isDisposed) {
it.dispose()
}
}
}
}

View File

@@ -1,10 +0,0 @@
package com.mogo.och.taxi.passenger.ui.leftmenu.model
import com.mogo.och.taxi.passenger.ui.leftmenu.ListAdapter
data class LeftMenuModel(
val select: Int,
val selected: Int,
var isChecked: Boolean,
val selectListener: ListAdapter.OnTabSelectListener
)

View File

@@ -0,0 +1,148 @@
package com.mogo.och.taxi.passenger.ui.orderinfo
import android.content.Context
import android.graphics.drawable.GradientDrawable
import android.graphics.drawable.LayerDrawable
import android.graphics.drawable.ScaleDrawable
import android.os.Build
import android.util.AttributeSet
import android.view.Gravity
import android.view.LayoutInflater
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.content.ContextCompat
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.findViewTreeViewModelStoreOwner
import com.mogo.och.taxi.passenger.R
import kotlinx.android.synthetic.main.taxi_p_itinerary.view.actv_arrived_time
import kotlinx.android.synthetic.main.taxi_p_itinerary.view.actv_distance
import kotlinx.android.synthetic.main.taxi_p_itinerary.view.actv_distance_unit
import kotlinx.android.synthetic.main.taxi_p_itinerary.view.actv_endstation
import kotlinx.android.synthetic.main.taxi_p_itinerary.view.actv_speed_value
import kotlinx.android.synthetic.main.taxi_p_itinerary.view.actv_surplus_time
import kotlinx.android.synthetic.main.taxi_p_itinerary.view.actv_surplus_time_unit
import kotlinx.android.synthetic.main.taxi_p_itinerary.view.progress_distance
import me.jessyan.autosize.utils.AutoSizeUtils
class ItineraryView : ConstraintLayout, OrderInfoViewModel.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.taxi_p_itinerary, this, true)
setDrawable(true)
progress_distance.progress = 0
progress_distance.max = 100
}
private fun setDrawable(normal:Boolean) {
val gradientDrawable = GradientDrawable()
gradientDrawable.shape = GradientDrawable.RECTANGLE
val corner = AutoSizeUtils.dp2px(context, 40f).toFloat()
val cornerTop = AutoSizeUtils.dp2px(context, 20f).toFloat()
if(normal) {
gradientDrawable.cornerRadii =
floatArrayOf(0f, 0f, cornerTop, cornerTop, cornerTop, cornerTop, corner, corner)
}else {
gradientDrawable.cornerRadii =
floatArrayOf(0f, 0f, 0f, 0f, corner, corner, corner, corner)
}
val firstColor = ContextCompat.getColor(context, R.color.taxi_p_OF5FFF)
val setondColor = ContextCompat.getColor(context, R.color.taxi_p_44C8FF)
val thirdColor = ContextCompat.getColor(context, R.color.taxi_p_8AE4ED)
val fourceColor = ContextCompat.getColor(context, R.color.taxi_p_C8F3F4)
val bottomColor = ContextCompat.getColor(context, R.color.taxi_p_66476FBE)
gradientDrawable.colors = intArrayOf(firstColor, setondColor, thirdColor, fourceColor)
gradientDrawable.orientation = GradientDrawable.Orientation.LEFT_RIGHT
val temp01 = GradientDrawable()
temp01.cornerRadii = floatArrayOf(0f, 0f, 0f, 0f, corner, corner, corner, corner)
temp01.colors = intArrayOf(bottomColor, bottomColor)
val scaleDrawable3 = ScaleDrawable(gradientDrawable, Gravity.START, 1f, -1f)
val arr = arrayOf(temp01, scaleDrawable3)
val ld = LayerDrawable(arr)
ld.setDrawableByLayerId(android.R.id.background, temp01)
ld.setDrawableByLayerId(android.R.id.progress, scaleDrawable3)
progress_distance.setProgressDrawableTiled(ld)
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
val viewModel = findViewTreeViewModelStoreOwner()?.let {
ViewModelProvider(it).get(OrderInfoViewModel::class.java)
}
viewModel?.setDistanceCallback(this)
}
override fun setSpeed(speedValue:String){
actv_speed_value.text = speedValue
}
override fun setEndStation(endStation:String){
if(endStation.length>9){
actv_endstation.text = "${endStation.subSequence(0,9)}"
}else {
actv_endstation.text = endStation
}
}
var prePercentage = 0f
val needChangeStyleNumber = 0.99
override fun setDistanceInfo(surplusdistance:String,distanceUnit:String,
surplusTime:String,surplusTimeUnit:String,
arrivedTime:String,alreadyGone:Int,stationDistance:Int
){
actv_distance.text = surplusdistance
actv_distance_unit.text = distanceUnit
actv_surplus_time .text= surplusTime
actv_surplus_time_unit.text = surplusTimeUnit
actv_arrived_time.text= arrivedTime
if(stationDistance>0&&alreadyGone<stationDistance){
if (progress_distance.max != stationDistance) {
progress_distance.max = stationDistance
}
val currentPercentage = alreadyGone.toFloat() / stationDistance
if((prePercentage>needChangeStyleNumber) xor (currentPercentage>needChangeStyleNumber)){
if(currentPercentage>needChangeStyleNumber){
setDrawable(false)
}else{
setDrawable(true)
}
progress_distance.progress = alreadyGone
}else{
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
progress_distance.setProgress(alreadyGone,true)
}else{
progress_distance.progress = alreadyGone
}
}
prePercentage = currentPercentage
}
}
init {
try {
initView()
} catch (e: Exception) {
e.printStackTrace()
}
}
}

View File

@@ -0,0 +1,106 @@
package com.mogo.och.taxi.passenger.ui.orderinfo
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.common.module.utils.DateTimeUtil
import com.mogo.och.common.module.utils.NumberFormatUtil
import com.mogo.och.taxi.passenger.R
import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRespBean
import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerOrderStatusCallback
import com.mogo.och.taxi.passenger.constant.TaxiPassengerOrderStatusEnum
import com.mogo.och.taxi.passenger.model.TaxiPassengerModel
import kotlin.math.abs
import kotlin.math.ceil
class OrderInfoViewModel: ViewModel(), IMoGoChassisLocationGCJ02Listener,
IOCHTaxiPassengerOrderStatusCallback {
private val TAG = OrderInfoViewModel::class.java.simpleName
private var viewCallback:ItineraryViewCallback?=null
private var disUnit:String
private var surplusTimeUnit:String
init {
disUnit = AbsMogoApplication.getApp().getString(R.string.taxi_p_distance_unit_km)
surplusTimeUnit = AbsMogoApplication.getApp().getString(R.string.taxi_p_surplustime)
// 设置起点和终点marker和实时车辆位置
CallerChassisLocationGCJ02ListenerManager.addListener(TAG, 4, this)
TaxiPassengerModel.setOrderStatusCallback(TAG,this)
}
fun setDistanceCallback(viewCallback:ItineraryViewCallback){
this.viewCallback = viewCallback
}
override fun onCleared() {
super.onCleared()
this.viewCallback = null
TaxiPassengerModel.setOrderStatusCallback(TAG,null)
}
override fun onChassisLocationGCJ02(mogoLocation: MogoLocation?) {
mogoLocation?.let {
UiThreadHandler.post {
val speedKM = (abs(it.gnssSpeed) * 3.6f).toInt()
viewCallback?.setSpeed(speedKM.toString())
}
}
}
interface ItineraryViewCallback{
fun setDistanceInfo(surplusdistance:String,distanceUnit:String,
surplusTime:String,surplusTimeUnit:String,
arrivedTime:String,alreadyGone:Int,distance:Int
)
fun setEndStation(endStation:String)
fun setSpeed(speedValue:String)
}
override fun onCurrentOrderStatusChanged(order: TaxiPassengerOrderQueryRespBean.Result?) {
order?.endSiteAddr?.let {
UiThreadHandler.post {
viewCallback?.setEndStation(it)
}
}
when (TaxiPassengerModel.curOrderStatus) {
TaxiPassengerOrderStatusEnum.OnTheWayToEnd -> {
}
else ->{
UiThreadHandler.post {
viewCallback?.setDistanceInfo(
"--", disUnit, "--", surplusTimeUnit, "--", 0, 100
)
}
}
}
}
override fun onCurrentOrderDistToEndChanged(meters: Long, timeInSecond: Long,stationDistance:Int) {
var dis: String? = "0"
var disUnit = "KM"
if (meters > 0) {
if (meters / 1000 < 1) {
disUnit = AbsMogoApplication.getApp().getString(R.string.taxi_p_distance_unit_m)
dis = Math.round(meters.toFloat()).toString()
} else {
disUnit = AbsMogoApplication.getApp().getString(R.string.taxi_p_distance_unit_km)
dis = NumberFormatUtil.formatLong(meters.toDouble() / 1000)
}
}
val time = ceil(timeInSecond / 60f).toInt()
val arriveTime = DateTimeUtil.getAfterSecondTime(timeInSecond.toInt())
UiThreadHandler.post {
viewCallback?.setDistanceInfo(
dis!!,disUnit,time.toString(),surplusTimeUnit,arriveTime,stationDistance-meters.toInt(),stationDistance)
}
}
}

View File

@@ -0,0 +1,242 @@
package com.mogo.och.taxi.passenger.ui.startautopilot
import android.annotation.SuppressLint
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import androidx.core.content.res.ResourcesCompat
import androidx.lifecycle.ViewModelProvider
import com.elegant.utils.UiThreadHandler
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.util.OverlayViewUtils
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.och.common.module.utils.AnimatorDrawableUtil
import com.mogo.och.taxi.passenger.R
import com.mogo.och.taxi.passenger.ui.TaxiPassengerBaseFragment
import com.mogo.och.taxi.passenger.widget.WindowRelativeLayout
import com.mogo.och.taxi.passenger.widget.animutils.AnimationsContainer
import kotlinx.android.synthetic.main.taxi_p_base_fragment.aciv_xiaozhi_normal
import kotlinx.android.synthetic.main.taxi_p_start_autopilot_view.view.actv_front_left_door
import kotlinx.android.synthetic.main.taxi_p_start_autopilot_view.view.actv_front_right_door
import kotlinx.android.synthetic.main.taxi_p_start_autopilot_view.view.actv_orderinfo
import kotlinx.android.synthetic.main.taxi_p_start_autopilot_view.view.actv_rear_left_door
import kotlinx.android.synthetic.main.taxi_p_start_autopilot_view.view.actv_rear_right_door
import kotlinx.android.synthetic.main.taxi_p_start_autopilot_view.view.starting_autopilot_view_close
import kotlinx.android.synthetic.main.taxi_p_start_autopilot_view.view.taxi_p_autopilot_btn_bg
import kotlinx.android.synthetic.main.taxi_p_start_autopilot_view.view.taxi_p_autopilot_starting
import kotlinx.android.synthetic.main.taxi_p_start_autopilot_view.view.taxi_p_start_autopilot
import kotlinx.android.synthetic.main.taxi_p_start_autopilot_view.view.v_xiaozhi_belt_info_bg
import java.util.Arrays
/**
* @author: wangmingjun
* @date: 2022/6/14
*/
class StartAutopilotView : WindowRelativeLayout, StartAutopilotViewModel.StartAutopilotCallback{
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)
companion object {
private val TAG = StartAutopilotView::class.java.simpleName
private const val TIMER_START_AUTOPILOT_INTERVAL = 20 * 1000L
}
var isStarting = false
private var taxiPStartAutopilot: AnimationsContainer?=null
private var taxiPStartAutopilotCar: AnimationsContainer?=null
init {
initView()
}
private fun initView() {
LayoutInflater.from(context).inflate(R.layout.taxi_p_start_autopilot_view, this, true)
taxiPStartAutopilotCar = AnimationsContainer(R.array.taxi_p_start_autopilot_car, 20,taxi_p_autopilot_starting)
taxiPStartAutopilotCar?.setOnAnimStopListener(object :AnimationsContainer.OnAnimationStoppedListener{
override fun AnimationStopped() {
CallerLogger.d(SceneConstant.M_TAXI_P + TAG, "动画暂停")
}
})
taxiPStartAutopilot = AnimationsContainer(R.array.taxi_p_start_autopilot, 15,taxi_p_autopilot_btn_bg)
taxiPStartAutopilot?.setOnAnimStopListener(object :AnimationsContainer.OnAnimationStoppedListener{
override fun AnimationStopped() {
CallerLogger.d(SceneConstant.M_TAXI_P + TAG, "动画暂停")
}
})
}
fun startAutopilotBgAnimatorDrawable(isStart: Boolean) {
if (isStart) {
taxiPStartAutopilot?.start()
} else {
taxiPStartAutopilot?.stop()
}
}
@SuppressLint("UseCompatLoadingForDrawables")
override fun handleStartAutopilotBtnStatus(isClickable: Boolean) {
taxi_p_autopilot_starting?.setImageResource(R.drawable.light_00003)
updateStartAutopilotBtnStatus(isClickable)
if (isClickable) { //高亮可点击状态下动画一直进行
startAutopilotBgAnimatorDrawable(true)
} else { // 置灰色可点击状态下动画停止
startAutopilotBgAnimatorDrawable(false)
}
}
override fun setOrderInfo(show: String) {
actv_orderinfo.text = show
}
override fun setDoorStatus(
doorPosition: StartAutopilotViewModel.DoorPosition,
isOpen: Boolean
) {
when (doorPosition) {
StartAutopilotViewModel.DoorPosition.FRONT_LEFT -> {
if(isOpen){
actv_front_left_door.visibility = VISIBLE
}else{
actv_front_left_door.visibility = GONE
}
}
StartAutopilotViewModel.DoorPosition.FRONT_RIGHT -> {
if(isOpen){
actv_front_right_door.visibility = VISIBLE
}else{
actv_front_right_door.visibility = GONE
}
}
StartAutopilotViewModel.DoorPosition.REAR_LEFT -> {
if(isOpen){
actv_rear_left_door.visibility = VISIBLE
}else{
actv_rear_left_door.visibility = GONE
}
}
StartAutopilotViewModel.DoorPosition.REAR_RIGHT -> {
if(isOpen){
actv_rear_right_door.visibility = VISIBLE
}else{
actv_rear_right_door.visibility = GONE
}
}
else ->{
}
}
}
fun closeAllAnimsAndView() {
isStarting = false
clearStartingAnimFrame()
clearBgAnimDrawable()
OverlayViewUtils.dismissOverlayView(this)
}
fun updateStartAutopilotBtnStatus(isBoarded: Boolean) {
taxi_p_start_autopilot?.let {
if (isBoarded) {
it.setTextColor(resources.getColor(R.color.taxi_p_start_autopilot_txt_color))
it.background = null
} else {
it.background = ResourcesCompat.getDrawable(resources,R.drawable.taxi_p_start_autopilot_txt_btn_bg,null)
taxi_p_autopilot_btn_bg!!.background = null
it.setTextColor(resources.getColor(R.color.taxi_p_start_autopilot_txt_un_color))
}
it.tag = isBoarded
it.text = resources.getString(R.string.taxi_p_start_autopilot_txt)
}
}
private fun startingCarBgAnimatorDrawable(isStart: Boolean) {
if (isStart) {
taxi_p_autopilot_starting!!.setImageResource(0)
taxiPStartAutopilotCar?.start()
} else {
taxiPStartAutopilotCar?.stop()
taxi_p_autopilot_starting!!.setImageResource(R.drawable.light_00003)
}
}
private fun startOrStopLoadingAnim(start: Boolean) {
startingCarBgAnimatorDrawable(start)
if (start) {
isStarting = true
taxi_p_start_autopilot?.text = resources.getString(R.string.taxi_p_start_autopilot_loading)
taxi_p_start_autopilot?.setTextColor(resources.getColor(R.color.taxi_p_start_autopilot_txt_color))
startingAutopilotCountDown()
} else {
clearBgAnimDrawable()
isStarting = false
handleStartAutopilotBtnStatus(true)
}
}
private fun clearBgAnimDrawable() {
taxiPStartAutopilot?.stop()
}
fun clearStartingAnimFrame() {
taxiPStartAutopilotCar?.stop()
}
private fun startingAutopilotCountDown() {
UiThreadHandler.postDelayed({
//未启动成功20s后做处理
if (isStarting) { //判断动画是否在进行
ToastUtils.showLong(R.string.taxi_p_start_autopilot_fail_10s_tip)
updateStatusCountDownOver()
}
}, TIMER_START_AUTOPILOT_INTERVAL)
}
private fun updateStatusCountDownOver() {
isStarting = false
startingCarBgAnimatorDrawable(false)
taxi_p_start_autopilot?.text = resources.getString(R.string.taxi_p_start_autopilot_txt)
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
val viewModel = ViewModelProvider(this).get(StartAutopilotViewModel::class.java)
viewModel.setStartAutopilotCallback(this)
taxi_p_start_autopilot.onClick {
//开启动画和自动驾驶
if (!(taxi_p_start_autopilot!!.tag as Boolean)) {
ToastUtils.showLong(R.string.taxi_p_start_autopilot_un_click_tip)
return@onClick
}
if (!isStarting) {
startOrStopLoadingAnim(true)
viewModel.startAutopilot()
}
}
starting_autopilot_view_close.onClick {
closeAllAnimsAndView()
}
v_xiaozhi_belt_info_bg.onClick {
handleStartAutopilotBtnStatus(true)
}
}
override fun onDetachedFromWindow() {
isStarting = false
clearStartingAnimFrame()
clearBgAnimDrawable()
super.onDetachedFromWindow()
}
}

View File

@@ -0,0 +1,137 @@
package com.mogo.och.taxi.passenger.ui.startautopilot
import androidx.lifecycle.ViewModel
import chassis.Chassis
import chassis.Chassis.DoorNumber
import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisDoorStateListener
import com.mogo.eagle.core.function.call.autopilot.CallerChassisDoorStateListenerManager
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerOrderStatusCallback
import com.mogo.och.taxi.passenger.model.AutopilotManager
import com.mogo.och.taxi.passenger.model.TaxiPassengerModel
class StartAutopilotViewModel : ViewModel(), IOCHTaxiPassengerOrderStatusCallback,
IMoGoChassisDoorStateListener {
private val TAG = StartAutopilotViewModel::class.java.simpleName
private var viewCallback: StartAutopilotCallback? = null
init {
TaxiPassengerModel.setOrderStatusCallback(TAG, this)
CallerChassisDoorStateListenerManager.addListener(TAG, this)
}
fun setStartAutopilotCallback(viewCallback: StartAutopilotCallback) {
this.viewCallback = viewCallback
TaxiPassengerModel.startOrStopReadyToAutopilotLoop(true)
setOrderInfo()
setDoorInfo()
}
private fun setDoorInfo() {
val doorList = CallerChassisDoorStateListenerManager.getDoorList()
CallerLogger.d(SceneConstant.M_TAXI_P + TAG, "门太变化初始化:${doorList}")
doorList?.forEach {
when (it.number) {
DoorNumber.FRONT_LEFT -> {
viewCallback?.setDoorStatus(DoorPosition.FRONT_LEFT,it.status==1)
}
DoorNumber.FRONT_RIGHT -> {
viewCallback?.setDoorStatus(DoorPosition.FRONT_RIGHT,it.status==1)
}
DoorNumber.REAR_LEFT -> {
viewCallback?.setDoorStatus(DoorPosition.REAR_LEFT,it.status==1)
}
DoorNumber.REAR_RIGHT -> {
viewCallback?.setDoorStatus(DoorPosition.REAR_RIGHT,it.status==1)
}
DoorNumber.MIDDLE -> {
viewCallback?.setDoorStatus(DoorPosition.MIDDLE,it.status==1)
}
else -> {}
}
}
}
private fun setOrderInfo() {
val currentOCHOrder = TaxiPassengerModel.currentOCHOrder
currentOCHOrder?.let {
val phone = it.passengerPhone
var show = ""
if (phone.length > 8) {
//截取电话号码前三位
val phoneNumPre = phone.substring(0, 3);
//截取电话号码后四位
val phoneNumFix = phone.substring(7);
show = "用户:$phoneNumPre****$phoneNumFix 目的地:${it.endSiteAddr}"
} else {
show = "用户:${phone} 目的地:${it.endSiteAddr}"
}
viewCallback?.setOrderInfo(show)
}
}
override fun onCleared() {
super.onCleared()
this.viewCallback = null
TaxiPassengerModel.setOrderStatusCallback(TAG, null)
CallerChassisDoorStateListenerManager.removeListener(TAG)
}
override fun onDriverHasCheckedPilotCondition(isBoarded: Boolean) {
viewCallback?.handleStartAutopilotBtnStatus(isBoarded)
}
/**
* 开启自动驾驶
*/
fun startAutopilot() {
AutopilotManager.startAutopilot()
}
override fun onAutopilotSingleDoorState(num: Chassis.DoorNumber, open: Boolean) {
super.onAutopilotSingleDoorState(num, open)
CallerLogger.d(SceneConstant.M_TAXI_P + TAG, "门太变化:${num}--${open}")
when (num) {
DoorNumber.FRONT_LEFT -> {
viewCallback?.setDoorStatus(DoorPosition.FRONT_LEFT,open)
}
DoorNumber.FRONT_RIGHT -> {
viewCallback?.setDoorStatus(DoorPosition.FRONT_RIGHT,open)
}
DoorNumber.REAR_LEFT -> {
viewCallback?.setDoorStatus(DoorPosition.REAR_LEFT,open)
}
DoorNumber.REAR_RIGHT -> {
viewCallback?.setDoorStatus(DoorPosition.REAR_RIGHT,open)
}
DoorNumber.MIDDLE -> {
viewCallback?.setDoorStatus(DoorPosition.MIDDLE,open)
}
else -> {}
}
}
interface StartAutopilotCallback {
fun handleStartAutopilotBtnStatus(isBoarded: Boolean)
fun setOrderInfo(show: String)
fun setDoorStatus(doorPosition: DoorPosition,isOpen:Boolean)
}
enum class DoorPosition {
FRONT_LEFT, FRONT_RIGHT, REAR_LEFT, REAR_RIGHT, MIDDLE
}
}

View File

@@ -0,0 +1,106 @@
package com.mogo.och.taxi.passenger.ui.statusview
import android.content.Context
import android.os.SystemClock
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.fragment.app.FragmentActivity
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager
import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager
import com.mogo.eagle.core.function.call.setting.CallerSkinModeListenerManager
import com.mogo.eagle.core.function.hmi.ui.setting.ToggleDebugView
import com.mogo.eagle.core.utilcode.kotlin.onClick
import com.mogo.eagle.core.utilcode.util.ActivityUtils
import com.mogo.och.common.module.manager.debug.DebugViewWatchDogFragment
import com.mogo.och.taxi.passenger.R
import com.mogo.och.taxi.passenger.ui.debug.DebugEvent
import kotlinx.android.synthetic.main.taxi_p_statusview.view.iv_biz_icon
import kotlinx.android.synthetic.main.taxi_p_statusview.view.vShowDebugView
import me.jessyan.autosize.utils.AutoSizeUtils
import org.greenrobot.eventbus.EventBus
import java.lang.ref.WeakReference
class StatusBarView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr), IMoGoAutopilotStatusListener {
companion object {
const val TAG = "StatusBarView"
private const val COUNTS = 4 // 点击次数
private const val DURATION: Long = 1000 // 规定有效时间
const val bizz = "bizz" // 业务debug
const val debugView = "debugView" // 业务debug
}
private var debugViewWatchDogFragment: WeakReference<DebugViewWatchDogFragment>? = null
private var mHits = LongArray(COUNTS)
private fun continuousClick(type:String) {
if (ToggleDebugView.toggleDebugView.isShowIng()) {
ToggleDebugView.toggleDebugView.dismiss()
return
}
//每次点击时,数组向前移动一位
System.arraycopy(mHits, 1, mHits, 0, mHits.size - 1)
//为数组最后一位赋值
mHits[mHits.size - 1] = SystemClock.uptimeMillis()
if (mHits[0] >= (SystemClock.uptimeMillis() - DURATION)) {
mHits = LongArray(COUNTS) //重新初始化数组
showDebugView()
}
}
init {
LayoutInflater.from(context).inflate(R.layout.taxi_p_statusview, this, true)
setBackgroundResource(R.drawable.taxi_p_status_bg)
isClickable = true
isFocusable = true
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
post {
val params: ViewGroup.LayoutParams = layoutParams
params.height = AutoSizeUtils.dp2px(context,120f)
layoutParams = params
}
CallerAutoPilotStatusListenerManager.addListener(TAG, this)
iv_biz_icon.setOnClickListener { continuousClick(debugView) }
vShowDebugView.setOnLongClickListener {
EventBus.getDefault().post(DebugEvent())
false
}
}
private fun showDebugView() {
if (debugViewWatchDogFragment?.get() == null) {
debugViewWatchDogFragment = WeakReference(DebugViewWatchDogFragment.newInstance())
}
val debugViewFragment = debugViewWatchDogFragment?.get()
if (ActivityUtils.getTopActivity() is FragmentActivity) {
val fragmentActivity = ActivityUtils.getTopActivity() as FragmentActivity
DebugViewWatchDogFragment.showDebugView(fragmentActivity.supportFragmentManager,fragmentActivity.supportFragmentManager,debugViewFragment)
}
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
CallerHmiViewControlListenerManager.removeListener(TAG)
CallerSkinModeListenerManager.removeListener(TAG)
CallerDevaToolsManager.hideStatusBar()
}
}

View File

@@ -0,0 +1,66 @@
package com.mogo.och.taxi.passenger.ui.statusview
import android.annotation.SuppressLint
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import android.widget.RelativeLayout
import com.mogo.eagle.core.function.api.devatools.mofang.IMoGoMoFangProvider
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager
import com.mogo.och.taxi.passenger.R
import kotlinx.android.synthetic.main.taxi_p_blue_tooth.view.mofangView
/**
* 魔戒蓝牙控件
* 放置于StatusBar右侧位置
* todo arrow
*/
class TaxiPBlueToothView : RelativeLayout, IMoGoMoFangProvider.OnMoFangStatusListener {
companion object{
const val TAG = "TaxiPBlueToothView"
}
constructor(context: Context) : this(context, null)
constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0)
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : this(context, attrs, defStyleAttr, 0)
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes)
init {
LayoutInflater.from(context).inflate(R.layout.taxi_p_blue_tooth, this, true)
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
CallerDevaToolsManager.mofang()?.registerMoFangStatusListener(TAG, this)
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
CallerDevaToolsManager.mofang()?.unRegisterMoFangStatusListener(this)
}
override fun onMoFangConnected() {
mofangView.setImageResource(R.drawable.taxi_p_blue_tooth_close)
}
override fun onMoFangDisconnected() {
mofangView.setImageResource(R.drawable.taxi_p_blue_tooth_open)
}
@SuppressLint("SetTextI18n")
override fun onMoFangBatteryChanged(battery: Int) {
}
override fun onMoFangClicked(keyCode: Int) {}
override fun onMoFangLongClicked(keyCode: Int) {}
override fun onMoFangCombineClicked(vararg keyCodes: Int) {}
override fun onMoFangStatusError(msg: String) {}
}

View File

@@ -0,0 +1,218 @@
package com.mogo.och.taxi.passenger.ui.video
import android.content.Context
import android.graphics.Color
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import android.widget.FrameLayout
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.recyclerview.widget.RecyclerView
import com.mogo.och.taxi.passenger.R
import com.mogo.och.taxi.passenger.bean.TaxiPassengerVideoPlay
import com.mogo.och.taxi.passenger.ui.video.layoutmanage.CarouselLayoutManager
import com.mogo.och.taxi.passenger.ui.video.layoutmanage.CarouselZoomPostLayoutListener
import com.mogo.och.taxi.passenger.ui.video.layoutmanage.CenterScrollListener
import com.mogo.och.taxi.passenger.widget.ConsultVideoPlayer
import com.mogo.och.taxi.passenger.widget.indicator.IndicatorView
import com.mogo.och.taxi.passenger.widget.indicator.enums.IndicatorOrientation
import com.mogo.och.taxi.passenger.widget.indicator.enums.IndicatorSlideMode
import com.mogo.och.taxi.passenger.widget.indicator.enums.IndicatorStyle
import com.shuyu.gsyvideoplayer.video.base.GSYVideoView
import kotlin.math.floor
/**
* @author ChenFufeng
* 蘑菇资讯视频
*/
internal class InfoVideoView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : FrameLayout(
context,
attrs,
defStyleAttr
) {
companion object{
private const val TAG = "VideoView"
}
init {
LayoutInflater.from(context).inflate(R.layout.taxi_p_mogo_video_layout, this, true)
initView()
}
private var rvVideoPlaylist: RecyclerView? = null
private lateinit var indicatorView: IndicatorView
private lateinit var clContain: ConstraintLayout
private val arrayListOf by lazy {
arrayListOf<TaxiPassengerVideoPlay>().apply {
add(TaxiPassengerVideoPlay(
"https://img.zhidaohulian.com/fileServer/online_car_hailing/1655708596763/全车型混剪增加红旗车队.m4v",
"https://img.zhidaohulian.com/fileServer/online_car_hailing/1655969511280/车队.png",
"蘑菇车联覆盖生活的方方面面"
))
add(TaxiPassengerVideoPlay(
"https://img.zhidaohulian.com/fileServer/online_car_hailing/1655708554279/红旗车队.m4v",
"https://img.zhidaohulian.com/fileServer/online_car_hailing/1655969553174/红旗重新排版.png",
"蘑菇车联之红旗车队"
))
add(
com.mogo.och.taxi.passenger.bean.TaxiPassengerVideoPlay(
"https://img.zhidaohulian.com/fileServer/online_car_hailing/1655708499497/大运会合作解说版.m4v",
"https://img.zhidaohulian.com/fileServer/online_car_hailing/1655969536177/大运会.png",
"蘑菇车联牵手成都大运会"
)
)
add(
TaxiPassengerVideoPlay(
"https://img.zhidaohulian.com/fileServer/online_car_hailing/1655708409810/20210610重新排版3屏.m4v",
"https://img.zhidaohulian.com/fileServer/online_car_hailing/1655969579713/三屏.png",
"多视角体验蘑菇车联自动驾驶"
)
)
}
}
fun exitFullScreenMode(resetVideoPlayer: Boolean) {
val carouselLayoutManager = rvVideoPlaylist?.layoutManager as CarouselLayoutManager
val (centerItemPosition: Int, player) = getPlayer(carouselLayoutManager)
player?.let {
it.exitFullScreenMode()
it.onVideoPause()
if(resetVideoPlayer) {
it.onVideoReset()
}
}
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
configPage()
}
override fun onVisibilityChanged(changedView: View, visibility: Int) {
super.onVisibilityChanged(changedView, visibility)
val carouselLayoutManager = rvVideoPlaylist?.layoutManager as CarouselLayoutManager
val (centerItemPosition: Int, player) = getPlayer(carouselLayoutManager)
when (visibility) {
View.VISIBLE -> {
player?.let {
if (!player.isIfCurrentIsFullscreen) {
when (player.currentState) {
GSYVideoView.CURRENT_STATE_PAUSE -> {
player.onVideoResume(false)
}
else -> {}
}
}
}
}
else -> {
player?.let {
if (!player.isIfCurrentIsFullscreen) {
player.onVideoPause()
}
}
}
}
}
private fun initView() {
rvVideoPlaylist = findViewById(R.id.infoVideoPlaylist)
indicatorView = findViewById(R.id.infoIndicatorView)
clContain = findViewById(R.id.infoContainer)
}
private fun configPage() {
// FullVideoUtils.dismissOverlayView(true)
initData()
}
private fun initData() {
val carouselLayoutManager = CarouselLayoutManager(CarouselLayoutManager.HORIZONTAL, true)
carouselLayoutManager.setPostLayoutListener(CarouselZoomPostLayoutListener())
carouselLayoutManager.maxVisibleItems = 1
indicatorView.notifyDataChanged(arrayListOf.size)
indicatorView.setSlideMode(IndicatorSlideMode.SCALE)
indicatorView.setOrientation(IndicatorOrientation.INDICATOR_HORIZONTAL)
indicatorView.setIndicatorStyle(IndicatorStyle.ROUND_RECT)
indicatorView.setSliderColor(
Color.parseColor("#80000000"), Color.parseColor("#3FACFD"),
Color.parseColor("#3FACFD")
)
indicatorView.setSliderWidth(9f, 54f)
indicatorView.setSliderHeight(9f)
indicatorView.setSliderGap(36f)
rvVideoPlaylist?.addOnScrollListener(object : CenterScrollListener() {
var prePlayerPosition = 0
override fun pageSelect(recyclerView: RecyclerView?, newState: Int) {
//播放视频
val (centerItemPosition: Int, player) = getPlayer(carouselLayoutManager)
indicatorView.onPageSelected(centerItemPosition)
if (player is ConsultVideoPlayer) {
if (prePlayerPosition != centerItemPosition) {
if (player.currentState == GSYVideoView.CURRENT_STATE_PAUSE) {
player.onVideoReset()
}
val playerHolder =
carouselLayoutManager.findViewByPosition(prePlayerPosition)
val prePlayer =
playerHolder?.findViewById<ConsultVideoPlayer>(R.id.video_item_player)
prePlayer?.onVideoReset()
val taxiPassengerVideoPlay = arrayListOf[centerItemPosition]
} else {
player.onVideoResume(false)
}
}
prePlayerPosition = centerItemPosition
}
override fun pageStop() {
val (_: Int, player) = getPlayer(carouselLayoutManager)
if (player is ConsultVideoPlayer) {
player.onVideoPause()
}
}
})
carouselLayoutManager.addOnDargAutoDiffListener { adapterPosition, currentPosition ->
val fl = adapterPosition - floor(adapterPosition)
var currentIndex = currentPosition
if (fl > 0.5) {
if (currentPosition == 0) {
currentIndex = rvVideoPlaylist?.adapter!!.itemCount - 1
} else {
currentIndex -= 1
}
}
indicatorView.onPageScrolled(currentIndex, fl, 0)
}
val recyclerVideoAdapter = RecyclerVideoAdapter(context, arrayListOf, rvVideoPlaylist)
recyclerVideoAdapter.setOnThumbImageClilckListener {
val (_: Int, player) = getPlayer(carouselLayoutManager)
if (player is ConsultVideoPlayer) {
player.onVideoReset()
player.thumbImageViewLayout.visibility = View.VISIBLE
}
rvVideoPlaylist?.smoothScrollToPosition(it)
}
rvVideoPlaylist?.layoutManager = carouselLayoutManager
rvVideoPlaylist?.setHasFixedSize(true)
rvVideoPlaylist?.adapter = recyclerVideoAdapter
}
private fun getPlayer(carouselLayoutManager: CarouselLayoutManager): Pair<Int, ConsultVideoPlayer?> {
val centerItemPosition: Int = carouselLayoutManager.centerItemPosition
val playerHolder = carouselLayoutManager.findViewByPosition(centerItemPosition)
val player = playerHolder?.findViewById<ConsultVideoPlayer>(R.id.video_item_player)
return Pair(centerItemPosition, player)
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
}
}

Some files were not shown because too many files have changed in this diff Show More