From 9150b3f40a8af18da4cf2eec5ff09f7eaaaea2bb Mon Sep 17 00:00:00 2001 From: renwj Date: Thu, 26 May 2022 20:38:51 +0800 Subject: [PATCH] =?UTF-8?q?[=E7=8A=B6=E6=80=81=E6=A0=8F]=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E6=A0=8F=E9=9C=80=E6=B1=82=E4=BB=A3=E7=A0=81=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [状态栏]网络可访问状态获取 --- .../passenger/model/BusPassengerModel.java | 4 + .../mogo/och/bus/presenter/BusPresenter.java | 4 + .../passenger/model/TaxiPassengerModel.java | 5 + .../com/mogo/och/taxi/model/TaxiModel.java | 4 + .../autopilot/adapter/MoGoAdasListenerImpl.kt | 5 + .../adapter/MoGoHandAdasMsgManager.java | 4 + .../src/main/AndroidManifest.xml | 2 + .../DevaToolsProvider.kt | 4 + .../badcase/BadCaseManager.kt | 4 +- .../ext/{BadCaseExt.kt => Extentions.kt} | 112 ++++++++-- .../feedback/FeedbackManager.kt | 4 +- .../status/StatusManager.kt | 99 +++++++++ .../status/entity/Status.kt | 191 ++++++++++++++++++ .../status/flow/IFlow.kt | 51 +++++ .../status/flow/can/CanImpl.kt | 59 ++++++ .../status/flow/gps/GpsImpl.kt | 85 ++++++++ .../status/flow/ipc/IpcImpl.kt | 45 +++++ .../status/flow/nets/NetsImpl.kt | 132 ++++++++++++ .../status/flow/rtk/RTKImpl.kt | 35 ++++ .../status/flow/trace/TracingImpl.kt | 44 ++++ .../status/model/StatusModel.kt | 113 +++++++++++ .../status/ui/StatusView.kt | 106 ++++++++++ .../status/ui/adapter/StatusAdapter.kt | 99 +++++++++ .../status/ui/diff/StatusDiffCallback.kt | 21 ++ .../icon_dev_status_can_disable.png | Bin 0 -> 6214 bytes .../icon_dev_status_can_enable.png | Bin 0 -> 10337 bytes .../icon_dev_status_gps_disable.png | Bin 0 -> 6842 bytes .../icon_dev_status_gps_enable.png | Bin 0 -> 10522 bytes .../icon_dev_status_ipc_disable.png | Bin 0 -> 6119 bytes .../icon_dev_status_ipc_enable.png | Bin 0 -> 9661 bytes .../icon_dev_status_net_disable.png | Bin 0 -> 7558 bytes .../icon_dev_status_net_enable.png | Bin 0 -> 10675 bytes .../icon_dev_status_route_enable.png | Bin 0 -> 10721 bytes .../icon_dev_status_rtk_disable.png | Bin 0 -> 8282 bytes .../icon_dev_status_rtk_enable.png | Bin 0 -> 11418 bytes .../icon_dev_status_trace_unkown.png | Bin 0 -> 4405 bytes .../icon_dev_status_track_enable.png | Bin 0 -> 9867 bytes .../icon_dev_status_un_fold.png | Bin 0 -> 9649 bytes .../src/main/res/layout/layout_status_bar.xml | 37 ++++ .../res/layout/layout_status_bar_item.xml | 22 ++ .../dispatch/DispatchAutoPilotManager.java | 3 + .../core/function/hmi/ui/MoGoHmiFragment.kt | 4 + .../hmi/ui/setting/DebugSettingView.kt | 4 + .../hmi/ui/widget/SteeringWheelView.java | 9 + .../core/function/main/MainActivity.java | 8 + .../core/function/smp/SmallMapFragment.java | 4 + .../autopilot/IMoGoAutopilotStatusListener.kt | 5 + .../IMoGoAutopilotVehicleStateListener.kt | 5 + .../api/devatools/IDevaToolsProvider.kt | 5 + .../CallerAutoPilotStatusListenerManager.kt | 7 + ...CallerAutopilotCarStatusListenerManager.kt | 8 + ...lerAutopilotVehicleStateListenerManager.kt | 10 + .../call/devatools/CallerDevaToolsManager.kt | 7 + .../eagle/core/utilcode/kotlin/Extensions.kt | 24 ++- .../rv/divider/CommonDividerItemDecoration.kt | 22 +- .../core/utilcode/util/PermissionUtils.java | 28 +++ .../routeoverlay/MogoRouteOverlayManager.java | 3 + 57 files changed, 1422 insertions(+), 25 deletions(-) rename core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/ext/{BadCaseExt.kt => Extentions.kt} (62%) create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/StatusManager.kt create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/entity/Status.kt create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/IFlow.kt create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/can/CanImpl.kt create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/gps/GpsImpl.kt create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/ipc/IpcImpl.kt create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/nets/NetsImpl.kt create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/rtk/RTKImpl.kt create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/trace/TracingImpl.kt create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/model/StatusModel.kt create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/StatusView.kt create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/adapter/StatusAdapter.kt create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/diff/StatusDiffCallback.kt create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_dev_status_can_disable.png create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_dev_status_can_enable.png create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_dev_status_gps_disable.png create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_dev_status_gps_enable.png create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_dev_status_ipc_disable.png create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_dev_status_ipc_enable.png create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_dev_status_net_disable.png create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_dev_status_net_enable.png create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_dev_status_route_enable.png create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_dev_status_rtk_disable.png create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_dev_status_rtk_enable.png create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_dev_status_trace_unkown.png create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_dev_status_track_enable.png create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_dev_status_un_fold.png create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/layout/layout_status_bar.xml create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/layout/layout_status_bar_item.xml diff --git a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/model/BusPassengerModel.java b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/model/BusPassengerModel.java index 1b40d17144..27fdd1e6c7 100644 --- a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/model/BusPassengerModel.java +++ b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/model/BusPassengerModel.java @@ -288,6 +288,10 @@ public class BusPassengerModel { private final IMoGoAutopilotStatusListener mGoAutopilotStatusListener = new IMoGoAutopilotStatusListener(){ + @Override + public void onAutopilotNotData(long timestamp) { + } + @Override public void onAutopilotGuardian(@Nullable MogoReportMsg.MogoReportMessage guardianInfo) { diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusPresenter.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusPresenter.java index 8f58e0116d..d9eb1a29eb 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusPresenter.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusPresenter.java @@ -277,4 +277,8 @@ public class BusPresenter extends Presenter public void onAutopilotGuardian(MogoReportMsg.MogoReportMessage guardianInfo) { } + + @Override + public void onAutopilotNotData(long timestamp) { + } } diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.java index 118dbfe391..75f488cb4f 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.java @@ -482,6 +482,11 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback private final IMoGoAutopilotStatusListener mGoAutopilotStatusListener = new IMoGoAutopilotStatusListener(){ + + @Override + public void onAutopilotNotData(long timestamp) { + } + @Override public void onAutopilotGuardian(@Nullable MogoReportMsg.MogoReportMessage guardianInfo) { diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiModel.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiModel.java index d4a8b77bfa..da90193b91 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiModel.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiModel.java @@ -1042,6 +1042,10 @@ public class TaxiModel { private final IMoGoAutopilotStatusListener mGoAutopilotStatusListener = new IMoGoAutopilotStatusListener() { + @Override + public void onAutopilotNotData(long timestamp) { + } + @Override public void onAutopilotGuardian(@Nullable MogoReportMsg.MogoReportMessage guardianInfo) { diff --git a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasListenerImpl.kt b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasListenerImpl.kt index 1ab3f18cc3..938b2e661a 100644 --- a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasListenerImpl.kt +++ b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasListenerImpl.kt @@ -148,6 +148,11 @@ class MoGoAdasListenerImpl : OnAdasListener { CallerAutopilotVehicleStateListenerManager.invokeAutopilotSteeringData(vehicleState.steering) //挂挡档位数据 CallerAutopilotVehicleStateListenerManager.invokeAutopilotGearData(vehicleState.gear) + } else { + /** + * 底盘没有返回数据 + */ + CallerAutopilotVehicleStateListenerManager.invokeAutopilotNotData(header.timestamp.toLong()) } } diff --git a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoHandAdasMsgManager.java b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoHandAdasMsgManager.java index 5f787317e7..c83ee74773 100644 --- a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoHandAdasMsgManager.java +++ b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoHandAdasMsgManager.java @@ -149,4 +149,8 @@ public class MoGoHandAdasMsgManager implements } + @Override + public void onAutopilotNotData(long timestamp) { + + } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/AndroidManifest.xml b/core/function-impl/mogo-core-function-devatools/src/main/AndroidManifest.xml index 7a02e164bc..dc9cf1b26e 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/AndroidManifest.xml +++ b/core/function-impl/mogo-core-function-devatools/src/main/AndroidManifest.xml @@ -2,6 +2,8 @@ + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt index 19bbea383e..955ee6414c 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt @@ -13,6 +13,7 @@ import com.zhjt.mogo_core_function_devatools.badcase.BadCaseManager import com.zhjt.mogo_core_function_devatools.feedback.FeedbackManager import com.zhjt.mogo_core_function_devatools.logcatch.MogoLogCatchManager import com.zhjt.mogo_core_function_devatools.scene.SceneManager.Companion.sceneManager +import com.zhjt.mogo_core_function_devatools.status.* import com.zhjt.mogo_core_function_devatools.trace.TraceManager.Companion.traceManager import com.zhjt.mogo_core_function_devatools.upgrade.UpgradeManager.Companion.upgradeManager import record_cache.RecordPanelOuterClass @@ -97,4 +98,7 @@ class DevaToolsProvider : IDevaToolsProvider { upgradeManager.downLoadPackage(mContext!!, downloadKey,downloadUrl) } + override fun showStatusBar(ctx: Context) { + StatusManager.init(ctx) + } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt index 6bb8c3fdae..f7d9efc4ed 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt @@ -27,7 +27,7 @@ import com.zhjt.mogo_core_function_devatools.badcase.repository.net.api.entity.B import com.zhjt.mogo_core_function_devatools.badcase.biz.BadCasePresenter import com.zhjt.mogo_core_function_devatools.badcase.biz.BadCaseView import com.zhjt.mogo_core_function_devatools.badcase.repository.db.entity.AutoPilotRecord -import com.zhjt.mogo_core_function_devatools.ext.pop +import com.zhjt.mogo_core_function_devatools.ext.enqueuePop import com.zhjt.mogo_core_function_devatools.ext.toast import kotlinx.coroutines.* import kotlinx.coroutines.channels.Channel @@ -263,7 +263,7 @@ internal object BadCaseManager : LifecycleEventObserver { val activity = viewHolder?.get()?.context as? FragmentActivity ?: throw IllegalStateException("please ensure context is FragmentActivity.") BadCaseView(activity).also { itx -> itx.register(record, onDismiss, onSelect) - activity.pop(itx, 960.PX, WindowManager.LayoutParams.MATCH_PARENT, key = "BadCaseFloatWindow_").also { + activity.enqueuePop(itx, 960.PX, WindowManager.LayoutParams.MATCH_PARENT, key = "BadCaseFloatWindow_").also { hideFloat = it } } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/ext/BadCaseExt.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/ext/Extentions.kt similarity index 62% rename from core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/ext/BadCaseExt.kt rename to core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/ext/Extentions.kt index 11c549a3bf..25a3ccdd0b 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/ext/BadCaseExt.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/ext/Extentions.kt @@ -17,6 +17,7 @@ import android.view.animation.AccelerateDecelerateInterpolator import android.widget.PopupWindow import android.widget.PopupWindow.INPUT_METHOD_NEEDED import android.widget.TextView +import androidx.core.view.* import androidx.fragment.app.FragmentActivity import androidx.lifecycle.lifecycleScope import com.mogo.eagle.core.utilcode.kotlin.PX @@ -26,7 +27,6 @@ import com.mogo.eagle.core.utilcode.kotlin.shape 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.BarUtils -import com.mogo.eagle.core.utilcode.util.WindowUtils import kotlinx.coroutines.delay import kotlinx.coroutines.launch import java.util.concurrent.TimeUnit @@ -67,7 +67,7 @@ internal fun Context.toast(text: CharSequence, duration: Long = 2, unit: TimeUni } @SuppressLint("ClickableViewAccessibility") -internal fun Context.pop(content: View, width: Int, height: Int, key: String, onOuterViewClicked:((focus: View) -> Unit)? = null): () -> Unit { +fun Context.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 activity = (this as? FragmentActivity) ?: throw IllegalStateException("please use Activity to trigger pop show.") val isImmersiveMode = BarUtils.isImmersiveMode(activity) var tempReminder: PopupWindowReminder? = null @@ -75,11 +75,11 @@ internal fun Context.pop(content: View, width: Int, height: Int, key: String, on val pop = PopupWindow(width, height).also { it.isOutsideTouchable = true it.isTouchable = true - it.isFocusable = true + it.isFocusable = isFocusable it.inputMethodMode = INPUT_METHOD_NEEDED it.isClippingEnabled = false - var startX = 0f - var startY = 0f + var x = 0f + var y = 0f val touchSlop = ViewConfiguration.get(activity).scaledTouchSlop var isClicked = false it.setTouchInterceptor { v, event -> @@ -91,12 +91,12 @@ internal fun Context.pop(content: View, width: Int, height: Int, key: String, on when(event.actionMasked) { MotionEvent.ACTION_DOWN -> { - startX = event.x - startY = event.y + x = event.x + y = event.y } MotionEvent.ACTION_MOVE -> { - val deltaX = event.x - startX - val deltaY = event.y - startY + val deltaX = event.x - x + val deltaY = event.y - y isClicked = !(abs(deltaX) > touchSlop || abs(deltaY) > touchSlop) } MotionEvent.ACTION_UP -> { @@ -115,7 +115,7 @@ internal fun Context.pop(content: View, width: Int, height: Int, key: String, on it.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) } if (VERSION.SDK_INT >= VERSION_CODES.M) { - val transition = Slide(Gravity.START).also { + val transition = Slide(gravity).also { it.interpolator = AccelerateDecelerateInterpolator() it.duration = 200 } @@ -130,9 +130,9 @@ internal fun Context.pop(content: View, width: Int, height: Int, key: String, on } override fun show() { - pop.showAtLocation(activity.window.decorView, Gravity.START, 0, if (isImmersiveMode) 0 else BarUtils.getStatusBarHeight()) + pop.showAtLocation(activity.window.decorView, gravity, startX, if (isImmersiveMode) 0 else BarUtils.getStatusBarHeight() + startY) } - override fun isOverride(): Boolean = false + override fun isOverride(): Boolean = isOverride } tempReminder = reminder Reminder.enqueue(activity.lifeCycleOwner, reminder) @@ -142,6 +142,94 @@ internal fun Context.pop(content: View, width: Int, height: Int, key: String, on } } + +@SuppressLint("ClickableViewAccessibility") +fun Context.normalPop(content: View, width: Int, height: Int, key: String = "", startX: Int = 0, startY: Int = 0, gravity: Int = Gravity.START, onOuterViewClicked:((focus: View) -> Unit)? = null, isFocusable: Boolean = true): () -> Unit { + val activity = (this as? FragmentActivity) ?: throw IllegalStateException("please use Activity to trigger pop show.") + val isImmersiveMode = BarUtils.isImmersiveMode(activity) + var tempPop: PopupWindow? = null + activity.lifecycleScope.launchWhenResumed { + val pop = PopupWindow(width, height).also { + tempPop = it + 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()) && isVisibleOnPoint(content, 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 + pop.showAtLocation(activity.window.decorView, gravity, startX, if (isImmersiveMode) 0 else BarUtils.getStatusBarHeight() + startY) + } + return { + tempPop?.takeIf { it.isShowing }?.dismiss() + } +} + +fun isVisibleOnPoint(content: View, x: Int, y: Int): Boolean { + if (content is ViewGroup) { + for (i in 0 until content.childCount) { + val child = content.getChildAt(i) + val out = Rect() + child.getGlobalVisibleRect(out) + if (out.contains(x, y) && !child.isVisible) { + return false + } + val ret = isVisibleOnPoint(child, x, y) + if (!ret) { + return false + } + } + return true + } else { + val out = Rect() + content.getGlobalVisibleRect(out) + return !(out.contains(x, y) && !content.isVisible) + } +} + internal fun FragmentActivity.softKeyboardHeightChanged(block: ((height: Int) -> Unit)): ()-> Unit { val decor = window.decorView var softKeyboardDisplayed = false diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/feedback/FeedbackManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/feedback/FeedbackManager.kt index 39444462fe..9931f8ef79 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/feedback/FeedbackManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/feedback/FeedbackManager.kt @@ -25,7 +25,7 @@ import com.zhjt.mogo_core_function_devatools.R import com.zhjt.mogo_core_function_devatools.badcase.repository.db.entity.AutoPilotRecord import com.zhjt.mogo_core_function_devatools.badcase.repository.net.api.entity.BadCaseResponse.Reason import com.zhjt.mogo_core_function_devatools.badcase.toRecord -import com.zhjt.mogo_core_function_devatools.ext.pop +import com.zhjt.mogo_core_function_devatools.ext.enqueuePop import com.zhjt.mogo_core_function_devatools.ext.toast import com.zhjt.mogo_core_function_devatools.feedback.biz.FeedBackView import com.zhjt.mogo_core_function_devatools.feedback.biz.bean.Feedback.BadCase @@ -46,7 +46,7 @@ internal object FeedbackManager { fun showFeedbackWindow(ctx: Context) { val activity = ctx as? FragmentActivity ?: throw IllegalStateException("please ensure context is FragmentActivity.") - activity.pop(FeedBackView(ctx).also { itx -> + activity.enqueuePop(FeedBackView(ctx).also { itx -> itx.registerCallback(object : IFeedbackCallback { override fun onClose(v: View) { KeyboardUtils.hideSoftInput(v) diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/StatusManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/StatusManager.kt new file mode 100644 index 0000000000..765655b9f2 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/StatusManager.kt @@ -0,0 +1,99 @@ +package com.zhjt.mogo_core_function_devatools.status + +import android.content.* +import android.util.* +import android.view.* +import androidx.core.view.* +import androidx.lifecycle.* +import androidx.lifecycle.Lifecycle.Event +import androidx.lifecycle.Lifecycle.Event.ON_CREATE +import androidx.lifecycle.Lifecycle.Event.ON_DESTROY +import com.mogo.eagle.core.utilcode.kotlin.* +import com.zhjt.mogo_core_function_devatools.ext.* +import com.zhjt.mogo_core_function_devatools.status.entity.* +import com.zhjt.mogo_core_function_devatools.status.entity.CanStatus +import com.zhjt.mogo_core_function_devatools.status.entity.GpsStatus +import com.zhjt.mogo_core_function_devatools.status.entity.IpcStatus +import com.zhjt.mogo_core_function_devatools.status.entity.NetStatus +import com.zhjt.mogo_core_function_devatools.status.entity.RTKStatus +import com.zhjt.mogo_core_function_devatools.status.entity.Status +import com.zhjt.mogo_core_function_devatools.status.entity.TracingStatus +import com.zhjt.mogo_core_function_devatools.status.model.StatusModel +import com.zhjt.mogo_core_function_devatools.status.flow.IFlow +import com.zhjt.mogo_core_function_devatools.status.flow.can.CanImpl +import com.zhjt.mogo_core_function_devatools.status.flow.gps.GpsImpl +import com.zhjt.mogo_core_function_devatools.status.flow.ipc.IpcImpl +import com.zhjt.mogo_core_function_devatools.status.flow.nets.NetsImpl +import com.zhjt.mogo_core_function_devatools.status.flow.rtk.* +import com.zhjt.mogo_core_function_devatools.status.flow.rtk.RTKImpl +import com.zhjt.mogo_core_function_devatools.status.flow.trace.TracingImpl +import com.zhjt.mogo_core_function_devatools.status.ui.* +import kotlinx.coroutines.* +import kotlinx.coroutines.flow.* + +object StatusManager { + + private lateinit var model: StatusModel + + private var hidePop: (() -> Unit)? = null + + private val flows: ArrayList> by lazy { + ArrayList() + } + + fun init(ctx: Context) { + val owner = ctx as? ViewModelStoreOwner ?: throw IllegalStateException("ctx: $ctx is a instance of ViewModelStoreOwner.") + model = ViewModelProvider(owner).get(StatusModel::class.java) + ctx.lifeCycleOwner.lifecycle.addObserver(object : LifecycleEventObserver { + override fun onStateChanged(source: LifecycleOwner, event: Event) { + if (event == ON_CREATE) { + onCreate(ctx) + } + if (event == ON_DESTROY) { + onDestroy(ctx) + } + } + }) + } + + private fun onCreate(ctx: Context) { + val values = model.status.value?.second ?: throw IllegalStateException("state is not right.") + values.map { + when (it) { + is CanStatus -> CanImpl(ctx) + is IpcStatus -> IpcImpl(ctx) + is NetStatus -> NetsImpl(ctx) + is GpsStatus -> GpsImpl(ctx) + is TracingStatus -> TracingImpl(ctx) + is RTKStatus -> RTKImpl(ctx) + } + }.also { flows += it } + for (f in flows) { + ctx.lifeCycleScope.launch(Dispatchers.Default) { + f.asFlow().collect { + model.update(it) + } + } + } + hidePop?.invoke() + val content = StatusView(model, ctx) + content.doOnAttach { + Log.d("OOOO", "--- onAttach -----") + for (f in flows) { + f.onCreate() + } + } + + ctx.normalPop(content, + width = 665.PX, + height = WindowManager.LayoutParams.WRAP_CONTENT, + gravity = Gravity.END, + startX = 55.PX, + isFocusable = false).also { hidePop = it } + } + + private fun onDestroy(ctx: Context) { + flows.clear() + hidePop?.invoke() + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/entity/Status.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/entity/Status.kt new file mode 100644 index 0000000000..44354fcbb6 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/entity/Status.kt @@ -0,0 +1,191 @@ +package com.zhjt.mogo_core_function_devatools.status.entity + +import com.zhjt.mogo_core_function_devatools.status.entity.TracingStatus.Tracing +import com.zhjt.mogo_core_function_devatools.status.entity.TracingStatus.Tracing.* + +internal sealed class Status + +/** + * 工控机 + */ +internal class IpcStatus(val enabled: Boolean = false): Status() { + + override fun equals(other: Any?): Boolean { + if (javaClass != other?.javaClass) return false + other as IpcStatus + if (enabled != other.enabled) return false + return true + } + + override fun hashCode(): Int { + return enabled.hashCode() + } + + override fun toString(): String { + return "IpcStatus(enabled=$enabled)" + } +} + +internal class NetStatus(val enabled: Boolean = false, val name: String? = null, val speed: Speed? = null): Status() { + class Speed(val tx: Int, val rx: Int) { + + override fun toString(): String { + return "Speed(tx=$tx, rx=$rx)" + } + } + + override fun equals(other: Any?): Boolean { + if (javaClass != other?.javaClass) return false + other as NetStatus + if (enabled != other.enabled) return false + if (name != other.name) return false + return true + } + + override fun hashCode(): Int { + var result = enabled.hashCode() + result = 31 * result + (name?.hashCode() ?: 0) + return result + } + + override fun toString(): String { + return "NetStatus(enabled=$enabled, name=$name, speed=$speed)" + } +} + +/** + * android系统定位状态 + */ +internal class GpsStatus(val enabled: Boolean = false, val isGranted: Boolean = false): Status() { + + override fun equals(other: Any?): Boolean { + if (javaClass != other?.javaClass) return false + + other as GpsStatus + if (enabled != other.enabled) return false + if (isGranted != other.isGranted) return false + return true + } + + override fun hashCode(): Int { + var result = enabled.hashCode() + result = 31 * result + isGranted.hashCode() + return result + } + + override fun toString(): String { + return "GpsStatus(enabled=$enabled, isGranted=$isGranted)" + } +} + +/** + * RTK/GNSS定位状态 + */ +internal class RTKStatus(val enabled: Boolean = false): Status() { + + override fun equals(other: Any?): Boolean { + if (javaClass != other?.javaClass) return false + other as RTKStatus + if (enabled != other.enabled) return false + return true + } + + override fun hashCode(): Int { + return enabled.hashCode() + } +} + +/** + * Can总线 + */ +internal class CanStatus(val enabled: Boolean = false): Status() { + + override fun equals(other: Any?): Boolean { + if (javaClass != other?.javaClass) return false + other as CanStatus + if (enabled != other.enabled) return false + return true + } + + override fun hashCode(): Int { + return enabled.hashCode() + } + + override fun toString(): String { + return "CanStatus(enabled=$enabled)" + } + + +} + +/** + * 寻迹/算路/未知 + */ +internal class TracingStatus(val state: Tracing): Status() { + + enum class Tracing(val code: String? = "") { + /** + * 寻迹-已找到轨迹文件 + */ + TRACK_FINDED("IMAP_TRA_EXIST"), + + /** + * 寻迹-轨迹文件加载成功 + */ + TRACK_LOADED("IMAP_TRA_LOADED"), + + /** + * 寻迹-没有找到轨迹文件 + */ + TRACK_NOT_EXIST("EMAP_TRA_NOT_EXIST"), + + /** + * 寻迹-找到了轨迹文件,加载失败了 + */ + TRACK_LOAD_FAIL("EMAP_TRA_LOAD_FAILED"), + + /** + * 算路加载成功 + */ + ROUTE_LOADED("IMAP_TRA_ROUTING"), + + /** + * 算路失败 + */ + ROUTE_FAILED("EMAP_HADMAP_ENGINE_NO_ROUTING_INFO"), + + UNKNOWN; + + fun isException(): Boolean = this == TRACK_FINDED || this == TRACK_NOT_EXIST || this == TRACK_LOAD_FAIL || this == ROUTE_FAILED || this == UNKNOWN + } + + override fun toString(): String { + return "TracingStatus(state=$state)" + } + + override fun equals(other: Any?): Boolean { + if (javaClass != other?.javaClass) return false + + other as TracingStatus + + if (state != other.state) return false + + return true + } + + override fun hashCode(): Int { + return state.hashCode() + } +} + +internal fun String.toState(): Tracing { + return when(this) { + "IMAP_TRA_EXIST" -> TRACK_FINDED + "IMAP_TRA_LOADED" -> TRACK_LOADED + "EMAP_TRA_NOT_EXIST" -> TRACK_NOT_EXIST + "EMAP_TRA_LOAD_FAILED" -> TRACK_LOAD_FAIL + "IMAP_TRA_ROUTING" -> ROUTE_LOADED + "EMAP_HADMAP_ENGINE_NO_ROUTING_INFO" -> ROUTE_FAILED + else -> UNKNOWN + } +} diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/IFlow.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/IFlow.kt new file mode 100644 index 0000000000..93ed3adf10 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/IFlow.kt @@ -0,0 +1,51 @@ +package com.zhjt.mogo_core_function_devatools.status.flow + +import android.content.* +import android.util.* +import androidx.annotation.* +import com.mogo.eagle.core.utilcode.kotlin.* +import com.zhjt.mogo_core_function_devatools.status.entity.Status +import kotlinx.coroutines.* +import kotlinx.coroutines.channels.* +import kotlinx.coroutines.channels.Channel.Factory.CONFLATED +import kotlinx.coroutines.flow.* +import kotlin.OptIn +import kotlin.coroutines.* + +internal abstract class IFlow< T : Status>(val ctx: Context) : CoroutineScope { + + private val chl: Channel by lazy { + Channel(CONFLATED) + } + + @Volatile + private var old: T? = null + + override val coroutineContext: CoroutineContext + get() = ctx.lifeCycleScope.coroutineContext + + abstract fun onCreate() + + @OptIn(ExperimentalCoroutinesApi::class) + fun asFlow(): Flow = channelFlow { + val it = chl.iterator() + while (it.hasNext()) { + send(it.next()) + } + } + + fun send(t: T) { + if (old == t) { + return + } + old = t + launch { + chl.send(t) + } + } + + @CallSuper + open fun onDestroy() { + chl.safeCancel() + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/can/CanImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/can/CanImpl.kt new file mode 100644 index 0000000000..2ef890282e --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/can/CanImpl.kt @@ -0,0 +1,59 @@ +package com.zhjt.mogo_core_function_devatools.status.flow.can + +import android.content.* +import android.util.* +import chassis.Chassis.GearPosition +import chassis.Chassis.LightSwitch +import com.mogo.eagle.core.data.autopilot.* +import com.mogo.eagle.core.function.api.autopilot.* +import com.mogo.eagle.core.function.call.autopilot.* +import com.zhjt.mogo_core_function_devatools.status.flow.IFlow +import com.zhjt.mogo_core_function_devatools.status.entity.CanStatus + +internal class CanImpl(ctx: Context): IFlow(ctx), IMoGoAutopilotVehicleStateListener, IMoGoAutopilotStatusListener { + + companion object { + const val TAG = "CanImpl" + } + + override fun onCreate() { + Log.d(TAG, "-- onCreate --") + send(CanStatus(false)) + CallerAutopilotVehicleStateListenerManager.addListener(TAG, this) + CallerAutoPilotStatusListenerManager.addListener(TAG, this) + } + + override fun onAutopilotStatusResponse(autoPilotStatusInfo: AutopilotStatusInfo) { + super.onAutopilotStatusResponse(autoPilotStatusInfo) + if (!CallerAutoPilotManager.isConnected()) { + send(CanStatus(false)) + } + } + + override fun onAutopilotLightSwitchData(lightSwitch: LightSwitch?) { + send(CanStatus(true)) + } + + override fun onAutopilotBrakeLightData(brakeLight: Boolean) { + send(CanStatus(true)) + } + + override fun onAutopilotSteeringData(steering: Float) { + send(CanStatus(true)) + } + + override fun onAutopilotGearData(gear: GearPosition) { + send(CanStatus(true)) + } + + override fun onAutopilotNotData(timestamp: Long) { + send(CanStatus(false)) + } + + override fun onDestroy() { + super.onDestroy() + Log.d(TAG, "-- onDestroy --") + CallerAutoPilotStatusListenerManager.removeListener(TAG) + CallerAutoPilotStatusListenerManager.removeListener(TAG) + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/gps/GpsImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/gps/GpsImpl.kt new file mode 100644 index 0000000000..4230819edf --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/gps/GpsImpl.kt @@ -0,0 +1,85 @@ +package com.zhjt.mogo_core_function_devatools.status.flow.gps + +import android.* +import android.content.* +import android.location.* +import android.util.* +import androidx.core.location.* +import com.mogo.eagle.core.utilcode.util.* +import com.mogo.eagle.core.utilcode.util.PermissionUtils.SimpleCallback +import com.zhjt.mogo_core_function_devatools.status.flow.IFlow +import com.zhjt.mogo_core_function_devatools.status.entity.GpsStatus +import java.util.concurrent.atomic.* + +internal class GpsImpl(ctx: Context): IFlow(ctx) { + + companion object { + const val TAG = "RTKImpl" + } + + private val registered = AtomicBoolean(false) + + private var receiver: CheckLocationReceiver? = null + + inner class CheckLocationReceiver(private val onClose: ()->Unit, private val onOpen:()-> Unit) : BroadcastReceiver() { + + override fun onReceive(context: Context?, intent: Intent?) { + if (intent?.action == LocationManager.MODE_CHANGED_ACTION) { + if (isLocationEnabled()) { + onOpen.invoke() + } else { + onClose.invoke() + } + } + } + } + + private val onClose = { + send(false, PermissionUtils.isGranted(Manifest.permission.ACCESS_FINE_LOCATION)) + } + + private val onOpen = { + send(true, PermissionUtils.isGranted(Manifest.permission.ACCESS_FINE_LOCATION)) + } + + override fun onCreate() { + val isGranted = PermissionUtils.isGranted(Manifest.permission.ACCESS_FINE_LOCATION) + send(isLocationEnabled(), isGranted) + if (!isGranted) { + PermissionUtils.requestAccessFineLocation(object : SimpleCallback { + override fun onGranted() { + Log.d(TAG,"权限: ${Manifest.permission.ACCESS_FINE_LOCATION} 被授予了....") + send(enabled = isLocationEnabled(), isGranted = false) + } + + override fun onDenied() { + ToastUtils.showShort("定位权限被拒绝, 可能导致RTK定位不准确,请开启~") + send(enabled = isLocationEnabled(), isGranted = false) + } + }) + } + + if (registered.compareAndSet(false, true)) { + ctx.registerReceiver(CheckLocationReceiver(onClose, onOpen).also { receiver = it }, IntentFilter().also { it.addAction(LocationManager.MODE_CHANGED_ACTION) }) + } + } + + private fun isLocationEnabled() = + LocationManagerCompat.isLocationEnabled(ctx.getSystemService(Context.LOCATION_SERVICE) as LocationManager) + + private fun send(enabled: Boolean, isGranted: Boolean) { + send(GpsStatus(enabled, isGranted)) + } + + override fun onDestroy() { + super.onDestroy() + try { + if (registered.compareAndSet(true, false) && receiver != null) { + ctx.unregisterReceiver(receiver) + } + } catch (t: Throwable) { + t.printStackTrace() + } + + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/ipc/IpcImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/ipc/IpcImpl.kt new file mode 100644 index 0000000000..f6611d3262 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/ipc/IpcImpl.kt @@ -0,0 +1,45 @@ +package com.zhjt.mogo_core_function_devatools.status.flow.ipc + +import android.content.* +import android.util.* +import com.mogo.eagle.core.data.autopilot.* +import com.mogo.eagle.core.function.api.autopilot.* +import com.mogo.eagle.core.function.call.autopilot.* +import com.zhjt.mogo_core_function_devatools.status.flow.IFlow +import com.zhjt.mogo_core_function_devatools.status.entity.IpcStatus + +internal class IpcImpl(ctx: Context): IFlow(ctx), IMoGoAutopilotStatusListener { + + companion object { + const val TAG = "IpcImpl" + } + + private var state: Int = -1 + + override fun onCreate() { + Log.d(TAG, "-- onCreate --") + checkAndSend() + CallerAutoPilotStatusListenerManager.addListener(TAG, this) + } + + + override fun onAutopilotStatusResponse(autoPilotStatusInfo: AutopilotStatusInfo) { + super.onAutopilotStatusResponse(autoPilotStatusInfo) + Log.d(TAG, "-- onAutopilotStatusResponse -- state: ${autoPilotStatusInfo.state}") + if (state != autoPilotStatusInfo.state) { + checkAndSend() + state = autoPilotStatusInfo.state + } + } + + private fun checkAndSend() { + Log.d(TAG, "-- checkAndSend --") + send(IpcStatus(CallerAutoPilotManager.isConnected())) + } + + override fun onDestroy() { + super.onDestroy() + Log.d(TAG, "-- onDestroy --") + CallerAutoPilotStatusListenerManager.removeListener(TAG) + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/nets/NetsImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/nets/NetsImpl.kt new file mode 100644 index 0000000000..8c96e77dab --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/nets/NetsImpl.kt @@ -0,0 +1,132 @@ +package com.zhjt.mogo_core_function_devatools.status.flow.nets + +import android.content.* +import android.net.* +import android.net.wifi.* +import android.os.Build.VERSION +import android.os.Build.VERSION_CODES +import android.util.* +import com.mogo.eagle.core.utilcode.kotlin.* +import com.zhjt.mogo_core_function_devatools.status.flow.IFlow +import com.zhjt.mogo_core_function_devatools.status.entity.NetStatus +import com.zhjt.mogo_core_function_devatools.status.entity.NetStatus.Speed +import kotlinx.coroutines.* +import java.util.concurrent.atomic.* + +internal class NetsImpl(ctx: Context): IFlow(ctx) { + + companion object { + const val TAG = "NetsImpl" + } + + private val registered = AtomicBoolean(false) + + private val connectMgr by lazy { + ctx.applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager + } + + private val wifiMgr by lazy { + ctx.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager + } + + private val cb = object : ConnectivityManager.NetworkCallback() { + + override fun onAvailable(network: Network) { + super.onAvailable(network) + Log.d(TAG, "-- onAvailable --:: $network") + checkAndSend() + } + + override fun onLosing(network: Network, maxMsToLive: Int) { + super.onLosing(network, maxMsToLive) + Log.d(TAG, "-- onLosing --:: $network::$maxMsToLive") + } + + override fun onLost(network: Network) { + super.onLost(network) + Log.d(TAG, "-- onLost --:: $network") + checkAndSend() + } + + override fun onUnavailable() { + super.onUnavailable() + Log.d(TAG, "-- onUnavailable --") + checkAndSend() + } + + override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities) { + super.onCapabilitiesChanged(network, networkCapabilities) + Log.d(TAG, "-- onCapabilitiesChanged --:$network::$networkCapabilities") + checkAndSend() + } + + override fun onLinkPropertiesChanged(network: Network, linkProperties: LinkProperties) { + super.onLinkPropertiesChanged(network, linkProperties) + Log.d(TAG, "-- onLinkPropertiesChanged --:$network::$linkProperties") + } + + override fun onBlockedStatusChanged(network: Network, blocked: Boolean) { + super.onBlockedStatusChanged(network, blocked) + Log.d(TAG, "-- onBlockedStatusChanged --:$network::$blocked") + } + } + + + override fun onCreate() { + Log.d(TAG, "-- onCreate --") + checkAndSend() + val builder = NetworkRequest.Builder() + .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) + if (VERSION.SDK_INT >= VERSION_CODES.O) { + builder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI_AWARE) + } + if (registered.compareAndSet(false, true)) { + connectMgr.registerNetworkCallback(builder.build(), cb) + } + } + + private var loopCheckAndSendJob: Job? = null + + private fun checkAndSend() { + val connectionInfo = wifiMgr.connectionInfo + val enabled = isNetConnected() + val name = connectionInfo.ssid?.replace(Regex("[\\W]"), "") + loopCheckAndSendJob?.safeCancel() + launch(Dispatchers.Default) { delay(1000); checkAndSend() }.also { loopCheckAndSendJob = it } + var tr = 0 + if (VERSION.SDK_INT >= VERSION_CODES.Q) { + tr = connectionInfo.txLinkSpeedMbps + } + var sr = 0 + if (VERSION.SDK_INT >= VERSION_CODES.Q) { + sr = connectionInfo.rxLinkSpeedMbps + } + val speed = Speed(tr, sr) + Log.d(TAG, "checkAndSend----:enable: $enabled :: name: $name") + send(enabled, name, speed) + } + + + private fun isNetConnected(): Boolean = + if (VERSION.SDK_INT >= VERSION_CODES.M) { + val networkCapabilities = connectMgr.getNetworkCapabilities(connectMgr.activeNetwork) + networkCapabilities?.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) ?: false + } else { + val activeNetworkInfo = connectMgr.activeNetworkInfo + activeNetworkInfo != null && activeNetworkInfo.isConnected + } + + private fun send(enabled: Boolean, name: String?, speed: Speed? = null) { + send(NetStatus(enabled, name, speed)) + } + + override fun onDestroy() { + super.onDestroy() + Log.d(TAG, "-- onDestroy --") + if (registered.compareAndSet(true, false)) { + connectMgr.unregisterNetworkCallback(cb) + } + loopCheckAndSendJob?.safeCancel() + + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/rtk/RTKImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/rtk/RTKImpl.kt new file mode 100644 index 0000000000..babb29092b --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/rtk/RTKImpl.kt @@ -0,0 +1,35 @@ +package com.zhjt.mogo_core_function_devatools.status.flow.rtk + +import android.content.* +import android.util.* +import com.mogo.eagle.core.function.api.autopilot.* +import com.mogo.eagle.core.function.call.autopilot.* +import com.zhjt.mogo_core_function_devatools.status.entity.RTKStatus +import com.zhjt.mogo_core_function_devatools.status.flow.IFlow +import mogo.telematics.pad.MessagePad.GnssInfo + +internal class RTKImpl(ctx: Context): IFlow(ctx), IMoGoAutopilotCarStateListener { + companion object { + const val TAG = "RTKImpl" + } + + override fun onCreate() { + send(RTKStatus(isRTKEnabled())) + Log.d(TAG, "-- onCreate --") + CallerAutopilotCarStatusListenerManager.addListener(TAG, this) + + } + + private fun isRTKEnabled() = + CallerAutoPilotManager.isConnected() && CallerAutoPilotStatusListenerManager.getAutoPilotReportMessageCode() != "EHW_RTK" && CallerAutopilotCarStatusListenerManager.getCurrentGnssInfo() != null + + override fun onAutopilotCarStateData(gnssInfo: GnssInfo?) { + send(RTKStatus(isRTKEnabled())) + } + + override fun onDestroy() { + super.onDestroy() + Log.d(TAG, "-- onDestroy --") + CallerAutopilotCarStatusListenerManager.removeListener(TAG) + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/trace/TracingImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/trace/TracingImpl.kt new file mode 100644 index 0000000000..ddaf051dcd --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/trace/TracingImpl.kt @@ -0,0 +1,44 @@ +package com.zhjt.mogo_core_function_devatools.status.flow.trace + +import android.content.* +import android.util.* +import com.mogo.eagle.core.function.api.autopilot.* +import com.mogo.eagle.core.function.call.autopilot.* +import com.zhjt.mogo_core_function_devatools.status.entity.* +import com.zhjt.mogo_core_function_devatools.status.entity.TracingStatus +import com.zhjt.mogo_core_function_devatools.status.flow.IFlow +import mogo_msg.MogoReportMsg.MogoReportMessage + +internal class TracingImpl(ctx: Context): IFlow(ctx), IMoGoAutopilotStatusListener { + + companion object { + const val TAG = "TracingImpl" + } + + private var old: String = "" + + override fun onCreate() { + Log.d(TAG, "-- onCreate --") + val autoPilotReportMessageCode = CallerAutoPilotStatusListenerManager.getAutoPilotReportMessageCode() + old = autoPilotReportMessageCode + send(TracingStatus(autoPilotReportMessageCode.toState())) + CallerAutoPilotStatusListenerManager.addListener(TAG, this) + } + + + override fun onAutopilotGuardian(guardianInfo: MogoReportMessage?) { + super.onAutopilotGuardian(guardianInfo) + val current = guardianInfo?.code + if (current != null && current != old) { + Log.d(TAG, "-- onAutopilotGuardian --") + send(TracingStatus(current.toState())) + old = current + } + } + + override fun onDestroy() { + super.onDestroy() + Log.d(TAG, "-- onDestroy --") + CallerAutoPilotStatusListenerManager.removeListener(TAG) + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/model/StatusModel.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/model/StatusModel.kt new file mode 100644 index 0000000000..67e36a34b4 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/model/StatusModel.kt @@ -0,0 +1,113 @@ +package com.zhjt.mogo_core_function_devatools.status.model + +import androidx.lifecycle.* +import com.mogo.eagle.core.function.call.autopilot.* +import com.zhjt.mogo_core_function_devatools.status.entity.CanStatus +import com.zhjt.mogo_core_function_devatools.status.entity.GpsStatus +import com.zhjt.mogo_core_function_devatools.status.entity.IpcStatus +import com.zhjt.mogo_core_function_devatools.status.entity.NetStatus +import com.zhjt.mogo_core_function_devatools.status.entity.RTKStatus +import com.zhjt.mogo_core_function_devatools.status.entity.Status +import com.zhjt.mogo_core_function_devatools.status.entity.TracingStatus +import com.zhjt.mogo_core_function_devatools.status.entity.TracingStatus.Tracing.UNKNOWN +import java.util.concurrent.atomic.* +import kotlin.Pair + +internal class StatusModel : ViewModel() { + + companion object { + + const val TAG = "StatusModel" + val DEFAULTS = Pair(null, ArrayList().also { + it += IpcStatus(CallerAutoPilotManager.isConnected()) + it += NetStatus(false) + it += CanStatus(false) + it += TracingStatus(UNKNOWN) + it += RTKStatus(false) + it += GpsStatus(enabled = false, isGranted = false) + }) + } + + val status: MutableLiveData>> = MutableLiveData() + + private val preValue by lazy { AtomicReference>>() } + + + init { + status.value = DEFAULTS + } + + fun update(s: Status) { + synchronized(preValue) { + val v = preValue.get()?.second ?: status.value?.second ?: throw IllegalStateException("live data can't be null.") + val nv = ArrayList(v).also { it.updateOrInsert(s) } + val data = Pair(getExceptionStatus(nv), nv) + preValue.set(data) + status.postValue(data) + } + } + + private fun getExceptionStatus(l: ArrayList): Status? { + var ret: Status? = null + for (s in l) { + ret = when(s) { + is IpcStatus -> { + if (!s.enabled) { + s + } else { + null + } + } + is CanStatus -> { + if (CallerAutoPilotManager.isConnected() && !s.enabled) { + s + } else { + null + } + } + is NetStatus -> { + if (!s.enabled) { + s + } else { + null + } + } + is GpsStatus -> { + if (!s.enabled) { + s + } else { + null + } + } + is TracingStatus -> { + if (CallerAutoPilotManager.isConnected() && s.state.isException()) { + s + } else { + null + } + } + is RTKStatus -> { + if (!s.enabled) { + s + } else { + null + } + } + } + + if (ret != null) { + break + } + } + return ret + } + + private fun ArrayList.updateOrInsert(s: Status) { + val index = indexOfFirst { it.javaClass == s.javaClass } + if (index < 0) { + add(s) + } else { + set(index, s) + } + } +} diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/StatusView.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/StatusView.kt new file mode 100644 index 0000000000..e8dcf1b2a7 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/StatusView.kt @@ -0,0 +1,106 @@ +package com.zhjt.mogo_core_function_devatools.status.ui + +import android.annotation.* +import android.content.* +import android.graphics.* +import android.graphics.drawable.* +import android.transition.* +import android.util.* +import android.view.* +import androidx.appcompat.widget.* +import androidx.constraintlayout.widget.* +import androidx.core.content.* +import androidx.lifecycle.* +import androidx.recyclerview.widget.* +import com.mogo.eagle.core.utilcode.kotlin.* +import com.mogo.eagle.core.utilcode.rv.divider.* +import com.zhjt.mogo_core_function_devatools.R +import com.zhjt.mogo_core_function_devatools.status.entity.* +import com.zhjt.mogo_core_function_devatools.status.entity.Status +import com.zhjt.mogo_core_function_devatools.status.model.StatusModel +import com.zhjt.mogo_core_function_devatools.status.ui.adapter.StatusAdapter +import com.zhjt.mogo_core_function_devatools.status.ui.diff.StatusDiffCallback +import java.util.ArrayList +import kotlin.Pair + +@SuppressLint("ViewConstructor") +internal class StatusView(private val model: StatusModel, ctx: Context): ConstraintLayout(ctx) { + + companion object { + const val TAG = "StatusView" + } + + private val iv: AppCompatImageView + private val rv: RecyclerView + private val dot: View + + private var observer: Observer>>? = null + init { + LayoutInflater.from(context).inflate(R.layout.layout_status_bar, this, true) + iv = findViewById(R.id.iv) + rv = findViewById(R.id.rv) + dot = findViewById(R.id.dot) + init() + } + + private fun init() { + isClickable = true + dot.background = shape(solid = Color.RED, shape = GradientDrawable.OVAL, width = 30.PX, height = 30.PX) + iv.also { + it.background = ContextCompat.getDrawable(context, R.drawable.icon_dev_status_un_fold) + it.onClick { v -> + val expand = v.tag as? Boolean ?: false + animate(expand) + v.tag = !expand + } + } + rv.also { itx -> + itx.itemAnimator?.run { + changeDuration = 0 + addDuration = 0 + moveDuration = 0 + removeDuration = 0 + } + itx.layoutManager = GridLayoutManager(context, 3, GridLayoutManager.VERTICAL, false) + itx.background = shape(solid = Color.parseColor("#80000000"), radius = 40.PX) + itx.addItemDecoration( + CommonDividerItemDecoration.Builder() + .horizontalExternalSpace(66.PX) + .verticalExternalSpace(60.PX) + .spanCountTBCare(false) + .verticalInnerSpace(50.PX) + .horizontalInnerSpace(116.PX) + .build() + ) + val adapter = model.status.value?.let { data -> StatusAdapter(context, data.second) }?.also { adapter -> itx.adapter = adapter } + adapter?.let { _ -> + model.status.observeForever(Observer>> { data -> + Log.d("OOOO", "--- observeForever -----") + + if (data.first != null) { + dot.visibility = View.VISIBLE + } else { + dot.visibility = View.INVISIBLE + } + val old = adapter.data + Log.d(TAG, "receive update --new - data: ${data.second.joinToString(",")}") + Log.d(TAG, "receive update --old - data: ${old.joinToString(",")}") + val result = DiffUtil.calculateDiff(StatusDiffCallback(old, data.second)) + adapter.data = data.second + result.dispatchUpdatesTo(adapter) + }.also { observer = it }) + } + } + + onDetach { + observer?.also { model.status.removeObserver(it) } + } + } + + private fun animate(expand: Boolean) { + iv.animate().rotation(if (expand) 0f else -180f).setDuration(200).start() + TransitionManager.beginDelayedTransition(this, AutoTransition().setDuration(200)) + rv.visibility = if (expand) View.VISIBLE else View.INVISIBLE + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/adapter/StatusAdapter.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/adapter/StatusAdapter.kt new file mode 100644 index 0000000000..727fb1d199 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/adapter/StatusAdapter.kt @@ -0,0 +1,99 @@ +package com.zhjt.mogo_core_function_devatools.status.ui.adapter + +import android.content.* +import android.view.* +import android.widget.* +import androidx.core.content.* +import androidx.recyclerview.widget.* +import com.zhjt.mogo_core_function_devatools.* +import com.zhjt.mogo_core_function_devatools.R.drawable +import com.zhjt.mogo_core_function_devatools.status.entity.* +import com.zhjt.mogo_core_function_devatools.status.entity.IpcStatus +import com.zhjt.mogo_core_function_devatools.status.entity.Status +import com.zhjt.mogo_core_function_devatools.status.entity.TracingStatus.Tracing.* +import com.zhjt.mogo_core_function_devatools.status.ui.adapter.StatusAdapter.StatusViewHolder + +internal class StatusAdapter(val ctx: Context, var data: ArrayList): RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): StatusViewHolder = + StatusViewHolder(LayoutInflater.from(ctx).inflate(R.layout.layout_status_bar_item, parent, false)) + + override fun onBindViewHolder(holder: StatusViewHolder, position: Int) { + holder.bind(data[position]) + } + + override fun getItemCount(): Int = data.size + + internal class StatusViewHolder(item: View) : RecyclerView.ViewHolder(item) { + + private val iv: ImageView by lazy { + itemView.findViewById(R.id.iv) + } + + private val tv: TextView by lazy { + itemView.findViewById(R.id.tv) + } + + fun bind(status: Status) { + when(status) { + is IpcStatus -> { + if (status.enabled) { + iv.background = ContextCompat.getDrawable(itemView.context, drawable.icon_dev_status_ipc_enable) + } else { + iv.background = ContextCompat.getDrawable(itemView.context, drawable.icon_dev_status_ipc_disable) + } + tv.text = "工控机" + } + is CanStatus -> { + if (status.enabled) { + iv.background = ContextCompat.getDrawable(itemView.context, drawable.icon_dev_status_can_enable) + } else { + iv.background = ContextCompat.getDrawable(itemView.context, drawable.icon_dev_status_can_disable) + } + tv.text = "Can" + } + is NetStatus -> { + if (status.enabled) { + iv.background = ContextCompat.getDrawable(itemView.context, drawable.icon_dev_status_net_enable) + tv.text = status.name ?: "Wi-Fi" + } else { + iv.background = ContextCompat.getDrawable(itemView.context, drawable.icon_dev_status_net_disable) + tv.text = "Wi-Fi" + } + } + is GpsStatus -> { + if (status.enabled && status.isGranted) { + iv.background = ContextCompat.getDrawable(itemView.context, drawable.icon_dev_status_gps_enable) + } else { + iv.background = ContextCompat.getDrawable(itemView.context, drawable.icon_dev_status_gps_disable) + } + tv.text = "Gps" + } + is TracingStatus -> { + when(status.state) { + ROUTE_FAILED, TRACK_LOAD_FAIL, TRACK_NOT_EXIST, TRACK_FINDED, UNKNOWN -> { + iv.background = ContextCompat.getDrawable(itemView.context, drawable.icon_dev_status_trace_unkown) + tv.text = "未知" + } + TRACK_LOADED -> { + iv.background = ContextCompat.getDrawable(itemView.context, drawable.icon_dev_status_track_enable) + tv.text = "T" + } + ROUTE_LOADED -> { + iv.background = ContextCompat.getDrawable(itemView.context, drawable.icon_dev_status_route_enable) + tv.text = "V" + } + } + } + is RTKStatus -> { + if (status.enabled) { + iv.background = ContextCompat.getDrawable(itemView.context, drawable.icon_dev_status_rtk_enable) + } else { + iv.background = ContextCompat.getDrawable(itemView.context, drawable.icon_dev_status_rtk_disable) + } + tv.text = "RTK" + } + } + } + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/diff/StatusDiffCallback.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/diff/StatusDiffCallback.kt new file mode 100644 index 0000000000..71d80bfa97 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/diff/StatusDiffCallback.kt @@ -0,0 +1,21 @@ +package com.zhjt.mogo_core_function_devatools.status.ui.diff + +import androidx.recyclerview.widget.* +import com.zhjt.mogo_core_function_devatools.status.entity.Status + +internal class StatusDiffCallback(private val old: ArrayList, private val update: ArrayList): DiffUtil.Callback() { + + override fun getOldListSize(): Int = old.size + + override fun getNewListSize(): Int = update.size + + override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { + return true + } + + override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { + val oldStatus = old[oldItemPosition] + val updateStatus = update[newItemPosition] + return oldStatus == updateStatus + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_dev_status_can_disable.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_dev_status_can_disable.png new file mode 100644 index 0000000000000000000000000000000000000000..6b518b07f1b763aaef17ae6c39ddc057a6ed5122 GIT binary patch literal 6214 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 literal 0 HcmV?d00001 diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_dev_status_can_enable.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_dev_status_can_enable.png new file mode 100644 index 0000000000000000000000000000000000000000..302775b79400657373e932257dff00f58f8fbde5 GIT binary patch literal 10337 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 literal 0 HcmV?d00001 diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_dev_status_gps_disable.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_dev_status_gps_disable.png new file mode 100644 index 0000000000000000000000000000000000000000..3574b7d2d104c63d8e00941c53cab048e2c7e679 GIT binary patch literal 6842 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 literal 0 HcmV?d00001 diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_dev_status_gps_enable.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_dev_status_gps_enable.png new file mode 100644 index 0000000000000000000000000000000000000000..939a047a3395f97830b0609c010f586093f9a6f0 GIT binary patch literal 10522 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 literal 0 HcmV?d00001 diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_dev_status_ipc_enable.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_dev_status_ipc_enable.png new file mode 100644 index 0000000000000000000000000000000000000000..553f1a685432d492229a8ed3ccfbb283f85efb2f GIT binary patch literal 9661 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 literal 0 HcmV?d00001 diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_dev_status_net_disable.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_dev_status_net_disable.png new file mode 100644 index 0000000000000000000000000000000000000000..885b4603f045d78228be56c2f633336f8a00c10e GIT binary patch literal 7558 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 Z{|}J!w(H#k`Op9W002ovPDHLkV1jRh(zgHr literal 0 HcmV?d00001 diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_dev_status_route_enable.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_dev_status_route_enable.png new file mode 100644 index 0000000000000000000000000000000000000000..6891e2c698891010417b5a1abe81bee4e5b06b1e GIT binary patch literal 10721 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 T!*?1q00000NkvXXu0mjft*%f{ literal 0 HcmV?d00001 diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_dev_status_rtk_disable.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_dev_status_rtk_disable.png new file mode 100644 index 0000000000000000000000000000000000000000..8c73649eda7431b06079bc7e683503bb5b2e74ea GIT binary patch literal 8282 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 literal 0 HcmV?d00001 diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_dev_status_track_enable.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_dev_status_track_enable.png new file mode 100644 index 0000000000000000000000000000000000000000..43e1cff91afbc087aa94f6b42d985415bf800ed9 GIT binary patch literal 9867 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 literal 0 HcmV?d00001 diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_dev_status_un_fold.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_dev_status_un_fold.png new file mode 100644 index 0000000000000000000000000000000000000000..5bd76829ae1e163081e4a3f8bfa92ca23ff26f9a GIT binary patch literal 9649 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 + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/layout/layout_status_bar_item.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/layout_status_bar_item.xml new file mode 100644 index 0000000000..b9e7610987 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/layout_status_bar_item.xml @@ -0,0 +1,22 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-dispatch/src/main/java/com/zhjt/dispatch/DispatchAutoPilotManager.java b/core/function-impl/mogo-core-function-dispatch/src/main/java/com/zhjt/dispatch/DispatchAutoPilotManager.java index f7d0ffb66d..1c15ecad1c 100644 --- a/core/function-impl/mogo-core-function-dispatch/src/main/java/com/zhjt/dispatch/DispatchAutoPilotManager.java +++ b/core/function-impl/mogo-core-function-dispatch/src/main/java/com/zhjt/dispatch/DispatchAutoPilotManager.java @@ -334,4 +334,7 @@ public class DispatchAutoPilotManager implements IMogoOnMessageListener(), setProxyTrafficLightView(viewTrafficLightVr) setProxyLimitingSpeedView(viewLimitingVelocity) setProxyNotificationView(V2XNotificationView(view.context)) + + context?.also { + CallerDevaToolsManager.showStatusBar(it) + } } @OptIn(ExperimentalCoroutinesApi::class) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt index a1b21d7fe7..debcd6df89 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt @@ -1779,6 +1779,10 @@ class DebugSettingView @JvmOverloads constructor( } } + override fun onAutopilotNotData(timestamp: Long) { + + } + /** * 吐司提示 */ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SteeringWheelView.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SteeringWheelView.java index 548572101a..01925b91be 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SteeringWheelView.java +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SteeringWheelView.java @@ -101,6 +101,10 @@ public class SteeringWheelView extends ConstraintLayout { } private final IMoGoAutopilotStatusListener mGoAutopilotStatusListener = new IMoGoAutopilotStatusListener() { + @Override + public void onAutopilotNotData(long timestamp) { + } + @Override public void onAutopilotArriveAtStation(@org.jetbrains.annotations.Nullable MessagePad.ArrivalNotification arrivalNotification) { @@ -146,6 +150,11 @@ public class SteeringWheelView extends ConstraintLayout { }; private final IMoGoAutopilotVehicleStateListener mIMoGoAutopilotVehicleStateListener = new IMoGoAutopilotVehicleStateListener() { + @Override + public void onAutopilotNotData(long timestamp) { + + } + /** * 车辆转向灯 * @param lightSwitch diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainActivity.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainActivity.java index a148257f3d..83e663512d 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainActivity.java +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainActivity.java @@ -75,6 +75,10 @@ public class MainActivity extends MvpActivity implement FragmentStackTransactionListener, IMoGoAutopilotStatusListener { + @Override + public void onAutopilotNotData(long timestamp) { + } + protected static final String TAG = "MainActivity"; private static final int REQUEST_CODE_DIALOG = 100; @@ -473,4 +477,8 @@ public class MainActivity extends MvpActivity implement .commitAllowingStateLoss(); } + @Override + public void onPointerCaptureChanged(boolean hasCapture) { + super.onPointerCaptureChanged(hasCapture); + } } diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/smp/SmallMapFragment.java b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/smp/SmallMapFragment.java index a673435510..70dc9085bf 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/smp/SmallMapFragment.java +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/smp/SmallMapFragment.java @@ -55,6 +55,10 @@ public class SmallMapFragment extends BaseFragment SmpServiceManager.init(getContext()); } + @Override + public void onAutopilotNotData(long timestamp) { + } + @Override protected void initViews(Bundle savedInstanceState) { super.initViews(savedInstanceState); diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotStatusListener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotStatusListener.kt index 4243a28958..9d3ef5986a 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotStatusListener.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotStatusListener.kt @@ -35,6 +35,11 @@ interface IMoGoAutopilotStatusListener { */ fun onAutopilotGuardian(guardianInfo: MogoReportMsg.MogoReportMessage?) {} + /** + * 工控机底盘没有返回数据 + */ + fun onAutopilotNotData(timestamp: Long) {} + companion object { /** diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotVehicleStateListener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotVehicleStateListener.kt index a980b68591..97f8784495 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotVehicleStateListener.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotVehicleStateListener.kt @@ -30,4 +30,9 @@ interface IMoGoAutopilotVehicleStateListener { * @param gear 档位 */ fun onAutopilotGearData(gear: Chassis.GearPosition) + + /** + * 底盘没有返回数据 + */ + fun onAutopilotNotData(timestamp: Long) } \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt index ab690871e0..983ffb7f21 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt @@ -99,4 +99,9 @@ interface IDevaToolsProvider : IProvider { * 下载指定包 */ fun downLoadPackage(downloadKey: String, downloadUrl: String) + + /** + * 展示状态栏 + */ + fun showStatusBar(ctx: Context) } \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotStatusListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotStatusListenerManager.kt index 9c27fd9453..f76f04e807 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotStatusListenerManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotStatusListenerManager.kt @@ -4,6 +4,7 @@ import androidx.annotation.Nullable import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener import com.mogo.eagle.core.function.call.base.CallerBase +import com.mogo.eagle.core.utilcode.kotlin.* import com.mogo.eagle.core.utilcode.util.GsonUtils import mogo.telematics.pad.MessagePad import mogo_msg.MogoReportMsg @@ -23,6 +24,9 @@ object CallerAutoPilotStatusListenerManager : CallerBase() { private val M_AUTOPILOT_STATUS_LISTENERS: ConcurrentHashMap = ConcurrentHashMap() + @Volatile + private var autoPilotMessageCode: String = "" + /** * 查询AutoPilot状态 */ @@ -37,6 +41,8 @@ object CallerAutoPilotStatusListenerManager : CallerBase() { return GsonUtils.toJson(mAutopilotStatusInfo) } + fun getAutoPilotReportMessageCode(): String = autoPilotMessageCode + /** * 通过Gnss定位更新来同步更新自动驾驶状态 */ @@ -163,6 +169,7 @@ object CallerAutoPilotStatusListenerManager : CallerBase() { M_AUTOPILOT_STATUS_LISTENERS.forEach { val tag = it.key val listener = it.value + autoPilotMessageCode = guardianInfo?.code ?: "" listener.onAutopilotGuardian(guardianInfo) } } diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutopilotCarStatusListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutopilotCarStatusListenerManager.kt index cceb3e912d..6429455cbd 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutopilotCarStatusListenerManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutopilotCarStatusListenerManager.kt @@ -17,6 +17,8 @@ object CallerAutopilotCarStatusListenerManager : CallerBase() { private val M_AUTOPILOT_STATUS_LISTENERS: ConcurrentHashMap = ConcurrentHashMap() + @Volatile + private var gnssInfo: MessagePad.GnssInfo? = null /** * 添加 ADAS车辆状态&定位 监听 @@ -56,12 +58,18 @@ object CallerAutopilotCarStatusListenerManager : CallerBase() { } } + + fun getCurrentGnssInfo():MessagePad.GnssInfo? { + return gnssInfo + } + /** * 车辆状态数据 回调 * @param gnssInfo */ @Synchronized fun invokeAutopilotCarStateData(gnssInfo: MessagePad.GnssInfo?) { + this.gnssInfo = gnssInfo M_AUTOPILOT_STATUS_LISTENERS.forEach { val tag = it.key val listener = it.value diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutopilotVehicleStateListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutopilotVehicleStateListenerManager.kt index f08725d29c..2191ea3db8 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutopilotVehicleStateListenerManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutopilotVehicleStateListenerManager.kt @@ -113,4 +113,14 @@ object CallerAutopilotVehicleStateListenerManager : CallerBase() { fun getAutopilotTimeStamp(): Long { return this.timeStamp } + + /** + * 底盘没有返回数据 + */ + fun invokeAutopilotNotData(timestamp: Long) { + M_AUTOPILOT_VEHICLE_LISTENERS.forEach{ + val listener = it.value + listener.onAutopilotNotData(timestamp) + } + } } \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt index 527c0ec6d2..ebe2f519d0 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt @@ -136,4 +136,11 @@ object CallerDevaToolsManager { fun downLoadPackage(downloadKey: String, downloadUrl: String) { devaToolsProviderApi?.downLoadPackage(downloadKey, downloadUrl) } + + /** + * 展示状态栏 + */ + fun showStatusBar(ctx: Context) { + devaToolsProviderApi?.showStatusBar(ctx) + } } \ No newline at end of file diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/kotlin/Extensions.kt b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/kotlin/Extensions.kt index e88d988279..d1d75f6b85 100644 --- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/kotlin/Extensions.kt +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/kotlin/Extensions.kt @@ -8,8 +8,7 @@ import android.graphics.drawable.GradientDrawable import android.text.* import android.text.style.ForegroundColorSpan import android.util.TypedValue -import android.view.MotionEvent -import android.view.View +import android.view.* import android.widget.EditText import android.widget.TextView import androidx.annotation.ColorInt @@ -40,20 +39,38 @@ val T.lifecycleOwner: LifecycleOwner if (it.currentState.isAtLeast(Lifecycle.State.INITIALIZED)) { it.currentState = Lifecycle.State.CREATED } + + if (it.currentState.isAtLeast(Lifecycle.State.CREATED)) { + it.currentState = Lifecycle.State.STARTED + } + + if (it.currentState.isAtLeast(Lifecycle.State.STARTED)) { + it.currentState = Lifecycle.State.RESUMED + } } } + + addOnAttachStateChangeListener(object : View.OnAttachStateChangeListener { override fun onViewAttachedToWindow(v: View?) { lifecycle.let { if (it.currentState.isAtLeast(Lifecycle.State.INITIALIZED)) { it.currentState = Lifecycle.State.CREATED } + + if (it.currentState.isAtLeast(Lifecycle.State.CREATED)) { + it.currentState = Lifecycle.State.STARTED + } + + if (it.currentState.isAtLeast(Lifecycle.State.STARTED)) { + it.currentState = Lifecycle.State.RESUMED + } } } override fun onViewDetachedFromWindow(v: View?) { lifecycle.let { - if (it.currentState.isAtLeast(Lifecycle.State.CREATED)) { + if (it.currentState.isAtLeast(Lifecycle.State.RESUMED)) { this@lifecycleOwner.removeOnAttachStateChangeListener(this) it.currentState = Lifecycle.State.DESTROYED } @@ -159,7 +176,6 @@ val Int.PX: Int val Int.SP: Int get() = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, this.toFloat(), Utils.getApp().resources.displayMetrics).toInt() - fun T.watch(@IntRange(from = 1) maxCharCount: Int, onCountChanged:((count: Int) -> Unit)? = null, onTextChanged:((editable: Editable?) -> Unit)? = null, onReachMaxCountAction:((text: T) -> Unit)? = null, onGetFocus:((text: T) -> Unit)? = null) { doAfterTextChanged { itx -> onTextChanged?.invoke(itx) diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/rv/divider/CommonDividerItemDecoration.kt b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/rv/divider/CommonDividerItemDecoration.kt index 4b30d692f9..62a5dfd1d2 100644 --- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/rv/divider/CommonDividerItemDecoration.kt +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/rv/divider/CommonDividerItemDecoration.kt @@ -2,7 +2,7 @@ package com.mogo.eagle.core.utilcode.rv.divider import android.graphics.Canvas import android.graphics.Rect -import android.util.Pair +import android.util.* import android.view.View import androidx.annotation.IntRange import androidx.recyclerview.widget.GridLayoutManager @@ -84,17 +84,23 @@ class CommonDividerItemDecoration internal constructor(builder: Builder) : ItemD } } else { val averageDistance = (((spanCount - 1) * mHorizontalInnerSpace + 2 * mHorizontalExternalSpace + deltaHL + deltaHR) * 1.0f / spanCount).toInt() + Log.d("UUUU", "step::0::$averageDistance: lastRight: $mLastRight : state: $state " ) if (spanIndex == 0) { outRect.left = mHorizontalExternalSpace + deltaHL outRect.right = averageDistance - outRect.left mLastRight = outRect.right + Log.d("UUUU", "step::1::$averageDistance: lastRight: $mLastRight" ) } else if (spanIndex == spanCount - 1) { outRect.right = mHorizontalExternalSpace + deltaHR outRect.left = averageDistance - outRect.right + Log.d("UUUU", "step::2::$averageDistance: lastRight: $mLastRight ::outRect.left: ${outRect.left}" ) } else { outRect.left = mHorizontalInnerSpace - mLastRight outRect.right = averageDistance - outRect.left - mLastRight = outRect.right + if (state.didStructureChange()) { + mLastRight = outRect.right + } + Log.d("UUUU", "step::2::$averageDistance: lastRight: $mLastRight ::outRect.left: ${outRect.left}" ) } } //所在的行数 if (lookUp.getSpanGroupIndex(childPosition, spanCount) == lookUp.getSpanGroupIndex(mFromPosition, spanCount)) { @@ -131,7 +137,9 @@ class CommonDividerItemDecoration internal constructor(builder: Builder) : ItemD } else { outRect.top = mVerticalInnerSpace - mLastBottom outRect.bottom = averageDistance - outRect.top - mLastBottom = outRect.bottom + if (state.didStructureChange()) { + mLastBottom = outRect.bottom + } } } if (lookUp.getSpanGroupIndex(childPosition, spanCount) == lookUp.getSpanGroupIndex(mFromPosition, spanCount)) { //第一列 @@ -222,7 +230,9 @@ class CommonDividerItemDecoration internal constructor(builder: Builder) : ItemD } else { outRect.left = mHorizontalInnerSpace - mLastRight outRect.right = averageDistance - outRect.left - mLastRight = outRect.right + if (state.didStructureChange()) { + mLastRight = outRect.right + } } } if (childPosition == mFromPosition) { @@ -279,7 +289,9 @@ class CommonDividerItemDecoration internal constructor(builder: Builder) : ItemD } else { outRect.top = mVerticalInnerSpace - mLastBottom outRect.bottom = averageDistance - outRect.top - mLastBottom = outRect.bottom + if (state.didStructureChange()) { + mLastBottom = outRect.bottom + } } } if (childPosition == mFromPosition) { diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/PermissionUtils.java b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/PermissionUtils.java index bacf93d9c3..229b6dd5f8 100755 --- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/PermissionUtils.java +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/PermissionUtils.java @@ -1,5 +1,6 @@ package com.mogo.eagle.core.utilcode.util; +import android.Manifest; import android.annotation.TargetApi; import android.app.Activity; import android.content.Intent; @@ -56,6 +57,7 @@ public final class PermissionUtils { private static SimpleCallback sSimpleCallback4WriteSettings; private static SimpleCallback sSimpleCallback4DrawOverlays; + private static SimpleCallback sSimpleCallback4AccessFineLocation; /** * Return the permissions used in application. @@ -152,6 +154,19 @@ public final class PermissionUtils { PermissionActivityImpl.start(PermissionActivityImpl.TYPE_WRITE_SETTINGS); } + public static void requestAccessFineLocation(final SimpleCallback callback) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (isGranted(Manifest.permission.ACCESS_FINE_LOCATION)) { + if (callback != null) { + callback.onGranted(); + } + return; + } + sSimpleCallback4AccessFineLocation = callback; + PermissionActivityImpl.start(PermissionActivityImpl.TYPE_ACCESS_FINE_LOCATION); + } + } + @TargetApi(Build.VERSION_CODES.M) private static void startWriteSettingsActivity(final Activity activity, final int requestCode) { Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS); @@ -424,6 +439,7 @@ public final class PermissionUtils { private static final int TYPE_RUNTIME = 0x01; private static final int TYPE_WRITE_SETTINGS = 0x02; private static final int TYPE_DRAW_OVERLAYS = 0x03; + private static final int TYPE_ACCESS_FINE_LOCATION = 0x04; private static int currentRequestCode = -1; @@ -483,6 +499,9 @@ public final class PermissionUtils { } else if (type == TYPE_DRAW_OVERLAYS) { currentRequestCode = TYPE_DRAW_OVERLAYS; startOverlayPermissionActivity(activity, TYPE_DRAW_OVERLAYS); + } else if (type == TYPE_ACCESS_FINE_LOCATION) { + currentRequestCode = TYPE_ACCESS_FINE_LOCATION; + startOverlayPermissionActivity(activity, TYPE_ACCESS_FINE_LOCATION); } else { activity.finish(); Log.e("PermissionUtils", "type is wrong."); @@ -550,6 +569,15 @@ public final class PermissionUtils { sSimpleCallback4DrawOverlays.onDenied(); } sSimpleCallback4DrawOverlays = null; + } else if (requestCode == TYPE_ACCESS_FINE_LOCATION) { + if (sSimpleCallback4AccessFineLocation == null) { + return; + } + if (isGranted(Manifest.permission.ACCESS_FINE_LOCATION)) { + sSimpleCallback4AccessFineLocation.onGranted(); + } else { + sSimpleCallback4AccessFineLocation.onDenied(); + } } } } diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/routeoverlay/MogoRouteOverlayManager.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/routeoverlay/MogoRouteOverlayManager.java index 2a9f94dcec..a59d3c5de3 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/routeoverlay/MogoRouteOverlayManager.java +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/routeoverlay/MogoRouteOverlayManager.java @@ -210,4 +210,7 @@ public class MogoRouteOverlayManager implements } + @Override + public void onAutopilotNotData(long timestamp) { + } }