diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/greenwave/GreenWaveView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/greenwave/GreenWaveView.kt new file mode 100644 index 0000000000..0744769176 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/greenwave/GreenWaveView.kt @@ -0,0 +1,161 @@ +package com.mogo.eagle.core.function.hmi.ui.greenwave + +import android.content.Context +import android.os.Looper +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.MotionEvent +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.data.map.MogoLocation +import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Listener +import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager +import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.utilcode.kotlin.scope +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils +import com.mogo.eagle.core.utilcode.rv.divider.CommonDividerItemDecoration +import com.mogo.eagle.core.utilcode.util.SizeUtils +import com.mogo.eagle.core.utilcode.util.UiThreadHandler +import kotlinx.coroutines.Runnable +import kotlinx.coroutines.launch +import kotlin.math.abs +import kotlinx.android.synthetic.main.view_green_wave_passenger_layout.view.speed as passenger_speed +import kotlinx.android.synthetic.main.view_green_wave_driver_layout.view.speed as driver_speed +import kotlinx.android.synthetic.main.view_green_wave_passenger_layout.view.wave_rv as passenger_wave_rv +import kotlinx.android.synthetic.main.view_green_wave_driver_layout.view.wave_rv as driver_wave_rv +import kotlinx.android.synthetic.main.view_green_wave_passenger_layout.view.recommend_speed as passenger_recommend_speed +import kotlinx.android.synthetic.main.view_green_wave_driver_layout.view.recommend_speed as driver_recommend_speed +import kotlinx.android.synthetic.main.view_green_wave_passenger_layout.view.recommend_cross as passenger_recommend_cross +import kotlinx.android.synthetic.main.view_green_wave_driver_layout.view.recommend_cross as driver_recommend_cross + +class GreenWaveView: LinearLayout, IMoGoChassisLocationGCJ02Listener, RecyclerView.OnItemTouchListener, Runnable { + + companion object { + private const val TAG = "GreenWaveView" + } + + private var lastSpeed: Int = Int.MIN_VALUE + + constructor(context: Context) : this(context, null) + constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0) + constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) { + LayoutInflater.from(context).inflate(if (isDriver) R.layout.view_green_wave_driver_layout else R.layout.view_green_wave_passenger_layout, this) + background = if (isDriver) ContextCompat.getDrawable(context, R.drawable.bg_green_wave_driver) else ContextCompat.getDrawable(context, R.drawable.bg_green_wave_passenger) + } + + private val isDriver by lazy { + AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode) + } + + private class WaveHolder(item: ImageView): RecyclerView.ViewHolder(item) + + private class WaveAdapter: RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): WaveHolder { + val item = ImageView(parent.context) + item.layoutParams = RecyclerView.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT) + return WaveHolder(item) + } + + override fun getItemCount(): Int { + return 5000 + } + + override fun onBindViewHolder(holder: WaveHolder, position: Int) { + val item = holder.itemView as? ImageView ?: return + val reminder = position % 3 + when(reminder) { + 0 -> { + item.background = ContextCompat.getDrawable(item.context, R.drawable.icon_green_wave_alpha_low) + } + 1 -> { + item.background = ContextCompat.getDrawable(item.context, R.drawable.icon_green_wave_alpha_mid) + } + else -> { + item.background = ContextCompat.getDrawable(item.context, R.drawable.icon_green_wave_alpha_high) + } + } + } + } + + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + CallerChassisLocationGCJ02ListenerManager.addListener(TAG, 5, this) + val rv: RecyclerView? = if (isDriver) driver_wave_rv else passenger_wave_rv + rv?.addItemDecoration(CommonDividerItemDecoration.Builder() + .spanCountTBCare(false) + .horizontalInnerSpace(SizeUtils.dp2px(10f)) + .build()) + rv?.addOnItemTouchListener(this) + rv?.layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, true) + rv?.adapter = WaveAdapter() + startAutoScroll() + } + + private fun startAutoScroll() { + removeCallbacks(this) + post(this) + } + + private fun stopAutoScroll() { + removeCallbacks(this) + } + + override fun run() { + val rv: RecyclerView? = if (isDriver) driver_wave_rv else passenger_wave_rv + rv?.scrollBy(-3, 0) + postDelayed(this, 20) + } + + override fun onInterceptTouchEvent(rv: RecyclerView, e: MotionEvent): Boolean { + return true + } + + override fun onTouchEvent(rv: RecyclerView, e: MotionEvent) { } + + override fun onRequestDisallowInterceptTouchEvent(disallowIntercept: Boolean) { } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + CallerChassisLocationGCJ02ListenerManager.removeListener(TAG) + val rv: RecyclerView? = if (isDriver) driver_wave_rv else passenger_wave_rv + rv?.removeOnItemTouchListener(this) + stopAutoScroll() + } + + override fun onChassisLocationGCJ02(mogoLocation: MogoLocation?) { + var isChanged = false + val speed = (abs(mogoLocation?.gnssSpeed ?: 0f) * 3.6f).toInt() + if (lastSpeed != speed) { + isChanged = true + lastSpeed = speed + } + if (isChanged) { + UiThreadHandler.post { + if (isDriver) { + driver_speed?.text = speed.toString() + } else { + passenger_speed?.text = speed.toString() + } + } + } + } + + fun bind(minSpeed: Int, maxSpeed: Int, cross: Int) { + scope.launch { + if (isDriver) { + driver_recommend_speed?.text = "建议车速${minSpeed}-${maxSpeed}km/h" + driver_recommend_cross?.text = "可丝滑通过${cross}个路口" + } else { + passenger_recommend_speed?.text = "建议车速${minSpeed}-${maxSpeed}km/h" + passenger_recommend_cross?.text = "可丝滑通过${cross}个路口" + } + } + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_green_wave_alpha_high.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_green_wave_alpha_high.png new file mode 100644 index 0000000000..01d57b1544 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_green_wave_alpha_high.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_green_wave_alpha_low.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_green_wave_alpha_low.png new file mode 100644 index 0000000000..206e9cb0f0 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_green_wave_alpha_low.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_green_wave_alpha_mid.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_green_wave_alpha_mid.png new file mode 100644 index 0000000000..c783b5da7f Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_green_wave_alpha_mid.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_green_wave_driver.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_green_wave_driver.xml new file mode 100644 index 0000000000..90ed9a6e67 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_green_wave_driver.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_green_wave_passenger.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_green_wave_passenger.xml new file mode 100644 index 0000000000..3bea23da6e --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_green_wave_passenger.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_white_circle_driver.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_white_circle_driver.xml new file mode 100644 index 0000000000..8b6f3a410f --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_white_circle_driver.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_white_circle_passenger.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_white_circle_passenger.xml new file mode 100644 index 0000000000..84d954e2d9 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_white_circle_passenger.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_green_wave_driver_layout.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_green_wave_driver_layout.xml new file mode 100644 index 0000000000..e1a921c747 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_green_wave_driver_layout.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_green_wave_passenger_layout.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_green_wave_passenger_layout.xml new file mode 100644 index 0000000000..c4d12ad34f --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_green_wave_passenger_layout.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file