diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/feedback/biz/adapter/vh/BadCaseFBViewHolder.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/feedback/biz/adapter/vh/BadCaseFBViewHolder.kt index 5a7acc13f0..8a995d6011 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/feedback/biz/adapter/vh/BadCaseFBViewHolder.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/feedback/biz/adapter/vh/BadCaseFBViewHolder.kt @@ -26,6 +26,7 @@ import com.zhjt.mogo_core_function_devatools.badcase.repository.net.api.entity.B import com.zhjt.mogo_core_function_devatools.feedback.biz.adapter.vh.base.FeedbackViewHolder import com.zhjt.mogo_core_function_devatools.feedback.biz.bean.Feedback.BadCase import com.zhjt.mogo_core_function_devatools.feedback.callback.IFeedbackCallback +import kotlin.Int.Companion @SuppressLint("SetTextI18n") @@ -78,6 +79,8 @@ internal class BadCaseFBViewHolder(cb: IFeedbackCallback?, parent: ViewGroup): F } return@setOnEditorActionListener false } + et.maxLines = Int.MAX_VALUE + et.setHorizontallyScrolling(false) et.watch( 200, onCountChanged = { diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/layout/layout_fb_badcase.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/layout_fb_badcase.xml index c6d08768e7..f455ace3e0 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/res/layout/layout_fb_badcase.xml +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/layout_fb_badcase.xml @@ -83,7 +83,7 @@ android:focusable="false" android:gravity="start" android:focusableInTouchMode="true" - android:inputType="textMultiLine" + android:inputType="text" android:textSize="36px" android:textColorHint="#4CFFFFFF" android:imeOptions="actionDone" diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml index a4c86690d9..087e5fdbda 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml @@ -581,12 +581,11 @@ = emptyList() + + /** + * 道路ID + */ + var roadId: String = "" + + /** + * 瓦片ID + */ + var tieId: String = "" + + /** + * 自车到停止线的距离 + */ + var distanceOfCarToStopLine: Double = 0.0 + } +} \ No newline at end of file diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/map/MogoLatLng.java b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/map/MogoLatLng.java index 951c21a907..ae61f4523a 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/map/MogoLatLng.java +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/map/MogoLatLng.java @@ -16,6 +16,16 @@ public class MogoLatLng implements Parcelable { public final double lat; public final double lon; + public double angle; + + public int duration; + + public double speed; + + public double altitude; + + public String provider; + public MogoLatLng( double lat, double lon ) { this.lat = lat; this.lon = lon; diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerMapRoadListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerMapRoadListenerManager.kt new file mode 100644 index 0000000000..7a9f15ebe1 --- /dev/null +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerMapRoadListenerManager.kt @@ -0,0 +1,45 @@ +package com.mogo.eagle.core.function.call.map + +import com.mogo.eagle.core.data.map.MapRoadInfo.StopLine +import java.util.concurrent.ConcurrentHashMap + +object CallerMapRoadListenerManager { + + interface OnRoadListener { + + fun onRoadIdInfo(roadId: String) + + fun onStopLineInfo(info: StopLine) + } + + private val listeners by lazy { + ConcurrentHashMap() + } + + fun registerRoadListener(tag: String, listener: OnRoadListener) { + if (listeners.contains(tag)) { + return + } + listeners[tag] = listener + } + + fun unRegisterRoadListener(tag: String) { + if (!listeners.contains(tag)) { + return + } + listeners.remove(tag) + } + + + fun invokeListenersOnRoadIdGet(roadId: String) { + listeners.forEach { entry -> + entry.value.onRoadIdInfo(roadId) + } + } + + fun invokeListenersOnStopLineGet(stopLine: StopLine) { + listeners.forEach { entry -> + entry.value.onStopLineInfo(stopLine) + } + } +} \ No newline at end of file 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 e179dd7966..4a2141b850 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,7 +4,10 @@ import android.os.Handler import android.os.Looper import android.os.SystemClock import android.util.Log +import com.mogo.eagle.core.data.map.MapRoadInfo.StopLine import com.mogo.eagle.core.data.map.MogoLatLng +import com.mogo.eagle.core.function.call.map.CallerMapRoadListenerManager.OnRoadListener +import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager.Scene.CrossRoad import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager.Scene.Default import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager.Scene.LowSpeed import com.mogo.eagle.core.utilcode.kotlin.safeCancel @@ -23,7 +26,11 @@ object CallerVisualAngleManager { private const val TAG = "VisualAngle" - private const val MaxDisplayThreshold = 20_000 //最大展示阈值 + private const val MaxDisplayThreshold = 30_000 //最大展示阈值 + + @Volatile + private var hasCrossRoad = false + private var scope: CoroutineScope = acquireScope() @Synchronized @@ -47,6 +54,30 @@ object CallerVisualAngleManager { val priority: Int } + init { + CallerMapRoadListenerManager.registerRoadListener("VisualAngleChange", object : OnRoadListener { + + private var roadId = "" + + override fun onRoadIdInfo(roadId: String) {} + + override fun onStopLineInfo(info: StopLine) { + if (!hasCrossRoad && info.distanceOfCarToStopLine <= 30.0) { + hasCrossRoad = true + changeVisualAngle(CrossRoad) + } + val oldRoadId = this.roadId + if (oldRoadId != roadId) { + if (hasCrossRoad) { + hasCrossRoad = false + changeVisualAngle(Default()) + } + } + this.roadId = info.roadId + } + }) + } + sealed class Scene private constructor(): IAttach { /** @@ -146,16 +177,14 @@ object CallerVisualAngleManager { @OptIn(InternalCoroutinesApi::class) fun changeVisualAngle(scene: Scene) { - val triggerTime = SystemClock.elapsedRealtime() + val triggerTime = TimeUnit.MILLISECONDS.toSeconds(SystemClock.elapsedRealtime()) scope.launch { val displayed = getDisplayed() if (displayed == null) { val top = getTop() //堆顶 if (top != null && top.target.priority > scene.priority) { doChangeAngle(top) - synchronized(heap) { - heap += Record(scene, triggerTime = triggerTime) - } + heap += Record(scene, triggerTime = triggerTime) } else { doChangeAngle(Record(scene, triggerTime = triggerTime)) } @@ -167,9 +196,7 @@ object CallerVisualAngleManager { } if (scene is Default) { Log.d(TAG, "恢复到默认视图,之前展示的视图:$displayed") - synchronized(heap) { - heap -= displayed - } + heap -= displayed launch { val delay = scene.unit.toMillis(scene.delay) Log.d(TAG, "默认视图开启延时倒计时, 倒计时时间:${delay} ms.") 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 61dd0c7aeb..e88d988279 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,34 +8,25 @@ import android.graphics.drawable.GradientDrawable import android.text.* import android.text.style.ForegroundColorSpan import android.util.TypedValue -import android.view.Gravity import android.view.MotionEvent import android.view.View -import android.view.WindowManager import android.widget.EditText -import android.widget.PopupWindow import android.widget.TextView import androidx.annotation.ColorInt import androidx.annotation.IntRange import androidx.core.view.ViewCompat import androidx.core.widget.doAfterTextChanged import androidx.core.widget.doBeforeTextChanged -import androidx.fragment.app.FragmentActivity import androidx.lifecycle.* import androidx.lifecycle.Lifecycle.Event import androidx.lifecycle.Lifecycle.Event.ON_DESTROY import androidx.recyclerview.widget.RecyclerView -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.ClickUtils import com.mogo.eagle.core.utilcode.util.R import com.mogo.eagle.core.utilcode.util.Utils import kotlinx.coroutines.* import kotlinx.coroutines.channels.Channel -import java.lang.IllegalStateException import java.util.* -import java.util.concurrent.TimeUnit -import java.util.concurrent.TimeUnit.SECONDS import kotlin.math.abs val T.lifecycleOwner: LifecycleOwner diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java b/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java index eaf250131e..cb1a1c7727 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java +++ b/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java @@ -21,10 +21,12 @@ import android.view.View; import com.mogo.commons.constants.SharedPrefsConstants; import com.mogo.commons.debug.DebugConfig; import com.mogo.eagle.core.data.config.HdMapBuildConfig; +import com.mogo.eagle.core.data.map.MapRoadInfo; import com.mogo.eagle.core.data.map.MogoLatLng; import com.mogo.eagle.core.data.map.MogoLocation; import com.mogo.eagle.core.function.call.map.CallerMapDataCollectorManager; import com.mogo.eagle.core.function.call.map.CallerMapLocationListenerManager; +import com.mogo.eagle.core.function.call.map.CallerMapRoadListenerManager; import com.mogo.eagle.core.function.call.map.CallerMapStyleListenerManager; import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager; import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager; @@ -75,6 +77,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.json.JSONObject; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -173,18 +176,78 @@ public class AMapViewWrapper implements IMogoMapView, @Override public void onRoadIdInfo(@androidx.annotation.Nullable String s) { Log.d(TAG, "-- onRoadIdInfo --RoadId:" + s); - mRoadId = s; + if (s != null) { + CallerMapRoadListenerManager.INSTANCE.invokeListenersOnRoadIdGet(s); + } } @Override public void onStopLineInfo(@androidx.annotation.Nullable StopLine stopLine) { - Log.d(TAG, "-- onStopLineInfo:" + (stopLine != null ? stopLine.toString() : null) + "-> road_id:" + mRoadId); - if (stopLine != null && mRoadId != null && TextUtils.equals(mRoadId, stopLine.road_id)) { - MogoLocation location = CallerMapLocationListenerManager.INSTANCE.getCurrentLocation(); - //MapAutoApi.INSTANCE. + Log.d(TAG, "-- onStopLineInfo -- 1 --:" + (stopLine != null ? stopLine.toString() : null) + "-> road_id:" + mRoadId); + MogoLocation carLoc = CallerMapLocationListenerManager.INSTANCE.getCurrentLocation(); + if (stopLine != null) { + ArrayList points = stopLine.points; + if (points != null && carLoc != null) { + MapRoadInfo.StopLine stopInfo = convert(stopLine); + LonLatPoint match = new LonLatPoint(); + double ret = MapDataApi.INSTANCE.GetDisFromPointToLine(convert(carLoc), points, match, 1); + Log.d(TAG, "-- onStopLineInfo --- ret: "+ ret); + double distanceOfCarToStopLine = 0.0; + if (Double.compare(ret, -1.0) != 0) { + distanceOfCarToStopLine = MapTools.INSTANCE.distance(carLoc.getLatitude(), carLoc.getLongitude(), match.getLatitude(), match.getLongitude()); + } else { + LonLatPoint p1 = points.isEmpty() ? null : points.get(0); + LonLatPoint p2 = points.isEmpty() ? null : points.get(points.size() - 1); + LonLatPoint aim = p1 != null && p2 != null ? new LonLatPoint((p1.longitude + p2.longitude) / 2, (p1.altitude + p2.altitude) / 2, (p1.angle + p2.angle) / 2) : (p1 != null ? p1 : p2); + if (aim != null) { + distanceOfCarToStopLine = MapTools.INSTANCE.distance(carLoc.getAltitude(), carLoc.getLongitude(), aim.getLatitude(), aim.getLongitude()); + } + } + Log.d(TAG, "-- onStopLineInfo --- distance: "+ distanceOfCarToStopLine); + stopInfo.setDistanceOfCarToStopLine(distanceOfCarToStopLine); + Log.d(TAG, "-- :"); + CallerMapRoadListenerManager.INSTANCE.invokeListenersOnStopLineGet(stopInfo); + } } } + private @NotNull LonLatPoint convert(MogoLocation location) { + LonLatPoint point = new LonLatPoint(); + point.latitude = location.getLatitude(); + point.longitude = location.getLongitude(); + point.altitude = location.getAltitude(); + point.angle = location.getBearing(); + point.speed = location.getSpeed(); + point.angle = location.getBearing(); + point.provider = location.getProvider(); + return point; + } + + private MapRoadInfo.StopLine convert(StopLine line) { + MapRoadInfo.StopLine ret = new MapRoadInfo.StopLine(); + ret.setDistance(line.distance); + ret.setLaneId(line.lane_id); + ret.setRoadId(line.road_id); + ret.setTieId(line.tile_id); + ArrayList points = line.points; + if (points != null && points.size() > 0) { + List newPoints = new ArrayList<>(); + for (int i = 0; i < points.size(); i++) { + LonLatPoint lonLatPoint = points.get(i); + MogoLatLng latLng = new MogoLatLng(lonLatPoint.latitude, lonLatPoint.longitude); + latLng.duration = lonLatPoint.duration; + latLng.angle = lonLatPoint.angle; + latLng.speed = lonLatPoint.speed; + latLng.altitude = lonLatPoint.altitude; + latLng.provider = lonLatPoint.provider; + newPoints.add(latLng); + } + ret.setPoints(newPoints); + } + return ret; + } + + private Context getContext() { return mMapView.getContext(); }