From 107d5f7d909c533832b7e3e5ef994b11df8b6fb2 Mon Sep 17 00:00:00 2001 From: renwj Date: Tue, 15 Feb 2022 20:22:51 +0800 Subject: [PATCH 01/12] =?UTF-8?q?[BadCase]=E8=A7=A3=E5=86=B3BadCase?= =?UTF-8?q?=E5=85=A5=E5=8F=A3=E4=B8=8EOCH=E6=A8=A1=E5=9D=97=E4=B9=8B?= =?UTF-8?q?=E9=97=B4=E7=9A=84=E6=98=BE=E7=A4=BA=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [BadCase]解决BadCase入口与OCH模块之间的显示问题 [BadCase]解决BadCase入口与OCH模块之间的显示问题 [BadCase]解决BadCase入口与OCH模块之间的显示问题 --- .../com/mogo/launcher/MogoApplication.java | 1 + .../mogo-core-function-hmi/build.gradle | 1 - .../core/function/hmi/ui/MoGoHmiFragment.kt | 49 ++++++++++-- .../eagle/core/data/config/HmiBuildConfig.kt | 6 ++ .../api/hmi/warning/IMoGoWaringProvider.kt | 14 ++++ .../function/call/hmi/CallerHmiManager.kt | 80 +++++++++++-------- .../eagle/core/utilcode/kotlin/ExtensionKt.kt | 50 ++++++++++++ .../core/utilcode/reminder/api/IReminder.kt | 47 +---------- .../reminder/api/impl/ViewReminder.kt | 1 + 9 files changed, 164 insertions(+), 85 deletions(-) diff --git a/app/src/main/java/com/mogo/launcher/MogoApplication.java b/app/src/main/java/com/mogo/launcher/MogoApplication.java index 5e08058c59..a7e48a495f 100644 --- a/app/src/main/java/com/mogo/launcher/MogoApplication.java +++ b/app/src/main/java/com/mogo/launcher/MogoApplication.java @@ -84,6 +84,7 @@ public class MogoApplication extends MainMoGoApplication { HmiBuildConfig.isShowAutopilotStatusView = false; HmiBuildConfig.isShowPerspectiveSwitchView = false; HmiBuildConfig.isShowToolsView = false; + HmiBuildConfig.isShowBadCaseView = false; } if (DebugConfig.getProductFlavor().equals("fPadLenovoOchTaxi") diff --git a/core/function-impl/mogo-core-function-hmi/build.gradle b/core/function-impl/mogo-core-function-hmi/build.gradle index 8cd0c27a2c..37a0f41171 100644 --- a/core/function-impl/mogo-core-function-hmi/build.gradle +++ b/core/function-impl/mogo-core-function-hmi/build.gradle @@ -53,7 +53,6 @@ dependencies { implementation rootProject.ext.dependencies.mogoaicloudtrafficlive kapt rootProject.ext.dependencies.aroutercompiler - kapt rootProject.ext.dependencies.androidxroomcompiler implementation rootProject.ext.dependencies.androidxroomruntime implementation rootProject.ext.dependencies.androidxroomktx 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 ad1ce39e3d..30b4e0e0d0 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 @@ -7,6 +7,8 @@ import android.text.TextUtils import android.util.Log import android.view.* import android.view.animation.OvershootInterpolator +import androidx.lifecycle.Lifecycle.Event.ON_DESTROY +import androidx.lifecycle.LifecycleEventObserver import androidx.lifecycle.lifecycleScope import com.alibaba.android.arouter.facade.annotation.Route import com.mogo.cloud.passport.MoGoAiCloudClientConfig @@ -41,6 +43,7 @@ import com.mogo.eagle.core.function.hmi.ui.tools.AutoPilotBadCaseView import com.mogo.eagle.core.function.hmi.ui.tools.Repository import com.mogo.eagle.core.function.hmi.ui.tools.post import com.mogo.eagle.core.function.hmi.ui.widget.V2XNotificationView +import com.mogo.eagle.core.utilcode.kotlin.lifecycleOwner import com.mogo.eagle.core.utilcode.kotlin.onClick import com.mogo.eagle.core.utilcode.mogo.logger.Logger import com.mogo.eagle.core.utilcode.util.ThreadUtils @@ -90,6 +93,9 @@ class MoGoHmiFragment : MvpFragment private var autoPilotBadCaseView: AutoPilotBadCaseView? = null + private var onBadCaseShow: (() -> Unit)? = null + private var onBadCaseHide: (() -> Unit)? = null + companion object { private const val MSG_WHAT_DISMISS_BAD_CASE_ENTRY = 0x1010 private val CASE_EXPIRE_DURATION = TimeUnit.HOURS.toMillis(4) @@ -186,6 +192,7 @@ class MoGoHmiFragment : MvpFragment } dismissBadCaseFloatView() entrance.visibility = View.GONE + onBadCaseHide?.invoke() } return@Callback true } @@ -224,7 +231,7 @@ class MoGoHmiFragment : MvpFragment } } - @ExperimentalCoroutinesApi + @OptIn(ExperimentalCoroutinesApi::class) override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) CallerAutopilotIdentifyListenerManager.addListener(TAG, this) @@ -242,7 +249,7 @@ class MoGoHmiFragment : MvpFragment } } - @ExperimentalCoroutinesApi + @OptIn(ExperimentalCoroutinesApi::class) override fun onAutopilotRecordResult(record: AutoPilotRecordResult?) { record ?: return Log.d("QQQ", "onAutopilotRecordResult:$record") @@ -271,9 +278,11 @@ class MoGoHmiFragment : MvpFragment private fun showBadCaseEntrance(record: AutoPilotRecordResult) { Log.d("QQQ", "showBadCaseEntrance:$record") lifecycleScope.launch { - if (vs_bad_case_entrance?.parent != null) { - val inflateView = vs_bad_case_entrance.inflate() - autoPilotBadCaseEntrance = inflateView + if (HmiBuildConfig.isShowBadCaseView) { + if (vs_bad_case_entrance?.parent != null) { + val inflateView = vs_bad_case_entrance.inflate() + autoPilotBadCaseEntrance = inflateView + } } val entrance = autoPilotBadCaseEntrance Log.d("QQQ", "show --- 1 ----") @@ -285,13 +294,42 @@ class MoGoHmiFragment : MvpFragment entrance.onClick { showBadCasesFloat { it.visibility = View.GONE + onBadCaseHide?.invoke() } } dismissBadCaseEntryAfterSomeTime() + } else { + onBadCaseShow?.invoke() } } } + override fun showBadCaseEntrance(entrance: View) { + entrance.lifecycleOwner.lifecycle.addObserver(badCaseEntranceObserver) + autoPilotBadCaseEntrance = entrance + lifecycleScope.launch { + withContext(Dispatchers.IO) { + val dao = Repository.dao() + dao.getAllUnConsumedRecords()?.first()?.let { + showBadCaseEntrance(it) + } + } + } + } + + private val badCaseEntranceObserver = LifecycleEventObserver { _, event -> + if (event == ON_DESTROY) { + onBadCaseShow = null + onBadCaseHide = null + autoPilotBadCaseEntrance = null + } + } + + override fun registerBadCaseCallback(onShow: () -> Unit, onHide: (() -> Unit)?) { + onBadCaseShow = onShow + onBadCaseHide = onHide + } + private fun showBadCasesFloat(dismiss: (() -> Unit)?) { Log.d("QQQ", "showBadCaseToolsFloat") context?.let { it -> @@ -496,7 +534,6 @@ class MoGoHmiFragment : MvpFragment } else { setToolsViewVisibility(View.GONE) } - } override fun getLayoutId(): Int { diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/HmiBuildConfig.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/HmiBuildConfig.kt index 0cf33de7bf..f7fc86db0a 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/HmiBuildConfig.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/HmiBuildConfig.kt @@ -29,4 +29,10 @@ object HmiBuildConfig { */ @JvmField var isShowToolsView = true + + /** + * 是否展示BadCase按钮 + */ + @JvmField + var isShowBadCaseView = true } \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/warning/IMoGoWaringProvider.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/warning/IMoGoWaringProvider.kt index e79b4250cc..50ded93312 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/warning/IMoGoWaringProvider.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/warning/IMoGoWaringProvider.kt @@ -1,5 +1,6 @@ package com.mogo.eagle.core.function.api.hmi.warning +import android.view.View import com.mogo.eagle.core.data.enums.WarningDirectionEnum import com.mogo.eagle.core.data.notice.NoticeNormalData import com.mogo.eagle.core.data.notice.NoticeTrafficStylePushData @@ -179,4 +180,17 @@ interface IMoGoWaringProvider { */ fun showAdUpgradeStatus(upgradeMode : Int,downloadStatus : Int,currentProgress : Int,totalProgress : Int ,downloadVersion : String,upgradeStatus : Int) + + + /** + * 显示BadCase入口 + */ + fun showBadCaseEntrance(entrance: View) + + /** + * 注册badcase入口展示和隐藏的回调 + * 当[onShow]被调用时,调用[showBadCaseEntrance] + * [onHide]回调不用关心,可以不注册 + */ + fun registerBadCaseCallback(onShow:() -> Unit, onHide: (() -> Unit)?) } \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt index a7145bc80f..04ffc50d4e 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt @@ -1,5 +1,6 @@ package com.mogo.eagle.core.function.call.hmi +import android.view.View import com.alibaba.android.arouter.launcher.ARouter import com.mogo.eagle.core.data.constants.MoGoFragmentPaths import com.mogo.eagle.core.data.enums.WarningDirectionEnum @@ -16,16 +17,16 @@ import com.mogo.eagle.core.function.call.base.CallerBase * HMI 调用者管理,这里对外及其他模块提供功能的调用,用啥写啥,不要过度设计,不允许直接将Provider暴露出去 */ object CallerHmiManager : CallerBase() { - private val waringProviderApi: IMoGoWaringProvider + private val waringProviderApi get() = ARouter.getInstance().build(MoGoFragmentPaths.PATH_FRAGMENT_HMI) - .navigation() as IMoGoWaringProvider; + .navigation() as? IMoGoWaringProvider; /** * 隐藏 脉速表 * @param visibility View.VISIBLE, View.INVISIBLE,View.GONE */ fun setSpeedChartViewVisibility(visibility: Int) { - waringProviderApi.setSpeedChartViewVisibility(visibility) + waringProviderApi?.setSpeedChartViewVisibility(visibility) } /** @@ -33,7 +34,7 @@ object CallerHmiManager : CallerBase() { * @param visibility View.VISIBLE, View.INVISIBLE,View.GONE */ fun setAutopilotStatusViewVisibility(visibility: Int) { - waringProviderApi.setAutopilotStatusViewVisibility(visibility) + waringProviderApi?.setAutopilotStatusViewVisibility(visibility) } /** @@ -41,7 +42,7 @@ object CallerHmiManager : CallerBase() { * @param visibility View.VISIBLE, View.INVISIBLE,View.GONE */ fun setPerspectiveSwitchViewVisibility(visibility: Int) { - waringProviderApi.setPerspectiveSwitchViewVisibility(visibility) + waringProviderApi?.setPerspectiveSwitchViewVisibility(visibility) } /** @@ -49,21 +50,21 @@ object CallerHmiManager : CallerBase() { * @param visibility View.VISIBLE, View.INVISIBLE,View.GONE */ fun setToolsViewVisibility(visibility: Int) { - waringProviderApi.setToolsViewVisibility(visibility) + waringProviderApi?.setToolsViewVisibility(visibility) } /** * 控制转向灯和刹车功能 */ fun setTurnLightFunction(isOpen: Boolean) { - waringProviderApi.setTurnLightFunction(isOpen) + waringProviderApi?.setTurnLightFunction(isOpen) } /** * 开关DebugView */ fun toggleDebugView(){ - waringProviderApi.toggleDebugView() + waringProviderApi?.toggleDebugView() } /** @@ -75,7 +76,7 @@ object CallerHmiManager : CallerBase() { * @param tag tag绑定弹窗的标志 */ fun showWarningV2X(v2xType: Int, alertContent: CharSequence?, ttsContent: String?, tag: String?, listenerIMoGo: IMoGoWarningStatusListener?, playTts: Boolean, expireTime: Long = 5000L) { - waringProviderApi.showWarningV2X(v2xType, alertContent, ttsContent, tag, listenerIMoGo, playTts, expireTime) + waringProviderApi?.showWarningV2X(v2xType, alertContent, ttsContent, tag, listenerIMoGo, playTts, expireTime) } /** @@ -83,7 +84,7 @@ object CallerHmiManager : CallerBase() { * @param tag 弹窗标识 */ fun disableWarningV2X(tag: String?) { - waringProviderApi.disableWarningV2X(tag) + waringProviderApi?.disableWarningV2X(tag) } /** @@ -92,42 +93,42 @@ object CallerHmiManager : CallerBase() { * @param checkLightId 0-都是默认,1-红,2-黄,3-绿 */ fun showWarningTrafficLight(checkLightId: Int) { - waringProviderApi.showWarningTrafficLight(checkLightId) + waringProviderApi?.showWarningTrafficLight(checkLightId) } /** * 关闭红绿灯预警 */ fun disableWarningTrafficLight() { - waringProviderApi.disableWarningTrafficLight() + waringProviderApi?.disableWarningTrafficLight() } /** * 红绿灯是否展示 */ fun isWarningTrafficLightShow(): Boolean { - return waringProviderApi.isWarningTrafficLightShow() + return waringProviderApi?.isWarningTrafficLightShow() ?: false } /** * 修改红灯倒计时 */ fun changeCountdownRed(redNum: Int) { - waringProviderApi.changeCountdownRed(redNum) + waringProviderApi?.changeCountdownRed(redNum) } /** * 修改黄灯倒计时 */ fun changeCountdownYellow(yellowNum: Int) { - waringProviderApi.changeCountdownYellow(yellowNum) + waringProviderApi?.changeCountdownYellow(yellowNum) } /** * 修改绿灯倒计时 */ fun changeCountdownGreen(greenNum: Int) { - waringProviderApi.changeCountdownGreen(greenNum) + waringProviderApi?.changeCountdownGreen(greenNum) } /** @@ -136,7 +137,7 @@ object CallerHmiManager : CallerBase() { * @param greenNum 绿灯倒计时 */ fun changeCountdownTrafficLightNum(readNum: Int, yellowNum: Int, greenNum: Int) { - waringProviderApi.changeCountdownTrafficLightNum(readNum, yellowNum, greenNum) + waringProviderApi?.changeCountdownTrafficLightNum(readNum, yellowNum, greenNum) } /** @@ -145,14 +146,14 @@ object CallerHmiManager : CallerBase() { * @param limitingSpeed 限速速度 */ fun showLimitingVelocity(limitingSpeed: Int) { - waringProviderApi.showLimitingVelocity(limitingSpeed) + waringProviderApi?.showLimitingVelocity(limitingSpeed) } /** * 关闭限速预警 */ fun disableLimitingVelocity() { - waringProviderApi.disableLimitingVelocity() + waringProviderApi?.disableLimitingVelocity() } /** @@ -161,7 +162,7 @@ object CallerHmiManager : CallerBase() { * @see WarningDirectionEnum */ fun showWarning(direction: WarningDirectionEnum) { - waringProviderApi.showWarning(direction) + waringProviderApi?.showWarning(direction) } /** @@ -171,14 +172,14 @@ object CallerHmiManager : CallerBase() { * @param closeTime 倒计时 */ fun showWarning(direction: WarningDirectionEnum, closeTime: Long) { - waringProviderApi.showWarning(direction, closeTime) + waringProviderApi?.showWarning(direction, closeTime) } /** * 主动消失边框预警 */ fun dismissWarning(direction: WarningDirectionEnum) { - waringProviderApi.dismissWarning(direction) + waringProviderApi?.dismissWarning(direction) } /** @@ -187,7 +188,7 @@ object CallerHmiManager : CallerBase() { * @param trafficStylePushData */ fun showTrafficBanner(trafficStylePushData: NoticeTrafficStylePushData?) { - waringProviderApi.showNoticeForTrafficWithData(trafficStylePushData) + waringProviderApi?.showNoticeForTrafficWithData(trafficStylePushData) } /** @@ -195,21 +196,21 @@ object CallerHmiManager : CallerBase() { * */ fun showNoticeNormalData(noticeNormal: NoticeNormalData) { - waringProviderApi.showNoticeNormalData(noticeNormal) + waringProviderApi?.showNoticeNormalData(noticeNormal) } /** * 展示VIP标识 */ fun vipIdentification(visible: Boolean) { - waringProviderApi.vipIdentification(visible) + waringProviderApi?.vipIdentification(visible) } /** * 开启道路视频直播 */ fun startRoadCameraLive(flvUrl: String) { - waringProviderApi.startRoadCameraLive(flvUrl) + waringProviderApi?.startRoadCameraLive(flvUrl) } /** @@ -218,7 +219,7 @@ object CallerHmiManager : CallerBase() { * @param light */ fun showTurnLight(light: Int) { - waringProviderApi.showTurnLight(light) + waringProviderApi?.showTurnLight(light) } /** @@ -227,19 +228,19 @@ object CallerHmiManager : CallerBase() { * @param brakeLight */ fun showBrakeLight(brakeLight: Int) { - waringProviderApi.showBrakeLight(brakeLight) + waringProviderApi?.showBrakeLight(brakeLight) } fun showNoSignalView() { - waringProviderApi.showNoSignView() + waringProviderApi?.showNoSignView() } fun showToolsView() { - waringProviderApi.showToolsView() + waringProviderApi?.showToolsView() } fun hideToolsView() { - waringProviderApi.hideToolsView() + waringProviderApi?.hideToolsView() } /** @@ -253,8 +254,23 @@ object CallerHmiManager : CallerBase() { */ fun showAdUpgradeStatus(upgradeMode : Int, downloadStatus : Int,currentProgress : Int,totalProgress : Int ,downloadVersion : String,upgradeStatus : Int){ - waringProviderApi.showAdUpgradeStatus(upgradeMode,downloadStatus, currentProgress, totalProgress, downloadVersion, upgradeStatus) + waringProviderApi?.showAdUpgradeStatus(upgradeMode,downloadStatus, currentProgress, totalProgress, downloadVersion, upgradeStatus) } + /** + * 显示BadCase入口 + */ + fun showBadCaseEntrance(entrance: View) { + waringProviderApi?.showBadCaseEntrance(entrance) + } + /** + * 注册badcase入口展示和隐藏的回调 + * 当[onShow]被调用时,调用[showBadCaseEntrance] + * [onHide]回调不用关心,可以不注册 + */ + fun registerBadCaseCallback(onShow:() -> Unit, onHide: (() -> Unit)?) { + waringProviderApi?.registerBadCaseCallback(onShow, onHide) + } + } \ No newline at end of file diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/kotlin/ExtensionKt.kt b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/kotlin/ExtensionKt.kt index 8d6e851291..1338c8e388 100644 --- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/kotlin/ExtensionKt.kt +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/kotlin/ExtensionKt.kt @@ -8,10 +8,60 @@ import android.util.TypedValue import android.view.View import androidx.annotation.ColorInt import androidx.annotation.IntRange +import androidx.core.view.ViewCompat +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleEventObserver +import androidx.lifecycle.LifecycleOwner +import androidx.lifecycle.LifecycleRegistry 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 java.util.* +val T.lifecycleOwner: LifecycleOwner + get() = getTag(R.id.view_lifecycle_owner) as? LifecycleOwner ?: object : LifecycleOwner, LifecycleEventObserver { + + private val lifecycle = LifecycleRegistry(this) + + init { + if (ViewCompat.isAttachedToWindow(this@lifecycleOwner)) { + lifecycle.let { + if (it.currentState.isAtLeast(Lifecycle.State.INITIALIZED)) { + it.currentState = Lifecycle.State.CREATED + } + } + } + addOnAttachStateChangeListener(object : View.OnAttachStateChangeListener { + override fun onViewAttachedToWindow(v: View?) { + lifecycle.let { + if (it.currentState.isAtLeast(Lifecycle.State.INITIALIZED)) { + it.currentState = Lifecycle.State.CREATED + } + } + } + + override fun onViewDetachedFromWindow(v: View?) { + lifecycle.let { + if (it.currentState.isAtLeast(Lifecycle.State.CREATED)) { + this@lifecycleOwner.removeOnAttachStateChangeListener(this) + it.currentState = Lifecycle.State.DESTROYED + } + } + } + }) + } + + override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) { + lifecycle.currentState = event.targetState + } + + override fun getLifecycle(): Lifecycle { + return lifecycle + } + + }.also { + setTag(R.id.view_lifecycle_owner, it) + } fun View.onClick(block: (View) -> Unit) { this.setOnClickListener { diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/reminder/api/IReminder.kt b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/reminder/api/IReminder.kt index 98e50ab69b..2711bacf5a 100644 --- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/reminder/api/IReminder.kt +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/reminder/api/IReminder.kt @@ -11,6 +11,7 @@ import androidx.core.view.ViewCompat import androidx.core.view.doOnAttach import androidx.core.view.doOnDetach import androidx.lifecycle.* +import com.mogo.eagle.core.utilcode.kotlin.lifecycleOwner import com.mogo.eagle.core.utilcode.util.R import com.mogo.eagle.core.utilcode.util.Utils import java.util.concurrent.ConcurrentHashMap @@ -106,52 +107,6 @@ interface IReminder : Comparable { } } - val T.lifecycleOwner: LifecycleOwner - get() = getTag(R.id.view_lifecycle_owner) as? LifecycleOwner ?: object : LifecycleOwner, LifecycleEventObserver { - - private val lifecycle = LifecycleRegistry(this) - - init { - if (ViewCompat.isAttachedToWindow(this@lifecycleOwner)) { - lifecycle.let { - if (it.currentState.isAtLeast(Lifecycle.State.INITIALIZED)) { - it.currentState = Lifecycle.State.CREATED - } - } - } - addOnAttachStateChangeListener(object : View.OnAttachStateChangeListener { - override fun onViewAttachedToWindow(v: View?) { - lifecycle.let { - if (it.currentState.isAtLeast(Lifecycle.State.INITIALIZED)) { - it.currentState = Lifecycle.State.CREATED - } - } - } - - override fun onViewDetachedFromWindow(v: View?) { - lifecycle.let { - if (it.currentState.isAtLeast(Lifecycle.State.CREATED)) { - this@lifecycleOwner.removeOnAttachStateChangeListener(this) - it.currentState = Lifecycle.State.DESTROYED - } - } - } - }) - } - - override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) { - lifecycle.currentState = event.targetState - } - - override fun getLifecycle(): Lifecycle { - return lifecycle - } - - }.also { - setTag(R.id.view_lifecycle_owner, it) - } - - val T.lifecycleOwner: LifecycleOwner get() = popupWindowLifecycleMap[this] ?: object : LifecycleOwner, LifecycleEventObserver { diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/reminder/api/impl/ViewReminder.kt b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/reminder/api/impl/ViewReminder.kt index d84fe98ee9..21a54c475c 100644 --- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/reminder/api/impl/ViewReminder.kt +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/reminder/api/impl/ViewReminder.kt @@ -3,6 +3,7 @@ package com.mogo.eagle.core.utilcode.reminder.api.impl import android.view.View import androidx.core.view.ViewCompat import androidx.lifecycle.LifecycleOwner +import com.mogo.eagle.core.utilcode.kotlin.lifecycleOwner import com.mogo.eagle.core.utilcode.reminder.api.IReminder abstract class ViewReminder(private val content: View): IReminder { From 7ae2d6c05afeb4723b1cc47315d241462a4554e2 Mon Sep 17 00:00:00 2001 From: pangfan Date: Wed, 16 Feb 2022 11:24:55 +0800 Subject: [PATCH 02/12] =?UTF-8?q?[Bus/TaxiDriver=20v2.5.1]OCH:=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0badcase=E5=85=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bus/fragment/BaseOchBusTabFragment.java | 13 ++++++++++ .../bus_badcase_btn_bg.png | Bin 0 -> 10628 bytes .../src/main/res/layout/bus_base_fragment.xml | 13 +++++++++- .../och/taxi/ui/BaseOchTaxiTabFragment.java | 17 +++++++++++++ .../taxi_badcase_btn_bg.png | Bin 0 -> 10628 bytes .../main/res/layout/taxi_base_fragment.xml | 24 +++++++++++++----- 6 files changed, 59 insertions(+), 8 deletions(-) create mode 100644 OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_badcase_btn_bg.png create mode 100644 OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_badcase_btn_bg.png diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseOchBusTabFragment.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseOchBusTabFragment.java index 444c21166e..d225ad6729 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseOchBusTabFragment.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseOchBusTabFragment.java @@ -52,6 +52,7 @@ public abstract class BaseOchBusTabFragment { + CallerHmiManager.INSTANCE.showBadCaseEntrance(mBadcaseBtn); + }); + CallerHmiManager.INSTANCE.registerBadCaseCallback( + () -> { // onShow() + mBadcaseBtn.setVisibility(View.VISIBLE); + return null; }, + () -> { // onHide() + mBadcaseBtn.setVisibility(View.GONE); + return null; }); } /** diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_badcase_btn_bg.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_badcase_btn_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..89a6eaa5dca99850ecda80b9609d00e9cb647aea GIT binary patch literal 10628 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 e-{>F1 - + + { + CallerHmiManager.INSTANCE.showBadCaseEntrance(mBadcaseBtn); + }); + CallerHmiManager.INSTANCE.registerBadCaseCallback( + () -> { // onShow() + mBadcaseBtn.setVisibility(View.VISIBLE); + return null; }, + () -> { // onHide() + mBadcaseBtn.setVisibility(View.GONE); + return null; }); + panelView = LayoutInflater.from(getContext()).inflate(getStationPanelViewId(), flStationPanelContainer); ctvAutopilotStatus.setOnClickListener(new OnPreventFastClickListener() { @Override diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_badcase_btn_bg.png b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_badcase_btn_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..89a6eaa5dca99850ecda80b9609d00e9cb647aea GIT binary patch literal 10628 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 e-{>F1 - + android:background="@drawable/taxi_setting_btn_bg" /> + app:layout_constraintLeft_toRightOf="@id/module_och_taxi_setting_layout"> - + android:background="@drawable/taxi_switch_map_bg" /> + +