[3.3.0][魔方] 功能代码提交

This commit is contained in:
renwj
2023-06-20 19:14:23 +08:00
parent 8c396ee135
commit e896169349
26 changed files with 804 additions and 478 deletions

View File

@@ -172,9 +172,9 @@ internal class WarningFloatWindowHelper(
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL or WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
addListener(object : Animator.AnimatorListener {
override fun onAnimationRepeat(animation: Animator?) {}
override fun onAnimationRepeat(animation: Animator) {}
override fun onAnimationEnd(animation: Animator?) {
override fun onAnimationEnd(animation: Animator) {
config.isAnim = false
if (!config.immersionStatusBar) {
// 不需要延伸到屏幕外了,防止屏幕旋转的时候,浮窗处于屏幕外
@@ -183,9 +183,9 @@ internal class WarningFloatWindowHelper(
}
}
override fun onAnimationCancel(animation: Animator?) {}
override fun onAnimationCancel(animation: Animator) {}
override fun onAnimationStart(animation: Animator?) {
override fun onAnimationStart(animation: Animator) {
floatingView.visibility = View.VISIBLE
config.isAnim = true
}
@@ -216,13 +216,13 @@ internal class WarningFloatWindowHelper(
params.flags =
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL or WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
animator.addListener(object : Animator.AnimatorListener {
override fun onAnimationRepeat(animation: Animator?) {}
override fun onAnimationRepeat(animation: Animator) {}
override fun onAnimationEnd(animation: Animator?) = remove()
override fun onAnimationEnd(animation: Animator) = remove()
override fun onAnimationCancel(animation: Animator?) {}
override fun onAnimationCancel(animation: Animator) {}
override fun onAnimationStart(animation: Animator?) {}
override fun onAnimationStart(animation: Animator) {}
})
animator.start()
}

View File

@@ -133,7 +133,7 @@ abstract class AbsLogView : ILogView, TouchProxy.OnTouchEventListener {
}
systemLayoutParams?.apply {
format = PixelFormat.TRANSPARENT
gravity = GravityCompat.START or Gravity.TOP
gravity = Gravity.START or Gravity.TOP
}
mLogViewLayoutParams.gravity = GravityCompat.START or Gravity.TOP
//动态注册关闭系统弹窗的广播
@@ -352,7 +352,7 @@ abstract class AbsLogView : ILogView, TouchProxy.OnTouchEventListener {
mWindowManager.updateViewLayout(mRootView, layoutAttrs)
}
addListener(object : AnimatorListenerAdapter() {
override fun onAnimationEnd(animation: Animator?) {
override fun onAnimationEnd(animation: Animator) {
endMoveAndRecord()
}
})

View File

@@ -86,7 +86,7 @@ class M1LookAroundView: SurfaceView, SurfaceHolder.Callback, Runnable, IMoGoChas
@Volatile
private var data: LookAroundData? = null
override fun surfaceCreated(holder: SurfaceHolder?) {
override fun surfaceCreated(holder: SurfaceHolder) {
val old = handler.get()
if (old == null) {
handler.set(HandlerThread("look-around-drawer").let { it.start(); Handler(it.looper) })
@@ -99,12 +99,12 @@ class M1LookAroundView: SurfaceView, SurfaceHolder.Callback, Runnable, IMoGoChas
isSurfaceValid = true
}
override fun surfaceChanged(holder: SurfaceHolder?, format: Int, width: Int, height: Int) {
override fun surfaceChanged(holder: SurfaceHolder, format: Int, width: Int, height: Int) {
this.surfaceWidth = width
this.surfaceHeight = height
}
override fun surfaceDestroyed(holder: SurfaceHolder?) {
override fun surfaceDestroyed(holder: SurfaceHolder) {
isSurfaceValid = false
}

View File

@@ -4,6 +4,7 @@ import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import android.widget.*
import androidx.constraintlayout.widget.ConstraintLayout
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.config.HmiBuildConfig
@@ -11,11 +12,12 @@ import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig
import com.mogo.eagle.core.data.multidisplay.TelematicConstant
import com.mogo.eagle.core.data.obu.MogoObuConst
import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsFuncConfigListener
import com.mogo.eagle.core.function.api.devatools.mofang.*
import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener
import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener.Companion.FUNC_MODE_DEMO
import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener.Companion.FUNC_MODE_RAIN
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsFuncConfigListenerManager
import com.mogo.eagle.core.function.call.devatools.*
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
import com.mogo.eagle.core.function.call.obu.CallerObuApiManager
import com.mogo.eagle.core.function.hmi.R
@@ -37,7 +39,7 @@ internal class SOPSettingView @JvmOverloads constructor(
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr), IMoGoDevaToolsFuncConfigListener,
IViewControlListener {
IViewControlListener, IMoGoMoFangProvider.OnMoFangStatusListener {
companion object {
const val TAG = "SOPSettingView"
@@ -284,6 +286,39 @@ internal class SOPSettingView @JvmOverloads constructor(
btnSpeedSet.visibility = View.GONE
}
mfStatusLayout.setClickEnabled(false)
if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) {
val mf = CallerDevaToolsManager.mofang()
if (mf != null) {
mfStatusLayout.setClickEnabled(true)
mfStatusLayout.setClickedTextAndTag(if (mf.isConnected()) "断开魔方连接" else "开始连接魔方", if (mf.isConnected()) 0 else 1)
mf.registerMoFangStatusListener(TAG, this)
mfStatusLayout.setOnClickCallback {
val tag = it.tag as? Int
if (tag == 0) {
//断开魔方连接
if (!mf.isConnected()) {
Toast.makeText(context, "尚未建立连接", Toast.LENGTH_SHORT).show()
return@setOnClickCallback
}
mfStatusLayout.showLoadingView()
mfStatusLayout.setLoadingViewText("正在断开魔方连接, 请稍候...")
mf.disconnect()
}
if (tag == 1) {
//建立魔方连接
if (mf.isConnected()) {
Toast.makeText(context, "已连接,不要重复连接", Toast.LENGTH_SHORT).show()
return@setOnClickCallback
}
mf.connect()
mfStatusLayout.showLoadingView()
mfStatusLayout.setLoadingViewText("正在连接魔方, 请稍候")
}
}
}
}
}
override fun onAttachedToWindow() {
@@ -317,6 +352,8 @@ internal class SOPSettingView @JvmOverloads constructor(
// } catch (e: Exception) {
// e.printStackTrace()
// }
CallerDevaToolsManager.mofang()?.unRegisterMoFangStatusListener(this)
}
// private val timerTaskRefresh = object : TimerTask(){
@@ -357,4 +394,30 @@ internal class SOPSettingView @JvmOverloads constructor(
}
}
}
override fun onMoFangConnected() {
mfStatusLayout?.also {
it.hideLoadingView()
it.setClickedTextAndTag("断开魔方连接", 0)
}
}
override fun onMoFangDisconnected() {
mfStatusLayout?.also {
it.hideLoadingView()
it.setClickedTextAndTag("开始连接魔方", 1)
}
}
override fun onMoFangBatteryChanged(battery: Int) {
}
override fun onMoFangClicked(keyCode: Int) {}
override fun onMoFangLongClicked(keyCode: Int) {}
override fun onMoFangCombineClicked(vararg keyCodes: Int) {}
override fun onMoFangStatusError(msg: String) {}
}

View File

@@ -0,0 +1,58 @@
package com.mogo.eagle.core.function.hmi.ui.setting
import android.content.*
import android.graphics.*
import android.graphics.drawable.ColorDrawable
import android.util.*
import android.view.*
import android.widget.*
import androidx.constraintlayout.widget.ConstraintLayout
import com.mogo.eagle.core.function.hmi.*
import com.mogo.eagle.core.utilcode.kotlin.*
class StateViewLayout: ConstraintLayout {
constructor(context: Context) : this(context, null)
constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0)
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : this(context, attrs, defStyleAttr, 0)
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes) {
LayoutInflater.from(context).inflate(R.layout.view_status_layout, this, true)
background = ColorDrawable(Color.GRAY)
}
private val loadingView by lazy { findViewById<View>(R.id.loading_view) }
private val loadingTextView by lazy { findViewById<TextView>(R.id.loading_text) }
private val clicked by lazy { findViewById<Button>(R.id.clicked) }
fun showLoadingView() {
clicked.visibility = View.INVISIBLE
loadingView.visibility = View.VISIBLE
}
fun hideLoadingView() {
clicked.visibility = View.VISIBLE
loadingView.visibility = View.INVISIBLE
}
fun setLoadingViewText(text: String) {
loadingTextView.text = text
}
fun setClickedTextAndTag(text: String, tag: Int) {
clicked.text = text
clicked.tag = tag
}
fun setOnClickCallback(block: ((v: View) -> Unit)?) {
clicked.onClick {
block?.invoke(it)
}
}
fun setClickEnabled(enabled: Boolean) {
clicked.isEnabled = enabled
}
}

View File

@@ -1,59 +1,72 @@
package com.mogo.eagle.core.function.hmi.ui.widget
import android.annotation.*
import android.content.Context
import android.graphics.*
import android.graphics.drawable.*
import android.util.AttributeSet
import android.view.LayoutInflater
import android.widget.RelativeLayout
import com.mogo.eagle.core.data.deva.mofang.MfConstants
import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsListener
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsListenerManager
import android.view.*
import android.widget.LinearLayout
import com.mogo.eagle.core.function.api.devatools.mofang.*
import com.mogo.eagle.core.function.call.devatools.*
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr
import com.mogo.eagle.core.utilcode.util.ThreadUtils
import kotlinx.android.synthetic.main.view_blue_tooth.view.*
/**
* 魔戒蓝牙控件
* 放置于StatusBar右侧位置
*/
open class BlueToothView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : RelativeLayout(context, attrs, defStyleAttr),IMoGoDevaToolsListener {
open class BlueToothView: LinearLayout, IMoGoMoFangProvider.OnMoFangStatusListener {
constructor(context: Context) : this(context, null)
constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0)
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : this(context, attrs, defStyleAttr, 0)
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes) {
orientation = HORIZONTAL
LayoutInflater.from(context).inflate(R.layout.view_blue_tooth
, this, true)
visibility = View.GONE
}
companion object{
private const val TAG = "BlueToothView"
}
init {
LayoutInflater.from(context).inflate(R.layout.view_blue_tooth, this, true)
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
val isBluetoothConnect =
SharedPrefsMgr.getInstance(context).getBoolean(MfConstants.BLUETOOTH_STATUS, false)
if (isBluetoothConnect) {
mofangStatus(true)
}
CallerDevaToolsListenerManager.addListener(TAG, this)
}
override fun mofangStatus(status: Boolean) {
super.mofangStatus(status)
ThreadUtils.runOnUiThread {
if (status) {
mofangView.setImageResource(R.drawable.icon_bluetooth_p)
} else {
mofangView.setImageResource(R.drawable.blue_tooth)
}
}
val isConnected = CallerDevaToolsManager.mofang()?.isConnected() ?: false
visibility = if (isConnected) View.VISIBLE else View.GONE
CallerDevaToolsManager.mofang()?.registerMoFangStatusListener(TAG, this)
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
CallerDevaToolsListenerManager.removeListener(TAG)
CallerDevaToolsManager.mofang()?.unRegisterMoFangStatusListener(this)
}
override fun onMoFangConnected() {
visibility = View.VISIBLE
}
override fun onMoFangDisconnected() {
visibility = View.GONE
}
@SuppressLint("SetTextI18n")
override fun onMoFangBatteryChanged(battery: Int) {
ivMoFangBattery?.also {
if (it.visibility != View.VISIBLE) {
it.visibility = View.VISIBLE
}
it.text = "${battery}%"
}
}
override fun onMoFangClicked(keyCode: Int) {}
override fun onMoFangLongClicked(keyCode: Int) {}
override fun onMoFangCombineClicked(vararg keyCodes: Int) {}
override fun onMoFangStatusError(msg: String) {}
}

View File

@@ -11,6 +11,7 @@ import android.os.Bundle;
import android.os.Handler;
import android.os.Process;
import android.text.TextUtils;
import android.util.Log;
import android.view.KeyEvent;
import androidx.annotation.Nullable;
@@ -22,7 +23,6 @@ import com.mogo.commons.module.intent.IntentManager;
import com.mogo.eagle.core.data.config.FunctionBuildConfig;
import com.mogo.eagle.core.function.api.base.IMoGoFunctionProvider;
import com.mogo.eagle.core.function.api.setting.IMoGoSkinModeChangeListener;
import com.mogo.eagle.core.function.call.mofang.CallerMofangListenerManager;
import com.mogo.eagle.core.function.call.setting.CallerSkinModeListenerManager;
import com.mogo.eagle.core.function.hmi.R;
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils;
@@ -30,10 +30,8 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
import com.mogo.eagle.core.utilcode.util.ToastUtils;
import com.rousetime.android_startup.model.CostTimesModel;
import com.zhjt.service.chain.ChainLog;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import java.util.List;
/**
@@ -202,21 +200,6 @@ public class MainLauncherActivity extends MainActivity implements IMogoIntentLis
super.onBackPressed();
}
/**
* 魔方按键分发
*
* @param event
* @return
*/
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if(CallerMofangListenerManager.INSTANCE.invokeMofangHandle(event.getKeyCode(), event.getAction())) {
return true;
} else {
return super.dispatchKeyEvent(event);
}
}
@Override
public void onSkinModeChange(int skinMode) {
}

View File

@@ -1,15 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="@dimen/dp_54"
android:layout_height="@dimen/dp_54">
tools:layout_width="wrap_content"
tools:layout_height="@dimen/dp_54"
tools:parentTag="android.widget.LinearLayout"
tools:orientation="horizontal"
tools:background="@color/black">
<ImageView
android:id="@+id/mofangView"
android:id="@+id/ivMoFangStatus"
android:layout_width="@dimen/dp_54"
android:layout_height="@dimen/dp_54"
android:scaleType="fitXY"
android:src="@drawable/blue_tooth"
tools:ignore="ContentDescription" />
</RelativeLayout>
<TextView
android:id="@+id/ivMoFangBattery"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="12dip"
android:textColor="@color/white"
android:layout_gravity="bottom"
android:visibility="gone"
tools:text="18%"/>
</merge>

View File

@@ -336,4 +336,15 @@
android:layout_marginStart="10dp"
/>
<com.mogo.eagle.core.function.hmi.ui.setting.StateViewLayout
android:id="@+id/mfStatusLayout"
android:layout_width="0dip"
android:layout_height="60dp"
android:layout_marginTop="10dp"
android:layout_marginStart="15dp"
android:layout_marginEnd="15dp"
app:layout_constraintTop_toBottomOf="@+id/tvSpeedThresholdTitle"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -0,0 +1,50 @@
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout"
tools:layout_width="400dp"
tools:layout_height="200dp">
<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/loading_view"
android:layout_width="0dip"
android:layout_height="0dip"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:gravity="center"
tools:visibility="visible"
android:visibility="invisible"
android:orientation="horizontal">
<TextView
android:id="@+id/loading_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/black"
tools:text="正在加载,请稍候..."
android:textSize="20dip"/>
<ProgressBar
style="?android:attr/progressBarStyleSmall"
android:layout_marginStart="5dip"
android:layout_width="30dip"
android:layout_height="30dip" />
</androidx.appcompat.widget.LinearLayoutCompat>
<Button
android:id="@+id/clicked"
tools:visibility="visible"
android:layout_width="0dip"
android:layout_height="0dip"
android:textSize="20dip"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:textColor="@color/black"
tools:text="连接魔方"/>
</merge>