Merge branch 'dev_robotaxi-d-app-module_260_220304_2.6.0' of gitlab.zhidaoauto.com:zhjt/AndroidApp/MoGoEagleEye into dev_robotaxi-d-app-module_260_220304_2.6.0

This commit is contained in:
wangmingjun
2022-03-21 12:01:46 +08:00
9 changed files with 209 additions and 31 deletions

View File

@@ -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 = {

View File

@@ -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"

View File

@@ -581,12 +581,11 @@
<androidx.appcompat.widget.AppCompatEditText
android:id="@+id/etAutopilotIP"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_height="0dp"
android:gravity="center"
android:minHeight="48dp"
android:padding="@dimen/dp_5"
android:text="192.168.8.102"
style="@style/DebugSettingText"
android:textColor="#1A1A1A"
android:textSize="14sp"
android:background="@drawable/debug_setting_edit_bg"
app:layout_constraintTop_toTopOf="@id/btnSetAutopilotIP"
app:layout_constraintBottom_toBottomOf="@id/btnSetAutopilotIP"
@@ -811,16 +810,20 @@
<androidx.appcompat.widget.AppCompatEditText
android:id="@+id/etObuIP"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_height="0dp"
android:gravity="center"
android:minHeight="48dp"
android:padding="@dimen/dp_5"
android:text="192.168.1.199"
android:textSize="@dimen/dp_24"
android:textColor="#1A1A1A"
android:textSize="14sp"
android:background="@drawable/debug_setting_edit_bg"
app:layout_constraintTop_toTopOf="@id/btnSetObuIP"
app:layout_constraintBottom_toBottomOf="@id/btnSetObuIP"
app:layout_constraintLeft_toRightOf="@id/btnSetObuIP"
app:layout_constraintRight_toRightOf="parent"
android:layout_marginStart="@dimen/dp_30"
android:layout_marginEnd="@dimen/dp_30"
android:layout_marginTop="@dimen/dp_10"
android:layout_marginBottom="@dimen/dp_10"
/>
<View

View File

@@ -0,0 +1,36 @@
package com.mogo.eagle.core.data.map
class MapRoadInfo {
class StopLine {
/**
* 停止线的长度
*/
var distance: Double = 0.0
/**
* 车道ID
*/
var laneId: String = ""
/**
* 停止线上的点
*/
var points: List<MogoLatLng> = emptyList()
/**
* 道路ID
*/
var roadId: String = ""
/**
* 瓦片ID
*/
var tieId: String = ""
/**
* 自车到停止线的距离
*/
var distanceOfCarToStopLine: Double = 0.0
}
}

View File

@@ -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;

View File

@@ -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<String, OnRoadListener>()
}
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)
}
}
}

View File

@@ -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.")

View File

@@ -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: View> T.lifecycleOwner: LifecycleOwner

View File

@@ -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<LonLatPoint> 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<LonLatPoint> points = line.points;
if (points != null && points.size() > 0) {
List<MogoLatLng> 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();
}