Merge branch 'dev_arch_opt_3.0' into dev_robobus-m1-p-app-module_1.0.0_230112_1.0.0

# Conflicts:
#	app/productFlavors/fMultiDisplayOchBus.gradle
#	app/productFlavors/fMultiDisplayOchTaxi.gradle
This commit is contained in:
yangyakun
2023-02-16 19:10:22 +08:00
10 changed files with 138 additions and 72 deletions

View File

@@ -94,13 +94,10 @@ public class SweeperTrafficDataView extends ConstraintLayout
if (lightSwitch != null) {
CallerLogger.INSTANCE.d(TAG, "车辆转向灯:" + lightSwitch.toString());
if (lightSwitch.getNumber()==1){
CallerVisualAngleManager.INSTANCE.showTurning(true);
sweeperTurnSignal.showLeftSignal();
}else if(lightSwitch.getNumber()==2){
CallerVisualAngleManager.INSTANCE.showTurning(true);
sweeperTurnSignal.showRightSignal();
}else{
CallerVisualAngleManager.INSTANCE.showTurning(false);
sweeperTurnSignal.showDirection();
}
}

View File

@@ -4,7 +4,7 @@ project.android.productFlavors {
externalNativeBuild {
ndk {
// 设置支持的SO库架构
abiFilters "armeabi-v7a", "arm64-v8a"
abiFilters "armeabi-v7a", "arm64-v8a"
}
}
minSdkVersion rootProject.ext.android.minSdkVersionPadLenovo
@@ -22,7 +22,7 @@ project.android.productFlavors {
//高德地图鉴权信息
manifestPlaceholders = [
AMAP_API_VALUE : rootProject.ext.android.fLauncherAmapApiValue,
CHANNEL_VALUE : "fOchBus",
CHANNEL_VALUE : "fMultiDisplayOchBus",
ACTIVITY_ROOT : true,
SCREEN_ORIENTATION: "landscape"
]

View File

@@ -4,7 +4,7 @@ project.android.productFlavors {
externalNativeBuild {
ndk {
// 设置支持的SO库架构
abiFilters "armeabi-v7a", "arm64-v8a"
abiFilters "armeabi-v7a", "arm64-v8a"
}
}
minSdkVersion rootProject.ext.android.minSdkVersionPadLenovo
@@ -22,7 +22,7 @@ project.android.productFlavors {
// 高德地图鉴权信息
AMAP_API_VALUE : rootProject.ext.android.fLauncherAmapApiValue,
// BUGLY_APP_CHANNEL
CHANNEL_VALUE : "fOchTaxi",
CHANNEL_VALUE : "fMultiDisplayOchTaxi",
// 在启动的时候把Task给清空
ACTIVITY_ROOT : true,
// Activity的朝向

View File

@@ -81,11 +81,9 @@ class SteeringBrakeView(context: Context, attrs: AttributeSet?) : ConstraintLayo
ThreadUtils.runOnUiThread {
if (lightSwitch.number == 1 || lightSwitch.number == 2) {
isShowTurnLight = true
CallerVisualAngleManager.showTurning(true)
brakeView.visibility = View.VISIBLE
brakeView.setBrakeLight(0)
} else {
CallerVisualAngleManager.showTurning(false)
brakeView.visibility = View.GONE
isShowTurnLight = false
}

View File

@@ -12,16 +12,10 @@ import android.widget.ImageView
import androidx.constraintlayout.widget.ConstraintLayout
import chassis.Chassis
import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLamplightListener
import com.mogo.eagle.core.function.api.map.angle.Turning
import com.mogo.eagle.core.function.call.autopilot.CallerChassisLamplightListenerManager
import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.utilcode.util.ThreadUtils
import kotlinx.android.synthetic.main.view_steering_brake.view.*
import kotlinx.android.synthetic.main.view_turn_light_status.view.*
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
/**
* @description
@@ -40,6 +34,9 @@ open class TurnLightViewStatus @JvmOverloads constructor(
}
private val visible: Boolean
private var isLeftLight: Boolean = false
private var isRightLight: Boolean = false
private var isDisappear: Boolean = false
init {
val typedArray = context.obtainStyledAttributes(attrs, R.styleable.TurnLightView)
@@ -73,7 +70,6 @@ open class TurnLightViewStatus @JvmOverloads constructor(
super.onAutopilotLightSwitchData(lightSwitch)
lightSwitch?.let {
ThreadUtils.runOnUiThread {
turnLightView.visibility = View.VISIBLE
setTurnLight(it)
}
}
@@ -86,27 +82,37 @@ open class TurnLightViewStatus @JvmOverloads constructor(
if (!isAttachedToWindow) {
return
}
GlobalScope.launch(Dispatchers.Main) {
//根据左右进行显示和隐藏,实际要判断每个来的时间和频度
when (directionLight) {
Chassis.LightSwitch.LIGHT_LEFT -> { //左转向
CallerVisualAngleManager.showTurning(true)
//根据左右进行显示和隐藏,实际要判断每个来的时间和频度
when (directionLight.number) {
Chassis.LightSwitch.LIGHT_LEFT_VALUE -> { //左转向
if (!isLeftLight) {
isLeftLight = true
isRightLight = false
isDisappear = false
showNormalAnimation()
left_select_image.visibility = View.VISIBLE
right_select_image.visibility = View.GONE
right_select_image.clearAnimation()
setAnimation(left_select_image)
}
Chassis.LightSwitch.LIGHT_RIGHT -> { //右转向
CallerVisualAngleManager.showTurning(true)
}
Chassis.LightSwitch.LIGHT_RIGHT_VALUE -> { //右转向
if (!isRightLight) {
isRightLight = true
isLeftLight = false
isDisappear = false
showNormalAnimation()
left_select_image.visibility = View.GONE
right_select_image.visibility = View.VISIBLE
left_select_image.clearAnimation()
setAnimation(right_select_image)
}
else -> { //消失
CallerVisualAngleManager.showTurning(false)
}
Chassis.LightSwitch.LIGHT_NONE_VALUE -> { //消失
if (!isDisappear) {
isDisappear = true
isLeftLight = false
isRightLight = false
animationDisappear()
}
}
@@ -170,10 +176,9 @@ open class TurnLightViewStatus @JvmOverloads constructor(
}
override fun onAnimationEnd(p0: Animation?) {
if (visible) {
if (!visible) {
turn_light_layout.visibility = View.GONE
}
stopAnimate()
}
})
}
@@ -182,19 +187,13 @@ open class TurnLightViewStatus @JvmOverloads constructor(
private fun setAnimation(imageView: ImageView) {
val animationSet = AnimatorSet()
val valueAnimator = ObjectAnimator.ofFloat(imageView, "alpha", 0f, 1.0f)
val valueAnimatorDisappare = ObjectAnimator.ofFloat(imageView, "alpha", 1.0f, 0f)
val valueAnimatorDisappear = ObjectAnimator.ofFloat(imageView, "alpha", 1.0f, 0f)
valueAnimator.duration = 1000
valueAnimatorDisappare.duration = 800
valueAnimatorDisappear.duration = 800
valueAnimator.repeatCount = -1
valueAnimatorDisappare.repeatCount = -1
animationSet.playTogether(valueAnimatorDisappare, valueAnimator)
valueAnimatorDisappear.repeatCount = -1
animationSet.playTogether(valueAnimatorDisappear, valueAnimator)
animationSet.start()
}
private fun stopAnimate() {
turn_light_layout.clearAnimation()
left_nor_image.clearAnimation()
right_nor_image.clearAnimation()
}
}

View File

@@ -40,9 +40,11 @@ class LimitingVelocityView constructor(
if (limitingVelocity > 0) {
this.visibility = View.VISIBLE
tvLimitingVelocity.text = "$limitingVelocity"
tvLimitingSource.visibility = View.VISIBLE
tvLimitingSource.text = sourceType.name
} else {
this.visibility = View.GONE
tvLimitingSource.visibility = View.GONE
tvLimitingSource.text = ""
}
}

View File

@@ -30,7 +30,6 @@
android:textSize="@dimen/dp_30"
android:textStyle="bold"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tvLimitingVelocity"
android:visibility="gone" />
app:layout_constraintTop_toBottomOf="@+id/tvLimitingVelocity" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -3,6 +3,7 @@ package com.mogo.eagle.core.function.view
import android.content.Context
import android.os.Bundle
import android.util.AttributeSet
import android.util.Log
import androidx.lifecycle.LifecycleObserver
import chassis.Chassis
import com.mogo.eagle.core.data.map.MogoLocation
@@ -11,15 +12,17 @@ import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationWGS84Liste
import com.mogo.eagle.core.function.api.setting.IMoGoSkinModeChangeListener
import com.mogo.eagle.core.function.call.autopilot.CallerChassisLamplightListenerManager
import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager
import com.mogo.eagle.core.function.call.map.*
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager
import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager
import com.mogo.eagle.core.function.call.setting.CallerSkinModeListenerManager
import com.mogo.map.MogoMapView
class MapBizView(context: Context?, attrs: AttributeSet?) : MogoMapView(context, attrs), IMoGoSkinModeChangeListener,
IMoGoChassisLocationWGS84Listener, IMoGoChassisLamplightListener , LifecycleObserver {
companion object{
class MapBizView(context: Context?, attrs: AttributeSet?) : MogoMapView(context, attrs),
IMoGoSkinModeChangeListener,
IMoGoChassisLocationWGS84Listener, IMoGoChassisLamplightListener, LifecycleObserver {
companion object {
private const val TAG = "MapBizView"
}
@@ -34,7 +37,7 @@ class MapBizView(context: Context?, attrs: AttributeSet?) : MogoMapView(context,
}
private fun initMapView(){
private fun initMapView() {
map?.uiSettings?.let {
//设置所有手势是否可用
it.setAllGesturesEnabled(true)
@@ -84,26 +87,47 @@ class MapBizView(context: Context?, attrs: AttributeSet?) : MogoMapView(context,
setExtraGPSData(gnssInfo)
}
@Volatile
private var isVisualAngleChanged = false
override fun onAutopilotLightSwitchData(lightSwitch: Chassis.LightSwitch?) {
super.onAutopilotLightSwitchData(lightSwitch)
lightSwitch?.let {
when (it.number) {
1 -> { //左转灯
Chassis.LightSwitch.LIGHT_LEFT_VALUE -> { //左转灯
CallerVisualAngleManager.showTurning(true)
CallerMapUIServiceManager.getMapUIController()?.setCarLightsType(4, 500)
showTurn(1)
}
2 -> { //右转灯
CallerVisualAngleManager.showTurning(true)
CallerMapUIServiceManager.getMapUIController()?.setCarLightsType(2, 500)
}
else -> {
Chassis.LightSwitch.LIGHT_RIGHT_VALUE -> { //右转灯
CallerVisualAngleManager.showTurning(false)
CallerMapUIServiceManager.getMapUIController()?.setCarLightsType(3, 500)
showTurn(2)
}
Chassis.LightSwitch.LIGHT_NONE_VALUE -> {
CallerVisualAngleManager.showTurning(false)
hideTurn()
}
}
}
}
private fun showTurn(lightNum: Int) {
if (!isVisualAngleChanged) {
isVisualAngleChanged = true
when (lightNum) {
1 -> CallerMapUIServiceManager.getMapUIController()?.setCarLightsType(4, 500)
2 -> CallerMapUIServiceManager.getMapUIController()?.setCarLightsType(2, 500)
}
}
}
private fun hideTurn() {
if (isVisualAngleChanged) {
isVisualAngleChanged = false
CallerMapUIServiceManager.getMapUIController()?.setCarLightsType(3, 500)
}
}
override fun onDestroy() {
// 先取消注册数据再onDestroy
CallerSkinModeListenerManager.removeListener(TAG)

View File

@@ -1,5 +1,6 @@
package com.mogo.eagle.core.function.call.autopilot
import android.util.Log
import chassis.Chassis
import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLamplightListener
import com.mogo.eagle.core.function.call.base.CallerBase
@@ -17,24 +18,24 @@ object CallerChassisLamplightListenerManager : CallerBase<IMoGoChassisLamplightL
* @param lightSwitch
*/
fun invokeAutopilotLightSwitchData(lightSwitch: Chassis.LightSwitch) {
val switch = getTurnLightState(lightSwitch)
M_LISTENERS.forEach {
val listener = it.value
listener.onAutopilotLightSwitchData(getTurnLightState(lightSwitch))
listener.onAutopilotLightSwitchData(switch)
}
}
private fun getTurnLightState(turn_light: Chassis.LightSwitch): Chassis.LightSwitch? {
if (turn_light == Chassis.LightSwitch.LIGHT_NONE) {
return if (isOnTurnLight) {
if (turn_light.number == Chassis.LightSwitch.LIGHT_NONE.number) {
if (isOnTurnLight) {
if (turnLightTimes >= 10) {
isOnTurnLight = false
return turn_light
} else {
turnLightTimes++
null
}
turnLightTimes++
return null
} else {
null
return null
}
} else {
turnLightTimes = 0

View File

@@ -7,7 +7,6 @@ import android.content.pm.PackageManager
import android.hardware.display.DisplayManager
import android.util.Log
import android.view.Display
import androidx.appcompat.app.AppCompatActivity
/**
* 多屏幕操作工具类
@@ -15,7 +14,61 @@ import androidx.appcompat.app.AppCompatActivity
object MultiDisplayUtils {
private val TAG: String = "MultiDisplayUtils"
// 获取 是否支持扩展屏幕打开应用
/**
* 定昌电子6屏幕异显 对应的lcd匹配数组, 当前数组只对应于6屏异显,
* 如果是其他屏幕个数, 需要自己重新对应下相关的索引
* display 里面查看port对应的值
*/
private var lcd_sub_port_six_lcd_mode = arrayOf(
// main lcd // HDMI-1
//-------------------begin 定昌电子 RK3588 -------------------
"port=240", // HDMI-2
"port=3", // HDMI-3
"port=243", // HDMI-4
"port=2", // HDMI-5
"port=1", // HDMI-6
//-------------------end 定昌电子 RK3588 -------------------
)
/**
* 获取其他的屏幕
*/
fun getOtherDisplay(): Array<Display?> {
val mDisplayManager =
Utils.getApp().getSystemService(Context.DISPLAY_SERVICE) as DisplayManager
// 获取除了内置屏幕(主屏幕)的其它屏幕
val displays = mDisplayManager.getDisplays(DisplayManager.DISPLAY_CATEGORY_PRESENTATION)
// 初始化新的集合进行接收排序后的屏幕信息
val displaysList = arrayOfNulls<Display>(displays.size)
// 判断副屏个数
if (displays.isNotEmpty()) {
// 循环出来副屏幕进行重新排序
for (i in displays.indices) {
// 这里如果需要固定某个屏幕, 使用 if( display.toString().indexOf("port=1")!=-1) ) 而不是使用 display[i]
val strDisplayString: String = displays[i].toString()
for (j in lcd_sub_port_six_lcd_mode.indices) { // 这里增加port的匹配, 如果不需要对应的匹配 可看下面的other LCD
if (strDisplayString.indexOf(lcd_sub_port_six_lcd_mode[j]) != -1) { // 查找我们实际屏幕的匹配port
displaysList[j] = displays[i]
break
}
}
}
// 没有匹配到的显示
for (i in displays.indices) {
if (displaysList[i] == null) {
displaysList[i] = displays[i]
}
}
}
return displaysList
}
/**
* 获取 是否支持扩展屏幕打开应用
*/
fun isSupportMultiDisplay(context: Context): Boolean {
// 先检查一下是不是支持在第二屏上显示activity这个特性
// 在ActivityOptions.java setLaunchDisplayId 上面有相关的说明
@@ -23,13 +76,6 @@ object MultiDisplayUtils {
return packageManager.hasSystemFeature(PackageManager.FEATURE_ACTIVITIES_ON_SECONDARY_DISPLAYS)
}
// 获取 当前接入的屏幕集合(含主屏幕)
fun getMultiDisplay(context: Context): Array<out Display> {
// 多次创建副屏 则副屏的id都是增加的所以不一定是1这里还是获取一下
val displayManager =
context.getSystemService(AppCompatActivity.DISPLAY_SERVICE) as DisplayManager
return displayManager.displays
}
/**
* 在指定ID的屏幕打开Activity当前应用的当前进程
@@ -39,8 +85,8 @@ object MultiDisplayUtils {
fun startActWithSecond(context: Context, activity: Class<*>) {
val launchDisplayId: Int
if (isSupportMultiDisplay(context)) {
if (getMultiDisplay(context).size > 1) {
launchDisplayId = getMultiDisplay(context)[1].displayId
if (getOtherDisplay().size > 1 && getOtherDisplay()[0] != null) {
launchDisplayId = getOtherDisplay()[0]!!.displayId
// 要加上Intent.FLAG_ACTIVITY_NEW_TASK
val options = ActivityOptions.makeBasic()
@@ -62,7 +108,7 @@ object MultiDisplayUtils {
* @param launchDisplayId 指定屏幕ID
* @param activity 要在副屏幕启动的页面
*/
fun startActWithProcess(context: Context, launchDisplayId: Int, activity: Class<*>) {
fun startActWithOther(context: Context, launchDisplayId: Int, activity: Class<*>) {
// 要加上Intent.FLAG_ACTIVITY_NEW_TASK
val options = ActivityOptions.makeBasic()
options.launchDisplayId = launchDisplayId