diff --git a/app/src/androidTest/AndroidManifest.xml b/app/src/androidTest/AndroidManifest.xml new file mode 100644 index 0000000000..a09f1154a6 --- /dev/null +++ b/app/src/androidTest/AndroidManifest.xml @@ -0,0 +1,13 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/androidTest/java/com/mogo/functions/test/ReminderTest.kt b/app/src/androidTest/java/com/mogo/functions/test/ReminderTest.kt new file mode 100644 index 0000000000..e600531b94 --- /dev/null +++ b/app/src/androidTest/java/com/mogo/functions/test/ReminderTest.kt @@ -0,0 +1,390 @@ +package com.mogo.functions.test + +import android.animation.Animator +import android.app.Activity +import android.content.Context +import android.content.Intent +import android.graphics.Color +import android.text.TextUtils +import android.view.Gravity +import android.view.View +import android.view.ViewGroup +import android.view.WindowManager +import android.view.animation.OvershootInterpolator +import android.widget.PopupWindow +import androidx.core.view.ViewCompat +import androidx.lifecycle.lifecycleScope +import androidx.test.core.app.ActivityScenario +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.LargeTest +import com.mogo.commons.voice.AIAssist +import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener +import com.mogo.eagle.core.function.hmi.notification.WarningFloat +import com.mogo.eagle.core.function.hmi.notification.anim.DefaultAnimator +import com.mogo.eagle.core.function.hmi.notification.enums.SidePattern +import com.mogo.eagle.core.function.hmi.ui.widget.V2XNotificationView +import com.mogo.eagle.core.function.main.MainLauncherActivity +import com.mogo.eagle.core.utilcode.kotlin.shape +import com.mogo.eagle.core.utilcode.mogo.logger.Logger +import com.mogo.eagle.core.utilcode.reminder.Reminder +import com.mogo.eagle.core.utilcode.reminder.api.impl.ActivityReminder +import com.mogo.eagle.core.utilcode.reminder.api.impl.PopupWindowReminder +import com.mogo.eagle.core.utilcode.reminder.api.impl.ViewReminder +import com.mogo.eagle.core.utilcode.util.AppStateManager +import com.mogo.module.common.enums.EventTypeEnum +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay +import kotlinx.coroutines.runBlocking +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import java.lang.Integer.min +import java.util.concurrent.TimeUnit + + +@RunWith(AndroidJUnit4::class) +@LargeTest +class ReminderTest { + + lateinit var launch: ActivityScenario + + @Before + fun before() { + launch = ActivityScenario.launch(MainLauncherActivity::class.java) + } + + @Test + fun testViewReminderNotOverride() = runBlocking(Dispatchers.Main) { + launch.onActivity { + it.lifecycleScope.launchWhenResumed { + for (i in 1..10) { + val reminder = WindowManagerViewUnOverrideReminder(View(it).also { itx -> itx.background = shape(solid = color(i)) }, 300, 300) + Reminder.enqueue(it, reminder) + delay(TimeUnit.SECONDS.toMillis(3)) + reminder.hide() + } + } + } + delay(TimeUnit.SECONDS.toMillis(100)) + return@runBlocking + } + + @Test + fun testViewReminderOverride() = runBlocking(Dispatchers.Main) { + launch.onActivity { + it.lifecycleScope.launchWhenCreated { + for (i in 1..10) { + val reminder = WindowManagerViewOverrideReminder(View(it).also { itx -> itx.background = shape(solid = color(i)) }, 300, 300) + Reminder.enqueue(it, reminder) + delay(TimeUnit.SECONDS.toMillis(3)) + } + } + } + delay(TimeUnit.SECONDS.toMillis(100)) + return@runBlocking + } + + @Test + fun testViewReminderWhenActivityDestroyed() = runBlocking(Dispatchers.Main) { + launch.onActivity { + it.lifecycleScope.launchWhenCreated { + for (i in 1..10) { + val reminder = WindowManagerViewOverrideReminder(View(it).also { itx -> itx.background = shape(solid = color(i)) }, 300, 300) + Reminder.enqueue(it, reminder) + delay(TimeUnit.SECONDS.toMillis(3)) + + if (i == 8) { + it.finish() + } + } + } + } + delay(TimeUnit.SECONDS.toMillis(100)) + } + + @Test + fun testWarningFloat() = runBlocking(Dispatchers.Main) { + launch.onActivity { + it.lifecycleScope.launchWhenCreated { + for (i in 1..10) { + val v = View(it).also { + it.background = shape(solid = color(i)) + it.layoutParams = WindowManager.LayoutParams().also { itx -> + itx.width = 300 + itx.height = 400 + } + } + val builder = WarningFloat.with(it).setTag("test${i}").setLayout(v).setSidePattern(SidePattern.RESULT_TOP).setCountDownTime(TimeUnit.SECONDS.toMillis(10)).setGravity(Gravity.CENTER_HORIZONTAL, offsetY = 110).setImmersionStatusBar(true).addWarningStatusListener(object : + IMoGoWarningStatusListener { + override fun onShow() { + + } + }).setAnimator(object : DefaultAnimator() { + override fun enterAnim(view: View, params: WindowManager.LayoutParams, windowManager: WindowManager, sidePattern: SidePattern): Animator? = super.enterAnim(view, params, windowManager, sidePattern)?.apply { + interpolator = OvershootInterpolator() + } + + override fun exitAnim(view: View, params: WindowManager.LayoutParams, windowManager: WindowManager, sidePattern: SidePattern): Animator? = super.exitAnim(view, params, windowManager, sidePattern)?.setDuration(200) + }) + Reminder.enqueue(it, WarningFloatReminder(builder)) + delay(TimeUnit.SECONDS.toMillis(3)) + } + + } + } + delay(TimeUnit.SECONDS.toMillis(100)) + } + + + @Test + fun testActivityReminder() = runBlocking(Dispatchers.Main) { + launch.onActivity { + it.lifecycleScope.launchWhenResumed { + for (i in 1..10) { + val reminder = ActivityNameReminder(it, "com.mogo.launcher.TestActivity") + Reminder.enqueue(it, reminder) + delay(TimeUnit.SECONDS.toMillis(6)) + reminder.hide() + } + } + } + delay(TimeUnit.SECONDS.toMillis(100)) + } + + @Test + fun testActivityReminderOverride() = runBlocking(Dispatchers.Main) { + launch.onActivity { + it.lifecycleScope.launchWhenResumed { + for (i in 1..10) { + val reminder = ActivityNameOverrideReminder(it, "com.mogo.launcher.TestActivity") + Reminder.enqueue(it, reminder) + delay(TimeUnit.SECONDS.toMillis(6)) + } + } + } + delay(TimeUnit.SECONDS.toMillis(100)) + } + + + @Test + fun testPopupWindowReminder() = runBlocking { + launch.onActivity { + it.lifecycleScope.launchWhenResumed { + for (i in 1..10) { + + val reminder = TestPopupWindowReminder(it.findViewById(android.R.id.content), PopupWindow(WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT).also { itx -> + itx.contentView = View(it).also { + xx -> xx.background = shape(solid = color(i)) + xx.layoutParams = ViewGroup.LayoutParams(300, 400) + } + }) + Reminder.enqueue(it, reminder) + delay(TimeUnit.SECONDS.toMillis(3)) + reminder.hide() + } + } + } + delay(TimeUnit.SECONDS.toMillis(100)) + } + + @Test + fun testPopupWindowReminderOverride() = runBlocking { + launch.onActivity { + it.lifecycleScope.launchWhenResumed { + for (i in 1..10) { + + val reminder = TestPopupWindowReminderOverride(it.findViewById(android.R.id.content), PopupWindow(WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT).also { itx -> + itx.contentView = View(it).also { + xx -> xx.background = shape(solid = color(i)) + xx.layoutParams = ViewGroup.LayoutParams(300, 400) + } + }) + Reminder.enqueue(it, reminder) + delay(TimeUnit.SECONDS.toMillis(3)) + } + } + } + delay(TimeUnit.SECONDS.toMillis(100)) + } + + @Test + fun testWarningFloatForProject() = runBlocking { + launch.onActivity { + it.lifecycleScope.launchWhenResumed { + for (i in 1..10) { + val notificationView = V2XNotificationView(it) + notificationView.setWarningIcon(EventTypeEnum.getWarningIcon("10003")) + notificationView.setWarningContent("XXXXXX${i}") + WarningFloat.with(it) + .setTag("tag") + .setLayout(notificationView) + .setSidePattern(SidePattern.RESULT_TOP) + .setCountDownTime(5000) + .setGravity(Gravity.CENTER_HORIZONTAL, offsetY = 110) + .setImmersionStatusBar(true) + .addWarningStatusListener(object : IMoGoWarningStatusListener { + override fun onShow() { + } + }) + .setAnimator(object : DefaultAnimator() { + override fun enterAnim( + view: View, + params: WindowManager.LayoutParams, + windowManager: WindowManager, + sidePattern: SidePattern + ): Animator? = + super.enterAnim(view, params, windowManager, sidePattern)?.apply { + interpolator = OvershootInterpolator() + } + + override fun exitAnim( + view: View, + params: WindowManager.LayoutParams, + windowManager: WindowManager, + sidePattern: SidePattern + ): Animator? = + super.exitAnim(view, params, windowManager, sidePattern)?.setDuration(200) + }) + .show() + delay(2000) + } + } + } + delay(TimeUnit.SECONDS.toMillis(100)) + } + + + class WarningFloatReminder(private val builder: WarningFloat.Builder) : ViewReminder(builder.config.layoutView!!) { + + override fun show() { + builder.show() + } + + override fun hide() { + WarningFloat.dismiss(builder.config.floatTag, false) + } + + override fun isOverride(): Boolean { + return true + } + } + + + class WindowManagerViewUnOverrideReminder(private val content: View, private val width: Int, private val height: Int) : ViewReminder(content) { + + private val wm by lazy { + content.context.getSystemService(Activity.WINDOW_SERVICE) as WindowManager + } + + private var isAdd = false + + override fun show() { + if (!isAdd) { + val params = WindowManager.LayoutParams().also { + it.width = width + it.height = height + } + params.gravity = Gravity.CENTER + wm.addView(content, params) + isAdd = true + } + } + + override fun hide() { + if (isAdd && ViewCompat.isAttachedToWindow(content)) { + wm.removeView(content) + isAdd = false + } + } + } + + + class WindowManagerViewOverrideReminder(private val content: View, private val width: Int, private val height: Int) : ViewReminder(content) { + + private val wm by lazy { + content.context.getSystemService(Activity.WINDOW_SERVICE) as WindowManager + } + + private var isAdd = false + + override fun show() { + if (!isAdd) { + val params = WindowManager.LayoutParams().also { + it.width = width + it.height = height + } + params.gravity = Gravity.CENTER + wm.addView(content, params) + isAdd = true + } + } + + override fun hide() { + if (isAdd && ViewCompat.isAttachedToWindow(content)) { + wm.removeView(content) + isAdd = false + } + } + + override fun isOverride(): Boolean { + return true + } + } + + + class ActivityNameReminder(private val context: Context, private val className: String): ActivityReminder(className) { + + override fun show() { + Intent(context, Class.forName(className)).also { + context.startActivity(it) + } + } + + override fun hide() { + AppStateManager.currentActivity()?.takeIf { it.javaClass.name == className }?.finish() + } + } + + class ActivityNameOverrideReminder(private val context: Context, private val className: String): ActivityReminder(className) { + + override fun show() { + Intent(context, Class.forName(className)).also { + context.startActivity(it) + } + } + + override fun hide() { + AppStateManager.currentActivity()?.takeIf { it.javaClass.name == className }?.finish() + } + + override fun isOverride(): Boolean { + return true + } + } + + class TestPopupWindowReminder(private val anchor: View, private val popupWindow: PopupWindow): PopupWindowReminder(popupWindow) { + + override fun show() { + popupWindow.showAtLocation(anchor, Gravity.CENTER, 0, 0) + } + } + + class TestPopupWindowReminderOverride(private val anchor: View, private val popupWindow: PopupWindow): PopupWindowReminder(popupWindow) { + + override fun show() { + popupWindow.showAtLocation(anchor, Gravity.CENTER, 0, 0) + } + + override fun isOverride(): Boolean { + return true + } + } + + private fun color(index: Int): Int { + if (index > 10) { + return Color.BLACK + } + val alpha = min(255, 255 - index * 20) + return Color.argb(alpha, Color.red(Color.RED), Color.green(Color.RED), Color.blue(Color.RED)) + } +} \ No newline at end of file diff --git a/config.gradle b/config.gradle index 400e2fbd8b..3e60318c27 100644 --- a/config.gradle +++ b/config.gradle @@ -247,6 +247,7 @@ ext { life_cycle_scope : "androidx.lifecycle:lifecycle-runtime-ktx:2.2.0", view_model_scope : "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0", live_data_scope : "androidx.lifecycle:lifecycle-livedata-ktx:2.2.0", + life_cycle_java8 : "androidx.lifecycle:lifecycle-common-java8:2.2.0", //========================== Unit Test ====================== @@ -255,7 +256,8 @@ ext { androidx_unit_ext : "androidx.test.ext:junit:1.1.2", androidx_unit_ext_ktx : "androidx.test.ext:junit-ktx:1.1.2", androidx_runner : "androidx.test:runner:1.3.0", - androidx_espresso_core : "androidx.test.espresso:espresso-core:3.3.0", + androidx_espresso_core : "androidx.test.espresso:espresso-core:3.3.0" + ] } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-check/src/main/java/com/mogo/eagle/core/function/check/VehicleMonitoringManager.kt b/core/function-impl/mogo-core-function-check/src/main/java/com/mogo/eagle/core/function/check/VehicleMonitoringManager.kt index 88eeed3a61..7b375408f3 100644 --- a/core/function-impl/mogo-core-function-check/src/main/java/com/mogo/eagle/core/function/check/VehicleMonitoringManager.kt +++ b/core/function-impl/mogo-core-function-check/src/main/java/com/mogo/eagle/core/function/check/VehicleMonitoringManager.kt @@ -2,7 +2,6 @@ package com.mogo.eagle.core.function.check import android.content.Context import android.content.Intent -import android.util.Log import com.alibaba.android.arouter.facade.annotation.Route import com.mogo.eagle.core.data.constants.MogoServicePaths import com.mogo.eagle.core.function.api.check.ICheckProvider @@ -12,10 +11,7 @@ import com.mogo.eagle.core.function.check.net.CheckNetWork.checkNetWork import com.mogo.eagle.core.function.check.net.CheckResultData import com.mogo.eagle.core.function.check.view.CheckActivity import com.mogo.eagle.core.function.check.view.CheckDialog -import com.mogo.eagle.core.utilcode.util.ActivityLifecycleManager -import com.mogo.eagle.core.utilcode.util.ActivityUtils -import com.mogo.eagle.core.utilcode.util.AppUtils -import com.mogo.eagle.core.utilcode.util.LogUtils +import com.mogo.eagle.core.utilcode.util.* import com.mogo.module.common.MogoApisHandler import com.mogo.module.service.receiver.MogoReceiver import com.mogo.service.statusmanager.IMogoStatusChangedListener @@ -89,7 +85,7 @@ class VehicleMonitoringManager : ICheckProvider, IMogoStatusChangedListener { */ private fun showDialog(context: Context) { try { - if (ActivityLifecycleManager.getInstance().isAppActive && AppUtils.isAppRunning( + if (AppStateManager.isActive() && AppUtils.isAppRunning( AppUtils.getAppPackageName() ) && ActivityUtils.getTopActivity() !is CheckActivity ) { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningFloat.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningFloat.kt index dd0750ac92..3978fd41dc 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningFloat.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningFloat.kt @@ -1,11 +1,18 @@ package com.mogo.eagle.core.function.hmi.notification import android.content.Context +import android.content.ContextWrapper +import android.view.LayoutInflater import android.view.View +import androidx.appcompat.view.ContextThemeWrapper +import androidx.lifecycle.LifecycleOwner +import androidx.lifecycle.ProcessLifecycleOwner import com.mogo.eagle.core.function.hmi.notification.enums.SidePattern import com.mogo.eagle.core.function.hmi.notification.interfaces.OnFloatAnimator import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener import com.mogo.eagle.core.utilcode.mogo.logger.Logger +import com.mogo.eagle.core.utilcode.reminder.Reminder +import com.mogo.eagle.core.utilcode.reminder.api.impl.ViewReminder import com.mogo.eagle.core.utilcode.util.WindowUtils /** @@ -33,7 +40,6 @@ class WarningFloat { } - /** * 浮窗的属性构建类,支持链式调用 */ @@ -155,6 +161,10 @@ class WarningFloat { this.config.height = height } + fun isOverride(isOverride: Boolean) = apply { + this.config.isOverride = isOverride + } + /** * 创建浮窗,包括Activity浮窗和系统浮窗,如若系统浮窗无权限,先进行权限申请 */ @@ -164,9 +174,62 @@ class WarningFloat { config.layoutId == null && config.layoutView == null -> Logger.e(TAG, "需要传入 layoutId 或 layoutView ") // 申请浮窗权限 - else -> WarningFloatWindowManager.create(activity, config) + else -> { + var content: View? = null + if (config.layoutView != null) { + content = config.layoutView + } else if (config.layoutId != null) { + content = LayoutInflater.from(activity).inflate(config.layoutId!!, null) + } + content?.let { + config.layoutId = null + config.layoutView = it + Reminder.enqueue(getLifecycleOwner(activity), WarningFloatReminder(activity, config, it)) + } + } } } + private fun getLifecycleOwner(context: Context): LifecycleOwner { + if (context is LifecycleOwner) { + return context + } + if (context is ContextThemeWrapper) { + return getLifecycleOwner(context.baseContext) + } + return ProcessLifecycleOwner.get() + } + + + internal class WarningFloatReminder(private val activity: Context, private val config: WarningNotificationConfig, content: View): ViewReminder(content) { + + private var hasShow = false + + override fun show() { + hasShow = !WarningFloatWindowManager.create(activity, config) + } + + override fun hide() { + dismiss(config.floatTag, false) + } + + override fun isOverride(): Boolean { + return config.isOverride + } + + override fun maxProtectDuration(): Long { + return if (hasShow) 0L else super.maxProtectDuration() + } + } + + fun isShow(): Boolean = WarningFloatWindowManager.getHelper(config.floatTag)?.isShow() ?: false + + fun resetExpireTime(expireTime: Long) { + if (!isShow()) { + return + } + WarningFloatWindowManager.getHelper(config.floatTag)?.resetDownTime(expireTime) + } } + } \ 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/notification/WarningFloatWindowHelper.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningFloatWindowHelper.kt index 639df0470b..566fb26c10 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningFloatWindowHelper.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningFloatWindowHelper.kt @@ -131,6 +131,11 @@ internal class WarningFloatWindowHelper( } } + fun resetDownTime(expireTime: Long) { + config.countDownTime = expireTime + resetDownTime() + } + /** * 入场动画 */ @@ -292,5 +297,5 @@ internal class WarningFloatWindowHelper( windowManager.updateViewLayout(view, params) } - + fun isShow(): Boolean = config.isShow } \ 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/notification/WarningFloatWindowManager.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningFloatWindowManager.kt index a4b640d1d8..856bcd8934 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningFloatWindowManager.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningFloatWindowManager.kt @@ -18,15 +18,17 @@ internal object WarningFloatWindowManager { * 创建浮窗,tag不存在创建,tag存在创建失败 * 创建结果通过tag添加到相应的map进行管理 */ - fun create(context: Context, config: WarningNotificationConfig) { + fun create(context: Context, config: WarningNotificationConfig): Boolean { if (!checkTag(config)) { val helper = WarningFloatWindowHelper(context, config) if (helper.createWindow()) windowMap[config.floatTag!!] = helper + return true } else { Log.w(TAG, "存在相同的tag,延长弹窗时间") // 存在相同的tag,直接创建失败 config.callbacks?.createdResult(false, "存在相同的tag,延长弹窗时间", null) windowMap[config.floatTag!!]?.resetDownTime() + return false } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningNotificationConfig.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningNotificationConfig.kt index dcf1151adb..38969cd401 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningNotificationConfig.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningNotificationConfig.kt @@ -65,4 +65,6 @@ data class WarningNotificationConfig( // 窗口高度 var height: Int = WindowManager.LayoutParams.WRAP_CONTENT - ) \ No newline at end of file + ) { + var isOverride: Boolean = true +} \ 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/receiver/V2XWarningBroadcastReceiver.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/receiver/V2XWarningBroadcastReceiver.kt index 49b3472569..3e435c02db 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/receiver/V2XWarningBroadcastReceiver.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/receiver/V2XWarningBroadcastReceiver.kt @@ -78,12 +78,6 @@ class V2XWarningBroadcastReceiver : BroadcastReceiver() { if (EventTypeEnum.TYPE_USECASE_ID_IVP.poiType == v2xType.toString()) { CallerHmiManager.showLimitingVelocity(1) } - CallerHmiManager.showWarningV2X( - v2xType, - alertContent, - ttsContent, - tag, - null - ) + CallerHmiManager.showWarningV2X(v2xType, alertContent, ttsContent, tag, null, true, 5000L) } } \ 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 b4bef33033..be879520da 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 @@ -71,7 +71,6 @@ class MoGoHmiFragment : MvpFragment // V2X、OBU、云端推送,预警弹窗 private var mWarningFloat: WarningFloat.Builder? = null - // 通知、云公告弹窗 private var mNoticeFloat: WarningFloat.Builder? = null // 超视距、路侧、前车直播 @@ -581,35 +580,30 @@ class MoGoHmiFragment : MvpFragment * @param tag tag绑定弹窗的标志 */ @Synchronized - override fun showWarningV2X( - v2xType: Int, - alertContent: String?, - ttsContent: String?, - tag: String?, - listenerIMoGo: IMoGoWarningStatusListener? - ) { - + override fun showWarningV2X(v2xType: Int, alertContent: String?, ttsContent: String?, tag: String?, listenerIMoGo: IMoGoWarningStatusListener?, playTts: Boolean, expireTime: Long) { activity?.let { + val floatWindow = mWarningFloat + val showTag = floatWindow?.config?.floatTag + if (floatWindow == null || TextUtils.isEmpty(showTag)) { + val notificationView = V2XNotificationView(it) + notificationView.setWarningIcon(EventTypeEnum.getWarningIcon(v2xType.toString())) + val warningContent = alertContent ?: EventTypeEnum.getWarningContent(v2xType.toString()) + if (warningContent.isEmpty()) { + Logger.e(TAG, "Show warningContent is null or empty!") + return + } else { + notificationView.setWarningContent(warningContent) + } - val notificationView = V2XNotificationView(it) - notificationView.setWarningIcon(EventTypeEnum.getWarningIcon(v2xType.toString())) - val warningContent = alertContent ?: EventTypeEnum.getWarningContent(v2xType.toString()) - if (warningContent.isNullOrEmpty()) { - Logger.e(TAG, "Show warningContent is null or empty!") - return - } else { - notificationView.setWarningContent(warningContent) - } + if (mWarningFloat != null && mWarningFloat!!.config.floatTag != tag) { + WarningFloat.dismiss(mWarningFloat!!.config.floatTag, true) + } - if (mWarningFloat != null && mWarningFloat!!.config.floatTag != tag) { - WarningFloat.dismiss(mWarningFloat!!.config.floatTag, true) - } - - mWarningFloat = WarningFloat.with(it) + mWarningFloat = WarningFloat.with(it) .setTag(tag) .setLayout(notificationView) .setSidePattern(SidePattern.RESULT_TOP) - .setCountDownTime(5000) + .setCountDownTime(expireTime) .setGravity(Gravity.CENTER_HORIZONTAL, offsetY = 110) .setImmersionStatusBar(true) .addWarningStatusListener(listenerIMoGo) @@ -617,37 +611,45 @@ class MoGoHmiFragment : MvpFragment override fun onShow() { // 创建弹窗成功才进行TTS播报 Logger.d( - "MoGoWarningFragment", - "mWarningFloat = $mWarningFloat---ttsContent = $ttsContent" + "MoGoWarningFragment", + "mWarningFloat = $mWarningFloat---ttsContent = $ttsContent" ) - if (mWarningFloat != null && !TextUtils.isEmpty(ttsContent)) { + if (mWarningFloat != null && !TextUtils.isEmpty(ttsContent) && playTts) { Logger.d("MoGoWarningFragment", "---> ttsContent = $ttsContent") AIAssist.getInstance(activity) - .speakTTSVoice(ttsContent) + .speakTTSVoice(ttsContent) } } }) .setAnimator(object : DefaultAnimator() { override fun enterAnim( - view: View, - params: WindowManager.LayoutParams, - windowManager: WindowManager, - sidePattern: SidePattern + view: View, + params: WindowManager.LayoutParams, + windowManager: WindowManager, + sidePattern: SidePattern ): Animator? = - super.enterAnim(view, params, windowManager, sidePattern)?.apply { - interpolator = OvershootInterpolator() - } + super.enterAnim(view, params, windowManager, sidePattern)?.apply { + interpolator = OvershootInterpolator() + } override fun exitAnim( - view: View, - params: WindowManager.LayoutParams, - windowManager: WindowManager, - sidePattern: SidePattern + view: View, + params: WindowManager.LayoutParams, + windowManager: WindowManager, + sidePattern: SidePattern ): Animator? = - super.exitAnim(view, params, windowManager, sidePattern)?.setDuration(200) + super.exitAnim(view, params, windowManager, sidePattern)?.setDuration(200) }) .show() - + } else { + if (floatWindow.isShow()) { + val notification = floatWindow.config.layoutView as? V2XNotificationView + if (alertContent?.isNotEmpty() == true) { + notification?.setWarningContent(alertContent) + floatWindow.resetExpireTime(expireTime) + } + } + } } } diff --git a/core/function-impl/mogo-core-function-main/src/main/java/com/mogo/eagle/core/function/main/MainLauncherActivity.java b/core/function-impl/mogo-core-function-main/src/main/java/com/mogo/eagle/core/function/main/MainLauncherActivity.java index 54cc5499cc..0b635857b4 100644 --- a/core/function-impl/mogo-core-function-main/src/main/java/com/mogo/eagle/core/function/main/MainLauncherActivity.java +++ b/core/function-impl/mogo-core-function-main/src/main/java/com/mogo/eagle/core/function/main/MainLauncherActivity.java @@ -13,7 +13,6 @@ import com.alibaba.android.arouter.launcher.ARouter; import com.mogo.commons.debug.DebugConfig; import com.mogo.eagle.core.function.api.base.IMoGoFunctionProvider; import com.mogo.eagle.core.utilcode.mogo.logger.Logger; -import com.mogo.eagle.core.utilcode.util.ActivityLifecycleManager; import com.mogo.map.uicontroller.EnumMapUI; import com.mogo.module.main.MainActivity; import com.mogo.service.intent.IMogoIntentListener; @@ -47,7 +46,7 @@ public class MainLauncherActivity extends MainActivity implements IMogoIntentLis protected void onStart() { super.onStart(); getApis().getIntentManagerApi().registerIntentListener(Intent.ACTION_CLOSE_SYSTEM_DIALOGS, this); - ActivityLifecycleManager.getInstance().setAppActive(true); + //ActivityLifecycleManager.getInstance().setAppActive(true); } @Override @@ -60,7 +59,7 @@ public class MainLauncherActivity extends MainActivity implements IMogoIntentLis protected void onStop() { super.onStop(); getApis().getIntentManagerApi().unregisterIntentListener(Intent.ACTION_CLOSE_SYSTEM_DIALOGS, this); - ActivityLifecycleManager.getInstance().setAppActive(false); + //ActivityLifecycleManager.getInstance().setAppActive(false); } @Override diff --git a/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/MogoPrivateObuManager.kt b/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/MogoPrivateObuManager.kt index b110ab446d..fdb1cada04 100644 --- a/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/MogoPrivateObuManager.kt +++ b/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/MogoPrivateObuManager.kt @@ -340,18 +340,14 @@ class MogoPrivateObuManager private constructor() { // CallerHmiManager.showWarning(direction) //显示弹框,语音提示 - CallerHmiManager.showWarningV2X( - appId.toInt(), - alertContent, - ttsContent,// 只有第一次才tts,防止更新的时候不断的提醒 - (appId + direction.direction).toString(),//使用当前事件类型+方向记录tag,当发生变化的时候关闭当前弹出新的 - object : IMoGoWarningStatusListener { - override fun onDismiss() { - // 关闭警告红边 - CallerHmiManager.showWarning(WarningDirectionEnum.ALERT_WARNING_NON) - } + CallerHmiManager.showWarningV2X(appId.toInt(), alertContent, ttsContent,// 只有第一次才tts,防止更新的时候不断的提醒 + (appId + direction.direction).toString(),//使用当前事件类型+方向记录tag,当发生变化的时候关闭当前弹出新的 + object : IMoGoWarningStatusListener { + override fun onDismiss() { + // 关闭警告红边 + CallerHmiManager.showWarning(WarningDirectionEnum.ALERT_WARNING_NON) } - ) + }, true, 5000L) // 更新数据 TrafficDataConvertUtils.cvxRtiThreatIndInfo2TrafficData(info)?.let { TrafficMarkerDrawer.updateITrafficThreatLevelInfo(it) @@ -421,18 +417,14 @@ class MogoPrivateObuManager private constructor() { // if (level == 2 || level == 3) { //不考虑level //显示警告红边 CallerHmiManager.showWarning(direction) - CallerHmiManager.showWarningV2X( - v2xType.toInt(), - alertContent, - ttsContent,// 只有第一次才tts,防止更新的时候不断的提醒 - (v2xType + direction.direction).toString(),//使用当前事件类型+方向记录tag,当发生变化的时候关闭当前弹出新的 - object : IMoGoWarningStatusListener { - override fun onDismiss() { - // 关闭警告红边 - CallerHmiManager.showWarning(WarningDirectionEnum.ALERT_WARNING_NON) - } + CallerHmiManager.showWarningV2X(v2xType.toInt(), alertContent, ttsContent,// 只有第一次才tts,防止更新的时候不断的提醒 + (v2xType + direction.direction).toString(),//使用当前事件类型+方向记录tag,当发生变化的时候关闭当前弹出新的 + object : IMoGoWarningStatusListener { + override fun onDismiss() { + // 关闭警告红边 + CallerHmiManager.showWarning(WarningDirectionEnum.ALERT_WARNING_NON) } - ) + }, true, 5000L) // } // 更新数据 TrafficDataConvertUtils.cvxPtcThreatIndInfo2TrafficData(info)?.let { @@ -615,13 +607,8 @@ class MogoPrivateObuManager private constructor() { 0x2 -> {//闯红灯 V2I_RLVW_VIOLATION_TYPE_RUNNING_RED_LIGHT ttsContent = EventTypeEnum.getWarningTts(appId.toString()) alertContent = EventTypeEnum.getWarningContent(appId.toString()) - CallerHmiManager.showWarningV2X( - appId, - alertContent, - ttsContent,// 只有第一次才tts,防止更新的时候不断的提醒 - appId.toString(), - null - ) + CallerHmiManager.showWarningV2X(appId, alertContent, ttsContent,// 只有第一次才tts,防止更新的时候不断的提醒 + appId.toString(), null, true, 5000L) } 0x3 -> {//闯黄灯 V2I_RLVW_VIOLATION_TYPE_RUNNING_YELLOW_LIGHT } @@ -685,13 +672,8 @@ class MogoPrivateObuManager private constructor() { val maxSpeed = currentLight.glosa_suggested_speed_max.toInt() if (maxSpeed > 0) { - CallerHmiManager.showWarningV2X( - EventTypeEnum.TYPE_USECASE_ID_IVP_GREEN.poiType.toInt(), - alertContent, - ttsContent,// 只有第一次才tts,防止更新的时候不断的提醒 - appId.toString(), - null - ) + CallerHmiManager.showWarningV2X(EventTypeEnum.TYPE_USECASE_ID_IVP_GREEN.poiType.toInt(), alertContent, ttsContent,// 只有第一次才tts,防止更新的时候不断的提醒 + appId.toString(), null, true, 5000L) } } // 黄灯 @@ -813,18 +795,14 @@ class MogoPrivateObuManager private constructor() { ) if (level == 2 || level == 3) { //显示弹框,语音提示 - CallerHmiManager.showWarningV2X( - appId, - alertContent, - ttsContent,// 只有第一次才tts,防止更新的时候不断的提醒 - (appId + direction.direction).toString(),//使用当前事件类型+方向记录tag,当发生变化的时候关闭当前弹出新的 - object : IMoGoWarningStatusListener { - override fun onDismiss() { - // 关闭警告红边 - CallerHmiManager.showWarning(WarningDirectionEnum.ALERT_WARNING_NON) - } + CallerHmiManager.showWarningV2X(appId, alertContent, ttsContent,// 只有第一次才tts,防止更新的时候不断的提醒 + (appId + direction.direction).toString(),//使用当前事件类型+方向记录tag,当发生变化的时候关闭当前弹出新的 + object : IMoGoWarningStatusListener { + override fun onDismiss() { + // 关闭警告红边 + CallerHmiManager.showWarning(WarningDirectionEnum.ALERT_WARNING_NON) } - ) + }, true, 5000L) //显示警告红边 CallerHmiManager.showWarning(direction) } diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/V2XEventManager.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/V2XEventManager.kt index 548c7704a5..f38f896b2e 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/V2XEventManager.kt +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/V2XEventManager.kt @@ -570,7 +570,7 @@ object V2XEventManager : IMoGoMapLocationListener, IMoGoTokenCallback, IV2XCallb override fun onShow() {} override fun onDismiss() { } - }) + }, true, 5000L) TrafficMarkerDrawer.updateITrafficInfo(trafficData) } 2 -> { diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/adapter/V2XEventPagerAdapter.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/adapter/V2XEventPagerAdapter.kt deleted file mode 100644 index 55e23ce2bc..0000000000 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/adapter/V2XEventPagerAdapter.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.mogo.eagle.core.function.v2x.events.adapter - -import androidx.fragment.app.Fragment -import androidx.viewpager2.adapter.FragmentStateAdapter - -/** - * 事件面板viewpager2的adapter - * - * @author tongchenfei - */ -class V2XEventPagerAdapter(fragment: Fragment, - private val fragments: Array) : - FragmentStateAdapter(fragment) { - - /** - * 目前一共就三个fragment - */ - override fun getItemCount(): Int = fragments.size - - override fun createFragment(position: Int): Fragment = fragments[position] -} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/adapter/V2XRoadEventAdapter.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/adapter/V2XRoadEventAdapter.java index b7c01b2330..51b80912b1 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/adapter/V2XRoadEventAdapter.java +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/adapter/V2XRoadEventAdapter.java @@ -11,7 +11,7 @@ import com.mogo.eagle.core.function.v2x.events.adapter.holder.V2XIllegalParkVH; import com.mogo.eagle.core.function.v2x.events.adapter.holder.V2XLiveVideoVH; import com.mogo.eagle.core.function.v2x.events.adapter.holder.V2XOtherSeekHelpVH; import com.mogo.eagle.core.function.v2x.events.adapter.holder.V2XPushEventVH; -import com.mogo.eagle.core.function.v2x.events.adapter.holder.V2XRoadEventVH; +//import com.mogo.eagle.core.function.v2x.events.adapter.holder.V2XRoadEventVH; import com.mogo.eagle.core.function.v2x.events.scenario.view.IV2XWindow; import com.mogo.module.common.entity.V2XEventShowEntity; import com.mogo.module.common.entity.V2XMessageEntity; @@ -46,10 +46,10 @@ public class V2XRoadEventAdapter extends RecyclerView.Adapter { - - private ArrayList mV2XHistoryScenarioData; - - public V2XScenarioHistoryAdapter(ArrayList v2XHistoryScenarioData) { - if (v2XHistoryScenarioData != null) { - this.mV2XHistoryScenarioData = v2XHistoryScenarioData; - } - } - - @NonNull - @Override - public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - ViewHolder holder; - switch (viewType) { - //道路事件详情 - case V2XMessageEntity.V2XTypeEnum.ALERT_ROAD_WARNING: - holder = new V2XScenarioHistoryRoadEventVH(parent); - break; - //违章停车 - case V2XMessageEntity.V2XTypeEnum.ALERT_ILLEGAL_PARK_WARNING: - holder = new V2XScenarioHistoryIllegalParkVH(parent); - break; - //他人故障求助 - case V2XMessageEntity.V2XTypeEnum.ALERT_SEEK_WARNING: - holder = new V2XScenarioHistoryOtherSeekHelpVH(parent); - break; - //没有更多的数据的Footer - default: - View footerView = LayoutInflater.from(parent.getContext()) - .inflate(R.layout.footer_nomore_view, parent, false); - holder = new FooterViewHolder(footerView); - break; - } - - return holder; - } - - @Override - public void onBindViewHolder(@NonNull ViewHolder holder, int position) { - if (position < mV2XHistoryScenarioData.size()) { - if (holder instanceof V2XScenarioHistoryRoadEventVH) { - ((V2XScenarioHistoryRoadEventVH) holder).initView(mV2XHistoryScenarioData.get(position)); - } - if (holder instanceof V2XScenarioHistoryIllegalParkVH) { - ((V2XScenarioHistoryIllegalParkVH) holder).initView(mV2XHistoryScenarioData.get(position)); - } - if (holder instanceof V2XScenarioHistoryOtherSeekHelpVH) { - ((V2XScenarioHistoryOtherSeekHelpVH) holder).initView(mV2XHistoryScenarioData.get(position)); - } - } - } - - @Override - public int getItemViewType(int position) { - if (position < mV2XHistoryScenarioData.size()) { - return mV2XHistoryScenarioData.get(position).getScenarioType(); - } else { - // 没有更多的Footer - return -1; - } - } - - - @Override - public int getItemCount() { - // 多添加一个Footer - return mV2XHistoryScenarioData == null ? 0 : mV2XHistoryScenarioData.size() + 1; - } - - - /** - * Footer 视图 - */ - static class FooterViewHolder extends RecyclerView.ViewHolder { - public FooterViewHolder(@NonNull View itemView) { - super(itemView); - } - } - -} diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/adapter/V2XShareEventAdapter.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/adapter/V2XShareEventAdapter.java index 974848203f..e69de29bb2 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/adapter/V2XShareEventAdapter.java +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/adapter/V2XShareEventAdapter.java @@ -1,240 +0,0 @@ -package com.mogo.eagle.core.function.v2x.events.adapter; - -import android.content.Context; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.RecyclerView; - -import com.alibaba.android.arouter.launcher.ARouter; -import com.mogo.eagle.core.function.v2x.R; -import com.mogo.eagle.core.function.v2x.events.entity.panel.V2XShareEventDescription; -import com.mogo.eagle.core.function.v2x.events.entity.panel.V2XShareEventItem; -import com.mogo.eagle.core.function.v2x.events.entity.panel.V2XShareEventItemEnum; -import com.mogo.eagle.core.function.v2x.events.entity.panel.V2XShareEventLoadMoreItem; -import com.mogo.eagle.core.function.v2x.events.fragment.V2XEventPanelFragment; -import com.mogo.eagle.core.function.v2x.events.listener.AdapterCallback; -import com.mogo.eagle.core.utilcode.util.DateTimeUtils; -import com.mogo.module.common.enums.EventTypeEnum; -import com.mogo.module.common.view.CustomRatingBar; -import com.mogo.service.IMogoServiceApis; -import com.mogo.eagle.core.data.constants.MogoServicePaths; -import java.util.ArrayList; - -public class V2XShareEventAdapter extends RecyclerView.Adapter { - private Context context; - private ArrayList dataArrayList; - private final LayoutInflater shareLayoutInflater; - private IMogoServiceApis mApis; - private AdapterCallback callback; - - public V2XShareEventAdapter(Context context, ArrayList dataArrayList, AdapterCallback callback) { - this.context = context; - this.dataArrayList = dataArrayList; - this.callback = callback; - shareLayoutInflater = LayoutInflater.from(context); - mApis = (IMogoServiceApis) ARouter.getInstance().build(MogoServicePaths.PATH_SERVICE_APIS).navigation(context); - } - - @NonNull - @Override - public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - //根据viewType创建自定义布局 - if (viewType == V2XShareEventItemEnum.ITEM_TYPE_NUM_DES) { - View v = shareLayoutInflater.inflate(R.layout.module_v2x_event_share_description, parent, - false); - shareDescriptionViewHolder holder = new shareDescriptionViewHolder(v); - return holder; - } else if (viewType == V2XShareEventItemEnum.ITEM_TYPE_SHARE_LIST) { - View v = shareLayoutInflater.inflate(R.layout.module_v2x_event_share_item, parent, - false); - shareItemViewHolder holder = new shareItemViewHolder(v); - return holder; - } else if (viewType == V2XShareEventItemEnum.ITEM_TYPE_SHARE_EMPTY) { - View v = shareLayoutInflater.inflate(R.layout.module_v2x_event_share_empty, parent, - false); - shareEmptyViewHolder holder = new shareEmptyViewHolder(v); - return holder; - } else if (viewType == V2XShareEventItemEnum.ITEM_TYPE_LOAD_MORE_STATUS) { - View v = shareLayoutInflater.inflate(R.layout.item_v2x_event_share_load_more, parent, - false); - shareLoadStatusViewHolder holder = new shareLoadStatusViewHolder(v); - return holder; - } else { - View v = shareLayoutInflater.inflate(R.layout.footer_nomore_view, parent, - false); - shareLoadNoMoreViewHolder holder = new shareLoadNoMoreViewHolder(v); - return holder; - } - } - - @Override - public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { - try { - - - if (holder instanceof shareDescriptionViewHolder) { - //分享次数,车友认同次数,热心指数 - if (dataArrayList.size() > position) { - V2XShareEventDescription.ResultBean.EnthusiasmIndexBean data = (V2XShareEventDescription.ResultBean.EnthusiasmIndexBean) dataArrayList.get(position); - if (data != null) { - String shareNum = String.valueOf(data.getShareNum()); - String likeNum = String.valueOf(data.getLikeNum()); - double enthusiasmIndex = data.getEnthusiasmIndex() <= 5 ? data.getEnthusiasmIndex() : 5; - if (shareNum != null) { - ((shareDescriptionViewHolder) holder).shareNumTextView.setText(shareNum); - } - if (likeNum != null) { - ((shareDescriptionViewHolder) holder).approveNumTextView.setText(likeNum); - } - ((shareDescriptionViewHolder) holder).ratingBar.setRating((float) enthusiasmIndex); - } - } - } else if (holder instanceof shareItemViewHolder) { - //分享列表 - if (dataArrayList.size() > position) { - V2XShareEventItem.ResultBean.PageBean.ContentBean data = (V2XShareEventItem.ResultBean.PageBean.ContentBean) dataArrayList.get(position); - if (data != null) { - String poitype = data.getPoiType(); - String address = data.getUploadAddress(); - String time = DateTimeUtils.getTimeText(data.getUploadTimestamp(), DateTimeUtils.MM_Yue_dd_Ri_HH_mm); - String likeNum = String.valueOf(data.getLikeNum()); - String notLikeNum = String.valueOf(data.getNotlikeNum()); - - if (poitype != null) { - ((shareItemViewHolder) holder).caseStyleTextView.setText(EventTypeEnum.getPoiTypeStr(poitype)); - ((shareItemViewHolder) holder).caseStyleTextView.setBackgroundResource(EventTypeEnum.getPoiTypeBgForShareItem(poitype)); - - } - if (address != null) { - ((shareItemViewHolder) holder).caseAddressTextView.setText(address); - } - if (time != null) { - ((shareItemViewHolder) holder).caseTimeTextView.setText(time); - } - if (likeNum != null) { - ((shareItemViewHolder) holder).caseUsefulTextView.setText(likeNum); - } - if (notLikeNum != null) { - ((shareItemViewHolder) holder).caseUselessTextView.setText(notLikeNum); - } - } - - } - } - } catch (Exception e) { - - } - } - - @Override - public int getItemCount() { - return dataArrayList.size(); - } - - @Override - public int getItemViewType(int position) { - Object item = dataArrayList.get(position); - if (item instanceof V2XShareEventDescription.ResultBean.EnthusiasmIndexBean) { - return V2XShareEventItemEnum.ITEM_TYPE_NUM_DES; - } else if (item instanceof V2XShareEventItem.ResultBean.PageBean.ContentBean) { - return V2XShareEventItemEnum.ITEM_TYPE_SHARE_LIST; - } else if (item instanceof V2XShareEventLoadMoreItem) { - return ((V2XShareEventLoadMoreItem) dataArrayList.get(position)).getViewType(); - } - return V2XShareEventItemEnum.ITEM_TYPE_OTHER; - } - - /* - * 分享列表 - * */ - class shareItemViewHolder extends RecyclerView.ViewHolder { - private TextView caseStyleTextView; - private TextView caseAddressTextView; - private TextView caseTimeTextView; - private TextView caseUsefulTextView; - private TextView caseUselessTextView; - - public shareItemViewHolder(@NonNull View itemView) { - super(itemView); - caseStyleTextView = itemView.findViewById(R.id.road_case_style); - caseAddressTextView = itemView.findViewById(R.id.road_case_address); - caseTimeTextView = itemView.findViewById(R.id.road_case_share_time); - caseUsefulTextView = itemView.findViewById(R.id.road_case_useful_num); - caseUselessTextView = itemView.findViewById(R.id.road_case_useless_num); - } - } - - /* - * 分享次数,热心指数... - * */ - class shareDescriptionViewHolder extends RecyclerView.ViewHolder { - private TextView shareNumTextView; - private TextView approveNumTextView; - private CustomRatingBar ratingBar; - - public shareDescriptionViewHolder(@NonNull View itemView) { - super(itemView); - shareNumTextView = itemView.findViewById(R.id.share_num); - approveNumTextView = itemView.findViewById(R.id.share_approve); - ratingBar = itemView.findViewById(R.id.rating_bar); - } - } - - /* - * 去分享 刷新 - * */ - class shareEmptyViewHolder extends RecyclerView.ViewHolder { - public shareEmptyViewHolder(@NonNull View itemView) { - super(itemView); - - TextView share = itemView.findViewById(R.id.share_event_button); - share.setOnClickListener(view -> { - // TODO -// V2XEventPanelFragment.Companion.getInstance().hidePanel(); -// mApis.getShareManager().showShareDialog(); - }); - - TextView refresh = itemView.findViewById(R.id.refresh_button); - refresh.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - callback.getShareEventResponse(); - } - }); - } - } - - /* - * 加载更多/没有更多 - * */ - class shareLoadStatusViewHolder extends RecyclerView.ViewHolder { - private TextView statusButton; - - public shareLoadStatusViewHolder(@NonNull View itemView) { - super(itemView); - statusButton = itemView.findViewById(R.id.event_share_load_status); - ; - statusButton.setOnClickListener(new View.OnClickListener() { - - @Override - public void onClick(View v) { - callback.loadMoreShareEventList(); - } - }); - } - } - - /* - * 没有更多记录了 - * */ - class shareLoadNoMoreViewHolder extends RecyclerView.ViewHolder { - - public shareLoadNoMoreViewHolder(@NonNull View itemView) { - super(itemView); - } - } -} diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/adapter/V2XSurroundingAdapter.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/adapter/V2XSurroundingAdapter.java deleted file mode 100644 index 3fb4c40b50..0000000000 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/adapter/V2XSurroundingAdapter.java +++ /dev/null @@ -1,105 +0,0 @@ -package com.mogo.eagle.core.function.v2x.events.adapter; - -import android.content.Context; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.RecyclerView; - -import com.mogo.eagle.core.function.v2x.R; -import com.mogo.eagle.core.function.v2x.events.adapter.holder.V2XSurroundingViewHolder; -import com.mogo.eagle.core.function.v2x.events.entity.panel.SurroundingConstruction; -import com.mogo.eagle.core.function.v2x.events.listener.SurroundingItemClickListener; -import com.mogo.module.common.enums.EventTypeEnum; - -import java.util.List; - -/** - * @author lixiaopeng - * @description 周边 - * @since 2020/7/29 - */ -public class V2XSurroundingAdapter extends RecyclerView.Adapter { - private List mPoiInfosList; - private Context mContext; - private ImageView mBgImageView; - private ImageView mTypeImageView; - private TextView mTypeTv; - private TextView mTotalTv; - - private SurroundingItemClickListener mClickListener; - - - public V2XSurroundingAdapter(Context context, List poiInfosList, SurroundingItemClickListener clickListener) { - mContext = context; - mPoiInfosList = poiInfosList; - mClickListener = clickListener; - } - - @Override - public int getItemViewType(int position) { - return super.getItemViewType(position); - } - - @NonNull - @Override - public V2XSurroundingViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - View inflate = LayoutInflater.from(parent.getContext()) - .inflate(R.layout.module_fragment_surrounding_event_item, parent, false); - return new V2XSurroundingViewHolder(inflate); - } - - @Override - public void onBindViewHolder(@NonNull V2XSurroundingViewHolder holder, final int position) { - final SurroundingConstruction surroundingConstruction = mPoiInfosList.get(position); - if (surroundingConstruction == null) { - return; - } - - mBgImageView = holder.itemView.findViewById(R.id.iv_event_bg); - mTypeImageView = holder.itemView.findViewById(R.id.iv_event_type); - mTypeTv = holder.itemView.findViewById(R.id.tv_poitype); - mTotalTv = holder.itemView.findViewById(R.id.tv_info_total); - - mTypeTv.setText(EventTypeEnum.getTypeName(surroundingConstruction.getPoiType())); - if (surroundingConstruction.getConstrutList() != null) { - mTotalTv.setText(surroundingConstruction.getConstrutList().size() + "条"); - } - - holder.itemView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (mClickListener != null) { - mClickListener.onItemClickListener(v, holder.getAdapterPosition(), surroundingConstruction); - } - } - }); - - mBgImageView.setBackgroundResource(EventTypeEnum.getTypeRes(surroundingConstruction.getPoiType())); - mTypeImageView.setBackgroundResource(EventTypeEnum.getTypeSmallRes(surroundingConstruction.getPoiType())); -// RequestOptions requestOptions = new RequestOptions() -// .placeholder(R.drawable.v2x_icon_live_logo) -// .error(R.drawable.v2x_icon_live_logo) -// .fallback(R.drawable.v2x_icon_live_logo); -// Glide.with(mContext) -// .asBitmap() -// .load(getTypeSmallRes(surroundingConstruction.getPoiType())) -// .apply(requestOptions) -// .into(new SkinAbleBitmapTarget(mTypeImageView, requestOptions)); - - } - - public static int dip2px(Context context, float dpValue) { - final float scale = context.getResources().getDisplayMetrics().density; - return (int) (dpValue * scale + 0.5f); - } - - @Override - public int getItemCount() { - return mPoiInfosList == null ? 0 : mPoiInfosList.size(); - } -} diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/adapter/V2XSurroundingDetailAdapter.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/adapter/V2XSurroundingDetailAdapter.java deleted file mode 100644 index cca388296b..0000000000 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/adapter/V2XSurroundingDetailAdapter.java +++ /dev/null @@ -1,135 +0,0 @@ -package com.mogo.eagle.core.function.v2x.events.adapter; - -import android.content.Context; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.RecyclerView; - -import com.mogo.eagle.core.function.v2x.R; -import com.mogo.eagle.core.function.v2x.events.adapter.holder.V2XSurroundingDetailVH; -import com.mogo.eagle.core.function.v2x.events.consts.V2XConst; -import com.mogo.eagle.core.function.v2x.events.listener.SurroundingDetailItemListener; -import com.mogo.eagle.core.function.v2x.events.utils.RoadConditionUtils; -import com.mogo.eagle.core.function.v2x.events.view.HeartLikeView; -import com.mogo.eagle.core.function.v2x.events.view.HeartUnLikeView; -import com.mogo.eagle.core.utilcode.util.DateTimeUtils; -import com.mogo.module.common.entity.MarkerExploreWay; -import com.mogo.module.common.enums.EventTypeEnum; -import com.mogo.eagle.core.utilcode.mogo.logger.Logger; - -import java.util.List; - -/** - * @author lixiaopeng - * @description 周边详情 - * @since 2020/11/18 - */ -public class V2XSurroundingDetailAdapter extends RecyclerView.Adapter { - private List markerExploreWays; - private Context mContext; - private TextView mTypeTv; - private TextView mAddressTv; - private TextView mUserNameTv; - private TextView mTimeTv; - private HeartLikeView mHeartLikeView; - private HeartUnLikeView mUnHeartLikeView; - - private SurroundingDetailItemListener mListener; - - public V2XSurroundingDetailAdapter(Context context, List list, SurroundingDetailItemListener listener) { - mContext = context; - markerExploreWays = list; - mListener = listener; - } - - @Override - public int getItemViewType(int position) { - return super.getItemViewType(position); - } - - @NonNull - @Override - public V2XSurroundingDetailVH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - View inflate = LayoutInflater.from(parent.getContext()) - .inflate(R.layout.module_v2x_event_surrounding_detail_item, parent, false); - return new V2XSurroundingDetailVH(inflate); - } - - @Override - public void onBindViewHolder(@NonNull V2XSurroundingDetailVH holder, final int position) { - final MarkerExploreWay exploreWay = markerExploreWays.get(position); - if (exploreWay == null) { - return; - } - - mAddressTv = holder.itemView.findViewById(R.id.surrounding_road_type_address); - mUserNameTv = holder.itemView.findViewById(R.id.surrounding_username); - mTimeTv = holder.itemView.findViewById(R.id.surrounding_time); - mTypeTv = holder.itemView.findViewById(R.id.surrounding_road_type); - mHeartLikeView = holder.itemView.findViewById(R.id.surrounding_road_like); - mUnHeartLikeView = holder.itemView.findViewById(R.id.surrounding_road_unlike); - - mUserNameTv.setText( exploreWay.getUserInfo() != null ? ("用户" + exploreWay.getUserInfo().getUserName() + "分享") : "蘑菇用户分享"); - mTypeTv.setText(EventTypeEnum.getTypeName(exploreWay.getPoiType())); - mAddressTv.setText(exploreWay.getAddr()); - mTimeTv.setText(DateTimeUtils.getTimeText(exploreWay.getGenerateTime(), DateTimeUtils.MM_Yue_dd_Ri_HH_mm)); - - Logger.d(V2XConst.MODULE_NAME, "exploreWay.isFabulous() = " + exploreWay.isFabulous()); - showView(exploreWay.isFabulous()); - - mHeartLikeView.setOnClickCallListener(v -> { - Logger.d(V2XConst.MODULE_NAME, "反馈有用 position = " + position); - roadReportTrue(exploreWay); - mListener.onItemClickListener(v, position, exploreWay); - }); - - mUnHeartLikeView.setOnClickCallListener(v -> { - Logger.d(V2XConst.MODULE_NAME, "反馈无用 position = " + position); - roadReportErr(exploreWay); - mListener.onItemClickListener(v, position, exploreWay); - }); - } - - private void showView(boolean isAlreadyShow) { - if (isAlreadyShow) { - mHeartLikeView.setVisibility(View.GONE); - mUnHeartLikeView.setVisibility(View.GONE); - } else { - mHeartLikeView.setVisibility(View.VISIBLE); - mUnHeartLikeView.setVisibility(View.VISIBLE); - } - } - - /** - * 反馈路况正确 - */ - private void roadReportTrue(MarkerExploreWay exploreWay) { - if (exploreWay != null) { - RoadConditionUtils.sendShareReceiverInfo( - exploreWay.getInfoId(), - exploreWay.getPoiType(), - 2); - } - } - - /** - * 反馈路况错误 - */ - private void roadReportErr(MarkerExploreWay exploreWay) { - if (exploreWay != null) { - RoadConditionUtils.sendShareReceiverInfo( - exploreWay.getInfoId(), - exploreWay.getPoiType(), - 3); - } - } - - @Override - public int getItemCount() { - return markerExploreWays == null ? 0 : markerExploreWays.size(); - } -} diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/adapter/holder/V2XHistoryBaseViewHolder.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/adapter/holder/V2XHistoryBaseViewHolder.java deleted file mode 100644 index 13d007bc2f..0000000000 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/adapter/holder/V2XHistoryBaseViewHolder.java +++ /dev/null @@ -1,233 +0,0 @@ -package com.mogo.eagle.core.function.v2x.events.adapter.holder; - -import static com.mogo.eagle.core.function.v2x.events.consts.V2XConst.MODULE_NAME; - -import android.util.Log; -import android.view.View; - -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.RecyclerView; - -import com.alibaba.android.arouter.launcher.ARouter; -import com.mogo.commons.voice.AIAssist; -import com.mogo.eagle.core.function.v2x.events.bridge.BridgeApi; -import com.mogo.eagle.core.function.v2x.events.consts.V2XConst; -import com.mogo.eagle.core.function.v2x.events.utils.ChartingUtil; -import com.mogo.eagle.core.function.v2x.events.utils.RoadConditionUtils; -import com.mogo.eagle.core.function.v2x.events.utils.TrackUtils; -import com.mogo.eagle.core.function.v2x.events.utils.V2XSQLiteUtils; -import com.mogo.eagle.core.utilcode.mogo.logger.Logger; -import com.mogo.eagle.core.utilcode.mogo.toast.TipToast; -import com.mogo.eagle.core.utilcode.util.TimeUtils; -import com.mogo.eagle.core.utilcode.util.Utils; -import com.mogo.map.navi.IMogoNaviListener; -import com.mogo.map.navi.MogoNaviInfo; -import com.mogo.map.navi.MogoTraffic; -import com.mogo.module.common.entity.MarkerExploreWay; -import com.mogo.module.common.entity.MarkerLocation; -import com.mogo.module.common.entity.V2XEventZanData; -import com.mogo.service.module.IMogoRegisterCenter; -import com.zhidao.carchattingprovider.CallChattingProviderConstant; -import com.zhidao.carchattingprovider.ICarsChattingProvider; -import com.zhidao.carchattingprovider.MogoDriverInfo; - -/** - * 出行动态 - * - * @author donghongyu - */ -public abstract class V2XHistoryBaseViewHolder - extends RecyclerView.ViewHolder - implements IMogoNaviListener { - - private static final String TAG = "V2XBaseViewHolder"; - private ICarsChattingProvider mCarsChattingProvider; - - - public V2XHistoryBaseViewHolder(@NonNull View itemView) { - super(itemView); - } - - /** - * 填充View视图 - * - * @param viewData 与视图绑定的数据 - */ - public abstract void initView(T viewData); - - /** - * 延迟关闭窗体视图 - */ - public void delayedCloseWindow() { - - } - - /** - * 点赞 - */ - public void triggerZan(MarkerExploreWay noveltyInfo) { - try { - AIAssist.getInstance(Utils.getApp()).speakTTSVoice("已点赞", null); - showTip("已点赞"); - if (noveltyInfo != null) { - // 调用网络API接口 - BridgeApi.INSTANCE.refreshModel().giveLikeLiveVideo(null, noveltyInfo.getSn()); - V2XEventZanData v2XEventZanData = new V2XEventZanData(); - v2XEventZanData.setEventId(noveltyInfo.getInfoId()); - v2XEventZanData.setTriggerTime(TimeUtils.getNowMills()); - V2XSQLiteUtils.saveEventZanLocalStory(v2XEventZanData); - - - // 上报数据统计 - TrackUtils.trackV2xRoadEvent( - noveltyInfo.getInfoId(), - noveltyInfo.getSn(), - V2XConst.V2X_ROAD_ZAN); - } - } catch (Exception e) { - e.printStackTrace(); - } - delayedCloseWindow(); - } - - public void triggerIVReportHead(MarkerExploreWay noveltyInfo) { - Log.d(TAG, "点击头像" + mCarsChattingProvider); - try { - mCarsChattingProvider = (ICarsChattingProvider) ARouter.getInstance().build(CallChattingProviderConstant.CAR_CALL_PROVIDER).navigation(); - MogoDriverInfo mogoDriverInfo = new MogoDriverInfo(); - int ageNumber = noveltyInfo.getUserInfo().getAgeNumber(); - mogoDriverInfo.setAge(ageNumber); - String gender = noveltyInfo.getUserInfo().getGender(); - mogoDriverInfo.setGender(gender); - String sn = noveltyInfo.getUserInfo().getSn(); - mogoDriverInfo.setSn(sn != null ? sn : ""); - String name = noveltyInfo.getUserInfo().getUserName(); - mogoDriverInfo.setUserName(name != null ? name : ""); - mogoDriverInfo.setUserHead(noveltyInfo.getUserInfo().getUserHead()); - if (mCarsChattingProvider != null) { - mCarsChattingProvider.showUserWindow(MODULE_NAME, mogoDriverInfo, this.itemView.getContext()); - } - - } catch (Exception e) { - Log.d(TAG, "点击头像发生错误--triggerIVReportHead" + e); - e.printStackTrace(); - } - } - - /** - * 打电话 - */ - public void triggerCallChart(MarkerExploreWay noveltyInfo) { - try { - MarkerLocation location = new MarkerLocation(); - location.setLat(noveltyInfo.getLocation().getLat()); - location.setLon(noveltyInfo.getLocation().getLon()); - - ChartingUtil.callChatting(noveltyInfo.getUserInfo(), location); - - TrackUtils.trackV2xRoadEvent( - noveltyInfo.getInfoId(), - noveltyInfo.getSn(), - V2XConst.V2X_ROAD_CHAT); - } catch (Exception e) { - e.printStackTrace(); - TipToast.tip("用户信息异常"); - } - delayedCloseWindow(); - } - - /** - * 反馈路况错误 - */ - public void triggerReportErr(MarkerExploreWay noveltyInfo) { - try { - RoadConditionUtils.sendShareReceiverInfo( - noveltyInfo.getInfoId(), - noveltyInfo.getPoiType(), - 3); - - TrackUtils.trackV2xRoadEvent( - noveltyInfo.getInfoId(), - noveltyInfo.getSn(), - V2XConst.V2X_ROAD_REPORT_ERROR); - } catch (Exception e) { - e.printStackTrace(); - TipToast.tip("路况信息异常"); - } - delayedCloseWindow(); - } - - /** - * 反馈路况正确 - */ - public void triggerReportTrue(MarkerExploreWay noveltyInfo) { - try { - RoadConditionUtils.sendShareReceiverInfo( - noveltyInfo.getInfoId(), - noveltyInfo.getPoiType(), - 2); - - TrackUtils.trackV2xRoadEvent( - noveltyInfo.getInfoId(), - noveltyInfo.getSn(), - V2XConst.V2X_ROAD_REPORT_RIGHT); - } catch (Exception e) { - e.printStackTrace(); - TipToast.tip("路况信息异常"); - } - delayedCloseWindow(); - } - - /** - * 显示自定义 Toast - * - * @param msg - */ - public void showTip(String msg) { - TipToast.tip(msg); - } - - @Override - public void onInitNaviFailure() { - - } - - @Override - public void onInitNaviSuccess() { - - } - - @Override - public void onNaviInfoUpdate(MogoNaviInfo naviinfo) { - - } - - @Override - public void onStartNavi() { - - } - - @Override - public void onStopNavi() { - - } - - @Override - public void onCalculateSuccess() { - Logger.w(TAG, "onCalculateSuccess"); - IMogoRegisterCenter registerCenter = BridgeApi.INSTANCE.registerCenter(); - if (registerCenter != null) { - registerCenter.unregisterMogoNaviListener(MODULE_NAME); - } - } - - @Override - public void onoCalculateFailed() { - - } - - @Override - public void onUpdateTraffic(MogoTraffic traffic) { - - } -} diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/adapter/holder/V2XRoadEventVH.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/adapter/holder/V2XRoadEventVH.java deleted file mode 100644 index 628f6e9614..0000000000 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/adapter/holder/V2XRoadEventVH.java +++ /dev/null @@ -1,544 +0,0 @@ -package com.mogo.eagle.core.function.v2x.events.adapter.holder; - -import static android.view.View.GONE; -import static android.view.View.VISIBLE; - -import static com.mogo.eagle.core.function.v2x.events.consts.V2XConst.MODULE_NAME; - -import android.content.Context; -import android.content.Intent; -import android.os.Handler; -import android.text.TextUtils; -import android.util.Log; -import android.view.Gravity; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.view.WindowManager; -import android.widget.ImageView; -import android.widget.TextView; - -import com.bumptech.glide.Glide; -import com.bumptech.glide.request.RequestOptions; -import com.mogo.commons.debug.DebugConfig; -import com.mogo.eagle.core.data.enums.WarningDirectionEnum; -import com.mogo.eagle.core.function.call.hmi.CallerHmiManager; -import com.mogo.eagle.core.function.v2x.R; -import com.mogo.eagle.core.function.v2x.events.bridge.BridgeApi; -import com.mogo.eagle.core.function.v2x.events.entity.net.V2XUserInfoRes; -import com.mogo.eagle.core.function.v2x.events.network.V2XRefreshCallback; -import com.mogo.eagle.core.function.v2x.events.scenario.scene.livecar.V2XRoadLiveCarScenario; -import com.mogo.eagle.core.function.v2x.events.scenario.scene.road.V2XRoadEventWindow; -import com.mogo.eagle.core.function.v2x.events.scenario.scene.road.V2XRoadVideoCarScenario; -import com.mogo.eagle.core.function.v2x.events.scenario.view.IV2XWindow; -import com.mogo.eagle.core.function.v2x.events.utils.ChartingUtil; -import com.mogo.eagle.core.function.v2x.events.utils.V2XSQLiteUtils; -import com.mogo.eagle.core.function.v2x.events.view.HeartLikeView; -import com.mogo.eagle.core.function.v2x.events.voice.V2XVoiceCallbackListener; -import com.mogo.eagle.core.function.v2x.events.voice.V2XVoiceConstants; -import com.mogo.eagle.core.network.utils.GsonUtil; -import com.mogo.eagle.core.utilcode.mogo.glide.GlideRoundedCornersTransform; -import com.mogo.eagle.core.utilcode.util.CollectionUtils; -import com.mogo.eagle.core.utilcode.util.DateTimeUtils; -import com.mogo.module.common.animation.BezierAnimationView; -import com.mogo.module.common.entity.MarkerExploreWay; -import com.mogo.module.common.entity.MarkerUserInfo; -import com.mogo.module.common.entity.V2XEventShowEntity; -import com.mogo.module.common.entity.V2XLiveCarInfoEntity; -import com.mogo.module.common.entity.V2XMessageEntity; -import com.mogo.module.common.entity.V2XRoadEventEntity; -import com.mogo.module.common.enums.EventTypeEnum; -import com.mogo.module.common.wm.WindowManagerView; -import com.mogo.module.v2x.voice.V2XVoiceManager; -import com.mogo.service.imageloader.IMogoImageloader; -import com.mogo.service.imageloader.MogoImageView; -import com.mogo.service.statusmanager.IMogoStatusManager; -import com.mogo.service.v2x.DisplayEffectsInterface; -import com.mogo.eagle.core.utilcode.mogo.logger.Logger; - -import java.util.ArrayList; -import java.util.Calendar; -import java.util.List; - -/** - * author : donghongyu - * e-mail : 1358506549@qq.com - * date : 2020/3/11 4:35 PM - * desc : 道路事件详情 - * version: 1.0 - * - * @author donghongyu - */ -public class V2XRoadEventVH extends V2XBaseViewHolder { - private static final String TAG = "V2XRoadEventVH"; - private Context mContext; - private MogoImageView ivEventImg; - private MogoImageView ivReportHead; - private ImageView ivEventPlay; - - // 控制按钮 - private TextView tvEventTypeTitle; - private TextView tvEventAddress; - private TextView tvEventDistance; - private TextView tvEventTime; - private ImageView ivEventLive; - private ImageView ivEventCallChart; - private ImageView ivEventReportTrue; - private ImageView ivEventReportErr; - private HeartLikeView ivEventZan; - - private WindowManagerView mWindowManagerView; - - // 上传事件的用户信息 - private MarkerUserInfo mUserInfo; - // 当前的新鲜事儿信息 - private MarkerExploreWay mNoveltyInfo; - private V2XRoadEventEntity mV2XRoadEventEntity; - private V2XEventShowEntity mV2XEventShowEntity; - - // 拨打车聊聊语音回调 - private V2XVoiceCallbackListener v2XVoiceCallbackCallListener = new V2XVoiceCallbackListener() { - @Override - public void onCallback(String command, Intent intent) { - triggerCallChart(mNoveltyInfo); - } - }; - // 点赞语音回调 - private V2XVoiceCallbackListener v2XVoiceCallbackLickListener = new V2XVoiceCallbackListener() { - @Override - public void onCallback(String command, Intent intent) { - triggerZan(mNoveltyInfo); - } - }; - // 反馈"正确"语音回调 - private V2XVoiceCallbackListener v2XVoiceCallbackReportTrueListener = new V2XVoiceCallbackListener() { - @Override - public void onCallback(String command, Intent intent) { - triggerReportTrue(mNoveltyInfo); - } - }; - // 反馈"错误"语音回调 - private V2XVoiceCallbackListener v2XVoiceCallbackReportErrorListener = new V2XVoiceCallbackListener() { - @Override - public void onCallback(String command, Intent intent) { - triggerReportErr(mNoveltyInfo); - } - }; - // 反馈"错误"语音回调 - private V2XVoiceCallbackListener v2XVoiceOpenLiveListener = new V2XVoiceCallbackListener() { - @Override - public void onCallback(String command, Intent intent) { - showLiveCar(mV2XEventShowEntity); - } - }; - // 查看车辆信息 - private V2XVoiceCallbackListener v2xVoiceOpenCarInfoListener = new V2XVoiceCallbackListener() { - @Override - public void onCallback(String command, Intent intent) { - triggerIVReportHead(mNoveltyInfo); - } - }; - - private MogoImageView ivEvent; - private TextView tvEvent; - private ImageView ivPlay; - private TextView tvLine; - private TextView tvPlay; - - - private void init(View itemView) { - ivEventImg = itemView.findViewById(R.id.ivEventImg); - ivReportHead = itemView.findViewById(R.id.ivEventHead); - ivEventPlay = itemView.findViewById(R.id.ivEventPlay); - tvEventTypeTitle = itemView.findViewById(R.id.tvEventTypeTitle); - tvEventAddress = itemView.findViewById(R.id.tvEventAddress); - tvEventDistance = itemView.findViewById(R.id.tvEventDistance); - tvEventTime = itemView.findViewById(R.id.tvEventTime); - ivEventLive = itemView.findViewById(R.id.ivEventLive); - ivEventCallChart = itemView.findViewById(R.id.ivEventCallChart); - ivEventZan = itemView.findViewById(R.id.ivEventZan); - ivEventReportTrue = itemView.findViewById(R.id.ivEventReportTrue); - ivEventReportErr = itemView.findViewById(R.id.ivEventReportErr); - - ivEvent = itemView.findViewById(R.id.iv_event); - tvEvent = itemView.findViewById(R.id.tv_event); - ivPlay = itemView.findViewById(R.id.iv_play); - tvLine = itemView.findViewById(R.id.tv_line); - tvPlay = itemView.findViewById(R.id.tv_play); - } - - public V2XRoadEventVH(ViewGroup viewGroup, IV2XWindow v2XWindow) { - super(BridgeApi.INSTANCE.statusManager() != null && BridgeApi.INSTANCE.statusManager().isVrMode() ? - LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_v2x_event_detail_vr, viewGroup, false) : - LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_v2x_event_detail, viewGroup, false) - , v2XWindow); - mContext = viewGroup.getContext(); - init(itemView); - // 设置视图状态监听 - itemView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() { - @Override - public void onViewAttachedToWindow(View v) { -// Logger.w(MODULE_NAME, "列表View V2XRoadEventDetailVH 触发 onViewAttachedToWindow"); - // 注册语音交互 - V2XVoiceManager.INSTANCE - .registerWakeCmd(V2XVoiceConstants.COMMAND_ZHIDAO_V2X_CALL_CHATTING, - v2XVoiceCallbackCallListener) - .registerWakeCmd(V2XVoiceConstants.COMMAND_ZHIDAO_V2X_ZAN, - v2XVoiceCallbackLickListener) - .registerUnWakeVoice(V2XVoiceConstants.COMMAND_V2X_TO_CHAT_MORE_UN_WAKEUP, - v2XVoiceCallbackCallListener) - .registerUnWakeVoice(V2XVoiceConstants.COMMAND_V2X_TO_ZAN_UN_WAKEUP, - v2XVoiceCallbackLickListener) - .registerUnWakeVoice(V2XVoiceConstants.COMMAND_V2X_TO_FEEDBACK_TRUE, - v2XVoiceCallbackReportTrueListener) - .registerUnWakeVoice(V2XVoiceConstants.COMMAND_V2X_TO_FEEDBACK_ERROR, - v2XVoiceCallbackReportErrorListener) - .registerUnWakeVoice(V2XVoiceConstants.COMMAND_ZHIDAO_V2X_OPEN_CAR_INFO_UN_WAKEUP, - v2xVoiceOpenCarInfoListener); - } - - @Override - public void onViewDetachedFromWindow(View v) { - Log.d(TAG, "onViewDetachedFromWindow unRegister"); - // 反注册语音交互 - V2XVoiceManager.INSTANCE - .unRegisterWakeCmd(V2XVoiceConstants.COMMAND_ZHIDAO_V2X_CALL_CHATTING) - .unRegisterWakeCmd(V2XVoiceConstants.COMMAND_ZHIDAO_V2X_ZAN) - .unRegisterUnWakeVoice(V2XVoiceConstants.COMMAND_V2X_TO_CHAT_MORE_UN_WAKEUP) - .unRegisterUnWakeVoice(V2XVoiceConstants.COMMAND_V2X_TO_ZAN_UN_WAKEUP) - .unRegisterUnWakeVoice(V2XVoiceConstants.COMMAND_V2X_TO_FEEDBACK_TRUE) - .unRegisterUnWakeVoice(V2XVoiceConstants.COMMAND_V2X_TO_FEEDBACK_ERROR) - .unRegisterUnWakeVoice(V2XVoiceConstants.COMMAND_ZHIDAO_V2X_OPEN_CAR_INFO_UN_WAKEUP); - } - }); - } - - @Override - public void initView(V2XEventShowEntity v2XEventShowEntity) { - try { - if (v2XEventShowEntity == null) { - return; - } - mV2XEventShowEntity = v2XEventShowEntity; - mV2XRoadEventEntity = v2XEventShowEntity.getV2XRoadEventEntity(); - - if (mV2XRoadEventEntity == null) { - return; - } - mNoveltyInfo = mV2XRoadEventEntity.getNoveltyInfo(); - if (mNoveltyInfo != null) { - mUserInfo = mNoveltyInfo.getUserInfo(); - if (!CollectionUtils.isEmpty(mNoveltyInfo.getItems())) { - String imgUrl = mNoveltyInfo.getItems().get(0).getThumbnail(); - String url = mNoveltyInfo.getItems().get(0).getUrl(); - if (TextUtils.isEmpty(imgUrl)) { - imgUrl = mNoveltyInfo.getItems().get(0).getUrl(); - } - if (!TextUtils.isEmpty(imgUrl)) { - boolean isVrMode = false; - IMogoStatusManager statusManager = BridgeApi.INSTANCE.statusManager(); - if (statusManager != null) { - isVrMode = statusManager.isVrMode(); - } - if (isVrMode) { - Glide.with(mContext).load(imgUrl).apply(RequestOptions.bitmapTransform( - new GlideRoundedCornersTransform(20, GlideRoundedCornersTransform.CornerType.LEFT))).into(ivEventImg); - } else { - IMogoImageloader imageloader = BridgeApi.INSTANCE.imageLoader(); - if (imageloader != null) { - imageloader.displayImage(imgUrl, ivEventImg); - } - } - } - if (url.contains(".mp4")) { - ivEventImg.setOnClickListener(v -> { - showRoadVideoInfo(v2XEventShowEntity); - }); - ivPlay.setVisibility(VISIBLE); - tvLine.setVisibility(VISIBLE); - tvPlay.setVisibility(VISIBLE); - tvPlay.setOnClickListener(v -> { - showRoadVideoInfo(v2XEventShowEntity); - }); - ivEventPlay.setOnClickListener(v -> { - showRoadVideoInfo(v2XEventShowEntity); - }); - ivEventPlay.setVisibility(VISIBLE); - } else { - ivEventImg.setOnClickListener(null); - ivEventPlay.setOnClickListener(null); - ivEventPlay.setVisibility(GONE); - ivPlay.setVisibility(GONE); - tvLine.setVisibility(GONE); - tvPlay.setVisibility(GONE); - } - } - if (mNoveltyInfo.getUserInfo() != null && - !TextUtils.isEmpty(mNoveltyInfo.getUserInfo().getUserHead())) { - - IMogoImageloader imageloader = BridgeApi.INSTANCE.imageLoader(); - if (imageloader != null) { - imageloader.displayImage(mNoveltyInfo.getUserInfo().getUserHead(), ivReportHead); - } - } - - String poiType = EventTypeEnum.getPoiTypeStr(mNoveltyInfo.getPoiType()); - if (!TextUtils.isEmpty(poiType)) { - tvEventTypeTitle.setText(poiType); - tvEventTypeTitle.setBackgroundResource(EventTypeEnum.getPoiTypeBg(mNoveltyInfo.getPoiType(), - BridgeApi.INSTANCE.statusManager() != null && BridgeApi.INSTANCE.statusManager().isVrMode())); - - } - ivEvent.setImageResource(EventTypeEnum.getPoiTypeSrcVr(mNoveltyInfo.getPoiType())); - tvEvent.setText(EventTypeEnum.getPoiTypeStrVr(mNoveltyInfo.getPoiType())); - if (EventTypeEnum.FOURS_FOG.getPoiType().equals(mNoveltyInfo.getPoiType())) { - DisplayEffectsInterface displayEffects = BridgeApi.INSTANCE.displayEffects(); - if (displayEffects != null) { - displayEffects.displayEffects(EventTypeEnum.FOURS_FOG.getPoiType()); - } - CallerHmiManager.INSTANCE.showWarning(WarningDirectionEnum.ALERT_WARNING_TOP); - } - tvEventAddress.setText(mNoveltyInfo.getAddr()); - tvEventDistance.setText("距离 " + (int) mNoveltyInfo.getDistance() + "米"); - - Calendar c = Calendar.getInstance(); - c.setTimeInMillis(mNoveltyInfo.getGenerateTime()); - String eventTime = DateTimeUtils.printCalendarByPattern(c, "yyyy/MM/dd HH:mm"); - if (!TextUtils.isEmpty(eventTime)) { - tvEventTime.setText(eventTime); - } - - if (!CollectionUtils.isEmpty(mV2XEventShowEntity.getV2XLiveCarList())) { - ivEventLive.setVisibility(VISIBLE); - V2XVoiceManager.INSTANCE - .registerWakeCmd(V2XVoiceConstants.COMMAND_ZHIDAO_V2X_LIVE_ROAD, - v2XVoiceOpenLiveListener) - .registerUnWakeVoice(V2XVoiceConstants.COMMAND_ZHIDAO_V2X_OPEN_LIVE_UN_WAKEUP, - v2XVoiceOpenLiveListener); - ivEventLive.setOnClickListener(v -> { - showLiveCar(v2XEventShowEntity); - }); - } else { - ivEventLive.setVisibility(GONE); - } - - ivEventReportTrue.setVisibility(GONE); - ivEventReportErr.setVisibility(GONE); - - if (V2XSQLiteUtils.isZanEvent(mNoveltyInfo.getInfoId())) { - ivEventZan.setVisibility(GONE); - } else { - ivEventZan.setVisibility(VISIBLE); - } - - // 用户上报的才会展示拨打电话 - if (!TextUtils.isEmpty(mNoveltyInfo.getUploadType()) - && mNoveltyInfo.getUploadType().equals("1")) { - requestUserInfo(mNoveltyInfo); - } - - ivEventReportTrue.setOnClickListener(v -> { - triggerReportTrue(mNoveltyInfo); - }); - ivEventReportErr.setOnClickListener(v -> { - triggerReportErr(mNoveltyInfo); - }); - ivEventCallChart.setOnClickListener(v -> { - ivEventCallChart.setVisibility(GONE); - triggerCallChart(mNoveltyInfo); - }); - - ivEventZan.setOnClickCallListener(v -> { - triggerZan(mNoveltyInfo); - }); - - ivReportHead.setOnClickListener(v -> { - triggerIVReportHead(mNoveltyInfo); - }); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - - /* - * 展示事件的图片/视频资源 - * */ - private void showRoadVideoInfo(V2XEventShowEntity v2XEventShowEntity) { - if (v2XEventShowEntity != null) { - /* - * MarkerExploreWay 具体事件 - * V2XRoadEventEntity 包含MarkerExploreWay 事件的二次封装(tts播报内容 事件类型等) - * V2XMessageEntity 三次封装(是否进行事件与本机连线 是否显示通话功能等) - * V2XEventShowEntity 包含V2XRoadEventEntity - * */ - Log.d(TAG, "马上展示图片/视频资源全屏"); - V2XMessageEntity v2XMessageEntity = new V2XMessageEntity<>(); - v2XMessageEntity.setContent(v2XEventShowEntity); - V2XRoadVideoCarScenario.getInstance().init(v2XMessageEntity); - } - } - - /** - * 展示直播信息 - * - * @param v2XEventShowEntity - */ - private void showLiveCar(V2XEventShowEntity v2XEventShowEntity) { - if (v2XEventShowEntity != null) { - // 展示周边的直播车辆 - List eventShowEntityArrayList = new ArrayList<>(); - for (V2XLiveCarInfoEntity v2XLiveCarInfoRes : v2XEventShowEntity.getV2XLiveCarList()) { - V2XEventShowEntity showEntity = new V2XEventShowEntity(); - showEntity.setViewType(V2XMessageEntity.V2XTypeEnum.ALERT_ROAD_LIVE_CAR_WARNING); - showEntity.setV2XLiveCarInfoRes(v2XLiveCarInfoRes); - showEntity.setV2XRoadEventEntity(mV2XRoadEventEntity); - eventShowEntityArrayList.add(showEntity); - } - - Logger.d(MODULE_NAME, "要展示的直播:" + GsonUtil.jsonFromObject(eventShowEntityArrayList)); - V2XMessageEntity> v2XMessageEntity = new V2XMessageEntity<>(); - v2XMessageEntity.setType(V2XMessageEntity.V2XTypeEnum.ALERT_ROAD_LIVE_CAR_WARNING); - v2XMessageEntity.setContent(eventShowEntityArrayList); - v2XMessageEntity.setShowState(true); - V2XRoadLiveCarScenario.getInstance().init(v2XMessageEntity); - - // 打开直播后,窗口倒计时暂停关闭,直播被关闭后继续倒计时 - if (mV2XWindow != null) { - if (mV2XWindow instanceof V2XRoadEventWindow) { - ((V2XRoadEventWindow) mV2XWindow).stopCountDown(); - } - } - } - } - - private void bezierAnimation(int[] loc) { - if (mWindowManagerView == null) { - Log.d(TAG, "bezierAnimation:null"); - mWindowManagerView = new WindowManagerView.Builder(mContext.getApplicationContext()) - .contentView(R.layout.module_common_bezier_layout) - .size(WindowManager.LayoutParams.WRAP_CONTENT, - WindowManager.LayoutParams.WRAP_CONTENT) - .position(loc[0], loc[1]) - .gravity(Gravity.TOP | Gravity.LEFT) - .showInWindowManager(); - } - try { - if (mWindowManagerView.isShowing()) { - return; - } - mWindowManagerView.show(); - } catch (Exception e) { - e.printStackTrace(); - } - BezierAnimationView bezierAnimationView = mWindowManagerView.findViewById(R.id.bezier_view); - bezierAnimationView.bezierAnimationStart(); - new Handler().postDelayed(new Runnable() { - @Override - public void run() { -// mWindowManagerView.dismiss(); - } - }, 2000); - - } - - public int[] getLocation(View v) { - int[] loc = new int[4]; - int[] location = new int[2]; - v.getLocationOnScreen(location); - loc[0] = location[0]; - loc[1] = location[1]; - int w = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); - int h = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); - v.measure(w, h); - - loc[2] = v.getMeasuredWidth(); - loc[3] = v.getMeasuredHeight(); - - //base = computeWH(); - return loc; - } - - /** - * 为了给车聊聊更多的信息需要重新查询一次 - * - * @param noveltyInfo - */ - private void requestUserInfo(MarkerExploreWay noveltyInfo) { - Logger.d(MODULE_NAME, "上报事件的用户SN:" + noveltyInfo.getSn()); - // 获取道路事件周边的直播车机 - if (!TextUtils.isEmpty(noveltyInfo.getSn())) { - BridgeApi.INSTANCE.refreshModel() - .queryUserInfoBySn( - noveltyInfo.getSn(), - new V2XRefreshCallback() { - @Override - public void onSuccess(V2XUserInfoRes result) { - if (result != null && result.getResult() != null && result.getResult().getInfo() != null) { - V2XUserInfoRes.Result.Info infoBean = result.getResult().getInfo(); - if (mUserInfo == null) { - mUserInfo = new MarkerUserInfo(); - } - mUserInfo.setSn(infoBean.getSn()); - try { - if (!TextUtils.isEmpty(infoBean.getCardIdAge())) { - mUserInfo.setAge(Integer.parseInt(infoBean.getCardIdAge())); - } - } catch (NumberFormatException e) { - e.printStackTrace(); - } - mUserInfo.setUserName(infoBean.getUserNickName()); - mUserInfo.setUserHead(infoBean.getHeadImgUrl()); - mUserInfo.setGender(infoBean.getCardIdSex()); - - // 重新设置用户信息 - mNoveltyInfo.setUserInfo(mUserInfo); - - // M1低配车机限制 - // 不展示打电话按钮 - // 不能查看用户详情 - if (DebugConfig.isMapBased()) { - // 只有自研车机才会 有车聊聊通话 - if (DebugConfig.getCarMachineType() == DebugConfig.CAR_MACHINE_TYPE_SELF_INNOVATE) { - // 判断是否可以打电话 - ChartingUtil.isCanCall(b -> { - if (b) { - // 判断是否可以打电话 - ChartingUtil.isOnLine(mUserInfo.getSn(), b1 -> { - if (b1) { - ivEventCallChart.setVisibility(VISIBLE); - } else { - ivEventCallChart.setVisibility(GONE); - } - }); - } else { - ivEventCallChart.setVisibility(GONE); - } - }); - } - } - } - } - - @Override - public void onFail(String msg) { - ivEventCallChart.setVisibility(GONE); - } - }); - } - } -// -// /** -// * 延迟关闭窗体 -// */ -// @Override -// public void delayedCloseWindow() { -//// itemView.postDelayed(() -> { -//// // 移除窗体 -//// V2XServiceManager -//// .getIMogoWindowManager() -//// .removeView(V2XRoadEventScenario.getInstance().getV2XWindow().getView()); -//// V2XRoadEventScenario.getInstance().close(); -//// }, 1000); -// } -} diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/adapter/holder/V2XScenarioHistoryIllegalParkVH.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/adapter/holder/V2XScenarioHistoryIllegalParkVH.java deleted file mode 100644 index ddc2295482..0000000000 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/adapter/holder/V2XScenarioHistoryIllegalParkVH.java +++ /dev/null @@ -1,133 +0,0 @@ -package com.mogo.eagle.core.function.v2x.events.adapter.holder; - -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import com.mogo.eagle.core.function.v2x.R; -import com.mogo.eagle.core.function.v2x.events.consts.V2XConst; -import com.mogo.eagle.core.function.v2x.events.utils.RoadConditionUtils; -import com.mogo.eagle.core.function.v2x.events.utils.V2XSQLiteUtils; -import com.mogo.eagle.core.function.v2x.events.view.HeartLikeView; -import com.mogo.eagle.core.function.v2x.events.view.HeartUnLikeView; -import com.mogo.eagle.core.network.utils.GsonUtil; -import com.mogo.module.common.entity.MarkerExploreWay; -import com.mogo.module.common.entity.V2XHistoryScenarioData; -import com.mogo.eagle.core.utilcode.mogo.logger.Logger; - -/** - * 出行面板违章停车 - * - * @author donghongyu - */ -public class V2XScenarioHistoryIllegalParkVH extends V2XHistoryBaseViewHolder { - private TextView mTvAddress; - private TextView mTvIllegalNum; - - private TextView mTagEventType; - private TextView mTagEventEvaluate; - - private HeartLikeView mLlIllegalParkingLike; - private HeartUnLikeView mLlIllegalParkingUnLike; - - private MarkerExploreWay mExploreWay; - - private V2XHistoryScenarioData mOldScenarioData; - - public V2XScenarioHistoryIllegalParkVH(ViewGroup viewGroup) { - super(LayoutInflater.from(viewGroup.getContext()) - .inflate(R.layout.item_v2x_scennario_history, viewGroup, false)); - mTvAddress = itemView.findViewById(R.id.tvAddress); - mTvIllegalNum = itemView.findViewById(R.id.tvIllegalNum); - - mTagEventType = itemView.findViewById(R.id.tagEventType); - mTagEventEvaluate = itemView.findViewById(R.id.tagEventEvaluate); - - mLlIllegalParkingLike = itemView.findViewById(R.id.llIllegalParkingLike); - mLlIllegalParkingUnLike = itemView.findViewById(R.id.llIllegalParkingUnLike); - } - - @Override - public void initView(V2XHistoryScenarioData viewData) { - try { - mOldScenarioData = viewData; - mExploreWay = GsonUtil.objectFromJson(viewData.getEventJsonData(), MarkerExploreWay.class); - mTvAddress.setText(mExploreWay.getAddr()); - - try { - mTvIllegalNum.setText("违章人数:" + (int) mExploreWay.getItems().get(0).getIllegalCount()); - } catch (Exception e) { - e.printStackTrace(); - } - - if (!viewData.isDispose()) { - hideControlButton(View.VISIBLE); - } else { - hideControlButton(View.GONE); - } - - mLlIllegalParkingLike.setOnClickCallListener(v -> { - Logger.d(V2XConst.MODULE_NAME, "反馈有用"); - roadReportTrue(); - }); - - mLlIllegalParkingUnLike.setOnClickCallListener(v -> { - Logger.d(V2XConst.MODULE_NAME, "反馈无用"); - roadReportErr(); - }); - } catch (Exception e) { - e.printStackTrace(); - } - } - - void hideControlButton(int gone) { - mTagEventEvaluate.setVisibility(gone); - mLlIllegalParkingLike.setVisibility(gone); - mLlIllegalParkingUnLike.setVisibility(gone); - } - - @Override - public void delayedCloseWindow() { - try { - hideControlButton(View.GONE); - // 进行数据库存储 - V2XHistoryScenarioData v2XHistoryScenarioData = new V2XHistoryScenarioData(); - v2XHistoryScenarioData.setScenarioType(mOldScenarioData.getScenarioType()); - v2XHistoryScenarioData.setTriggerTime(mOldScenarioData.getTriggerTime()); - v2XHistoryScenarioData.setEventJsonData(mOldScenarioData.getEventJsonData()); - v2XHistoryScenarioData.setEventJsonDataHashCode(mOldScenarioData.getEventJsonDataHashCode()); - v2XHistoryScenarioData.setDispose(true); - V2XSQLiteUtils.updateScenarioHistoryData(mOldScenarioData, v2XHistoryScenarioData); - mOldScenarioData.setDispose(true); - } catch (Exception e) { - e.printStackTrace(); - } - } - - /** - * 反馈路况正确 - */ - private void roadReportTrue() { - delayedCloseWindow(); - if (mExploreWay != null) { - RoadConditionUtils.sendShareReceiverInfo( - mExploreWay.getInfoId(), - mExploreWay.getPoiType(), - 2); - } - } - - /** - * 反馈路况错误 - */ - private void roadReportErr() { - delayedCloseWindow(); - if (mExploreWay != null) { - RoadConditionUtils.sendShareReceiverInfo( - mExploreWay.getInfoId(), - mExploreWay.getPoiType(), - 3); - } - } -} diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/adapter/holder/V2XScenarioHistoryOtherSeekHelpVH.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/adapter/holder/V2XScenarioHistoryOtherSeekHelpVH.java deleted file mode 100644 index df6dea320f..0000000000 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/adapter/holder/V2XScenarioHistoryOtherSeekHelpVH.java +++ /dev/null @@ -1,181 +0,0 @@ -package com.mogo.eagle.core.function.v2x.events.adapter.holder; - -import static android.view.View.GONE; -import static android.view.View.VISIBLE; - -import android.text.TextUtils; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.TextView; - -import com.mogo.commons.debug.DebugConfig; -import com.mogo.eagle.core.function.v2x.R; -import com.mogo.eagle.core.function.v2x.events.bridge.BridgeApi; -import com.mogo.eagle.core.function.v2x.events.fragment.V2XEventPanelFragment; -import com.mogo.eagle.core.function.v2x.events.utils.ChartingUtil; -import com.mogo.eagle.core.function.v2x.events.utils.V2XSQLiteUtils; -import com.mogo.eagle.core.function.v2x.events.utils.V2XUtils; -import com.mogo.eagle.core.network.utils.GsonUtil; -import com.mogo.eagle.core.utilcode.util.SpanUtils; -import com.mogo.module.common.entity.MarkerExploreWay; -import com.mogo.module.common.entity.MarkerLocation; -import com.mogo.module.common.entity.MarkerUserInfo; -import com.mogo.module.common.entity.V2XHistoryScenarioData; -import com.mogo.module.common.entity.V2XPushMessageEntity; -import com.mogo.service.imageloader.IMogoImageloader; -import com.mogo.service.imageloader.MogoImageView; - -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Locale; - -/** - * 出行动态中的他人故障求助 - * - * @author donghongyu - */ -public class V2XScenarioHistoryOtherSeekHelpVH extends V2XHistoryBaseViewHolder { - - private TextView mTagEventType; - private TextView mTagEventEvaluate; - private MogoImageView mIvFaultHelpHead; - private TextView mTvFaultHelpName; - private TextView mTvFaultHelpEventTime; - private TextView mTvFaultHelpDistance; - private ImageView mIvFaultHelpEventCall; - - private MarkerExploreWay mNoveltyInfo; - // 上传事件的用户信息 - private MarkerUserInfo mUserInfo = new MarkerUserInfo(); - - private V2XHistoryScenarioData mOldScenarioData; - - public V2XScenarioHistoryOtherSeekHelpVH(ViewGroup viewGroup) { - super(LayoutInflater.from(viewGroup.getContext()) - .inflate(R.layout.item_v2x_scennario_history_other_help, viewGroup, false)); - mTagEventType = itemView.findViewById(R.id.tagEventType); - mTagEventEvaluate = itemView.findViewById(R.id.tagEventEvaluate); - mIvFaultHelpHead = itemView.findViewById(R.id.ivFaultHelpHead); - mTvFaultHelpName = itemView.findViewById(R.id.tvFaultHelpName); - mTvFaultHelpEventTime = itemView.findViewById(R.id.tvFaultHelpEventTime); - mTvFaultHelpDistance = itemView.findViewById(R.id.tvFaultHelpDistance); - mIvFaultHelpEventCall = itemView.findViewById(R.id.ivFaultHelpEventCall); - } - - @Override - public void initView(V2XHistoryScenarioData viewData) { - try { - mOldScenarioData = viewData; - V2XPushMessageEntity xPushMessageEntity = GsonUtil.objectFromJson(viewData.getEventJsonData(), V2XPushMessageEntity.class); - - mUserInfo.setSn(xPushMessageEntity.getSn()); - mUserInfo.setUserHead(xPushMessageEntity.getHeadImgUrl()); - mUserInfo.setUserName(xPushMessageEntity.getDisplayName()); - mUserInfo.setGender(xPushMessageEntity.getSex()); - mUserInfo.setAge(xPushMessageEntity.getAge()); - - mTvFaultHelpName.setText(xPushMessageEntity.getDisplayName()); - - if (!TextUtils.isEmpty(xPushMessageEntity.getHeadImgUrl())) { - IMogoImageloader imageLoader = BridgeApi.INSTANCE.imageLoader(); - if (imageLoader != null) { - imageLoader.displayImage(xPushMessageEntity.getHeadImgUrl(), mIvFaultHelpHead); - } - } - - if (xPushMessageEntity.getDistance() > 1000) { - SpanUtils.with(mTvFaultHelpDistance) - .append("" + (int) xPushMessageEntity.getDistance() / 1000) - .setFontSize((int) itemView.getResources().getDimension(R.dimen.module_v2x_event_distance_title)) - .append("公里") - .setFontSize((int) itemView.getResources().getDimension(R.dimen.dp_32)) - .create(); - } else { - SpanUtils.with(mTvFaultHelpDistance) - .append("" + (int) xPushMessageEntity.getDistance()) - .setFontSize((int) itemView.getResources().getDimension(R.dimen.module_v2x_event_distance_title)) - .append("米") - .setFontSize((int) itemView.getResources().getDimension(R.dimen.dp_32)) - .create(); - } - SimpleDateFormat sdf = new SimpleDateFormat("HH:mm", Locale.CHINA); - String eventTime = String.format("%s发布求助信息", - sdf.format(new Date(xPushMessageEntity.getCreateTime()))); - mTvFaultHelpEventTime.setText(eventTime); - - try { - MarkerLocation markerLocation = new MarkerLocation(); - markerLocation.setLon(xPushMessageEntity.getLon()); - markerLocation.setLat(xPushMessageEntity.getLat()); - mNoveltyInfo = new MarkerExploreWay(); - mNoveltyInfo.setLocation(markerLocation); - mNoveltyInfo.setUserInfo(mUserInfo); - } catch (Exception e) { - e.printStackTrace(); - } - - // M1低配车机限制 - // 不展示打电话按钮 - // 不能查看用户详情 - if (DebugConfig.isMapBased()) { - // 只有自研车机才会 有车聊聊通话 - if (DebugConfig.getCarMachineType() == DebugConfig.CAR_MACHINE_TYPE_SELF_INNOVATE) { - // 判断是否可以打电话 - ChartingUtil.isCanCall(b -> { - if (b) { - // 判断是否可以打电话 - ChartingUtil.isOnLine(xPushMessageEntity.getSn(), b1 -> { - if (b1) { - mIvFaultHelpEventCall.setVisibility(VISIBLE); - } else { - mIvFaultHelpEventCall.setVisibility(GONE); - } - }); - } else { - mIvFaultHelpEventCall.setVisibility(GONE); - } - }); - - mIvFaultHelpEventCall.setOnClickListener(v -> { - if (!V2XUtils.isFastClick()) { - BridgeApi.INSTANCE.refreshModel().respondingToHelp(mUserInfo.getSn()); - try { - triggerCallChart(mNoveltyInfo); - } catch (Exception e) { - e.printStackTrace(); - } - } - }); - } - } - } catch (Exception e) { - e.printStackTrace(); - } - } - - @Override - public void delayedCloseWindow() { - try { - hideControlButton(View.GONE); - // 进行数据库存储 - V2XHistoryScenarioData v2XHistoryScenarioData = new V2XHistoryScenarioData(); - v2XHistoryScenarioData.setScenarioType(mOldScenarioData.getScenarioType()); - v2XHistoryScenarioData.setTriggerTime(mOldScenarioData.getTriggerTime()); - v2XHistoryScenarioData.setEventJsonData(mOldScenarioData.getEventJsonData()); - v2XHistoryScenarioData.setEventJsonDataHashCode(mOldScenarioData.getEventJsonDataHashCode()); - v2XHistoryScenarioData.setDispose(true); - V2XSQLiteUtils.updateScenarioHistoryData(mOldScenarioData, v2XHistoryScenarioData); - mOldScenarioData.setDispose(true); - - V2XEventPanelFragment.Companion.getInstance().hidePanel(); - } catch (Exception e) { - e.printStackTrace(); - } - } - - void hideControlButton(int gone) { - mTagEventEvaluate.setVisibility(gone); - } -} diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/adapter/holder/V2XScenarioHistoryRoadEventVH.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/adapter/holder/V2XScenarioHistoryRoadEventVH.java deleted file mode 100644 index 0e6983bfa8..0000000000 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/adapter/holder/V2XScenarioHistoryRoadEventVH.java +++ /dev/null @@ -1,139 +0,0 @@ -package com.mogo.eagle.core.function.v2x.events.adapter.holder; - -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.TextView; - -import com.mogo.eagle.core.function.v2x.R; -import com.mogo.eagle.core.function.v2x.events.consts.V2XConst; -import com.mogo.eagle.core.function.v2x.events.utils.RoadConditionUtils; -import com.mogo.eagle.core.function.v2x.events.utils.V2XSQLiteUtils; -import com.mogo.eagle.core.function.v2x.events.view.HeartLikeView; -import com.mogo.eagle.core.function.v2x.events.view.HeartUnLikeView; -import com.mogo.eagle.core.network.utils.GsonUtil; -import com.mogo.eagle.core.utilcode.util.TimeUtils; -import com.mogo.module.common.entity.MarkerExploreWay; -import com.mogo.module.common.entity.V2XHistoryScenarioData; -import com.mogo.module.common.enums.EventTypeEnum; -import com.mogo.eagle.core.utilcode.mogo.logger.Logger; - -/** - * 出行面板道路事件面板 - * - * @author donghongyu - */ -public class V2XScenarioHistoryRoadEventVH extends V2XHistoryBaseViewHolder { - private TextView mTvAddress; - private TextView mTvIllegalNum; - private ImageView mIvIconP; - private TextView mTagEventType; - private TextView mTagEventEvaluate; - - private HeartLikeView mLlIllegalParkingLike; - private HeartUnLikeView mLlIllegalParkingUnLike; - - private MarkerExploreWay mExploreWay; - private V2XHistoryScenarioData mOldScenarioData; - - public V2XScenarioHistoryRoadEventVH(ViewGroup viewGroup) { - super(LayoutInflater.from(viewGroup.getContext()) - .inflate(R.layout.item_v2x_scennario_history, viewGroup, false)); - mTvAddress = itemView.findViewById(R.id.tvAddress); - mTvIllegalNum = itemView.findViewById(R.id.tvIllegalNum); - mIvIconP = itemView.findViewById(R.id.ivIconP); - mTagEventType = itemView.findViewById(R.id.tagEventType); - mTagEventEvaluate = itemView.findViewById(R.id.tagEventEvaluate); - - mLlIllegalParkingLike = itemView.findViewById(R.id.llIllegalParkingLike); - mLlIllegalParkingUnLike = itemView.findViewById(R.id.llIllegalParkingUnLike); - } - - @Override - public void initView(V2XHistoryScenarioData viewData) { - try { - mOldScenarioData = viewData; - mExploreWay = GsonUtil.objectFromJson(viewData.getEventJsonData(), MarkerExploreWay.class); - - mIvIconP.setVisibility(View.GONE); - mTvAddress.setText(mExploreWay.getAddr()); - mTagEventType.setText(EventTypeEnum.getPoiTypeStr(mExploreWay.getPoiType())); - - try { - mTvIllegalNum.setText(mExploreWay.getUserInfo().getUserName() + "的分享 " + - TimeUtils.millis2String(mOldScenarioData.getTriggerTime(), "MM月dd日 HH:mm")); - } catch (Exception e) { - e.printStackTrace(); - } - - if (!viewData.isDispose()) { - hideControlButton(View.VISIBLE); - } else { - hideControlButton(View.GONE); - } - - mLlIllegalParkingLike.setOnClickCallListener(v -> { - Logger.d(V2XConst.MODULE_NAME, "反馈有用"); - roadReportTrue(); - }); - - mLlIllegalParkingUnLike.setOnClickCallListener(v -> { - Logger.d(V2XConst.MODULE_NAME, "反馈无用"); - roadReportErr(); - }); - } catch (Exception e) { - e.printStackTrace(); - } - } - - void hideControlButton(int gone) { - mTagEventEvaluate.setVisibility(gone); - mLlIllegalParkingLike.setVisibility(gone); - mLlIllegalParkingUnLike.setVisibility(gone); - } - - @Override - public void delayedCloseWindow() { - try { - hideControlButton(View.GONE); - // 进行数据库存储 - V2XHistoryScenarioData v2XHistoryScenarioData = new V2XHistoryScenarioData(); - v2XHistoryScenarioData.setScenarioType(mOldScenarioData.getScenarioType()); - v2XHistoryScenarioData.setTriggerTime(mOldScenarioData.getTriggerTime()); - v2XHistoryScenarioData.setEventJsonData(mOldScenarioData.getEventJsonData()); - v2XHistoryScenarioData.setEventJsonDataHashCode(mOldScenarioData.getEventJsonDataHashCode()); - v2XHistoryScenarioData.setDispose(true); - V2XSQLiteUtils.updateScenarioHistoryData(mOldScenarioData, v2XHistoryScenarioData); - mOldScenarioData.setDispose(true); - } catch (Exception e) { - e.printStackTrace(); - } - } - - /** - * 反馈路况正确 - */ - private void roadReportTrue() { - delayedCloseWindow(); - if (mExploreWay != null) { - RoadConditionUtils.sendShareReceiverInfo( - mExploreWay.getInfoId(), - mExploreWay.getPoiType(), - 2); - } - } - - /** - * 反馈路况错误 - */ - private void roadReportErr() { - delayedCloseWindow(); - if (mExploreWay != null) { - RoadConditionUtils.sendShareReceiverInfo( - mExploreWay.getInfoId(), - mExploreWay.getPoiType(), - 3); - } - } -} diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/adapter/holder/V2XSurroundingDetailVH.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/adapter/holder/V2XSurroundingDetailVH.java deleted file mode 100644 index 285be09be0..0000000000 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/adapter/holder/V2XSurroundingDetailVH.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.mogo.eagle.core.function.v2x.events.adapter.holder; - -import android.view.View; - -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.RecyclerView; - -/** - * @author lixiaopeng - * @description - * @since 2020/11/16 - */ -public class V2XSurroundingDetailVH extends RecyclerView.ViewHolder{ - - public V2XSurroundingDetailVH(@NonNull View itemView) { - super(itemView); - } - -} diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/adapter/holder/V2XSurroundingViewHolder.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/adapter/holder/V2XSurroundingViewHolder.java deleted file mode 100644 index 7bb6af9867..0000000000 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/adapter/holder/V2XSurroundingViewHolder.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.mogo.eagle.core.function.v2x.events.adapter.holder; - -import android.view.View; - -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.RecyclerView; - -/** - * @author lixiaopeng - * @description - * @since 2020/7/29 - */ -public class V2XSurroundingViewHolder extends RecyclerView.ViewHolder{ - - public V2XSurroundingViewHolder(@NonNull View itemView) { - super(itemView); - } - -} diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/consts/V2XConst.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/consts/V2XConst.java index 81015eb70e..8015ca05c3 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/consts/V2XConst.java +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/consts/V2XConst.java @@ -23,10 +23,7 @@ public class V2XConst { * 事件面板名称 */ public static final String MODULE_NAME_EVENT_PANEL = "MODULE_EVENT_PANEL"; - /** - * 事件面板路径 - */ - public static final String PATH_EVENT_PANEL = "/event/panel"; + /** * V2X 场景广播 Action diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/fragment/V2XEventPanelFragment.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/fragment/V2XEventPanelFragment.kt deleted file mode 100644 index 78a1c62f58..0000000000 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/fragment/V2XEventPanelFragment.kt +++ /dev/null @@ -1,438 +0,0 @@ -package com.mogo.eagle.core.function.v2x.events.fragment - -import android.content.Intent -import android.graphics.Color -import android.graphics.Typeface -import android.os.Bundle -import android.text.SpannableString -import android.text.Spanned -import android.text.style.AbsoluteSizeSpan -import android.text.style.ForegroundColorSpan -import android.text.style.StyleSpan -import android.view.View -import android.widget.ImageView -import android.widget.RadioButton -import android.widget.RadioGroup -import android.widget.TextView -import androidx.constraintlayout.widget.ConstraintLayout -import androidx.fragment.app.Fragment -import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView -import androidx.viewpager2.widget.ViewPager2 -import com.google.android.material.tabs.TabLayoutMediator -import com.mogo.commons.debug.DebugConfig -import com.mogo.commons.mvp.MvpFragment -import com.mogo.eagle.core.function.v2x.R -import com.mogo.eagle.core.function.v2x.events.adapter.V2XEventPagerAdapter -import com.mogo.eagle.core.function.v2x.events.adapter.V2XSurroundingDetailAdapter -import com.mogo.eagle.core.function.v2x.events.bridge.BridgeApi -import com.mogo.eagle.core.function.v2x.events.consts.V2XConst.MODULE_NAME -import com.mogo.eagle.core.function.v2x.events.entity.panel.BackRefreshInfo -import com.mogo.eagle.core.function.v2x.events.entity.panel.SurroundingConstruction -import com.mogo.eagle.core.function.v2x.events.fragment.presenter.EventPanelPresenter -import com.mogo.eagle.core.function.v2x.events.listener.SurroundingDetailItemListener -import com.mogo.eagle.core.function.v2x.events.utils.TrackUtils -import com.mogo.eagle.core.function.v2x.events.view.V2XEventPanelHistoryCountView -import com.mogo.eagle.core.function.v2x.events.voice.V2XVoiceCallbackListener -import com.mogo.eagle.core.function.v2x.events.voice.V2XVoiceConstants -import com.mogo.module.common.entity.MarkerExploreWay -import com.mogo.module.common.MogoApisHandler -import com.mogo.module.common.enums.EventTypeEnum -import com.mogo.module.common.view.SpacesItemDecoration -import com.mogo.module.v2x.voice.V2XVoiceManager -import com.mogo.service.statusmanager.IMogoStatusChangedListener -import com.mogo.service.statusmanager.StatusDescriptor -import com.mogo.eagle.core.utilcode.mogo.logger.Logger -import org.greenrobot.eventbus.EventBus -import org.greenrobot.eventbus.Subscribe -import org.greenrobot.eventbus.ThreadMode - - -/** - * 事件面板主fragment - * - * @author tongchenfei - */ -class V2XEventPanelFragment : MvpFragment(), SurroundingDetailItemListener,IMogoStatusChangedListener{ - - private val TAG = "V2XEventPanelFragment" - - private var isFirstLoad = false - - private var fragments: Array? = null - - private var mediator: TabLayoutMediator? = null - - private var mV2XEventPanelHistoryCountView: V2XEventPanelHistoryCountView? = null - - private var mClPanelContainer: ConstraintLayout? = null - private var mVpEventPanel: ViewPager2? = null - private var mRgTabSelect: RadioGroup? = null - private var mBtnHidePanels: ImageView? = null - private var mRbScenarioHistory: RadioButton? = null - private var mRbSurroundingEvent: RadioButton? = null - private var mRbShareEvents: RadioButton? = null - - private var mBackImage: ImageView? = null - private var mTopBriefTv: TextView? = null - private var mDetailRecyclerView: RecyclerView? = null - private lateinit var mSurroundingDetailAdapter: V2XSurroundingDetailAdapter - var markerExploreWays = mutableListOf() - - private var mV2XScenarioHistoryFragment: V2XScenarioHistoryFragment? = null - private var mV2XShareEventsFragment: V2XShareEventsFragment? = null - private var mV2XSurroundingFragment: V2XSurroundingFragment? = null - - companion object { - private var fragment: V2XEventPanelFragment? = null - fun getInstance(): V2XEventPanelFragment { - if (fragment == null) { - synchronized(this) { - if (fragment == null) { - fragment = V2XEventPanelFragment() - } - } - } - return fragment as V2XEventPanelFragment - } - } - - // 打开出行动态TAB - private val mCheckHistoryEventCb = V2XVoiceCallbackListener { _: String?, _: Intent? -> - try { - mRbScenarioHistory?.isChecked = true - } catch (e: java.lang.Exception) { - e.printStackTrace() - } - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - EventBus.getDefault().register(this) - } - - // 打开周边事件TAB - private val mCheckSurroundingCb = V2XVoiceCallbackListener { _: String?, _: Intent? -> - try { - mRbSurroundingEvent?.isChecked = true - } catch (e: java.lang.Exception) { - e.printStackTrace() - } - } - - // 打开我的分享TAB - private val mCheckShearEventCb = V2XVoiceCallbackListener { _: String?, _: Intent? -> - try { - mRbShareEvents?.isChecked = true - } catch (e: java.lang.Exception) { - e.printStackTrace() - } - } - - // 打关闭事件面板 - private val mCloeEventCb = V2XVoiceCallbackListener { _: String?, _: Intent? -> - try { - TrackUtils.trackV2xHistoryEvent(5) - hidePanel() - } catch (e: java.lang.Exception) { - e.printStackTrace() - } - } - - override fun getLayoutId(): Int { - return R.layout.module_v2x_event_panel_fragment_event_panel - } - - override fun getTagName(): String { - return TAG - } - - override fun initViews() { - Logger.d(MODULE_NAME, "事件面板初始化……") - try { - mV2XScenarioHistoryFragment = V2XScenarioHistoryFragment() - mV2XShareEventsFragment = V2XShareEventsFragment() - mV2XSurroundingFragment = V2XSurroundingFragment() - - fragments = arrayOf( - mV2XScenarioHistoryFragment!!, - mV2XSurroundingFragment!!, - mV2XShareEventsFragment!! - ) - - - mClPanelContainer = mRootView.findViewById(R.id.clPanelContainer) - mVpEventPanel = mRootView.findViewById(R.id.vpEventPanel) - mRgTabSelect = mRootView.findViewById(R.id.rgTabSelect) - mBtnHidePanels = mRootView.findViewById(R.id.btnHidePanels) - mRbScenarioHistory = mRootView.findViewById(R.id.rbScenarioHistory) - mRbSurroundingEvent = mRootView.findViewById(R.id.rbSurroundingEvent) - mRbShareEvents = mRootView.findViewById(R.id.rbShareEvents) - - mBackImage = mRootView.findViewById(R.id.back_image) - mTopBriefTv = mRootView.findViewById(R.id.tv_brief_detail) - mDetailRecyclerView = mRootView.findViewById(R.id.surrounding_detail_recycleview) - - initDetail() - - // M1 不基于地图的版本直接展示事件面板,且不可关闭 - if (!DebugConfig.isMapBased()) { - mClPanelContainer?.visibility = View.VISIBLE - mBtnHidePanels?.visibility = View.GONE - } - - //禁用预加载 - mVpEventPanel?.offscreenPageLimit = ViewPager2.OFFSCREEN_PAGE_LIMIT_DEFAULT - mVpEventPanel?.adapter = V2XEventPagerAdapter(this, fragments!!) - mVpEventPanel?.isUserInputEnabled = false; //true:滑动,false:禁止滑动 - - mRgTabSelect?.setOnCheckedChangeListener { _, checkedId -> - when (checkedId) { - R.id.rbScenarioHistory -> { - // 更改选中是否加粗 - mRbScenarioHistory?.typeface = Typeface.defaultFromStyle(Typeface.BOLD) - mRbSurroundingEvent?.typeface = Typeface.defaultFromStyle(Typeface.NORMAL) - mRbShareEvents?.typeface = Typeface.defaultFromStyle(Typeface.NORMAL) - - TrackUtils.trackV2xHistoryEvent(2) - mVpEventPanel?.setCurrentItem(0, false) - } - R.id.rbSurroundingEvent -> { - // 更改选中是否加粗 - mRbScenarioHistory?.typeface = Typeface.defaultFromStyle(Typeface.NORMAL) - mRbSurroundingEvent?.typeface = Typeface.defaultFromStyle(Typeface.BOLD) - mRbShareEvents?.typeface = Typeface.defaultFromStyle(Typeface.NORMAL) - - TrackUtils.trackV2xHistoryEvent(3) - mVpEventPanel?.setCurrentItem(1, false) - } - R.id.rbShareEvents -> { - // 更改选中是否加粗 - mRbScenarioHistory?.typeface = Typeface.defaultFromStyle(Typeface.NORMAL) - mRbSurroundingEvent?.typeface = Typeface.defaultFromStyle(Typeface.NORMAL) - mRbShareEvents?.typeface = Typeface.defaultFromStyle(Typeface.BOLD) - - TrackUtils.trackV2xHistoryEvent(4) - mVpEventPanel?.setCurrentItem(2, false) - } - } - } - - mBtnHidePanels?.setOnClickListener { - TrackUtils.trackV2xHistoryEvent(5) - hidePanel() - } - - mBackImage?.setOnClickListener { - EventBus.getDefault().post(BackRefreshInfo()) - showBaseUi(true) - } - - mV2XEventPanelHistoryCountView = V2XEventPanelHistoryCountView(context) - mV2XEventPanelHistoryCountView!!.setOnClickListener { - if (mClPanelContainer == null) { - mClPanelContainer = mRootView.findViewById(R.id.clPanelContainer); - } - if (mClPanelContainer != null) { - if (!isPanelShow()) { - TrackUtils.trackV2xHistoryEvent(1) - showPanel() - } - } - } - - // 模拟手动点击,默认选择第二个,周边事件 - // http://jira.zhidaohulian.com/browse/E84XAD-250 - mRgTabSelect?.check(R.id.rbSurroundingEvent) - - } catch (e: Exception) { - e.printStackTrace() - } - } - - override fun onDestroyView() { - EventBus.getDefault().unregister(this) - MogoApisHandler.getInstance().apis.statusManagerApi.unregisterStatusChangedListener(MODULE_NAME, StatusDescriptor.VR_MODE, this) - mediator?.detach() - // 避免内存泄漏 - fragment = null - mClPanelContainer = null - super.onDestroyView() - } - - override fun createPresenter(): EventPanelPresenter { - - return EventPanelPresenter(this) - } - - /* - * 语音查询热心指数需求 - * */ - fun showPanelWithSelectedItem(item: Int) { - showPanel() - selectWithItem(item) - } - - override fun onItemClickListener(v: View?, position: Int, exploreWay: MarkerExploreWay?) { - markerExploreWays[position].isFabulous = true - mSurroundingDetailAdapter.notifyItemChanged(position) - } - - private fun initDetail() { - mDetailRecyclerView!!.addItemDecoration(SpacesItemDecoration(resources.getDimension(R.dimen.share_item_padding).toInt())) - mSurroundingDetailAdapter = V2XSurroundingDetailAdapter(activity, markerExploreWays, this) - mDetailRecyclerView!!.adapter = mSurroundingDetailAdapter - val linearLayoutManager = LinearLayoutManager(activity, LinearLayoutManager.VERTICAL, false) - mDetailRecyclerView!!.layoutManager = linearLayoutManager - } - - @Subscribe(threadMode = ThreadMode.MAIN) - fun updateSurroundingDetail(data: SurroundingConstruction) { - loadSurroundingDetail(data) - } - - private fun loadSurroundingDetail(detailData: SurroundingConstruction?) { - showBaseUi(false) - if (detailData != null) { - markerExploreWays.clear() - markerExploreWays.addAll(detailData.construtList.toMutableList()) - mSurroundingDetailAdapter.notifyDataSetChanged() - - val originStr = String.format(BridgeApi.context().resources.getString(R.string.v2x_surrounding_detail_top_brief), markerExploreWays.size) - val spannableString = SpannableString(originStr + EventTypeEnum.getTypeName(detailData.poiType)) - spannableString.setSpan(ForegroundColorSpan(Color.parseColor("#459DFF")), - 7, originStr.length - EventTypeEnum.getTypeName(detailData.poiType)?.length!!, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) - //设置字体大小,true表示前面的字体大小 dip - spannableString.setSpan(AbsoluteSizeSpan(BridgeApi.context().resources.getDimension(R.dimen.module_v2x_surrounding_top_textsize).toInt(), true), - 7, originStr.length - EventTypeEnum.getTypeName(detailData.poiType)?.length!!, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) - spannableString.setSpan(StyleSpan(Typeface.BOLD), 7, - originStr.length - EventTypeEnum.getTypeName(detailData.poiType)?.length!!, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) - mTopBriefTv?.text = (spannableString) - } - } - - /** - * 是否显示基础页面 - */ - private fun showBaseUi(isShow: Boolean) { - if (isShow) { - mBackImage?.visibility = View.GONE - mTopBriefTv?.visibility = View.GONE - mDetailRecyclerView?.visibility = View.GONE - - mRgTabSelect?.visibility = View.VISIBLE - mVpEventPanel?.visibility = View.VISIBLE - if (DebugConfig.isMapBased()) { - mBtnHidePanels?.visibility = View.VISIBLE - } - } else { - mBackImage?.visibility = View.VISIBLE - mTopBriefTv?.visibility = View.VISIBLE - mDetailRecyclerView?.visibility = View.VISIBLE - - mRgTabSelect?.visibility = View.GONE - mVpEventPanel?.visibility = View.GONE - if (DebugConfig.isMapBased()) { - mBtnHidePanels?.visibility = View.GONE - } - } - } - - /* - * 语音查询事件面板内容 - * */ - private fun selectWithItem(item: Int) { - when (item) { - 0 -> { - try { - mRbScenarioHistory?.isChecked = true - mV2XScenarioHistoryFragment?.fromVoice = true - } catch (e: java.lang.Exception) { - e.printStackTrace() - } - } - 1 -> { - try { - if (mRbSurroundingEvent?.isChecked == true) { - mV2XSurroundingFragment?.ttsForVoiceCheckout() - } else { - mRbSurroundingEvent?.isChecked = true - mV2XSurroundingFragment?.fromVoice = true - } - } catch (e: java.lang.Exception) { - e.printStackTrace() - } - } - 2 -> { - try { - if (mRbShareEvents?.isChecked == true) { - mV2XShareEventsFragment?.ttsForVoiceCheckout() - } else { - mRbShareEvents?.isChecked = true - mV2XShareEventsFragment?.fromVoice = true - } - } catch (e: java.lang.Exception) { - e.printStackTrace() - } - } - } - } - - fun showPanel() { - Logger.d(MODULE_NAME, "in fragment show panel") - mClPanelContainer?.visibility = View.VISIBLE - - if (DebugConfig.isMapBased()) { - V2XVoiceManager.registerUnWakeVoice(V2XVoiceConstants.COMMAND_V2X_TO_CLOSE_WINDOW_UN_WAKEUP, mCloeEventCb) - } - // 注册语音交互 - V2XVoiceManager.registerUnWakeVoice(V2XVoiceConstants.COMMAND_ZHIDAO_V2X_OPEN_HISTORY_EVENT_UN_WAKEUP, mCheckHistoryEventCb) - .registerUnWakeVoice(V2XVoiceConstants.COMMAND_ZHIDAO_V2X_OPEN_SURROUNDING_EVENT_UN_WAKEUP, mCheckSurroundingCb) - .registerUnWakeVoice(V2XVoiceConstants.COMMAND_ZHIDAO_V2X_OPEN_SHEAR_EVENT_UN_WAKEUP, mCheckShearEventCb) - try { - if (isFirstLoad) { - mV2XScenarioHistoryFragment?.presenter?.loadHistory() - mV2XShareEventsFragment?.presenter?.loadShareEventList() - - } - } catch (e: Exception) { - e.printStackTrace() - } - isFirstLoad = true - } - - fun hidePanel() { - if (DebugConfig.isMapBased()) { - Logger.d(MODULE_NAME, "in fragment hide panel") - mClPanelContainer?.visibility = View.GONE - // 注册语音交互 - V2XVoiceManager.unRegisterUnWakeVoice(V2XVoiceConstants.COMMAND_ZHIDAO_V2X_OPEN_HISTORY_EVENT_UN_WAKEUP) - .unRegisterUnWakeVoice(V2XVoiceConstants.COMMAND_ZHIDAO_V2X_OPEN_SURROUNDING_EVENT_UN_WAKEUP) - .unRegisterUnWakeVoice(V2XVoiceConstants.COMMAND_ZHIDAO_V2X_OPEN_SHEAR_EVENT_UN_WAKEUP) - .unRegisterUnWakeVoice(V2XVoiceConstants.COMMAND_V2X_TO_CLOSE_WINDOW_UN_WAKEUP) - } - } - - fun isPanelShow(): Boolean { - return mClPanelContainer?.visibility == View.VISIBLE - } - - // 修改未处理消息 - fun changeEventCount() { -// val historyMessage = V2XSQLiteUtils.getScenarioHistoryUnDisposeData() -// if (historyMessage != null) { -// mV2XEventPanelHistoryCountView?.changeMsgCount(historyMessage.size) -// } else { -// mV2XEventPanelHistoryCountView?.changeMsgCount(0) -// } - } - - override fun onStatusChanged(descriptor: StatusDescriptor?, isTrue: Boolean) { - if (isTrue) { - // 在vr模式 - mV2XEventPanelHistoryCountView?.visibility = View.GONE - }else{ - mV2XEventPanelHistoryCountView?.visibility = View.VISIBLE - } - } -} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/fragment/V2XScenarioHistoryFragment.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/fragment/V2XScenarioHistoryFragment.kt index 600bc86db8..e69de29bb2 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/fragment/V2XScenarioHistoryFragment.kt +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/fragment/V2XScenarioHistoryFragment.kt @@ -1,167 +0,0 @@ -package com.mogo.eagle.core.function.v2x.events.fragment - -import android.annotation.SuppressLint -import android.content.Context -import android.util.Log -import android.view.View -import androidx.lifecycle.lifecycleScope -import androidx.recyclerview.widget.LinearLayoutManager -import com.mogo.commons.mvp.MvpFragment -import com.mogo.commons.voice.AIAssist -import com.mogo.eagle.core.function.v2x.R.dimen -import com.mogo.eagle.core.function.v2x.R.layout -import com.mogo.eagle.core.function.v2x.events.adapter.V2XScenarioHistoryAdapter -import com.mogo.eagle.core.function.v2x.events.bridge.BridgeApi.v2xStatus -import com.mogo.eagle.core.function.v2x.events.fragment.presenter.ScenarioHistoryPresenter -import com.mogo.eagle.core.function.v2x.events.manager.IMoGoV2XStatusChangedListener -import com.mogo.eagle.core.function.v2x.events.manager.V2XStatusDescriptor -import com.mogo.eagle.core.function.v2x.events.manager.V2XStatusDescriptor.EventPanelWindow_UI -import com.mogo.eagle.core.function.v2x.events.utils.V2XSQLiteUtils -import com.mogo.eagle.core.function.v2x.events.utils.V2XUtils -import com.mogo.eagle.core.function.v2x.events.view.V2XListEmptyView.OnControlListener -import com.mogo.eagle.core.network.utils.GsonUtil -import com.mogo.eagle.core.utilcode.mogo.logger.Logger -import com.mogo.eagle.core.utilcode.util.ThreadUtils -import com.mogo.eagle.core.utilcode.util.Utils -import com.mogo.module.common.entity.V2XHistoryScenarioData -import com.mogo.module.common.view.SpacesItemDecoration -import kotlinx.android.synthetic.main.module_v2x_event_panel_fragment_scenario_history.* -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import java.util.* - -/** - * 出行动态,V2X 提示过的场景历史 - * - * @author donghongyu - */ -class V2XScenarioHistoryFragment : MvpFragment() { - private val TAG = "V2XScenarioHistoryFragment" - var fromVoice = false - private var mV2XScenarioHistoryAdapter: V2XScenarioHistoryAdapter? = null - private val mV2XHistoryScenarioData = ArrayList() - private var mListener: IMoGoV2XStatusChangedListener? = null - - override fun getLayoutId(): Int { - return layout.module_v2x_event_panel_fragment_scenario_history - } - - override fun getTagName(): String { - return TAG - } - - @SuppressLint("LongLogTag") override fun initViews() { - Log.d(TAG, "initViews --------> ") - recyclerView.addItemDecoration(SpacesItemDecoration(resources.getDimension(dimen.share_item_padding).toInt())) - mV2XScenarioHistoryAdapter = V2XScenarioHistoryAdapter(mV2XHistoryScenarioData) - recyclerView.adapter = mV2XScenarioHistoryAdapter - recyclerView.addItemDecoration(SpacesItemDecoration(14)) // 配置列表朝向 - val layoutManager = LinearLayoutManager(activity, LinearLayoutManager.VERTICAL, false) - recyclerView.layoutManager = layoutManager - initListener() - viewEmpty.setTripMessage("暂无交通事件") - viewEmpty.setRefreshVisibility(false) - } - - /** - * 初始化页面用到得监听 - */ - private fun initListener() { - viewEmpty.setOnControlListener(object : OnControlListener { - override fun onShearClick() { - // TODO -// val share = share() -// if (share != null) { -// share.showShareDialog() -// getInstance().hidePanel() -// } - } - - override fun onRefreshClick() {} - }) - mListener = object : IMoGoV2XStatusChangedListener { - override fun onStatusChanged(descriptor: V2XStatusDescriptor, isTrue: Boolean) { - Logger.d(TAG, "$descriptor initViews --------> $isTrue") - if (descriptor == EventPanelWindow_UI) { - mPresenter!!.loadHistory() - } - } - - override fun init(context: Context) { - Logger.d(TAG, "init --------> ") - } - } - val v2xStatus = v2xStatus() - v2xStatus?.registerStatusChangedListener(TAG, EventPanelWindow_UI, mListener) - } - - /** - * 列表加载数据 - * - * @param v2XHistoryScenarioData 最新数据 - */ - fun loadHistory(v2XHistoryScenarioData: List) { - Logger.d(TAG, "查询到历史消息:" + GsonUtil.jsonFromObject(v2XHistoryScenarioData)) - ThreadUtils.runOnUiThread { - mV2XHistoryScenarioData.clear() - if (v2XHistoryScenarioData.size > 0) { - viewEmpty.visibility = View.GONE - clHistoryList.visibility = View.VISIBLE - mV2XHistoryScenarioData.addAll(v2XHistoryScenarioData) - } else { - viewEmpty.visibility = View.VISIBLE - clHistoryList.visibility = View.GONE - } - mV2XScenarioHistoryAdapter?.notifyDataSetChanged() - ttsForHistoryFirstToday() - if (fromVoice) { - ttsForVoiceCheckout() - fromVoice = false - } - } - } - - /* - * 手动点击出行动态 TTS播报 - * */ - private fun ttsForHistoryFirstToday() { - val hasBroadTts = V2XUtils.isFirstTodayWithKey("TTS_FOR_HISTORY_SELECTED") - if (!hasBroadTts) { - if (mV2XHistoryScenarioData.size > 0) { - AIAssist.getInstance(Utils.getApp()).speakTTSVoice("小智为您记录了今天的出行事件", null) - } else { - AIAssist.getInstance(Utils.getApp()).speakTTSVoice("小智在这里为您记录今天的出行事件", null) - } - } - } - - /* - * 语音查询出行动态 TTS播报 - * */ - fun ttsForVoiceCheckout() { - if (mV2XHistoryScenarioData.size > 0) { - AIAssist.getInstance(Utils.getApp()).speakTTSVoice("为您找到以下动态请查看", null) - } else { - AIAssist.getInstance(Utils.getApp()).speakTTSVoice("今天暂无出行动态,试试对我说分享拥堵给其他车友吧", null) - } - } - - override fun onResume() { - super.onResume() - // 清除V2X事件数据库中过期的数据,数据有效期为24小时 - viewLifecycleOwner.lifecycleScope.launch(Dispatchers.IO) { - V2XSQLiteUtils.clearYesterdayScenarioHistoryData() - mPresenter!!.loadHistory() - } - } - - override fun createPresenter(): ScenarioHistoryPresenter { - return ScenarioHistoryPresenter(this) - } - - override fun onDestroyView() { - super.onDestroyView() - val v2xStatus = v2xStatus() - v2xStatus?.unregisterStatusChangedListener(TAG, EventPanelWindow_UI, mListener) - } -} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/fragment/V2XShareEventsFragment.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/fragment/V2XShareEventsFragment.java deleted file mode 100644 index 0a330cc84f..0000000000 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/fragment/V2XShareEventsFragment.java +++ /dev/null @@ -1,267 +0,0 @@ -package com.mogo.eagle.core.function.v2x.events.fragment; - -import android.os.Bundle; -import android.util.Log; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.recyclerview.widget.RecyclerView; - -import com.mogo.commons.mvp.MvpFragment; -import com.mogo.commons.voice.AIAssist; -import com.mogo.eagle.core.function.v2x.R; -import com.mogo.eagle.core.function.v2x.events.adapter.V2XShareEventAdapter; -import com.mogo.eagle.core.function.v2x.events.entity.panel.V2XShareEventDescription; -import com.mogo.eagle.core.function.v2x.events.entity.panel.V2XShareEventItem; -import com.mogo.eagle.core.function.v2x.events.entity.panel.V2XShareEventItemEnum; -import com.mogo.eagle.core.function.v2x.events.entity.panel.V2XShareEventLoadMoreItem; -import com.mogo.eagle.core.function.v2x.events.fragment.presenter.ShareEventsPresenter; -import com.mogo.eagle.core.function.v2x.events.listener.AdapterCallback; -import com.mogo.eagle.core.function.v2x.events.network.V2XRefreshCallback; -import com.mogo.eagle.core.function.v2x.events.network.V2XShareNetworkModel; -import com.mogo.eagle.core.function.v2x.events.utils.V2XUtils; -import com.mogo.eagle.core.utilcode.util.ThreadUtils; -import com.mogo.eagle.core.utilcode.util.Utils; -import com.mogo.module.common.view.LinearLayoutCommonManager; -import com.mogo.module.common.view.SpacesItemDecoration; -import com.mogo.module.common.view.NetworkLoadingView; -import java.util.ArrayList; - -public class V2XShareEventsFragment extends MvpFragment implements AdapterCallback { - - private static final String TAG = "V2XShareEventsFragment"; - private RecyclerView recyclerView; - private V2XShareEventAdapter adapter; - private ArrayList dataArrayList = new ArrayList(); - public Boolean fromVoice = false; - private int pageNum = 1; - private V2XShareNetworkModel v2XShareNetworkModel; - private V2XShareEventDescription resultData; - - //动画 - private NetworkLoadingView loadingView; - - @Override - protected int getLayoutId() { - return R.layout.module_v2x_event_share_recylerview; - } - - @Override - public String getTagName() { - return TAG; - } - - @Override - protected void initViews() { - v2XShareNetworkModel = new V2XShareNetworkModel(getContext()); - initRecyclerView(); - initData(); - } - - @Nullable - @Override - public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - super.onCreateView(inflater, container, savedInstanceState); - return mRootView; - } - - private void initRecyclerView() { - recyclerView = mRootView.findViewById(R.id.road_case_share_list); - recyclerView.addItemDecoration(new SpacesItemDecoration((int) getResources().getDimension(R.dimen.share_item_padding))); - adapter = new V2XShareEventAdapter(getActivity(), dataArrayList, this); - recyclerView.setAdapter(adapter); - LinearLayoutCommonManager linearLayoutManager = - new LinearLayoutCommonManager(getActivity(), LinearLayoutCommonManager.VERTICAL, false); - recyclerView.setLayoutManager(linearLayoutManager); - loadingView = mRootView.findViewById(R.id.network_loading_imageview); - } - - private void initData() { - getShareEventResponse(); - } - - /* - * 获取热心指数,分享列表等分享内容 - * */ - @Override - public void getShareEventResponse() { - pageNum = 1; - ThreadUtils.runOnUiThread(new Runnable() { - @Override - public void run() { - animationAction(View.VISIBLE); - } - }); - - v2XShareNetworkModel.getShareEventResponse(pageNum, 10, new V2XRefreshCallback() { - @Override - public void onSuccess(Object result) { - if (result instanceof V2XShareEventDescription) { - resultData = (V2XShareEventDescription) result; - - if (resultData != null && resultData.getResult() != null - && resultData.getResult().getEnthusiasmIndex() != null) { - if (dataArrayList.size() > 0) { - dataArrayList.clear(); - } - dataArrayList.add(resultData.getResult().getEnthusiasmIndex()); - if (fromVoice == true) { - try { - ttsForVoiceCheckout(); - } catch (Exception e) { - - } - } - } - } else if (result instanceof V2XShareEventItem) { - Log.d("V2XShareEventsFragment","onSuccess--loadSuccessWithShareEventList"); - loadSuccessWithShareEventList(result); - } - } - - @Override - public void onFail(String msg) { - if (dataArrayList.size() > 0) { - dataArrayList.clear(); - Log.d("V2XShareEventsFragment","onFail--clear"); - adapter.notifyDataSetChanged(); - } - loadingView.stopWithError(msg, View.VISIBLE); - - loadingView.refresButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - getShareEventResponse(); - } - }); - } - - - }); - - } - - /* - * 语音打开我的分享,TTS播报 - * */ - public void ttsForVoiceCheckout() { - int shareNum = resultData.getResult().getEnthusiasmIndex().getShareNum(); - int approveNum = resultData.getResult().getEnthusiasmIndex().getLikeNum(); - double enthusiasm = resultData.getResult().getEnthusiasmIndex().getEnthusiasmIndex(); - Log.d(TAG, String.valueOf(enthusiasm) + "TTS播报热心指数个数"); - String ttsString = ""; - if (enthusiasm <= 2) { - ttsString = "您目前已完成" + shareNum + "次分享,获得" + approveNum + "次车友认同,热心指数" + enthusiasm - + "颗星,老铁请再接再厉,对我说,上报路况。分享更多路况帮助其他车友。"; - } else if (2 < enthusiasm && enthusiasm < 5) { - ttsString = "您目前已完成" + shareNum + "次分享,获得" + approveNum + "次车友认同,热心指数" + enthusiasm - + "颗星,老铁您的热心温暖了无数车友,加油距离五颗星不远了。"; - } else { - ttsString = "您目前已完成" + shareNum + "次分享,获得" + approveNum + "次车友认同,热心指数" + enthusiasm - + "颗星,实至名归,老铁你就是大家一直赞扬的热心车友,请继续保持。"; - } - AIAssist.getInstance(Utils.getApp()).speakTTSVoice(ttsString, null); - fromVoice = false; - } - - /* - * 我的分享列表数据处理 - * */ - private void loadSuccessWithShareEventList(Object result) { - - animationAction(View.GONE); - V2XShareEventItem resultData = (V2XShareEventItem) result; - V2XShareEventLoadMoreItem item = new V2XShareEventLoadMoreItem(); - if (resultData != null && resultData.getResult() != null) { - if (resultData.getResult().getPage() != null) { - int total = resultData.getResult().getPage().getTotal(); - if (total == 0) { - //空白 - item.setViewType(V2XShareEventItemEnum.ITEM_TYPE_SHARE_EMPTY); - dataArrayList.add(item); - int len = dataArrayList.size(); - } else { - if (dataArrayList.size() > 0) { - Object data = dataArrayList.get(dataArrayList.size() - 1); - if (data instanceof V2XShareEventLoadMoreItem) { - dataArrayList.remove(dataArrayList.size() - 1); - } - } - if (resultData.getResult().getPage().getContent().size() > 0) { - //当前页有数据 - dataArrayList.addAll(resultData.getResult().getPage().getContent()); - item.setViewType(V2XShareEventItemEnum.ITEM_TYPE_LOAD_MORE_STATUS); - } else { - //当前页没有数据 - item.setViewType(V2XShareEventItemEnum.ITEM_TYPE_NO_MORE); - } - if (total > 10) { - dataArrayList.add(item); - } - } - } - Log.d(TAG, "分享列表:" + dataArrayList.get(0)); - } else { - //空白 - item.setViewType(V2XShareEventItemEnum.ITEM_TYPE_SHARE_EMPTY); - dataArrayList.add(item); - } - - ThreadUtils.runOnUiThread(new Runnable() { - @Override - public void run() { - adapter.notifyDataSetChanged(); - } - }); - - } - - private void animationAction(int visible) { - if (visible == View.VISIBLE) { - if (loadingView != null) { - loadingView.start(); - } - } else { - if (loadingView != null) { - loadingView.stop(); - } - } - } - - @NonNull - @Override - protected ShareEventsPresenter createPresenter() { - Log.d(TAG, "createPresenter"); - ttsForSharedFirstToday(); - return new ShareEventsPresenter(this); - } - - private void ttsForSharedFirstToday() { - boolean hasBroadTts = V2XUtils.isFirstTodayWithKey("TTS_FOR_SHARED_SELECTED"); - Log.d(TAG,"shouldBroadTts"+hasBroadTts); - if (!hasBroadTts) { - AIAssist.getInstance(Utils.getApp()).speakTTSVoice("您可以在这里查看历史的分享记录", null); - } - } - - @Override - public void loadMoreShareEventList() { - Log.d(TAG, "page--" + pageNum); - animationAction(View.VISIBLE); - pageNum += 1; - v2XShareNetworkModel.getShareEventList(pageNum, 10, new V2XRefreshCallback() { - @Override - public void onSuccess(Object result) { - loadSuccessWithShareEventList(result); - } - - @Override - public void onFail(String msg) { - loadingView.stopWithError("网络异常,点击刷新重试", View.INVISIBLE); - } - }); - } -} diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/fragment/V2XSurroundingFragment.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/fragment/V2XSurroundingFragment.java index 231be2e0df..e69de29bb2 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/fragment/V2XSurroundingFragment.java +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/fragment/V2XSurroundingFragment.java @@ -1,491 +0,0 @@ -package com.mogo.eagle.core.function.v2x.events.fragment; - -import android.graphics.Color; -import android.graphics.Rect; -import android.graphics.Typeface; -import android.os.Bundle; -import android.text.SpannableString; -import android.text.Spanned; -import android.text.style.AbsoluteSizeSpan; -import android.text.style.ForegroundColorSpan; -import android.text.style.StyleSpan; -import android.util.Log; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.view.animation.AccelerateInterpolator; -import android.view.animation.LinearInterpolator; -import android.widget.RelativeLayout; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.recyclerview.widget.GridLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - -import com.alibaba.android.arouter.launcher.ARouter; -import com.mogo.commons.debug.DebugConfig; -import com.mogo.commons.mvp.MvpFragment; -import com.mogo.commons.voice.AIAssist; -import com.mogo.eagle.core.data.map.MogoLatLng; -import com.mogo.eagle.core.function.v2x.R; -import com.mogo.eagle.core.function.v2x.events.adapter.V2XSurroundingAdapter; -import com.mogo.eagle.core.function.v2x.events.bridge.BridgeApi; -import com.mogo.eagle.core.function.v2x.events.entity.panel.BackRefreshInfo; -import com.mogo.eagle.core.function.v2x.events.entity.panel.SurroundingConstruction; -import com.mogo.eagle.core.function.v2x.events.fragment.presenter.SurroundingEventPresenter; -import com.mogo.eagle.core.function.v2x.events.listener.SurroundingItemClickListener; -import com.mogo.eagle.core.function.v2x.events.utils.V2XUtils; -import com.mogo.eagle.core.function.v2x.events.widgets.SurroundingEventView; -import com.mogo.eagle.core.function.v2x.events.widgets.SurroundingMarginDecoration; -import com.mogo.eagle.core.utilcode.util.Utils; -import com.mogo.map.marker.IMogoMarker; -import com.mogo.map.marker.IMogoMarkerManager; -import com.mogo.map.marker.anim.OnMarkerAnimationListener; -import com.mogo.map.uicontroller.IMogoMapUIController; -import com.mogo.module.common.entity.MarkerExploreWay; -import com.mogo.module.common.entity.MarkerLocation; -import com.mogo.module.common.entity.MarkerShowEntity; -import com.mogo.module.service.ServiceConst; -import com.mogo.module.common.view.NetworkLoadingView; -import com.mogo.service.IMogoServiceApis; -import com.mogo.eagle.core.data.constants.MogoServicePaths; -import com.mogo.eagle.core.utilcode.mogo.thread.WorkThreadHandler; -import com.mogo.service.module.IMogoMarkerService; -import com.mogo.service.statusmanager.IMogoStatusManager; -import com.mogo.eagle.core.utilcode.mogo.logger.Logger; - -import org.greenrobot.eventbus.EventBus; -import org.greenrobot.eventbus.Subscribe; -import org.greenrobot.eventbus.ThreadMode; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; - -import static android.view.View.OVER_SCROLL_NEVER; - -/** - * 周边事件 - */ -public class V2XSurroundingFragment extends MvpFragment implements SurroundingEventView, - View.OnClickListener, SurroundingItemClickListener { - private static final String TAG = "V2XSurroundingFragment"; - private RelativeLayout mSurroundingLayout; - private RecyclerView mRecyclerView; - private TextView mTotalTv; - private RelativeLayout mTopLayout; - private RelativeLayout mEmptyLayout; - private TextView mTopFreshTv; - private TextView mShareTv; - private TextView mFreshTv; - private V2XSurroundingAdapter mAdapter; - private SurroundingEventPresenter surroundingEventPresenter; - private List poiInfosList = new ArrayList<>(); - private IMogoServiceApis mApis; - private NetworkLoadingView mloadingImage; - public Boolean fromVoice = false; - - @Override - protected int getLayoutId() { - return R.layout.module_event_panel_fragment_surrounding; - } - - @Override - public String getTagName() { - return TAG; - } - - @Nullable - @Override - public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - super.onCreateView(inflater, container, savedInstanceState); - return mRootView; - } - - @Override - protected void initViews() { - mSurroundingLayout = findViewById(R.id.layout_surrounding_event); - mRecyclerView = findViewById(R.id.surrounding_recycleview); - mTotalTv = findViewById(R.id.tv_brief); - mTopLayout = findViewById(R.id.layout_top); - mEmptyLayout = findViewById(R.id.layout_empty_data_show); - mTopFreshTv = findViewById(R.id.tv_top_refresh); - mShareTv = findViewById(R.id.tv_main_share); - mFreshTv = findViewById(R.id.tv_main_refresh); - mloadingImage = mRootView.findViewById(R.id.loading_iv); - mTopFreshTv.setOnClickListener(this); - mShareTv.setOnClickListener(this); - mFreshTv.setOnClickListener(this); - -// mRecyclerView.setHasFixedSize(true); - mRecyclerView.setOverScrollMode(OVER_SCROLL_NEVER); - GridLayoutManager layoutManage = new GridLayoutManager(getContext(), 2); - int spacingInPixels = getContext().getResources().getDimensionPixelSize(R.dimen.module_v2x_surrounding_item_bottom_right_textsize); - int spacingInPixelsLeft = getContext().getResources().getDimensionPixelSize(R.dimen.module_v2x_surrounding_item_maigin_left); - mRecyclerView.addItemDecoration(new SurroundingMarginDecoration(spacingInPixels, spacingInPixelsLeft)); - mRecyclerView.setLayoutManager(layoutManage); - - mAdapter = new V2XSurroundingAdapter(getActivity(), poiInfosList, this); - mRecyclerView.setAdapter(mAdapter); - - initData(); - } - - @NonNull - @Override - protected SurroundingEventPresenter createPresenter() { - surroundingEventPresenter = new SurroundingEventPresenter(getContext(), this); - return surroundingEventPresenter; - } - - @Override - public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - EventBus.getDefault().register(this); - mApis = (IMogoServiceApis) ARouter.getInstance().build(MogoServicePaths.PATH_SERVICE_APIS).navigation(getContext()); - - } - - @Override - public void onClick(View v) { - int id = v.getId(); - if (id == R.id.tv_main_share) { - //弹出框面板消失,出现分享弹框 - V2XEventPanelFragment.Companion.getInstance().hidePanel(); - // TODO -// if (mApis != null && mApis.getShareManager() != null) { -// mApis.getShareManager().showShareDialog(); -// } - } else if (id == R.id.tv_main_refresh || id == R.id.tv_top_refresh) { //刷新 - initData(); - } - } - - /** - * 获取和刷新数据 - */ - private void initData() { - mTopLayout.setVisibility(View.GONE); - mRecyclerView.setVisibility(View.GONE); - mEmptyLayout.setVisibility(View.GONE); - mloadingImage.start(); - surroundingEventPresenter.getSurroundingEventData(); - } - - /** - * 展示列表数据 - */ - @Override - public void showSurroudingData(List exploreWayList) { - mloadingImage.stop(); - if (exploreWayList != null && exploreWayList.size() > 0) { - //展示数据 - mTopLayout.setVisibility(View.VISIBLE); - mRecyclerView.setVisibility(View.VISIBLE); - mEmptyLayout.setVisibility(View.GONE); - - poiInfosList.clear(); - //对数据进行分类 - poiInfosList.addAll(handleMapToList(getPoiTypeMap(exploreWayList))); - mAdapter.notifyDataSetChanged(); - - //总条数 - String originStr = String.format(getContext().getResources().getString(R.string.v2x_surrounding_top_brief), exploreWayList.size()); - SpannableString spannableString = new SpannableString(originStr); - spannableString.setSpan(new ForegroundColorSpan(Color.parseColor("#459DFF")), - 7, originStr.length() - 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - //设置字体大小,true表示前面的字体大小 dip - spannableString.setSpan(new AbsoluteSizeSpan((int) getContext().getResources().getDimension(R.dimen.module_v2x_surrounding_top), true), - 7, originStr.length() - 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - spannableString.setSpan(new StyleSpan(Typeface.BOLD), 7, - originStr.length() - 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - mTotalTv.setText(spannableString); - - ttsForSurroundingFirstToday(exploreWayList.size()); - } else { - mTopLayout.setVisibility(View.GONE); - mRecyclerView.setVisibility(View.GONE); - mEmptyLayout.setVisibility(View.VISIBLE); - } - if (fromVoice == true) { - ttsForVoiceCheckout(); - fromVoice = false; - } - } - - /** - * 手动点击周边事件 TTS播报 - */ - private void ttsForSurroundingFirstToday(int eventCount) { - boolean hasBroadTts = V2XUtils.isFirstTodayWithKey("TTS_FOR_SURROUNDING_SELECTED"); - if (!hasBroadTts) { - if (eventCount > 0) { - AIAssist.getInstance(Utils.getApp()). - speakTTSVoice("发现周边" + eventCount + "条交通信息", null); - } else { - Logger.e(TAG,"周边没有发现交通信息"); - } - } - } - - /* - * 语音查询周边事件 TTS播报 - * */ - public void ttsForVoiceCheckout() { - if (poiInfosList.size() > 0) { - AIAssist.getInstance(Utils.getApp()). - speakTTSVoice("为您找到周边以下事件请查看", null); - } else { - AIAssist.getInstance(Utils.getApp()). - speakTTSVoice("周边5公里内无事件,试试对我说分享路况给其他车友吧", null); - } - } - - - private Map getPoiTypeMap(List list) { - Map mPoiTypeMarkers = new HashMap<>(); - for (int i = 0; i < list.size(); i++) { - MarkerExploreWay exploreWay = list.get(i); - if (!mPoiTypeMarkers.containsKey(exploreWay.getPoiType())) { - mPoiTypeMarkers.put(exploreWay.getPoiType(), new SurroundingConstruction(exploreWay.getPoiType())); - } - SurroundingConstruction construction = mPoiTypeMarkers.get(exploreWay.getPoiType()); - construction.addMarkerExploreWay(exploreWay); - } - - Log.d(TAG, "getPoiTypeMap mPoiTypeMarkers.size() = " + mPoiTypeMarkers.size()); - - return mPoiTypeMarkers; - } - - - private List handleMapToList(Map map) { - Collection valueCollection = map.values(); - List list = new ArrayList<>(valueCollection); - List resultSurroundingList = new ArrayList<>(); - List outSurroundingList = new ArrayList<>(); - - if (list != null && list.size() > 0) { - List prioritySorts = prioritySort(); - for (String poiType : prioritySorts) { - for (SurroundingConstruction construction : list) { - if (!prioritySorts.contains(construction.getPoiType())) { - outSurroundingList.add(construction); - continue; - } else if (poiType.equals(construction.getPoiType())) { - resultSurroundingList.add(construction); - } - } - } - } - - if (outSurroundingList != null && outSurroundingList.size() > 0) { - resultSurroundingList.addAll(outSurroundingList); - } - - Log.d(TAG, "handleMapToList resultSurroundingList.size() = " + resultSurroundingList.size()); - return resultSurroundingList; - } - - public static List prioritySort() { - List poiTypes = new LinkedList<>(); - - // 封路 - poiTypes.add("10003"); - // 结冰 - poiTypes.add("10011"); - // 浓雾 - poiTypes.add("10010"); - // 交通检查 - poiTypes.add("10002"); - // 交通事故 - poiTypes.add("10013"); - // 拥堵 - poiTypes.add("10007"); - // 道路施工 - poiTypes.add("10006"); - // 积水 - poiTypes.add("10008"); - //实时路况 - poiTypes.add("10015"); - - return poiTypes; - } - - @Subscribe(threadMode = ThreadMode.MAIN) - public void onBackRefresh(final BackRefreshInfo event) { - if (event == null) { - return; - } - - initData(); - } - - /** - * 处理marker的显示 - * - * @param v - * @param position - * @param construction - */ - @Override - public void onItemClickListener(View v, int position, SurroundingConstruction construction) { - if (construction != null) { - if (!DebugConfig.isMapBased()) { - EventBus.getDefault().post(construction); - } else { - //卡片消失 - V2XEventPanelFragment.Companion.getInstance().hidePanel(); - //清除道路事件 - - IMogoMarkerManager marker = BridgeApi.INSTANCE.marker(); - if (marker != null) { - marker.removeMarkers(ServiceConst.CARD_TYPE_ROAD_CONDITION); - } - try { - //处理 marker的显示 - List exploreWayList = construction.getConstrutList(); - Logger.d(TAG, "onItemClickListener exploreWayList.size() = " + exploreWayList.size()); - if (exploreWayList != null && exploreWayList.size() > 0) { - for (int i = 0; i < exploreWayList.size(); i++) { - MarkerExploreWay exploreWay = exploreWayList.get(i); - MarkerShowEntity markerShowEntity = new MarkerShowEntity(); - markerShowEntity.setBindObj(exploreWay); - markerShowEntity.setChecked(false); - markerShowEntity.setTextContent(exploreWay.getAddr()); - markerShowEntity.setMarkerLocation(exploreWay.getLocation()); - markerShowEntity.setMarkerType(ServiceConst.CARD_TYPE_ROAD_CONDITION); - - WorkThreadHandler.getInstance().postDelayed(() -> { - IMogoMarkerService markerService = BridgeApi.INSTANCE.markerService(); - if (markerService == null) { - return; - } - IMogoMarker mogoMarker = markerService.drawMarker(markerShowEntity); - // 点击监听,天际弹窗展示详情 - if (mogoMarker != null) { - mogoMarker.startScaleAnimation(0, 1.2f, 0, 1.2f, 300, new AccelerateInterpolator(), new OnMarkerAnimationListener() { - @Override - public void onAnimStart() { - Logger.d(TAG, " onItemClickListener onAnimStart -----> "); - } - - @Override - public void onAnimEnd() { - if (mogoMarker.isDestroyed()) { - return; - } - Logger.d(TAG, " onItemClickListener onAnimEnd ------> "); - mogoMarker.startScaleAnimation(1.2f, 1, 1.2f, 1, 100, new LinearInterpolator(), null); - } - }); - mogoMarker.setOwner(markerShowEntity.getMarkerType()); - mogoMarker.setObject(markerShowEntity); - } - }, i * 100L); - } - - //自适应显示 - showBonndsRoadtion(exploreWayList); - } else { - Logger.e(TAG, "onItemClickListener exploreWayList == null"); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - /** - * 子类信息tts播报 - */ - AIAssist.getInstance(Utils.getApp()). - speakTTSVoice(construction.getTypeNameTTS(construction.getPoiType()), null); - } - } - - /** - * 自适应显示 - * - * @param exploreWayList - */ - private void showBonndsRoadtion(List exploreWayList) { - Logger.d(TAG, "showBonndsRoadtion exploreWayList.size() = " + exploreWayList.size()); - Rect rect = new Rect( - (int) getContext().getResources().getDimension(R.dimen.module_v2x_map_left), - (int) getContext().getResources().getDimension(R.dimen.module_v2x_map_top), - (int) getContext().getResources().getDimension(R.dimen.module_v2x_map_right), - (int) getContext().getResources().getDimension(R.dimen.module_v2x_map_bottom)); - - moveNotFresh(); - //第一个参数:调用者,第二个参数:当前自车的位置,第三个参数:需要显示在范围内的点(不包含自车的位置) - //第四个参数:显示范围的UI边界,第五个参数:是否锁定自车位置(看业务需要) - - IMogoMapUIController mapUiController = BridgeApi.INSTANCE.mapUiController(); - if (mapUiController != null) { - mapUiController.showBounds(ServiceConst.CARD_TYPE_ROAD_CONDITION, null, getMogoList(exploreWayList), rect, false); - } - } - - private void moveNotFresh() { - IMogoStatusManager statusManager = BridgeApi.INSTANCE.statusManager(); - if (statusManager != null) { - statusManager.setUserInteractionStatus(TAG, true, false); - } - } - - /** - * 构造经纬度列表 - * - * @return - */ - private List getMogoList(List markerExploreWayList) { - List list = new ArrayList<>(); - if (markerExploreWayList != null && markerExploreWayList.size() > 0) { - if (markerExploreWayList.size() < 6) { - for (int i = 0; i < markerExploreWayList.size(); i++) { - MarkerLocation location = markerExploreWayList.get(i).getLocation(); - if (location != null) { - MogoLatLng mogoLatLng = new MogoLatLng(location.getLat(), location.getLon()); - list.add(mogoLatLng); - } else { - Logger.e(TAG, "getMogoList() < 6 location == null"); - } - } - } else { - for (int i = 0; i < 6; i++) { - MarkerLocation location = markerExploreWayList.get(i).getLocation(); - if (location != null) { - MogoLatLng mogoLatLng = new MogoLatLng(location.getLat(), location.getLon()); - list.add(mogoLatLng); - } else { - Logger.e(TAG, "getMogoList() location == null"); - } - } - } - } else { - Logger.e(TAG, "getMogoList() markerExploreWay == null"); - } - return list; - } - - - @Override - public void onDestroy() { - super.onDestroy(); - if (poiInfosList != null) { - poiInfosList.clear(); - poiInfosList = null; - } - } - - @Override - public void onDestroyView() { - super.onDestroyView(); - EventBus.getDefault().unregister(this); - } - - -} diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/fragment/presenter/EventPanelPresenter.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/fragment/presenter/EventPanelPresenter.kt deleted file mode 100644 index 108641b5f5..0000000000 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/fragment/presenter/EventPanelPresenter.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.mogo.eagle.core.function.v2x.events.fragment.presenter - -import com.mogo.commons.mvp.Presenter -import com.mogo.eagle.core.function.v2x.events.fragment.V2XEventPanelFragment - -/** - * 事件面板presenter - * - * @author tongchenfei - */ -class EventPanelPresenter(view: V2XEventPanelFragment) : Presenter(view) \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/fragment/presenter/ScenarioHistoryPresenter.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/fragment/presenter/ScenarioHistoryPresenter.java deleted file mode 100644 index ebfba924b0..0000000000 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/fragment/presenter/ScenarioHistoryPresenter.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.mogo.eagle.core.function.v2x.events.fragment.presenter; - - -import com.mogo.commons.mvp.Presenter; -import com.mogo.eagle.core.function.v2x.events.fragment.V2XScenarioHistoryFragment; -import com.mogo.eagle.core.function.v2x.events.utils.V2XSQLiteUtils; -import com.mogo.module.common.entity.V2XHistoryScenarioData; -import com.mogo.eagle.core.utilcode.mogo.thread.WorkThreadHandler; - -import java.util.List; - -/** - * @author donghongyu - */ -public class ScenarioHistoryPresenter extends Presenter { - - public ScenarioHistoryPresenter(V2XScenarioHistoryFragment view) { - super(view); - } - - public void loadHistory() { - WorkThreadHandler.getInstance().post(() -> { - List v2XHistoryScenarioData = V2XSQLiteUtils.getScenarioHistoryData(); - mView.loadHistory(v2XHistoryScenarioData); - }); - } -} diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/fragment/presenter/ShareEventsPresenter.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/fragment/presenter/ShareEventsPresenter.java deleted file mode 100644 index 7d3499ef4f..0000000000 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/fragment/presenter/ShareEventsPresenter.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.mogo.eagle.core.function.v2x.events.fragment.presenter; - -import com.mogo.commons.mvp.IView; -import com.mogo.commons.mvp.Presenter; -import com.mogo.eagle.core.function.v2x.events.fragment.V2XShareEventsFragment; -import com.mogo.eagle.core.utilcode.mogo.thread.WorkThreadHandler; - -public class ShareEventsPresenter extends Presenter { - - public ShareEventsPresenter(IView view) { super((V2XShareEventsFragment) view); } - - public void loadShareEventList() { - WorkThreadHandler.getInstance().post(() -> { - mView.getShareEventResponse(); - }); - } - -} diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/fragment/presenter/SurroundingEventPresenter.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/fragment/presenter/SurroundingEventPresenter.java deleted file mode 100644 index eefcf6c96e..0000000000 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/fragment/presenter/SurroundingEventPresenter.java +++ /dev/null @@ -1,112 +0,0 @@ -package com.mogo.eagle.core.function.v2x.events.fragment.presenter; - -import android.content.Context; - -import androidx.annotation.NonNull; -import androidx.lifecycle.Lifecycle; -import androidx.lifecycle.LifecycleOwner; - -import com.alibaba.android.arouter.launcher.ARouter; -import com.mogo.cloud.passport.MoGoAiCloudClientConfig; -import com.mogo.commons.mvp.Presenter; -import com.mogo.eagle.core.data.map.MogoLocation; -import com.mogo.eagle.core.function.v2x.events.entity.panel.Center; -import com.mogo.eagle.core.function.v2x.events.entity.panel.SurroundingRequest; -import com.mogo.eagle.core.function.v2x.events.entity.panel.SurroundingResponse; -import com.mogo.eagle.core.function.v2x.events.network.V2XApiServiceFactory; -import com.mogo.eagle.core.function.v2x.events.widgets.SurroundingEventView; -import com.mogo.eagle.core.network.RequestOptions; -import com.mogo.eagle.core.network.SubscribeImpl; -import com.mogo.eagle.core.network.utils.GsonUtil; -import com.mogo.service.IMogoServiceApis; -import com.mogo.eagle.core.data.constants.MogoServicePaths; -import com.mogo.service.network.IMogoNetwork; -import com.mogo.eagle.core.utilcode.mogo.logger.Logger; - -import io.reactivex.android.schedulers.AndroidSchedulers; -import io.reactivex.schedulers.Schedulers; -import okhttp3.RequestBody; - -/** - * @author lixiaopeng - * @description - * @since 2020/7/29 - */ -public class SurroundingEventPresenter extends Presenter { - private Context mContext; - private IMogoNetwork mNetWork; - private IMogoServiceApis mApis; - private static final String TAG = "V2XSurroundingFragment"; - - - public SurroundingEventPresenter(Context context, SurroundingEventView view) { - super(view); - mContext = context; - mNetWork = - ((IMogoServiceApis) ARouter.getInstance().build(MogoServicePaths.PATH_SERVICE_APIS).navigation(view.getContext())).getNetworkApi(); - mApis = (IMogoServiceApis) ARouter.getInstance().build(MogoServicePaths.PATH_SERVICE_APIS).navigation(getContext()); - } - - @Override - public void onCreate(@NonNull LifecycleOwner owner) { - super.onCreate(owner); - } - - public void getSurroundingEventData() { - MogoLocation location = mApis.getMapServiceApi().getSingletonLocationClient(mContext).getLastKnowLocation(); - if (location == null) { - return; - } - Center center = new Center(location.getLatitude(), location.getLongitude()); - String[] poiTypes = {"10002", "10003", "10006", "10007", "10008", "10010", "10011", "10013", "10015"}; - SurroundingRequest request = new SurroundingRequest(center, poiTypes, 5, 300); - - V2XApiServiceFactory.getDevaApiService(mContext).getSurroundingEventList(MoGoAiCloudClientConfig.getInstance().getSn(), convert(GsonUtil.jsonFromObject(request))) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new SubscribeImpl(RequestOptions.create(getContext())) { - @Override - public void onError(Throwable e) { - super.onError(e); - mView.showSurroudingData(null); - Logger.e(TAG, "onError e = " + e); - e.printStackTrace(); - } - - @Override - public void onSuccess(SurroundingResponse data) { - super.onSuccess(data); - Logger.d(TAG, "onSuccess ------> "); - if (data != null && data.getResult() != null) { - mView.showSurroudingData(data.getResult().getExploreWay()); - } - } - - @Override - public void onError(String message, int code) { - super.onError(message, code); - mView.showSurroudingData(null); - Logger.e(TAG, "onError message = " + message + " >>> code = " + code); - } - }); - - } - - - public static RequestBody convert(String json) { -// String json = GsonUtil.getGson().toJson( map ); - Logger.d(TAG, "request params: %s", json); - RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json; charset=utf-8"), json); - return requestBody; - } - - @Override - public void onDestroy(@NonNull LifecycleOwner owner) { - super.onDestroy(owner); - } - - @Override - public void onLifecycleChanged(@NonNull LifecycleOwner owner, @NonNull Lifecycle.Event event) { - super.onLifecycleChanged(owner, event); - } -} diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/provider/V2XEventPanelModuleProvider.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/provider/V2XEventPanelModuleProvider.java deleted file mode 100644 index 82f49b7bc0..0000000000 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/provider/V2XEventPanelModuleProvider.java +++ /dev/null @@ -1,113 +0,0 @@ -package com.mogo.eagle.core.function.v2x.events.provider; - -import static com.mogo.eagle.core.function.v2x.events.consts.V2XConst.MODULE_NAME; - -import android.content.Context; -import android.os.Bundle; -import android.view.View; -import androidx.annotation.NonNull; -import androidx.fragment.app.Fragment; -import com.alibaba.android.arouter.facade.annotation.Route; -import com.mogo.eagle.core.function.v2x.events.V2XEventManager; -import com.mogo.eagle.core.function.v2x.events.consts.V2XConst; -import com.mogo.eagle.core.function.v2x.events.fragment.V2XEventPanelFragment; -import com.mogo.map.listener.IMogoMapListener; -import com.mogo.map.location.IMogoLocationListener; -import com.mogo.map.marker.IMogoMarkerClickListener; -import com.mogo.map.navi.IMogoNaviListener; -import com.mogo.service.eventpanel.IEventPanelProvider; -import com.mogo.service.module.IMogoModuleLifecycle; -import com.mogo.service.module.ModuleType; -import com.mogo.eagle.core.utilcode.mogo.logger.Logger; - - -/** - * author : donghongyu - * e-mail : 1358506549@qq.com - * date : 2020-01-2114:03 - * desc : V2X的管理 - * version: 2.0 - */ -@Route(path = V2XConst.PATH_EVENT_PANEL) -public class V2XEventPanelModuleProvider implements - IEventPanelProvider { - private final String TAG = "EventPanelModuleProvider"; - - @Override - public Fragment createFragment(Context context, Bundle data) { - Logger.d(MODULE_NAME, "事件模版 createFragment。。。。"); - return V2XEventPanelFragment.Companion.getInstance(); - } - - @Override - public View createView(Context context) { - return null; - } - - @NonNull - @Override - public String getModuleName() { - return V2XConst.MODULE_NAME_EVENT_PANEL; - } - - @Override - public IMogoModuleLifecycle getCardLifecycle() { - return null; - } - - @Override - public IMogoMapListener getMapListener() { - return null; - } - - @Override - public int getType() { - return ModuleType.TYPE_CARD_FRAGMENT; - } - - @Override - public IMogoNaviListener getNaviListener() { - return null; - } - - @Override - public IMogoLocationListener getLocationListener() { - return null; - } - - @Override - public IMogoMarkerClickListener getMarkerClickListener() { - return null; - } - - @Override - public String getAppPackage() { - return null; - } - - @Override - public String getAppName() { - return null; - } - - @Override - public void init(Context context) { - V2XEventManager.INSTANCE.init(context); - Logger.d(MODULE_NAME, "事件模版 模块初始化。。。。"); - } - - @Override - public void showPanelWithSelectedItem(int item) { - V2XEventPanelFragment.Companion.getInstance().showPanelWithSelectedItem(item); - } - - @Override - public void showPanel() { - V2XEventPanelFragment.Companion.getInstance().showPanel(); - } - - @Override - public void hidePanel() { - V2XEventPanelFragment.Companion.getInstance().hidePanel(); - } -} diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/IV2XScenario.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/IV2XScenario.java index d7908bbf87..9839ac732f 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/IV2XScenario.java +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/IV2XScenario.java @@ -35,12 +35,12 @@ public interface IV2XScenario { /** * 展示按钮 */ - void showButton(); + default void showButton() {} /** * 关闭按钮 */ - void closeButton(); + default void closeButton() {} /** * 绘制POI diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/road/V2XRoadEventButton.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/road/V2XRoadEventButton.java deleted file mode 100644 index 46cf61460c..0000000000 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/road/V2XRoadEventButton.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.mogo.eagle.core.function.v2x.events.scenario.scene.road; - -import android.content.Intent; -import android.view.View; -import android.widget.TextView; - -import com.mogo.eagle.core.function.v2x.events.scenario.view.IV2XButton; -import com.mogo.eagle.core.function.v2x.events.scenario.view.IV2XButtonListener; -import com.mogo.eagle.core.function.v2x.events.voice.V2XVoiceCallbackListener; -import com.mogo.eagle.core.function.v2x.events.voice.V2XVoiceConstants; -import com.mogo.module.v2x.voice.V2XVoiceManager; - -/** - * 道路实况按钮 - */ -public class V2XRoadEventButton implements IV2XButton { - private TextView tv; - private IV2XButtonListener mListener; - private V2XVoiceCallbackListener mVoiceListener = (String command, Intent intent) -> { - if (mListener != null) { - mListener.onAction(); - } - close(); - }; - - @Override - public void setOnActionListener(IV2XButtonListener listener) { - mListener = listener; - } - - @Override - public void show() { - // 注册语音交互 - registerVoice(); - } - - @Override - public void close() { - if (tv != null) { - tv.setVisibility(View.GONE); - // 反注册语音交互 - mListener = null; - } - unRegisterVoice(); - } - - - @Override - public void registerVoice() { - V2XVoiceManager.INSTANCE - .registerWakeCmd(V2XVoiceConstants.COMMAND_ZHIDAO_V2X_COMMON_CONFIRM, mVoiceListener) - .registerUnWakeVoice(V2XVoiceConstants.COMMAND_V2X_TO_CONFIRM_UN_WAKEUP, mVoiceListener); - } - - @Override - public void unRegisterVoice() { - V2XVoiceManager.INSTANCE - .unRegisterWakeCmd(V2XVoiceConstants.COMMAND_ZHIDAO_V2X_COMMON_CONFIRM) - .unRegisterUnWakeVoice(V2XVoiceConstants.COMMAND_V2X_TO_CONFIRM_UN_WAKEUP); - } -} diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/road/V2XRoadEventScenario.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/road/V2XRoadEventScenario.java index c294124b8c..b425350551 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/road/V2XRoadEventScenario.java +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/road/V2XRoadEventScenario.java @@ -1,27 +1,19 @@ package com.mogo.eagle.core.function.v2x.events.scenario.scene.road; -import android.view.View; -import android.view.ViewGroup; - -import com.mogo.eagle.core.function.v2x.R; +import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener; +import com.mogo.eagle.core.function.call.hmi.CallerHmiManager; import com.mogo.eagle.core.function.v2x.events.bridge.BridgeApi; import com.mogo.eagle.core.function.v2x.events.consts.V2XConst; import com.mogo.eagle.core.function.v2x.events.manager.IMoGoV2XStatusManager; import com.mogo.eagle.core.function.v2x.events.manager.V2XStatusManager; import com.mogo.eagle.core.function.v2x.events.scenario.impl.AbsV2XScenario; -import com.mogo.eagle.core.function.v2x.events.scenario.scene.livecar.V2XRoadLiveCarScenario; -import com.mogo.eagle.core.function.v2x.events.scenario.view.IV2XWindow; -import com.mogo.eagle.core.function.v2x.events.utils.ADASUtils; +import com.mogo.eagle.core.function.v2x.events.scenario.view.IV2XMarker; import com.mogo.eagle.core.network.utils.GsonUtil; -import com.mogo.eagle.core.utilcode.util.Utils; import com.mogo.module.common.entity.V2XMessageEntity; import com.mogo.module.common.entity.V2XRoadEventEntity; import com.mogo.service.analytics.IMogoAnalytics; import com.mogo.service.statusmanager.IMogoStatusManager; -import com.mogo.service.windowview.IMogoTopViewManager; -import com.mogo.service.windowview.IMogoTopViewStatusListener; import com.mogo.eagle.core.utilcode.mogo.logger.Logger; - import java.util.HashMap; import java.util.Map; @@ -32,13 +24,11 @@ import java.util.Map; * desc : 道路预警场景 * version: 1.0 */ -public class V2XRoadEventScenario extends AbsV2XScenario implements IMogoTopViewStatusListener { +public class V2XRoadEventScenario extends AbsV2XScenario implements IMoGoWarningStatusListener { private static final String TAG = "V2XRoadEventScenario"; public V2XRoadEventScenario() { - setV2XButton(new V2XRoadEventButton()); setV2XMarker(new V2XRoadEventMarker()); - setV2XWindow(new V2XRoadEventWindow()); } @Override @@ -72,29 +62,17 @@ public class V2XRoadEventScenario extends AbsV2XScenario imp try { if (getV2XMessageEntity() != null && getV2XMessageEntity().getContent() != null) { //只展示不播报 不广播 - boolean onlyShow = getV2XMessageEntity().isOnlyShow(); - - if (onlyShow == false) { + if (!onlyShow) { // 设置TTS getV2XMessageEntity().getContent().getTts(false); - // 广播给ADASzzz - ADASUtils.broadcastToADAS( - BridgeApi.INSTANCE.context(), - getV2XMessageEntity().getContent()); } - - IMogoStatusManager statusManager = BridgeApi.INSTANCE.statusManager(); - boolean isMainPageOnResume = false; - if (statusManager != null && statusManager.isMainPageOnResume()) { isMainPageOnResume = true; showWindow(); } - - IMogoAnalytics analytics = BridgeApi.INSTANCE.analytics(); if (analytics != null) { // 地图主动推送/触发消息 埋点 @@ -119,46 +97,11 @@ public class V2XRoadEventScenario extends AbsV2XScenario imp @Override public void showWindow() { - if (getV2XWindow() != null) { - // 关闭直播弹窗 - try { - IV2XWindow v2XWindow = V2XRoadLiveCarScenario.getInstance().getV2XWindow(); - if (v2XWindow != null) { - - IMogoTopViewManager topViewManager = BridgeApi.INSTANCE.topViewManager(); - if (topViewManager != null) { - topViewManager.removeSubView(v2XWindow.getView()); - } - } - } catch (Exception e) { - e.printStackTrace(); - } - // 关闭之前的事件弹窗 - boolean isShowEventWindow = false; - IMoGoV2XStatusManager statusManager = BridgeApi.INSTANCE.v2xStatus(); - if (statusManager != null) { - isShowEventWindow = statusManager.isRoadEventWindowShow(); - } - if (isShowEventWindow) { - ((V2XRoadEventWindow) getV2XWindow()).updateTopWindowInfo(getV2XMessageEntity().getContent()); - } else { - ViewGroup.LayoutParams layoutParams = - new ViewGroup.LayoutParams( - ViewGroup.LayoutParams.MATCH_PARENT, - (int) Utils.getApp().getResources().getDimension(R.dimen.module_v2x_event_window_height)); - IMogoTopViewManager topViewManager = BridgeApi.INSTANCE.topViewManager(); - - if (topViewManager != null) { - topViewManager.addView(getV2XWindow().getView(), layoutParams, this); - } - getV2XWindow().show(getV2XMessageEntity().getContent()); - } - if (statusManager != null) { - statusManager.setRoadEventWindowShow(TAG, true); - } + V2XMessageEntity entity = getV2XMessageEntity(); + V2XRoadEventEntity content = entity != null ? entity.getContent() : null; + if (content != null) { + CallerHmiManager.INSTANCE.showWarningV2X(entity.getType(), content.getAlarmContent(), content.getTts(), TAG, null, !entity.isOnlyShow(), 5000L); } - - } @Override @@ -184,70 +127,45 @@ public class V2XRoadEventScenario extends AbsV2XScenario imp } } - @Override - public void closeButton() { - if (getV2XButton() != null) { - getV2XButton().close(); - } - IMoGoV2XStatusManager statusManager = BridgeApi.INSTANCE.v2xStatus(); - if (statusManager != null) { - statusManager.setRoadEventButtonShow(TAG, false); - } - } - @Override public void drawPOI() { - if (getV2XMarker() != null) { + IV2XMarker marker = getV2XMarker(); + if (marker != null) { // 重置告警信息 V2XStatusManager.getInstance().setAlarmInfo(getV2XMessageEntity().getContent()); - getV2XMarker().drawPOI(getV2XMessageEntity().getContent()); + marker.drawPOI(getV2XMessageEntity().getContent()); } } @Override public void clearPOI() { - if (getV2XMarker() != null) { - getV2XMarker().clearPOI(); + IV2XMarker marker = getV2XMarker(); + if (marker != null) { + marker.clearPOI(); } } @Override - public void onViewAdded(View view) { - //Logger.d(MODULE_NAME, "展示 Window 动画结束"); - - IMogoStatusManager statusManager = BridgeApi.INSTANCE.statusManager(); - boolean isMainPageOnResume = false; - if (statusManager != null) { - isMainPageOnResume = statusManager.isMainPageOnResume(); + public void onShow() { + Logger.d(V2XConst.MODULE_NAME, "弹窗展示"); + IMoGoV2XStatusManager status = BridgeApi.INSTANCE.v2xStatus(); + if (status != null) { + status.setRoadEventWindowShow(TAG, true); } - if (isMainPageOnResume) { - if (getV2XMessageEntity() != null && getV2XMessageEntity().isNeedAddLine() == true) { - drawPOI(); - } + V2XMessageEntity entity = getV2XMessageEntity(); + if (entity != null && entity.isNeedAddLine()) { + drawPOI(); } } @Override - public void onViewRemoved(View view) { - Logger.d(V2XConst.MODULE_NAME, "关闭 Window 动画结束"); - release(); - } - - @Override - public void beforeViewAddAnim(View view) { - //Logger.d(MODULE_NAME, "展示 Window 开始"); - } - - @Override - public void beforeViewRemoveAnim(View view) { - //Logger.d(MODULE_NAME, "关闭 Window 开始"); + public void onDismiss() { + Logger.d(V2XConst.MODULE_NAME, "弹窗消失"); IMoGoV2XStatusManager status = BridgeApi.INSTANCE.v2xStatus(); if (status != null) { status.setRoadEventWindowShow(TAG, false); } - // 重置场景提示的消息 - setV2XMessageEntity(null); clearPOI(); - closeButton(); + release(); } } diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/road/V2XRoadEventWindow.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/road/V2XRoadEventWindow.java deleted file mode 100644 index 6c1ce19762..0000000000 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/road/V2XRoadEventWindow.java +++ /dev/null @@ -1,312 +0,0 @@ -package com.mogo.eagle.core.function.v2x.events.scenario.scene.road; - -import android.content.Context; -import android.os.Handler; -import android.util.AttributeSet; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.ImageView; - -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.PagerSnapHelper; -import androidx.recyclerview.widget.RecyclerView; - -import com.mogo.eagle.core.function.v2x.R; -import com.mogo.eagle.core.function.v2x.events.adapter.V2XRoadEventAdapter; -import com.mogo.eagle.core.function.v2x.events.bridge.BridgeApi; -import com.mogo.eagle.core.function.v2x.events.entity.net.V2XLiveCarRes; -import com.mogo.eagle.core.function.v2x.events.listener.V2XWindowStatusListener; -import com.mogo.eagle.core.function.v2x.events.network.V2XRefreshCallback; -import com.mogo.eagle.core.function.v2x.events.network.V2XRefreshModel; -import com.mogo.eagle.core.function.v2x.events.scenario.scene.V2XBasWindow; -import com.mogo.eagle.core.function.v2x.events.scenario.view.IV2XWindow; -import com.mogo.eagle.core.function.v2x.events.voice.V2XVoiceCallbackListener; -import com.mogo.eagle.core.function.v2x.events.voice.V2XVoiceConstants; -import com.mogo.eagle.core.function.v2x.events.voice.V2XVoicePagingListener; -import com.mogo.module.common.entity.V2XEventShowEntity; -import com.mogo.module.common.entity.V2XMessageEntity; -import com.mogo.module.common.entity.V2XRoadEventEntity; -import com.mogo.module.common.enums.EventTypeEnum; -import com.mogo.module.v2x.voice.V2XVoiceManager; -import com.mogo.service.windowview.IMogoTopViewManager; - -import java.util.ArrayList; -import java.util.List; - - -/** - * author : donghongyu - * e-mail : 1358506549@qq.com - * date : 2020/4/14 2:37 PM - * desc : 显示事件的列表 - * version: 1.0 - */ -public class V2XRoadEventWindow extends V2XBasWindow - implements V2XRefreshCallback, IV2XWindow { - private String TAG = "V2XRoadEventDetailWindow"; - // 关闭按钮 - private ImageView mBtnCloseWindow; - // 展示列表 - private RecyclerView mRecyclerView; - // 列表数据适配器 - private V2XRoadEventAdapter mV2XRoadEventAdapter; - // 列表展示 - private final List mItemList = new ArrayList<>(); - // 当前展示的位置 - private int mCurPosition; - // 处理道路事件,30秒倒计时 - private final Handler handlerV2XEvent = new Handler(); - private Runnable runnableV2XEvent; - private int mExpireTime = 20000; - // 关闭弹窗回调 - private V2XVoiceCallbackListener v2XVoiceCallbackCloseWindowListener = (command, intent) -> close(); - // 翻页回调监听 - private V2XVoicePagingListener v2XVoicePagingCallbackListener = new V2XVoicePagingListener() { - - @Override - public void onNextCallback() { - if (mRecyclerView != null && mCurPosition >= 0 && mCurPosition < mV2XRoadEventAdapter.getItemCount() - 1) { - mRecyclerView.scrollToPosition(mCurPosition + 1); - } - } - - @Override - public void onPrevCallback() { - if (mRecyclerView != null && mCurPosition > 0 && mCurPosition <= mV2XRoadEventAdapter.getItemCount() - 1) { - mRecyclerView.scrollToPosition(mCurPosition - 1); - } - } - }; - - public V2XRoadEventWindow() { - this(BridgeApi.INSTANCE.context(), null); - } - - public V2XRoadEventWindow(Context context) { - this(context, null); - } - - public V2XRoadEventWindow(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public V2XRoadEventWindow(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - initView(context); - } - - /** - * 初始化视图 - */ - private void initView(Context context) { - //Logger.d(MODULE_NAME, "V2X===初始化道路事件小窗口View。。。。。"); - // 填充布局 - LayoutInflater.from(context).inflate(BridgeApi.INSTANCE.statusManager() != null && BridgeApi.INSTANCE.statusManager().isVrMode() ? - R.layout.window_road_event_detail_vr : R.layout.window_road_event_detail, this); - // 详情列表 - mBtnCloseWindow = findViewById(R.id.btnCloseWindow); - // 详情列表 - mRecyclerView = findViewById(R.id.rvRoadEventList); - - mBtnCloseWindow.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - close(); - } - }); - - mV2XRoadEventAdapter = new V2XRoadEventAdapter(mItemList, this); - mRecyclerView.setAdapter(mV2XRoadEventAdapter); - // 设置切换样式 - new PagerSnapHelper().attachToRecyclerView(mRecyclerView); - // 配置列表朝向 - LinearLayoutManager layoutManager = new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false); - mRecyclerView.setLayoutManager(layoutManager); - mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { - @Override - public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) { - super.onScrollStateChanged(recyclerView, newState); - if (recyclerView.getChildCount() > 0) { - if (newState == RecyclerView.SCROLL_STATE_IDLE) { - //获得当前显示在第一个item的位置 - mCurPosition = layoutManager.findFirstCompletelyVisibleItemPosition(); - // 用户处于交互的时候延后隐藏时间 - startCountDown(); - } - } - } - }); - } - - /** - * 展示道路事件详情Windows - */ - @Override - public void show(V2XRoadEventEntity entity) { - //Logger.d(MODULE_NAME, "V2X===道路事件详情:展示 Window:" + entity); - // 注册语音交互 - V2XVoiceManager.INSTANCE - .registerWakeCmd(V2XVoiceConstants.COMMAND_ZHIDAO_V2X_CLOSE_WINDOW, v2XVoiceCallbackCloseWindowListener) - .registerUnWakeVoice(V2XVoiceConstants.COMMAND_V2X_TO_CLOSE_WINDOW_UN_WAKEUP, v2XVoiceCallbackCloseWindowListener) - .registerPagingCallback(v2XVoicePagingCallbackListener); - // 更新头部的窗体视图 - updateTopWindowInfo(entity); - - // 倒计时 - mExpireTime = entity.getExpireTime(); - startCountDown(); - } - - /** - * 更新头部的窗体视图 - */ - public void updateTopWindowInfo(V2XRoadEventEntity v2XRoadEventEntity) { - //Logger.d(MODULE_NAME, "V2X===道路事件详情:更新 Window:" + v2XRoadEventEntity); - - // 清空数据 - mItemList.clear(); - if (v2XRoadEventEntity != null) { - // 道路事件行驶到了50米附近,弹出事件纠错框给用户 - //Logger.d(MODULE_NAME, "V2X===道路事件:" + v2XRoadEventEntity); - - // 进行类型分发 - if (EventTypeEnum.TRAFFIC_CHECK.getPoiType().equals(v2XRoadEventEntity.getPoiType()) - || EventTypeEnum.ROAD_CLOSED.getPoiType().equals(v2XRoadEventEntity.getPoiType()) - || EventTypeEnum.FOURS_ROAD_WORK.getPoiType().equals(v2XRoadEventEntity.getPoiType()) - || EventTypeEnum.FOURS_BLOCK_UP.getPoiType().equals(v2XRoadEventEntity.getPoiType()) - || EventTypeEnum.FOURS_PONDING.getPoiType().equals(v2XRoadEventEntity.getPoiType()) - || EventTypeEnum.FOURS_FOG.getPoiType().equals(v2XRoadEventEntity.getPoiType()) - || EventTypeEnum.FOURS_ICE.getPoiType().equals(v2XRoadEventEntity.getPoiType()) - || EventTypeEnum.FOURS_ACCIDENT.getPoiType().equals(v2XRoadEventEntity.getPoiType()) - || EventTypeEnum.FOURS_ACCIDENT_01.getPoiType().equals(v2XRoadEventEntity.getPoiType()) - || EventTypeEnum.FOURS_ACCIDENT_02.getPoiType().equals(v2XRoadEventEntity.getPoiType()) - || EventTypeEnum.FOURS_ACCIDENT_03.getPoiType().equals(v2XRoadEventEntity.getPoiType()) - || EventTypeEnum.FOURS_ACCIDENT_04.getPoiType().equals(v2XRoadEventEntity.getPoiType()) - || EventTypeEnum.FOURS_ACCIDENT_05.getPoiType().equals(v2XRoadEventEntity.getPoiType()) - || EventTypeEnum.FOURS_LIVING.getPoiType().equals(v2XRoadEventEntity.getPoiType()) - || EventTypeEnum.FOURS_NEALY.getPoiType().equals(v2XRoadEventEntity.getPoiType())) { - // 展示道路事件本身详情 - if (mItemList.isEmpty()) { - V2XEventShowEntity v2XEventShowEntity = new V2XEventShowEntity(); - v2XEventShowEntity.setViewType(V2XMessageEntity.V2XTypeEnum.ALERT_ROAD_WARNING); - v2XEventShowEntity.setV2XRoadEventEntity(v2XRoadEventEntity); - mItemList.add(v2XEventShowEntity); - } - // 获取道路事件周边的直播车机 - V2XRefreshModel v2XRefreshModel = BridgeApi.INSTANCE.refreshModel(); - if (v2XRefreshModel != null) { - v2XRefreshModel - .queryNearbyVehicleLiveByLocation( - this, - v2XRoadEventEntity.getLocation().getLon(), - v2XRoadEventEntity.getLocation().getLat()); - } - } - } - // 刷新列表 - mV2XRoadEventAdapter.notifyDataSetChanged(); - } - - @Override - public void onSuccess(V2XLiveCarRes result) { - //Logger.d(MODULE_NAME, "V2X===事件周边的直播车机:" + result); - try { - if (!mItemList.isEmpty() && - result != null && - result.getResult() != null && - result.getResult().getInfo() != null && - result.getResult().getInfo().size() > 0) { - mItemList.get(0).setV2XLiveCarList(result.getResult().getInfo()); - } - // 刷新列表 - mV2XRoadEventAdapter.notifyDataSetChanged(); - } catch (Exception e) { - e.printStackTrace(); - } - } - - @Override - public void onFail(String msg) { - - } - - - /** - * 关闭详情展示框 - */ - @Override - public void close() { - //Logger.d(MODULE_NAME, "V2X===关闭 Window"); - // 注册语音交互 - V2XVoiceManager.INSTANCE.unRegisterPagingCallback(); - V2XVoiceManager.INSTANCE - .unRegisterWakeCmd(V2XVoiceConstants.COMMAND_ZHIDAO_V2X_CLOSE_WINDOW) - .unRegisterUnWakeVoice(V2XVoiceConstants.COMMAND_V2X_TO_CLOSE_WINDOW_UN_WAKEUP) - .unRegisterWakeCmd(V2XVoiceConstants.COMMAND_ZHIDAO_V2X_CALL_CHATTING) - .unRegisterWakeCmd(V2XVoiceConstants.COMMAND_ZHIDAO_V2X_ZAN) - .unRegisterWakeCmd(V2XVoiceConstants.COMMAND_ZHIDAO_V2X_REPORT) - .unRegisterWakeCmd(V2XVoiceConstants.COMMAND_ZHIDAO_V2X_LIVE_ROAD) - .unRegisterUnWakeVoice(V2XVoiceConstants.COMMAND_ZHIDAO_V2X_OPEN_LIVE_UN_WAKEUP) - .unRegisterUnWakeVoice(V2XVoiceConstants.COMMAND_V2X_TO_CHAT_MORE_UN_WAKEUP) - .unRegisterUnWakeVoice(V2XVoiceConstants.COMMAND_V2X_TO_ZAN_UN_WAKEUP) - .unRegisterUnWakeVoice(V2XVoiceConstants.COMMAND_V2X_TO_FEEDBACK_TRUE) - .unRegisterUnWakeVoice(V2XVoiceConstants.COMMAND_V2X_TO_FEEDBACK_ERROR); - - // 停止倒计时 - if (handlerV2XEvent != null && runnableV2XEvent != null) { - handlerV2XEvent.removeCallbacks(runnableV2XEvent); - runnableV2XEvent = null; - } - - //移除窗体 - - IMogoTopViewManager topViewManager = BridgeApi.INSTANCE.topViewManager(); - if (topViewManager != null) { - topViewManager.removeView(this); - } - } - - @Override - public View getView() { - return this; - } - - @Override - public void setWindowStatusListener(V2XWindowStatusListener listener) { - } - - /** - * 窗体倒计时 - */ - public void startCountDown() { - // 倒计时 - if (runnableV2XEvent == null) { - runnableV2XEvent = () -> { - //Logger.d(MODULE_NAME, "V2X=== Window 30秒倒计时结束。。。"); - // 移出Window详细信息 - close(); - }; - } else { - handlerV2XEvent.removeCallbacks(runnableV2XEvent); - } - //Logger.d(MODULE_NAME, "V2X=== Window 展示开始倒计时:" + mExpireTime); - handlerV2XEvent.postDelayed(runnableV2XEvent, mExpireTime); - } - - /** - * 停止倒计时 - */ - public void stopCountDown() { - // 停止倒计时 - if (handlerV2XEvent != null && runnableV2XEvent != null) { - handlerV2XEvent.removeCallbacks(runnableV2XEvent); - runnableV2XEvent = null; - } - } - - @Override - protected void release() { - super.release(); - } -} diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/utils/V2XSQLiteUtils.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/utils/V2XSQLiteUtils.java index 84d960e84c..608b70cad3 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/utils/V2XSQLiteUtils.java +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/utils/V2XSQLiteUtils.java @@ -1,7 +1,6 @@ package com.mogo.eagle.core.function.v2x.events.utils; import com.mogo.eagle.core.function.v2x.events.consts.V2XConst; -import com.mogo.eagle.core.function.v2x.events.fragment.V2XEventPanelFragment; import com.mogo.eagle.core.network.utils.GsonUtil; import com.mogo.eagle.core.utilcode.mogo.logger.Logger; import com.mogo.eagle.core.utilcode.mogo.sqlite.SQLIDao; @@ -95,7 +94,7 @@ public class V2XSQLiteUtils { try { int result = getScenarioHistoryDao().update(oldScenarioData, newScenarioData); Logger.d(V2XConst.MODULE_NAME, "修改数据成功:" + result); - V2XEventPanelFragment.Companion.getInstance().changeEventCount(); + //V2XEventPanelFragment.Companion.getInstance().changeEventCount(); } catch (Exception e) { e.printStackTrace(); } @@ -171,7 +170,7 @@ public class V2XSQLiteUtils { // 存储新数据 V2XSQLiteUtils.getScenarioHistoryDao().insert(v2XHistoryScenarioData); } - V2XEventPanelFragment.Companion.getInstance().changeEventCount(); + //V2XEventPanelFragment.Companion.getInstance().changeEventCount(); } catch (Exception e) { e.printStackTrace(); } diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/redlightwarning/RedLightWarningManager.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/redlightwarning/RedLightWarningManager.kt index a45002369f..2a0363a2e1 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/redlightwarning/RedLightWarningManager.kt +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/redlightwarning/RedLightWarningManager.kt @@ -168,13 +168,7 @@ class RedLightWarningManager : IMoGoTrafficLightListener, IMoGoVipSetListener, private fun redLightWarning() { Logger.d(TAG, "=====闯红灯预警=====") ThreadUtils.runOnUiThread { - CallerHmiManager.showWarningV2X( - EventTypeEnum.TYPE_USECASE_ID_IVP.poiType.toInt(), - EventTypeEnum.TYPE_USECASE_ID_IVP.content, - EventTypeEnum.TYPE_USECASE_ID_IVP.tts, - EventTypeEnum.TYPE_USECASE_ID_IVP.poiType, - null - ) + CallerHmiManager.showWarningV2X(EventTypeEnum.TYPE_USECASE_ID_IVP.poiType.toInt(), EventTypeEnum.TYPE_USECASE_ID_IVP.content, EventTypeEnum.TYPE_USECASE_ID_IVP.tts, EventTypeEnum.TYPE_USECASE_ID_IVP.poiType, null, true, 5000L) } } @@ -192,11 +186,7 @@ class RedLightWarningManager : IMoGoTrafficLightListener, IMoGoVipSetListener, EventTypeEnum.getWarningTts(EventTypeEnum.TYPE_USECASE_ID_IVP_GREEN.poiType), speed ) - CallerHmiManager.showWarningV2X( - EventTypeEnum.TYPE_USECASE_ID_IVP_GREEN.poiType.toInt(), - content, tts, - EventTypeEnum.TYPE_USECASE_ID_IVP_GREEN.poiType, null - ) + CallerHmiManager.showWarningV2X(EventTypeEnum.TYPE_USECASE_ID_IVP_GREEN.poiType.toInt(), content, tts, EventTypeEnum.TYPE_USECASE_ID_IVP_GREEN.poiType, null, true, 5000L) } } diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/vip/VipCarManager.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/vip/VipCarManager.kt index b9da0ec8f5..f7b8a35100 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/vip/VipCarManager.kt +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/vip/VipCarManager.kt @@ -129,20 +129,16 @@ class VipCarManager : IMogoOnMessageListener, IMoGoTrafficLightListe //如果上次结果和本次灯态结果变化比较大,则已变灯,控制HMI展示弹窗 if (abs(currentResult!!.remain - it.remain) > 5 && currentResult.isGreen()) { Logger.d(TAG, "调用showWarningV2X to show") - CallerHmiManager.showWarningV2X(EventTypeEnum.TYPE_VIP_IDENTIFICATION.poiType.toInt(), - EventTypeEnum.TYPE_VIP_IDENTIFICATION.content, - EventTypeEnum.TYPE_VIP_IDENTIFICATION.tts, - EventTypeEnum.TYPE_VIP_IDENTIFICATION.poiType, - object : IMoGoWarningStatusListener { - override fun onShow() {} - override fun onDismiss() { - Logger.d( - TAG, - "showWarningV2X vip dismiss , resetConditions" - ) - resetConditions() - } - }) + CallerHmiManager.showWarningV2X(EventTypeEnum.TYPE_VIP_IDENTIFICATION.poiType.toInt(), EventTypeEnum.TYPE_VIP_IDENTIFICATION.content, EventTypeEnum.TYPE_VIP_IDENTIFICATION.tts, EventTypeEnum.TYPE_VIP_IDENTIFICATION.poiType, object : IMoGoWarningStatusListener { + override fun onShow() {} + override fun onDismiss() { + Logger.d( + TAG, + "showWarningV2X vip dismiss , resetConditions" + ) + resetConditions() + } + }, true, 5000L) } } diff --git a/core/function-impl/mogo-core-function-v2x/src/main/res/layout/window_road_event_detail.xml b/core/function-impl/mogo-core-function-v2x/src/main/res/layout/window_road_event_detail.xml deleted file mode 100644 index 30bf5d605f..0000000000 --- a/core/function-impl/mogo-core-function-v2x/src/main/res/layout/window_road_event_detail.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - diff --git a/core/function-impl/mogo-core-function-v2x/src/main/res/layout/window_road_event_detail_vr.xml b/core/function-impl/mogo-core-function-v2x/src/main/res/layout/window_road_event_detail_vr.xml deleted file mode 100644 index 8c54bdc86a..0000000000 --- a/core/function-impl/mogo-core-function-v2x/src/main/res/layout/window_road_event_detail_vr.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/constants/MogoServicePaths.java b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/constants/MogoServicePaths.java index 2c98a9b97e..551ff92cfa 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/constants/MogoServicePaths.java +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/constants/MogoServicePaths.java @@ -159,13 +159,6 @@ public class MogoServicePaths { @Deprecated public static final String PATH_MARKER_SERVICE = "/mogomarker/api"; - /** - * 事件面板 - */ - @Keep - @Deprecated - public static final String PATH_EVENT_PANEL = "/event/panel"; - /** * 位置上报 */ 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 456000653a..3add7493e8 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 @@ -52,13 +52,7 @@ interface IMoGoWaringProvider { * @param ttsContent tts语音播报消息 * @param tag tag绑定弹窗的标志 */ - fun showWarningV2X( - v2xType: Int, - alertContent: String?, - ttsContent: String?, - tag: String?, - listenerIMoGo: IMoGoWarningStatusListener? - ) + fun showWarningV2X(v2xType: Int, alertContent: String?, ttsContent: String?, tag: String?, listenerIMoGo: IMoGoWarningStatusListener?, playTts: Boolean, expireTime: Long) /** * 关闭指定floatTag 的 VR下V2X预警弹窗 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 69d3b953f0..693e7d32ed 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 @@ -74,14 +74,8 @@ object CallerHmiManager : CallerBase() { * @param ttsContent tts语音播报消息 * @param tag tag绑定弹窗的标志 */ - fun showWarningV2X( - v2xType: Int, - alertContent: String?, - ttsContent: String?, - tag: String?, - listenerIMoGo: IMoGoWarningStatusListener? - ) { - waringProviderApi.showWarningV2X(v2xType, alertContent, ttsContent, tag, listenerIMoGo) + fun showWarningV2X(v2xType: Int, alertContent: String?, ttsContent: String?, tag: String?, listenerIMoGo: IMoGoWarningStatusListener?, playTts: Boolean, expireTime: Long = 5000L) { + waringProviderApi.showWarningV2X(v2xType, alertContent, ttsContent, tag, listenerIMoGo, playTts, expireTime) } /** diff --git a/core/mogo-core-utils/build.gradle b/core/mogo-core-utils/build.gradle index 83220850dd..2f46513cd6 100644 --- a/core/mogo-core-utils/build.gradle +++ b/core/mogo-core-utils/build.gradle @@ -38,6 +38,11 @@ android { targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + + kapt.includeCompileClasspath = false @@ -65,6 +70,9 @@ dependencies { api rootProject.ext.dependencies.life_cycle_scope api rootProject.ext.dependencies.view_model_scope api rootProject.ext.dependencies.live_data_scope + api rootProject.ext.dependencies.androidxlifecycleprocess + api rootProject.ext.dependencies.androidxccorektx + api rootProject.ext.dependencies.life_cycle_java8 } apply from: new File(rootProject.rootDir, "gradle/upload.gradle").toString() diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/reminder/Reminder.kt b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/reminder/Reminder.kt new file mode 100644 index 0000000000..575c837831 --- /dev/null +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/reminder/Reminder.kt @@ -0,0 +1,331 @@ +package com.mogo.eagle.core.utilcode.reminder + +import android.os.Handler +import android.os.Looper +import android.os.Message +import androidx.lifecycle.* +import androidx.lifecycle.Lifecycle.Event +import androidx.lifecycle.Lifecycle.Event.ON_CREATE +import androidx.lifecycle.Lifecycle.Event.ON_DESTROY +import com.mogo.eagle.core.utilcode.reminder.api.IReminder +import com.mogo.eagle.core.utilcode.reminder.api.impl.ActivityReminder +import kotlinx.coroutines.* +import kotlinx.coroutines.android.asCoroutineDispatcher +import java.lang.IllegalStateException +import java.util.* +import java.util.concurrent.ConcurrentHashMap +import java.util.concurrent.CopyOnWriteArrayList +import java.util.concurrent.CopyOnWriteArraySet + +object Reminder { + + private val heap by lazy { + PriorityQueue() + } + + private val queue by lazy { + LinkedList() + } + + private val listeners by lazy { + CopyOnWriteArrayList() + } + + private val reminderListeners by lazy { + ConcurrentHashMap() + } + + private val enqueued by lazy { + CopyOnWriteArraySet() + } + + private val showed by lazy { + ConcurrentHashMap() + } + + private val attaches by lazy { + ConcurrentHashMap>() + } + + private val scope by lazy { + CoroutineScope(Handler(Looper.getMainLooper()).asCoroutineDispatcher("reminder-scope") + SupervisorJob()) + } + + private const val MSG_WHAT_FOR_OVERRIDE_MAX_PROTECT_DURATION = 0x1010 + private const val MSG_WHAT_FOR_UN_OVERRIDE_MAX_PROTECT_DURATION = 0x1011 + + private val handler by lazy { Handler(Looper.getMainLooper()) { + if (it.what == MSG_WHAT_FOR_OVERRIDE_MAX_PROTECT_DURATION) { + val reminder = it.obj as? IReminder + if (reminder != null) { + markUnShowed(reminder.key()) + if (reminder.isOverride()) { + queue.remove(reminder) + reminderListeners.remove(reminder) + enqueued -= reminder.key() + dequeue() + } + } + } + + if (it.what == MSG_WHAT_FOR_UN_OVERRIDE_MAX_PROTECT_DURATION) { + val reminder = it.obj as? IReminder + if (reminder != null) { + markUnShowed(reminder.key()) + if (!reminder.isOverride()) { + heap.remove(reminder) + enqueued -= reminder.key() + reminderListeners.remove(reminder) + dequeueHeap() + } + } + } + + return@Handler true + } } + + private val attachToObserver = LifecycleEventObserver { source, event -> + if (event == ON_DESTROY) { + recycle(source) + } + } + + fun enqueue(attachTo: LifecycleOwner, reminder: IReminder) { + enqueue(attachTo, reminder, null) + } + + fun enqueue(attachTo: LifecycleOwner, reminder: IReminder, listener: IReminder.IStateChangeListener?) { + val key = reminder.key() + if (key.isEmpty()) { + throw IllegalStateException("reminder: ${reminder.javaClass.name}'s key can't be empty.") + } + if (enqueued.contains(key)) { + return + } + enqueued += key + attaches.getOrPut(attachTo, { + mutableListOf() + }).also { + it.add(reminder) + } + listener?.let { + reminderListeners[reminder] = it + } + scope.launch { + if (reminder is ActivityReminder) { + attachTo.lifecycleScope.launchWhenCreated { + tryDequeue(reminder) + } + } else { + attachTo.lifecycleScope.launchWhenResumed { + tryDequeue(reminder) + } + } + attachTo.lifecycle.addObserver(attachToObserver) + } + } + + private fun tryDequeue(reminder: IReminder) { + if (!reminder.isOverride()) { + heap += reminder + dequeueHeap() + } else { + queue += reminder + val pre = findPreShowedReminder() + if (pre != null) { + pre.hide() + } else { + dequeue() + } + } + } + + private fun recycle(attachTo: LifecycleOwner) { + val reminders = attaches.remove(attachTo) ?: return + try { + reminders.forEach { + if (it.isShowing()) { + it.hide() + } + enqueued.remove(it.key()) + showed.remove(it.key()) + if (it.isOverride()) { + queue.remove(it) + } else { + heap.remove(it) + } + } + } catch (t: Throwable) { + t.printStackTrace() + } + } + + private fun dequeueHeap() { + if (heap.isEmpty()) return + val head = heap.peek() ?: return + val key = head.key() + if (isMarkShowed(key) || head.isShowing()) { + return + } + if (head.doShowOnTurn()) { + head.show() + markShowed(key, false) + doProtectAction(head) + head.lifecycleOwner().lifecycle.addObserver(object : LifecycleEventObserver { + override fun onStateChanged(source: LifecycleOwner, event: Event) { + if (event == ON_CREATE) { + removeProtectAction(false) + notifyGlobalStateChanged(head, true) + reminderListeners[head]?.onShow(head) + } + if (event == ON_DESTROY) { + notifyGlobalStateChanged(head, false) + reminderListeners[head]?.onHide(head) + reminderListeners.remove(head) + enqueued -= key + heap.poll() + markUnShowed(key) + this@Reminder.dequeueHeap() + } + } + }) + } else { + heap.poll() + dequeueHeap() + } + } + + private fun markShowed(key: String, isOverride: Boolean) { + var state = showed[key] + if (state == null) { + state = State(key, isOverride = isOverride, isShowing = true) + showed[key] = state + } + } + + private fun isMarkShowed(key: String): Boolean = showed[key]?.isShowing ?: false + + private fun markUnShowed(key: String) = showed.remove(key) + + private fun dequeue() { + while (!queue.isEmpty()) { + val head = queue.peek() + if (head != null) { + val key = head.key() + if (isMarkShowed(key)) { + break + } + if (head.doShowOnTurn()) { + head.show() + markShowed(key, true) + doProtectAction(head) + head.lifecycleOwner().lifecycle.addObserver(object : LifecycleEventObserver { + override fun onStateChanged(source: LifecycleOwner, event: Event) { + if (event == ON_CREATE) { + removeProtectAction(true) + notifyGlobalStateChanged(head, true) + reminderListeners[head]?.onShow(head) + } + if (event == ON_DESTROY) { + notifyGlobalStateChanged(head, false) + reminderListeners[head]?.onHide(head) + reminderListeners.remove(head) + queue -= head + enqueued -= head.key() + markUnShowed(key) + dequeue() + } + } + }) + break + } else { + queue.poll() + } + } else { + queue.poll() + } + } + } + + private fun doProtectAction(reminder: IReminder) { + val isOverride = reminder.isOverride() + val duration = reminder.maxProtectDuration() + if (duration > 0) { + if (isOverride) { + handler.removeMessages(MSG_WHAT_FOR_OVERRIDE_MAX_PROTECT_DURATION) + handler.sendMessageDelayed(Message.obtain(handler, MSG_WHAT_FOR_OVERRIDE_MAX_PROTECT_DURATION, reminder), duration) + } else { + handler.removeMessages(MSG_WHAT_FOR_UN_OVERRIDE_MAX_PROTECT_DURATION) + handler.sendMessageDelayed(Message.obtain(handler, MSG_WHAT_FOR_UN_OVERRIDE_MAX_PROTECT_DURATION, reminder), duration) + } + } + } + + private fun removeProtectAction(isOverride: Boolean) { + if (isOverride) { + handler.removeMessages(MSG_WHAT_FOR_OVERRIDE_MAX_PROTECT_DURATION) + } else { + handler.removeMessages(MSG_WHAT_FOR_UN_OVERRIDE_MAX_PROTECT_DURATION) + } + } + + private fun findPreShowedReminder(): IReminder? { + val key = showed.values.find { it.isOverride && it.isShowing }?.key ?: return null + return queue.find { it.key() == key } + } + + fun registerGlobalStateChangeListener(listener: IReminder.IGlobalStateChangeListener) { + if (listeners.contains(listener)) { + return + } + listeners += listener + } + + fun unRegisterGlobalStateChangeListener(listener: IReminder.IGlobalStateChangeListener) { + if (!listeners.contains(listener)) { + return + } + listeners -= listener + } + + private fun notifyGlobalStateChanged(reminder: IReminder, isShow: Boolean) { + listeners.forEach { + if (isShow) { + it.onShow(reminder) + } else { + it.onHide(reminder) + } + } + } + + fun hasShowedReminder(attachTo: LifecycleOwner): Boolean { + val reminders = attaches[attachTo] + if (reminders == null || reminders.isEmpty()) { + return false + } + return reminders.find { it.isShowing() } != null + } + + fun dismissAll(attachTo: LifecycleOwner) { + val reminders = attaches[attachTo] + if (reminders == null || reminders.isEmpty()) { + return + } + try { + reminders.forEach { + if (it.isOverride()) { + queue.remove(it) + } else { + heap.remove(it) + } + if (it.isShowing()) { + it.hide() + } + } + } catch (t: Throwable) { + t.printStackTrace() + } + } + + internal data class State(val key: String, val isOverride: Boolean = false, var isShowing: Boolean = false) +} 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 new file mode 100644 index 0000000000..cd021da78c --- /dev/null +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/reminder/api/IReminder.kt @@ -0,0 +1,257 @@ +package com.mogo.eagle.core.utilcode.reminder.api + +import android.app.Activity +import android.app.Application +import android.os.Bundle +import android.view.View +import android.widget.ListPopupWindow +import android.widget.PopupWindow +import androidx.annotation.IntRange +import androidx.core.view.doOnAttach +import androidx.core.view.doOnDetach +import androidx.lifecycle.* +import com.mogo.eagle.core.utilcode.util.R +import com.mogo.eagle.core.utilcode.util.Utils +import java.util.concurrent.ConcurrentHashMap +import java.util.concurrent.TimeUnit + +interface IReminder : Comparable { + + fun key(): String = this.javaClass.name + this.hashCode().toString() + + /** + * 返回此[IReminder]生命周期感知的LifecycleOwner,如: + * - [androidx.fragment.app.FragmentActivity] + * - [androidx.fragment.app.Fragment] + * - [androidx.fragment.app.DialogFragment] + * - [android.view.View] + * - [PopupWindow] + * - [ListPopupWindow] + * - 其它具有生命周期感知的类 + */ + fun lifecycleOwner(): LifecycleOwner + + /** + * 当前[IReminder]的显示优先级,只针对不可覆盖的[IReminder]([IReminder.isOverride]返回false)生效; + * 注:此返回值越大,优先级越高 + */ + @IntRange(from = 0) + fun priority(): Int = 0 + + /** + * 子类实现此方法时,要执行真正的展示逻辑 + */ + fun show() + + /** + * 子类实现此方法时,要调用真实的显示控件消失方法 + */ + fun hide() + + /** + * 子类实现此方法时,要返回真实显示控件的显示状态 + */ + fun isShowing(): Boolean + + + /** + * 是否是可覆盖的: + * 说明: + * 1.可覆盖的[IReminder]和不覆盖的[IReminder]可以同时展示, 上层业务可以根据[IReminder]的显示位置和具体业务决定是返回true/false + * 2.可覆盖的[IReminder]之前是互斥显示的 + * 当中只有一个可覆盖的[IReminder] 展示, 后一个会将当前替换显示。 + * 3.不可覆盖的[IReminder]之间,按优先级([IReminder.priority]返回值大小)排队展示 + */ + fun isOverride() = false + + /** + * 轮到此[IReminder]展示的时候是否展示 + */ + fun doShowOnTurn() = true + + /** + * 调用[IReminder.show]方法后,如果在此时间内没有真正展示,会将此[IReminder]从队列中移除,执行dequeue操作 + */ + fun maxProtectDuration(): Long = TimeUnit.SECONDS.toMillis(2) + + + override fun compareTo(other: IReminder): Int { + return other.priority() - this.priority() + } + + interface IStateChangeListener { + + fun onShow(reminder: IReminder) + + fun onHide(reminder: IReminder) + } + + interface IGlobalStateChangeListener : IStateChangeListener + + + // ------------------------ 以下是扩展函数,只能在IReminder类中使用 -------------------------------------------------- + companion object { + + private val popupWindowLifecycleMap by lazy { + ConcurrentHashMap() + } + + private val listPopupWindowLifecycleMap by lazy { + ConcurrentHashMap() + } + + private val activityNameLifeCycleMap by lazy { + ConcurrentHashMap() + } + } + + val T.lifecycleOwner: LifecycleOwner + get() = getTag(R.id.view_lifecycle_owner) as? LifecycleOwner ?: object : LifecycleOwner, LifecycleEventObserver { + + private val lifecycle = LifecycleRegistry(this) + + init { + 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)) { + 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 { + + private val lifecycle = LifecycleRegistry(this) + + private var register = false + + override fun getLifecycle(): Lifecycle { + val contentView = this@lifecycleOwner.contentView + ?: throw IllegalStateException("Please ensure ${this@lifecycleOwner.javaClass.simpleName}'s getContentView() can't return null.") + if (!register) { + contentView.lifecycleOwner.lifecycle.addObserver(this) + register = true + } + return lifecycle + } + + override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) { + val state = event.targetState + lifecycle.currentState = state + if (state == Lifecycle.State.DESTROYED) { + popupWindowLifecycleMap.remove(this@lifecycleOwner) + } + } + }.also { + popupWindowLifecycleMap[this] = it + } + + + val T.lifecycleOwner: LifecycleOwner + + get() = listPopupWindowLifecycleMap[this] ?: object : LifecycleOwner, LifecycleEventObserver { + + private val lifecycle = LifecycleRegistry(this) + private var register = false + + override fun getLifecycle(): Lifecycle { + val contentView = listView ?: throw IllegalStateException("Please ensure ${this@lifecycleOwner.javaClass.simpleName}'s getListView[() can't return null.") + if (!register) { + contentView.lifecycleOwner.lifecycle.addObserver(this) + register = true + } + return lifecycle + } + + override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) { + val state = event.targetState + lifecycle.currentState = state + if (state == Lifecycle.State.DESTROYED) { + listPopupWindowLifecycleMap.remove(this@lifecycleOwner) + } + + } + }.also { + listPopupWindowLifecycleMap[this] = it + } + + + fun createLifeCycleOwnerByActivityName(activityClassName: String): LifecycleOwner { + + return activityNameLifeCycleMap[activityClassName] ?: object : LifecycleOwner, Application.ActivityLifecycleCallbacks { + + private val lifecycle = LifecycleRegistry(this) + + override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) { + if (activity.javaClass.name == activityClassName) { + lifecycle.currentState = Lifecycle.State.CREATED + } + } + + override fun onActivityStarted(activity: Activity) { + if (activity.javaClass.name == activityClassName) { + lifecycle.currentState = Lifecycle.State.STARTED + } + } + + override fun onActivityResumed(activity: Activity) { + if (activity.javaClass.name == activityClassName) { + lifecycle.currentState = Lifecycle.State.RESUMED + } + } + + override fun onActivityPaused(activity: Activity) {} + + override fun onActivityStopped(activity: Activity) {} + + override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {} + + override fun onActivityDestroyed(activity: Activity) { + if (activity.javaClass.name == activityClassName) { + lifecycle.currentState = Lifecycle.State.DESTROYED + activityNameLifeCycleMap.remove(activityClassName) + Utils.getApp().unregisterActivityLifecycleCallbacks(this) + } + } + + private var register = false + + override fun getLifecycle(): Lifecycle { + if (!register) { + Utils.getApp().registerActivityLifecycleCallbacks(this) + register = true + } + return lifecycle + } + }.also { + activityNameLifeCycleMap[activityClassName] = it + } + } +} + diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/reminder/api/impl/ActivityReminder.kt b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/reminder/api/impl/ActivityReminder.kt new file mode 100644 index 0000000000..abf36f6dd0 --- /dev/null +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/reminder/api/impl/ActivityReminder.kt @@ -0,0 +1,13 @@ +package com.mogo.eagle.core.utilcode.reminder.api.impl + +import androidx.lifecycle.LifecycleOwner +import com.mogo.eagle.core.utilcode.reminder.api.IReminder +import com.mogo.eagle.core.utilcode.util.AppStateManager + +abstract class ActivityReminder(private val activityClassName: String): IReminder { + + override fun lifecycleOwner(): LifecycleOwner = createLifeCycleOwnerByActivityName(activityClassName) + + + override fun isShowing() = if (AppStateManager.isActive()) AppStateManager.currentActivity()?.javaClass?.name == activityClassName else false +} \ No newline at end of file diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/reminder/api/impl/FragmentReminder.kt b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/reminder/api/impl/FragmentReminder.kt new file mode 100644 index 0000000000..37e320afff --- /dev/null +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/reminder/api/impl/FragmentReminder.kt @@ -0,0 +1,38 @@ +package com.mogo.eagle.core.utilcode.reminder.api.impl + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.lifecycle.LifecycleOwner +import com.mogo.eagle.core.utilcode.reminder.api.IReminder + +class FragmentReminder(private val fm: FragmentManager? = null, private val fragment: Fragment): IReminder { + + override fun lifecycleOwner(): LifecycleOwner = fragment + + override fun show() { + fm?.let { + val bt = it.beginTransaction() + bt.add(fragment, "").commitAllowingStateLoss() + try { + it.executePendingTransactions() + } catch (t: Throwable) { + t.printStackTrace() + } + } + } + + override fun hide() { + fm?.let { + val bt = it.beginTransaction() + bt.remove(fragment) + bt.commitAllowingStateLoss() + try { + it.executePendingTransactions() + } catch (t: Throwable) { + t.printStackTrace() + } + } + } + + override fun isShowing(): Boolean = fragment.isVisible +} \ No newline at end of file diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/reminder/api/impl/ListPopupWindowReminder.kt b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/reminder/api/impl/ListPopupWindowReminder.kt new file mode 100644 index 0000000000..10e7672fff --- /dev/null +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/reminder/api/impl/ListPopupWindowReminder.kt @@ -0,0 +1,16 @@ +package com.mogo.eagle.core.utilcode.reminder.api.impl + +import android.widget.ListPopupWindow +import androidx.lifecycle.LifecycleOwner +import com.mogo.eagle.core.utilcode.reminder.api.IReminder + +abstract class ListPopupWindowReminder(private val pop: ListPopupWindow): IReminder { + + override fun lifecycleOwner(): LifecycleOwner = pop.lifecycleOwner + + override fun hide() { + pop.dismiss() + } + + override fun isShowing(): Boolean = pop.isShowing +} \ No newline at end of file diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/reminder/api/impl/PopupWindowReminder.kt b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/reminder/api/impl/PopupWindowReminder.kt new file mode 100644 index 0000000000..fe0e586a0e --- /dev/null +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/reminder/api/impl/PopupWindowReminder.kt @@ -0,0 +1,16 @@ +package com.mogo.eagle.core.utilcode.reminder.api.impl + +import android.widget.PopupWindow +import androidx.lifecycle.LifecycleOwner +import com.mogo.eagle.core.utilcode.reminder.api.IReminder + +abstract class PopupWindowReminder(private val popupWindow: PopupWindow): IReminder { + + override fun lifecycleOwner(): LifecycleOwner = popupWindow.lifecycleOwner + + override fun hide() { + popupWindow.dismiss() + } + + override fun isShowing(): Boolean = popupWindow.isShowing +} \ No newline at end of file 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 new file mode 100644 index 0000000000..d84fe98ee9 --- /dev/null +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/reminder/api/impl/ViewReminder.kt @@ -0,0 +1,13 @@ +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.reminder.api.IReminder + +abstract class ViewReminder(private val content: View): IReminder { + + override fun lifecycleOwner(): LifecycleOwner = content.lifecycleOwner + + override fun isShowing() = ViewCompat.isAttachedToWindow(content) && content.visibility == View.VISIBLE +} \ No newline at end of file diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/ActivityLifecycleManager.java b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/ActivityLifecycleManager.java deleted file mode 100644 index 9f6f750aba..0000000000 --- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/ActivityLifecycleManager.java +++ /dev/null @@ -1,354 +0,0 @@ -package com.mogo.eagle.core.utilcode.util; - -import android.annotation.TargetApi; -import android.app.Activity; -import android.app.Application; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.os.Build; -import android.os.Bundle; - -import java.util.ArrayList; -import java.util.HashMap; - -public class ActivityLifecycleManager { - private Application mApplication; - /** - * 当前出于 Start 状态的 Activity - */ - private ArrayList mStartedActivities = new ArrayList<>(); - - private ArrayList mAppStateListeners = new ArrayList<>(); - - /** - * 当前存活的 Activity - */ - private HashMap mAliveActivities = new HashMap<>(); - - /** - * App 是否出于前台 - */ - private volatile boolean mIsAppActive = false; - - private Activity mCurrentResumedActivity; - - /** - * Home 键事件广播的接受器 - */ - private HomeKeyEventReceiver mHomeKeyEventReceiver; - /** - * Home 键事件监听者列表 - */ - private ArrayList mHomeKeyEventListeners = new ArrayList<>(); - - private DefActivityLifecycleCallbacks mInnerActivityListener = new DefActivityLifecycleCallbacks() { - @Override - public void onActivityStarted(Activity activity) { - if (mStartedActivities.isEmpty()) { - mIsAppActive = true; - notifyAppStateChanged(AppStateListener.ACTIVE); - } - mStartedActivities.add(activity); - - ActivityTrace trace = mAliveActivities.get(activity); - if (trace != null) { - trace.startCnt++; - } - } - - @Override - public void onActivityStopped(Activity activity) { - mStartedActivities.remove(activity); - if (mStartedActivities.isEmpty()) { - mIsAppActive = false; - notifyAppStateChanged(AppStateListener.INACTIVE); - } - - ActivityTrace trace = mAliveActivities.get(activity); - if (trace != null) { - trace.stopCnt++; - } - } - - @Override - public void onActivityResumed(Activity activity) { - mCurrentResumedActivity = activity; - ActivityTrace trace = mAliveActivities.get(activity); - if (trace != null) { - trace.resumeCnt++; - } - } - - @Override - public void onActivityPaused(Activity activity) { - ActivityTrace trace = mAliveActivities.get(activity); - if (trace != null) { - trace.pauseCnt++; - } - } - - @Override - public void onActivityCreated(Activity activity, Bundle savedInstanceState) { - mAliveActivities.put(activity, new ActivityTrace(activity)); - } - - @Override - public void onActivityDestroyed(Activity activity) { - mAliveActivities.remove(activity); - } - }; - - private ActivityLifecycleManager() { - } - - public static ActivityLifecycleManager getInstance() { - return SingletonHolder.INSTANCE; - } - - private static class SingletonHolder { - private static final ActivityLifecycleManager INSTANCE = new ActivityLifecycleManager(); - } - - public void start(Application application) { - this.mApplication = application; - registerInnerActivityListener(); - registerHomeKeyEventReceiver(); - } - - public void stop() { - unregisterActivityLifecycleCallbacks(mInnerActivityListener); - unregisterHomeKeyEventReceiver(); - } - - /** - * 注册 Activity 生命周期的回调 - * - * @param callbacks Activity 生命周期的回调 - */ - public void registerActivityLifecycleCallbacks(Application.ActivityLifecycleCallbacks callbacks) { - if (mApplication == null) { - return; - } - - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) { - return; - } - - mApplication.registerActivityLifecycleCallbacks(callbacks); - } - - /** - * 取消注册 Activity 生命周期的回调 - * - * @param callbacks Activity 生命周期的回调 - */ - public void unregisterActivityLifecycleCallbacks(Application.ActivityLifecycleCallbacks callbacks) { - if (mApplication == null) { - return; - } - - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) { - return; - } - - mApplication.unregisterActivityLifecycleCallbacks(callbacks); - } - - /** - * 应用是否出于前台 - */ - public boolean isAppActive() { - return mIsAppActive; - } - - public void setAppActive(boolean appActive) { - mIsAppActive = appActive; - } - - public Activity getCurrentActivity() { - return mCurrentResumedActivity; - } - - /** - * 添加应用状态的监听 - */ - public void addAppStateListener(AppStateListener listener) { - synchronized (mAppStateListeners) { - mAppStateListeners.add(listener); - } - } - - /** - * 移除应用状态的监听 - * - * @param listener - */ - public void removeAppStateListener(AppStateListener listener) { - synchronized (mAppStateListeners) { - mAppStateListeners.remove(listener); - } - } - - /** - * 添加 home 键的事件监听 - */ - public void addHomeKeyEventListener(HomeKeyEventListener listener) { - if (listener == null) { - return; - } - synchronized (mHomeKeyEventListeners) { - mHomeKeyEventListeners.add(listener); - } - } - - /** - * 移除 home 键的事件监听 - */ - public void removeHomeKeyEventListener(HomeKeyEventListener listener) { - if (listener == null) { - return; - } - - synchronized (mHomeKeyEventListeners) { - mHomeKeyEventListeners.remove(listener); - } - } - - /** - * 注册Activity生命周期的监听 - */ - private void registerInnerActivityListener() { - registerActivityLifecycleCallbacks(mInnerActivityListener); - } - - private void notifyAppStateChanged(int state) { - Object[] listeners = collectAppStateListeners(); - if (listeners != null) { - for (int i = 0; i < listeners.length; i++) { - ((AppStateListener) listeners[i]).onStateChanged(state); - } - } - } - - private Object[] collectAppStateListeners() { - Object[] listeners = null; - synchronized (mAppStateListeners) { - if (mAppStateListeners.size() > 0) { - listeners = mAppStateListeners.toArray(); - } - } - return listeners; - } - - private Object[] collectHomeKeyEventListeners() { - Object[] listeners = null; - synchronized (mHomeKeyEventListeners) { - if (mHomeKeyEventListeners.size() > 0) { - listeners = mHomeKeyEventListeners.toArray(); - } - } - return listeners; - } - - private void registerHomeKeyEventReceiver() { - android.content.IntentFilter filter = new android.content.IntentFilter(); - filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); - - mHomeKeyEventReceiver = new HomeKeyEventReceiver(); - mApplication.registerReceiver(mHomeKeyEventReceiver, filter); - } - - private void unregisterHomeKeyEventReceiver() { - mApplication.unregisterReceiver(mHomeKeyEventReceiver); - } - - private void onHomeKeyPressed() { - Object[] listeners = collectHomeKeyEventListeners(); - if (listeners != null) { - for (int i = 0; i < listeners.length; i++) { - ((HomeKeyEventListener) listeners[i]).onHomeKeyPressed(); - } - } - } - - @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) - public static abstract class DefActivityLifecycleCallbacks implements Application.ActivityLifecycleCallbacks { - @Override - public void onActivityCreated(Activity activity, Bundle savedInstanceState) { - } - - @Override - public void onActivityStarted(Activity activity) { - } - - @Override - public void onActivityResumed(Activity activity) { - } - - @Override - public void onActivityPaused(Activity activity) { - } - - @Override - public void onActivityStopped(Activity activity) { - } - - @Override - public void onActivitySaveInstanceState(Activity activity, Bundle outState) { - } - - @Override - public void onActivityDestroyed(Activity activity) { - } - } - - public interface AppStateListener { - int INACTIVE = 0; - int ACTIVE = 1; - - /** - * App 状态的回调 - */ - void onStateChanged(int state); - - } - - /** - * home 键的监听 - */ - public interface HomeKeyEventListener { - void onHomeKeyPressed(); - } - - /** - * Activity 的生命周期调用痕迹 - */ - static class ActivityTrace { - Activity activity; - int resumeCnt; - int pauseCnt; - int startCnt; - int stopCnt; - - ActivityTrace(Activity activity) { - this.activity = activity; - } - } - - private final class HomeKeyEventReceiver extends BroadcastReceiver { - private final String SYSTEM_DIALOG_REASON_KEY = "reason"; - private final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey"; - - @Override - public void onReceive(Context context, Intent intent) { - String action = intent.getAction(); - if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)) { - String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY); - if (reason != null && reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) { - onHomeKeyPressed(); - } - } - } - } -} diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/AppStateManager.kt b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/AppStateManager.kt new file mode 100644 index 0000000000..920afc1223 --- /dev/null +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/AppStateManager.kt @@ -0,0 +1,99 @@ +package com.mogo.eagle.core.utilcode.util + +import android.app.Activity +import android.app.Application +import android.app.Application.ActivityLifecycleCallbacks +import android.os.Bundle +import androidx.lifecycle.Lifecycle.Event +import androidx.lifecycle.LifecycleEventObserver +import androidx.lifecycle.LifecycleOwner +import androidx.lifecycle.ProcessLifecycleOwner +import java.lang.ref.WeakReference +import java.util.concurrent.CopyOnWriteArrayList +import java.util.concurrent.atomic.AtomicBoolean +import java.util.concurrent.atomic.AtomicReference + + +interface IAppStateListener { + + fun onAppStateChanged(isForeground: Boolean) +} + +object AppStateManager { + + + private val currentActivityHolder by lazy { + AtomicReference>() + } + + private val appStateListeners by lazy { + CopyOnWriteArrayList() + } + + + private val isActive by lazy { AtomicBoolean(false) } + + private val activityLifeCycleCallback = object : ActivityLifecycleCallbacks { + + override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {} + + override fun onActivityStarted(activity: Activity) {} + + override fun onActivityResumed(activity: Activity) { + currentActivityHolder.set(WeakReference(activity)) + } + + override fun onActivityPaused(activity: Activity) { + currentActivityHolder.set(null) + } + + override fun onActivityStopped(activity: Activity) {} + + override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {} + + override fun onActivityDestroyed(activity: Activity) {} + } + + fun init(app: Application) { + app.registerActivityLifecycleCallbacks(activityLifeCycleCallback) + ProcessLifecycleOwner.get().lifecycle.addObserver(object : LifecycleEventObserver { + override fun onStateChanged(source: LifecycleOwner, event: Event) { + if (event == Event.ON_START) { + isActive.set(true) + notifyAppStateChanged(true) + } + + if (event == Event.ON_STOP) { + isActive.set(false) + notifyAppStateChanged(false) + } + } + }) + } + + + fun isActive(): Boolean = isActive.get() + + fun currentActivity() = currentActivityHolder.get()?.get() + + fun registerAppStateListener(listener: IAppStateListener) { + if (appStateListeners.contains(listener)) { + return + } + appStateListeners += listener + } + + fun unRegisterAppStateListener(listener: IAppStateListener) { + if (!appStateListeners.contains(listener)) { + return + } + appStateListeners -= listener + } + + private fun notifyAppStateChanged(isForeground: Boolean) { + appStateListeners.forEach { + it.onAppStateChanged(isForeground) + } + } + +} \ No newline at end of file diff --git a/core/mogo-core-utils/src/main/res/values/ids.xml b/core/mogo-core-utils/src/main/res/values/ids.xml index 7f82523441..09d8b4a229 100644 --- a/core/mogo-core-utils/src/main/res/values/ids.xml +++ b/core/mogo-core-utils/src/main/res/values/ids.xml @@ -1,4 +1,5 @@ + \ No newline at end of file diff --git a/foudations/mogo-commons/build.gradle b/foudations/mogo-commons/build.gradle index a1575c2673..537229cf0f 100644 --- a/foudations/mogo-commons/build.gradle +++ b/foudations/mogo-commons/build.gradle @@ -43,7 +43,6 @@ dependencies { implementation rootProject.ext.dependencies.rxjava api rootProject.ext.dependencies.mogoaicloudrealtime implementation rootProject.ext.dependencies.amapnavi3dmap - implementation rootProject.ext.dependencies.androidxlifecycleprocess if (Boolean.valueOf(USE_MAVEN_PACKAGE)) { implementation rootProject.ext.dependencies.mogo_core_utils diff --git a/foudations/mogo-commons/src/main/java/com/mogo/commons/AbsMogoApplication.java b/foudations/mogo-commons/src/main/java/com/mogo/commons/AbsMogoApplication.java index cb14cde5d3..e4155e84be 100644 --- a/foudations/mogo-commons/src/main/java/com/mogo/commons/AbsMogoApplication.java +++ b/foudations/mogo-commons/src/main/java/com/mogo/commons/AbsMogoApplication.java @@ -23,6 +23,7 @@ import com.mogo.commons.network.NetConfigUtils; import com.mogo.eagle.core.utilcode.mogo.logger.Logger; import com.mogo.eagle.core.utilcode.mogo.toast.TipDrawable; import com.mogo.eagle.core.utilcode.mogo.toast.TipToast; +import com.mogo.eagle.core.utilcode.util.AppStateManager; import com.mogo.eagle.core.utilcode.util.AppUtils; import com.mogo.eagle.core.utilcode.util.CleanUtils; import com.mogo.eagle.core.utilcode.util.ThreadPoolService; @@ -49,6 +50,7 @@ public abstract class AbsMogoApplication extends Application { @Override public void onCreate() { super.onCreate(); + AppStateManager.INSTANCE.init(this); sApp = this; FinalizeCrashFixer.fix(); initARouter(); diff --git a/foudations/mogo-commons/src/main/java/com/mogo/commons/crash/FinalizeCrashFixer.java b/foudations/mogo-commons/src/main/java/com/mogo/commons/crash/FinalizeCrashFixer.java index fcab378397..fcb3300bf1 100644 --- a/foudations/mogo-commons/src/main/java/com/mogo/commons/crash/FinalizeCrashFixer.java +++ b/foudations/mogo-commons/src/main/java/com/mogo/commons/crash/FinalizeCrashFixer.java @@ -1,6 +1,8 @@ package com.mogo.commons.crash; import com.mogo.eagle.core.utilcode.mogo.logger.Logger; +import com.mogo.eagle.core.utilcode.util.AppStateManager; +import com.mogo.eagle.core.utilcode.util.IAppStateListener; import androidx.lifecycle.Lifecycle; import androidx.lifecycle.LifecycleEventObserver; @@ -35,19 +37,19 @@ public class FinalizeCrashFixer { * 只有线程在运行状态才会关闭线程 */ public static void fix() { - ProcessLifecycleOwner.get().getLifecycle().addObserver((LifecycleEventObserver) (source, event) -> { - if (event == Lifecycle.Event.ON_START) { - //前后台则重新反射关闭一遍,避免线程被再次开启 - Logger.d("FinalizeCrashFixer", "--- 切换到前台 ---"); - realFix(); + AppStateManager.INSTANCE.registerAppStateListener(new IAppStateListener() { + @Override + public void onAppStateChanged(boolean isForeground) { + if (isForeground) { + //前后台则重新反射关闭一遍,避免线程被再次开启 + Logger.d("FinalizeCrashFixer", "--- 切换到前台 ---"); + realFix(); + } else { + //前后台则重新反射关闭一遍,避免线程被再次开启 + Logger.d("FinalizeCrashFixer", "--- 切换到后台 ---"); + realFix(); + } } - - if (event == Lifecycle.Event.ON_STOP) { - //前后台则重新反射关闭一遍,避免线程被再次开启 - Logger.d("FinalizeCrashFixer", "--- 切换到后台 ---"); - realFix(); - } - }); } diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/utils/TopViewManager.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/utils/TopViewManager.java index a843b53126..c8853f8b2f 100644 --- a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/utils/TopViewManager.java +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/utils/TopViewManager.java @@ -5,6 +5,7 @@ import android.view.View; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; + import com.alibaba.android.arouter.facade.annotation.Route; import com.mogo.module.extensions.R; import com.mogo.eagle.core.data.constants.MogoServicePaths; diff --git a/modules/mogo-module-main/src/main/java/com/mogo/module/main/MainActivity.java b/modules/mogo-module-main/src/main/java/com/mogo/module/main/MainActivity.java index 8135db743e..e9bede13a0 100644 --- a/modules/mogo-module-main/src/main/java/com/mogo/module/main/MainActivity.java +++ b/modules/mogo-module-main/src/main/java/com/mogo/module/main/MainActivity.java @@ -72,7 +72,6 @@ public class MainActivity extends MvpActivity implement protected IMogoStatusManager mMogoStatusManager; protected View mEntrance; - protected View mEventPanel; protected FrameLayout mFloatingLayout; protected View mCoverUpLayout; @@ -95,7 +94,6 @@ public class MainActivity extends MvpActivity implement getWindow().setBackgroundDrawable(null); mEntrance = findViewById(R.id.module_main_id_entrance_fragment_container); - mEventPanel = findViewById(R.id.module_main_id_event_panel_fragment_container); mFloatingLayout = findViewById(R.id.module_main_id_floating_view); mCoverUpLayout = findViewById(R.id.module_main_id_cover_up); @@ -119,14 +117,12 @@ public class MainActivity extends MvpActivity implement // 隐藏布局 protected void hideLayout() { mEntrance.setVisibility(View.GONE); - mEventPanel.setVisibility(View.GONE); mFloatingLayout.setVisibility(View.GONE); } // 显示布局 protected void showLayout() { mEntrance.setVisibility(View.VISIBLE); - mEventPanel.setVisibility(View.VISIBLE); mFloatingLayout.setVisibility(View.VISIBLE); } @@ -182,8 +178,6 @@ public class MainActivity extends MvpActivity implement if (mServiceApis == null) { mServiceApis = MogoApisHandler.getInstance().getApis(); } - //mServiceApis.getShareManager().resetContext(this); - mMogoStatusManager = mServiceApis.getStatusManagerApi(); mMogoStatusManager.setMainPageLaunchedStatus(TAG, true); AutopilotServiceManage.getInstance().init(getContext()); @@ -275,7 +269,7 @@ public class MainActivity extends MvpActivity implement protected void loadContainerModules() { MogoModulesManager.getInstance().loadEntrancesModule(R.id.module_main_id_entrance_fragment_container); - MogoModulesManager.getInstance().loadEventPanelModule(R.id.module_main_id_event_panel_fragment_container); + //MogoModulesManager.getInstance().loadEventPanelModule(R.id.module_main_id_event_panel_fragment_container); } @Override @@ -355,7 +349,9 @@ public class MainActivity extends MvpActivity implement @Override protected void onStop() { super.onStop(); - mMogoStatusManager.setMainPageIsBackgroundStatus(TAG, true); + if (mMogoStatusManager != null) { + mMogoStatusManager.setMainPageIsBackgroundStatus(TAG, true); + } if (shouldCloseADASPanelWhenPause()) { mServiceApis.getAdasControllerApi().closeADAS(); } diff --git a/modules/mogo-module-main/src/main/java/com/mogo/module/main/SchemeIntent.java b/modules/mogo-module-main/src/main/java/com/mogo/module/main/SchemeIntent.java index abf91a6339..f77d8302e0 100644 --- a/modules/mogo-module-main/src/main/java/com/mogo/module/main/SchemeIntent.java +++ b/modules/mogo-module-main/src/main/java/com/mogo/module/main/SchemeIntent.java @@ -180,7 +180,7 @@ public class SchemeIntent implements IMogoStatusChangedListener { * */ private void handleShowEventPanel(int item) { Logger.d(TAG, "语音打开事件面板" + item); - mApis.getEventPanelManager().showPanelWithSelectedItem(item); + //mApis.getEventPanelManager().showPanelWithSelectedItem(item); } @Override diff --git a/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/MogoModulesHandler.java b/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/MogoModulesHandler.java index ad2221dfee..18f92882a9 100644 --- a/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/MogoModulesHandler.java +++ b/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/MogoModulesHandler.java @@ -39,14 +39,6 @@ public interface MogoModulesHandler { */ void loadBaseModule(); - - /** - * 加载事件面板 - * - * @param containerId - */ - void loadEventPanelModule(int containerId); - /** * 释放各个模块资源 */ diff --git a/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/MogoModulesManager.java b/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/MogoModulesManager.java index 4ec755413f..4428af55e4 100644 --- a/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/MogoModulesManager.java +++ b/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/MogoModulesManager.java @@ -137,12 +137,6 @@ public class MogoModulesManager implements MogoModulesHandler { addFragment( provider, containerId ); } - @Override - public void loadEventPanelModule( int containerId ) { - IMogoModuleProvider provider = MogoApisHandler.getInstance().getApis().getEventPanelManager(); - addFragment( provider, containerId ); - } - @Override public void loadBaseModule() { List< MogoModule > baseModules = MogoModulePaths.getBaseModules(); diff --git a/modules/mogo-module-main/src/main/res/layout/module_main_activity_main.xml b/modules/mogo-module-main/src/main/res/layout/module_main_activity_main.xml index 70c44a28e7..38566ba5c3 100644 --- a/modules/mogo-module-main/src/main/res/layout/module_main_activity_main.xml +++ b/modules/mogo-module-main/src/main/res/layout/module_main_activity_main.xml @@ -61,15 +61,15 @@ android:layout_height="match_parent" /> - + + + + + + + + +