[状态栏]由单排改成双排

[状态栏]由单排改成双排

[状态栏]xxxx

[状态栏]xxxx
This commit is contained in:
renwj
2022-08-04 10:16:26 +08:00
parent d16fc6a98a
commit 1e27c6da97
10 changed files with 141 additions and 123 deletions

View File

@@ -3,7 +3,7 @@ package com.zhjt.mogo_core_function_devatools
import android.annotation.SuppressLint
import android.app.Activity
import android.content.Context
import android.view.View
import android.view.*
import com.alibaba.android.arouter.facade.annotation.Route
import com.mogo.eagle.core.data.constants.MogoServicePaths
import com.mogo.eagle.core.data.deva.chain.ChainLogParam
@@ -102,12 +102,12 @@ class DevaToolsProvider : IDevaToolsProvider {
upgradeManager.downLoadPackage(mContext!!, downloadKey,downloadUrl)
}
override fun showStatusBar(ctx: Context, anchor: View) {
StatusManager.init(ctx, anchor)
StatusManager.show()
override fun showStatusBar(ctx: Context, container: ViewGroup) {
StatusManager.init(ctx)
StatusManager.show(container)
}
override fun hideStatusBar() {
StatusManager.hide()
override fun hideStatusBar(container: ViewGroup) {
StatusManager.hide(container)
}
}

View File

@@ -1,10 +1,9 @@
@file:Suppress("COMPATIBILITY_WARNING")
package com.zhjt.mogo_core_function_devatools.status
import android.content.*
import android.view.*
import android.view.WindowManager.LayoutParams
import android.widget.*
import androidx.core.view.*
import androidx.lifecycle.*
import androidx.lifecycle.Lifecycle.Event
import androidx.lifecycle.Lifecycle.Event.ON_CREATE
@@ -13,7 +12,6 @@ import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
import com.mogo.eagle.core.function.call.autopilot.*
import com.mogo.eagle.core.utilcode.kotlin.*
import com.mogo.eagle.core.utilcode.util.*
import com.zhjt.mogo_core_function_devatools.ext.*
import com.zhjt.mogo_core_function_devatools.status.entity.CanStatus
import com.zhjt.mogo_core_function_devatools.status.entity.GpsStatus
import com.zhjt.mogo_core_function_devatools.status.entity.IpcStatus
@@ -29,11 +27,12 @@ import com.zhjt.mogo_core_function_devatools.status.flow.ipc.IpcImpl
import com.zhjt.mogo_core_function_devatools.status.flow.nets.NetsImpl
import com.zhjt.mogo_core_function_devatools.status.flow.rtk.RTKImpl
import com.zhjt.mogo_core_function_devatools.status.flow.trace.TracingImpl
import com.zhjt.mogo_core_function_devatools.status.ui.*
import com.zhjt.mogo_core_function_devatools.status.ui.StatusView
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
import mogo_msg.MogoReportMsg
import java.lang.ref.*
import java.util.concurrent.*
object StatusManager {
@@ -41,18 +40,13 @@ object StatusManager {
private lateinit var model: StatusModel
private var pop: PopupWindow? = null
private var timer: Job? = null
private var context: WeakReference<Context>? = null
private var anchor: WeakReference<View>? = null
private var hasInit = false
private var oldX = 0
private var oldY = 0
private val listeners by lazy { CopyOnWriteArrayList<IStatusListener>() }
private val listener = object : IMoGoAutopilotStatusListener {
override fun onAutopilotGuardian(guardianInfo: MogoReportMsg.MogoReportMessage?) {
@@ -93,7 +87,7 @@ object StatusManager {
}
}
fun init(ctx: Context, anchor: View) {
fun init(ctx: Context) {
if (hasInit) {
return
}
@@ -110,26 +104,6 @@ object StatusManager {
}
}
})
context = WeakReference(ctx)
anchor.viewTreeObserver.addOnGlobalLayoutListener {
anchor.getLocationInWindow(IntArray(2).also {
val currentX = it[0]
val currentY = it[1]
var changed = false
if (oldX != currentX) {
oldX = currentX
changed = true
}
if (oldY != currentY) {
changed = true
oldY = currentY
}
if (changed && pop?.isShowing == true) {
pop?.update(getOffsetX(currentX), currentY + 130.PX, -1, -1)
}
})
}
this.anchor = WeakReference(anchor)
}
private fun onCreate(ctx: Context) {
@@ -153,35 +127,42 @@ object StatusManager {
model.update(it)
}
}
f.onCreate()
}
}
fun show() {
val anchor = this.anchor?.get() ?: return
context?.get()?.also { ctx ->
pop?.takeIf { it.isShowing }?.dismiss()
val content = StatusView(model, ctx)
content.doOnAttach {
for (f in flows) {
f.onCreate()
}
}
val out = IntArray(2)
anchor.getLocationInWindow(out)
ctx.normalPop(content, width = LayoutParams.WRAP_CONTENT, height = LayoutParams.WRAP_CONTENT, gravity = Gravity.END or Gravity.TOP, startX = getOffsetX(out[0]), startY = out[1] + 130.PX , isFocusable = false)?.also {
pop = it
model.status.observe(ctx.lifeCycleOwner) {
listeners.forEach { itx ->
itx.onStatusChanged(it.second, it.first != null)
}
}
}
private fun getOffsetX(anchorX: Int): Int {
return ScreenUtils.getScreenWidth() - anchorX + 40.PX
fun registerListener(listener: IStatusListener) {
listeners.add(listener)
}
fun hide() {
pop?.takeIf { it.isShowing }?.dismiss()
fun unRegisterListener(listener: IStatusListener) {
listeners.remove(listener)
}
fun show(container: ViewGroup) {
if (container.childCount > 0) {
if (container.visibility != View.VISIBLE) {
container.visibility = View.VISIBLE
}
return
}
val child = StatusView(model, container.context)
container.addView(child, ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT))
}
fun hide(container: ViewGroup) {
container.visibility = View.GONE
}
private fun onDestroy(ctx: Context) {
hasInit = false
CallerAutoPilotStatusListenerManager.removeListener(TAG)
@@ -190,7 +171,12 @@ object StatusManager {
flows.forEach {
it.onDestroy()
}
listeners.clear()
flows.clear()
pop?.takeIf { it.isShowing }?.dismiss()
}
interface IStatusListener {
fun onStatusChanged(data: List<Status>, hasException: Boolean)
}
}

View File

@@ -3,12 +3,12 @@ package com.zhjt.mogo_core_function_devatools.status.entity
import com.zhjt.mogo_core_function_devatools.status.entity.TracingStatus.Tracing
import com.zhjt.mogo_core_function_devatools.status.entity.TracingStatus.Tracing.*
internal sealed class Status
sealed class Status
/**
* 工控机
*/
internal class IpcStatus(val enabled: Boolean = false): Status() {
class IpcStatus(val enabled: Boolean = false): Status() {
override fun equals(other: Any?): Boolean {
if (javaClass != other?.javaClass) return false
@@ -26,7 +26,7 @@ internal class IpcStatus(val enabled: Boolean = false): Status() {
}
}
internal class NetStatus(val enabled: Boolean = false, var name: String? = null, val speed: Speed? = null): Status() {
class NetStatus(val enabled: Boolean = false, var name: String? = null, val speed: Speed? = null): Status() {
class Speed(val tx: Int, val rx: Int) {
override fun toString(): String {
@@ -56,7 +56,7 @@ internal class NetStatus(val enabled: Boolean = false, var name: String? = null,
/**
* android系统定位状态
*/
internal class GpsStatus(val enabled: Boolean = false, val isGranted: Boolean = false): Status() {
class GpsStatus(val enabled: Boolean = false, val isGranted: Boolean = false): Status() {
override fun equals(other: Any?): Boolean {
if (javaClass != other?.javaClass) return false
@@ -81,7 +81,7 @@ internal class GpsStatus(val enabled: Boolean = false, val isGranted: Boolean =
/**
* RTK/GNSS定位状态
*/
internal class RTKStatus(var enabled: Boolean = false, var desc: String = "RTK"): Status() {
class RTKStatus(var enabled: Boolean = false, var desc: String = "RTK"): Status() {
override fun equals(other: Any?): Boolean {
if (javaClass != other?.javaClass) return false
@@ -102,7 +102,7 @@ internal class RTKStatus(var enabled: Boolean = false, var desc: String = "RTK")
/**
* Can总线
*/
internal class CanStatus(var enabled: Boolean = false): Status() {
class CanStatus(var enabled: Boolean = false): Status() {
override fun equals(other: Any?): Boolean {
if (javaClass != other?.javaClass) return false
@@ -125,7 +125,7 @@ internal class CanStatus(var enabled: Boolean = false): Status() {
/**
* 寻迹/算路/未知
*/
internal class TracingStatus(var state: Tracing = UNKNOWN): Status() {
class TracingStatus(var state: Tracing = UNKNOWN): Status() {
enum class Tracing(val code: String? = "") {
/**
@@ -188,7 +188,7 @@ internal class TracingStatus(var state: Tracing = UNKNOWN): Status() {
}
}
internal fun String.toState(): Tracing? {
fun String.toState(): Tracing? {
return when(this) {
"IMAP_TRA_EXIST" -> TRACK_FINDED
"IMAP_TRA_LOADED" -> TRACK_LOADED

View File

@@ -5,6 +5,7 @@ import android.content.*
import android.graphics.*
import android.graphics.drawable.*
import android.transition.*
import android.util.*
import android.view.*
import androidx.appcompat.widget.*
import androidx.constraintlayout.widget.*
@@ -42,7 +43,6 @@ internal class StatusView(private val model: StatusModel, ctx: Context): Constra
}
private fun init() {
isClickable = true
dot.background = shape(solid = Color.parseColor("#F33F1D"), shape = GradientDrawable.OVAL, width = 30.PX, height = 30.PX)
iv.also {
it.background = ContextCompat.getDrawable(context, R.drawable.icon_dev_status_un_fold)
@@ -59,13 +59,14 @@ internal class StatusView(private val model: StatusModel, ctx: Context): Constra
moveDuration = 0
removeDuration = 0
}
itx.layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
itx.layoutManager = GridLayoutManager(context,4, GridLayoutManager.VERTICAL, false)
itx.background = shape(solid = Color.parseColor("#80000000"), radius = 40.PX)
itx.addItemDecoration(
CommonDividerItemDecoration.Builder()
.horizontalExternalSpace(38.PX)
.verticalExternalSpace(30.PX)
.spanCountLRCare(false)
.verticalInnerSpace(20.PX)
.spanCountTBCare(false)
.horizontalInnerSpace(50.PX)
.build()
)
@@ -90,6 +91,17 @@ internal class StatusView(private val model: StatusModel, ctx: Context): Constra
}
}
override fun onVisibilityChanged(changedView: View, visibility: Int) {
super.onVisibilityChanged(changedView, visibility)
if (changedView != this) {
if (visibility == View.VISIBLE) {
observer?.also { model.status.observeForever(it) }
} else {
observer?.also { model.status.removeObserver(it) }
}
}
}
private fun animate(expand: Boolean) {
TransitionManager.beginDelayedTransition(this, AutoTransition().setDuration(200))
rv.visibility = if (expand) View.VISIBLE else View.INVISIBLE

View File

@@ -8,13 +8,12 @@
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="wrap_content"
android:layout_height="156px"
android:minWidth="902px"
android:layout_width="611px"
android:layout_height="271px"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@+id/iv"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginEnd="20px"
android:layout_marginEnd="42px"
android:overScrollMode="never"
app:layout_constraintBottom_toBottomOf="parent"/>
@@ -24,7 +23,7 @@
android:layout_height="107px"
android:layout_marginBottom="20px"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginTop="12px"
app:layout_constraintStart_toEndOf="@+id/rv"
app:layout_constraintEnd_toEndOf="parent"
android:background="@drawable/icon_dev_status_un_fold"/>

View File

@@ -207,7 +207,7 @@ import java.util.*
setProxyLimitingSpeedView(viewLimitingVelocity)
setViewNotificationProvider(this)
context?.also {
CallerDevaToolsManager.showStatusBar(it, vs_status_bar)
CallerDevaToolsManager.showStatusBar(it, statusBarContainer)
}
}
@@ -1214,7 +1214,7 @@ import java.util.*
}
override fun showSmallFragment() {
CallerDevaToolsManager.hideStatusBar()
CallerDevaToolsManager.hideStatusBar(statusBarContainer)
// 加载全览模式图层
val fragmentOverview = ARouter.getInstance().build(MoGoFragmentPaths.PATH_FRAGMENT_OVERVIEW)
.navigation() as BaseFragment
@@ -1229,7 +1229,7 @@ import java.util.*
}
override fun hideSmallFragment() {
context?.let { CallerDevaToolsManager.showStatusBar(it, vs_status_bar) }
context?.let { CallerDevaToolsManager.showStatusBar(it, statusBarContainer) }
val fragmentOverview = ARouter.getInstance().build(MoGoFragmentPaths.PATH_FRAGMENT_OVERVIEW)
.navigation() as BaseFragment
activity?.supportFragmentManager?.beginTransaction()

View File

@@ -147,6 +147,7 @@
android:layout_height="120px"
android:layout_marginTop="30px"
android:layout_marginEnd="40px"
android:background="@drawable/bg_waring_limiting_velocity"
android:elevation="@dimen/dp_10"
android:gravity="center"
@@ -158,7 +159,7 @@
app:layout_constraintTop_toBottomOf="@+id/ivCameraIcon"
app:layout_goneMarginEnd="40px"
app:layout_goneMarginTop="40px"
tools:visibility="visible" />
tools:visibility="gone" />
<!--左右转向灯-->
<com.mogo.eagle.core.function.hmi.ui.turnlight.TurnLightViewStatus
@@ -189,13 +190,15 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<View
android:id="@+id/vs_status_bar"
android:layout_width="107px"
android:layout_height="107px"
<RelativeLayout
android:id="@+id/statusBarContainer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="30px"
app:layout_constraintTop_toTopOf="@+id/viewLimitingVelocity"
app:layout_constraintEnd_toStartOf="@+id/viewLimitingVelocity"
app:layout_constraintBottom_toBottomOf="@+id/viewLimitingVelocity"/>
app:layout_goneMarginTop="30px"
app:layout_goneMarginEnd="40px"/>
</androidx.constraintlayout.widget.ConstraintLayout>
<!-- app:layout_constraintBottom_toBottomOf="parent"-->