diff --git a/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/model/CharterPassengerModel.kt b/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/model/CharterPassengerModel.kt index 7ddcc1213b..e0ec2e5d70 100644 --- a/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/model/CharterPassengerModel.kt +++ b/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/model/CharterPassengerModel.kt @@ -27,6 +27,7 @@ import com.mogo.eagle.core.utilcode.util.CoordinateUtils import com.mogo.eagle.core.utilcode.util.CountDownTimer import com.mogo.eagle.core.utilcode.util.NetworkUtils import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.mogo.och.bus.passenger.bean.LoopInfo import com.mogo.och.bus.passenger.bean.response.* import com.mogo.och.bus.passenger.callback.IBusPassengerADASStatusCallback @@ -87,7 +88,9 @@ object CharterPassengerModel { private var orderStatus: OrderStatusEnum = OrderStatusEnum.NoOrderUnuse - private var orderStatusChangeListener: IOrderStatusChangeListener? = null + private val orderStatusChangeListeners = + ConcurrentHashMap() + private var iDistanceTimeCallback: IDistanceTimeCallback? = null @@ -250,8 +253,13 @@ object CharterPassengerModel { mRoutePoints.addAll(latLngModels) } - fun setStatusChangeListener(orderStatusChangeListener: IOrderStatusChangeListener?) { - this.orderStatusChangeListener = orderStatusChangeListener + fun setStatusChangeListener(tag:String,orderStatusChangeListener: IOrderStatusChangeListener?) { + if (tag.isBlank()) return + if (orderStatusChangeListener == null) { + orderStatusChangeListeners.remove(tag) + return + } + orderStatusChangeListeners[tag] = orderStatusChangeListener } fun setCarTypeChangeListener(carTypeChageListener: ICarTypeCallback?){ this.carTypeChageListener = carTypeChageListener @@ -597,10 +605,18 @@ object CharterPassengerModel { private fun setOrderStatus(orderStatus: OrderStatusEnum) { if (this.orderStatus != orderStatus) { this.orderStatus = orderStatus - orderStatusChangeListener?.onStatusChange(this.orderStatus) + for (callback in orderStatusChangeListeners.values) { + callback.onStatusChange(this.orderStatus) + } } } + fun setEndOrderStatus(){ + UiThreadHandler.postDelayed({ + setOrderStatus(OrderStatusEnum.NoOrderUse) + },1000) + } + /** * 计算需要禁用的站点 */ diff --git a/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/presenter/BusPassengerCarUseAndNoOrderPresenter.kt b/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/presenter/BusPassengerCarUseAndNoOrderPresenter.kt new file mode 100644 index 0000000000..10008beff6 --- /dev/null +++ b/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/presenter/BusPassengerCarUseAndNoOrderPresenter.kt @@ -0,0 +1,100 @@ +package com.mogo.och.bus.passenger.presenter + +import androidx.lifecycle.LifecycleOwner +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager +import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.mogo.och.bus.passenger.model.CharterPassengerModel +import com.mogo.och.bus.passenger.model.VoiceManager +import com.mogo.och.bus.passenger.ui.M1CarUserNoOrderFragment +import com.mogo.och.bus.passenger.ui.M1ContainFragment +import com.mogo.och.common.module.manager.OCHM1LightAirconditionDoorStatusManager +import com.mogo.och.common.module.manager.OCHPlanningStopSideStatusManager +import com.mogo.och.common.module.voice.VoiceNotice +import io.reactivex.disposables.Disposable + +class BusPassengerCarUseAndNoOrderPresenter(view: M1CarUserNoOrderFragment?) : + BusBasePassengerFunctionDevicePresenter(view), + OCHM1LightAirconditionDoorStatusManager.OCHM1LightAirconditionDoorCallback { + companion object { + private const val TAG = "BusPassengerFunctionPresenter" + } + + private var subscribe: Disposable? = null + private var subscribeDoorStatus: Disposable? = null + private var gnssSpeed = 0.0 + + override fun onCreate(owner: LifecycleOwner) { + super.onCreate(owner) + OCHM1LightAirconditionDoorStatusManager.addListener(TAG, this) + CharterPassengerModel.setControllerStatusCallback(TAG) { location -> + location?.let { + gnssSpeed = it.gnssInfo.vehicleSpeed + } + } + } + + override fun onDestroy(owner: LifecycleOwner) { + super.onDestroy(owner) + OCHM1LightAirconditionDoorStatusManager.removeListener(TAG) + disposeSubscribe(subscribe) + disposeSubscribe(subscribeDoorStatus) + } + + override fun onDoorStatusCallback(isOpen: Boolean, isFirst: Boolean) { + if (!isFirst) { + if (isOpen) { + ToastUtils.showShort("已开启车门") + } else { + ToastUtils.showShort("已关门车门") + } + } + } + + + fun openDoor() { + val canOpenOrCloseDoor = canOpenOrCloseDoor() + if (!canOpenOrCloseDoor.isNullOrEmpty()) { + ToastUtils.showShort(canOpenOrCloseDoor) + return + } + disposeSubscribe(subscribe) + subscribe = createSubscribe(1000) { + CallerAutoPilotControlManager.sendRoboBusJinlvM1FrontDoorCmd(0) + } + CallerAutoPilotControlManager.sendRoboBusJinlvM1FrontDoorCmd(1) + disposeSubscribe(subscribeDoorStatus) + subscribeDoorStatus = createSubscribe { + if (!OCHM1LightAirconditionDoorStatusManager.doorStatus.isOpen) { + ToastUtils.showShort("车门无法开启,请使用车内物理按钮") + } + } + } + + fun closeDoor() { + val canOpenOrCloseDoor = canOpenOrCloseDoor() + if (!canOpenOrCloseDoor.isNullOrBlank()) { + ToastUtils.showShort(canOpenOrCloseDoor) + return + } + disposeSubscribe(subscribe) + subscribe = createSubscribe(1000) { + CallerAutoPilotControlManager.sendRoboBusJinlvM1FrontDoorCmd(0) + } + CallerAutoPilotControlManager.sendRoboBusJinlvM1FrontDoorCmd(2) + disposeSubscribe(subscribeDoorStatus) + subscribeDoorStatus = createSubscribe { + if (OCHM1LightAirconditionDoorStatusManager.doorStatus.isOpen) { + ToastUtils.showShort("车门无法关闭,请使用车内物理按钮") + } + } + } + + private fun canOpenOrCloseDoor(): String? { + if (gnssSpeed < 0.01) { + return null + } else { + return "车辆正在运行、请稍后再试" + } + } + +} \ No newline at end of file diff --git a/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/presenter/BusPassengerFunctionEarlyEndOrderPresenter.kt b/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/presenter/BusPassengerFunctionEarlyEndOrderPresenter.kt index 82a5bbe7e6..9c481095c5 100644 --- a/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/presenter/BusPassengerFunctionEarlyEndOrderPresenter.kt +++ b/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/presenter/BusPassengerFunctionEarlyEndOrderPresenter.kt @@ -3,7 +3,9 @@ package com.mogo.och.bus.passenger.presenter import androidx.lifecycle.LifecycleOwner import com.mogo.eagle.core.data.BaseData import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.mogo.och.bus.passenger.model.CharterPassengerModel +import com.mogo.och.bus.passenger.model.OrderStatusEnum import com.mogo.och.bus.passenger.ui.M1EarlyEndOrderFragment import com.mogo.och.common.module.biz.network.OchCommonServiceCallback @@ -28,6 +30,7 @@ class BusPassengerFunctionEarlyEndOrderPresenter(view: M1EarlyEndOrderFragment?) override fun onSuccess(data: BaseData?) { if (null != data && 0 == data.code) { ToastUtils.showShort("结束成功") + CharterPassengerModel.setEndOrderStatus() mView?.closeDialogContaion() } } diff --git a/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/presenter/BusPassengerFunctionOrderPresenter.kt b/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/presenter/BusPassengerFunctionOrderPresenter.kt index 8b5903cd79..cc9cc0739c 100644 --- a/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/presenter/BusPassengerFunctionOrderPresenter.kt +++ b/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/presenter/BusPassengerFunctionOrderPresenter.kt @@ -9,9 +9,13 @@ import com.mogo.och.bus.passenger.ui.M1OrderFragment class BusPassengerFunctionOrderPresenter(view: M1OrderFragment?) : BusBasePassengerFunctionDevicePresenter(view), IOrderStatusChangeListener { + companion object{ + const val TAG = "BusPassengerFunctionOrderPresenter" + } + override fun onCreate(owner: LifecycleOwner) { super.onCreate(owner) - CharterPassengerModel.setStatusChangeListener(this) + CharterPassengerModel.setStatusChangeListener(TAG,this) } override fun onResume(owner: LifecycleOwner) { @@ -21,7 +25,7 @@ class BusPassengerFunctionOrderPresenter(view: M1OrderFragment?) : override fun onDestroy(owner: LifecycleOwner) { super.onDestroy(owner) - CharterPassengerModel.setStatusChangeListener(null) + CharterPassengerModel.setStatusChangeListener(TAG,null) } override fun onStatusChange(currentStatus: OrderStatusEnum) { mView?.setViewByOrderStatus(currentStatus) diff --git a/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/presenter/BusPassengerPresenter.kt b/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/presenter/BusPassengerPresenter.kt index cca1b5ccd7..7ab9c633f4 100644 --- a/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/presenter/BusPassengerPresenter.kt +++ b/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/presenter/BusPassengerPresenter.kt @@ -17,6 +17,8 @@ import com.mogo.och.bus.passenger.callback.IBusPassengerControllerStatusCallback import com.mogo.och.bus.passenger.callback.ICarTypeCallback import com.mogo.och.bus.passenger.callback.IDistanceTimeCallback import com.mogo.och.bus.passenger.model.CharterPassengerModel +import com.mogo.och.bus.passenger.model.IOrderStatusChangeListener +import com.mogo.och.bus.passenger.model.OrderStatusEnum import com.mogo.och.bus.passenger.ui.MainFragment import com.mogo.och.common.module.bean.dpmsg.ChangeDestMsg import com.mogo.och.common.module.bean.dpmsg.DPMsgType @@ -28,7 +30,8 @@ import java.util.* class BusPassengerPresenter(view: MainFragment?) : BusBasePassengerFunctionDevicePresenter(view), - IBusPassengerControllerStatusCallback, IDistanceTimeCallback, ICarTypeCallback { + IBusPassengerControllerStatusCallback, IDistanceTimeCallback, ICarTypeCallback, + IOrderStatusChangeListener { private var subscribe: Disposable? = null private var gnssSpeed = 0.0f @@ -39,6 +42,7 @@ class BusPassengerPresenter(view: MainFragment?) : CharterPassengerModel.setControllerStatusCallback(TAG,this) CharterPassengerModel.setiDistanceTimeCallback(this) CharterPassengerModel.setCarTypeChangeListener(this) + CharterPassengerModel.setStatusChangeListener(TAG,this) CallerTelematicListenerManager.addListener(TAG, msgReceived) setCarChangeListener(R.raw.aiqinghao) //BusPassengerModel.setMoGoAutopilotPlanningListener(this) @@ -174,4 +178,18 @@ class BusPassengerPresenter(view: MainFragment?) : fun haveOrder():Boolean { return CharterPassengerModel.hasOrder() } + + override fun onStatusChange(currentStatus: OrderStatusEnum) { + when (currentStatus) { + OrderStatusEnum.Nothing -> {} + OrderStatusEnum.NoOrderUnuse -> { + mView?.closeOpenAndCloseDoor() + } + OrderStatusEnum.OrderNoLine -> {} + OrderStatusEnum.OrdersWithLine -> {} + OrderStatusEnum.NoOrderUse -> { + mView?.showOpenAndCloseDoor() + } + } + } } \ No newline at end of file diff --git a/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/ui/M1CarUserNoOrderFragment.kt b/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/ui/M1CarUserNoOrderFragment.kt new file mode 100644 index 0000000000..1cffc70857 --- /dev/null +++ b/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/ui/M1CarUserNoOrderFragment.kt @@ -0,0 +1,124 @@ +package com.mogo.och.bus.passenger.ui + +import android.os.Bundle +import android.util.Log +import android.view.View +import android.view.WindowManager +import android.widget.CompoundButton +import androidx.fragment.app.DialogFragment +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentTransaction +import com.mogo.commons.mvp.MvpDialogFragment +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_BUS_P +import com.mogo.eagle.core.utilcode.util.BarUtils +import com.mogo.eagle.core.utilcode.util.SharedPrefs +import com.mogo.och.bus.passenger.R +import com.mogo.och.bus.passenger.presenter.BusPassengerCarUseAndNoOrderPresenter +import com.mogo.och.bus.passenger.presenter.BusPassengerFunctionPresenter +import kotlinx.android.synthetic.m1.m1_contain_fragment.* +import kotlinx.android.synthetic.m1.m1_order_end.* + +/** + * @author: yangyakun + * @date: 2023/1/28 + */ +class M1CarUserNoOrderFragment : + MvpDialogFragment() { + + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setStyle(STYLE_NO_TITLE, R.style.DialogFullScreen) //dialog全屏 + } + + private fun initFragment() { + + } + + override fun getLayoutId(): Int = R.layout.m1_order_end + + override fun getTagName(): String = TAG + + override fun initViews() { + dialog?.setCancelable(false) + iv_end_order_opendoor.onClick { + mPresenter?.openDoor() + } + iv_end_order_closedoor.onClick { + mPresenter?.closeDoor() + } + } + + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + dialog?.window?.let { + BarUtils.hideStatusBarAndSticky(it) + it.addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE) + dialog?.setOnShowListener { _ -> + it.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE) + BarUtils.hideStatusBarAndSticky(it) + } + } + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + } + + override fun createPresenter(): BusPassengerCarUseAndNoOrderPresenter = + BusPassengerCarUseAndNoOrderPresenter(this) + + /** + * 重写父类show()方法 + * 避免出现java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState + */ + override fun show(manager: FragmentManager, tag: String?) { + try { + var cls = this.javaClass.superclass ?: return + while (true) { + if (cls.name == "java.lang.Object") { + break + } + cls = cls.superclass!! + if (cls == DialogFragment::class.java) { + break + } + } + val mDismissed = cls.getDeclaredField("mDismissed") + val mShownByMe = cls.getDeclaredField("mShownByMe") + mDismissed.isAccessible = true + mShownByMe.isAccessible = true + mDismissed.setBoolean(this, false) + mShownByMe.setBoolean(this, true) + if (isAdded) { //解决方法就是添加这行代码,如果已经添加了,就移除掉然后再show,就不会出现Fragment already added的错误了。 + return + } + val ft: FragmentTransaction = manager.beginTransaction() + ft.add(this, tag) + ft.commitAllowingStateLoss() + } catch (e: Exception) { + Log.e("DialogFragment", "show", e.fillInStackTrace()) + } + } + + override fun onViewStateRestored(savedInstanceState: Bundle?) { + CallerLogger.d(M_BUS_P+TAG, "onViewStateRestored") + super.onViewStateRestored(savedInstanceState) + } + + companion object { + const val TAG = "BusPassengerFunctionFragment" + @JvmStatic + fun newInstance(): M1CarUserNoOrderFragment { + val args = Bundle() + val fragment = M1CarUserNoOrderFragment() + fragment.arguments = args + return fragment + } + } + +} \ No newline at end of file diff --git a/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/ui/MainFragment.kt b/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/ui/MainFragment.kt index 9448f96810..c0a21fced5 100644 --- a/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/ui/MainFragment.kt +++ b/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/ui/MainFragment.kt @@ -18,6 +18,7 @@ import com.mogo.eagle.core.utilcode.util.ClickUtils import com.mogo.eagle.core.utilcode.util.ToastUtils import com.mogo.och.bus.passenger.R import com.mogo.och.bus.passenger.model.CharterPassengerModel +import com.mogo.och.bus.passenger.model.VoiceManager import com.mogo.och.bus.passenger.presenter.BusPassengerPresenter import com.mogo.och.common.module.biz.constant.LoginStatusManager import kotlinx.android.synthetic.m1.m1_main_fragment.* @@ -31,6 +32,7 @@ class MainFragment : MvpFragment() { private var bpFunctionGroupDialogFragment: WeakReference? = null + private var m1CarUserNoOrderFragment: WeakReference? = null override fun getLayoutId(): Int { return R.layout.m1_main_fragment @@ -70,7 +72,7 @@ class MainFragment : } ll_car_speed.onClick { if (LoginStatusManager.isLogin()) { - // TODO: 结束订单 + VoiceManager.endOrder() CharterPassengerModel.arriveDest() }else{ ToastUtils.showShort(AbsMogoApplication.getApp().getString(R.string.m1_please_login_driver)) @@ -196,6 +198,50 @@ class MainFragment : super.onDestroyView() } + fun showOpenAndCloseDoor() { + val fragmentByTag: Fragment? = childFragmentManager.findFragmentByTag(M1ContainFragment.TAG) + if (fragmentByTag is DialogFragment) { + if (fragmentByTag.dialog != null && fragmentByTag.dialog!!.isShowing) { + CallerLogger.d(SceneConstant.M_BUS_P + TAG, "正在展示") + return + } + if (fragmentByTag.dialog != null && fragmentByTag.isAdded) { + if (AppStateManager.currentActivity() == null) { // 没有在当前应用内 在启动页面关闭应用 + CallerLogger.d(SceneConstant.M_BUS_P + TAG, "权限验证") + return + } + } + } + + if (m1CarUserNoOrderFragment?.get() == null) { + m1CarUserNoOrderFragment = WeakReference(M1CarUserNoOrderFragment.newInstance()) + } + val bpFunctionGroup = m1CarUserNoOrderFragment?.get() + if (bpFunctionGroup != null) { + if (bpFunctionGroup.dialog != null && bpFunctionGroup.dialog!!.isShowing) { + return + } + if (bpFunctionGroup.isAdded) { //解决方法就是添加这行代码,如果已经添加了,就移除掉然后再show,就不会出现Fragment already added的错误了。 + parentFragmentManager.beginTransaction().remove(bpFunctionGroup) + .commitAllowingStateLoss() + } + if (ClickUtils.isFastClick()) { + bpFunctionGroup.show(parentFragmentManager, TAG) + CallerLogger.d(SceneConstant.M_BUS_P + TAG, "展示开关门") + } else { + CallerLogger.d( + SceneConstant.M_BUS_P + TAG, "dialog 1s内执行一次" + ) + } + } + } + fun closeOpenAndCloseDoor(){ + val bpFunctionGroup = m1CarUserNoOrderFragment?.get() + bpFunctionGroup?.let { + bpFunctionGroup.dismissAllowingStateLoss() + } + } + companion object { private const val TAG = "BusPassengerRouteFragment" } diff --git a/OCH/mogo-och-charter-passenger/src/m1/res/drawable/m1_order_end_closedoor_selecotr.xml b/OCH/mogo-och-charter-passenger/src/m1/res/drawable/m1_order_end_closedoor_selecotr.xml index f6d0185a78..188d7b0179 100644 --- a/OCH/mogo-och-charter-passenger/src/m1/res/drawable/m1_order_end_closedoor_selecotr.xml +++ b/OCH/mogo-och-charter-passenger/src/m1/res/drawable/m1_order_end_closedoor_selecotr.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/OCH/mogo-och-charter-passenger/src/m1/res/drawable/m1_order_end_opendoor_selecotr.xml b/OCH/mogo-och-charter-passenger/src/m1/res/drawable/m1_order_end_opendoor_selecotr.xml index 0b05586036..3b80ea24a5 100644 --- a/OCH/mogo-och-charter-passenger/src/m1/res/drawable/m1_order_end_opendoor_selecotr.xml +++ b/OCH/mogo-och-charter-passenger/src/m1/res/drawable/m1_order_end_opendoor_selecotr.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/OCH/mogo-och-charter-passenger/src/m1/res/layout/m1_order_end.xml b/OCH/mogo-och-charter-passenger/src/m1/res/layout/m1_order_end.xml index f8a822c8c6..0952f2bb2b 100644 --- a/OCH/mogo-och-charter-passenger/src/m1/res/layout/m1_order_end.xml +++ b/OCH/mogo-och-charter-passenger/src/m1/res/layout/m1_order_end.xml @@ -1,85 +1,99 @@ - - - - - - - - - - + android:layout_marginBottom="@dimen/dp_179" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintWidth_percent="0.53698"> + + - + - + + + + + + + + + - \ No newline at end of file + + \ No newline at end of file