From 6ff58cf6547c6f5e97759f325df8761b27469f9d Mon Sep 17 00:00:00 2001 From: renwj Date: Fri, 28 Jun 2024 09:45:37 +0800 Subject: [PATCH] =?UTF-8?q?[6.5.0][=E8=A7=86=E8=A7=92=E5=88=87=E6=8D=A2]?= =?UTF-8?q?=20=E4=BB=A3=E7=A0=81=E9=87=8D=E6=9E=84+=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=9C=BA=E6=99=AF=E5=8F=98=E5=8C=96=E5=9B=9E=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../biz/v2x/v2n/pnc/V2NIdentifyDrawer.kt | 9 +- .../scene/road/V2XRoadEventScenario.java | 2 +- .../datacenter/obu/MogoObuDcCombineManager.kt | 5 +- .../obu/MogoPrivateObuNewManager.kt | 5 +- .../angle/MoGoVisualAngleChangeProvider.kt | 215 ++++-------------- .../core/function/angle/scenes/CrossRoad.kt | 10 +- .../core/function/angle/scenes/Default.kt | 8 +- .../core/function/angle/scenes/LongSight.kt | 22 ++ .../core/function/angle/scenes/RoadEvent.kt | 14 +- .../angle/IMoGoVisualAngleChangeProvider.kt | 9 + .../core/function/api/map/angle/Scenes.kt | 2 + .../call/map/CallerVisualAngleManager.kt | 9 + 12 files changed, 121 insertions(+), 189 deletions(-) create mode 100644 core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/angle/scenes/LongSight.kt diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/pnc/V2NIdentifyDrawer.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/pnc/V2NIdentifyDrawer.kt index 99908311bd..a2faa7096c 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/pnc/V2NIdentifyDrawer.kt +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/pnc/V2NIdentifyDrawer.kt @@ -45,6 +45,7 @@ import mogo.v2x.MogoV2X import mogo.v2x.MogoV2X.RSI_PB import mogo.v2x.MogoV2X.RTEData_PB import java.lang.Math.abs +import java.util.concurrent.TimeUnit.SECONDS /** * V2N上车相关事件绘制 @@ -295,13 +296,7 @@ internal object V2NIdentifyDrawer { override fun onShow() { super.onShow() runCatching { CallerHmiManager.notifyXiaoZhiStatusChanged(V2N(EventTypeEnumNew.getEnumType(poiType)), State.START) } - CallerVisualAngleManager.changeAngle( - RoadEvent( - lon, - lat, - car.heading - ) - ) + CallerVisualAngleManager.changeAngle(RoadEvent(2, SECONDS)) } override fun onDismiss() { diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/scenario/scene/road/V2XRoadEventScenario.java b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/scenario/scene/road/V2XRoadEventScenario.java index e5470cf1e5..3b91f91e88 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/scenario/scene/road/V2XRoadEventScenario.java +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/scenario/scene/road/V2XRoadEventScenario.java @@ -171,7 +171,7 @@ public class V2XRoadEventScenario extends AbsV2XScenario imp if (isNeedChangeAngle()) { MarkerLocation location = content.getLocation(); if (location != null) { - CallerVisualAngleManager.INSTANCE.changeAngle(new RoadEvent(content.getLocation().getLon(), content.getLocation().getLat(), content.getLocation().getAngle(), false)); + CallerVisualAngleManager.INSTANCE.changeAngle(new RoadEvent(2, TimeUnit.SECONDS)); } } if (entity.isNeedAddLine() && !EventTypeEnumNew.TYPE_SOCKET_ROAD_CONGESTION.getPoiType().equals(content.getPoiType())) { diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoObuDcCombineManager.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoObuDcCombineManager.kt index cbb6576917..d0df8332fe 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoObuDcCombineManager.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoObuDcCombineManager.kt @@ -9,6 +9,7 @@ import com.mogo.eagle.core.data.enums.EventTypeEnumNew import com.mogo.eagle.core.data.enums.TrafficLightEnum import com.mogo.eagle.core.data.enums.WarningDirectionEnum import com.mogo.eagle.core.function.angle.scenes.CrossRoad +import com.mogo.eagle.core.function.angle.scenes.Default import com.mogo.eagle.core.function.api.datacenter.obu.IMoGoObuWarningMapListener import com.mogo.eagle.core.function.api.datacenter.obu.IMoGoObuWarningRsiListener import com.mogo.eagle.core.function.api.datacenter.obu.IMoGoObuWarningRsmListener @@ -416,12 +417,12 @@ class MogoObuDcCombineManager private constructor() : IMoGoObuWarningRsiListener showWarning(v2xType, alertContent, ttsContent, direction, object : IMoGoWarningStatusListener { override fun onShow() { - CallerVisualAngleManager.changeAngle(CrossRoad(true)) + CallerVisualAngleManager.changeAngle(CrossRoad(2)) } override fun onDismiss() { super.onDismiss() - CallerVisualAngleManager.changeAngle(CrossRoad(false)) + CallerVisualAngleManager.changeAngle(Default()) } }) } diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoPrivateObuNewManager.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoPrivateObuNewManager.kt index b555456f85..c0c6211fd7 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoPrivateObuNewManager.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoPrivateObuNewManager.kt @@ -7,6 +7,7 @@ import com.mogo.eagle.core.data.config.HmiBuildConfig import com.mogo.eagle.core.data.enums.* import com.mogo.eagle.core.data.obu.MogoObuConst import com.mogo.eagle.core.function.angle.scenes.CrossRoad +import com.mogo.eagle.core.function.angle.scenes.Default import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener import com.mogo.eagle.core.function.api.map.angle.* import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager @@ -967,14 +968,14 @@ class MogoPrivateObuNewManager private constructor() : OnUpgradeListener { override fun onShow() { if (appId == MogoObuShowConstants.V2X_WARNING_TYPE.BSW.toString()) { //盲区预警,展示近视角 - CallerVisualAngleManager.changeAngle(CrossRoad(true)) + CallerVisualAngleManager.changeAngle(CrossRoad(2)) } } override fun onDismiss() { if (appId == MogoObuShowConstants.V2X_WARNING_TYPE.BSW.toString()) { //盲区预警,取消近视角 - CallerVisualAngleManager.changeAngle(CrossRoad(false)) + CallerVisualAngleManager.changeAngle(Default()) } } }, diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/angle/MoGoVisualAngleChangeProvider.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/angle/MoGoVisualAngleChangeProvider.kt index 9378ca4ffe..402840435a 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/angle/MoGoVisualAngleChangeProvider.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/angle/MoGoVisualAngleChangeProvider.kt @@ -1,5 +1,4 @@ package com.mogo.eagle.core.function.angle - import android.content.* import android.os.* import android.util.* @@ -7,27 +6,25 @@ import androidx.lifecycle.* import androidx.lifecycle.Lifecycle.Event import androidx.lifecycle.Lifecycle.Event.ON_DESTROY import com.alibaba.android.arouter.facade.annotation.Route -import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.constants.MogoServicePaths import com.mogo.eagle.core.data.map.* import com.mogo.eagle.core.function.angle.scenes.CrossRoad import com.mogo.eagle.core.function.angle.scenes.Default -import com.mogo.eagle.core.function.angle.scenes.RoadEvent import com.mogo.eagle.core.function.api.map.angle.* +import com.mogo.eagle.core.function.api.map.angle.IMoGoVisualAngleChangeProvider.OnMoGoVisualAngleSceneChangeListener import com.mogo.eagle.core.function.api.map.angle.Scene import com.mogo.eagle.core.function.api.map.road.IMoGoMapRoadListener import com.mogo.eagle.core.function.call.autopilot.* import com.mogo.eagle.core.function.call.map.* import com.mogo.eagle.core.utilcode.kotlin.* -import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.zhidaoauto.map.data.road.StopLine -import com.zhidaoauto.map.sdk.open.MapAutoApi import com.zhidaoauto.map.sdk.open.common.tools.MapTools import kotlinx.coroutines.* -import java.util.* -import java.util.concurrent.Executors +import kotlinx.coroutines.android.asCoroutineDispatcher +import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.atomic.* + @Route(path = MogoServicePaths.PATH_VISUAL_ANGLE) class MoGoVisualAngleChangeProvider: IMoGoVisualAngleChangeProvider { @@ -35,31 +32,15 @@ class MoGoVisualAngleChangeProvider: IMoGoVisualAngleChangeProvider { private const val TAG = "VisualAngleChange" } + private val listeners by lazy { ConcurrentHashMap>() } + private val triggerLocation = AtomicReference() private val distanceOfCarToStopLine = AtomicReference(0.0) private val travelled by lazy { AtomicReference(0.0) } - @Volatile - private var roadEventFlag = false - - /** - * 业务实体,不对外暴露 - * @param target: 目标场景 - * @param isDisplay: 是否正在展示 - * @param triggerTime: 触发时间 - */ - private data class Record(val target: Scene, var isDisplay: Boolean = false, var triggerTime: Long): Comparable { - override fun compareTo(other: Record): Int { - //如果时间一样,优先级越高,越靠近堆顶 - return other.target.priority - target.priority - } - } - - private val queue by lazy { - PriorityQueue() - } + private val prevScene by lazy { AtomicReference() } private val listener = object : IMoGoMapRoadListener { private val roadId = AtomicReference() @@ -90,7 +71,7 @@ class MoGoVisualAngleChangeProvider: IMoGoVisualAngleChangeProvider { } } if (triggerClose) { - changeAngle(CrossRoad(false)) + changeAngle(Default()) } } @@ -102,7 +83,7 @@ class MoGoVisualAngleChangeProvider: IMoGoVisualAngleChangeProvider { triggerRoadId.set(this.roadId.get()) distanceOfCarToStopLine.set(info.distance) triggerLocation.set(CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02()) - changeAngle(CrossRoad(true)) + changeAngle(CrossRoad(2)) } } } @@ -132,24 +113,16 @@ class MoGoVisualAngleChangeProvider: IMoGoVisualAngleChangeProvider { @Volatile private var hasCrossRoad = false - private var scope: CoroutineScope = acquireScope() - @Synchronized - get() { - if (field.isActive) { - return field - } - val scope = acquireScope() - field = scope - return field - } - - private var defaultDelayJob: Job? = null private fun acquireScope(): CoroutineScope { - return CoroutineScope(Executors.newSingleThreadExecutor().asCoroutineDispatcher() + SupervisorJob()) + val handler = HandlerThread("visual-angle-change").let { it.start(); Handler(it.looper) } + return CoroutineScope(handler.asCoroutineDispatcher() + SupervisorJob()) } + @Volatile + private var prevJob: Job? = null + @Volatile private var mLevel:Boolean = false @@ -161,146 +134,46 @@ class MoGoVisualAngleChangeProvider: IMoGoVisualAngleChangeProvider { if(mLevel){ return } - val triggerTime = SystemClock.elapsedRealtime() + prevJob?.safeCancel() scope.launch { - Log.d(TAG, "--- 1 ---") - val displayed = getDisplayed() - if (displayed == null) { - Log.d(TAG, "--- 2 ---") - if (scene is CrossRoad) { - if (!scene.open) { - changeAngle(Default()) - return@launch - } - } - doRealVisualAngleChange(triggerTime, scene, null) - } else { - val prev = displayed.target - Log.d(TAG, "--- 3 --- old: $prev -> cur: $scene") - val prevTriggerTime = displayed.triggerTime - if (scene !is Default && prev.priority > scene.priority && (prev is RoadEvent)) { - val displayDuration = triggerTime - prevTriggerTime - Log.d(TAG, "--- 4 ---:场景[$prev], 已展示时长: duration: $displayDuration") - if (displayDuration < prev.displayThreshold) { - Log.d(TAG, "--- 5 --- 场景[$prev]:仍在保护展示时长内,直接return") - return@launch - } else { - Log.d(TAG, "--- 6 --- 场景[$prev]:已过保护展示时长,从展示的队列中移除,显示默认视角") - queue -= displayed - changeAngle(Default()) - return@launch - } - } - if (prev is CrossRoad && scene is CrossRoad) { - val isOpen = scene.open - if (!isOpen) { - Log.d(TAG, "--- 8 --- old: $prev -> cur: $scene") - queue -= displayed - changeAngle(Default()) - return@launch - } - } - if (prev.priority == scene.priority) { - Log.d(TAG, "--- 9 --- 场景[$prev]正在展示,尚未收到关闭,优先级一致,直接return") - return@launch - } - if (prev.priority > scene.priority && prev.displayThreshold < 0) { - Log.d(TAG, "--- 10 --- 场景[$prev]正在展示,尚未收到关闭,场景,依然展示当前场景,直接return") - return@launch - } - doRealVisualAngleChange(triggerTime, scene, displayed) - } - } - } - - private fun CoroutineScope.doRealVisualAngleChange(triggerTime: Long, target: Scene, displayed: Record? = null) { - if (target is Default) { - Log.d(TAG, "--- doRealVisualAngleChange --- 1 ---") - displayed?.also { - queue -= it - } - defaultDelayJob?.safeCancel() - launch { - val delay = target.unit.toMillis(target.delay) - Log.d(TAG, "--- doRealVisualAngleChange --- 2 ---") + val delay = scene.delay + if (delay > 0) { delay(delay) - Log.d(TAG, "--- doRealVisualAngleChange --- 3 ---") - doChangeAngle(Record(target, triggerTime = triggerTime), displayed) - }.also { itx -> - itx.invokeOnCompletion { - if (it is CancellationException) { - Log.d(TAG, "--- doRealVisualAngleChange --- 4 ---") - } - } - defaultDelayJob = itx - } - } else { - Log.d(TAG, "--- doRealVisualAngleChange --- 5 ---") - defaultDelayJob?.safeCancel() - if (displayed == null || displayed.target.priority <= target.priority) { - Log.d(TAG, "--- doRealVisualAngleChange --- 6 ---") - displayed?.also { - queue -= it - } - if (target is CrossRoad) { - if (!target.open) { - Log.d(TAG, "--- doRealVisualAngleChange --- 8 ---") - changeAngle(Default()) - return - } - } - Log.d(TAG, "--- doRealVisualAngleChange --- 10 ---") - doChangeAngle(Record(target, triggerTime = triggerTime), displayed) } + + doChangeAngle(scene) + }.also { + prevJob = it } } - private fun doChangeAngle(target: Record, previous: Record? = null) { - val angle = target.target.angle + private fun doChangeAngle(target: Scene) { + val angle = target.angle CallerMapUIServiceManager.getMapUIController()?.also { - Log.d(TAG, "--- doChangeAngle ---: ${target.target}") - if (target.target !is Default) { - target.isDisplay = true - synchronized(queue) { - queue += target - } - } - if (target.target is Default && roadEventFlag) { - roadEventFlag = false - it.setLockMode(true) - } - if (target.target is RoadEvent) { - //taxi乘客屏,使用的新地图效果,切了视角也看不到 - if (!AppIdentityModeUtils.isTaxiPassenger(FunctionBuildConfig.appIdentityMode)) { - roadEventFlag = true - it.setLockMode(false) - /** - * var center = mapAutoView.getCurrentLonLatPoint() - * var target = LonLatPoint(112.57295762931203, 26.823537024568793) - * var angle = MapAutoApi.getAngle(center.longitude,center.latitude,target.longitude,target.latitude) - */ - val isGps = target.target.isGps - val car = if (isGps) CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() else CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02() - val rotateAngle = MapAutoApi.getAngle(car.longitude, car.latitude, target.target.poi_lon, target.target.poi_lat) - Log.d(TAG, "angle->:$rotateAngle") - it.animateTo(0.0 ,0.0,1f, -rotateAngle,11.5f,12f,3000,target.target.isGps) - } - } else { - if (target.target is Default && previous != null && (previous.target is RoadEvent)) { - Log.d(TAG, "==== doChangeAngle === 1 ===") - if (AppIdentityModeUtils.isTaxiPassenger(FunctionBuildConfig.appIdentityMode)) { - Log.d(TAG, "==== doChangeAngle === 2 ===") - return - } - } + Log.d(TAG, "--- doChangeAngle ---: $target") + val prev = prevScene.get() + try { it.changeMapVisualAngle(angle, null) + } finally { + if (prev == null || prev.javaClass != target.javaClass) { + notifyChanged(target) + } + prevScene.set(target) } } } - /** - * 是否有正在展示的 - */ - @Synchronized - private fun getDisplayed() = queue.firstOrNull() + override fun addListener(tag: String, listener: OnMoGoVisualAngleSceneChangeListener) { + listeners.getOrPut(tag) { ArrayList() }.takeIf { !it.contains(listener) }?.add(listener) + } + + override fun removeListener(tag: String) { + listeners.remove(tag) + } + + private fun notifyChanged(scene: Scene) { + for (listener in listeners.values.flatten()) { + listener.onSceneChanged(scene) + } + } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/angle/scenes/CrossRoad.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/angle/scenes/CrossRoad.kt index 88cc360870..88d0d002f4 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/angle/scenes/CrossRoad.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/angle/scenes/CrossRoad.kt @@ -7,7 +7,7 @@ import com.mogo.map.uicontroller.VisualAngleMode.MAP_STYLE_VR_ANGLE_CROSS /** * 十字路口 */ -class CrossRoad(var open: Boolean = false): Scene { +class CrossRoad(private val delayTime: Long): Scene { override val angle: VisualAngleMode get() = MAP_STYLE_VR_ANGLE_CROSS @@ -15,7 +15,13 @@ class CrossRoad(var open: Boolean = false): Scene { override val displayThreshold: Long get() = -1 + override val delay: Long + get() = delayTime + + override val isCanSwitch: Boolean + get() = false + override fun toString(): String { - return "CrossRoad(open: ${open}, priority=${priority}, displayThreshold: ${displayThreshold}, priority=${priority})" + return "CrossRoad(delayTime=${delayTime}, priority=${priority}, displayThreshold: ${displayThreshold}, priority=${priority})" } } diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/angle/scenes/Default.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/angle/scenes/Default.kt index b9fefc1db2..233246fcd6 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/angle/scenes/Default.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/angle/scenes/Default.kt @@ -11,7 +11,7 @@ import java.util.concurrent.TimeUnit * @param delay: 表示多少稍后,默认值为2 * @param unit: 时间单位,默认为秒 */ -class Default(val delay: Long = 2, val unit: TimeUnit = TimeUnit.SECONDS): Scene { +class Default(val delayTime: Long = 2, val unit: TimeUnit = TimeUnit.SECONDS): Scene { override val angle: VisualAngleMode get() = CallerMapUIServiceManager.getMapUIController()?.getVrAngleDefaultMode() ?: MODE_MEDIUM_SIGHT @@ -21,6 +21,12 @@ class Default(val delay: Long = 2, val unit: TimeUnit = TimeUnit.SECONDS): Scene override val displayThreshold: Long get() = 0 + override val delay: Long + get() = unit.toMillis(delayTime) + + override val isCanSwitch: Boolean + get() = true + override fun toString(): String { return "Default(delay=$delay, unit=$unit, angle=$angle, priority=$priority)" } diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/angle/scenes/LongSight.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/angle/scenes/LongSight.kt new file mode 100644 index 0000000000..55cba3b488 --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/angle/scenes/LongSight.kt @@ -0,0 +1,22 @@ +package com.mogo.eagle.core.function.angle.scenes + +import com.mogo.eagle.core.function.api.map.angle.Scene +import com.mogo.map.uicontroller.VisualAngleMode +import com.mogo.map.uicontroller.VisualAngleMode.MODE_LONG_SIGHT +import java.util.concurrent.TimeUnit + +class LongSight(private val delayTime: Long, private val unit: TimeUnit = TimeUnit.SECONDS): Scene { + + override val angle: VisualAngleMode + get() = MODE_LONG_SIGHT + override val priority: Int + get() = 0 + override val displayThreshold: Long + get() = 0 + + override val delay: Long + get() = unit.toMillis(delayTime) + + override val isCanSwitch: Boolean + get() = true +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/angle/scenes/RoadEvent.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/angle/scenes/RoadEvent.kt index 052824749d..7647705482 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/angle/scenes/RoadEvent.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/angle/scenes/RoadEvent.kt @@ -1,22 +1,30 @@ package com.mogo.eagle.core.function.angle.scenes import com.mogo.eagle.core.function.api.map.angle.Scene +import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager import com.mogo.map.uicontroller.VisualAngleMode +import com.mogo.map.uicontroller.VisualAngleMode.MODE_MEDIUM_SIGHT import java.util.concurrent.TimeUnit /** * 道路事件 */ -class RoadEvent(val poi_lon: Double, val poi_lat: Double, val poi_angle: Double, val isGps: Boolean = true): Scene { +class RoadEvent(private val delayTime: Long, private val unit: TimeUnit): Scene { - override val angle: VisualAngleMode = VisualAngleMode.MODE_LONG_SIGHT + override val angle: VisualAngleMode = CallerMapUIServiceManager.getMapUIController()?.getVrAngleDefaultMode() ?: MODE_MEDIUM_SIGHT override val priority: Int = 5 override val displayThreshold: Long get() = TimeUnit.SECONDS.toMillis(8) + override val delay: Long + get() = unit.toMillis(delayTime) + override fun toString(): String { - return "RoadEvent(priority=${priority}, displayThreshold: ${displayThreshold}, priority=${priority}, lon: $poi_lon, lat: $poi_lat, angle: $poi_angle)" + return "RoadEvent(priority=${priority}, displayThreshold: ${displayThreshold}, priority=${priority}" } + + override val isCanSwitch: Boolean + get() = true } \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/angle/IMoGoVisualAngleChangeProvider.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/angle/IMoGoVisualAngleChangeProvider.kt index a91757137d..dd71253bfd 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/angle/IMoGoVisualAngleChangeProvider.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/angle/IMoGoVisualAngleChangeProvider.kt @@ -7,4 +7,13 @@ interface IMoGoVisualAngleChangeProvider: IProvider { fun updateLongSightLevel(level: Boolean) fun changeAngle(scene: Scene) + + fun addListener(tag: String, listener: OnMoGoVisualAngleSceneChangeListener) + + fun removeListener(tag: String) + + interface OnMoGoVisualAngleSceneChangeListener { + + fun onSceneChanged(scene: Scene) + } } \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/angle/Scenes.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/angle/Scenes.kt index 7f559a3e82..81716acbcb 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/angle/Scenes.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/angle/Scenes.kt @@ -6,6 +6,8 @@ interface IAttach { val angle: VisualAngleMode val priority: Int val displayThreshold: Long //最大展示时长 > 0; 表示最长展示多长时间, -1 表示,一直展示,直到触发默认视角, 0: 默认视角专用值, + val delay: Long // 延迟多长时间切换 + val isCanSwitch: Boolean // 是否可切换 } diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerVisualAngleManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerVisualAngleManager.kt index 93bb9908dc..d8a7e0031d 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerVisualAngleManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerVisualAngleManager.kt @@ -4,6 +4,7 @@ import android.util.Log import com.alibaba.android.arouter.launcher.* import com.mogo.eagle.core.data.constants.* import com.mogo.eagle.core.function.api.map.angle.* +import com.mogo.eagle.core.function.api.map.angle.IMoGoVisualAngleChangeProvider.OnMoGoVisualAngleSceneChangeListener /** @@ -28,4 +29,12 @@ object CallerVisualAngleManager { fun updateLongSightLevel(level: Boolean) { provider?.updateLongSightLevel(level) } + + fun addListener(tag: String, listener: OnMoGoVisualAngleSceneChangeListener) { + provider?.addListener(tag, listener) + } + + fun removeListener(tag: String) { + provider?.removeListener(tag) + } } \ No newline at end of file