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:
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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, "结束路距计算")
|
||||
}
|
||||
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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!!)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -860,4 +860,8 @@ class DriverM1Model {
|
||||
|
||||
return mCurrentRoute
|
||||
}
|
||||
|
||||
fun getBusOrderResult(): QueryCurrentOrderResponse.Result?{
|
||||
return mCurrentOrder
|
||||
}
|
||||
}
|
||||
@@ -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) {
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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("请输入正确密码")
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -6,7 +6,8 @@ interface IDistanceListener {
|
||||
/**
|
||||
* @param distance 距离终点坐标的距离
|
||||
*/
|
||||
fun distanceCallback(distance: Float)
|
||||
fun distanceCallback(distance: Float){}
|
||||
fun stationDistanceCallback(stationDistance:Float){}
|
||||
}
|
||||
|
||||
interface ITrajectoryListener{
|
||||
|
||||
@@ -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>,
|
||||
|
||||
@@ -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")
|
||||
@@ -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)
|
||||
@@ -193,57 +193,57 @@ class CommonAmapNaviVIew @JvmOverloads constructor(
|
||||
amapNaviView.onDestroy()
|
||||
}
|
||||
|
||||
var array = arrayOf(
|
||||
"直行车道",
|
||||
"左转车道",
|
||||
"左转或直行车道",
|
||||
"右转车道",
|
||||
"右转或直行车道",
|
||||
"左掉头车道",
|
||||
"左转或者右转车道",
|
||||
" 左转或右转或直行车道",
|
||||
"右转掉头车道",
|
||||
"直行或左转掉头车道",
|
||||
"直行或右转掉头车道",
|
||||
"左转或左掉头车道",
|
||||
"右转或右掉头车道",
|
||||
"直行并且车道扩展",
|
||||
"左转+左掉头+扩展",
|
||||
"不可以选择该车道",
|
||||
"直行+左转+左掉头车道",
|
||||
"右转+左掉头",
|
||||
"左转+右转+左掉头",
|
||||
"直行+右转+左掉头",
|
||||
"左转+右掉头",
|
||||
"公交车道",
|
||||
"空车道",
|
||||
"可变车道"
|
||||
)
|
||||
// var array = arrayOf(
|
||||
// "直行车道",
|
||||
// "左转车道",
|
||||
// "左转或直行车道",
|
||||
// "右转车道",
|
||||
// "右转或直行车道",
|
||||
// "左掉头车道",
|
||||
// "左转或者右转车道",
|
||||
// " 左转或右转或直行车道",
|
||||
// "右转掉头车道",
|
||||
// "直行或左转掉头车道",
|
||||
// "直行或右转掉头车道",
|
||||
// "左转或左掉头车道",
|
||||
// "右转或右掉头车道",
|
||||
// "直行并且车道扩展",
|
||||
// "左转+左掉头+扩展",
|
||||
// "不可以选择该车道",
|
||||
// "直行+左转+左掉头车道",
|
||||
// "右转+左掉头",
|
||||
// "左转+右转+左掉头",
|
||||
// "直行+右转+左掉头",
|
||||
// "左转+右掉头",
|
||||
// "公交车道",
|
||||
// "空车道",
|
||||
// "可变车道"
|
||||
// )
|
||||
|
||||
var actions = arrayOf(
|
||||
"直行",
|
||||
"左转",
|
||||
"左转或直行",
|
||||
"右转",
|
||||
"右转或这行",
|
||||
"左掉头",
|
||||
"左转或者右转",
|
||||
" 左转或右转或直行",
|
||||
"右转掉头",
|
||||
"直行或左转掉头",
|
||||
"直行或右转掉头",
|
||||
"左转或左掉头",
|
||||
"右转或右掉头",
|
||||
"直行并且车道扩展",
|
||||
"左转+左掉头+扩展",
|
||||
"不可以选择",
|
||||
"直行+左转+左掉头",
|
||||
"右转+左掉头",
|
||||
"左转+右转+左掉头",
|
||||
"直行+右转+左掉头",
|
||||
"左转+右掉头",
|
||||
"公交车道",
|
||||
"空车道",
|
||||
"可变车道"
|
||||
)
|
||||
// var actions = arrayOf(
|
||||
// "直行",
|
||||
// "左转",
|
||||
// "左转或直行",
|
||||
// "右转",
|
||||
// "右转或这行",
|
||||
// "左掉头",
|
||||
// "左转或者右转",
|
||||
// " 左转或右转或直行",
|
||||
// "右转掉头",
|
||||
// "直行或左转掉头",
|
||||
// "直行或右转掉头",
|
||||
// "左转或左掉头",
|
||||
// "右转或右掉头",
|
||||
// "直行并且车道扩展",
|
||||
// "左转+左掉头+扩展",
|
||||
// "不可以选择",
|
||||
// "直行+左转+左掉头",
|
||||
// "右转+左掉头",
|
||||
// "左转+右转+左掉头",
|
||||
// "直行+右转+左掉头",
|
||||
// "左转+右掉头",
|
||||
// "公交车道",
|
||||
// "空车道",
|
||||
// "可变车道"
|
||||
// )
|
||||
}
|
||||
@@ -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")
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
|
Before Width: | Height: | Size: 78 KiB After Width: | Height: | Size: 78 KiB |
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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
|
||||
@@ -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>
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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>
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
@@ -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.
BIN
OCH/mogo-och-taxi-passenger/src/main/assets/style.data
Executable file
BIN
OCH/mogo-och-taxi-passenger/src/main/assets/style.data
Executable file
Binary file not shown.
BIN
OCH/mogo-och-taxi-passenger/src/main/assets/style_extra.data
Executable file
BIN
OCH/mogo-och-taxi-passenger/src/main/assets/style_extra.data
Executable file
Binary file not shown.
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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(){}
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
package com.mogo.och.taxi.passenger.callback;
|
||||
|
||||
public interface ITPClickStartAutopilotCallback {
|
||||
void onClickCallback();
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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:开始服务开启自动驾驶(成功/失败)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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) {}
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -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) {
|
||||
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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)
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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;}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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>
|
||||
}
|
||||
@@ -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"))
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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) {
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
@@ -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) {}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package com.mogo.och.taxi.passenger.ui.debug
|
||||
|
||||
class DebugEvent {
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
@@ -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 -> {}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
)
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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) {}
|
||||
|
||||
}
|
||||
@@ -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
Reference in New Issue
Block a user