From 209423dbcd479324d6359bcc5f417b1eb6f7b262 Mon Sep 17 00:00:00 2001 From: renwj Date: Fri, 29 Jul 2022 12:09:19 +0800 Subject: [PATCH] =?UTF-8?q?[=E7=8A=B6=E6=80=81=E6=A0=8F]=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E6=A0=8F=E4=BD=8D=E7=BD=AE=E4=B8=8A=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DevaToolsProvider.kt | 5 +- .../ext/Extentions.kt | 10 ++-- .../status/StatusManager.kt | 49 +++++++++++++++--- .../status/ui/StatusView.kt | 12 ++--- .../status/ui/adapter/StatusAdapter.kt | 28 +++++----- .../icon_dev_status_un_fold.png | Bin 9649 -> 12516 bytes .../src/main/res/layout/layout_status_bar.xml | 24 +++++---- .../res/layout/layout_status_bar_item.xml | 25 ++------- .../core/function/hmi/ui/MoGoHmiFragment.kt | 5 +- .../src/main/res/layout/fragment_hmi.xml | 29 ++++++----- .../api/devatools/IDevaToolsProvider.kt | 2 +- .../call/devatools/CallerDevaToolsManager.kt | 15 ++++-- 12 files changed, 115 insertions(+), 89 deletions(-) diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt index 387f7212b8..f483cb7346 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt @@ -11,7 +11,6 @@ import com.mogo.eagle.core.data.deva.scene.SceneModule import com.mogo.eagle.core.data.deva.scene.SceneTAG import com.mogo.eagle.core.function.api.devatools.IDevaToolsProvider import com.zhjt.mogo_core_function_devatools.badcase.BadCaseManager -import com.zhjt.mogo_core_function_devatools.feedback.FeedbackManager import com.zhjt.mogo_core_function_devatools.logcatch.MogoLogCatchManager import com.zhjt.mogo_core_function_devatools.scene.SceneManager.Companion.sceneManager import com.zhjt.mogo_core_function_devatools.status.* @@ -103,8 +102,8 @@ class DevaToolsProvider : IDevaToolsProvider { upgradeManager.downLoadPackage(mContext!!, downloadKey,downloadUrl) } - override fun showStatusBar(ctx: Context) { - StatusManager.init(ctx) + override fun showStatusBar(ctx: Context, anchor: View) { + StatusManager.init(ctx, anchor) StatusManager.show() } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/ext/Extentions.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/ext/Extentions.kt index 64e6279d23..3246a6f238 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/ext/Extentions.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/ext/Extentions.kt @@ -144,7 +144,7 @@ fun Context.enqueuePop(content: View, width: Int, height: Int, key: String = "", @SuppressLint("ClickableViewAccessibility") -fun Context.normalPop(content: View, width: Int, height: Int, startX: Int = 0, startY: Int = 0, gravity: Int = Gravity.START, onOuterViewClicked:((focus: View) -> Unit)? = null, isFocusable: Boolean = true): () -> Unit { +fun Context.normalPop(content: View, width: Int, height: Int, startX: Int = 0, startY: Int = 0, gravity: Int = Gravity.START, onOuterViewClicked:((focus: View) -> Unit)? = null, isFocusable: Boolean = true): PopupWindow? { val activity = (this as? FragmentActivity) ?: throw IllegalStateException("please use Activity to trigger pop show.") val isImmersiveMode = BarUtils.isImmersiveMode(activity) var tempPop: PopupWindow? = null @@ -192,7 +192,7 @@ fun Context.normalPop(content: View, width: Int, height: Int, startX: Int = 0, s it.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) } if (VERSION.SDK_INT >= VERSION_CODES.M) { - val transition = Slide(gravity).also { + val transition = Slide(if ((gravity and Gravity.START) != 0) Gravity.START else if ((gravity and Gravity.TOP) != 0) Gravity.TOP else if ((gravity and Gravity.END) != 0) Gravity.END else if ((gravity and Gravity.BOTTOM) != 0) Gravity.BOTTOM else throw AssertionError("gravity is not invalid.")).also { it.interpolator = AccelerateDecelerateInterpolator() it.duration = 200 } @@ -202,16 +202,14 @@ fun Context.normalPop(content: View, width: Int, height: Int, startX: Int = 0, s pop.contentView = content decorView.doOnAttach { try { - pop.showAtLocation(it, gravity, startX, if (isImmersiveMode) 0 else BarUtils.getStatusBarHeight() + startY) + pop.showAtLocation(it, gravity, startX, (if (isImmersiveMode) 0 else BarUtils.getStatusBarHeight()) + startY) tempPop = pop } catch (t: Throwable) { t.printStackTrace() } } } - return { - tempPop?.takeIf { it.isShowing }?.dismiss() - } + return tempPop } fun isVisibleOnPoint(content: View, x: Int, y: Int): Boolean { diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/StatusManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/StatusManager.kt index 649715fb79..177854b555 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/StatusManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/StatusManager.kt @@ -3,6 +3,7 @@ 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 @@ -11,8 +12,7 @@ import androidx.lifecycle.Lifecycle.Event.ON_DESTROY 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.AppStateManager -import com.mogo.eagle.core.utilcode.util.IAppStateListener +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 @@ -41,14 +41,19 @@ object StatusManager { private lateinit var model: StatusModel - private var hidePop: (() -> Unit)? = null + private var pop: PopupWindow? = null private var timer: Job? = null private var context: WeakReference? = null + private var anchor: WeakReference? = null + private var hasInit = false + private var oldX = 0 + private var oldY = 0 + private val listener = object : IMoGoAutopilotStatusListener { override fun onAutopilotGuardian(guardianInfo: MogoReportMsg.MogoReportMessage?) { super.onAutopilotGuardian(guardianInfo) @@ -88,7 +93,7 @@ object StatusManager { } } - fun init(ctx: Context) { + fun init(ctx: Context, anchor: View) { if (hasInit) { return } @@ -106,6 +111,25 @@ 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) { @@ -133,20 +157,29 @@ object StatusManager { } fun show() { + val anchor = this.anchor?.get() ?: return context?.get()?.also { ctx -> - hidePop?.invoke() + pop?.takeIf { it.isShowing }?.dismiss() val content = StatusView(model, ctx) content.doOnAttach { for (f in flows) { f.onCreate() } } - ctx.normalPop(content, width = 665.PX, height = LayoutParams.WRAP_CONTENT, gravity = Gravity.END, startX = 55.PX, isFocusable = false).also { hidePop = it } + 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 + } } } + private fun getOffsetX(anchorX: Int): Int { + return ScreenUtils.getScreenWidth() - anchorX + 40.PX + } + fun hide() { - hidePop?.invoke() + pop?.takeIf { it.isShowing }?.dismiss() } private fun onDestroy(ctx: Context) { @@ -158,6 +191,6 @@ object StatusManager { it.onDestroy() } flows.clear() - hidePop?.invoke() + pop?.takeIf { it.isShowing }?.dismiss() } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/StatusView.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/StatusView.kt index 7c9013a2dd..0adf523bb6 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/StatusView.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/StatusView.kt @@ -59,15 +59,14 @@ internal class StatusView(private val model: StatusModel, ctx: Context): Constra moveDuration = 0 removeDuration = 0 } - itx.layoutManager = GridLayoutManager(context, 3, GridLayoutManager.VERTICAL, false) + itx.layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false) itx.background = shape(solid = Color.parseColor("#80000000"), radius = 40.PX) itx.addItemDecoration( CommonDividerItemDecoration.Builder() - .horizontalExternalSpace(66.PX) - .verticalExternalSpace(60.PX) - .spanCountTBCare(false) - .verticalInnerSpace(50.PX) - .horizontalInnerSpace(116.PX) + .horizontalExternalSpace(38.PX) + .verticalExternalSpace(30.PX) + .spanCountLRCare(false) + .horizontalInnerSpace(50.PX) .build() ) val adapter = model.status.value?.let { data -> StatusAdapter(context, data.second) }?.also { adapter -> itx.adapter = adapter } @@ -92,7 +91,6 @@ internal class StatusView(private val model: StatusModel, ctx: Context): Constra } private fun animate(expand: Boolean) { - iv.animate().rotation(if (expand) 0f else -180f).setDuration(200).start() TransitionManager.beginDelayedTransition(this, AutoTransition().setDuration(200)) rv.visibility = if (expand) View.VISIBLE else View.INVISIBLE } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/adapter/StatusAdapter.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/adapter/StatusAdapter.kt index 4aa4d23e0b..c502a25195 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/adapter/StatusAdapter.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/adapter/StatusAdapter.kt @@ -5,7 +5,10 @@ import android.view.* import android.widget.* import androidx.core.content.* import androidx.recyclerview.widget.* +import com.mogo.eagle.core.utilcode.kotlin.* +import com.mogo.eagle.core.utilcode.util.* import com.zhjt.mogo_core_function_devatools.* +import com.zhjt.mogo_core_function_devatools.R import com.zhjt.mogo_core_function_devatools.R.drawable import com.zhjt.mogo_core_function_devatools.status.entity.* import com.zhjt.mogo_core_function_devatools.status.entity.IpcStatus @@ -30,11 +33,10 @@ internal class StatusAdapter(val ctx: Context, var data: ArrayList): Rec itemView.findViewById(R.id.iv) } - private val tv: TextView by lazy { - itemView.findViewById(R.id.tv) - } - fun bind(status: Status) { + itemView.onClick { + ToastUtils.showShort(getText(status)) + } when(status) { is IpcStatus -> { if (status.enabled) { @@ -42,7 +44,6 @@ internal class StatusAdapter(val ctx: Context, var data: ArrayList): Rec } else { iv.background = ContextCompat.getDrawable(itemView.context, drawable.icon_dev_status_ipc_disable) } - tv.text = "工控机" } is CanStatus -> { if (status.enabled) { @@ -50,15 +51,12 @@ internal class StatusAdapter(val ctx: Context, var data: ArrayList): Rec } else { iv.background = ContextCompat.getDrawable(itemView.context, drawable.icon_dev_status_can_disable) } - tv.text = "CAN" } is NetStatus -> { if (status.enabled) { iv.background = ContextCompat.getDrawable(itemView.context, drawable.icon_dev_status_net_enable) - tv.text = status.name ?: "WI-FI" } else { iv.background = ContextCompat.getDrawable(itemView.context, drawable.icon_dev_status_net_disable) - tv.text = "WI-FI" } } is GpsStatus -> { @@ -67,21 +65,17 @@ internal class StatusAdapter(val ctx: Context, var data: ArrayList): Rec } else { iv.background = ContextCompat.getDrawable(itemView.context, drawable.icon_dev_status_gps_disable) } - tv.text = "GPS" } is TracingStatus -> { when(status.state) { ROUTE_FAILED, TRACK_LOAD_FAIL, TRACK_NOT_EXIST, TRACK_FINDED, UNKNOWN -> { iv.background = ContextCompat.getDrawable(itemView.context, drawable.icon_dev_status_trace_unkown) - tv.text = "未知" } TRACK_LOADED -> { iv.background = ContextCompat.getDrawable(itemView.context, drawable.icon_dev_status_track_enable) - tv.text = "T" } ROUTE_LOADED -> { iv.background = ContextCompat.getDrawable(itemView.context, drawable.icon_dev_status_route_enable) - tv.text = "V" } } } @@ -91,9 +85,17 @@ internal class StatusAdapter(val ctx: Context, var data: ArrayList): Rec } else { iv.background = ContextCompat.getDrawable(itemView.context, drawable.icon_dev_status_rtk_disable) } - tv.text = status.desc } } } + + private fun getText(status: Status): String = when(status) { + is CanStatus -> "CAN:${ if (status.enabled) "状态正常" else "非正常连接" }" + is GpsStatus -> "GPS:${ if (status.enabled) "状态正常" else "非正常连接" }" + is IpcStatus -> "工控机:${ if (status.enabled) "状态正常" else "非正常连接" }" + is NetStatus -> "WIFI:${ if (status.enabled) "${status.name}" else "非正常连接" }" + is RTKStatus -> "${status.desc.uppercase()}:${ if (status.enabled) "状态正常" else "非正常连接" }" + is TracingStatus -> "轨迹类型:${ if (status.state == TRACK_LOADED) "循迹" else if (status.state == ROUTE_LOADED) "自主算路" else "暂无轨迹" }" + } } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_dev_status_un_fold.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_dev_status_un_fold.png index 5bd76829ae1e163081e4a3f8bfa92ca23ff26f9a..290ecce308db07f7f97ea63e4d6ef22c48705dbe 100644 GIT binary patch literal 12516 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 + app:layout_constraintEnd_toStartOf="@+id/iv" + app:layout_constraintTop_toTopOf="parent" + android:layout_marginEnd="20px" + android:overScrollMode="never" + app:layout_constraintBottom_toBottomOf="parent"/> diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/layout/layout_status_bar_item.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/layout_status_bar_item.xml index b9e7610987..ca92ba33fc 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/res/layout/layout_status_bar_item.xml +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/layout_status_bar_item.xml @@ -1,22 +1,5 @@ - - - - \ No newline at end of file + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt index 2697ddad0f..aa21b0bfd5 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt @@ -205,9 +205,8 @@ import java.util.* setProxyTrafficLightView(viewTrafficLightVr) setProxyLimitingSpeedView(viewLimitingVelocity) setViewNotificationProvider(this) - context?.also { - CallerDevaToolsManager.showStatusBar(it) + CallerDevaToolsManager.showStatusBar(it, vs_status_bar) } } @@ -1226,7 +1225,7 @@ import java.util.* } override fun hideSmallFragment() { - context?.let { CallerDevaToolsManager.showStatusBar(it) } + context?.let { CallerDevaToolsManager.showStatusBar(it, vs_status_bar) } val fragmentOverview = ARouter.getInstance().build(MoGoFragmentPaths.PATH_FRAGMENT_OVERVIEW) .navigation() as BaseFragment activity?.supportFragmentManager?.beginTransaction() diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/fragment_hmi.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/fragment_hmi.xml index e0bc4f03fd..ed3b74663e 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/fragment_hmi.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/fragment_hmi.xml @@ -112,23 +112,21 @@ android:id="@+id/ivBadCaseTools" android:layout_width="120px" android:layout_height="120px" - android:src="@drawable/bad_case_selector" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintStart_toEndOf="@id/ivToolsIcon" android:layout_marginStart="50px" android:layout_marginBottom="40px" - /> + android:src="@drawable/bad_case_selector" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toEndOf="@id/ivToolsIcon" /> + android:src="@drawable/ai_collect_selector" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toEndOf="@id/ivBadCaseTools" /> - + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" /> + diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt index df8eb59c45..fcbafafc21 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt @@ -107,7 +107,7 @@ interface IDevaToolsProvider : IProvider { /** * 展示状态栏 */ - fun showStatusBar(ctx: Context) + fun showStatusBar(ctx: Context, anchor: View) /** * 隐藏状态栏 diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt index f4baa19770..509a611781 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt @@ -2,7 +2,7 @@ package com.mogo.eagle.core.function.call.devatools import android.app.Activity import android.content.Context -import android.view.View +import android.view.* import com.mogo.eagle.core.data.config.* import com.mogo.eagle.core.data.constants.MogoServicePaths import com.mogo.eagle.core.data.deva.chain.ChainLogParam @@ -150,9 +150,18 @@ object CallerDevaToolsManager { /** * 展示状态栏 */ - fun showStatusBar(ctx: Context) { + fun showStatusBar(ctx: Context, anchor: View) { if (!AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { - devaToolsProviderApi?.showStatusBar(ctx) + if (anchor.isLaidOut) { + devaToolsProviderApi?.showStatusBar(ctx, anchor) + } else { + anchor.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener { + override fun onGlobalLayout() { + devaToolsProviderApi?.showStatusBar(ctx, anchor) + anchor.viewTreeObserver.removeOnGlobalLayoutListener(this) + } + }) + } } }