diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/fragment/ShuttleFragment.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/fragment/ShuttleFragment.kt index 51359d3693..73c6208323 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/fragment/ShuttleFragment.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/fragment/ShuttleFragment.kt @@ -37,6 +37,7 @@ import com.mogo.och.weaknet.constant.BusConst import com.mogo.och.weaknet.presenter.BusPresenter import com.mogo.och.weaknet.ui.BusStationCommonItem import com.mogo.och.weaknet.ui.BusSwitchLineActivity +import com.mogo.och.weaknet.ui.taskrunning.RunningTaskManager import me.jessyan.autosize.utils.AutoSizeUtils import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode @@ -105,31 +106,40 @@ class ShuttleFragment : BaseShuttleTabFragment( @Subscribe(threadMode = ThreadMode.MAIN) fun changeOverview(eventLogout: EventLogout) { - if (eventLogout.messgae == EventLogout.LOGOUT_TYPE) { - d(SceneConstant.M_BUS + TAG, "changeOverview Event消息去登出") - mPresenter!!.logout() - } else if (eventLogout.messgae == EventLogout.SHOW_QR_TYPE) { //显示二维码 - d( - SceneConstant.M_BUS + TAG, "changeOverview Event qrcode,sn = " - + SharedPrefsMgr.getInstance().sn - ) - val qrUrl = String.format( - FunctionBuildConfig.urlJson.bindDriverQRUrl, - SharedPrefsMgr.getInstance().sn - ) - val bmQr = createQRCodeWithPicture( - BitmapFactory.decodeResource(resources, R.drawable.icon_qr_center_logo), - qrUrl, AutoSizeUtils.dp2px(context, 340f), - AutoSizeUtils.dp2px(context, 340f), true - ) - if (bmQr != null) { - val builder = BindQRCodeDialog.Builder() - builder.title(getString(R.string.bind_driver_qr_title)) - .cancelStr(getString(R.string.qr_cancel)) - .qrBm(bmQr).build(AbsMogoApplication.getApp())!!.show() - } else { - d(SceneConstant.M_BUS + TAG, "bmQr = null ") + when (eventLogout.messgae) { + EventLogout.LOGOUT_TYPE-> { + d(SceneConstant.M_BUS + TAG, "changeOverview Event消息去登出") + mPresenter!!.logout() } + EventLogout.SHOW_QR_TYPE-> { //显示二维码 + d( + SceneConstant.M_BUS + TAG, "changeOverview Event qrcode,sn = " + + SharedPrefsMgr.getInstance().sn + ) + val qrUrl = String.format( + FunctionBuildConfig.urlJson.bindDriverQRUrl, + SharedPrefsMgr.getInstance().sn + ) + val bmQr = createQRCodeWithPicture( + BitmapFactory.decodeResource(resources, R.drawable.icon_qr_center_logo), + qrUrl, AutoSizeUtils.dp2px(context, 340f), + AutoSizeUtils.dp2px(context, 340f), true + ) + if (bmQr != null) { + val builder = BindQRCodeDialog.Builder() + builder.title(getString(R.string.bind_driver_qr_title)) + .cancelStr(getString(R.string.qr_cancel)) + .qrBm(bmQr).build(AbsMogoApplication.getApp())!!.show() + } else { + d(SceneConstant.M_BUS + TAG, "bmQr = null ") + } + } + EventLogout.SHOW_WAIT_UPLOAD_TASK-> { + context?.let { + RunningTaskManager.showBadCaseConfigWindow(it) + } + } + else -> {} } } diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/taskrunning/RunningTaskManager.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/taskrunning/RunningTaskManager.kt new file mode 100644 index 0000000000..ce6f5b9ff3 --- /dev/null +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/taskrunning/RunningTaskManager.kt @@ -0,0 +1,145 @@ +package com.mogo.och.weaknet.ui.taskrunning + + +import android.content.Context +import android.graphics.Color +import android.graphics.Rect +import android.graphics.drawable.ColorDrawable +import android.os.Build.VERSION +import android.os.Build.VERSION_CODES +import android.transition.Slide +import android.view.Gravity +import android.view.MotionEvent +import android.view.View +import android.view.ViewConfiguration +import android.view.WindowManager +import android.view.animation.AccelerateDecelerateInterpolator +import android.widget.PopupWindow +import android.widget.PopupWindow.INPUT_METHOD_NEEDED +import androidx.fragment.app.FragmentActivity +import androidx.lifecycle.Lifecycle.Event +import androidx.lifecycle.LifecycleEventObserver +import androidx.lifecycle.LifecycleOwner +import androidx.lifecycle.lifecycleScope +import com.mogo.eagle.core.utilcode.kotlin.lifeCycleOwner +import com.mogo.eagle.core.utilcode.reminder.Reminder +import com.mogo.eagle.core.utilcode.reminder.api.impl.PopupWindowReminder +import com.mogo.eagle.core.utilcode.util.* +import me.jessyan.autosize.utils.AutoSizeUtils +import kotlin.math.abs + +object RunningTaskManager : LifecycleEventObserver{ + + const val TAG = "BadCase" + + private var hideFloat: (() -> Unit)? = null + + fun init(context: Context) { + } + + /** + * 展示BadCase配置页面 + */ + fun showBadCaseConfigWindow(context: Context) { + val badCaseConfigView = RunningTaskManagerView(context) + badCaseConfigView.setOnClickListener(object : RunningTaskManagerView.ClickListener { + override fun onClose() { + hideFloat?.invoke() + hideFloat = null + } + }) + enqueuePop( + badCaseConfigView, + AutoSizeUtils.dp2px(context, 960f), + WindowManager.LayoutParams.MATCH_PARENT, + key = "BadCaseConfigView" + ).also { + hideFloat = it + } + } + + override fun onStateChanged(source: LifecycleOwner, event: Event) { + + } + + + fun enqueuePop(content: View, width: Int, height: Int, key: String = "", startX: Int = 0, startY: Int = 0, gravity: Int = Gravity.START, onOuterViewClicked:((focus: View) -> Unit)? = null, isOverride: Boolean = false, isFocusable: Boolean = true): () -> Unit { + val topActivity = ActivityUtils.getTopActivity() + val activity = (topActivity as? FragmentActivity) ?: throw IllegalStateException("please use Activity to trigger pop show.") + val isImmersiveMode = BarUtils.isImmersiveMode(activity) + var tempReminder: PopupWindowReminder? = null + activity.lifecycleScope.launchWhenResumed { + val pop = PopupWindow(width, height).also { + it.isOutsideTouchable = true + it.isTouchable = true + it.isFocusable = isFocusable + it.inputMethodMode = INPUT_METHOD_NEEDED + it.isClippingEnabled = false + var x = 0f + var y = 0f + val touchSlop = ViewConfiguration.get(activity).scaledTouchSlop + var isClicked = false + it.setTouchInterceptor { v, event -> + val out = Rect() + v.getGlobalVisibleRect(out) + if (out.contains(event.x.toInt(), event.y.toInt())) { + return@setTouchInterceptor false + } + + when(event.actionMasked) { + MotionEvent.ACTION_DOWN -> { + x = event.x + y = event.y + } + MotionEvent.ACTION_MOVE -> { + val deltaX = event.x - x + val deltaY = event.y - y + isClicked = !(abs(deltaX) > touchSlop || abs(deltaY) > touchSlop) + } + MotionEvent.ACTION_UP -> { + if (isClicked) { + isClicked = false + onOuterViewClicked?.invoke(v) + } + } + } + try { + return@setTouchInterceptor true + } finally { + activity.window.decorView.dispatchTouchEvent(event) + } + } + it.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + } + if (VERSION.SDK_INT >= VERSION_CODES.M) { + val transition = Slide(gravity).also { + it.interpolator = AccelerateDecelerateInterpolator() + it.duration = 200 + } + pop.enterTransition = transition + pop.exitTransition = transition + } + pop.contentView = content + val reminder = object : PopupWindowReminder(pop) { + + override fun key(): String { + return key + super.key() + } + + override fun show() { + pop.showAtLocation(activity.window.decorView, gravity, startX, if (isImmersiveMode) 0 else BarUtils.getStatusBarHeight() + startY) + } + override fun isOverride(): Boolean = isOverride + } + tempReminder = reminder + Reminder.enqueue(activity.lifeCycleOwner, reminder) + } + return { + tempReminder?.hide() + } + } + + + + +} diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/taskrunning/RunningTaskManagerView.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/taskrunning/RunningTaskManagerView.kt new file mode 100644 index 0000000000..3841af3437 --- /dev/null +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/taskrunning/RunningTaskManagerView.kt @@ -0,0 +1,68 @@ +package com.mogo.och.weaknet.ui.taskrunning + +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.util.AttributeSet +import android.view.LayoutInflater +import androidx.constraintlayout.widget.ConstraintLayout +import com.mogo.och.shuttle.weaknet.R +import kotlinx.android.synthetic.main.shuttle_wadk_task_running.view.clLayout +import kotlinx.android.synthetic.main.shuttle_wadk_task_running.view.ivTaskRunningClose + + +/** + * @author XuXinChao + * @description BadCase录包管理页面 + * @since: 2022/12/15 + */ +class RunningTaskManagerView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : ConstraintLayout(context, attrs, defStyleAttr) { + + companion object { + const val TAG = "BadCaseManagerView" + } + + private var clickListener:ClickListener?=null + + init { + LayoutInflater.from(context).inflate(R.layout.shuttle_wadk_task_running, this, true) + initView() + } + + private fun initView(){ + background = ColorDrawable(Color.parseColor("#F0151D41")) + clLayout.setOnClickListener { + } + //关闭BadCase管理窗口 + ivTaskRunningClose.setOnClickListener { + clickListener?.onClose() + } + + } + + fun setOnClickListener(clickListener: ClickListener) { + this.clickListener = clickListener + } + + interface ClickListener { + fun onClose() + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + } + + +} +interface ClickListener { + fun onClose() +} diff --git a/OCH/shuttle/driver_weaknet/src/main/res/layout/shuttle_wadk_task_running.xml b/OCH/shuttle/driver_weaknet/src/main/res/layout/shuttle_wadk_task_running.xml new file mode 100644 index 0000000000..9d67a281ea --- /dev/null +++ b/OCH/shuttle/driver_weaknet/src/main/res/layout/shuttle_wadk_task_running.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/shuttle/driver_weaknet/src/main/res/values/strings.xml b/OCH/shuttle/driver_weaknet/src/main/res/values/strings.xml index c6fd4ff49e..1f4f9157b9 100644 --- a/OCH/shuttle/driver_weaknet/src/main/res/values/strings.xml +++ b/OCH/shuttle/driver_weaknet/src/main/res/values/strings.xml @@ -43,6 +43,8 @@ 本站核销成功:%1$d人 本站核销成功:0人 + 暂无待上传任务 + 距离发车时间还有%1$s分钟 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/ToolsView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/ToolsView.kt index 2d6a9095bb..0917cfc7df 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/ToolsView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/ToolsView.kt @@ -66,6 +66,10 @@ class ToolsView private constructor() { dismissToolsFloatView() CallerDevaToolsManager.showTakeOverRecordView(it) } + + override fun showWaitUploadTaskView() { + dismissToolsFloatView() + } }) } toolsViewFloat = WarningFloat.with(it) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/AutoPilotAndCheckView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/AutoPilotAndCheckView.kt index 7d41978c3f..7b8de7a51c 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/AutoPilotAndCheckView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/AutoPilotAndCheckView.kt @@ -12,6 +12,7 @@ import android.view.View import android.widget.FrameLayout import com.mogo.commons.env.ProjectUtils import com.mogo.eagle.core.data.app.AppConfigInfo +import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.deva.bindingcar.IPCUpgradeStateInfo import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig import com.mogo.eagle.core.data.deva.report.TakeOverRecordInfo @@ -27,6 +28,7 @@ import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.function.hmi.ui.utils.KeyBoardUtil import com.mogo.eagle.core.function.msgbox.MsgBoxConfig import com.mogo.eagle.core.utilcode.kotlin.onClick +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.util.ActivityUtils import com.mogo.eagle.core.utilcode.util.ToastUtils import com.mogo.eagle.core.utilcode.util.UiThreadHandler @@ -163,6 +165,13 @@ internal class AutoPilotAndCheckView @JvmOverloads constructor( takeOverRecordLayout.setOnClickListener { clickListener?.showTakeOverRecordView() } + if (AppIdentityModeUtils.isShuttle(FunctionBuildConfig.appIdentityMode)){ + waitUploadTaskLayout.visibility = View.VISIBLE + waitUploadTaskLayout.onClick { + clickListener?.showWaitUploadTaskView() + EventBus.getDefault().post(EventLogout(EventLogout.SHOW_WAIT_UPLOAD_TASK)) + } + } } if (AppConfigInfo.isConnectAutopilot) { CallerAutoPilotControlManager.getCarConfig() @@ -320,6 +329,7 @@ internal class AutoPilotAndCheckView @JvmOverloads constructor( fun showSOPSettingView() fun showBadCaseManagerView() fun showTakeOverRecordView() + fun showWaitUploadTaskView() } override fun onAutopilotCarConfig(carConfigResp: MessagePad.CarConfigResp) { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/icon_wait_upload_task.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/icon_wait_upload_task.png new file mode 100644 index 0000000000..5c1f4f39cd Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/icon_wait_upload_task.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_auto_pilot_check.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_auto_pilot_check.xml index 3b92f5af1b..b701492508 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_auto_pilot_check.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_auto_pilot_check.xml @@ -185,9 +185,9 @@ android:id="@+id/takeOverRecordLayout" android:layout_width="wrap_content" android:layout_height="@dimen/dp_216" - app:layout_constraintLeft_toLeftOf="@id/checkSystemView" - app:layout_constraintTop_toBottomOf="@id/checkSystemView" - android:layout_marginTop="@dimen/dp_90" + app:layout_constraintTop_toTopOf="@+id/badCaseReportLayout" + app:layout_constraintBottom_toBottomOf="@+id/badCaseReportLayout" + app:layout_constraintStart_toEndOf="@+id/badCaseReportLayout" android:layout_marginStart="@dimen/dp_142" android:visibility="gone" > @@ -211,6 +211,34 @@ + + + + + + + + 运营面板 录包 接管记录 + 本地任务 录包管理 上报 车速设置 diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/temp/EventLogout.java b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/temp/EventLogout.java index 3e9131810c..ac71b3cb96 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/temp/EventLogout.java +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/temp/EventLogout.java @@ -6,6 +6,7 @@ public class EventLogout { public final static int LOGOUT_TYPE = 100001; public final static int PERSONAL_TYPE = 100002; public final static int SHOW_QR_TYPE = 100003; + public final static int SHOW_WAIT_UPLOAD_TASK = 100004; public EventLogout(int messgaeType) { this.messgaeType = messgaeType;