diff --git a/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/base/CharterBaseFragment.kt b/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/base/CharterBaseFragment.kt index 2fd95c62ae..03230806d3 100644 --- a/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/base/CharterBaseFragment.kt +++ b/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/base/CharterBaseFragment.kt @@ -55,7 +55,7 @@ abstract class CharterBaseFragment?>() : MvpFragmen } override fun initViews() { - mapBizView = findViewById(R.id.mapBizView) + mapBizView = findViewById(R.id.mHomeView) groupTestPanel = findViewById(R.id.groupTestPanel) ctvAutopilotStatus = findViewById(R.id.autopilot_status) flStationPanelContainer = findViewById(R.id.module_mogo_och_station_panel_container) diff --git a/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/manager/CharterTrajectoryManager.kt b/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/manager/CharterTrajectoryManager.kt index b63b9da27c..67b6deaa6c 100644 --- a/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/manager/CharterTrajectoryManager.kt +++ b/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/manager/CharterTrajectoryManager.kt @@ -14,8 +14,8 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.e import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.eagle.core.utilcode.util.ActivityUtils import com.mogo.eagle.core.utilcode.util.GsonUtils -import com.mogo.och.bridge.autopilot.trajectory.ITrajectoryListListener -import com.mogo.och.bridge.autopilot.trajectory.TrajectoryManager +import com.mogo.och.bridge.trajectory.ITrajectoryListListener +import com.mogo.och.bridge.trajectory.TrajectoryManager import com.mogo.och.common.module.biz.login.LoginStatusManager import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager import com.mogo.och.common.module.utils.SoundPoolHelper diff --git a/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/model/DriverM1Model.kt b/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/model/DriverM1Model.kt index 6ebb47ae72..7b3f59e796 100644 --- a/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/model/DriverM1Model.kt +++ b/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/model/DriverM1Model.kt @@ -147,9 +147,6 @@ class DriverM1Model { //定位,长连接等异常提示 startLoopAbnormalFactors(mContext!!) - //网络监听 - IntentManager.getInstance().registerIntentListener(ConnectivityManager.CONNECTIVITY_ACTION, mNetWorkIntentListener) - //2022.1.28 // 调用Disposable.dispose() 时候会出现InterruptedException 导致出现崩溃 // The exception could not be delivered to the consumer because it has already canceled/disposed @@ -321,17 +318,6 @@ class DriverM1Model { } } - //监听网络变化,避免启动机器时无网导致无法更新订单信息 - private val mNetWorkIntentListener = - IMogoIntentListener { intentStr, _ -> - d(SceneConstant.M_TAXI + TAG, "onIntentReceived = %s", intentStr) - if (ConnectivityManager.CONNECTIVITY_ACTION == intentStr) { - if (NetworkUtils.isConnected(mContext)) { - LoginStatusManager.queryLoginStatusByNet() - } - } - } - // 自车定位 private val mMapLocationListener: IMoGoChassisLocationGCJ02Listener = object : IMoGoChassisLocationGCJ02Listener { diff --git a/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/presenter/DriverM1Presenter.kt b/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/presenter/DriverM1Presenter.kt index 89f1e717de..d56339caac 100644 --- a/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/presenter/DriverM1Presenter.kt +++ b/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/presenter/DriverM1Presenter.kt @@ -15,7 +15,7 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.eagle.core.utilcode.util.DateTimeUtils import com.mogo.och.common.module.biz.login.ILoginCallback -import com.mogo.och.common.module.biz.login.LoginStatusEnum +import com.mogo.och.common.module.biz.login.EnumLoginStatus import com.mogo.och.common.module.biz.login.LoginStatusManager import com.mogo.och.common.module.manager.socket.cloud.OCHSocketMessageManager.OPERATION_ROAD_SIDE_TYPE import com.mogo.och.bridge.autopilot.OCHAdasAbilityManager @@ -70,7 +70,7 @@ class DriverM1Presenter(view: DriverM1Fragment?) : DriverM1Model.get().release() } - override fun onStatusChange(currentStatus: LoginStatusEnum?) { + override fun onLoginStatusChange(currentStatus: EnumLoginStatus?) { d(SceneConstant.M_BUS + TAG, " loginStatus =" + LoginStatusManager.isLogin()) if(LoginStatusManager.isLogin()){ // 查询服务状态 @@ -179,6 +179,8 @@ class DriverM1Presenter(view: DriverM1Fragment?) : OPERATION_ROAD_SIDE_TYPE ) } + + else -> {} } } diff --git a/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/view/view/drawline/LineView.kt b/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/view/view/drawline/LineView.kt new file mode 100644 index 0000000000..8c1db07863 --- /dev/null +++ b/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/view/view/drawline/LineView.kt @@ -0,0 +1,69 @@ +package com.magic.mogo.och.charter.view.view.drawline + +import android.content.Context +import android.util.AttributeSet +import androidx.appcompat.widget.AppCompatImageView +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.findViewTreeViewModelStoreOwner +import com.magic.mogo.och.charter.R +import com.mogo.eagle.core.utilcode.kotlin.onClick +import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.mogo.och.bridge.autopilot.line.LineManager + +/** + * + */ +class LineView : AppCompatImageView, LineViewModel.ILineViewCallback { + + private val TAG = "LineView" + + constructor(context: Context) : super(context) + + constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet) + + constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int) : super( + context, + attributeSet, + defStyleAttr + ) + + private fun initView() { + setImageResource(R.drawable.charter_map_line_close) + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + + onClick { + if (LineManager.hasDrawnGlobalTrajectory()) { + LineManager.clearGlobalTrajectory(false) + } else { + val drawGlobalTrajectory = LineManager.drawGlobalTrajectory() + if (!drawGlobalTrajectory.first) { + ToastUtils.showLong(drawGlobalTrajectory.second) + } + } + } + + val viewModel = findViewTreeViewModelStoreOwner()?.let { + ViewModelProvider(it).get(LineViewModel::class.java) + } + viewModel?.setDistanceCallback(this) + + } + + + init { + try { + initView() + } catch (e: Exception) { + e.printStackTrace() + } + } + + override fun setImageViewResource(name: Int) { + setImageResource(name) + } + + +} \ No newline at end of file diff --git a/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/view/view/drawline/LineViewModel.kt b/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/view/view/drawline/LineViewModel.kt new file mode 100644 index 0000000000..871440d694 --- /dev/null +++ b/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/view/view/drawline/LineViewModel.kt @@ -0,0 +1,45 @@ +package com.magic.mogo.och.charter.view.view.drawline + +import androidx.annotation.DrawableRes +import androidx.lifecycle.ViewModel +import com.magic.mogo.och.charter.R +import com.mogo.och.bridge.autopilot.line.ILineCallback +import com.mogo.och.bridge.autopilot.line.LineManager + +class LineViewModel : ViewModel(), ILineCallback { + + private val TAG = LineViewModel::class.java.simpleName + + private var viewCallback: ILineViewCallback? = null + + init { + + } + + override fun onCleared() { + super.onCleared() + LineManager.removeListener(TAG) + this.viewCallback = null + } + + fun setDistanceCallback(viewCallback: ILineViewCallback) { + LineManager.addListener(TAG,this) + this.viewCallback = viewCallback + } + + override fun clearLineSuccess() { + this.viewCallback?.setImageViewResource(R.drawable.charter_map_line_close) + } + + override fun drawLineSuccess() { + this.viewCallback?.setImageViewResource(R.drawable.charter_map_line_open) + } + + override fun drawLineFail() { + this.viewCallback?.setImageViewResource(R.drawable.charter_map_line_close) + } + + interface ILineViewCallback { + fun setImageViewResource(@DrawableRes name: Int) + } +} \ No newline at end of file diff --git a/OCH/charter/driver/src/main/res/drawable-nodpi/charter_map_line_close.png b/OCH/charter/driver/src/main/res/drawable-nodpi/charter_map_line_close.png new file mode 100644 index 0000000000..4187e3ddbd Binary files /dev/null and b/OCH/charter/driver/src/main/res/drawable-nodpi/charter_map_line_close.png differ diff --git a/OCH/charter/driver/src/main/res/drawable-nodpi/charter_map_line_open.png b/OCH/charter/driver/src/main/res/drawable-nodpi/charter_map_line_open.png new file mode 100644 index 0000000000..8bfc10bae6 Binary files /dev/null and b/OCH/charter/driver/src/main/res/drawable-nodpi/charter_map_line_open.png differ diff --git a/OCH/charter/driver/src/main/res/layout/charter_base_fragment.xml b/OCH/charter/driver/src/main/res/layout/charter_base_fragment.xml index c0e0c1341b..890383e853 100644 --- a/OCH/charter/driver/src/main/res/layout/charter_base_fragment.xml +++ b/OCH/charter/driver/src/main/res/layout/charter_base_fragment.xml @@ -7,7 +7,7 @@ android:layout_marginTop="@dimen/dp_status_bar_height"> - + + + \ No newline at end of file diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/model/CharterPassengerModel.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/model/CharterPassengerModel.kt index a1e0f17aec..3e2ec0ebbe 100644 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/model/CharterPassengerModel.kt +++ b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/model/CharterPassengerModel.kt @@ -39,7 +39,7 @@ import com.mogo.och.common.module.manager.socket.lan.bean.ChangeDestMsg import com.mogo.och.common.module.manager.socket.cloud.OCHSocketMessageManager import com.mogo.och.common.module.biz.login.LoginStatusManager import com.mogo.och.common.module.biz.login.ILoginCallback -import com.mogo.och.common.module.biz.login.LoginStatusEnum +import com.mogo.och.common.module.biz.login.EnumLoginStatus import com.mogo.och.common.module.network.OchCommonServiceCallback import com.mogo.och.bridge.autopilot.autopilot.bean.ArrivedStation import com.mogo.och.bridge.autopilot.autopilot.IOchAutopilotStatusListener @@ -47,11 +47,11 @@ import com.mogo.och.bridge.autopilot.autopilot.OchAutoPilotManager import com.mogo.och.bridge.autopilot.autopilot.OchAutoPilotStatusListenerManager import com.mogo.och.bridge.autopilot.location.OchLocationManager import com.mogo.och.common.module.manager.beautifymode.BeautifyManager -import com.mogo.och.bridge.distance.TrajectoryAndDistanceManager import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager import com.mogo.och.common.module.manager.socket.lan.LanSocketManager import com.mogo.och.common.module.manager.socket.lan.LedScreenManager import com.mogo.och.bridge.utils.CoordinateCalculateRouteUtil +import com.mogo.och.common.module.biz.birdge.BridgeManager import com.mogo.och.common.module.utils.DateTimeUtil import com.mogo.och.common.module.utils.PinYinUtil import com.mogo.och.common.module.voice.VoiceNotice @@ -168,7 +168,7 @@ object CharterPassengerModel { */ private fun listenerLoginStatus() { LoginStatusManager.addListener(TAG,object : ILoginCallback{ - override fun onStatusChange(currentStatus: LoginStatusEnum?) { + override fun onLoginStatusChange(currentStatus: EnumLoginStatus?) { if (LoginStatusManager.isLogin()) { // 1、打开视频播放、 // 2 、打开空调暖风机灯设置页面 @@ -1273,7 +1273,7 @@ object CharterPassengerModel { endStation: MogoLocation?, lineId: Long? ) { - TrajectoryAndDistanceManager.setStationPoint(startStation, endStation, lineId) + BridgeManager.setDistanceStation(startStation,endStation,lineId) } } \ No newline at end of file diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/MainFragment.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/MainFragment.kt index fe67b140a6..5a4cf74a8a 100644 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/MainFragment.kt +++ b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/MainFragment.kt @@ -10,7 +10,6 @@ import com.amap.api.maps.model.LatLng import com.mogo.commons.AbsMogoApplication import com.mogo.commons.mvp.MvpFragment import com.mogo.eagle.core.data.config.HdMapBuildConfig -import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager.getMapUIController import com.mogo.eagle.core.function.view.SiteMarkerBean import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger @@ -39,7 +38,7 @@ import kotlinx.android.synthetic.main.charter_p_main_fragment.biz_orderinfo import kotlinx.android.synthetic.main.charter_p_main_fragment.biz_selectline import kotlinx.android.synthetic.main.charter_p_main_fragment.biz_softcontrol import kotlinx.android.synthetic.main.charter_p_main_fragment.biz_video -import kotlinx.android.synthetic.main.charter_p_main_fragment.mapBizView +import kotlinx.android.synthetic.main.charter_p_main_fragment.mHomeView import kotlinx.android.synthetic.main.charter_p_main_fragment.mcv_play_music import kotlinx.android.synthetic.main.charter_p_main_fragment.omvOverMap import org.greenrobot.eventbus.EventBus @@ -165,7 +164,7 @@ class MainFragment : MvpFragment(), IMogo } aciv_map_2_default.setOnClickListener { omvOverMap.displayCustomOverView() - mapBizView.getUI()?.let { + mHomeView.getUI()?.let { it.changeMapVisualAngle(it.getVrAngleDefaultMode(), null) } } @@ -226,7 +225,7 @@ class MainFragment : MvpFragment(), IMogo override fun initViews(savedInstanceState: Bundle?) { super.initViews(savedInstanceState) - mapBizView.onCreate(savedInstanceState) + mHomeView.onCreate(savedInstanceState) omvOverMap.onCreateView(savedInstanceState) } @@ -243,28 +242,28 @@ class MainFragment : MvpFragment(), IMogo override fun onResume() { super.onResume() - mapBizView.onResume() + mHomeView.onResume() omvOverMap.onResume() } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) - mapBizView.onSaveInstanceState(outState) + mHomeView.onSaveInstanceState(outState) } override fun onLowMemory() { super.onLowMemory() - mapBizView.onLowMemory() + mHomeView.onLowMemory() } override fun onPause() { super.onPause() - mapBizView.onPause() + mHomeView.onPause() omvOverMap.onPause() } override fun onDestroyView() { - mapBizView.onDestroy() + mHomeView.onDestroy() omvOverMap.onDestroy() MogoMapListenerHandler.mogoMapListenerHandler.unregisterHostMapListener(TAG) EventBus.getDefault().unregister(this) diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/lockview/LockAndUnlockView.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/lockview/LockAndUnlockView.kt index f8e32bbe53..3d3aaa95c4 100644 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/lockview/LockAndUnlockView.kt +++ b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/lockview/LockAndUnlockView.kt @@ -145,6 +145,8 @@ class LockAndUnlockView : ConstraintLayout, LockManager.LockStatusCallback { LockManager.LockStatus.UNLOCK -> { aciv_screen_lock.setImageResource(R.drawable.charter_p_unlock) } + + else -> {} } aciv_screen_lock_bg?.setImageResource(R.drawable.charter_p_normal) } diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/music/list/MusicListViewModel.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/music/list/MusicListViewModel.kt index 574920a1af..ae13884abf 100644 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/music/list/MusicListViewModel.kt +++ b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/music/list/MusicListViewModel.kt @@ -51,7 +51,6 @@ class MusicListViewModel : ViewModel(), } override fun onMusicCompletion(musicData: MusicData) { - super.onMusicCompletion(musicData) UiThreadHandler.post({ viewCallback?.updateMusicData(musicData, musicData) }, UiThreadHandler.MODE.QUEUE) diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/music/playing/MusicPlayingViewModel.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/music/playing/MusicPlayingViewModel.kt index f25f9ac8dd..17e3061624 100644 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/music/playing/MusicPlayingViewModel.kt +++ b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/music/playing/MusicPlayingViewModel.kt @@ -108,7 +108,6 @@ class MusicPlayingViewModel : ViewModel(), AuditionManager.MusicDataChangeListen } override fun onMusicCompletion(musicData: MusicData) { - super.onMusicCompletion(musicData) checkMusicData?.let { if(it.id==musicData.id){ it.state = musicData.state diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/video/ConsultVideoPlayer.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/video/ConsultVideoPlayer.kt index ae9595ea57..1e515485c9 100644 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/video/ConsultVideoPlayer.kt +++ b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/video/ConsultVideoPlayer.kt @@ -8,6 +8,7 @@ import android.os.Build import android.util.AttributeSet import android.util.TypedValue import android.view.Gravity +import android.view.MotionEvent import android.view.Surface import android.view.View import android.view.ViewGroup @@ -166,7 +167,7 @@ class ConsultVideoPlayer : StandardGSYVideoPlayer { } } - override fun touchDoubleUp() { + override fun touchDoubleUp(e: MotionEvent?) { } @@ -185,24 +186,24 @@ class ConsultVideoPlayer : StandardGSYVideoPlayer { } override fun setProgressAndTime( - progress: Int, - secProgress: Int, - currentTime: Int, - totalTime: Int, - forceChange: Boolean + progress: Long, + secProgress: Long, + currentTime: Long, + totalTime: Long, + forceChange: Boolean ) { super.setProgressAndTime(progress, secProgress, currentTime, totalTime, forceChange) CallerLogger.d(TAG,"setProgressAndTime¥${progress}-${secProgress}-${currentTime}") //时间显示 - currentTimeTextView.text = TimeTransformUtils.stringForTimeWithHours(currentTime) - totalTimeTextView.text = TimeTransformUtils.stringForTimeWithHours(totalTime) + currentTimeTextView.text = TimeTransformUtils.stringForTimeWithHours(currentTime.toInt()) + totalTimeTextView.text = TimeTransformUtils.stringForTimeWithHours(totalTime.toInt()) if(currentTime>=totalTime-3000){// this.currentTime = -1 }else{ - this.currentTime = currentTime + this.currentTime = currentTime.toInt() } - if (progress != 0) { - mProgressBar?.progress = progress + if (progress != 0L) { + mProgressBar?.progress = progress.toInt() } } diff --git a/OCH/charter/passenger/src/main/res/layout/charter_p_main_fragment.xml b/OCH/charter/passenger/src/main/res/layout/charter_p_main_fragment.xml index 595730e1ae..a699aa0a84 100644 --- a/OCH/charter/passenger/src/main/res/layout/charter_p_main_fragment.xml +++ b/OCH/charter/passenger/src/main/res/layout/charter_p_main_fragment.xml @@ -5,7 +5,7 @@ android:layout_height="match_parent"> @@ -103,7 +103,7 @@ android:paddingBottom="@dimen/dp_34_5" android:visibility="gone" app:layout_constraintBottom_toTopOf="@+id/bb_boorombar" - app:layout_constraintEnd_toEndOf="@+id/mapBizView" + app:layout_constraintEnd_toEndOf="@+id/mHomeView" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -143,7 +143,7 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/dp_47" android:visibility="gone" - app:layout_constraintEnd_toEndOf="@+id/mapBizView" + app:layout_constraintEnd_toEndOf="@+id/mHomeView" app:layout_constraintTop_toTopOf="parent" /> diff --git a/OCH/common/biz/build.gradle b/OCH/common/biz/build.gradle index 62fddfebc6..0e86496581 100644 --- a/OCH/common/biz/build.gradle +++ b/OCH/common/biz/build.gradle @@ -44,6 +44,9 @@ android { dependencies { + + testImplementation 'junit:junit:4.12' + implementation fileTree(dir: "libs", include: ["*.jar"]) implementation rootProject.ext.dependencies.kotlinstdlib implementation rootProject.ext.dependencies.androidxccorektx @@ -53,9 +56,14 @@ dependencies { implementation project(':OCH:common:common') implementation rootProject.ext.dependencies.arouter + testImplementation project(':OCH:common:biz') + kapt rootProject.ext.dependencies.aroutercompiler implementation project(':OCH:common:data') implementation project(':OCH:common:bridge') - kapt rootProject.ext.dependencies.aroutercompiler + + // 硬件管理 + implementation project(":libraries:mogo-hardware-devices") + if (Boolean.valueOf(USE_MAVEN_PACKAGE)) { api rootProject.ext.dependencies.mogocommons diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/LoginProvider.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/LoginProvider.kt index 591e16019c..c2cbb6303e 100644 --- a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/LoginProvider.kt +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/LoginProvider.kt @@ -1,57 +1,68 @@ package com.mogo.och.biz.login import android.content.Context -import android.util.Log import android.view.View import androidx.fragment.app.Fragment import com.alibaba.android.arouter.facade.annotation.Route import com.mogo.eagle.core.data.config.FunctionBuildConfig -import com.mogo.eagle.core.data.config.HdMapBuildConfig import com.mogo.eagle.core.data.enums.Carmodel -import com.mogo.eagle.core.function.call.och.CallerEagleBaseFunctionCall4OchManager import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.mogo.Product -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger -import com.mogo.eagle.core.utilcode.util.UiThreadHandler +import com.mogo.eagle.core.utilcode.mogo.Vehicle +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_OCHCOMMON +import com.mogo.eagle.core.utilcode.util.GsonUtils +import com.mogo.och.biz.login.bean.LoginInfo import com.mogo.och.biz.login.callback.ILoginViewCallback -import com.mogo.och.biz.login.model.LoginModel import com.mogo.och.biz.login.ui.LoginFragment import com.mogo.och.biz.login.ui.LoginPassengerFragment import com.mogo.och.common.module.constant.OchCommonConst -import com.mogo.och.common.module.biz.login.LoginInfo import com.mogo.och.common.module.biz.login.LoginService -import com.mogo.och.common.module.biz.login.LoginStatusManager -import com.mogo.och.common.module.biz.login.RoleEnum -import com.mogo.och.common.module.biz.login.LoginStatusEnum -import com.mogo.och.common.module.biz.login.OpenOrderStatusEnum -import com.mogo.och.common.module.manager.cache.OchSPManager -import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager -import com.mogo.och.common.module.manager.socket.lan.bean.BusinessType +import com.mogo.och.common.module.biz.login.EnumRole +import com.mogo.och.common.module.biz.login.EnumLoginStatus +import com.mogo.och.common.module.biz.login.EnumOpenOrderStatus +import com.mogo.och.common.module.biz.login.bean.OchBizInfo +import com.mogo.och.common.module.biz.login.bean.OchCarInfo +import com.mogo.och.common.module.biz.login.bean.OchLoginInfo +import com.mogo.och.common.module.manager.socket.lan.ILanMessageListener +import com.mogo.och.common.module.manager.socket.lan.LanSocketManager +import com.mogo.och.common.module.manager.socket.lan.bean.DPMsgType import com.mogo.och.common.module.manager.socket.lan.bean.EnvType +import com.mogo.och.common.module.manager.socket.lan.bean.LoginInfo2Client import com.mogo.och.common.module.manager.socket.lan.bean.ProjectType -import com.mogo.och.common.module.manager.socket.lan.bean.VehicleType -import com.mogo.och.common.module.utils.FlavorUtils /** * 网约车小巴业务实现入口 - * - * @author tongchenfei */ @Route(path = OchCommonConst.BIZ_LOGIN) class LoginProvider : LoginService { - private val tag = LoginProvider::class.java.simpleName - private var loginFragment: Fragment?=null - private var loginStatus: LoginStatusEnum = LoginStatusEnum.None - private var businessEnum = Product.NONE - private var openOrderStatusEnum: OpenOrderStatusEnum = OpenOrderStatusEnum.None - private var carModel: Carmodel = Carmodel.T2 - private var loginInfo: LoginInfo? = null + private val tag = M_OCHCOMMON +LoginProvider::class.java.simpleName + // 登录页面 + private var loginFragment: Fragment? = null + + // 环境监测+业务展示和跳转 + private val changeBusinessType = object : ILanMessageListener { + override fun targetLan(): Class { + return LoginInfo2Client::class.java + } + + override fun onLanMsgReceived(first: LoginInfo2Client?) { + first?.let { + if (LoginServiceManager.checkAllEnv(it.project,it.env)) { + d(tag,"从司机屏获取账号信息:${it}") + val driverLoginInfo = GsonUtils.fromJson(it.loginInfo, LoginInfo::class.java) + FunctionBuildConfig.isOffLine = it.isOffline + LoginServiceManager.setLoginInfo(driverLoginInfo) + } + } + } + + } - private val loginInfoKey = "LOGININFOKEY" override fun init(context: Context) { - CallerLogger.d(tag, "LoginProvider init") + d(tag, "登录模块 init") loginFragment = if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { LoginFragment() } else if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { @@ -59,18 +70,24 @@ class LoginProvider : LoginService { } else { LoginFragment() } + // 乘客屏监听司机端发送的业务修改通知( + LanSocketManager.registerSocketMessageListener( + DPMsgType.TYPE_LOGIN_INFO.type, + changeBusinessType + ) } override fun getFragment(): Fragment { - CallerLogger.d(tag, "getFragment:${loginFragment}") - if(loginFragment==null){ - loginFragment = if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { - LoginFragment() - } else if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { - LoginPassengerFragment() - } else { - LoginFragment() - } + d(tag, "getFragment:${loginFragment}") + if (loginFragment == null) { + loginFragment = + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + LoginFragment() + } else if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { + LoginPassengerFragment() + } else { + LoginFragment() + } } return loginFragment!! } @@ -84,175 +101,74 @@ class LoginProvider : LoginService { return View(context) } - override fun setLoginStatus(status: Int) { - CallerLogger.d(tag, "setLoginStatus:${status}") - when (status) { - 0 -> { - setLoginStatus(LoginStatusEnum.Logout) - } - - 1 -> { - setLoginStatus(LoginStatusEnum.Login) - } - - else -> { - setLoginStatus(LoginStatusEnum.None) - } - } - } - - override fun queryLoginStatusByNet(readCatche:Boolean) { - CallerLogger.d(tag, "queryLoginStatusByNet") - Log.d("登录","设置源:queryLoginStatusByNet") - LoginModel.queryCarStatus(readCatche) + override fun queryLoginStatusByNet(readCatche: Boolean) { + LoginServiceManager.queryLoginStatusByNet(readCatche) } override fun loginOut() { - CallerLogger.d(tag, "loginOut ") - LoginModel.logout() - } - - override fun checkBusiness(businessType: Int): Boolean { - val businessInfo = FlavorUtils.getBusinessInfo(businessType) - if(businessInfo.isEmpty()){ - return true - } - if (loginFragment is ILoginViewCallback) { - UiThreadHandler.post({ - if (loginFragment?.isAdded==true) { - (loginFragment as ILoginViewCallback).showErrorInfo(businessInfo) - } - },UiThreadHandler.MODE.QUEUE) - } - return false - } - - override fun checkAllEnv( - projectType: ProjectType, - envType: EnvType, - vehicleType: VehicleType, - businessType: BusinessType - ): Boolean { - - val checkAllEnv = FlavorUtils.checkAllEnv(projectType, envType, vehicleType, businessType) - if(checkAllEnv.isEmpty()){ - - }else{ - if (loginFragment is ILoginViewCallback) { - changeStatus(checkAllEnv) - UiThreadHandler.post({ - changeStatus(checkAllEnv) - if (loginFragment?.isAdded==true) { - (loginFragment as ILoginViewCallback).checkAllEnv(checkAllEnv) - } - },UiThreadHandler.MODE.QUEUE) - } - } - - return checkAllEnv.isEmpty() + LoginServiceManager.loginOut() } override fun changeStatus(currentStatus: String) { - if (loginFragment?.isAdded==true) { + if (loginFragment?.isAdded == true) { (loginFragment as ILoginViewCallback).updateStatus(currentStatus) } } - - override fun setLoginInfo(loginInfo: LoginInfo) { - CallerLogger.d(tag, "setLoginInfo:${loginInfo}") - if(this.loginInfo!=loginInfo){ - this.loginInfo = loginInfo - OchChainLogManager.writeChainLog("登录信息",loginInfo.toString()) - } - - CallerEagleBaseFunctionCall4OchManager.setOchLoginNo(loginInfo.phone) - CallerEagleBaseFunctionCall4OchManager.setOchCarModel(Carmodel.getCarModelFromServerName(loginInfo.carModel,loginInfo.tenantId)) - CallerEagleBaseFunctionCall4OchManager.setOchPlateNumber(loginInfo.plateNumber) - CallerEagleBaseFunctionCall4OchManager.updateTenantId(loginInfo.tenantId) - - val carModel = Carmodel.getCarModelFromServerName(LoginStatusManager.getLoginInfo()?.carModel,loginInfo.tenantId) - if(this.carModel!=carModel){ - this.carModel = carModel - LoginStatusManager.invokeCarModelChange(this.carModel) - } - HdMapBuildConfig.currentCarVrIconRes = carModel.rawValue - + override fun getOchBizInfo(): OchBizInfo? { + d(tag, "getOchBizInfo") + return LoginServiceManager.getOchBizInfo() } - override fun getLoginInfo(): LoginInfo? { - CallerLogger.d(tag, "getLoginInfo") - return loginInfo + override fun getOchCarInfo(): OchCarInfo? { + d(tag, "getOchCarInfo") + return LoginServiceManager.getOchCarInfo() } - override fun getPurpose(): RoleEnum { - CallerLogger.d(tag, "getPurpose") - return RoleEnum.valueOf(loginInfo?.purpose) + override fun getOchLoginInfo(): OchLoginInfo? { + d(tag, "getOchLoginInfo") + return LoginServiceManager.getOchLoginInfo() + } + + override fun getPurpose(): EnumRole { + d(tag, "getPurpose") + return LoginServiceManager.getPurpose() } override fun isLogin(): Boolean { - CallerLogger.d(tag, "isLogin:${loginStatus == LoginStatusEnum.Login}") - return loginStatus == LoginStatusEnum.Login + return LoginServiceManager.isLogin() } - override fun getLoginStatus(): LoginStatusEnum { - CallerLogger.d(tag, "getLoginStatus:${loginStatus}") - return loginStatus + override fun getLoginStatus(): EnumLoginStatus { + return LoginServiceManager.getLoginStatuType() } - override fun getCarModel(): Carmodel { - CallerLogger.d(tag, "getCarModel:${carModel}") - return carModel + override fun getCarModelType(): Carmodel { + return LoginServiceManager.getCarModelType() } - - override fun setLoginStatus(loginStatus: LoginStatusEnum) { - CallerLogger.d(tag, "setLoginStatus:${loginStatus}----old${this.loginStatus}") - if (loginStatus != this.loginStatus) { - OchChainLogManager.writeChainLog("登录状态变化","${this.loginStatus}-->${loginStatus}"); - this.loginStatus = loginStatus - Log.d("登录","设置源:invokeLoginStatusChange") - LoginStatusManager.invokeLoginStatusChange(loginStatus) - } + override fun getProductType(): Product { + return LoginServiceManager.getProductType() } - - override fun setBusinessType(type: Int) { - CallerLogger.d(tag, "setBusinessType:${type}") - if (businessEnum.code != type) { - this.businessEnum = Product.valueOf(type) - LoginStatusManager.invokeLBusinessTypeChange(this.businessEnum) - } + override fun getVehicleType(): Vehicle { + return LoginServiceManager.getVehicleType() } - override fun getBusinessType(): Product { - CallerLogger.d(tag, "getBusinessType") - return businessEnum + override fun sendLogin2Client() { + LoginServiceManager.sendLogin2Client(1) } - override fun setOpenOrderStatusType(type: Int) { - CallerLogger.d(tag, "setOpenOrderStatusType:${type}") - if (openOrderStatusEnum.code != type) { - OchChainLogManager.writeChainLog("接单状态变化","${this.openOrderStatusEnum}-->${OpenOrderStatusEnum.valueOf(type)}"); - this.openOrderStatusEnum = OpenOrderStatusEnum.valueOf(type) - LoginStatusManager.invokeLOpenOrderStatusChange(this.openOrderStatusEnum) - } - } - - override fun getOpenOrderStatusType(): OpenOrderStatusEnum { - CallerLogger.d(tag, "getOpenOrderStatusType:${openOrderStatusEnum}") - return openOrderStatusEnum + override fun getOpenOrderStatusType(): EnumOpenOrderStatus { + return LoginServiceManager.getOpenOrderStatusType() } override fun isOpenOrderType(): Boolean { - CallerLogger.d(tag, "isOpenOrderType:${openOrderStatusEnum == OpenOrderStatusEnum.Ordering}") - return openOrderStatusEnum == OpenOrderStatusEnum.Ordering + return LoginServiceManager.isOpenOrderType() } override fun removeLoginInfo() { - this.loginInfo = null - OchSPManager.remove(loginInfoKey) + LoginServiceManager.removeLoginInfo() } - } diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/LoginServiceManager.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/LoginServiceManager.kt new file mode 100644 index 0000000000..b1169e28be --- /dev/null +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/LoginServiceManager.kt @@ -0,0 +1,517 @@ +package com.mogo.och.biz.login + +import android.content.pm.ActivityInfo +import android.content.res.Configuration +import android.util.Log +import androidx.fragment.app.Fragment +import com.mogo.commons.AbsMogoApplication +import com.mogo.commons.env.Env +import com.mogo.commons.env.EnvUtils +import com.mogo.commons.env.Project +import com.mogo.commons.env.ProjectUtils +import com.mogo.commons.screen.ScreenHelper +import com.mogo.commons.utils.MogoAnalyticUtils +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.data.config.HdMapBuildConfig +import com.mogo.eagle.core.data.enums.Carmodel +import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager +import com.mogo.eagle.core.function.call.och.CallerEagleBaseFunctionCall4OchManager +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils +import com.mogo.eagle.core.utilcode.mogo.Product +import com.mogo.eagle.core.utilcode.mogo.Vehicle +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_OCHCOMMON +import com.mogo.eagle.core.utilcode.util.ActivityUtils +import com.mogo.eagle.core.utilcode.util.AppUtils +import com.mogo.eagle.core.utilcode.util.DateTimeUtils +import com.mogo.eagle.core.utilcode.util.GsonUtils +import com.mogo.eagle.core.utilcode.util.TimeUtils +import com.mogo.eagle.core.utilcode.util.UiThreadHandler +import com.mogo.och.biz.login.callback.ILoginViewCallback +import com.mogo.och.biz.login.model.LoginModel +import com.mogo.och.biz.login.bean.LoginInfo +import com.mogo.och.common.module.biz.lansocket.IOchLanPassengerStatusListener +import com.mogo.och.common.module.biz.lansocket.LoginLanPassengerSocket +import com.mogo.och.common.module.biz.login.LoginStatusManager +import com.mogo.och.common.module.biz.login.EnumRole +import com.mogo.och.common.module.biz.login.EnumLoginStatus +import com.mogo.och.common.module.biz.login.EnumOpenOrderStatus +import com.mogo.och.common.module.biz.login.bean.OchBizInfo +import com.mogo.och.common.module.biz.login.bean.OchCarInfo +import com.mogo.och.common.module.biz.login.bean.OchLoginInfo +import com.mogo.och.common.module.manager.cache.OchSPManager +import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager +import com.mogo.och.common.module.manager.loop.BizLoopManager +import com.mogo.och.common.module.manager.loop.LoopInfo +import com.mogo.och.common.module.manager.socket.lan.LanSocketManager +import com.mogo.och.common.module.manager.socket.lan.bean.LoginInfo2Client +import com.mogo.och.common.module.utils.FlavorUtils +import com.mogo.och.common.module.utils.RxUtils +import io.reactivex.schedulers.Schedulers +import kotlin.properties.Delegates + +/** + * 网约车小巴业务实现入口 + */ +object LoginServiceManager : IOchLanPassengerStatusListener { + + private val tag = M_OCHCOMMON + "LoginManager" + private var TAGLoopStatus = "LoginStatusManagerLoop" + + // 登录页面 + private var loginFragment: Fragment? = null + + // 登录状态 + private var loginStatus: EnumLoginStatus by Delegates.observable(EnumLoginStatus.None) { _, oldValue, newValue -> + if (oldValue != newValue) { + OchChainLogManager.writeChainLog("登录状态变化", "${oldValue}-->${newValue}") + Log.d(tag, "登录状态变化:${oldValue}-->${newValue}") +// if (newValue == EnumLoginStatus.Login && AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { +// BizLoopManager.setLoopFunction( +// TAGLoopStatus, +// LoopInfo(60 * 2, ::queryLoginStatusByNet, immediately = false, scheduler = Schedulers.io()) +// ) +// } else { +// BizLoopManager.removeLoopFunction(TAGLoopStatus) +// } + LoginStatusManager.invokeLoginStatusChange(loginStatus) + } + } + + // 业务模式 + private var productEnum: Product by Delegates.observable(Product.NONE) { _, oldValue, newValue -> + if (oldValue != newValue) { + OchChainLogManager.writeChainLog("业务模式发生变化", "${oldValue}-->${newValue}") + Log.d(tag, "业务模式发生变化:${oldValue}-->${newValue}") + onProductChange(newValue) + LoginStatusManager.invokeLProductChange(newValue) + CallerEagleBaseFunctionCall4OchManager.onOchProductChange() + } + } + + // 车型 + private var vehicleEnum: Vehicle by Delegates.observable(Vehicle.NONE) { _, oldValue, newValue -> + if (oldValue != newValue) { + OchChainLogManager.writeChainLog("车型发生变化", "${oldValue}-->${newValue}") + Log.d(tag, "车型发生变化:${oldValue}-->${newValue}") + onVehicleChange(newValue) + LoginStatusManager.invokeLVehicleChange(newValue) + CallerEagleBaseFunctionCall4OchManager.onOchVehicleChange() + } + } + + // 接单状态 + private var openOrderStatusEnum: EnumOpenOrderStatus by Delegates.observable(EnumOpenOrderStatus.None) { _, oldValue, newValue -> + if (oldValue != newValue) { + OchChainLogManager.writeChainLog("接单状态变化", "${oldValue}-->${newValue}") + Log.d(tag, "接单状态变化:${oldValue}-->${newValue}") + LoginStatusManager.invokeOpenOrderStatusChange(this.openOrderStatusEnum) + } + } + + // 车模 + private var carModel: Carmodel by Delegates.observable(Carmodel.T2) { _, oldValue, newValue -> + if (oldValue != newValue) { + OchChainLogManager.writeChainLog("车辆模型发生变化", "${oldValue}-->${newValue}") + Log.d(tag, "车辆模型发生变化:${oldValue}-->${newValue}") + HdMapBuildConfig.currentCarVrIconRes = newValue.rawValue + LoginStatusManager.invokeCarModelChange(newValue) + + CallerEagleBaseFunctionCall4OchManager.setOchCarModel(newValue) + } + } + + private var phoneNum: String by Delegates.observable("") { _, oldValue, newValue -> + if (oldValue != newValue) { + OchChainLogManager.writeChainLog("手机号发生变化", "${oldValue}-->${newValue}") + Log.d(tag, "手机号发生变化:${oldValue}-->${newValue}") + CallerEagleBaseFunctionCall4OchManager.setOchLoginNo(newValue) + } + } + private var plateNumber: String by Delegates.observable("") { _, oldValue, newValue -> + if (oldValue != newValue) { + OchChainLogManager.writeChainLog("车牌号发生变化", "${oldValue}-->${newValue}") + Log.d(tag, "车牌号发生变化:${oldValue}-->${newValue}") + CallerEagleBaseFunctionCall4OchManager.setOchPlateNumber(newValue) + } + } + private var tenantId: Long by Delegates.observable(0L) { _, oldValue, newValue -> + if (oldValue != newValue) { + OchChainLogManager.writeChainLog("租户Id发生变化", "${oldValue}-->${newValue}") + Log.d(tag, "租户Id发生变化:${oldValue}-->${newValue}") + LoginStatusManager.invokeTenantIdChange(newValue) + CallerEagleBaseFunctionCall4OchManager.updateTenantId(newValue) + } + } + + + // 登录信息 + private var loginInfo: LoginInfo? = null + + // 登录账号信息 + private var ochLoginInfo: OchLoginInfo? = null + + // 车辆信息 + private var ochCarInfo: OchCarInfo? = null + + // 业务信息 + private var ochBizInfo: OchBizInfo? = null + + private val loginInfoKey = "LOGININFOKEY" + + private const val OCHLOGININFOKEY = "OCHLOGININFOKEY" + private const val OCHBIZINFOKEY = "OCHBIZINFOKEY" + private const val OCHCARINFOKEY = "OCHCARINFOKEY" + + private const val OCHPRODUCT = "OCHPRODUCT" + private const val OCHVEHICLE = "OCHVEHICLE" + + init { + initProductAndVehicle() + } + + /** + * 查看是否提前设置上 + */ + private fun initProductAndVehicle() { + productEnum = AppIdentityModeUtils.getProduct(FunctionBuildConfig.appIdentityMode) + vehicleEnum = AppIdentityModeUtils.getVehicle(FunctionBuildConfig.appIdentityMode) + LoginLanPassengerSocket.addListener(tag,this) + } + + private fun queryLoginStatusByNet() { + LoginModel.queryCarStatus(false) + } + + fun queryLoginStatusByNet(readCatche: Boolean) { + d(tag, "queryLoginStatusByNet") + LoginModel.queryCarStatus(readCatche) + } + + fun loginOut() { + d(tag, "loginOut ") + if(FunctionBuildConfig.ochdebug){ + FunctionBuildConfig.ochdebug = false + queryLoginStatusByNet() + } + if(FunctionBuildConfig.isOffLine) { + FunctionBuildConfig.isOffLine = false + sendLogin2Client(1) + } + LoginModel.logout() + } + + fun checkAllEnv( + projectType: Project, + envType: Env, + ): Boolean { + val checkAllEnv = FlavorUtils.checkAllEnv(projectType, envType) + if (checkAllEnv.isNotEmpty()) { + if (loginFragment is ILoginViewCallback) { + changeStatus(checkAllEnv) + UiThreadHandler.post({ + changeStatus(checkAllEnv) + if (loginFragment?.isAdded == true) { + (loginFragment as ILoginViewCallback).checkAllEnv(checkAllEnv) + } + }, UiThreadHandler.MODE.QUEUE) + } + } + + return checkAllEnv.isEmpty() + } + + fun changeStatus(currentStatus: String) { + if (loginFragment?.isAdded == true) { + (loginFragment as ILoginViewCallback).updateStatus(currentStatus) + } + } + + /** + * 设置登录信息 + * 1、乘客屏从司机端获取到登录信息 + * 2、支持老版本数据升级 + * 3、接口或者缓存调用 + * 4、debug 业务使用 + */ + fun setLoginInfo(loginInfo: LoginInfo) { + if(FunctionBuildConfig.ochdebug){ + return + } + d(tag, "setLoginInfo:${loginInfo}") + if (this.loginInfo != loginInfo) { + this.loginInfo = loginInfo + saveInfo2SP(loginInfoKey, loginInfo) + sendLogin2Client(1) + + val ochLoginInfo = loginInfo.toOchLoginInfo() + if (ochLoginInfo != this.ochLoginInfo) { + this.ochLoginInfo = ochLoginInfo + saveInfo2SP(OCHLOGININFOKEY, ochLoginInfo) + } + val ochCarInfo = loginInfo.toOchCarInfo() + if (this.ochCarInfo != ochCarInfo) { + this.ochCarInfo = ochCarInfo + saveInfo2SP(OCHCARINFOKEY, ochCarInfo) + } + val ochBizInfo = loginInfo.toOchBizInfo() + if (this.ochBizInfo != ochBizInfo) { + this.ochBizInfo = ochBizInfo + saveInfo2SP(OCHBIZINFOKEY, ochBizInfo) + } + + OchChainLogManager.writeChainLog("登录信息", loginInfo.toString()) + } + // 设置车型 + setVehicleType(Vehicle.getCarVehicleFromServerName(loginInfo.carModel)) + + // 设置业务模式 + setProductType(Product.valueOf(loginInfo.businessType)) + // 设置登录状态 + setLoginStatusType(EnumLoginStatus.valueOf(loginInfo.driverStatus)) + // 设置接单状态 + setOpenOrderStatusType(EnumOpenOrderStatus.valueOf(loginInfo.servingStatus)) + + + + // 设置车辆模型 + setCarModelType(Carmodel.getCarModelFromServerName(loginInfo.carModel, loginInfo.tenantId)) + + this.phoneNum = loginInfo.phone ?: "" + this.plateNumber = loginInfo.plateNumber ?: "" + this.tenantId = loginInfo.tenantId + + } + + fun getLoginInfo(): LoginInfo? { + d(tag, "getLoginInfo") + if (loginInfo == null) { + this.loginInfo = getInfoFromSp(loginInfoKey) + } + return loginInfo + } + + fun getOchBizInfo(): OchBizInfo? { + supply6100() + d(tag, "getOchBizInfo") + if (ochBizInfo == null) { + this.ochBizInfo = getInfoFromSp(OCHBIZINFOKEY) + } + return ochBizInfo + } + + fun getOchCarInfo(): OchCarInfo? { + supply6100() + d(tag, "getOchCarInfo") + if (ochCarInfo == null) { + this.ochCarInfo = getInfoFromSp(OCHCARINFOKEY) + } + return ochCarInfo + } + + fun getOchLoginInfo(): OchLoginInfo? { + supply6100() + d(tag, "getOchLoginInfo") + if (ochLoginInfo == null) { + this.ochLoginInfo = getInfoFromSp(OCHLOGININFOKEY) + } + return ochLoginInfo + } + + fun getPurpose(): EnumRole { + d(tag, "getPurpose") + return EnumRole.valueOf(loginInfo?.purpose) + } + + fun isLogin(): Boolean { + d(tag, "isLogin:${loginStatus == EnumLoginStatus.Login}") + return loginStatus == EnumLoginStatus.Login + } + + fun getLoginStatuType(): EnumLoginStatus { + d(tag, "getLoginStatus:${loginStatus}") + return loginStatus + } + + fun setCarModelType(carModel: Carmodel) { + d(tag, "setCarModel:${carModel}") + this.carModel = carModel + } + + fun getCarModelType(): Carmodel { + d(tag, "getCarModel:${carModel}") + return this.carModel + } + + fun setLoginStatusType(loginStatus: EnumLoginStatus) { + d(tag, "setLoginStatus:${this.loginStatus}---->${loginStatus}") + if(FunctionBuildConfig.isOffLine){ + this.loginStatus = EnumLoginStatus.Login + sendLogin2Client(1) + }else{ + this.loginStatus = loginStatus + } + } + + + fun setProductType(product: Product) { + d(tag, "setProductType:${product}") + this.productEnum = product + } + + fun getProductType(): Product { + d(tag, "getBusinessType:${productEnum}") + return productEnum + } + + fun setVehicleType(vehicle: Vehicle) { + d(tag, "setVehicleType:${vehicle}") + this.vehicleEnum = vehicle + } + + fun getVehicleType(): Vehicle { + d(tag, "getVehicleType:${vehicleEnum}") + return vehicleEnum + } + + fun setOpenOrderStatusType(type: EnumOpenOrderStatus) { + d(tag, "setOpenOrderStatusType:${type}") + this.openOrderStatusEnum = type + } + + fun getOpenOrderStatusType(): EnumOpenOrderStatus { + d(tag, "getOpenOrderStatusType:${openOrderStatusEnum}") + return openOrderStatusEnum + } + + fun isOpenOrderType(): Boolean { + d( + tag, + "isOpenOrderType:${openOrderStatusEnum == EnumOpenOrderStatus.Ordering}" + ) + return openOrderStatusEnum == EnumOpenOrderStatus.Ordering + } + + fun removeLoginInfo() { + this.loginInfo = null + OchSPManager.remove(loginInfoKey) + setLoginStatusType(EnumLoginStatus.Logout) + } + + + private fun saveInfo2SP(key: String, value: Any) { + val timeText = DateTimeUtils.getTimeText(DateTimeUtils.yyyy_MM_dd) + val loginInfo4Json = GsonUtils.toJson(value) + OchSPManager.putString(key, timeText + loginInfo4Json) + } + + inline fun getInfoFromSp(key: String): T? { + val logingInfoJson = OchSPManager.getString(key) + logingInfoJson?.let { logininfo -> + val timeText = DateTimeUtils.getTimeText(DateTimeUtils.yyyy_MM_dd) + if (logininfo.startsWith(timeText)) { + val json = logingInfoJson.replace(timeText, "") + val oldLoginInfo = GsonUtils.fromJson(json, T::class.java) + return oldLoginInfo + } + } + return null + } + + private fun supply6100() { + val loginInfo = getLoginInfo() + if (ochCarInfo == null && loginInfo != null) { + setLoginInfo(loginInfo) + } + } + + private fun onProductChange(businessEnum: Product){ + val (_, identity, model) = AppIdentityModeUtils.getInfo(FunctionBuildConfig.appIdentityMode) + when (businessEnum) { + Product.NONE -> {} + Product.TAXI -> { + FunctionBuildConfig.appIdentityMode = "${AppIdentityModeUtils.TAXI}_${identity}_${model}" + OchSPManager.putString(OCHPRODUCT,AppIdentityModeUtils.TAXI) + } + + Product.BUS ->{ + FunctionBuildConfig.appIdentityMode = "${AppIdentityModeUtils.BUS}_${identity}_${model}" + OchSPManager.putString(OCHPRODUCT,AppIdentityModeUtils.BUS) + } + + Product.SHUTTLE -> { + FunctionBuildConfig.appIdentityMode = "${AppIdentityModeUtils.SHUTTLE}_${identity}_${model}" + OchSPManager.putString(OCHPRODUCT,AppIdentityModeUtils.SHUTTLE) + } + + Product.CHARTER -> { + FunctionBuildConfig.appIdentityMode = "${AppIdentityModeUtils.CHARTER}_${identity}_${model}" + OchSPManager.putString(OCHPRODUCT,AppIdentityModeUtils.CHARTER) + } + + Product.SCHEDULED -> { + FunctionBuildConfig.appIdentityMode = "${AppIdentityModeUtils.SCHEDULED}_${identity}_${model}" + OchSPManager.putString(OCHPRODUCT,AppIdentityModeUtils.SCHEDULED) + } + Product.SWEEPER -> { + FunctionBuildConfig.appIdentityMode = "${AppIdentityModeUtils.SWEEPER}_${identity}_${model}" + OchSPManager.putString(OCHPRODUCT,AppIdentityModeUtils.SWEEPER) + } + } + ScreenHelper.setScreenConfig(AbsMogoApplication.getApp()) + CallerDevaToolsManager.updateAppChannel() + // 加入启动统计 + val mStartParams: HashMap = HashMap() + mStartParams["start_time"] = TimeUtils.getNowMills() + mStartParams["app_version"] = AppUtils.getAppVersionName() + mStartParams["app_identity_mode"] = FunctionBuildConfig.appIdentityMode + MogoAnalyticUtils.track("app_start_time", mStartParams) + } + + private fun onVehicleChange(vehicle: Vehicle) { + val tempInfo = FunctionBuildConfig.appIdentityMode + val (product, identity, model) = AppIdentityModeUtils.getInfo(tempInfo) + FunctionBuildConfig.appIdentityMode = "${product}_${identity}_${vehicle.code}" + OchSPManager.putString(OCHVEHICLE,vehicle.code) + ScreenHelper.setScreenConfig(AbsMogoApplication.getApp()) + + if (vehicle == Vehicle.B2 && AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { + BizLoopManager.runInMainThread{ + val orientation = ActivityUtils.getTopActivity().resources.configuration.orientation + if(orientation!=Configuration.ORIENTATION_PORTRAIT){ + ActivityUtils.getTopActivity().requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT + } + } + }else{ + val orientation = ActivityUtils.getTopActivity().resources.configuration.orientation + if(orientation==Configuration.ORIENTATION_PORTRAIT){ + BizLoopManager.runInMainThread{ + ActivityUtils.getTopActivity().requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE + } + } + } + + CallerDevaToolsManager.updateAppChannel() + OchChainLogManager.writeChainLogInit("车辆信息","修改车型${tempInfo}--->${FunctionBuildConfig.appIdentityMode}") + } + + /** + * 向乘客端发送登录信息 + */ + fun sendLogin2Client(count: Int) { + if(count>3){ + return + } + if (loginInfo==null) { + RxUtils.createSubscribeOnOwnThread { + sendLogin2Client(count+1) + } + }else{ + val toJson = GsonUtils.toJson(loginInfo) + val msg = LoginInfo2Client(toJson,ProjectUtils.getProjectType(),EnvUtils.getEnvType(),FunctionBuildConfig.isOffLine) + LanSocketManager.sendMsgToClient(msg) + } + + } + +} diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/bean/DriverStatusQueryRespBean.java b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/bean/DriverStatusQueryRespBean.java index 48966c7b5b..62a4e4d267 100644 --- a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/bean/DriverStatusQueryRespBean.java +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/bean/DriverStatusQueryRespBean.java @@ -1,7 +1,6 @@ package com.mogo.och.biz.login.bean; import com.mogo.eagle.core.data.BaseData; -import com.mogo.och.common.module.biz.login.LoginInfo; /** * Created by pangfan on 2021/8/19 diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/bean/LoginInfo.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/bean/LoginInfo.kt new file mode 100644 index 0000000000..d82360ba95 --- /dev/null +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/bean/LoginInfo.kt @@ -0,0 +1,123 @@ +package com.mogo.och.biz.login.bean + +import com.mogo.och.common.module.biz.login.bean.OchBizInfo +import com.mogo.och.common.module.biz.login.bean.OchCarInfo +import com.mogo.och.common.module.biz.login.bean.OchLoginInfo +import java.util.Objects + +class LoginInfo { + var driverStatus: Int = 0 //1登录,0登出 + var servingStatus: Int = 0 //1接单中,0暂停接单 + var businessType: Int = 0 //9: taxi. 10: bus公交 11:接驳 13:包车 + var orderNo: String? = null + var purpose: Int = 0 // 1 运营, 2 测试, 3演示 + var sn: String? = null + var plateNumber: String? = null //车牌号 + var phone: String? = null //手机号 + var lineId: Long? = null //线路id + var taskId: Long? = null //任务id + var siteId: Long? = null //站点id 包车使用 + var currentSite: Long? = null //当前站点 接驳、公交、班车使用 + var leaving: Boolean? = null // 当前站点是否出发 + var shiftsId: Long? = null //模板id + var taskDate: Long? = null // 任务或模板的日期 + var vin: String? = null //车辆唯一识别码 + var cityCode: String? = null //城市编码 + var brand: String? = null //东风 + + // + // E70 东风 H9 红旗 + // B2 B1 M1 + var carModel: String? = null + var photos: String? = null //车身照片: + var tenantId: Long = 0 //租户id: + var driverId: Long = 0 + + var businessStatus: Long = 0 //????? + + fun toOchBizInfo(): OchBizInfo { + return OchBizInfo( + businessType, + orderNo?:"", + servingStatus, + lineId?:0, + taskId?:0, + currentSite?:0, + leaving?:false, + shiftsId?:0, + taskDate?:0, + siteId?:0, + businessStatus + ) + } + + fun toOchCarInfo(): OchCarInfo { + return OchCarInfo(plateNumber,vin,cityCode,brand,carModel,photos,tenantId) + } + + fun toOchLoginInfo(): OchLoginInfo { + return OchLoginInfo( + driverStatus, + purpose, + sn?:"", + phone?:"", + driverId + ) + } + + + override fun toString(): String { + return "LoginInfo{" + + "driverStatus=" + driverStatus + + ", servingStatus=" + servingStatus + + ", businessType=" + businessType + + ", orderNo='" + orderNo + '\'' + + ", purpose=" + purpose + + ", sn='" + sn + '\'' + + ", plateNumber='" + plateNumber + '\'' + + ", phone='" + phone + '\'' + + ", lineId=" + lineId + + ", taskId=" + taskId + + ", siteId=" + siteId + + ", vin='" + vin + '\'' + + ", cityCode='" + cityCode + '\'' + + ", brand='" + brand + '\'' + + ", carModel='" + carModel + '\'' + + ", photos='" + photos + '\'' + + ", tenantId=" + tenantId + + ", driverId=" + driverId + + ", businessStatus=" + businessStatus + + '}' + } + + override fun equals(o: Any?): Boolean { + if (this === o) return true + if (o == null || javaClass != o.javaClass) return false + + val loginInfo = o as LoginInfo + return driverStatus == loginInfo.driverStatus && servingStatus == loginInfo.servingStatus && businessType == loginInfo.businessType && purpose == loginInfo.purpose && tenantId == loginInfo.tenantId && driverId == loginInfo.driverId && businessStatus == loginInfo.businessStatus && orderNo == loginInfo.orderNo && sn == loginInfo.sn && plateNumber == loginInfo.plateNumber && phone == loginInfo.phone && lineId == loginInfo.lineId && taskId == loginInfo.taskId && siteId == loginInfo.siteId && vin == loginInfo.vin && cityCode == loginInfo.cityCode && brand == loginInfo.brand && carModel == loginInfo.carModel && photos == loginInfo.photos + } + + override fun hashCode(): Int { + var result = driverStatus + result = 31 * result + servingStatus + result = 31 * result + businessType + result = 31 * result + Objects.hashCode(orderNo) + result = 31 * result + purpose + result = 31 * result + Objects.hashCode(sn) + result = 31 * result + Objects.hashCode(plateNumber) + result = 31 * result + Objects.hashCode(phone) + result = 31 * result + Objects.hashCode(lineId) + result = 31 * result + Objects.hashCode(taskId) + result = 31 * result + Objects.hashCode(siteId) + result = 31 * result + Objects.hashCode(vin) + result = 31 * result + Objects.hashCode(cityCode) + result = 31 * result + Objects.hashCode(brand) + result = 31 * result + Objects.hashCode(carModel) + result = 31 * result + Objects.hashCode(photos) + result = 31 * result + java.lang.Long.hashCode(tenantId) + result = 31 * result + java.lang.Long.hashCode(driverId) + result = 31 * result + java.lang.Long.hashCode(businessStatus) + return result + } +} diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/callback/ILoginViewCallback.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/callback/ILoginViewCallback.kt index c624511a53..f20f6bd9fa 100644 --- a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/callback/ILoginViewCallback.kt +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/callback/ILoginViewCallback.kt @@ -6,7 +6,7 @@ import com.mogo.och.common.module.manager.socket.lan.bean.ProjectType import com.mogo.och.common.module.manager.socket.lan.bean.VehicleType interface ILoginViewCallback { - fun showErrorInfo(errorInfo: String) + fun showErrorInfo(errorInfo: String){} fun checkAllEnv( reason:String diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/callback/ITaxiLoginCallback.java b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/callback/ITaxiLoginCallback.java index 1274365bce..092fd56d54 100644 --- a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/callback/ITaxiLoginCallback.java +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/callback/ITaxiLoginCallback.java @@ -6,8 +6,7 @@ package com.mogo.och.biz.login.callback; * Model->Presenter回调:订单相关(进行中/待服务单变更,当前进行单状态变更,新到预约单,抢单,抢单结果状态等等) */ public interface ITaxiLoginCallback { - void getPhoneCodeSuccess(); - default void searchStatusSuccess(){} + default void getPhoneCodeSuccess(){} - void netErrorCallback(); + default void netErrorCallback(){} } diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/model/LoginModel.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/model/LoginModel.kt index 20e84a4084..58d2461994 100644 --- a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/model/LoginModel.kt +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/model/LoginModel.kt @@ -11,17 +11,12 @@ import com.mogo.commons.storage.SharedPrefsMgr import com.mogo.commons.utils.MogoAnalyticUtils import com.mogo.eagle.core.data.BaseData import com.mogo.eagle.core.data.config.FunctionBuildConfig -import com.mogo.eagle.core.function.call.och.CallerEagleBaseFunctionCall4OchManager -import com.mogo.eagle.core.utilcode.mogo.Product -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d -import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_OCHCOMMON -import com.mogo.eagle.core.utilcode.util.DateTimeUtils -import com.mogo.eagle.core.utilcode.util.GsonUtils import com.mogo.eagle.core.utilcode.util.NetworkUtils import com.mogo.och.biz.R -import com.mogo.och.biz.login.LoginConst +import com.mogo.och.biz.login.LoginServiceManager import com.mogo.och.biz.login.bean.DriverStatusQueryRespBean import com.mogo.och.biz.login.bean.TaxiLoginReqBean import com.mogo.och.biz.login.bean.TaxiLoginRespBean @@ -29,19 +24,14 @@ import com.mogo.och.biz.login.bean.TaxiLogoutReqBean import com.mogo.och.biz.login.callback.ITaxiLoginCallback import com.mogo.och.biz.login.net.OchCommonServiceManager import com.mogo.och.bridge.autopilot.location.OchLocationManager -import com.mogo.och.common.module.biz.login.LoginStatusEnum -import com.mogo.och.common.module.biz.login.LoginStatusEnum.Companion.valueOf +import com.mogo.och.biz.login.bean.LoginInfo import com.mogo.och.common.module.biz.login.LoginStatusManager import com.mogo.och.common.module.manager.cache.ISpCallback import com.mogo.och.common.module.manager.cache.OchSPManager import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager -import com.mogo.och.common.module.manager.socket.lan.bean.BusCacheKey -import com.mogo.och.common.module.manager.socket.lan.bean.LoginCacheStatus import com.mogo.och.common.module.network.OchCommonServiceCallback -import com.mogo.och.common.module.utils.DateTimeUtil import com.mogo.och.common.module.utils.ToastUtilsOch import com.mogo.och.common.module.wigets.toast.ToastCharterUtils -import com.mogo.och.data.manager.cache.CacheDataManager import io.reactivex.Observable import io.reactivex.disposables.Disposable import java.util.concurrent.TimeUnit @@ -66,17 +56,20 @@ object LoginModel { private val mNetWorkIntentListener = IMogoIntentListener { intentStr, _ -> d(TAG, "onIntentReceived = %s", intentStr) if (ConnectivityManager.CONNECTIVITY_ACTION == intentStr) { - if (NetworkUtils.isConnected(mContext)) { + if (NetworkUtils.isConnected(mContext) + && AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { // 网络链接成功可以先读取本地再获取服务器 queryCarStatus() } } } - private val snChangeListener = object :ISpCallback{ + private val snChangeListener = object : ISpCallback { override fun snChange() { d(TAG, "sn 发生变化${OchSPManager.getSn()}") - queryCarStatus(false) + if(AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + queryCarStatus(false) + } } } @@ -86,26 +79,18 @@ object LoginModel { .registerIntentListener(ConnectivityManager.CONNECTIVITY_ACTION, mNetWorkIntentListener) } - fun init(context: Context) { - - } - fun hasInit(): Boolean { return iTaxiLoginCallback != null } - fun getiTaxiLoginCallback(): ITaxiLoginCallback? { - return iTaxiLoginCallback - } - fun setiTaxiLoginCallback(iTaxiLoginCallback: ITaxiLoginCallback?) { - d(TAG,"setiTaxiLoginCallback") - OchSPManager.addListener(TAG,snChangeListener) + d(TAG, "setiTaxiLoginCallback") + OchSPManager.addListener(TAG, snChangeListener) LoginModel.iTaxiLoginCallback = iTaxiLoginCallback } fun release() { - d(TAG,"release") + d(TAG, "release") OchSPManager.remove(TAG) iTaxiLoginCallback = null } @@ -114,11 +99,11 @@ object LoginModel { * 获取手机验证码 */ fun getPhoneCode(phone: String?) { - if(mContext==null){ - OchChainLogManager.writeChainLog("登录页面","获取验证码 mContext${mContext}") - }else { + if (mContext == null) { + OchChainLogManager.writeChainLog("登录页面", "获取验证码 mContext${mContext==null}") + } else { mContext?.let { - OchChainLogManager.writeChainLog("登录页面","网络请求去获取验证码") + OchChainLogManager.writeChainLog("登录页面", "网络请求去获取验证码") OchCommonServiceManager.getPhoneCode(it, phone, object : OchCommonServiceCallback { override fun onSuccess(data: BaseData?) { @@ -188,48 +173,43 @@ object LoginModel { /** * 接单状态和登录状态查询 - * 1、初始化查询 - * 2、错误重试 - * 3、错误重试 - * 4、登出后重试 - * 5、变更出车状态查下 - * 6、变更出车状态查下 - * 7、网络状态变更后查询 - * 8、登录页面关闭后查下状态 + * 1、司机端登录成功后开启2分钟定时请求登录状态 + * 2、对外提供查询登录状态 + * 3、网络状态发生变化后查询 + * 4、sn 发生变化后查询 + * 5、登录成功后主动查询 + * 6、错误重试 + * 7、错误重试 + * 8、登出后重试 */ - fun queryCarStatus(readCatche:Boolean = true) { + fun queryCarStatus(readCatche: Boolean = true) { mContext?.let { - Log.d(TAG,"设置源:queryCarStatus") - if(readCatche){ - val logingInfoJson = OchSPManager.getString(loginInfoKey) - val timeText = DateTimeUtils.getTimeText(DateTimeUtils.yyyy_MM_dd) - logingInfoJson?.let {logininfo-> - if(logininfo.startsWith(timeText)){ - val json = logingInfoJson.replace(timeText,"" ) - val oldLoginInfo = GsonUtils.fromJson(json, DriverStatusQueryRespBean::class.java) - go2LoginInfo(oldLoginInfo,"缓存获取") - } - } + Log.d(TAG, "设置源:queryCarStatus") + if (readCatche) { + val loginInfo = LoginServiceManager.getLoginInfo() + go2LoginInfo(loginInfo,"缓存获取") } - OchCommonServiceManager.queryDriverServiceStatus(it, object : OchCommonServiceCallback { - override fun onSuccess(data: DriverStatusQueryRespBean?) { + OchCommonServiceManager.queryDriverServiceStatus( + it, + object : OchCommonServiceCallback { + override fun onSuccess(data: DriverStatusQueryRespBean) { val map: MutableMap = HashMap() map["msg"] = data.toString() - MogoAnalyticUtils.track("QueryCarStatus",map) - go2LoginInfo(data,"接口获取") + MogoAnalyticUtils.track("QueryCarStatus", map) + go2LoginInfo(data.data, "接口获取") } override fun onError() { val map: MutableMap = HashMap() map["msg"] = "网络错误" - MogoAnalyticUtils.track("QueryCarStatus",map) + MogoAnalyticUtils.track("QueryCarStatus", map) if (!NetworkUtils.isConnected(mContext)) { ToastCharterUtils.showToastShort(mContext!!.getString(R.string.network_error_tip)) } else { ToastCharterUtils.showToastShort(mContext!!.getString(R.string.request_error_tip)) } - LoginStatusManager.setLoginError(-10012,"网络错误") + LoginStatusManager.setLoginError(-10012, "网络错误") // 依赖参数 subscribe = Observable.timer(5, TimeUnit.SECONDS) .subscribe { _: Long? -> queryCarStatus(readCatche) } @@ -239,9 +219,9 @@ object LoginModel { val map: MutableMap = HashMap() map["msg"] = msg map["code"] = code - MogoAnalyticUtils.track("QueryCarStatus",map) + MogoAnalyticUtils.track("QueryCarStatus", map) - LoginStatusManager.setLoginError(code,"msg:${msg}") + LoginStatusManager.setLoginError(code, "msg:${msg}") ToastUtilsOch.showWithCodeMessage(code, msg) // 依赖参数 subscribe = Observable.timer(3, TimeUnit.SECONDS) @@ -249,7 +229,6 @@ object LoginModel { // if (code == OchCommonConst.WAIT_TAKEN) { // // } else { - loginFail(LoginStatusManager.isLogin()) // } } }) @@ -257,34 +236,10 @@ object LoginModel { } @Synchronized - private fun go2LoginInfo(data: DriverStatusQueryRespBean?, source: String) { - d(TAG,"设置源:${source}") + private fun go2LoginInfo(data: LoginInfo?, source: String) { + d(TAG, "设置源:${source}") data?.let { - LoginStatusManager.setLoginInfo(data.data) - } - if (FunctionBuildConfig.ochdebug) { - return - } - if (null != data && 0 == data.code) { - // 不用登录也可以获得支持的业务模式 - LoginStatusManager.setBusinessType(data.data.businessType) - iTaxiLoginCallback?.searchStatusSuccess() - // 后台已登录 - if (!FunctionBuildConfig.isOffLine) { - if (valueOf(data.data.driverStatus) == LoginStatusEnum.Login) { - // 业务不支持 去退出登录 - if (!LoginStatusManager.checkBusiness(data.data.businessType)) { - LoginStatusManager.loginOut() - return - } - } - LoginStatusManager.setLoginStatus(data.data.driverStatus) - } - val timeText = DateTimeUtils.getTimeText(DateTimeUtils.yyyy_MM_dd) - val loginInfo4Json = GsonUtils.toJson(data) - OchSPManager.putString(loginInfoKey,timeText+loginInfo4Json) - LoginStatusManager.setOpenOrderType(data.data.servingStatus) - d(TAG, "登录信息:$data") + LoginServiceManager.setLoginInfo(data) loginSuccess(data) } } @@ -292,18 +247,11 @@ object LoginModel { // 登出 fun logout() { val location4Login = TaxiLogoutReqBean.Location4Login() - if (FunctionBuildConfig.isOffLine) { - d(TAG, "离线模式登录后退出 setLoginStatus:${LoginStatusEnum.Logout}") - LoginStatusManager.setLoginStatus(LoginStatusEnum.Logout) - FunctionBuildConfig.isOffLine = false - return - } OchCommonServiceManager.logout( mContext!!, location4Login, object : OchCommonServiceCallback { override fun onSuccess(data: BaseData?) { if (null != data && 0 == data.code) { - loginFail(false) OchSPManager.remove(loginInfoKey) // 退出登录成功需要查询新的 queryCarStatus(false) @@ -320,44 +268,27 @@ object LoginModel { override fun onFail(code: Int, msg: String) { ToastUtilsOch.showWithCodeMessage(code, msg) - if(!LoginStatusManager.isLogin()){ - LoginStatusManager.invokeLBusinessTypeChangeDebug(Product.NONE) - } } }) } - fun loginSuccess(data: DriverStatusQueryRespBean?) { - d(TAG, "loginSuccess:${LoginStatusManager.isLogin()}") - if (LoginStatusManager.isLogin()) { - SharedPrefsMgr.getInstance().putString("och_account", data?.data?.phone) + fun loginSuccess(data: LoginInfo?) { + d(TAG, "loginSuccess:${LoginServiceManager.isLogin()}") + if (LoginServiceManager.isLogin()) { + SharedPrefsMgr.getInstance().putString("och_account", data?.phone) } else { SharedPrefsMgr.getInstance().putString("och_account", "") } - data?.data?.driverStatus?.let { updateLoginLocalStatus(it) } - } - - private fun updateLoginLocalStatus(loginStatus: Int = 0) { - val loginCacheStatus = LoginCacheStatus(loginStatus, DateTimeUtil.getCurrentTimeStamp()) - mContext?.let { - CacheDataManager.instance.putCacheData( - it, BusCacheKey.BUS_LOGIN_STATUS_CACHE, - GsonUtils.toJson(loginCacheStatus)) - } - } - - - fun loginFail(isLogin: Boolean) { - d(TAG, "loginFail:$isLogin") - updateLoginLocalStatus(0) } fun gotoOfflineMode() { FunctionBuildConfig.isOffLine = true - d(TAG, "离线模式登录 setLoginStatus:${LoginStatusEnum.Login}") - LoginStatusManager.setLoginStatus(LoginStatusEnum.Login) - CallerEagleBaseFunctionCall4OchManager.setOchLoginNo(LoginConst.OFFLINEPHONE) + var loginInfo = LoginServiceManager.getLoginInfo() + if(loginInfo==null){ + loginInfo = LoginInfo() + } + LoginServiceManager.setLoginInfo(loginInfo) } } \ No newline at end of file diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/net/OchCommonServiceManager.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/net/OchCommonServiceManager.kt index 254316f008..c863b3a7d4 100644 --- a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/net/OchCommonServiceManager.kt +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/net/OchCommonServiceManager.kt @@ -77,7 +77,7 @@ object OchCommonServiceManager { location4Login: TaxiLoginReqBean.Location4Login, callback: OchCommonServiceCallback? ) { - CallerLogger.d(TAG, "gotoLoginBycode:通过手机验证码登录:${phone}---${code}"); + CallerLogger.d(TAG, "gotoLoginBycode:通过手机验证码登录:${phone}---${code}") val sn = OchSPManager.getSn() if (ProjectUtils.isMogo()) { ochLoginServiceMogo.gotoLoginBycode( @@ -103,7 +103,7 @@ object OchCommonServiceManager { location4Login: TaxiLogoutReqBean.Location4Login?, callback: OchCommonServiceCallback? ) { - CallerLogger.d(TAG, "logout:登出"); + CallerLogger.d(TAG, "logout:登出") if (ProjectUtils.isMogo()) { ochLoginServiceMogo.logout( MoGoAiCloudClientConfig.getInstance().serviceAppId, @@ -143,14 +143,14 @@ object OchCommonServiceManager { LoginLanPassengerSocket.driverSn } if(sn.isNullOrEmpty()){ - CallerLogger.d(TAG, "queryDriverServiceStatus:查询登录状态 没有有效的sn"); + CallerLogger.d(TAG, "queryDriverServiceStatus:查询登录状态 没有有效的sn") return } if(FunctionBuildConfig.ochdebug){ - CallerLogger.d(TAG, "queryDriverServiceStatus:查询登录状态 ochdebug模式"); + CallerLogger.d(TAG, "queryDriverServiceStatus:查询登录状态 ochdebug模式") return } - CallerLogger.d(TAG, "queryDriverServiceStatus:查询登录状态${sn}"); + CallerLogger.d(TAG, "queryDriverServiceStatus:查询登录状态${sn}") if (ProjectUtils.isMogo()) { ochLoginServiceMogo.queryDriverServiceStatusAndLoginStatus( MoGoAiCloudClientConfig.getInstance().serviceAppId, diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/presenter/LoginPassengerPresenter.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/presenter/LoginPassengerPresenter.kt index ce13488eca..0c63aac35b 100644 --- a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/presenter/LoginPassengerPresenter.kt +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/presenter/LoginPassengerPresenter.kt @@ -26,7 +26,6 @@ class LoginPassengerPresenter(view: LoginPassengerFragment?) : Presenter(view), ITaxiLoginCallback { +class LoginPresenter(view: LoginFragment?) : Presenter(view), ITaxiLoginCallback, + ILoginCallback { private var countDownDisposable: Disposable? = null - private val TAG = LoginPresenter::class.java.simpleName - - private var phone:String?=null - private var code:String?=null + private val TAG = M_OCHCOMMON+LoginPresenter::class.java.simpleName init { initListeners() - CallerLogger.d(SceneConstant.M_TAXI + TAG, "网约车-Init") + CallerLogger.d(TAG, "网约车-Init") } private fun initListeners() { - LoginModel.init(AbsMogoApplication.getApp()) LoginModel.setiTaxiLoginCallback(this) + LoginStatusManager.addListener(TAG,this) } + override fun onProductChange(businessEnum: Product?) { + mView?.setBg() + } + override fun onVehicleChage(vehicle: Vehicle?) { + mView?.setBg() + } fun getPhoneCode(phone:String){ OchChainLogManager.writeChainLog("登录页面","获取验证码${phone}") @@ -65,7 +74,7 @@ class LoginPresenter(view: LoginFragment?) : Presenter(view), IT override fun onCreate(owner: LifecycleOwner) { super.onCreate(owner) - CallerLogger.d(SceneConstant.M_TAXI + TAG, "网约车-出租车登陆") + CallerLogger.d(TAG, "网约车-出租车登陆") } @@ -88,13 +97,13 @@ class LoginPresenter(view: LoginFragment?) : Presenter(view), IT .observeOn(AndroidSchedulers.mainThread()) .subscribe({ mView?.setCountDownText("${it}s",false) - CallerLogger.d(SceneConstant.M_TAXI_P + TAG, "倒计时:$it") + CallerLogger.d(TAG, "倒计时:$it") }, { - CallerLogger.d(SceneConstant.M_TAXI_P + TAG, "倒计时onError:${it}") + CallerLogger.d(TAG, "倒计时onError:${it}") it.printStackTrace() mView?.setCountDownText(AbsMogoApplication.getApp().getString(R.string.module_och_taxi_login_get_code),true) }, { - CallerLogger.d(SceneConstant.M_TAXI_P + TAG, "倒计时onComplete") + CallerLogger.d(TAG, "倒计时onComplete") mView?.setCountDownText(AbsMogoApplication.getApp().getString(R.string.module_och_taxi_login_get_code),true) }) } @@ -116,25 +125,8 @@ class LoginPresenter(view: LoginFragment?) : Presenter(view), IT gotoOfflineMode() return } - // 需要实时查询新的 - LoginModel.queryCarStatus(false) + LoginModel.gotoLogin(phone, code) mView?.closeSoftInput() - this.phone = phone - this.code = code - } - - override fun searchStatusSuccess() { - if (StringUtils.isEmpty(phone) || StringUtils.isEmpty(code)) { - return - } - if(!LoginStatusManager.checkBusiness(LoginStatusManager.getBusInessType().code)){ - return - } - if(!StringUtils.isEmpty(phone)&&!StringUtils.isEmpty(code)) { - LoginModel.gotoLogin(phone!!, code!!) - } - this.phone = null - this.code = null } override fun netErrorCallback() { diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/ui/LoginFragment.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/ui/LoginFragment.kt index 2337e1ca62..8805ad9bb4 100644 --- a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/ui/LoginFragment.kt +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/ui/LoginFragment.kt @@ -257,11 +257,7 @@ class LoginFragment : MvpFragment(), ILoginView // 司机屏不用处理 只处理 后台返回的业务模型就行 } - override fun onResume() { - biz_cl_driver_main?.viewTreeObserver?.addOnGlobalLayoutListener(onlayoutListener) - super.onResume() - CallerIpcConnectStateToastManager.loginFragment(true) - CallerLogger.d(TAG, "onResume") + fun setBg(){ context?.let { val videoUrl:String if (AppIdentityModeUtils.isT1T2(FunctionBuildConfig.appIdentityMode)) { @@ -347,6 +343,14 @@ class LoginFragment : MvpFragment(), ILoginView } } + override fun onResume() { + biz_cl_driver_main?.viewTreeObserver?.addOnGlobalLayoutListener(onlayoutListener) + super.onResume() + CallerIpcConnectStateToastManager.loginFragment(true) + CallerLogger.d(TAG, "onResume") + setBg() + } + override fun onPause() { biz_cl_driver_main?.viewTreeObserver?.removeOnGlobalLayoutListener(onlayoutListener) super.onPause() diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/ui/LoginPassengerFragment.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/ui/LoginPassengerFragment.kt index d008108b09..839ca92329 100644 --- a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/ui/LoginPassengerFragment.kt +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/ui/LoginPassengerFragment.kt @@ -1,26 +1,29 @@ package com.mogo.och.biz.login.ui import android.content.res.Configuration +import android.util.TypedValue import android.view.View -import androidx.appcompat.widget.AppCompatTextView import androidx.constraintlayout.widget.ConstraintLayout import com.mogo.commons.mvp.MvpFragment -import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager import com.mogo.eagle.core.function.hmi.ui.setting.ToggleDebugView -import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger -import com.mogo.eagle.core.utilcode.util.DeviceUtils import com.mogo.eagle.core.utilcode.util.ScreenUtils import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.mogo.och.biz.BuildConfig import com.mogo.och.biz.R import com.mogo.och.biz.login.callback.ILoginViewCallback import com.mogo.och.biz.login.presenter.LoginPassengerPresenter -import com.mogo.och.biz.login.ui.debugview.BusinessView import com.mogo.och.common.module.biz.lansocket.LoginLanPassengerSocket import com.mogo.och.common.module.utils.FlavorUtils +import kotlinx.android.synthetic.main.biz_login_passenger_view.actv_app_version +import kotlinx.android.synthetic.main.biz_login_passenger_view.actv_connect_status +import kotlinx.android.synthetic.main.biz_login_passenger_view.biz_cl_passenger_main +import kotlinx.android.synthetic.main.biz_login_view.bv_switch_business import kotlinx.android.synthetic.main.biz_login_view.eiv_Info +import me.jessyan.autosize.AutoSizeCompat +import me.jessyan.autosize.utils.AutoSizeUtils +import kotlin.math.abs /** @@ -29,36 +32,53 @@ import kotlinx.android.synthetic.main.biz_login_view.eiv_Info */ class LoginPassengerFragment : MvpFragment(), ILoginViewCallback { - - private var biz_cl_passenger_main: ConstraintLayout?=null - private var biz_actv_login_show_sn: AppCompatTextView?=null - private var bv_switch_business: BusinessView?=null - private var actv_app_version: AppCompatTextView?=null - private var actv_connect_status: AppCompatTextView?=null - + private val statusList = mutableListOf() override fun getLayoutId(): Int { + return R.layout.biz_login_passenger_view + } - if (AppIdentityModeUtils.isM1(FunctionBuildConfig.appIdentityMode) && - AppIdentityModeUtils.isPassenger((FunctionBuildConfig.appIdentityMode))) { - return R.layout.biz_login_passenger_view_1920x1080 - } else if (AppIdentityModeUtils.isB2(FunctionBuildConfig.appIdentityMode) && - AppIdentityModeUtils.isPassenger((FunctionBuildConfig.appIdentityMode))) { - return R.layout.biz_login_passenger_view_1080x1920 + private val width2560 = 2560 + private val width1920 = 1920 + + private fun changeUi(){ + val screenWidth = ScreenUtils.getScreenWidth() + val screenHeight = ScreenUtils.getScreenHeight() + + val textSize: Float + val marginBottom: Int + + if(screenWidth>screenHeight){//横屏 + if(abs(screenWidth - width2560) { - actv_business_shuttle.visibility = VISIBLE - } - - "bus" -> { - actv_business_bus.visibility = VISIBLE - } - - "taxi" -> { - actv_business_taxi.visibility = VISIBLE - } - - "charter" -> { - actv_business_charter.visibility = VISIBLE - } - - else -> {} - } + if(visibility== VISIBLE){ + visibility = GONE + }else { + visibility = VISIBLE } } diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/qrcode/QrParse.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/qrcode/QrParse.kt new file mode 100644 index 0000000000..8510b8b560 --- /dev/null +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/qrcode/QrParse.kt @@ -0,0 +1,256 @@ +package com.mogo.och.biz.qrcode + +import com.mogo.eagle.core.utilcode.mogo.Product +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_OCHCOMMON +import com.mogo.eagle.core.utilcode.util.GsonUtils +import com.mogo.eagle.core.utilcode.util.RegexUtils +import com.mogo.och.common.module.biz.scanner.QrBean +import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager +import com.mogo.och.common.module.manager.socket.lan.LanSocketManager +import com.mogo.och.common.module.manager.socket.lan.bean.WriteOffDetialMsg +import java.net.URLDecoder + +object QrParse { + + private const val TAG = "QrParse" + + fun parse(payload: String?): QrBean? { + val queryParameterNames = parseQuery(payload) + return if (queryParameterNames.isNotEmpty()) {// version 1 和 version 2 + parseVersion1to2(queryParameterNames) + } else { + parseVersion3ton(payload) + } + } + + private fun parseVersion3ton(payload: String?): QrBean? { + payload?.let { + try { + val split = it.split(",") + if(split.isEmpty()){ + return null + } + // 业务模式+版本号 + val typeAndVersion92 = split[0] + val tenantId92_head = split[1] + val tenantId92_tail = split[2] + val orderNo92_head = split[3] + val orderNo92_tail = split[4] + val uidCode = split[5] + val pipeCode = split[6] + val phoneCode = split[7] + val lineIdCode = split[8] + val expiryTimeCode = split[9] + val bookingTimeCode = split[10] + val availableTimesCode = split[11] + val ticketSize = split[12].toInt() ?:0 + + val base92ToBase10 = Radix91.base91ToBase10(typeAndVersion92).toString().padStart(3,'0') + val bizTypeCode = base92ToBase10.substring(0,1) + val bizType = Product.getCodeFromWxQr(bizTypeCode) + val version = base92ToBase10.substring(1).toInt() + 2// 0 1 这两个版本在Android端定义 二维码从优化后开始 + + val tenantIdHead = Radix91.base91ToBase10(tenantId92_head).toString() + val tenantIdTail = Radix91.base91ToBase10(tenantId92_tail).toString() + val tenantId = tenantIdHead+tenantIdTail + + val orderNoHead = Radix91.base91ToBase10(orderNo92_head).toString() + val orderNoTail = Radix91.base91ToBase10(orderNo92_tail).toString() + + val orderNo = orderNoHead+orderNoTail + + val uid = uidCode.substring(0, 8) + "-" + + uidCode.substring(8, 12) + "-" + + uidCode.substring(12, 16) + "-" + + uidCode.substring(16, 20) + "-" + + uidCode.substring(20, 32) // 构造一个标准的 UUID 字符串 + + val pipe = if (pipeCode.equals("1")) { + "mogogosafety" + } else { + "ehsafety" + } + val phoneLike = Radix91.base91ToBase10(phoneCode).toString() + val phone = if (RegexUtils.isMobileExact(phoneLike)) { + phoneLike + }else{ + URLDecoder.decode(phoneCode?:"","UTF-8") + } + val lineId = Radix91.base91ToBase10(lineIdCode) + val expiryTime = Radix91.base91ToBase10(expiryTimeCode) + val bookingTime = Radix91.base91ToBase10(bookingTimeCode) + val availableTimes = Radix91.base91ToBase10(availableTimesCode).toInt() + + // 顺序可变部分 + val shiftsId:Long + val startStationId:Long + val ticketName:String + when (Product.valueOf(bizType)) { + Product.BUS -> { + shiftsId = 0 + val startStationIdCode = split[13] + startStationId = Radix91.base91ToBase10(startStationIdCode) + ticketName = "" + } + Product.SHUTTLE -> { + shiftsId = 0 + val ticketNameCode = split[13] + ticketName =when (ticketNameCode) { + "0" -> { + "单站票" + } + "1" -> { + "多站票" + } + "2" -> { + "全站票" + } + "3" -> { + "通勤票" + } + else -> { + URLDecoder.decode(ticketNameCode?:"","UTF-8") + } + } + startStationId = 0 + } + Product.SCHEDULED -> { + val shiftsIdCode = split[14] + shiftsId = Radix91.base91ToBase10(shiftsIdCode) + val ticketNameCode = split[13] + ticketName =when (ticketNameCode) { + "0" -> { + "单站票" + } + "1" -> { + "多站票" + } + "2" -> { + "全站票" + } + "3" -> { + "通勤票" + } + else -> { + URLDecoder.decode(ticketNameCode?:"","UTF-8") + } + } + startStationId = 0 + } + else->{ + shiftsId = 0 + startStationId = 0 + ticketName = "" + } + } + + return QrBean(version, orderNo, uid, phone, bizType, pipe, expiryTime, + bookingTime, lineId, availableTimes, ticketSize, ticketName, tenantId.toLong(), + shiftsId, startStationId + ) + }catch (e:Exception){ + e.printStackTrace() + } + + } + return null + } + + /** + * 解析第一和第二版本的二维码 + */ + private fun parseVersion1to2(params: MutableMap): QrBean? { + val expiryTime = params["expiryTime"] + val bookingTime = params["bookingTime"] + val lineId = params["lineId"] + val availableTimes = params["availableTimes"] + val orderNo = params["orderNo"] + val uid = params["uid"] + val phone = params["phone"] + val ticketSize = params["ticketSize"] + val ticketName = params["ticketName"] + val type = params["type"] + val pipe = params["pipe"] + val startStationId = params["startStationId"] + val tenantId = params["tenantId"] + val shiftsId = params["shiftsId"] + + if (orderNo is String && uid is String) { + var phoneNum = "" + if (phone is String) { + if (RegexUtils.isMobileExact(phone)) { + phoneNum = phone + }else{ + phoneNum = phone + } + } + var tempType = 0 + if (type is String) { + when (type) { + "shuttle" -> { + tempType = 11 + } + + "bus" -> { + tempType = 10 + } + + else -> { + tempType = type.toInt() ?: 0 + } + } + } else { + tempType = type?.toInt() ?: 0 + } + try { + val version = if (expiryTime != null && bookingTime != null && lineId != null) { + 1 + } else { + 0 + } + return QrBean( + version, orderNo, uid, phoneNum, tempType, pipe?:"", + expiryTime?.toLong() ?: 0, bookingTime?.toLong() ?: 0, + lineId?.toLong() ?: 0, availableTimes?.toInt() ?: 0, + ticketSize?.toInt() ?: 0, URLDecoder.decode(ticketName?:"","UTF-8"), + tenantId?.toLong() ?: 0, shiftsId?.toLong() ?: 0, + startStationId?.toLong() ?: 0 + ) + } catch (e: Exception) { + e.printStackTrace() + CallerLogger.d(M_OCHCOMMON + TAG, "") + // 通知司机屏二维码错误 + val writeOffDetail = WriteOffDetialMsg(code = 3001, msg = "出示错误二维码") + OchChainLogManager.writeChainLogWriteOff("核销失败", "二维码错误+参数错误") + CallerLogger.d( + M_OCHCOMMON + TAG, + "sendTaskDetailsToClients = " + GsonUtils.toJson(writeOffDetail) + ) + LanSocketManager.sendMsgToServer(writeOffDetail) + } + } + return null + } + + private fun parseQuery(query: String?): MutableMap { + val params: MutableMap = HashMap() + if (query != null && !query.isEmpty()) { + val pairs = query.split("&".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray() + if(pairs.size>1) { + for (pair in pairs) { + val indexOfEquals = pair.indexOf("=") + if (indexOfEquals == -1) { + // 键无值 + params[pair] = "" + } else { + val key = pair.substring(0, indexOfEquals) + val value = pair.substring(indexOfEquals + 1) + params[key] = value + } + } + } + } + return params + } +} \ No newline at end of file diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/qrcode/Radix91.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/qrcode/Radix91.kt new file mode 100644 index 0000000000..d811c473ef --- /dev/null +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/qrcode/Radix91.kt @@ -0,0 +1,58 @@ +package com.mogo.och.biz.qrcode + +fun main() { + + val value10 = "337197925358633123".toLong() + val value92 = Radix91.decimalToBase91(value10) + val old = Radix91.base91ToBase10(value92) + println("value10:$value10") + println("value92:$value92") + println("old:$old") + //337197925358633123 + //$#WFaRgz} + + //1879008917469057024 + //3|bnEad7%o + + //1736825612443 + //2}M3l*@ + + //1736784000000 + //2}LF-wM + + //18811539480 + //2{R\zk + +} + +object Radix91 { + val base32Chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^*()_-+=[]{};':./<>?`~|\\" + fun decimalToBase91(decimal: Long): String { + if (decimal == 0L) return "0" + var num = decimal + val base32 = StringBuilder() + while (num > 0) { + val remainder = num % 91 + base32.insert(0, base32Chars[remainder.toInt()]) + num /= 91 + } + return base32.toString() + } + fun base91ToBase10(base92Number: String): Long { + // 定义92进制的字符集 + var base10Number: Long = 0 + var power: Long = 1 + + // 从右到左遍历每一位 + for (char in base92Number.reversed()) { + val index = base32Chars.indexOf(char) + if (index == -1) { + throw IllegalArgumentException("无效的92进制字符: $char") + } + base10Number += index * power + power *= 91 + } + + return base10Number + } +} \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/scnner/ScannerManager.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/qrcode/ScannerManager.kt similarity index 72% rename from OCH/common/common/src/main/java/com/mogo/och/common/module/manager/scnner/ScannerManager.kt rename to OCH/common/biz/src/main/java/com/mogo/och/biz/qrcode/ScannerManager.kt index 257da196a5..33db3c28ca 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/scnner/ScannerManager.kt +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/qrcode/ScannerManager.kt @@ -1,11 +1,9 @@ -package com.mogo.och.common.module.manager.scnner +package com.mogo.och.biz.qrcode -import android.net.Uri -import com.mogo.eagle.core.data.enums.EventTypeEnumNew -import com.mogo.eagle.core.data.msgbox.MsgBoxBean -import com.mogo.eagle.core.data.msgbox.MsgBoxType -import com.mogo.eagle.core.data.msgbox.V2XMsg -import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager.saveMsgBox +import android.content.Context +import com.alibaba.android.arouter.facade.annotation.Route +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS_P @@ -13,10 +11,13 @@ import com.mogo.eagle.core.utilcode.util.GsonUtils import com.mogo.eagle.core.utilcode.util.StringUtils import com.mogo.och.common.module.biz.lansocket.IOchLanPassengerStatusListener import com.mogo.och.common.module.biz.lansocket.LoginLanPassengerSocket -import com.mogo.och.common.module.manager.socket.lan.bean.WriteOffDevicesMsg +import com.mogo.och.common.module.biz.scanner.BindStatus +import com.mogo.och.common.module.biz.scanner.OpenStatus +import com.mogo.och.common.module.biz.scanner.ScannerService +import com.mogo.och.common.module.biz.scanner.StateChangeListener import com.mogo.och.common.module.constant.OchCommonConst +import com.mogo.och.common.module.manager.socket.lan.bean.WriteOffDevicesMsg import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager -import com.mogo.och.common.module.manager.socket.lan.ILanMessageListener import com.mogo.och.common.module.manager.socket.lan.LanSocketManager import com.mogo.och.common.module.manager.socket.lan.bean.DPMsgType import com.mogo.och.common.module.manager.socket.lan.bean.WriteOffDetialMsg @@ -30,13 +31,14 @@ import java.util.concurrent.ConcurrentHashMap import kotlin.properties.Delegates -object ScannerManager : IOchLanPassengerStatusListener { +@Route(path = OchCommonConst.BIZ_SCANNER) +class ScannerManager : ScannerService { private val TAG = "ScannerManager" + private val writeOfDevicefMsg = WriteOfDevicefMsg() - private val stateChanageListeners: ConcurrentHashMap = - ConcurrentHashMap() + private val stateChanageListeners: ConcurrentHashMap = ConcurrentHashMap() private var bindStatus: BindStatus by Delegates.observable(BindStatus.NOTHING) { _, oldV, newV -> if (oldV != newV) { @@ -109,7 +111,7 @@ object ScannerManager : IOchLanPassengerStatusListener { override fun onReceive(data: VerificationData?) { OchChainLogManager.writeChainLogScanner( - TAG + "onActiveDataReceive", + TAG + "ScannerManageronActiveDataReceive", "扫码结果:data:${data}" ) data?.let { @@ -170,54 +172,20 @@ object ScannerManager : IOchLanPassengerStatusListener { } - private val writeOfDevicefMsg = object : ILanMessageListener { - override fun targetLan(): Class = WriteOffDevicesMsg::class.java - override fun onLanMsgReceived(writeOffDevicesMsg: WriteOffDevicesMsg?){ - writeOffDevicesMsg?.let { - if (writeOffDevicesMsg.isConnectScanner != null) { - val reason = if (writeOffDevicesMsg.reason == null) "" else writeOffDevicesMsg.reason!! - if (writeOffDevicesMsg.isConnectScanner==true) { // 链接成功 - saveMsgBox( - MsgBoxBean( - MsgBoxType.V2X, - V2XMsg( - EventTypeEnumNew.TYPE_DEVICE_STATUS_NORMAL.poiType, - reason, - EventTypeEnumNew.TYPE_DEVICE_STATUS_NORMAL.tts, - "" - ) - ) - ) - } else { // 核验失败 - saveMsgBox( - MsgBoxBean( - MsgBoxType.V2X, - V2XMsg( - EventTypeEnumNew.TYPE_DEVICE_STATUS_ABNORMAL.poiType, - reason, - EventTypeEnumNew.TYPE_DEVICE_STATUS_ABNORMAL.tts, - "" - ) - ) - ) - } - } + private val connect2DriverListener = object :IOchLanPassengerStatusListener{ + override fun onDriverConnectChangeListener(isConnect: Boolean) { + if (isConnect) { + sendScannerState() } } } - init { - //监听司机端消息 - LoginLanPassengerSocket.addListener(TAG, this) - // 核销设备信息 - LanSocketManager.registerSocketMessageListener(DPMsgType.TYPE_WRITEOFF_DEVICES_INFO.type,writeOfDevicefMsg) - // 绑定状态 - DevicesManager.addBindStateChangeListener(TAG, onSerialPortListener) - // 核销信息 - DevicesManager.addVerificationListener(TAG, onDeviceVerificationListener) + override fun init(context: Context?) { + } - fun addStateChangeListener(tag: String, listener: StateChangeListener) { + + override fun addStateChangeListener(tag: String, listener: StateChangeListener) { if (stateChanageListeners.containsKey(tag)) { return } @@ -225,30 +193,48 @@ object ScannerManager : IOchLanPassengerStatusListener { listener.stateChange(bindStatus, openStatus) } - fun removeListener(tag:String){ + override fun removeListener(tag:String){ stateChanageListeners.remove(tag) } - override fun onDriverConnectChangeListener(isConnect: Boolean) { - if (isConnect) { - sendScannerState() + + override fun load(){ + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + // 核销设备信息 + LanSocketManager.registerSocketMessageListener(DPMsgType.TYPE_WRITEOFF_DEVICES_INFO.type, writeOfDevicefMsg) + }else{ + //监听和司机端连接消息 + LoginLanPassengerSocket.addListener(TAG, connect2DriverListener) + // 绑定状态 + DevicesManager.addBindStateChangeListener(TAG, onSerialPortListener) + // 核销信息 + DevicesManager.addVerificationListener(TAG, onDeviceVerificationListener) + } + } + + override fun release(){ + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + LanSocketManager.unRegisterSocketMessageListener( + DPMsgType.TYPE_WRITEOFF_DEVICES_INFO.type, + writeOfDevicefMsg + ) + }else{ + //监听司机端消息 + LoginLanPassengerSocket.removeListener(TAG) + // 绑定状态 + DevicesManager.removeBindStateChangeListener(TAG) + // 核销信息 + DevicesManager.removeVerificationListener(TAG) } } fun parseParams(payload: String?) { - val parse = Uri.parse("${OchCommonConst.getShuttleUrl()}?${payload}") - val queryParameterNames = parse.queryParameterNames - val mutableMapOf = mutableMapOf() - queryParameterNames.forEach { - val queryParameter = parse.getQueryParameter(it) - if (it != null && queryParameter != null) { - mutableMapOf[it] = queryParameter - } - } - if (mutableMapOf.isNotEmpty()) { + val qrBean = QrParse.parse(payload) + OchChainLogManager.writeChainLogWriteOff("解析数据","二维码解析数据:$qrBean") + if (qrBean!=null) { if (stateChanageListeners.size > 0) { stateChanageListeners.forEach { - it.value.parseData(mutableMapOf, payload) + it.value.parseData(qrBean) } } } else { @@ -313,16 +299,4 @@ object ScannerManager : IOchLanPassengerStatusListener { } -} - -enum class BindStatus { - BIND_SUCCEED, - BIND_FAILURE_UNINSTALLED, - BIND_FAILURE_NO_PERMISSION_NOT_FOUND, - EXCEPTION, - NOTHING -} - -enum class OpenStatus { - Open, Unopen } \ No newline at end of file diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/qrcode/WriteOfDevicefMsg.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/qrcode/WriteOfDevicefMsg.kt new file mode 100644 index 0000000000..21712067ac --- /dev/null +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/qrcode/WriteOfDevicefMsg.kt @@ -0,0 +1,45 @@ +package com.mogo.och.biz.qrcode + +import com.mogo.eagle.core.data.enums.EventTypeEnumNew +import com.mogo.eagle.core.data.msgbox.MsgBoxBean +import com.mogo.eagle.core.data.msgbox.MsgBoxType +import com.mogo.eagle.core.data.msgbox.V2XMsg +import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager.saveMsgBox +import com.mogo.och.common.module.manager.socket.lan.ILanMessageListener +import com.mogo.och.common.module.manager.socket.lan.bean.WriteOffDevicesMsg + +class WriteOfDevicefMsg : ILanMessageListener { + override fun targetLan(): Class = WriteOffDevicesMsg::class.java + override fun onLanMsgReceived(writeOffDevicesMsg: WriteOffDevicesMsg?){ + writeOffDevicesMsg?.let { + if (it.isConnectScanner != null) { + val reason = it.reason ?: "" + if (it.isConnectScanner==true) { // 链接成功 + saveMsgBox( + MsgBoxBean( + MsgBoxType.V2X, + V2XMsg( + EventTypeEnumNew.TYPE_DEVICE_STATUS_NORMAL.poiType, + reason, + EventTypeEnumNew.TYPE_DEVICE_STATUS_NORMAL.tts, + "" + ) + ) + ) + } else { // 核验失败 + saveMsgBox( + MsgBoxBean( + MsgBoxType.V2X, + V2XMsg( + EventTypeEnumNew.TYPE_DEVICE_STATUS_ABNORMAL.poiType, + reason, + EventTypeEnumNew.TYPE_DEVICE_STATUS_ABNORMAL.tts, + "" + ) + ) + ) + } + } + } + } +} \ No newline at end of file diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/skin/SkinProvider.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/skin/SkinProvider.kt index 1ad1e3f30c..b39a4d9aea 100644 --- a/OCH/common/biz/src/main/java/com/mogo/och/biz/skin/SkinProvider.kt +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/skin/SkinProvider.kt @@ -4,9 +4,12 @@ import android.content.Context import com.alibaba.android.arouter.facade.annotation.Route import com.mogo.commons.env.ProjectUtils import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_OCHCOMMON import com.mogo.och.biz.R import com.mogo.och.biz.skin.bean.SkinRespBean import com.mogo.och.biz.skin.net.OchSkinServiceManager +import com.mogo.och.common.module.biz.login.ILoginCallback +import com.mogo.och.common.module.biz.login.LoginStatusManager import com.mogo.och.common.module.biz.skin.SkinService import com.mogo.och.common.module.constant.OchCommonConst import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager @@ -17,11 +20,21 @@ import com.mogo.skin.SkinManager import com.mogo.skin.utils.FileUtils @Route(path = OchCommonConst.BIZ_SKIN) -class SkinProvider : SkinService { +class SkinProvider : SkinService, ILoginCallback { private var context: Context?= null - private val TAG = "SkinProvider" + private val TAG = M_OCHCOMMON+"SkinProvider" + + init { + d(TAG,"皮肤信息_监听租户") + LoginStatusManager.addListener(TAG,this) + } + + override fun onTenantIdChange(tenantId: Long?) { + d(TAG,"皮肤信息_租户变化重新请求皮肤包") + loadNewSkin() + } override fun loadNewSkin() { OchChainLogManager.writeChainLogSkin("皮肤信息","请求皮肤信息") diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/skin/bean/SkinRespBean.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/skin/bean/SkinRespBean.kt index 097e938c18..ead6bf46e4 100644 --- a/OCH/common/biz/src/main/java/com/mogo/och/biz/skin/bean/SkinRespBean.kt +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/skin/bean/SkinRespBean.kt @@ -1,7 +1,6 @@ package com.mogo.och.biz.skin.bean import com.mogo.eagle.core.data.BaseData -import com.mogo.och.common.module.biz.login.LoginInfo /** * Created by pangfan on 2021/8/19 diff --git a/OCH/common/biz/src/main/res/layout/biz_login_business_view.xml b/OCH/common/biz/src/main/res/layout/biz_login_business_view.xml index 1c6f235c3e..6125e8cca2 100644 --- a/OCH/common/biz/src/main/res/layout/biz_login_business_view.xml +++ b/OCH/common/biz/src/main/res/layout/biz_login_business_view.xml @@ -1,19 +1,34 @@ - + + + + + + + + + app:layout_constraintTop_toBottomOf="@+id/actv_business_sweeper" /> - \ No newline at end of file + \ No newline at end of file diff --git a/OCH/common/biz/src/main/res/layout/biz_login_passenger_view_2560x1600.xml b/OCH/common/biz/src/main/res/layout/biz_login_passenger_view.xml similarity index 97% rename from OCH/common/biz/src/main/res/layout/biz_login_passenger_view_2560x1600.xml rename to OCH/common/biz/src/main/res/layout/biz_login_passenger_view.xml index 7396ad749d..cec017f572 100644 --- a/OCH/common/biz/src/main/res/layout/biz_login_passenger_view_2560x1600.xml +++ b/OCH/common/biz/src/main/res/layout/biz_login_passenger_view.xml @@ -5,7 +5,6 @@ android:id="@+id/biz_cl_passenger_main" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@drawable/biz_login_passenger_2560x1600" app:isUseSkin="true"> @@ -13,12 +12,12 @@ android:id="@+id/actv_connect_status" android:layout_width="0dp" android:layout_height="wrap_content" - android:text="当前状态:连接司机屏中" - android:textColor="@color/white" - android:gravity="center" - android:textSize="@dimen/dp_30" android:layout_marginStart="@dimen/dp_160" android:layout_marginEnd="@dimen/dp_160" + android:gravity="center" + android:text="当前状态:连接司机屏中" + android:textColor="@color/white" + android:textSize="@dimen/dp_30" app:layout_constraintBottom_toTopOf="@+id/actv_app_version" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_chainStyle="packed" @@ -28,10 +27,10 @@ android:id="@+id/actv_app_version" android:layout_width="0dp" android:layout_height="wrap_content" - android:gravity="center" - android:layout_marginBottom="@dimen/dp_70" android:layout_marginStart="@dimen/dp_160" android:layout_marginEnd="@dimen/dp_160" + android:layout_marginBottom="@dimen/dp_70" + android:gravity="center" android:text="版本号:6.4.0" android:textColor="@color/white" android:textSize="@dimen/dp_30" diff --git a/OCH/common/biz/src/main/res/layout/biz_login_passenger_view_1080x1920.xml b/OCH/common/biz/src/main/res/layout/biz_login_passenger_view_1080x1920.xml deleted file mode 100644 index 3c3ec1ee8c..0000000000 --- a/OCH/common/biz/src/main/res/layout/biz_login_passenger_view_1080x1920.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/OCH/common/biz/src/main/res/layout/biz_login_passenger_view_1920x1080.xml b/OCH/common/biz/src/main/res/layout/biz_login_passenger_view_1920x1080.xml deleted file mode 100644 index d9e35d6239..0000000000 --- a/OCH/common/biz/src/main/res/layout/biz_login_passenger_view_1920x1080.xml +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/OCH/common/biz/src/test/java/com/mogo/och/biz/qrcode/QrUnitTest.kt b/OCH/common/biz/src/test/java/com/mogo/och/biz/qrcode/QrUnitTest.kt new file mode 100644 index 0000000000..2676081e7b --- /dev/null +++ b/OCH/common/biz/src/test/java/com/mogo/och/biz/qrcode/QrUnitTest.kt @@ -0,0 +1,79 @@ +package com.mogo.och.biz.qrcode + +import com.mogo.och.common.module.biz.scanner.QrBean +import org.junit.Test + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +open class QrUnitTest { + + @Test + fun testData111() { + println("-----"+Radix91.decimalToBase91( + 1892144642963742720)) + + } + + @Test + fun testData() { + // 构建二维码信息 + val type = 1 + val version = 0 + val typeVersion = Radix91.decimalToBase91("$type${version.toString().padStart(2,'0')}".toLong()) + val tenantId = 233602957696827483 + val tenantldEncode = Radix91.decimalToBase91(tenantId) + val orderNo = 1889600789505798144 + val orderNoEncode = Radix91.decimalToBase91(orderNo) + val uid = "81ab22c914cb0ea286371c0d7e364ab8" + val pipe = "1" + val phone = 18811539480 + val phoneEncode = Radix91.decimalToBase91(phone) + val lineId = 85L + val lineIdEncode = Radix91.decimalToBase91(lineId) + val expiryTime = System.currentTimeMillis() + val expiryTimeEncode = Radix91.decimalToBase91(expiryTime) + val bookingTime = 1739289600000 + val bookingTimeEncode = Radix91.decimalToBase91(bookingTime) + val availableTimes = "1" + val ticketSize = "1" + val ticketName = "%E5%85%A8%E7%AB%99%E7%A5%A8" + val shiftsId = 3422L + val shiftsIdEncode = Radix91.decimalToBase91(shiftsId) +// val startStationId = 3466L +// val startStationIdEncode = Radix91.decimalToBase91(startStationId) + + val qrInfo2 = "$typeVersion,$tenantldEncode,$orderNoEncode,$uid,$pipe,$phoneEncode,$lineIdEncode,$expiryTimeEncode,$bookingTimeEncode,$availableTimes,$ticketSize,$ticketName,$shiftsIdEncode" + + println(qrInfo2) + val qrBean2 = QrParse.parse(qrInfo2) + + println("${type}_${qrBean2?.bizType}") + println("${version}_${qrBean2?.version}") + println("${tenantId}_${qrBean2?.tenantId}") + println("${orderNo}_${qrBean2?.orderNo}") + println("${uid}_${qrBean2?.uid}") + println("${pipe}_${qrBean2?.pipe}") + println("${phone}_${qrBean2?.phone}") + println("${lineId}_${qrBean2?.lineId}") + println("${expiryTime}_${qrBean2?.expiryTime}") + println("${bookingTime}_${qrBean2?.bookingTime}") + println("${availableTimes}_${qrBean2?.availableTimes}") + println("${ticketSize}_${qrBean2?.ticketSize}") + println("${ticketName}_${qrBean2?.ticketName}") + println("${shiftsId}_${qrBean2?.shiftsId}") + //println("${startStationId}_${qrBean2?.startStationId}") + + + val qrInfo1 = "orderNo=1871744897569038336&uid=828aa91f-49a1-f9b3-4526-f58acda9df60&pipe=mogogosafety&phone=houyanli&lineId=134&expiryTime=1735094149070&bookingTime=1735056000000&tenantId=337197925358633123&availableTimes=1&ticketSize=1&ticketName=%E9%80%9A%E5%8B%A4%E7%A5%A8%E3%81%AE&type=14&shiftsId=4249" + val qrBean1 = QrParse.parse(qrInfo1) + println(qrBean1) + + val qrInfo0 = "orderNo=1878747772463988736&uid=4fda39cf-27a7-b49e-52ec-c566c3bc2fb8&type=shuttle&pipe=ehsafety&phone=13534015919" + val qrBean0 = QrParse.parse(qrInfo0) + println(qrBean0) + } + +} \ No newline at end of file diff --git a/OCH/common/bridge/build.gradle b/OCH/common/bridge/build.gradle index de95c8a7eb..769c31b049 100644 --- a/OCH/common/bridge/build.gradle +++ b/OCH/common/bridge/build.gradle @@ -1,6 +1,7 @@ plugins { id 'com.android.library' id 'org.jetbrains.kotlin.android' + id 'kotlin-kapt' id 'kotlin-android-extensions' } @@ -10,6 +11,14 @@ android { minSdkVersion rootProject.ext.android.minSdkVersion testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles "consumer-rules.pro" + + kapt { + useBuildCache = false + arguments { + arg("AROUTER_MODULE_NAME", project.getName()) + } + } + } buildTypes { @@ -50,6 +59,9 @@ dependencies { testImplementation project(':OCH:common:bridge') testImplementation 'junit:junit:4.12' + implementation rootProject.ext.dependencies.arouter + kapt rootProject.ext.dependencies.aroutercompiler + if (Boolean.valueOf(USE_MAVEN_PACKAGE)) { implementation rootProject.ext.dependencies.mogo_core_function_call diff --git a/OCH/common/bridge/src/main/java/com/mogo/och/bridge/BridgeProvider.kt b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/BridgeProvider.kt new file mode 100644 index 0000000000..54f444b221 --- /dev/null +++ b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/BridgeProvider.kt @@ -0,0 +1,96 @@ +package com.mogo.och.bridge + +import android.content.Context +import com.alibaba.android.arouter.facade.annotation.Route +import com.mogo.eagle.core.data.map.MogoLocation +import com.mogo.eagle.core.function.call.base.CallerBase +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_OCHCOMMON +import com.mogo.eagle.core.utilcode.util.CoordinateUtils +import com.mogo.och.bridge.autopilot.location.OchLocationManager +import com.mogo.och.bridge.distance.TrajectoryAndDistanceManager +import com.mogo.och.bridge.bridge.OchBridgeManager +import com.mogo.och.bridge.trajectory.TrajectoryManager +import com.mogo.och.common.module.biz.birdge.BridgeService +import com.mogo.och.common.module.biz.birdge.BridgeListener +import com.mogo.och.common.module.constant.OchCommonConst + + +/** + * eye 桥 + */ +@Route(path = OchCommonConst.BIZ_Bridge) +class BridgeProvider : BridgeService, CallerBase() { + + private var context: Context? = null + + private val tag = M_OCHCOMMON + "BridgeProvider" + + + override fun init(context: Context?) { + this.context = context + OchBridgeManager.load() + TrajectoryManager.load() + } + + override fun setDistanceStation(startLocation: MogoLocation?, endLocation: MogoLocation?, lineId: Long?) { + CallerLogger.d(tag,"distance 设置起始站点的定位") + TrajectoryAndDistanceManager.setStationPoint(startLocation,endLocation,lineId) + } + + override fun distance2Point(gcjLat: Double, gcjLon: Double): Float { + OchLocationManager.getGCJ02Location().let { + return CoordinateUtils.calculateLineDistance( + it.longitude, + it.latitude, + gcjLon, + gcjLat + ) + } + } + + override fun addBridgeListener(tag: String, listener: BridgeListener) { + addListener(tag,listener) + } + + override fun removeBridgeListener(tag: String) { + removeListener(tag) + } + + override fun doSomeAfterAddListener(tag: String, listener: BridgeListener) { + // 轨迹和距离回调 + TrajectoryManager.doSomeAfterBridgeListener() + } + + fun invokeTrajectoryHaveDataListener(haveTrajectoryInfos:Boolean){ + M_LISTENERS.forEach{ + it.value.onTrajectoryHaveData(haveTrajectoryInfos) + } + } + + fun invokePredictionHavaData(havePredictionInfos: Boolean) { + M_LISTENERS.forEach{ + it.value.onPredictionHavaData(havePredictionInfos) + } + } + + fun invokeTrajectoryPoints(trajectoryList: MutableList){ + M_LISTENERS.forEach { + it.value.onTrajectoryPointsListener(trajectoryList) + } + } + + fun invokeTrajectoryDistance(distance:Double){ + M_LISTENERS.forEach { + it.value.onTrajectoryDistanceListener(distance) + } + } + + fun invokeTrajectoryPointAndDistance(trajectoryList: MutableList,distance:Double){ + M_LISTENERS.forEach { + it.value.onTrajectoryPointsAndDistanceListener(trajectoryList, distance) + } + } + + +} \ No newline at end of file diff --git a/OCH/common/bridge/src/main/java/com/mogo/och/bridge/BridgeServiceManager.kt b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/BridgeServiceManager.kt new file mode 100644 index 0000000000..e600572140 --- /dev/null +++ b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/BridgeServiceManager.kt @@ -0,0 +1,81 @@ +package com.mogo.och.bridge + +import android.annotation.SuppressLint +import com.alibaba.android.arouter.launcher.ARouter +import com.mogo.eagle.core.data.map.MogoLocation +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_OCHCOMMON +import com.mogo.och.common.module.constant.OchCommonConst +import com.mogo.och.common.module.manager.loop.BizLoopManager +import com.mogo.och.common.module.manager.loop.LoopInfo +import io.reactivex.schedulers.Schedulers +import kotlin.properties.Delegates + +object BridgeServiceManager { + + private const val TAG = M_OCHCOMMON+"BridgeManager" + + @SuppressLint("StaticFieldLeak") + private var bridgeService: BridgeProvider? = + ARouter.getInstance().build(OchCommonConst.BIZ_Bridge).navigation() as BridgeProvider + + private var trajectoryTime = 0L + private var predictionTime = 0L + + init { + BizLoopManager.setLoopFunction(TAG, + LoopInfo(2, ::checkTimeout, immediately = false, scheduler = Schedulers.io()) + ) + } + + // 是否有车前引导线 + private var haveTrajectoryInfo: Boolean by Delegates.observable(false) { _, oldValue, newValue -> + if (oldValue != newValue) { + bridgeService?.invokeTrajectoryHaveDataListener(newValue) + CallerLogger.d(TAG,"haveTrajectoryInfo 发生变化:${newValue}") + } + trajectoryTime = System.currentTimeMillis() + + } + + // 是否有预测数据 + private var havePredictionInfo: Boolean by Delegates.observable(false) { _, oldValue, newValue -> + if (oldValue != newValue) { + bridgeService?.invokePredictionHavaData(newValue) + CallerLogger.d(TAG,"havePredictionInfo 发生变化:${newValue}") + } + predictionTime = System.currentTimeMillis() + } + + fun checkTimeout(){ + if(System.currentTimeMillis() - trajectoryTime>2_000){ + haveTrajectoryInfo = false + CallerLogger.d(TAG,"超时设置为false:haveTrajectoryInfo ${haveTrajectoryInfo}") + } + if(System.currentTimeMillis() - predictionTime>2_000){ + havePredictionInfo = false + CallerLogger.d(TAG,"超时设置为false:havePredictionInfo ${havePredictionInfo}") + } + } + + + fun invokePlanningListener(haveTrajectoryInfos:Boolean){ + this.haveTrajectoryInfo = haveTrajectoryInfos + } + + fun invokePredictionHaveData(havePredictionInfos:Boolean){ + this.havePredictionInfo = havePredictionInfos + } + + fun invokeTrajectoryPoints(trajectoryList: MutableList){ + this.bridgeService?.invokeTrajectoryPoints(trajectoryList) + } + + fun invokeTrajectoryDistance(distance:Double){ + this.bridgeService?.invokeTrajectoryDistance(distance) + } + fun invokeTrajectoryPointsAndDistance(trajectoryList: MutableList,distance:Double){ + this.bridgeService?.invokeTrajectoryPointAndDistance(trajectoryList, distance) + } + +} \ No newline at end of file diff --git a/OCH/common/bridge/src/main/java/com/mogo/och/bridge/autopilot/autopilot/OchAutoPilotStatusListenerManager.kt b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/autopilot/autopilot/OchAutoPilotStatusListenerManager.kt index 136abe3360..4292c4d9a4 100644 --- a/OCH/common/bridge/src/main/java/com/mogo/och/bridge/autopilot/autopilot/OchAutoPilotStatusListenerManager.kt +++ b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/autopilot/autopilot/OchAutoPilotStatusListenerManager.kt @@ -15,7 +15,7 @@ import com.mogo.eagle.core.utilcode.util.ToastUtils import com.mogo.och.common.module.R import com.mogo.och.bridge.autopilot.autopilot.bean.ArrivedStation import com.mogo.och.bridge.autopilot.line.LineManager -import com.mogo.och.bridge.autopilot.trajectory.TrajectoryManager +import com.mogo.och.bridge.trajectory.TrajectoryManager import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager import com.mogo.och.common.module.utils.CallerBase import com.zhjt.mogo.adas.common.MessageType @@ -177,6 +177,9 @@ object OchAutoPilotStatusListenerManager : CallerBase() { parameters?.endName = end.name parameters?.startLatLon = AutoPilotLonLat(start.lat, start.lon) parameters?.endLatLon = AutoPilotLonLat(end.lat, end.lon) - parameters?.vehicleType = 10 + if(AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode)){ + parameters?.vehicleType = 9 + }else{ + parameters?.vehicleType = 10 + } parameters?.orderId = this.teleOrderId parameters?.firstStationFlag = autopilotFlag parameters?.firstAutopilotFlag = teleIsFirstStartAutopilot diff --git a/OCH/common/bridge/src/main/java/com/mogo/och/bridge/bridge/OchBridgeManager.kt b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/bridge/OchBridgeManager.kt new file mode 100644 index 0000000000..9009316cb3 --- /dev/null +++ b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/bridge/OchBridgeManager.kt @@ -0,0 +1,47 @@ +package com.mogo.och.bridge.bridge + +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotIdentifyListener +import com.mogo.eagle.core.function.api.autopilot.IMoGoPlanningTrajectoryListener +import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotIdentifyListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerPlanningTrajectoryListenerManager +import com.mogo.eagle.core.function.call.base.CallerBase +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_OCHCOMMON +import com.mogo.och.bridge.BridgeServiceManager +import prediction2025.Prediction2025 +import mogo.telematics.pad.MessagePad + +object OchBridgeManager: CallerBase(), + IMoGoPlanningTrajectoryListener, IMoGoAutopilotIdentifyListener { + private val TAG = "${M_OCHCOMMON}OchPlanningListenerManager" + + fun load(){ + CallerPlanningTrajectoryListenerManager.addListener(TAG,this) + CallerAutopilotIdentifyListenerManager.addListener(TAG,this) + } + + fun release(){ + CallerPlanningTrajectoryListenerManager.removeListener(TAG) + } + + /** + * 引导线轨迹 + */ + override fun onAutopilotTrajectory(trajectoryInfos: MutableList) { + if(trajectoryInfos.isEmpty()){ + BridgeServiceManager.invokePlanningListener(false) + }else{ + BridgeServiceManager.invokePlanningListener(true) + } + } + + override fun onPredictionObstacleTrajectory(predictionObjects: Prediction2025.mPredictionObjects) { + if (predictionObjects.objsAppList==null) { + BridgeServiceManager.invokePredictionHaveData(false) + }else{ + BridgeServiceManager.invokePredictionHaveData(true) + } + } + + +} \ No newline at end of file diff --git a/OCH/common/bridge/src/main/java/com/mogo/och/bridge/device/checkvin/CheckVinManager.kt b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/device/checkvin/CheckVinManager.kt index da8b6f52c0..724e46d36a 100644 --- a/OCH/common/bridge/src/main/java/com/mogo/och/bridge/device/checkvin/CheckVinManager.kt +++ b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/device/checkvin/CheckVinManager.kt @@ -29,38 +29,37 @@ object CheckVinManager : IMoGoAutopilotCarConfigListener { fun getVin(): String { var delineVin = CallerAutoPilotControlManager.getVIN() if(delineVin.isEmpty()){ - delineVin = LoginStatusManager.getLoginInfo()?.vin?:"" + delineVin = LoginStatusManager.getOchCarInfo()?.vin?:"" } return delineVin } private fun checkVin() { - LoginStatusManager.getLoginInfo()?.let {loginInfo -> - val serverVin = loginInfo.vin + LoginStatusManager.getOchCarInfo()?.vin?.let { serverVin -> val delineVin = CallerAutoPilotControlManager.getVIN() OchChainLogManager.writeChainLog( "checkVin", "5分钟检测VIN:服务器Vin:${serverVin}-----底盘Vin:${delineVin}", true, CheckVinErrorDialog.EVENT_KEY_INFO_CHECK_VIN ) - if(serverVin.isNullOrBlank()){ + if (serverVin.isNullOrBlank()) { return } - if(delineVin.isNullOrBlank()){ + if (delineVin.isNullOrBlank()) { return } - if(serverVin!=delineVin){ + if (serverVin != delineVin) { val topActivity = ActivityUtils.getTopActivity() topActivity?.let { UiThreadHandler.post({ - if(checkVinErrorDialog !=null&& checkVinErrorDialog!!.isShowing){ + if (checkVinErrorDialog != null && checkVinErrorDialog!!.isShowing) { return@post } checkVinErrorDialog = CheckVinErrorDialog(it) checkVinErrorDialog?.showDialog() - },UiThreadHandler.MODE.QUEUE) + }, UiThreadHandler.MODE.QUEUE) } } diff --git a/OCH/common/bridge/src/main/java/com/mogo/och/bridge/distance/TrajectoryAndDistanceManager.kt b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/distance/TrajectoryAndDistanceManager.kt index abac76254c..4b2c54074f 100644 --- a/OCH/common/bridge/src/main/java/com/mogo/och/bridge/distance/TrajectoryAndDistanceManager.kt +++ b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/distance/TrajectoryAndDistanceManager.kt @@ -13,7 +13,7 @@ import com.mogo.eagle.core.utilcode.util.LocationUtils import com.mogo.och.common.module.constant.OchCommonConst import com.mogo.och.bridge.autopilot.autopilot.OchAutopilotAnalytics import com.mogo.och.bridge.autopilot.location.OchLocationManager -import com.mogo.och.bridge.autopilot.trajectory.TrajectoryCache +import com.mogo.och.bridge.trajectory.TrajectoryCache import com.mogo.och.common.module.manager.loop.BizLoopManager import com.mogo.och.common.module.manager.loop.LoopInfo import com.mogo.och.bridge.utils.CoordinateCalculateRouteUtil diff --git a/OCH/common/bridge/src/main/java/com/mogo/och/bridge/autopilot/trajectory/ITrajectoryListListener.kt b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/trajectory/ITrajectoryListListener.kt similarity index 94% rename from OCH/common/bridge/src/main/java/com/mogo/och/bridge/autopilot/trajectory/ITrajectoryListListener.kt rename to OCH/common/bridge/src/main/java/com/mogo/och/bridge/trajectory/ITrajectoryListListener.kt index a0bd1730be..af0b0bcb03 100644 --- a/OCH/common/bridge/src/main/java/com/mogo/och/bridge/autopilot/trajectory/ITrajectoryListListener.kt +++ b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/trajectory/ITrajectoryListListener.kt @@ -1,4 +1,4 @@ -package com.mogo.och.bridge.autopilot.trajectory +package com.mogo.och.bridge.trajectory import com.mogo.eagle.core.data.map.MogoLocation diff --git a/OCH/common/bridge/src/main/java/com/mogo/och/bridge/autopilot/trajectory/TrajectoryCache.kt b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/trajectory/TrajectoryCache.kt similarity index 97% rename from OCH/common/bridge/src/main/java/com/mogo/och/bridge/autopilot/trajectory/TrajectoryCache.kt rename to OCH/common/bridge/src/main/java/com/mogo/och/bridge/trajectory/TrajectoryCache.kt index f378627c4d..f8fff48543 100644 --- a/OCH/common/bridge/src/main/java/com/mogo/och/bridge/autopilot/trajectory/TrajectoryCache.kt +++ b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/trajectory/TrajectoryCache.kt @@ -1,4 +1,4 @@ -package com.mogo.och.bridge.autopilot.trajectory +package com.mogo.och.bridge.trajectory import com.elegant.network.utils.GsonUtil import com.mogo.commons.AbsMogoApplication diff --git a/OCH/common/bridge/src/main/java/com/mogo/och/bridge/autopilot/trajectory/TrajectoryManager.kt b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/trajectory/TrajectoryManager.kt similarity index 75% rename from OCH/common/bridge/src/main/java/com/mogo/och/bridge/autopilot/trajectory/TrajectoryManager.kt rename to OCH/common/bridge/src/main/java/com/mogo/och/bridge/trajectory/TrajectoryManager.kt index 62a7d85f6b..b0a0e4b573 100644 --- a/OCH/common/bridge/src/main/java/com/mogo/och/bridge/autopilot/trajectory/TrajectoryManager.kt +++ b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/trajectory/TrajectoryManager.kt @@ -1,4 +1,4 @@ -package com.mogo.och.bridge.autopilot.trajectory +package com.mogo.och.bridge.trajectory import com.mogo.commons.AbsMogoApplication import com.mogo.eagle.core.data.map.MogoLocation @@ -7,6 +7,7 @@ import com.mogo.eagle.core.function.call.autopilot.CallerPlanningRottingListener import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.eagle.core.utilcode.util.CoordinateUtils +import com.mogo.och.bridge.BridgeServiceManager import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager.writeChainLog import com.mogo.och.common.module.utils.CallerBase @@ -14,7 +15,7 @@ import com.mogo.och.bridge.utils.CoordinateCalculateRouteUtil import com.zhjt.mogo.adas.data.bean.MogoReport import mogo.telematics.pad.MessagePad -object TrajectoryManager : CallerBase(),IMoGoPlanningRottingListener { +object TrajectoryManager : CallerBase(), IMoGoPlanningRottingListener { const val TAG = "TrajectoryManager" private val downLoadSuccessLineIds = mutableListOf() @@ -41,7 +42,7 @@ object TrajectoryManager : CallerBase(),IMoGoPlanningR CallerPlanningRottingListenerManager.addListener(TAG, this) } - private var lineId:Long?=0 + private var lineId: Long? = 0 override fun onAutopilotRotting(globalPathResp: MessagePad.GlobalPathResp?) { CallerLogger.d(SceneConstant.M_OCHCOMMON + TAG, "onAutopilotRotting: 收到轨迹") @@ -91,36 +92,64 @@ object TrajectoryManager : CallerBase(),IMoGoPlanningR M_LISTENERS.forEach { it.value.trajectoryDistanceCallback(maxDistanceAllPoint) } + BridgeServiceManager.invokeTrajectoryPoints(mRoutePoints) + BridgeServiceManager.invokeTrajectoryDistance(maxDistanceAllPoint) + BridgeServiceManager.invokeTrajectoryPointsAndDistance(mRoutePoints,maxDistanceAllPoint) } - private fun addDownLoadSuccessLine(lineId:Long){ - if(lineId>0){ - OchChainLogManager.writeChainLog("轨迹监控", " 轨迹下载成功${lineId}", true, OchChainLogManager.EVENT_KEY_INFE_WITH_TRAJECTORY) + override fun doSomeAfterAddListener(tag: String, listener: ITrajectoryListListener) { + if(mRoutePoints.isNotEmpty()) { + M_LISTENERS.forEach { + it.value.trajectoryCallback(mRoutePoints) + } + M_LISTENERS.forEach { + it.value.trajectoryDistanceCallback(maxDistanceAllPoint) + } + } + } + + fun doSomeAfterBridgeListener(){ + BridgeServiceManager.invokeTrajectoryPoints(mRoutePoints) + BridgeServiceManager.invokeTrajectoryDistance(maxDistanceAllPoint) + BridgeServiceManager.invokeTrajectoryPointsAndDistance(mRoutePoints,maxDistanceAllPoint) + } + + private fun addDownLoadSuccessLine(lineId: Long) { + if (lineId > 0) { + OchChainLogManager.writeChainLog( + "轨迹监控", + " 轨迹下载成功${lineId}", + true, + OchChainLogManager.EVENT_KEY_INFE_WITH_TRAJECTORY + ) downLoadSuccessLineIds.add(lineId) } } - private fun removeDownLoadSuccessLine(lineId:Long){ - if(lineId>0&& downLoadSuccessLineIds.contains(lineId)){ + + private fun removeDownLoadSuccessLine(lineId: Long) { + if (lineId > 0 && downLoadSuccessLineIds.contains(lineId)) { downLoadSuccessLineIds.remove(lineId) } } - - fun carDownLoadTrajectoryLog(code: String?, lineId: Long){ + + fun carDownLoadTrajectoryLog(code: String?, lineId: Long) { when (code) { - MogoReport.Code.Info.ISYS.INIT_TRAJECTORY_START -> { + MogoReport.Code.Info.ISYS.INIT_TRAJECTORY_START -> { writeTrajectoryLog("轨迹开始下载") M_LISTENERS.forEach { it.value.onDownLoadStart(lineId) } } - MogoReport.Code.Info.ISYS.INIT_TRAJECTORY_SUCCESS -> { + + MogoReport.Code.Info.ISYS.INIT_TRAJECTORY_SUCCESS -> { writeTrajectoryLog("轨迹下载成功") addDownLoadSuccessLine(lineId) M_LISTENERS.forEach { it.value.onDownLoadSuccess(lineId) } } - MogoReport.Code.Info.ISYS.INIT_TRAJECTORY_FAILURE -> { + + MogoReport.Code.Info.ISYS.INIT_TRAJECTORY_FAILURE -> { writeTrajectoryLog("轨迹下载失败,本地无对应轨迹") // 更新轨迹没有更新lineId 第二次下载失败 删除App成功缓存(概率很低) removeDownLoadSuccessLine(lineId) @@ -128,49 +157,60 @@ object TrajectoryManager : CallerBase(),IMoGoPlanningR it.value.onDownLoadFail(lineId) } } - MogoReport.Code.Info.ISYS.INIT_TRAJECTORY_WARNING -> { + + MogoReport.Code.Info.ISYS.INIT_TRAJECTORY_WARNING -> { writeTrajectoryLog("轨迹下载失败,本地有对应轨迹,认为成功") M_LISTENERS.forEach { it.value.onDownLoadSuccess(lineId) } } + MogoReport.Code.Info.ISYS.INIT_TRAJECTORY_TIMEOUT -> { writeTrajectoryLog("轨迹下载超时") M_LISTENERS.forEach { it.value.onDownLoadTimeout(lineId) } } - MogoReport.Code.Info.ISSM.FUNC_AUTO_PILOT_READY -> { + + MogoReport.Code.Info.ISSM.FUNC_AUTO_PILOT_READY -> { writeTrajectoryLog("再次发起下载、 ssm ready,再次发起下载") M_LISTENERS.forEach { it.value.onDownLoadReady(lineId) } } + MogoReport.Code.Error.EMAP.TRA_LOAD_FAILED -> { writeTrajectoryLog("onAutopilotGuardian() 加载轨迹文件失败") M_LISTENERS.forEach { it.value.onLoadFail(lineId) } } - MogoReport.Code.Error.EMAP.TRA_NOT_EXIST -> { + + MogoReport.Code.Error.EMAP.TRA_NOT_EXIST -> { writeTrajectoryLog("onAutopilotGuardian() 无法找到轨迹文件") M_LISTENERS.forEach { it.value.onTrajectoryNotExist(lineId) } } - MogoReport.Code.Error.EMAP.ATTITUDE_INIT_FAILED->{ + + MogoReport.Code.Error.EMAP.ATTITUDE_INIT_FAILED -> { writeTrajectoryLog("onAutopilotGuardian() 当前位置距离轨迹距离大于15m") M_LISTENERS.forEach { it.value.onDistanceWithTrajectory(lineId) } } + else -> {} } } - - private fun writeTrajectoryLog(message:String){ + + private fun writeTrajectoryLog(message: String) { writeChainLog("轨迹监控", message, true, OchChainLogManager.EVENT_KEY_INFE_WITH_TRAJECTORY) } + fun load() { + + } + } \ No newline at end of file diff --git a/OCH/common/common/build.gradle b/OCH/common/common/build.gradle index b2bf5d7a58..68e607db93 100644 --- a/OCH/common/common/build.gradle +++ b/OCH/common/common/build.gradle @@ -64,9 +64,6 @@ dependencies { implementation rootProject.ext.dependencies.amapnavi3dmap implementation rootProject.ext.dependencies.rxandroid - // 硬件管理 - implementation project(":libraries:mogo-hardware-devices") - implementation rootProject.ext.dependencies.arouter kapt rootProject.ext.dependencies.aroutercompiler diff --git a/OCH/common/common/src/debug/java/com/mogo/och/common/module/debug/DebugDataDispatch.kt b/OCH/common/common/src/debug/java/com/mogo/och/common/module/debug/DebugDataDispatch.kt index 6b7dba6a13..0d0219dd1d 100644 --- a/OCH/common/common/src/debug/java/com/mogo/och/common/module/debug/DebugDataDispatch.kt +++ b/OCH/common/common/src/debug/java/com/mogo/och/common/module/debug/DebugDataDispatch.kt @@ -34,14 +34,15 @@ import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.eagle.core.utilcode.util.ActivityUtils import com.mogo.eagle.core.utilcode.util.GsonUtils import com.mogo.eagle.core.utilcode.util.ThreadUtils +import com.mogo.och.common.module.biz.birdge.BridgeManager import com.mogo.och.common.module.biz.order.OrderManager import com.mogo.och.common.module.debug.location.MogoLocationExit import com.mogo.och.common.module.manager.loop.BizLoopManager -import com.mogo.och.common.module.manager.scnner.ScannerManager //import com.mogo.och.bridge.distance.TrajectoryAndDistanceManager //import com.mogo.och.bridge.utils.CoordinateCalculateRouteUtil //import com.mogo.och.bridge.utils.CoordinateCalculateRouteUtil import com.mogo.och.common.module.view.DebugFloatWindow +import com.mogo.och.common.module.wigets.media.MediaBeanManager import com.zhjt.mogo.adas.data.bean.AutopilotStatistics import mogo.telematics.pad.MessagePad import mogo_msg.MogoReportMsg @@ -71,6 +72,7 @@ object DebugDataDispatch { const val scanner = "scanner" const val ota = "ota" const val video = "video" + const val mediaMusic = "mediaAndMusic" // adb shell am broadcast -a com.mogo.launcher.debug -f 0x011000000 --es type "location" --es path "1111/11111" // adb shell am broadcast -a com.mogo.launcher.debug -f 0x011000000 --es type "globalPath" --es path "sy73.json" @@ -100,6 +102,11 @@ object DebugDataDispatch { } when (type) { + mediaMusic -> { + val musicList = MediaBeanManager.getMusicList() + val mediaList = MediaBeanManager.getMediaList() + CallerLogger.d(TAG,"${mediaList}\n${musicList}") + } video -> { val ota = intent.getIntExtra("video",0) // rtmp://video.zhidaozhixing.com/live/861130041693196C_2 @@ -127,7 +134,7 @@ object DebugDataDispatch { scanner -> { val qrInfo = intent.getStringExtra("qrInfo") BizLoopManager.runInIoThread{ - ScannerManager.parseParams("orderNo=1871744897569038336&uid=828aa91f-49a1-f9b3-4526-f58acda9df60&pipe=mogogosafety&phone=houyanli&lineId=134&expiryTime=1735094149070&bookingTime=1735056000000&tenantId=337197925358633123&availableTimes=1&ticketSize=1&ticketName=%E9%80%9A%E5%8B%A4%E7%A5%A8%E3%81%AE&type=14&shiftsId=4249") + //ScannerManager.parseParams("orderNo=1871744897569038336&uid=828aa91f-49a1-f9b3-4526-f58acda9df60&pipe=mogogosafety&phone=houyanli&lineId=134&expiryTime=1735094149070&bookingTime=1735056000000&tenantId=337197925358633123&availableTimes=1&ticketSize=1&ticketName=%E9%80%9A%E5%8B%A4%E7%A5%A8%E3%81%AE&type=14&shiftsId=4249") } } globalPathMock -> { @@ -256,16 +263,17 @@ object DebugDataDispatch { } fun setStation(startLon:Double,startLat:Double,endLon:Double,endLat:Double,lineID:Long){ -// if(startLon<0||startLat<0||endLon<0||endLat<0||lineID<0){ -// TrajectoryAndDistanceManager.setStationPoint(null,null,-1) -// } -// val startLocation = MogoLocation() -// startLocation.longitude = startLon -// startLocation.latitude = startLat -// val endLocation = MogoLocation() -// endLocation.longitude = endLon -// endLocation.latitude = endLat -// TrajectoryAndDistanceManager.setStationPoint(startLocation,endLocation,lineID) + if(startLon<0||startLat<0||endLon<0||endLat<0||lineID<0){ + BridgeManager.setDistanceStation(null,null,-1) + } + val startLocation = MogoLocation() + startLocation.longitude = startLon + startLocation.latitude = startLat + val endLocation = MogoLocation() + endLocation.longitude = endLon + endLocation.latitude = endLat + + BridgeManager.setDistanceStation(startLocation,endLocation,lineID) } fun getLocaitonByLog(path:String) { @@ -285,7 +293,7 @@ object DebugDataDispatch { newBuilder.heading = list.msg.GnssInfo.heading newBuilder.gnssSpeed = list.msg.GnssInfo.gnssSpeed CallerChassisGnssListenerManager.invokeChassisGnssListener(newBuilder.build()) - Thread.sleep(100) + Thread.sleep(50) } } catch (e: IOException) { e.printStackTrace() diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/birdge/BridgeListener.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/birdge/BridgeListener.kt new file mode 100644 index 0000000000..14b452a186 --- /dev/null +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/birdge/BridgeListener.kt @@ -0,0 +1,18 @@ +package com.mogo.och.common.module.biz.birdge + +import com.mogo.eagle.core.data.map.MogoLocation + +interface BridgeListener { + /** + * 是否有引导线 + */ + fun onTrajectoryHaveData(haveTrajectoryInfos: Boolean){} + + fun onPredictionHavaData(havePredictionInfos: Boolean){} + + fun onTrajectoryPointsListener(trajectoryList: MutableList){} + + fun onTrajectoryDistanceListener(distance: Double){} + + fun onTrajectoryPointsAndDistanceListener(trajectoryList: MutableList,distance: Double){} +} \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/birdge/BridgeManager.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/birdge/BridgeManager.kt new file mode 100644 index 0000000000..cbbebc977e --- /dev/null +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/birdge/BridgeManager.kt @@ -0,0 +1,38 @@ +package com.mogo.och.common.module.biz.birdge + +import com.alibaba.android.arouter.launcher.ARouter +import com.mogo.eagle.core.data.map.MogoLocation +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_OCHCOMMON +import com.mogo.och.common.module.constant.OchCommonConst +import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager + +object BridgeManager { + + private const val TAG = M_OCHCOMMON+"BridgeManager" + + private var bridgeService: BridgeService? = + ARouter.getInstance().build(OchCommonConst.BIZ_Bridge).navigation() as BridgeService + + fun load(){ + OchChainLogManager.writeChainLogInit("初始化信息","初始化Bridge系统") + d(TAG,"初始化信息_初始化Bridge系统") + } + + fun setDistanceStation(startLocation: MogoLocation?, endLocation: MogoLocation?, lineId: Long?) { + bridgeService?.setDistanceStation(startLocation,endLocation,lineId) + } + + fun distance2Point(gcjLat: Double, gcjLon: Double):Float{ + return bridgeService?.distance2Point(gcjLat,gcjLon)?:0f + } + + fun addBridgeListener(tag:String, listener: BridgeListener){ + bridgeService?.addBridgeListener(tag,listener) + } + + fun removeBridgeListener(tag: String){ + bridgeService?.removeBridgeListener(tag) + } + +} \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/birdge/BridgeService.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/birdge/BridgeService.kt new file mode 100644 index 0000000000..a2c539aae2 --- /dev/null +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/birdge/BridgeService.kt @@ -0,0 +1,16 @@ +package com.mogo.och.common.module.biz.birdge + +import com.alibaba.android.arouter.facade.template.IProvider +import com.mogo.eagle.core.data.map.MogoLocation + +interface BridgeService : IProvider { + + fun setDistanceStation(startLocation: MogoLocation?, endLocation: MogoLocation?, lineId: Long?) + + + fun distance2Point(gcjLat: Double, gcjLon: Double): Float + + fun addBridgeListener(tag:String, listener:BridgeListener) + + fun removeBridgeListener(tag: String) +} \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/lansocket/LoginLanDriverSocket.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/lansocket/LoginLanDriverSocket.kt index 68b4670206..5692fa3b3b 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/lansocket/LoginLanDriverSocket.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/lansocket/LoginLanDriverSocket.kt @@ -1,9 +1,12 @@ package com.mogo.och.common.module.biz.lansocket -import com.mogo.eagle.core.data.config.FunctionBuildConfig +import android.util.Log +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_OCHCOMMON import com.mogo.och.common.module.BuildConfig +import com.mogo.och.common.module.biz.lansocket.bean.DevicesInfo import com.mogo.och.common.module.biz.login.ILoginCallback -import com.mogo.och.common.module.biz.login.LoginStatusEnum +import com.mogo.och.common.module.biz.login.EnumLoginStatus import com.mogo.och.common.module.biz.login.LoginStatusManager import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager import com.mogo.och.common.module.manager.loop.BizLoopManager @@ -15,10 +18,14 @@ import com.mogo.och.common.module.manager.socket.lan.bean.BusinessType import com.mogo.och.common.module.manager.socket.lan.bean.ChangeBusinessType import com.mogo.och.common.module.manager.socket.lan.bean.DPMsgType import com.mogo.och.common.module.manager.socket.lan.bean.EnvCheck +import com.mogo.och.common.module.manager.socket.lan.bean.ScreenType +import com.mogo.och.common.module.utils.DateTimeUtil import com.mogo.och.common.module.utils.FlavorUtils object LoginLanDriverSocket : ILoginCallback { - private const val TAG = "LoginLanSocket" + private const val TAG = M_OCHCOMMON+"LoginLanSocket" + + private val thridDevices = mutableListOf() // 接受到客户端注册信息后立即返回业务模式 private val registerListener = object : ILanMessageListener { @@ -28,6 +35,15 @@ object LoginLanDriverSocket : ILoginCallback { override fun onLanMsgReceived(obj: BaseDPMsg?) { println("-------${obj}") + obj?.let {msg-> + var currentDevices = thridDevices.find { it.sn == msg.sourceSn && it.msgVersion == msg.msgVersion } + if(currentDevices==null){ + currentDevices = DevicesInfo(msg.sourceScreenType, msg.sourceSn,msg.msgVersion) + thridDevices.add(currentDevices) + }else{ + currentDevices.registerTime = DateTimeUtil.getCurrentTimeStamp() + } + } if(LoginStatusManager.isLogin()) { FlavorUtils.getEnvCheck() val msg = ChangeBusinessType(FlavorUtils.vehicleType!!, FlavorUtils.businessType!!, FlavorUtils.projectType!!, FlavorUtils.envType!!) @@ -37,9 +53,10 @@ object LoginLanDriverSocket : ILoginCallback { val msg = ChangeBusinessType(FlavorUtils.vehicleType!!, BusinessType.none, FlavorUtils.projectType!!, FlavorUtils.envType!!) LanSocketManager.sendMsgToClient(msg) } + LoginStatusManager.sendLogin2Client() } - }; + } fun load() { OchChainLogManager.writeChainLogInit("初始化信息","初始司机屏局域网内通知监听") @@ -47,6 +64,7 @@ object LoginLanDriverSocket : ILoginCallback { init { // 登录状态变化的监听 + CallerLogger.d(TAG,"初始化局域网通信") LoginStatusManager.addListener(TAG, this) // 注册监听乘客屏和报站屏注册信息 LanSocketManager.registerSocketMessageListener( @@ -56,11 +74,11 @@ object LoginLanDriverSocket : ILoginCallback { } // 司机端发送业务模式更改和环境校验 - override fun onStatusChange(currentStatus: LoginStatusEnum?) { + override fun onLoginStatusChange(currentStatus: EnumLoginStatus?) { FlavorUtils.getEnvCheck() if (FlavorUtils.vehicleType != null && FlavorUtils.projectType != null && FlavorUtils.envType != null) { when (currentStatus) { - LoginStatusEnum.Login -> { + EnumLoginStatus.Login -> { val msg = ChangeBusinessType( FlavorUtils.vehicleType!!, diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/lansocket/LoginLanPassengerSocket.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/lansocket/LoginLanPassengerSocket.kt index 70693262c0..9054f7c896 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/lansocket/LoginLanPassengerSocket.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/lansocket/LoginLanPassengerSocket.kt @@ -3,11 +3,8 @@ package com.mogo.och.common.module.biz.lansocket import com.mogo.eagle.core.function.api.telematic.IReceivedMsgListener import com.mogo.eagle.core.function.call.telematic.CallerTelematicListenerManager import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager -import com.mogo.eagle.core.utilcode.mogo.Product import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.Logger -import com.mogo.eagle.core.utilcode.util.UiThreadHandler -import com.mogo.och.common.module.biz.login.LoginStatusEnum import com.mogo.och.common.module.biz.login.LoginStatusManager import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager import com.mogo.och.common.module.manager.loop.BizLoopManager @@ -15,16 +12,9 @@ import com.mogo.och.common.module.manager.loop.LoopInfo import com.mogo.och.common.module.manager.socket.lan.ILanMessageListener import com.mogo.och.common.module.manager.socket.lan.LanSocketManager import com.mogo.och.common.module.manager.socket.lan.bean.BaseDPMsg -import com.mogo.och.common.module.manager.socket.lan.bean.BusinessType -import com.mogo.och.common.module.manager.socket.lan.bean.ChangeBusinessType import com.mogo.och.common.module.manager.socket.lan.bean.DPMsgType import com.mogo.och.common.module.manager.socket.lan.bean.EnvCheck -import com.mogo.och.common.module.manager.socket.lan.bean.EnvType -import com.mogo.och.common.module.manager.socket.lan.bean.ProjectType -import com.mogo.och.common.module.manager.socket.lan.bean.ScreenType -import com.mogo.och.common.module.manager.socket.lan.bean.VehicleType import com.mogo.och.common.module.utils.CallerBase -import java.lang.StringBuilder import kotlin.properties.Delegates object LoginLanPassengerSocket : IReceivedMsgListener, CallerBase() { @@ -35,7 +25,7 @@ object LoginLanPassengerSocket : IReceivedMsgListener, CallerBase${newV}") if(newV.isNotEmpty()){ OchChainLogManager.writeChainLogNetLanSocketConnect("局域网socket链接状态","sn 变化 已连接 sn${newV}") } @@ -83,73 +73,12 @@ object LoginLanPassengerSocket : IReceivedMsgListener, CallerBase { - override fun targetLan(): Class { - return ChangeBusinessType::class.java - } - - override fun onLanMsgReceived(first: ChangeBusinessType?) { - first?.let { - val checkEnv = checkEnv( - first.projectType, - first.envType, - first.vehicleType, - first.businessType - ) - if(checkEnv){ - val status = StringBuilder() - status.append("切换业务模式<当前:${LoginStatusManager.getBusInessType().name}") - when (first.businessType) { - BusinessType.none -> { - LoginStatusManager.setBusinessType(Product.NONE.code) - CallerLogger.d(TAG, "乘客屏 收到消息 司机屏没有登录:${LoginStatusEnum.Logout}") - return LoginStatusManager.setLoginStatus(LoginStatusEnum.Logout) - } - BusinessType.bus -> LoginStatusManager.setBusinessType(Product.BUS.code) - BusinessType.shuttle -> LoginStatusManager.setBusinessType(Product.SHUTTLE.code) - BusinessType.charter -> LoginStatusManager.setBusinessType(Product.CHARTER.code) - BusinessType.taxi -> LoginStatusManager.setBusinessType(Product.TAXI.code) - BusinessType.taxiunmanned ->LoginStatusManager.setBusinessType(Product.TAXI.code) - BusinessType.scheduled ->LoginStatusManager.setBusinessType(Product.SCHEDULED.code) - } - status.append(", 切换后:${LoginStatusManager.getBusInessType().name}>") - LoginStatusManager.changeStatus(status.toString()) - UiThreadHandler.postDelayed({ - CallerLogger.d(TAG, "乘客屏 收到消息 司机屏业务模式相同:${LoginStatusEnum.Login}") - LoginStatusManager.setLoginStatus(LoginStatusEnum.Login) - },2000) - - } - } - } - - }; - fun load() { OchChainLogManager.writeChainLogInit("初始化信息","初始局乘客屏局域网内部分信息") } @@ -164,11 +93,7 @@ object LoginLanPassengerSocket : IReceivedMsgListener, CallerBase() { } throw ClassNotFoundException("没有找到登录Fragment"); } + @JvmStatic fun resetFragment(){ loginService?.let { @@ -49,51 +45,57 @@ object LoginStatusManager : CallerBase() { fun queryLoginStatusByNet(readCatche:Boolean=false) { loginService?.queryLoginStatusByNet(readCatche) } - @JvmStatic - fun getPurpose(): RoleEnum { + + fun getOchCarInfo(): OchCarInfo? { + return loginService?.getOchCarInfo() + } + + fun getOchBizInfo(): OchBizInfo? { + return loginService?.getOchBizInfo() + } + + fun getOchLoginInfo(): OchLoginInfo? { + return loginService?.getOchLoginInfo() + } + + /** + * 移除登录信息 + */ + fun removeLoginInfo() { + loginService?.removeLoginInfo() + } + + /** + * 获取业务模式 + */ + fun getProductType():Product{ loginService?.let { - return it.getPurpose() - } - return RoleEnum.None - } - - @JvmStatic - fun setLoginInfo(loginInfo: LoginInfo) { - loginService?.setLoginInfo(loginInfo) - } - - fun getLoginInfo(): LoginInfo? { - return loginService?.getLoginInfo() - } - - @JvmStatic - fun setLoginStatus(status: Int) { - loginService?.setLoginStatus(status) - } - @JvmStatic - fun setBusinessType(type: Int) { - loginService?.setBusinessType(type) - } - - fun getBusInessType():Product{ - loginService?.let { - return it.getBusinessType() + return it.getProductType() } return Product.NONE } - @JvmStatic - fun setOpenOrderType(type: Int) { - loginService?.setOpenOrderStatusType(type) + fun getVehicleType():Vehicle{ + loginService?.let { + return it.getVehicleType() + } + return Vehicle.NONE } + /** + * 获取接单状态 + */ @JvmStatic - fun getOpenOrderType():OpenOrderStatusEnum{ + fun getOpenOrderType():EnumOpenOrderStatus{ loginService?.let { return it.getOpenOrderStatusType() } - return OpenOrderStatusEnum.None + return EnumOpenOrderStatus.None } + + /** + * 是否在接单中 + */ @JvmStatic fun isOpenOrderType():Boolean{ loginService?.let { @@ -102,34 +104,20 @@ object LoginStatusManager : CallerBase() { return false } + /** + * 获取登录状态 + */ @JvmStatic - fun setLoginStatus(loginStatus: LoginStatusEnum) { - CallerLogger.d(TAG, "setLoginStatus:${loginStatus}") - loginService?.setLoginStatus(loginStatus) - } - - - fun removeLoginInfo() { - loginService?.removeLoginInfo() - } - - @JvmStatic - fun getLoginStatus(): LoginStatusEnum { + fun getLoginStatus(): EnumLoginStatus { loginService?.let { return it.getLoginStatus() } - return LoginStatusEnum.None + return EnumLoginStatus.None } - @JvmStatic - fun getCarModel(): Carmodel { - loginService?.let { - return it.getCarModel() - } - return Carmodel.T2 - } - - + /** + * 是否登录中 + */ @JvmStatic fun isLogin(): Boolean { loginService?.let { @@ -138,72 +126,73 @@ object LoginStatusManager : CallerBase() { return false } - fun invokeLoginStatusChange(currentStatus: LoginStatusEnum) { - Log.d("登录","设置源:invokeLoginStatusChange") - if(!FunctionBuildConfig.isOffLine){ - if(currentStatus==LoginStatusEnum.Login){ - Log.d("登录","设置源:queryLoginStatusByNet") - BizLoopManager.setLoopFunction(TAGLoopStatus, LoopInfo(60*2, ::queryLoginStatusByNet,immediately = true, scheduler = Schedulers.io())) - }else{ - BizLoopManager.removeLoopFunction(TAGLoopStatus) - } + /** + * 获取车辆模型 + */ + @JvmStatic + fun getCarModel(): Carmodel { + loginService?.let { + return it.getCarModelType() } + return Carmodel.T2 + } + + /** + * 发送登录信息到乘客屏 + */ + fun sendLogin2Client() { + loginService?.sendLogin2Client() + } + + /** + * 登录状态变更通知 + */ + fun invokeLoginStatusChange(currentStatus: EnumLoginStatus) { M_LISTENERS.forEach { val listener = it.value - listener.onStatusChange(currentStatus) + listener.onLoginStatusChange(currentStatus) } } - fun invokeLBusinessTypeChange(currentStatus: Product) { + /** + * 业务模式发生变化通知 + */ + fun invokeLProductChange(currentStatus: Product) { M_LISTENERS.forEach { val listener = it.value - listener.onBusinessChange(currentStatus) - } - } - fun invokeLBusinessTypeChangeDebug(currentStatus: Product) { - M_LISTENERS.forEach { - val listener = it.value - listener.onBusinessChangeDebug(currentStatus) + listener.onProductChange(currentStatus) } } - fun invokeLOpenOrderStatusChange(currentStatus: OpenOrderStatusEnum) { + /** + * 车型发生变化通知 + */ + fun invokeLVehicleChange(currentStatus: Vehicle) { + M_LISTENERS.forEach { + val listener = it.value + listener.onVehicleChage(currentStatus) + } + } + + /** + * 接单状态变化发送通知 + */ + fun invokeOpenOrderStatusChange(currentStatus: EnumOpenOrderStatus) { M_LISTENERS.forEach { val listener = it.value listener.onOpenOrderStatusEnumChange(currentStatus) } } - @JvmStatic - fun checkBusiness(businessType: Int):Boolean { - loginService?.let { - return it.checkBusiness(businessType) - } - return false - } - - fun checkAllEnv( - projectType: ProjectType, - envType: EnvType, - vehicleType: VehicleType, - businessType: BusinessType - ):Boolean { - loginService?.let { - return it.checkAllEnv(projectType,envType,vehicleType,businessType) - } - return false - } - fun changeStatus(status: String) { - loginService?.let { - it.changeStatus(status) - } + loginService?.changeStatus(status) } override fun doSomeAfterAddListener(tag: String, listener: ILoginCallback) { super.doSomeAfterAddListener(tag, listener) - listener.onStatusChange(getLoginStatus()) - listener.onBusinessChange(getBusInessType()) + listener.onLoginStatusChange(getLoginStatus()) + listener.onProductChange(getProductType()) + listener.onVehicleChage(getVehicleType()) listener.onOpenOrderStatusEnumChange(getOpenOrderType()) listener.onCarModelChange(getCarModel()) } @@ -215,6 +204,9 @@ object LoginStatusManager : CallerBase() { } } + /** + * 车辆模型变化通知 + */ fun invokeCarModelChange(carModel: Carmodel) { M_LISTENERS.forEach { val listener = it.value @@ -222,5 +214,12 @@ object LoginStatusManager : CallerBase() { } } + fun invokeTenantIdChange(tenantId: Long) { + M_LISTENERS.forEach { + val listener = it.value + listener.onTenantIdChange(tenantId) + } + } + } \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/login/bean/OchBizInfo.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/login/bean/OchBizInfo.kt new file mode 100644 index 0000000000..8df419f5c9 --- /dev/null +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/login/bean/OchBizInfo.kt @@ -0,0 +1,33 @@ +package com.mogo.och.common.module.biz.login.bean + +data class OchBizInfo( + + //9: taxi. 10: bus公交 11:接驳 13:包车 14:班车 + val businessType: Int = -1, + + // taxi使用 + // 订单号 + val orderNo: String = "", + //1接单中,0暂停接单 + val servingStatus: Int = 0, + + //接驳、公交、班车使用 + // 正在执行的线路id + val lineId: Long, + // 正在执行的班次id + val taskId: Long, + // 当前站点 + val currentSite: Long, + // 是否滑动出发 + val leaving: Boolean, + // 当前班次的模板id + val shiftsId: Long, + // 当前班次的具体时间 + val taskDate: Long, + + // 包车使用 + // 当前站点id 包车使用 + val siteId: Long, + // 包车车辆状态 1:闲置中 2:使用中 + val businessStatus: Long, +) \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/login/bean/OchCarInfo.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/login/bean/OchCarInfo.kt new file mode 100644 index 0000000000..e0c56924b8 --- /dev/null +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/login/bean/OchCarInfo.kt @@ -0,0 +1,12 @@ +package com.mogo.och.common.module.biz.login.bean + +data class OchCarInfo( + val plateNumber:String?, + val vin:String?, + val cityCode:String?,// 车辆所在城市 + val brand:String?,// 车辆生产产商 品牌 + val carModel:String?,// 车辆类型 型号 + val photos:String?,// 车身照片 + // 租户id + val tenantId: Long?, +) \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/login/bean/OchLoginInfo.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/login/bean/OchLoginInfo.kt new file mode 100644 index 0000000000..dde3f9331b --- /dev/null +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/login/bean/OchLoginInfo.kt @@ -0,0 +1,14 @@ +package com.mogo.och.common.module.biz.login.bean + +data class OchLoginInfo( + //1登录,0登出 + val driverStatus: Int = 0, + // 1 运营, 2 测试, 3演示 + val purpose: Int = 0, + // 后台车辆配置的sn + val sn: String = "", + // 司机手机号 + val phone: String = "", + // 司机id + val driverId: Long?, +) \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/offline/OfflineManager.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/offline/OfflineManager.kt index 41675a443d..6b91f41ce0 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/offline/OfflineManager.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/offline/OfflineManager.kt @@ -4,8 +4,9 @@ import com.alibaba.android.arouter.launcher.ARouter import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_OFFLINE +import com.mogo.och.common.module.biz.lansocket.LoginLanDriverSocket import com.mogo.och.common.module.biz.login.ILoginCallback -import com.mogo.och.common.module.biz.login.LoginStatusEnum +import com.mogo.och.common.module.biz.login.EnumLoginStatus import com.mogo.och.common.module.biz.login.LoginStatusManager import com.mogo.och.common.module.constant.OchCommonConst import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager @@ -17,12 +18,13 @@ object OfflineManager : ILoginCallback { private var offlineService: OfflineService? = ARouter.getInstance().build(OchCommonConst.BIZ_OFFLINE).navigation() as OfflineService init { + CallerLogger.d(TAG,"初始化离线系统") LoginStatusManager.addListener(TAG,this) } - override fun onStatusChange(currentStatus: LoginStatusEnum?) { + override fun onLoginStatusChange(currentStatus: EnumLoginStatus?) { if(!FunctionBuildConfig.isOffLine){ - if(currentStatus==LoginStatusEnum.Login) { + if(currentStatus==EnumLoginStatus.Login) { // 同步数据 synergyBaseData() // 删除正在运行的数据 diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/scanner/QrBean.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/scanner/QrBean.kt new file mode 100644 index 0000000000..5fd0e0c394 --- /dev/null +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/scanner/QrBean.kt @@ -0,0 +1,24 @@ +package com.mogo.och.common.module.biz.scanner + +data class QrBean( + // 二维码版本 + val version: Int, + // 第一个版本 + val orderNo: String = "", // 订单Id + val uid: String = "",// 服务器端唯一码 + val phone: String = "",// 手机号码 + val bizType: Int = 0,// + val pipe: String = "",// 渠道ehsafety mogogosafety + + // 第二个版本 + val expiryTime: Long = 0, // 二维码有效期 + val bookingTime: Long = 0,// 预定时间 + val lineId: Long = 0, // 线路id + val availableTimes: Int = 0,//总票数 + val ticketSize: Int = 0,// 票上几个人 + val ticketName: String = "",// 票的名称 + val tenantId: Long = 0,// 租户id + + val shiftsId: Long = 0,// 班车业务 任务id + val startStationId: Long = 0,// bus业务使用 开始站点名称 +) \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/scanner/ScannerEnum.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/scanner/ScannerEnum.kt new file mode 100644 index 0000000000..4a7fe071a8 --- /dev/null +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/scanner/ScannerEnum.kt @@ -0,0 +1,13 @@ +package com.mogo.och.common.module.biz.scanner + +enum class BindStatus { + BIND_SUCCEED, + BIND_FAILURE_UNINSTALLED, + BIND_FAILURE_NO_PERMISSION_NOT_FOUND, + EXCEPTION, + NOTHING +} + +enum class OpenStatus { + Open, Unopen +} \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/scanner/ScannerManager.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/scanner/ScannerManager.kt new file mode 100644 index 0000000000..0ece65936b --- /dev/null +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/scanner/ScannerManager.kt @@ -0,0 +1,29 @@ +package com.mogo.och.common.module.biz.scanner + +import com.alibaba.android.arouter.launcher.ARouter +import com.mogo.och.common.module.constant.OchCommonConst +import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager + +object ScannerManager { + + private var scannerService: ScannerService? = + ARouter.getInstance().build(OchCommonConst.BIZ_SCANNER).navigation() as ScannerService + + + fun load(){ + OchChainLogManager.writeChainLogInit("初始化信息","初始化扫描器") + scannerService?.load() + } + fun release(){ + OchChainLogManager.writeChainLogInit("释放信息","释放扫描器") + scannerService?.release() + } + + fun addStateChangeListener(tag: String, listener: StateChangeListener) { + scannerService?.addStateChangeListener(tag,listener) + } + + fun removeListener(tag:String){ + scannerService?.removeListener(tag) + } +} \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/scanner/ScannerService.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/scanner/ScannerService.kt new file mode 100644 index 0000000000..365ea96974 --- /dev/null +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/scanner/ScannerService.kt @@ -0,0 +1,11 @@ +package com.mogo.och.common.module.biz.scanner + +import com.alibaba.android.arouter.facade.template.IProvider + +interface ScannerService : IProvider { + + fun addStateChangeListener(tag: String, listener: StateChangeListener) {} + fun removeListener(tag:String){} + fun load(){} + fun release(){} +} \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/scnner/ScannerStateView.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/scanner/ScannerStateView.kt similarity index 96% rename from OCH/common/common/src/main/java/com/mogo/och/common/module/manager/scnner/ScannerStateView.kt rename to OCH/common/common/src/main/java/com/mogo/och/common/module/biz/scanner/ScannerStateView.kt index fe24512136..66e5203c79 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/scnner/ScannerStateView.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/scanner/ScannerStateView.kt @@ -1,4 +1,4 @@ -package com.mogo.och.common.module.manager.scnner +package com.mogo.och.common.module.biz.scanner import android.content.Context import android.util.AttributeSet diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/scanner/StateChangeListener.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/scanner/StateChangeListener.kt new file mode 100644 index 0000000000..0decc086aa --- /dev/null +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/scanner/StateChangeListener.kt @@ -0,0 +1,6 @@ +package com.mogo.och.common.module.biz.scanner + +interface StateChangeListener { + fun stateChange(newBindValue: BindStatus, newOpentValue: OpenStatus){} + fun parseData(qrBean: QrBean){} +} \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/constant/OchCommonConst.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/constant/OchCommonConst.kt index 8d4a5a1d98..4bfbcd21d4 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/constant/OchCommonConst.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/constant/OchCommonConst.kt @@ -25,13 +25,20 @@ class OchCommonConst { return FunctionBuildConfig.urlJson.eagleMisUrl } + @JvmStatic + fun getAiUrl():String{ + return FunctionBuildConfig.urlJson.ndeUrl + } + // token 失效 重新获取token const val WAIT_TAKEN = 100046 const val BIZ_LOGIN = "/ochbiz/common/login" const val BIZ_SKIN = "/ochbiz/common/skin" + const val BIZ_SCANNER = "/ochbiz/common/scanner" const val BIZ_TIME = "/ochbiz/common/time" const val BIZ_OFFLINE = "/offlinedriver/offlinedata" + const val BIZ_Bridge = "/birdge/bridge" const val BUS_DRIVER = "/busdriver/busdriver" const val BUS_PASSENGER = "/buspassenger/buspassenger" diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/audiofocus/AudioFocusManager.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/audiofocus/AudioFocusManager.kt index 43b236de8a..d7c26644e9 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/audiofocus/AudioFocusManager.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/audiofocus/AudioFocusManager.kt @@ -7,6 +7,7 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.och.common.module.manager.audition.AuditionManager import com.mogo.och.common.module.manager.audition.MusicData import com.mogo.och.common.module.manager.audition.PlayState +import com.shuyu.gsyvideoplayer.GSYVideoManager object AudioFocusManager : AuditionManager.MusicDataChangeListener { @@ -32,6 +33,10 @@ object AudioFocusManager : AuditionManager.MusicDataChangeListener { if(temp!= isPlayingMusic){ isPlayingMusic = temp } + if(temp) { + // 播放音乐需要把视频暂停掉 + GSYVideoManager.onPause() + } CallerLogger.d(TAG,"music updateState ${isPlayingTTS}--${isPlayingMusic}---${isPlayingVideo}") } diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/audition/AuditionCacheManager.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/audition/AuditionCacheManager.kt index d8d95e1c9f..0901b578d0 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/audition/AuditionCacheManager.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/audition/AuditionCacheManager.kt @@ -5,18 +5,16 @@ import android.media.MediaFormat import android.net.Uri import android.os.Environment import android.text.TextUtils -import com.google.gson.reflect.TypeToken import com.mogo.commons.AbsMogoApplication -import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.utilcode.download.DownloadUtils import com.mogo.eagle.core.utilcode.download.callback.IDownloadListener import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_OCHCOMMON -import com.mogo.eagle.core.utilcode.util.GsonUtils import com.mogo.eagle.core.utilcode.util.ThreadUtils import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager.EVENT_KEY_INFE_WITH_MUSIC import com.mogo.och.common.module.utils.FileUtils +import com.mogo.och.common.module.wigets.media.MediaBeanManager import com.mogo.och.common.module.wigets.media.MediaPlayLogger import java.io.File import java.io.FileOutputStream @@ -40,10 +38,7 @@ object AuditionCacheManager { ThreadUtils.getIoPool().execute { val localAdDataList = mutableListOf() try { - val datas: MusicDataList = GsonUtils.fromJson( - FunctionBuildConfig.musicUrlConfig, object : TypeToken() {}.type - ) - localAdDataList.addAll(datas.musics) + localAdDataList.addAll(MediaBeanManager.getMusicList()) } catch (e: Exception) { e.printStackTrace() } diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/audition/AuditionManager.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/audition/AuditionManager.kt index 3409e0ed9b..207561a4a7 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/audition/AuditionManager.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/audition/AuditionManager.kt @@ -87,7 +87,9 @@ object AuditionManager: AuditionCacheManager.DataChangeListener, Audition.OnAudi fun playFirst(){ ThreadUtils.runOnUiThread { if(!isPlaying()){ - toggle(musicList.first()) + if(musicList.isNotEmpty()) { + toggle(musicList.first()) + } } } } @@ -118,6 +120,12 @@ object AuditionManager: AuditionCacheManager.DataChangeListener, Audition.OnAudi public interface MusicDataChangeListener{ fun addOneData(it: MusicData){} + + /** + * toggle 修改播放器状态 + * @param oldData 上一个不是 PlayState.None 的歌曲 + * @param musicData 当前播放状态发生变化的歌曲 + */ fun updateState(oldData: MusicData?,musicData: MusicData) fun updatePlayCurrent(currentPlay: Long, duration: Long, second: MusicData){} fun onMusicCompletion(musicData: MusicData) {} @@ -187,7 +195,7 @@ object AuditionManager: AuditionCacheManager.DataChangeListener, Audition.OnAudi fun getPreMusicData(it: MusicData): MusicData { val indexOf = musicList.indexOf(it) - if(indexOf== 0){ + if(indexOf == 0){ return musicList.last() }else{ return musicList[indexOf-1] diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/audition/MusicData.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/audition/MusicData.kt index cf1af2b82b..d0a23cf1be 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/audition/MusicData.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/audition/MusicData.kt @@ -1,8 +1,5 @@ package com.mogo.och.common.module.manager.audition - -data class MusicDataList(val musics: MutableList) - /** * 音乐文件 */ @@ -23,6 +20,21 @@ data class MusicData( fun isCloud():Boolean{ return songUrlType=="cloud" } + + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + + other as MusicData + + return id == other.id + } + + override fun hashCode(): Int { + return id.hashCode() + } + + } /** diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/logchainanalytic/OchChainLogManager.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/logchainanalytic/OchChainLogManager.kt index 58066154bd..9d4b22cd84 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/logchainanalytic/OchChainLogManager.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/logchainanalytic/OchChainLogManager.kt @@ -1,15 +1,9 @@ package com.mogo.och.common.module.manager.logchainanalytic -import android.text.TextUtils import com.mogo.commons.debug.DebugConfig -import com.mogo.commons.storage.SharedPrefsMgr import com.mogo.commons.utils.MogoAnalyticUtils -import com.mogo.eagle.core.data.app.AppConfigInfo -import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.deva.chain.ChainConstant -import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d -import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.eagle.core.utilcode.util.DateTimeUtils import com.zhjt.service.chain.ChainLog @@ -68,6 +62,8 @@ object OchChainLogManager { const val EVENT_KEY_INFO_CALL_EYE = "analytics_event_call_eye_och" + const val EVENT_KEY_INFO_ERROR = "analytics_event_och_error" + fun writeChainLogEye(title: String, info: String) { writeChainLog(title, info, true, EVENT_KEY_INFO_CALL_EYE) @@ -80,12 +76,17 @@ object OchChainLogManager { writeChainLog(title, info, true, EVENT_KEY_INFO_TIME) } - // 轨迹方面的日志 fun writeChainLogTrajectory(title: String, info: String) { writeChainLog(title, info, true, EVENT_KEY_INFE_WITH_TRAJECTORY) } + // 错误日志 + fun writeChainLogError(title: String, info: String) { + writeChainLog(title, info, true, EVENT_KEY_INFO_ERROR) + } + + fun writeChainLogMap(title: String, info: String) { writeChainLog(title, info, true, EVENT_KEY_INFO_MAP) } diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/scnner/ScannerClientManager.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/scnner/ScannerClientManager.kt deleted file mode 100644 index b1292352ff..0000000000 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/scnner/ScannerClientManager.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.mogo.och.common.module.manager.scnner - -import com.mogo.eagle.core.data.enums.EventTypeEnumNew -import com.mogo.eagle.core.data.msgbox.MsgBoxBean -import com.mogo.eagle.core.data.msgbox.MsgBoxType -import com.mogo.eagle.core.data.msgbox.V2XMsg -import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager.saveMsgBox -import com.mogo.och.common.module.manager.socket.lan.bean.WriteOffDevicesMsg -import com.mogo.och.common.module.manager.socket.lan.ILanMessageListener -import com.mogo.och.common.module.manager.socket.lan.LanSocketManager -import com.mogo.och.common.module.manager.socket.lan.bean.DPMsgType - -object ScannerClientManager { - - private val TAG = "ScannerClientManager" - - private val writeOfDevicefMsg = object : ILanMessageListener { - override fun targetLan(): Class = WriteOffDevicesMsg::class.java - override fun onLanMsgReceived(writeOffDevicesMsg: WriteOffDevicesMsg?){ - writeOffDevicesMsg?.let { - if (it.isConnectScanner != null) { - val reason = it.reason ?: "" - if (it.isConnectScanner==true) { // 链接成功 - saveMsgBox( - MsgBoxBean( - MsgBoxType.V2X, - V2XMsg( - EventTypeEnumNew.TYPE_DEVICE_STATUS_NORMAL.poiType, - reason, - EventTypeEnumNew.TYPE_DEVICE_STATUS_NORMAL.tts, - "" - ) - ) - ) - } else { // 核验失败 - saveMsgBox( - MsgBoxBean( - MsgBoxType.V2X, - V2XMsg( - EventTypeEnumNew.TYPE_DEVICE_STATUS_ABNORMAL.poiType, - reason, - EventTypeEnumNew.TYPE_DEVICE_STATUS_ABNORMAL.tts, - "" - ) - ) - ) - } - } - } - } - } - - fun load(){ - // 核销设备信息 - LanSocketManager.registerSocketMessageListener(DPMsgType.TYPE_WRITEOFF_DEVICES_INFO.type,writeOfDevicefMsg) - } - - fun release(){ - LanSocketManager.unRegisterSocketMessageListener(DPMsgType.TYPE_WRITEOFF_DEVICES_INFO.type,writeOfDevicefMsg) - } -} diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/scnner/StateChangeListener.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/scnner/StateChangeListener.kt deleted file mode 100644 index 6652b71e34..0000000000 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/scnner/StateChangeListener.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.mogo.och.common.module.manager.scnner - -interface StateChangeListener { - fun stateChange(newBindValue: BindStatus, newOpentValue: OpenStatus){} - fun parseData(params: MutableMap, payload: String?){} -} \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/socket/lan/bean/BaseDPMsg.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/socket/lan/bean/BaseDPMsg.kt index 4ac4e4b6c7..2ec872d268 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/socket/lan/bean/BaseDPMsg.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/socket/lan/bean/BaseDPMsg.kt @@ -6,7 +6,7 @@ import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils open class BaseDPMsg( open var type: Int = DPMsgType.TYPE_CLIENT_REGISTER.type, - open var msgVersion: Int = 1, + open var msgVersion: Int = 2, open var targetScreenTypes: MutableList = if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { mutableListOf(ScreenType.Passenger, ScreenType.Guide) diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/socket/lan/bean/DPMsgType.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/socket/lan/bean/DPMsgType.kt index d720db0152..7857e6525a 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/socket/lan/bean/DPMsgType.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/socket/lan/bean/DPMsgType.kt @@ -22,5 +22,6 @@ enum class DPMsgType(val type: Int) { TYPE_WRITEOFF_INFO_DETAIL(13), //核销信息 TYPE_WRITEOFF_INFO_RESULT(14), //核销结果 TYPE_OUTOF_VOICE(15), //转发给乘客屏播放 + TYPE_LOGIN_INFO(16), //转发给乘客屏播放 TYPE_CLIENT_REGISTER(12); //客户端注册 服务端需要 } \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/socket/lan/bean/DataBean.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/socket/lan/bean/DataBean.kt index c57b103e4c..14dcef17eb 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/socket/lan/bean/DataBean.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/socket/lan/bean/DataBean.kt @@ -1,5 +1,9 @@ package com.mogo.och.common.module.manager.socket.lan.bean +import com.mogo.commons.env.Env +import com.mogo.commons.env.Project +import com.mogo.och.common.module.biz.login.bean.OchLoginInfo + /** * @author: wangmingjun * @date: 2023/3/27 @@ -130,6 +134,12 @@ data class OutofVoice( val notice: String, ) : BaseDPMsg(DPMsgType.TYPE_OUTOF_VOICE.type, targetScreenTypes = mutableListOf(ScreenType.Passenger)) +data class LoginInfo2Client( + val loginInfo: String, + val project: Project, + val env: Env, + val isOffline:Boolean +) : BaseDPMsg(DPMsgType.TYPE_LOGIN_INFO.type,targetScreenTypes = mutableListOf(ScreenType.Passenger)) // 车辆类型 enum class VehicleType { diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/network/interceptor/FRetryWithTime.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/network/interceptor/FRetryWithTime.kt index e9e5748b5b..989d7d938c 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/network/interceptor/FRetryWithTime.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/network/interceptor/FRetryWithTime.kt @@ -2,11 +2,10 @@ package com.mogo.och.common.module.network.interceptor import com.mogo.cloud.passport.MoGoAiCloudClient import com.mogo.eagle.core.data.BaseData -import com.mogo.eagle.core.data.config.FunctionBuildConfig -import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_OCHCOMMON import com.mogo.och.common.module.biz.login.LoginStatusManager -import com.mogo.och.common.module.biz.login.LoginStatusEnum +import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager import io.reactivex.Observable import io.reactivex.ObservableSource import io.reactivex.functions.Function @@ -16,15 +15,12 @@ class FRetryWithTime : Function> { override fun apply(baseData: T): ObservableSource { baseData.let { if (it.code == 100046 || it.code == 100045 || it.code == 100005 || it.code == 100006 || it.code == 520003) { - MoGoAiCloudClient.getInstance().refreshToken() return Observable.error(OchCommonRetryException()) }else if(it.code == 1003){ - if(!FunctionBuildConfig.isOffLine&&!FunctionBuildConfig.ochdebug){ - if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { - CallerLogger.d("FRetryWithTime", "接口失败报错 1003:${LoginStatusEnum.Logout}") - LoginStatusManager.setLoginStatus(LoginStatusEnum.Logout) - } - } + CallerLogger.e(M_OCHCOMMON, "接口失败报错 1003:需重新查询登录状态") + OchChainLogManager.writeChainLogNet(true,"接口错误", + "错误code:${it.code} 后台登录状态变更 前台重新查询登录状态接口来确定") + LoginStatusManager.queryLoginStatusByNet(false) } } return Observable.just(baseData) diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/network/interceptor/RetryWithTime.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/network/interceptor/RetryWithTime.kt index 5c06544bc0..5bda2784a5 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/network/interceptor/RetryWithTime.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/network/interceptor/RetryWithTime.kt @@ -3,6 +3,7 @@ package com.mogo.och.common.module.network.interceptor import com.mogo.eagle.core.utilcode.constant.TimeConstants import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.util.TimeUtils +import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager import com.mogo.och.common.module.utils.CallerLoggerUtils.flavorTag import io.reactivex.Observable import io.reactivex.ObservableSource @@ -15,12 +16,13 @@ class RetryWithTime : Function, ObservableSource> { private const val TAG = "RetryWithTime" } var current = -1 - private var timeDelys = intArrayOf(3, 1, 2) + private var timeDelys = intArrayOf(6, 2, 4) override fun apply(throwableObservable: Observable): ObservableSource? { return throwableObservable.flatMap { ++current CallerLogger.e("${flavorTag}$TAG", " 时间:${TimeUtils.getStringByNow(0, TimeConstants.SEC)}") if (it is OchCommonRetryException && current < timeDelys.size) { + OchChainLogManager.writeChainLogError("token超时","${timeDelys[current]}s后重试") Observable.timer(timeDelys[current].toLong(), TimeUnit.SECONDS) } else { Observable.error(it) diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/utils/FlavorUtils.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/utils/FlavorUtils.kt index 431254d136..157bfd13d5 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/utils/FlavorUtils.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/utils/FlavorUtils.kt @@ -1,6 +1,8 @@ package com.mogo.och.common.module.utils import com.mogo.commons.debug.DebugConfig +import com.mogo.commons.env.Env +import com.mogo.commons.env.EnvUtils import com.mogo.commons.env.Project import com.mogo.commons.env.ProjectUtils import com.mogo.commons.storage.SharedPrefsMgr @@ -8,6 +10,7 @@ import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.mogo.Product import com.mogo.eagle.core.utilcode.util.AppUtils +import com.mogo.och.common.module.manager.cache.OchSPManager import com.mogo.och.common.module.manager.socket.lan.bean.BusinessType import com.mogo.och.common.module.manager.socket.lan.bean.EnvType import com.mogo.och.common.module.manager.socket.lan.bean.ProjectType @@ -41,7 +44,7 @@ object FlavorUtils { } else if (AppIdentityModeUtils.isB2(FunctionBuildConfig.appIdentityMode)) { info.append(" B2") } else { - info.append(" C1") + info.append(" none") } when (DebugConfig.getNetMode()) { @@ -68,61 +71,14 @@ object FlavorUtils { } info.append(" ${AppUtils.getAppVersionName()}") - info.append(" AppSN:${SharedPrefsMgr.getInstance().sn}") + info.append(" AppSN:${OchSPManager.getSn()}") return info.toString() } fun getBusinessInfo(businessType: Int): String { val businessEnum = Product.valueOf(businessType) - FunctionBuildConfig.supportBusiness.forEach { - when (it) { - "shuttle" -> { - val isSupply = businessEnum == Product.SHUTTLE - if (isSupply) { - return "" - } - } - - "bus" -> { - val isSupply = businessEnum == Product.BUS - if (isSupply) { - return "" - } - } - - "taxi" -> { - val isSupply = businessEnum == Product.TAXI - if (isSupply) { - return "" - } - } - - "charter" -> { - val isSupply = businessEnum == Product.CHARTER - if (isSupply) { - return "" - } - } - - "scheduled" -> { - val isSupply = businessEnum == Product.SCHEDULED - if (isSupply) { - return "" - } - } - - else -> {} - } - } val reason = StringBuilder() reason.append("业务异常<当前支持:") - FunctionBuildConfig.supportBusiness.forEachIndexed { index, s -> - if (index == FunctionBuildConfig.supportBusiness.size - 1) { - reason.append(s) - } else { - reason.append("${s},") - } - } when (businessEnum) { Product.TAXI -> reason.append(" 后台配置:taxi>") Product.BUS -> reason.append(" 后台配置:bus>") @@ -212,100 +168,25 @@ object FlavorUtils { } fun checkAllEnv( - projectType: ProjectType, - envType: EnvType, - vehicleType: VehicleType, - businessType: BusinessType + projectType: Project, + envType: Env, ): String { val reason = StringBuilder() - val isProjectSupply = when (ProjectUtils.getProjectType()) { - Project.SAAS -> projectType == ProjectType.saas - Project.DALI -> projectType == ProjectType.dali - Project.MOGO -> projectType == ProjectType.mogo - Project.YANTAI -> projectType == ProjectType.yantai - } + val isProjectSupply = ProjectUtils.getProjectType()==projectType + if (!isProjectSupply) { - reason.append("项目异常<当前:${ProjectUtils.getProjectType().name}, 后台配置:${projectType.name}> ") + reason.append("项目异常<当前:${ProjectUtils.getProjectType().value}, 后台配置:${projectType.value}> ") } - val currentVehicle: String - val vehicleTypeSupply = - if (AppIdentityModeUtils.isT1T2(FunctionBuildConfig.appIdentityMode)) { - currentVehicle = VehicleType.T1T2.name - vehicleType == VehicleType.T1T2 - } else if (AppIdentityModeUtils.isM1(FunctionBuildConfig.appIdentityMode)) { - currentVehicle = VehicleType.M1.name - vehicleType == VehicleType.M1 - } else if (AppIdentityModeUtils.isB1(FunctionBuildConfig.appIdentityMode)) { - currentVehicle = VehicleType.B1.name - vehicleType == VehicleType.B1 - } else if (AppIdentityModeUtils.isB2(FunctionBuildConfig.appIdentityMode)) { - currentVehicle = VehicleType.B2.name - vehicleType == VehicleType.B2 - } else { - currentVehicle = VehicleType.C1.name - vehicleType == VehicleType.C1 - } - if (!vehicleTypeSupply) { - reason.append("车型异常<当前:${currentVehicle}, 后台配置:${vehicleType.name}> ") - } + val envTypeSupply = EnvUtils.getEnvType()==envType - val currentenvType: String - val envTypeSupply = when (DebugConfig.getNetMode()) { - 2 -> { - currentenvType = EnvType.qa.name - envType == EnvType.qa - } - - 3 -> { - currentenvType = EnvType.online.name - envType == EnvType.online - } - - 4 -> { - currentenvType = EnvType.demo.name - envType == EnvType.demo - } - - else -> { - currentenvType = EnvType.qa.name - envType == EnvType.qa - } - } if (!envTypeSupply) { - reason.append("环境异常<当前:${currentenvType} 后台配置:${envType.name}> ") - } - - - val businessTypeSupply = checkBusinessMine(businessType) - - if (!businessTypeSupply) { - reason.append("业务异常<当前支持:") - FunctionBuildConfig.supportBusiness.forEachIndexed { index, s -> - if (index == FunctionBuildConfig.supportBusiness.size - 1) { - reason.append(s) - } else { - reason.append("${s},") - } - } - reason.append(" 后台配置:${businessType.name}> ") + reason.append("环境异常<当前:${EnvUtils.getEnvType().value} 后台配置:${envType.value}> ") } return reason.toString() } - fun checkBusinessMine(businessType: BusinessType): Boolean { - if (businessType == BusinessType.none) { - return true - } - FunctionBuildConfig.supportBusiness.forEach { - if (businessType.name == it) { - return true - } - } - return false - } - } \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/utils/NumberFormatUtil.java b/OCH/common/common/src/main/java/com/mogo/och/common/module/utils/NumberFormatUtil.java index 4f8e8db05e..4394f081b8 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/utils/NumberFormatUtil.java +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/utils/NumberFormatUtil.java @@ -38,4 +38,10 @@ public class NumberFormatUtil { } return ""; } + + public static String percentage(float numver,int decimal){ + float newNumber = numver*100; + return String.format("%."+decimal+"f",newNumber); + } + } diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/LoadingMapStatusView.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/LoadingMapStatusView.kt index a065605df8..903bc57e2b 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/LoadingMapStatusView.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/LoadingMapStatusView.kt @@ -8,9 +8,11 @@ import android.view.LayoutInflater import android.view.animation.LinearInterpolator import androidx.constraintlayout.widget.ConstraintLayout import com.mogo.commons.module.status.MogoStatusManager +import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.config.HdMapBuildConfig import com.mogo.eagle.core.data.enums.Carmodel import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.mogo.map.listener.IMogoMapListener @@ -42,7 +44,7 @@ class LoadingMapStatusView @JvmOverloads constructor( override fun onAttachedToWindow() { super.onAttachedToWindow() - CallerLogger.d(TAG,"onAttachedToWindow") + CallerLogger.d(TAG,"地图loading_onAttachedToWindow") LoginStatusManager.addListener(TAG,this) visibility = VISIBLE MogoMapListenerHandler.mogoMapListenerHandler.registerHostMapListener(TAG,this) @@ -70,9 +72,9 @@ class LoadingMapStatusView @JvmOverloads constructor( // CallerMapUIServiceManager.getMapUIController()?.changeCurrentIcon(currentByteArray,true) // OchChainLogManager.writeChainLog("模型加载","加载地图成功、并切换模型,${LoginStatusManager.getLoginInfo()}") - - CallerMapUIServiceManager.getMapUIController()?.changeCurrentIcon(HdMapBuildConfig.currentCarVrIconRes) - + if(!AppIdentityModeUtils.isSweeper(FunctionBuildConfig.appIdentityMode)){ + CallerMapUIServiceManager.getMapUIController()?.changeCurrentIcon(HdMapBuildConfig.currentCarVrIconRes) + } UiThreadHandler.postDelayed({ visibility = GONE },2_000,UiThreadHandler.MODE.QUEUE) } diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/OchRoundImageView.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/OchRoundImageView.kt new file mode 100644 index 0000000000..2f86b5a86f --- /dev/null +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/OchRoundImageView.kt @@ -0,0 +1,241 @@ +package com.mogo.och.common.module.wigets + +/* + * Copyright WeiLianYang + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +import android.content.Context +import android.graphics.* +import android.util.AttributeSet +import android.util.Log +import androidx.annotation.ColorInt +import androidx.appcompat.widget.AppCompatImageView +import com.mogo.och.common.module.R + + +/** + * author : WilliamYang + * date : 2022/9/18 14:54 + * description : 可设置 圆角、外边框 的 ImageView + * + * 使用方式: + * + * 1. 使用 riv_radius 设置4个角均为圆角,且圆角值一样 + * + * 2. 使用 riv_roundAsCircle 设置图片为圆形,使用 riv_radius 设置半径,当 riv_radius 未设置时,默认取宽高最小值的一半 + * + * 3. 使用 riv_topLeft_radius, riv_topRight_radius, riv_bottomLeft_radius, riv_bottomRight_radius 设置4个圆角 + * + * 4. 使用 riv_borderColor, riv_borderWidth 设置外边框颜色和宽度 + * + *

+ */ +class OchRoundImageView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : AppCompatImageView(context, attrs, defStyleAttr) { + + /** 绘制路径 **/ + private val path = Path() + + /** 绘制坐标 **/ + private val rectF = RectF() + + /** 圆角大小 **/ + private var radius = 0f + + /** 顶部左侧圆角大小 **/ + private var topLeftRadius = 0f + + /** 顶部右侧圆角大小 **/ + private var topRightRadius = 0f + + /** 底部左侧圆角大小 **/ + private var bottomLeftRadius = 0f + + /** 底部右侧圆角大小 **/ + private var bottomRightRadius = 0f + + /** 作为圆形图片使用 **/ + private var roundAsCircle = false + + /** 外边框颜色、宽度、画笔、路径、坐标 */ + private var borderColor = 0 + private var borderWidth = 0f + private val borderPaint: Paint? + private val borderPath = Path() + private val borderRectF = RectF() + + init { + val ta = context.obtainStyledAttributes(attrs, R.styleable.RoundImageView) + + roundAsCircle = ta.getBoolean(R.styleable.RoundImageView_riv_roundAsCircle, false) + borderColor = ta.getColor(R.styleable.RoundImageView_riv_borderColor, Color.TRANSPARENT) + borderWidth = ta.getDimension(R.styleable.RoundImageView_riv_borderWidth, 0f) + + radius = ta.getDimension(R.styleable.RoundImageView_riv_radius, 0f) + + topLeftRadius = ta.getDimension(R.styleable.RoundImageView_riv_topLeft_radius, 0f) + topRightRadius = ta.getDimension(R.styleable.RoundImageView_riv_topRight_radius, 0f) + bottomLeftRadius = ta.getDimension(R.styleable.RoundImageView_riv_bottomLeft_radius, 0f) + bottomRightRadius = ta.getDimension(R.styleable.RoundImageView_riv_bottomRight_radius, 0f) + + ta.recycle() + + borderPaint = Paint(Paint.ANTI_ALIAS_FLAG) + updateBorderPaint() + } + + override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) { + super.onSizeChanged(w, h, oldw, oldh) + + // 当作为圆形图片使用,且半径未设置时,半径将取宽高最小值的一半 + if (roundAsCircle && radius <= 0f) { + radius = w.coerceAtMost(h) / 2f + } + } + + override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { + // 当作为圆形图片使用,宽高值不同,取宽高的最小值作为宽和高 + val widthSize = MeasureSpec.getSize(widthMeasureSpec) + val heightSize = MeasureSpec.getSize(heightMeasureSpec) + if (roundAsCircle && widthSize > 0 && heightSize > 0 && widthSize != heightSize) { + val size = widthSize.coerceAtMost(heightSize) + setMeasuredDimension(size, size) + } else { + super.onMeasure(widthMeasureSpec, heightMeasureSpec) + } + } + + override fun onDraw(canvas: Canvas) { + val halfBorderWidth = borderWidth / 2 + if (radius > 0 || topLeftRadius > 0 || topRightRadius > 0 || bottomLeftRadius > 0 || bottomRightRadius > 0) { + // 如果设置了圆角值 + path.reset() + borderPath.reset() + if (roundAsCircle) { + path.addCircle(radius, radius, radius, Path.Direction.CW) + } else { + if (topLeftRadius == 0f) topLeftRadius = radius + if (topRightRadius == 0f) topRightRadius = radius + if (bottomLeftRadius == 0f) bottomLeftRadius = radius + if (bottomRightRadius == 0f) bottomRightRadius = radius + + Log.d("RoundImageView", "onDraw: topLeftRadius=$topLeftRadius, topRightRadius=$topRightRadius, bottomLeftRadius=$bottomLeftRadius, bottomRightRadius=$bottomRightRadius") + + val radii = floatArrayOf( + topLeftRadius, topLeftRadius, topRightRadius, topRightRadius, + bottomRightRadius, bottomRightRadius, bottomLeftRadius, bottomLeftRadius + ) + + + + borderRectF.set( + paddingLeft.toFloat() + halfBorderWidth, paddingTop.toFloat() + halfBorderWidth, + measuredWidth.toFloat() - paddingRight - halfBorderWidth, + measuredHeight.toFloat() - paddingBottom - halfBorderWidth + ) + + borderPath.addRoundRect(borderRectF, radii, Path.Direction.CW) + + if (halfBorderWidth > 0) { + radii.forEachIndexed { index, f -> + if (f > 0) { + radii[index] = f + halfBorderWidth + } + } + } + rectF.set( + paddingLeft.toFloat(), + paddingTop.toFloat(), + measuredWidth.toFloat() - paddingRight, + measuredHeight.toFloat() - paddingBottom + ) + path.addRoundRect(rectF, radii, Path.Direction.CW) + } + + // 裁剪画布 + canvas.clipPath(path) + } + + super.onDraw(canvas) + + if (borderWidth > 0 && borderPaint != null) { + if (roundAsCircle) { + canvas.drawCircle(radius, radius, radius - borderWidth / 2, borderPaint) + } else { + canvas.drawPath(borderPath, borderPaint) + } + } + } + + private fun updateBorderPaint() { + borderPaint?.apply { + color = borderColor + strokeWidth = borderWidth + style = Paint.Style.STROKE + } + } + + /** + * @param radius 圆角大小,当 asCircle 为 true 时,值作为圆形图片的半径,如果为0,则将取宽高最小值的一半 + * @param borderWidth 外边框宽度 + * @param borderColor 外边框颜色 + * @param asCircle 作为圆形图片使用,默认 false + */ + fun setRadiusAndBorder( + radius: Float, + borderWidth: Float = 0f, + @ColorInt borderColor: Int = 0, + asCircle: Boolean = false, + ) { + this.radius = radius + this.borderWidth = borderWidth + this.borderColor = borderColor + this.roundAsCircle = asCircle + + updateBorderPaint() + } + + /** + * @param topLeftRadius 顶部左侧圆角大小 + * @param topRightRadius 顶部右侧圆角大小 + * @param bottomLeftRadius 底部左侧圆角大小 + * @param bottomRightRadius 底部右侧圆角大小 + * @param borderWidth 外边框宽度 + * @param borderColor 外边框颜色 + */ + fun setRadiusAndBorder( + topLeftRadius: Float = 0f, + topRightRadius: Float = 0f, + bottomLeftRadius: Float = 0f, + bottomRightRadius: Float = 0f, + borderWidth: Float = 0f, + @ColorInt borderColor: Int = 0 + ) { + this.topLeftRadius = topLeftRadius + this.topRightRadius = topRightRadius + this.bottomLeftRadius = bottomLeftRadius + this.bottomRightRadius = bottomRightRadius + this.borderWidth = borderWidth + this.borderColor = borderColor + + updateBorderPaint() + } + +} \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/dialog/CommonFeedbackDialog.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/dialog/CommonFeedbackDialog.kt index 8ff026fbd6..75e51ad8d8 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/dialog/CommonFeedbackDialog.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/dialog/CommonFeedbackDialog.kt @@ -37,6 +37,8 @@ class CommonFeedbackDialog : BaseFloatDialog, LifecycleObserver { Status.fail -> { ivFeedbackStatus.setImageResource(R.drawable.common_feedback_fail) } + + else -> {} } RxUtils.createSubscribe(1_000) { hide() diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/orderstatus/OrderStatusViewModel.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/orderstatus/OrderStatusViewModel.kt index ae2f82b5fd..474d4d75f6 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/orderstatus/OrderStatusViewModel.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/orderstatus/OrderStatusViewModel.kt @@ -3,15 +3,16 @@ package com.mogo.och.common.module.wigets.map.orderstatus import androidx.annotation.DrawableRes import androidx.lifecycle.ViewModel import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_OCHCOMMON import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.mogo.och.common.module.R import com.mogo.och.common.module.biz.login.ILoginCallback import com.mogo.och.common.module.biz.login.LoginStatusManager -import com.mogo.och.common.module.biz.login.OpenOrderStatusEnum +import com.mogo.och.common.module.biz.login.EnumOpenOrderStatus class OrderStatusViewModel : ViewModel(), ILoginCallback { - private val TAG = OrderStatusViewModel::class.java.simpleName + private val TAG = M_OCHCOMMON+OrderStatusViewModel::class.java.simpleName private var viewCallback: IVisualCallback? = null @@ -26,11 +27,12 @@ class OrderStatusViewModel : ViewModel(), ILoginCallback { } fun setDistanceCallback(viewCallback: IVisualCallback) { + CallerLogger.d(TAG,"监听接单状态") LoginStatusManager.addListener(TAG, this) this.viewCallback = viewCallback } - override fun onOpenOrderStatusEnumChange(businessEnum: OpenOrderStatusEnum?) { + override fun onOpenOrderStatusEnumChange(businessEnum: EnumOpenOrderStatus?) { CallerLogger.d(TAG,"新的接单状态${businessEnum}") UiThreadHandler.post({ if (LoginStatusManager.isOpenOrderType()) { diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/switchvisual/SeekBarView.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/switchvisual/SeekBarView.kt index eb947263f0..66b5cdaf12 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/switchvisual/SeekBarView.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/switchvisual/SeekBarView.kt @@ -175,6 +175,8 @@ class SeekBarView : ConstraintLayout, VisualViewModel.IVisualCallback { duration = 100 }.start() } + + else -> {} } } diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/switchvisual/VisualViewModel.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/switchvisual/VisualViewModel.kt index ff3264072c..e3a859bf8d 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/switchvisual/VisualViewModel.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/switchvisual/VisualViewModel.kt @@ -88,6 +88,8 @@ class VisualViewModel : ViewModel(), Visualangle.UnChange -> { viewCallback?.setUnableChange() } + + else -> {} } } diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/media/MediaBean.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/media/MediaBean.kt index 923babdad9..c299ccc516 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/media/MediaBean.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/media/MediaBean.kt @@ -1,14 +1,106 @@ package com.mogo.och.common.module.wigets.media -data class MediaDataList(val medias: MutableList) +import com.google.gson.reflect.TypeToken +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils +import com.mogo.eagle.core.utilcode.mogo.Vehicle +import com.mogo.eagle.core.utilcode.util.GsonUtils +import com.mogo.och.common.module.manager.audition.MusicData + +object MediaBeanManager { + + private var datasGlobal: MediaDataWithVehicle? = null + + fun getMusicList(): MutableList { + if (datasGlobal == null) { + datasGlobal = GsonUtils.fromJson( + FunctionBuildConfig.mediaUrlConfig, + object : TypeToken() {}.type + ) + } + return when (AppIdentityModeUtils.getVehicle(FunctionBuildConfig.appIdentityMode)) { + Vehicle.T1T2 -> { + datasGlobal?.T1T2?.musics?:mutableListOf() + } + + Vehicle.B1 -> { + datasGlobal?.B1?.musics?:mutableListOf() + } + + Vehicle.B2 -> { + datasGlobal?.B1?.musics?:mutableListOf() + } + + Vehicle.M1 -> { + datasGlobal?.M1?.musics?:mutableListOf() + } + + else -> { + mutableListOf() + } + } + } + + fun getMediaList(): MutableList { + if (datasGlobal == null) { + datasGlobal = GsonUtils.fromJson( + FunctionBuildConfig.mediaUrlConfig, + object : TypeToken() {}.type + ) + } + return when (AppIdentityModeUtils.getVehicle(FunctionBuildConfig.appIdentityMode)) { + Vehicle.T1T2 -> { + datasGlobal?.T1T2?.medias?:mutableListOf() + } + + Vehicle.B1 -> { + datasGlobal?.B1?.medias?:mutableListOf() + } + + Vehicle.B2 -> { + datasGlobal?.B1?.medias?:mutableListOf() + } + + Vehicle.M1 -> { + datasGlobal?.M1?.medias?:mutableListOf() + } + + else -> { + mutableListOf() + } + } + } +} + +data class MediaDataWithVehicleList(val musicDataWithEnvList: MutableList) { + +} + +data class MediaDataWithVehicle( + val B1: B1, + val B2: B2, + val T1T2: T1T2, + val M1: M1, +) + + +data class B1(val medias: MutableList, val musics: MutableList) +data class B2(val medias: MutableList, val musics: MutableList) +data class T1T2(val medias: MutableList, val musics: MutableList) +data class M1(val medias: MutableList, val musics: MutableList) + +data class MediaBean( + val medias: MutableList, + val musics: MutableList, +) data class MediaItem( - var priority:Int, + var priority: Int, var fileUrl: String, var fileType: Int, var coverImageUrl: String, var title: String, - val isTemp:Boolean = false + val isTemp: Boolean = false ) { companion object { const val MEDIA_TYPE_IMAGE = 1 diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/media/MediaDataSourceManager.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/media/MediaDataSourceManager.kt index bc047fcb60..b17a0727fe 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/media/MediaDataSourceManager.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/media/MediaDataSourceManager.kt @@ -195,10 +195,7 @@ object MediaDataSourceManager { private fun getMediaDataFromLocalConfig(): List { val localAdDataList = mutableListOf() try { - val datas: MediaDataList = GsonUtils.fromJson( - FunctionBuildConfig.mediaUrlConfig, object : TypeToken() {}.type - ) - localAdDataList.addAll(datas.medias) + localAdDataList.addAll(MediaBeanManager.getMediaList()) } catch (e: Exception) { e.printStackTrace() } diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/media/MediaLoopPlayView.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/media/MediaLoopPlayView.kt index 2d508bd2a4..3c95f294e2 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/media/MediaLoopPlayView.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/media/MediaLoopPlayView.kt @@ -384,6 +384,13 @@ class AdvancePagerAdapter(context: Context, viewPager: ViewPager) : PagerAdapter return } } + if(currentItemView is AdvanceImageView){ + if(mItemViewList.size == 1){ + currentItemView.displayImage() + startImageCountDownTimer() + return + } + } if (currentPosition == mItemViewList.size - 1) { //已经到最后一个, 从头开始 mViewPager.post { diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/media/MediaPlayerCustomView.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/media/MediaPlayerCustomView.kt index f2d870f1dc..899639d571 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/media/MediaPlayerCustomView.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/media/MediaPlayerCustomView.kt @@ -1,4 +1,5 @@ import android.content.Context +import android.graphics.Bitmap import android.media.AudioManager import android.net.Uri import android.text.TextUtils @@ -6,7 +7,11 @@ import android.util.AttributeSet import android.widget.ImageView import android.widget.RelativeLayout import com.bumptech.glide.Glide +import com.bumptech.glide.load.DataSource +import com.bumptech.glide.load.engine.GlideException +import com.bumptech.glide.request.RequestListener import com.bumptech.glide.request.RequestOptions +import com.bumptech.glide.request.target.Target import com.mogo.eagle.core.utilcode.download.callback.IDownloadListener import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.Logger @@ -436,7 +441,29 @@ class AdvanceImageView @JvmOverloads constructor( .error(placeholderDrawable) .fallback(placeholderDrawable) .centerCrop() - ).into(it) + ).listener(object :RequestListener{ + override fun onLoadFailed( + e: GlideException?, + model: Any?, + target: Target?, + isFirstResource: Boolean + ): Boolean { + MediaPlayLogger.printErrorLog("图片加载失败:${e?.message}") + return false + } + + override fun onResourceReady( + resource: Bitmap?, + model: Any?, + target: Target?, + dataSource: DataSource?, + isFirstResource: Boolean + ): Boolean { + return false + } + + }) + .into(it) } } } \ No newline at end of file diff --git a/OCH/common/common/src/main/res/layout/common_dialog_status_new.xml b/OCH/common/common/src/main/res/layout/common_dialog_status_new.xml index 08c4f07159..55edd0baab 100644 --- a/OCH/common/common/src/main/res/layout/common_dialog_status_new.xml +++ b/OCH/common/common/src/main/res/layout/common_dialog_status_new.xml @@ -56,14 +56,17 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/common/common/src/test/java/com/mogo/och/common/module/ExampleUnitTest.kt b/OCH/common/common/src/test/java/com/mogo/och/common/module/ExampleUnitTest.kt index d0d1ba1721..d8ec188e28 100644 --- a/OCH/common/common/src/test/java/com/mogo/och/common/module/ExampleUnitTest.kt +++ b/OCH/common/common/src/test/java/com/mogo/och/common/module/ExampleUnitTest.kt @@ -1,6 +1,7 @@ package com.mogo.och.common.module import com.google.gson.reflect.TypeToken +import com.mogo.eagle.core.network.utils.digest.DigestUtils import com.mogo.eagle.core.utilcode.util.CoordinateTransform import com.mogo.eagle.core.utilcode.util.CoordinateUtils import com.mogo.eagle.core.utilcode.util.GsonUtils @@ -29,19 +30,25 @@ class ExampleUnitTest { } @Test fun testData() { - for(time in 0 until 7200){ - val second2Time = DateTimeUtil.second2Time(time.toLong()) + val mogoReqTime = System.currentTimeMillis().toString() + val encodedPath = "/vehicleLocation/location/navigationLocationPoints".toUpperCase() - val listSplit = second2Time.split(":") + val mogoAuthKey = DigestUtils.md5Hex(encodedPath+ mogoReqTime) + println("mogoReqTime:${mogoReqTime}----mogoAuthKey:${mogoAuthKey}") - println("${listSplit[0]}时:${listSplit[1]}分") - } +// for(time in 0 until 7200){ +// val second2Time = DateTimeUtil.second2Time(time.toLong()) +// +// val listSplit = second2Time.split(":") +// +// println("${listSplit[0]}时:${listSplit[1]}分") +// } } @Test fun resetDataOnlyOne(){ - val wgS84ToGCJ021 = CoordinateTransform.WGS84ToGCJ02(112.57734109982152,26.819824546720504) - val wgS84ToGCJ022 = CoordinateTransform.WGS84ToGCJ02(112.57299,26.90656) + val wgS84ToGCJ021 = CoordinateTransform.WGS84ToGCJ02(121.16223587817339,31.282241760977307) + val wgS84ToGCJ022 = CoordinateTransform.WGS84ToGCJ02(121.17099138155325,31.28418305918798) println("${wgS84ToGCJ021[1]},${wgS84ToGCJ021[0]}----1") println("${wgS84ToGCJ022[1]},${wgS84ToGCJ022[0]}----2") } diff --git a/OCH/facade/build.gradle b/OCH/facade/build.gradle index 3daccbaaa9..45e3e26946 100644 --- a/OCH/facade/build.gradle +++ b/OCH/facade/build.gradle @@ -35,20 +35,6 @@ android { kotlinOptions { jvmTarget = '1.8' } - - flavorDimensions "vehicle" - productFlavors { - // 车型:金旅星辰、开沃 小巴业务 - jinlvvan { - dimension "vehicle" - buildConfigField 'int', 'NEW_TEST', '0' - } - // 车型:金旅m2 小巴业务 - m2 { - dimension "vehicle" - buildConfigField 'int', 'NEW_TEST', '1' - } - } } dependencies { diff --git a/OCH/facade/script/och.gradle b/OCH/facade/script/och.gradle index 4c8554f943..7ee8273cea 100644 --- a/OCH/facade/script/och.gradle +++ b/OCH/facade/script/och.gradle @@ -6,49 +6,32 @@ project.dependencies { } else { if(isDriver()){ implementation project.project(':OCH:offline:driver') - } - if (isCurrentDriver("C1")) { - implementation project.project(':OCH:sweeper:driver') - } else if (isCurrentDriver("B1")) { - implementation project.project(':OCH:shuttle:driver_weaknet') - } else if (isCurrentPassenger("B1")) { - implementation project.project(':OCH:shuttle:passenger_weaknet') - } else if (isCurrentBaiLing("B1")) { - implementation project.project(':OCH:shuttle:driver_weaknet') - implementation project.project(':OCH:shuttle:passenger_weaknet') - } else if (isCurrentDriver("M1")) { - implementation project.project(':OCH:charter:driver') - implementation project.project(':OCH:shuttle:driver_weaknet') - } else if (isCurrentPassenger("M1")) { - implementation project.project(':OCH:shuttle:passenger_weaknet') - } else if (isCurrentDriver("B2")) { - implementation project.project(':OCH:shuttle:driver_weaknet') - } else if (isCurrentPassenger("B2")) { - implementation project.project(':OCH:shuttle:passenger_weaknet') - } else if (isCurrentDriver("T1T2")) { - implementation project.project(':OCH:taxi:unmanned-driver') - } else if (isCurrentPassenger("T1T2")) { - implementation project.project(':OCH:taxi:unmanned-passenger') - } else if (isCurrentDriver("ALL")) { - implementation project.project(':OCH:taxi:unmanned-driver') - implementation project.project(':OCH:charter:driver') implementation project.project(':OCH:sweeper:driver') implementation project.project(':OCH:shuttle:driver_weaknet') - } else if (isCurrentPassenger("ALL")) { + implementation project.project(':OCH:charter:driver') + implementation project.project(':OCH:taxi:unmanned-driver') + }else if(isPassenger()){ + implementation project.project(':OCH:shuttle:passenger_weaknet') implementation project.project(':OCH:taxi:unmanned-passenger') implementation project.project(':OCH:charter:passenger') + }else if(isBaiLing()){ + implementation project.project(':OCH:offline:driver') + implementation project.project(':OCH:shuttle:driver_weaknet') implementation project.project(':OCH:shuttle:passenger_weaknet') - - } else { implementation project.project(':OCH:charter:driver') implementation project.project(':OCH:charter:passenger') implementation project.project(':OCH:sweeper:driver') -// implementation project.project(':OCH:taxi:driver') -// implementation project.project(':OCH:taxi:passenger') implementation project.project(':OCH:taxi:unmanned-driver') implementation project.project(':OCH:taxi:unmanned-passenger') - implementation project.project(':OCH:shuttle:passenger_weaknet') + }else { + implementation project.project(':OCH:offline:driver') implementation project.project(':OCH:shuttle:driver_weaknet') + implementation project.project(':OCH:shuttle:passenger_weaknet') + implementation project.project(':OCH:charter:driver') + implementation project.project(':OCH:charter:passenger') + implementation project.project(':OCH:sweeper:driver') + implementation project.project(':OCH:taxi:unmanned-driver') + implementation project.project(':OCH:taxi:unmanned-passenger') } } } diff --git a/OCH/facade/src/m2/AndroidManifest.xml b/OCH/facade/src/m2/AndroidManifest.xml deleted file mode 100644 index b618877172..0000000000 --- a/OCH/facade/src/m2/AndroidManifest.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/OCH/facade/src/main/java/com/mogo/och/facade/route/FacadeDriverProvider.kt b/OCH/facade/src/main/java/com/mogo/och/facade/route/FacadeDriverProvider.kt index 5207959508..73c5213017 100644 --- a/OCH/facade/src/main/java/com/mogo/och/facade/route/FacadeDriverProvider.kt +++ b/OCH/facade/src/main/java/com/mogo/och/facade/route/FacadeDriverProvider.kt @@ -9,7 +9,7 @@ import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.och.bridge.device.checkvin.CheckVinManager import com.mogo.och.bridge.ota.OTAManager import com.mogo.och.common.module.biz.lansocket.LoginLanDriverSocket -import com.mogo.och.common.module.biz.login.LoginStatusEnum +import com.mogo.och.common.module.biz.login.EnumLoginStatus import com.mogo.och.common.module.biz.login.LoginStatusManager import com.mogo.och.common.module.biz.offline.OfflineManager import com.mogo.och.common.module.manager.socket.lan.LanSocketManager @@ -58,7 +58,7 @@ class FacadeDriverProvider : FacadeProvider() { super.onDestroy() } - override fun onStatusChange(currentStatus: LoginStatusEnum) { - super.onStatusChange(currentStatus) + override fun onLoginStatusChange(currentStatus: EnumLoginStatus) { + super.onLoginStatusChange(currentStatus) } } diff --git a/OCH/facade/src/main/java/com/mogo/och/facade/route/FacadeProvider.kt b/OCH/facade/src/main/java/com/mogo/och/facade/route/FacadeProvider.kt index a54a18a5da..953494b8f6 100644 --- a/OCH/facade/src/main/java/com/mogo/och/facade/route/FacadeProvider.kt +++ b/OCH/facade/src/main/java/com/mogo/och/facade/route/FacadeProvider.kt @@ -11,10 +11,8 @@ import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentManager import com.alibaba.android.arouter.launcher.ARouter import com.mogo.commons.env.ProjectUtils -import com.mogo.commons.utils.MogoAnalyticUtils import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.function.api.base.IMoGoFunctionProvider -import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager import com.mogo.eagle.core.function.call.hmi.CallerHmiManager import com.mogo.eagle.core.function.call.och.CallerEagleBaseFunctionCall4OchManager import com.mogo.eagle.core.function.hmi.ui.setting.SopView @@ -22,22 +20,20 @@ import com.mogo.eagle.core.function.hmi.ui.setting.ToggleDebugView import com.mogo.eagle.core.function.hmi.ui.widget.StatusBarView import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.mogo.Product -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d -import com.mogo.eagle.core.utilcode.util.AppUtils import com.mogo.eagle.core.utilcode.util.DeviceUtils import com.mogo.eagle.core.utilcode.util.ProcessUtils -import com.mogo.eagle.core.utilcode.util.TimeUtils import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.mogo.eagle.core.utilcode.util.VolumeUtils import com.mogo.och.common.module.biz.login.ILoginCallback -import com.mogo.och.common.module.biz.login.LoginStatusEnum +import com.mogo.och.common.module.biz.login.EnumLoginStatus import com.mogo.och.common.module.biz.login.LoginStatusManager import com.mogo.och.common.module.biz.provider.CommonService import com.mogo.och.common.module.biz.skin.SkinManager import com.mogo.och.common.module.biz.time.TimeManager import com.mogo.och.common.module.constant.OchCommonConst import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager +import com.mogo.och.common.module.manager.loop.BizLoopManager import me.jessyan.autosize.utils.AutoSizeUtils @@ -97,13 +93,6 @@ abstract class FacadeProvider : IMoGoFunctionProvider, ILoginCallback { } private fun getFragment(): Fragment { - if (FunctionBuildConfig.isOffLine) { - if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { - return getFragmentByServeName(OchCommonConst.OFFLINE_DRIVER) - } else if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { - return getFragmentByServeName(OchCommonConst.OFFLINE_PASSENGER) - } - } if(DeviceUtils.isEB5Model() && !AppIdentityModeUtils.isCharterPassenger(FunctionBuildConfig.appIdentityMode)){ val maxVolume = VolumeUtils.getMaxVolume(AudioManager.STREAM_MUSIC) val volume = VolumeUtils.getVolume(AudioManager.STREAM_MUSIC) @@ -115,6 +104,13 @@ abstract class FacadeProvider : IMoGoFunctionProvider, ILoginCallback { OchChainLogManager.writeChainLog("音量设置后","最大声音量:${maxVolume}------当前音量:${volumeafter}----目的音量:${tartgetVolume}") } } + if (FunctionBuildConfig.isOffLine) { + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + return getFragmentByServeName(OchCommonConst.OFFLINE_DRIVER) + } else if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { + return getFragmentByServeName(OchCommonConst.SHUTTLE_PASSENGER_WEAKNET) + } + } if (AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode) ||AppIdentityModeUtils.isShuttle(FunctionBuildConfig.appIdentityMode) ||AppIdentityModeUtils.isScheduled(FunctionBuildConfig.appIdentityMode)) { @@ -159,16 +155,24 @@ abstract class FacadeProvider : IMoGoFunctionProvider, ILoginCallback { } } + override fun onProductChange(businessEnum: Product?) { + if(FunctionBuildConfig.ochdebug){ + BizLoopManager.runInMainThread{ + showFragment() + } + } + } + override fun onDestroy() { //若不调用finish, 设置中打开关闭UITouch,会造成och fragment 重叠 if (activity == null) return activity!!.finish() } - override fun onStatusChange(currentStatus: LoginStatusEnum) { + override fun onLoginStatusChange(currentStatus: EnumLoginStatus) { d(TAG, "登录状态发生改变 $currentStatus") when (currentStatus) { - LoginStatusEnum.Login -> { + EnumLoginStatus.Login -> { CallerEagleBaseFunctionCall4OchManager.updateLoginStatus(true) } else -> { @@ -180,69 +184,6 @@ abstract class FacadeProvider : IMoGoFunctionProvider, ILoginCallback { } } - override fun onBusinessChange(businessEnum: Product) { - super.onBusinessChange(businessEnum) - val (_, identity, model) = AppIdentityModeUtils.getInfo(FunctionBuildConfig.appIdentityMode) - when (businessEnum) { - Product.NONE -> {} - Product.TAXI -> FunctionBuildConfig.appIdentityMode = - "${AppIdentityModeUtils.TAXI}_${identity}_${model}" - - Product.BUS -> FunctionBuildConfig.appIdentityMode = - "${AppIdentityModeUtils.BUS}_${identity}_${model}" - - Product.SHUTTLE -> FunctionBuildConfig.appIdentityMode = - "${AppIdentityModeUtils.SHUTTLE}_${identity}_${model}" - - Product.CHARTER -> FunctionBuildConfig.appIdentityMode = - "${AppIdentityModeUtils.CHARTER}_${identity}_${model}" - - Product.SCHEDULED -> FunctionBuildConfig.appIdentityMode = - "${AppIdentityModeUtils.SCHEDULED}_${identity}_${model}" - } - CallerDevaToolsManager.updateAppChannel() - // 加入启动统计 - val mStartParams: HashMap = HashMap() - mStartParams["start_time"] = TimeUtils.getNowMills() - mStartParams["app_version"] = AppUtils.getAppVersionName() - mStartParams["app_identity_mode"] = FunctionBuildConfig.appIdentityMode - MogoAnalyticUtils.track("app_start_time", mStartParams) - } - - override fun onBusinessChangeDebug(businessEnum: Product) { - if (businessEnum == Product.NONE) { - CallerHmiManager.hideToolsView() - ToggleDebugView.toggleDebugView.dismiss() - SopView.sopView.dismiss() - CallerHmiManager.dismissFSMExceptionStatusWindow() - CallerHmiManager.hideStatusSummaryDialog() - _commonService?.resetFragment() - val fragment = LoginStatusManager.getFragment() - val supportFragmentManager: FragmentManager? = activity?.supportFragmentManager - if (supportFragmentManager != null) { - val back = supportFragmentManager.beginTransaction() - back.replace(containerId, fragment, fragment.tag) - back.commitAllowingStateLoss() - } - removeStatusBar() - } else { - onBusinessChange(businessEnum) - FunctionBuildConfig.ochdebug = true - d(TAG, "denbug模式进入${LoginStatusEnum.Login}") - LoginStatusManager.setLoginStatus(LoginStatusEnum.Login) - val supportFragmentManager: FragmentManager? = activity?.supportFragmentManager - val fragment = getFragment() - d(TAG, "切换 fragment:${fragment}_activity:$activity _ ${containerId}_$this") - LoginStatusManager.resetFragment() - if (supportFragmentManager != null) { - val back = supportFragmentManager.beginTransaction() - back.replace(containerId, fragment, fragment.tag) - back.commitAllowingStateLoss() - } - injectStatusBar() - } - } - private fun injectStatusBar() { activity?.let { val decorView = it.window.decorView as? FrameLayout ?: return diff --git a/OCH/facade/src/main/java/com/mogo/och/facade/route/SweeperFacadeProvider.kt b/OCH/facade/src/main/java/com/mogo/och/facade/route/SweeperFacadeProvider.kt index 37eb9d8fe8..0c7ad56a9d 100644 --- a/OCH/facade/src/main/java/com/mogo/och/facade/route/SweeperFacadeProvider.kt +++ b/OCH/facade/src/main/java/com/mogo/och/facade/route/SweeperFacadeProvider.kt @@ -51,7 +51,7 @@ import com.mogo.och.common.module.biz.provider.CommonService if (supportFragmentManager != null) { val back = supportFragmentManager.beginTransaction() back.replace(containerId, fragment, fragment.tag) - back.commit() + back.commitAllowingStateLoss() } } diff --git a/OCH/facade/src/main/java/com/mogo/och/facade/view/OchCustomViewProvider.kt b/OCH/facade/src/main/java/com/mogo/och/facade/view/OchCustomViewProvider.kt index 0cee2cdba1..d24714e3f9 100644 --- a/OCH/facade/src/main/java/com/mogo/och/facade/view/OchCustomViewProvider.kt +++ b/OCH/facade/src/main/java/com/mogo/och/facade/view/OchCustomViewProvider.kt @@ -10,7 +10,7 @@ import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_OCHCOMMON import com.mogo.och.common.module.biz.login.ILoginCallback -import com.mogo.och.common.module.biz.login.LoginStatusEnum +import com.mogo.och.common.module.biz.login.EnumLoginStatus import com.mogo.och.common.module.biz.login.LoginStatusManager import com.mogo.och.common.module.biz.provider.CommonService import com.mogo.och.facade.constant.FacadeConst @@ -19,18 +19,17 @@ import com.mogo.och.facade.route.FacadeProvider @Route(path = FacadeConst.OCH_VIEW_PATH) class OchCustomViewProvider : IOchCustomViewProvider, ILoginCallback { - companion object { - const val TAG = M_OCHCOMMON+"OchCustomViewProvider" - } + private val TAG = M_OCHCOMMON+"OchViewProvider" init { + CallerLogger.d(TAG,"初始化_提供View") LoginStatusManager.addListener(TAG,this) } private var commonService: CommonService?=null - override fun onStatusChange(currentStatus: LoginStatusEnum?) { - if(currentStatus!=LoginStatusEnum.Login){ + override fun onLoginStatusChange(currentStatus: EnumLoginStatus?) { + if(currentStatus!=EnumLoginStatus.Login){ commonService = null } } diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/model/LineModel.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/model/LineModel.kt index 7c284010bf..1aee807bba 100644 --- a/OCH/offline/driver/src/main/java/com/mogo/och/offline/model/LineModel.kt +++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/model/LineModel.kt @@ -451,9 +451,9 @@ object LineModel { ochInfo.siteMarkerList = mutableListOf() CallerDataCenterBizListener.invokeOchInfo(ochInfo) OchChainLogManager.writeChainLogMap("地图", "站点信息:${ochInfo}") - CallerEagleBaseFunctionCall4OchManager.updateOrderStatus(true) - } else { CallerEagleBaseFunctionCall4OchManager.updateOrderStatus(false) + } else { + CallerEagleBaseFunctionCall4OchManager.updateOrderStatus(true) val siteList = mutableListOf() var temp: SiteMarkerBean? = null stationList?.let { @@ -527,6 +527,7 @@ object LineModel { fun deleteObsoleteData() { TaskDb.deleteObsoleteData() TaskSiteDb.deleteObsoleteData() + callEyeMap(7) } } diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/model/OrderModel.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/model/OrderModel.kt index 7e58ff4956..bfcec50d95 100644 --- a/OCH/offline/driver/src/main/java/com/mogo/och/offline/model/OrderModel.kt +++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/model/OrderModel.kt @@ -447,7 +447,6 @@ object OrderModel { LineManager.setLineInfo(null) LineManager.setContraiInfo(null) LineManager.setStartAndEndStation(null,null) - FunctionBuildConfig.isOffLine = false LoginStatusManager.loginOut() } } diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/MyDataBase.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/MyDataBase.kt index 90fe034a91..c99ef83a5f 100644 --- a/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/MyDataBase.kt +++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/MyDataBase.kt @@ -26,10 +26,6 @@ import com.mogo.och.offline.repository.db.dao.TaskSiteDataDao @Database(entities = [ContrailDataBean::class, LineDataBean::class, SiteDataBean::class, TaskSiteDataBean::class, TaskDataBean::class], version = 6) abstract class MyDataBase : RoomDatabase() { - override fun getOpenHelper(): SupportSQLiteOpenHelper { - return super.getOpenHelper() - } - private val dbRepositorys = mutableListOf() override fun close() { diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/repository/LineDb.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/repository/LineDb.kt index 10b10611a3..86cd2896a3 100644 --- a/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/repository/LineDb.kt +++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/repository/LineDb.kt @@ -31,7 +31,7 @@ object LineDb: IDbRepository { * 读取可用线路 */ fun queryCanUseLineRx(): Observable?>? { - return lineDao?.loadDataRx(tenantId = LoginStatusManager.getLoginInfo()?.tenantId?:0L, projectName = ProjectUtils.getProjectType().value) + return lineDao?.loadDataRx(tenantId = LoginStatusManager.getOchCarInfo()?.tenantId?:0L, projectName = ProjectUtils.getProjectType().value) } fun checkAndUpdate(serverDatalist:List){ @@ -40,7 +40,7 @@ object LineDb: IDbRepository { override fun run() { // 校验数据个数 lineDao?.let { lineDao-> - val loadData = lineDao.loadData(tenantId = LoginStatusManager.getLoginInfo()?.tenantId?:0L, projectName = ProjectUtils.getProjectType().value) + val loadData = lineDao.loadData(tenantId = LoginStatusManager.getOchCarInfo()?.tenantId?:0L, projectName = ProjectUtils.getProjectType().value) if(loadData.isNullOrEmpty()){ // 插入新的值 lineDao.insert(*serverDatalist.toTypedArray()) diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/net/bean/BindLineListResponse.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/net/bean/BindLineListResponse.kt index 9d14fa97d1..3156ddc0cb 100644 --- a/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/net/bean/BindLineListResponse.kt +++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/net/bean/BindLineListResponse.kt @@ -36,7 +36,7 @@ data class BindLineListResponse(val data: List?) : BaseData(){ tempLineInfo.lineId = lineInfo.lineId tempLineInfo.lineName = lineInfo.lineName tempLineInfo.endStationName = dataInfo.siteList?.last()?.name?:"" - tempLineInfo.tenantId = LoginStatusManager.getLoginInfo()?.tenantId?:0 + tempLineInfo.tenantId = LoginStatusManager.getOchCarInfo()?.tenantId?:0 tempLineInfo.projectName = ProjectUtils.getProjectType().value lineList.add(tempLineInfo) } diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/bizswitch/SwitchBizView.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/bizswitch/SwitchBizView.kt index 7bfd775dbe..303b914624 100644 --- a/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/bizswitch/SwitchBizView.kt +++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/bizswitch/SwitchBizView.kt @@ -75,7 +75,7 @@ class SwitchBizView: WindowRelativeLayout, SwtichBizModel.SwtichLineViewCallback CallerLogger.d(TAG,"开始展示 lading 时间:${startLoading}") loading_biz.visibility = VISIBLE swtichLine.visibility = GONE - queryTimeout = RxUtils.createSubscribe(10_1000) { + queryTimeout = RxUtils.createSubscribe(10_000) { OchChainLogManager.writeChainLog("Loading超时","loading 展示了10s") CallerLogger.d(TAG,"Loading超时:loading 展示了10s") viewModel?.queryRuningTask() diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/fragment/OfflinePresenter.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/fragment/OfflinePresenter.kt index b1bc5db7bc..9a11943329 100644 --- a/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/fragment/OfflinePresenter.kt +++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/fragment/OfflinePresenter.kt @@ -6,7 +6,7 @@ import com.mogo.commons.mvp.Presenter import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_OFFLINE import com.mogo.och.common.module.biz.login.ILoginCallback -import com.mogo.och.common.module.biz.login.LoginStatusEnum +import com.mogo.och.common.module.biz.login.EnumLoginStatus import com.mogo.och.common.module.biz.login.LoginStatusManager import com.mogo.och.common.module.biz.login.LoginStatusManager.isLogin import com.mogo.och.bridge.autopilot.OCHAdasAbilityManager @@ -43,7 +43,7 @@ class OfflinePresenter(view: OfflineFragment?) : Presenter(vie OrderModel.release() } - override fun onStatusChange(currentStatus: LoginStatusEnum) { + override fun onLoginStatusChange(currentStatus: EnumLoginStatus) { d(TAG, " loginStatus =" + isLogin()) if (!isLogin()) { OffLineTrajectoryManager.stopTrajReqLoop() diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/util/OffLineTrajectoryManager.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/util/OffLineTrajectoryManager.kt index a25f7a8f48..0169e1ca5b 100644 --- a/OCH/offline/driver/src/main/java/com/mogo/och/offline/util/OffLineTrajectoryManager.kt +++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/util/OffLineTrajectoryManager.kt @@ -8,8 +8,8 @@ import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_ import com.mogo.eagle.core.utilcode.util.GsonUtils import com.mogo.och.bridge.autopilot.line.LineManager import com.mogo.och.common.module.biz.login.LoginStatusManager.isLogin -import com.mogo.och.bridge.autopilot.trajectory.ITrajectoryListListener -import com.mogo.och.bridge.autopilot.trajectory.TrajectoryManager +import com.mogo.och.bridge.trajectory.ITrajectoryListListener +import com.mogo.och.bridge.trajectory.TrajectoryManager import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager import com.mogo.och.offline.constant.BusConst import com.mogo.och.offline.model.LineModel diff --git a/OCH/offline/driver/src/main/res/values/strings.xml b/OCH/offline/driver/src/main/res/values/strings.xml index 1a777f3682..c0cfeb72b5 100644 --- a/OCH/offline/driver/src/main/res/values/strings.xml +++ b/OCH/offline/driver/src/main/res/values/strings.xml @@ -28,7 +28,7 @@ - 已到达%1$s,带好随身物品,下车请注意安全。 + 已到达%1$s,请带好随身物品,下车时注意后方来车。 We are arriving at %1$s ,get off with your belongings %1$s 역에 도착했습니다 , 소지품 챙겨서 내리세요 diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ShuttleDriverProvider.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ShuttleDriverProvider.kt index c1a622a3e4..e6446e10db 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ShuttleDriverProvider.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ShuttleDriverProvider.kt @@ -6,14 +6,13 @@ import androidx.fragment.app.Fragment import com.alibaba.android.arouter.facade.annotation.Route import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d -import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS import com.mogo.eagle.core.utilcode.util.ThreadUtils import com.mogo.och.common.module.constant.OchCommonConst import com.mogo.och.common.module.biz.provider.CommonServiceImpl import com.mogo.och.bridge.autopilot.autopilot.OchAutopilotAnalytics import com.mogo.och.bridge.ui.autopilot.AutopilotState -import com.mogo.och.common.module.manager.scnner.ScannerClientManager +import com.mogo.och.common.module.biz.scanner.ScannerManager import com.mogo.och.weaknet.repository.db.repository.EventDb import com.mogo.och.weaknet.repository.db.repository.LineDb import com.mogo.och.weaknet.repository.db.repository.TaskDb @@ -56,7 +55,7 @@ class ShuttleDriverProvider : CommonServiceImpl() { } OchAutopilotAnalytics.ochEventKey = BusAnalyticsManager LineModel.init() - ScannerClientManager.load() + ScannerManager.load() BusTrajectoryManager.load() return busFragment!! } @@ -66,7 +65,7 @@ class ShuttleDriverProvider : CommonServiceImpl() { busFragment = null OchAutopilotAnalytics.ochEventKey = null LineModel.release() - ScannerClientManager.release() + ScannerManager.release() BusTrajectoryManager.release() RepositoryManager.release() } diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/action/TaskUsedAction.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/action/TaskUsedAction.kt index a705d1e6ed..49145e2846 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/action/TaskUsedAction.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/action/TaskUsedAction.kt @@ -21,7 +21,7 @@ class TaskUsedAction() : override fun onMsgReceived(obj: TaskUsedMsg?) { i(tag, "onMsgReceived = $obj") obj?.apply { - if (LoginStatusManager.getLoginInfo()?.businessType==businessType + if (LoginStatusManager.getOchBizInfo()?.businessType==businessType &&RepositoryManager.supportDb()) { LineModel.endTaskByOther(taskId,plateNumber) } diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/bean/request/ShuttleEventRequest.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/bean/request/ShuttleEventRequest.kt index 8de335317b..3a1410c145 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/bean/request/ShuttleEventRequest.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/bean/request/ShuttleEventRequest.kt @@ -18,7 +18,7 @@ data class ShuttleEventRequest(val requestId: String, val sn: String,val vin:Str waitUpdateEvent: List?, waitUpdateWriteOffEvent: List? ): ShuttleEventRequest { - val businessTypeShuttle = LoginStatusManager.getLoginInfo()?.businessType?:11 + val businessTypeShuttle = LoginStatusManager.getOchBizInfo()?.businessType?:11 val eventList4Request = mutableListOf() var tempEvent: Event?=null waitUpdateEvent?.forEach { diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/model/LineModel.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/model/LineModel.kt index 44933b0a36..c608e14617 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/model/LineModel.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/model/LineModel.kt @@ -470,7 +470,7 @@ object LineModel { } fun endTaskByOther(taskId: Long,plateNumber:String) { - if(LoginStatusManager.getLoginInfo()?.plateNumber==plateNumber){ + if(LoginStatusManager.getOchCarInfo()?.plateNumber==plateNumber){ d(TAG,"当前车辆消耗任务") return } diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/MyDataBase.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/MyDataBase.kt index 44be020c57..e26a5283e4 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/MyDataBase.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/MyDataBase.kt @@ -36,10 +36,6 @@ import java.io.File @Database(entities = [ContrailDataBean::class, LineDataBean::class, SiteDataBean::class, TaskDataBean::class, TaskSiteDataBean::class, EventDataBean::class, WriteOffDataBean::class], version = 6) abstract class MyDataBase : RoomDatabase() { - override fun getOpenHelper(): SupportSQLiteOpenHelper { - return super.getOpenHelper() - } - private val dbRepositorys = mutableListOf() override fun close() { diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/bean/TaskDataBean.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/bean/TaskDataBean.kt index 19312335e1..480bbe9225 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/bean/TaskDataBean.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/bean/TaskDataBean.kt @@ -4,6 +4,7 @@ import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey import com.google.gson.annotations.SerializedName +import com.mogo.och.weaknet.repository.RepositoryManager @Entity(tableName = TaskDataBean.tableName) data class TaskDataBean( @@ -95,15 +96,24 @@ data class TaskDataBean( } fun getLineIdAndName(function: (shiftsId:Long,taskId: Long, taskTime: Long , taskDate:Long) -> Unit) { - taskId?.let { id -> - taskStartTime?.let { time -> - taskDate?.let { date -> - shiftsId?.let {shiftsId-> - function(shiftsId,id, time, date) + if (RepositoryManager.supportDb()) { + taskId?.let { id -> + taskStartTime?.let { time -> + taskDate?.let { date -> + shiftsId?.let {shiftsId-> + function(shiftsId,id, time, date) + } } } } + }else{ + taskId?.let { id -> + taskStartTime?.let { time -> + function(shiftsId?:0,id, time, taskDate?:System.currentTimeMillis()) + } + } } + } diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/repository/EventDb.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/repository/EventDb.kt index 80dbb67b1f..1325272b82 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/repository/EventDb.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/repository/EventDb.kt @@ -41,7 +41,7 @@ object EventDb: IDbRepository { event.taskStartTime = taskStartTime event.businessTime = DateTimeUtil.getCurrentTimeStamp() event.writeVersion = DateTimeUtil.getCurrentTimeStamp() - event.driverId = LoginStatusManager.getLoginInfo()?.driverId?:-1 + event.driverId = LoginStatusManager.getOchLoginInfo()?.driverId?:-1 event.siteId = 0L event.seq = 0 event.msgId = "${OchSPManager.getSn()}_${DateTimeUtil.getCurrentTimeStamp()}" @@ -72,7 +72,7 @@ object EventDb: IDbRepository { event.businessTime = DateTimeUtil.getCurrentTimeStamp() event.writeVersion = DateTimeUtil.getCurrentTimeStamp() event.siteId = siteId - event.driverId = LoginStatusManager.getLoginInfo()?.driverId?:-1 + event.driverId = LoginStatusManager.getOchLoginInfo()?.driverId?:-1 event.seq = seq event.msgId = "${OchSPManager.getSn()}_${DateTimeUtil.getCurrentTimeStamp()}" BizLoopManager.runInIoThread { @@ -101,7 +101,7 @@ object EventDb: IDbRepository { event.lineName = lineName event.businessTime = DateTimeUtil.getCurrentTimeStamp() event.writeVersion = DateTimeUtil.getCurrentTimeStamp() - event.driverId = LoginStatusManager.getLoginInfo()?.driverId?:-1L + event.driverId = LoginStatusManager.getOchLoginInfo()?.driverId?:-1L event.siteId = siteId event.seq = seq event.msgId = "${OchSPManager.getSn()}_${DateTimeUtil.getCurrentTimeStamp()}" @@ -129,7 +129,7 @@ object EventDb: IDbRepository { event.taskStartTime = taskStartTime event.businessTime = DateTimeUtil.getCurrentTimeStamp() event.writeVersion = DateTimeUtil.getCurrentTimeStamp() - event.driverId = LoginStatusManager.getLoginInfo()?.driverId?:-1L + event.driverId = LoginStatusManager.getOchLoginInfo()?.driverId?:-1L event.siteId = 0L event.seq = 0 event.msgId = "${OchSPManager.getSn()}_${DateTimeUtil.getCurrentTimeStamp()}" diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/line/impl/WeaknetRepository.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/line/impl/WeaknetRepository.kt index 512aeeeb18..dad5723173 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/line/impl/WeaknetRepository.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/line/impl/WeaknetRepository.kt @@ -174,7 +174,7 @@ class WeaknetRepository : ILineRepository { // 2、check 数据库数据 // 3、数据库没有数据 做延迟等待同步接口同步基础数据 ?? 等待基础数据同步完在进行 // 4、恢复本地正在运行的数据 - val loginInfo = LoginStatusManager.getLoginInfo() + val loginInfo = LoginStatusManager.getOchBizInfo() return Observable.just(loginInfo).flatMap { // check数据 是否正在之心 val taskId = if(AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)|| diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/writeoff/impl/WriteOffCacheRepository.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/writeoff/impl/WriteOffCacheRepository.kt index 5956ebdb79..747f021a16 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/writeoff/impl/WriteOffCacheRepository.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/writeoff/impl/WriteOffCacheRepository.kt @@ -107,7 +107,7 @@ class WriteOffCacheRepository : IWriteOffRepository { // 1、校验租户id it.tenantId?.let { tenantId-> - if(LoginStatusManager.getLoginInfo()?.tenantId==tenantId){ + if(LoginStatusManager.getOchCarInfo()?.tenantId==tenantId){ }else{ throw DataException(1012,"当前用户下单路线非当前的车辆所属公司") @@ -124,7 +124,7 @@ class WriteOffCacheRepository : IWriteOffRepository { } } // 3、校验 bus和shuttle - if (LoginStatusManager.getBusInessType()!=Product.valueOf(it.typeBiz)) { + if (LoginStatusManager.getProductType()!=Product.valueOf(it.typeBiz)) { throw DataException(1005,"车辆未登录、或没有任务") } // 4 二维码1分钟失效 @@ -201,7 +201,7 @@ class WriteOffCacheRepository : IWriteOffRepository { addWrite.ticketSize = it.ticketSize addWrite.ticketName = it.ticketName addWrite.msgId = OchSPManager.getSn()+System.currentTimeMillis() - addWrite.driverId = LoginStatusManager.getLoginInfo()?.driverId?:0 + addWrite.driverId = LoginStatusManager.getOchLoginInfo()?.driverId?:0 addWrite.businessTime = System.currentTimeMillis() WriteOffDb.addOrUpdate(addWrite) val reslut = PassengerWriteOffResponse.Result(it.phone,it.ticketSize,it.ticketName,it.availableTimes?.toLong(),addWrite.businessTime) @@ -259,7 +259,7 @@ class WriteOffCacheRepository : IWriteOffRepository { addWrite.ticketSize = passenger.passengerSize addWrite.ticketName = passenger.ticketName //addWrite.msgId = OchSPManager.getSn()+System.currentTimeMillis() - addWrite.driverId = LoginStatusManager.getLoginInfo()?.driverId?:0 + addWrite.driverId = LoginStatusManager.getOchLoginInfo()?.driverId?:0 //addWrite.businessTime = System.currentTimeMillis() addWrite.updateStatus = WriteOffDataBean.updated WriteOffDb.addOrUpdate(addWrite) diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/fragment/BusPresenter.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/fragment/BusPresenter.kt index 03c2f0e057..8d8c2de500 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/fragment/BusPresenter.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/fragment/BusPresenter.kt @@ -4,10 +4,9 @@ import androidx.lifecycle.LifecycleOwner import com.mogo.commons.AbsMogoApplication import com.mogo.commons.mvp.Presenter import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d -import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS import com.mogo.och.common.module.biz.login.ILoginCallback -import com.mogo.och.common.module.biz.login.LoginStatusEnum +import com.mogo.och.common.module.biz.login.EnumLoginStatus import com.mogo.och.common.module.biz.login.LoginStatusManager import com.mogo.och.common.module.biz.login.LoginStatusManager.isLogin import com.mogo.och.bridge.autopilot.OCHAdasAbilityManager @@ -44,7 +43,7 @@ class BusPresenter(view: ShuttleFragment?) : Presenter(view), OrderModel.release() } - override fun onStatusChange(currentStatus: LoginStatusEnum) { + override fun onLoginStatusChange(currentStatus: EnumLoginStatus) { d(TAG, " loginStatus =" + isLogin()) if (!isLogin()) { BusTrajectoryManager.stopTrajReqLoop() diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/util/BusTrajectoryManager.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/util/BusTrajectoryManager.kt index ba11098e3f..b22114fb57 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/util/BusTrajectoryManager.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/util/BusTrajectoryManager.kt @@ -8,11 +8,10 @@ import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_ import com.mogo.eagle.core.utilcode.util.GsonUtils import com.mogo.och.bridge.autopilot.line.LineManager import com.mogo.och.common.module.biz.login.LoginStatusManager.isLogin -import com.mogo.och.bridge.autopilot.trajectory.ITrajectoryListListener -import com.mogo.och.bridge.autopilot.trajectory.TrajectoryManager +import com.mogo.och.bridge.trajectory.ITrajectoryListListener +import com.mogo.och.bridge.trajectory.TrajectoryManager import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager import com.mogo.och.weaknet.constant.BusConst -import com.mogo.och.weaknet.model.LineModel import com.mogo.och.weaknet.model.LineModel.currentTask import com.mogo.och.weaknet.model.LineModel.startStationIndex import com.mogo.och.weaknet.model.OrderModel.isGoingToNextStation @@ -160,8 +159,7 @@ object BusTrajectoryManager : ITrajectoryListListener { "轨迹监控", "sendTrajectoryReq() 下发轨迹 轨迹id:${it.autoPilotLine!!.lineId}" ) - CallerAutoPilotControlManager.sendTrajectoryDownloadReq(it.autoPilotLine!!, 0, - it.orderId) + CallerAutoPilotControlManager.sendTrajectoryDownloadReq(it, 0) } d(TAG, "sendTrajectoryReq(): " + GsonUtils.toJson(mAutopilotControlParameters)) diff --git a/OCH/shuttle/driver_weaknet/src/main/res/values/strings.xml b/OCH/shuttle/driver_weaknet/src/main/res/values/strings.xml index 172deeef6f..86c49dadfc 100644 --- a/OCH/shuttle/driver_weaknet/src/main/res/values/strings.xml +++ b/OCH/shuttle/driver_weaknet/src/main/res/values/strings.xml @@ -70,7 +70,7 @@ - 已到达%1$s,带好随身物品,下车请注意安全。 + 已到达%1$s,请带好随身物品,下车时注意后方来车。 We are arriving at %1$s ,get off with your belongings %1$s 역에 도착했습니다 , 소지품 챙겨서 내리세요 diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/ShuttlePassengerProvider.kt b/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/ShuttlePassengerProvider.kt index 8e36cd5534..f3bc73e05e 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/ShuttlePassengerProvider.kt +++ b/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/ShuttlePassengerProvider.kt @@ -12,6 +12,7 @@ import com.mogo.eagle.core.utilcode.util.MultiDisplayUtils import com.mogo.och.bridge.ui.autopilot.AutopilotState import com.mogo.och.common.module.constant.OchCommonConst import com.mogo.och.common.module.biz.provider.CommonServiceImpl +import com.mogo.och.common.module.biz.scanner.ScannerManager import com.mogo.och.common.module.voice.OutOffVoice import com.mogo.och.common.module.wigets.media.MediaPlayerActivity import com.mogo.och.shuttle.weaknet.passenger.model.TicketModel diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/model/CommonModel.kt b/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/model/CommonModel.kt index ea68602ad5..b030798c80 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/model/CommonModel.kt +++ b/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/model/CommonModel.kt @@ -24,6 +24,7 @@ import com.mogo.och.bridge.autopilot.autopilot.OchAutoPilotStatusListenerManager import com.mogo.och.bridge.autopilot.location.OchLocationManager import com.mogo.och.bridge.distance.IDistanceListener import com.mogo.och.bridge.distance.TrajectoryAndDistanceManager +import com.mogo.och.common.module.biz.birdge.BridgeManager import com.mogo.och.common.module.manager.download.DownloadManager import com.mogo.och.common.module.manager.socket.cloud.OCHSocketMessageManager import com.mogo.och.common.module.manager.socket.lan.ILanMessageListener @@ -397,12 +398,12 @@ object CommonModel { val endStation = MogoLocation() endStation.longitude = endStationInfo.gcjLon endStation.latitude = endStationInfo.gcjLat - TrajectoryAndDistanceManager.setStationPoint(startStation, endStation, lineId.toLong()) + BridgeManager.setDistanceStation(startStation, endStation, lineId.toLong()) } private fun cleanStation(type: String) { d(TAG, "清理站点:$type") - TrajectoryAndDistanceManager.setStationPoint(null, null, -1L) + BridgeManager.setDistanceStation(null, null, -1L) } diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/model/TicketModel.kt b/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/model/TicketModel.kt index 4227ac0e66..3c27d22f9a 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/model/TicketModel.kt +++ b/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/model/TicketModel.kt @@ -4,19 +4,18 @@ import android.annotation.SuppressLint import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS_P import com.mogo.eagle.core.utilcode.util.GsonUtils -import com.mogo.eagle.core.utilcode.util.RegexUtils +import com.mogo.och.common.module.biz.scanner.QrBean +import com.mogo.och.common.module.biz.scanner.ScannerManager import com.mogo.och.common.module.manager.bluetooth.BleManager import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager import com.mogo.och.common.module.manager.loop.BizLoopManager import com.mogo.och.common.module.manager.socket.lan.LanSocketManager -import com.mogo.och.common.module.manager.scnner.ScannerManager -import com.mogo.och.common.module.manager.scnner.StateChangeListener +import com.mogo.och.common.module.biz.scanner.StateChangeListener import com.mogo.och.common.module.manager.socket.lan.ILanMessageListener import com.mogo.och.common.module.manager.socket.lan.bean.DPMsgType import com.mogo.och.common.module.manager.socket.lan.bean.WriteOffDetialMsg import com.mogo.och.common.module.manager.socket.lan.bean.WriteOffResultMsg import com.mogo.och.common.module.utils.RxUtils -import java.net.URLDecoder object TicketModel : StateChangeListener { @@ -70,72 +69,35 @@ object TicketModel : StateChangeListener { fun load(){ OchChainLogManager.writeChainLogInit("初始化信息","核销功能初始化") + ScannerManager.load() ScannerManager.addStateChangeListener(TAG, this) // 核销信息 LanSocketManager.registerSocketMessageListener(DPMsgType.TYPE_WRITEOFF_INFO_RESULT.type,writeOffResultMsg) } fun release(){ + OchChainLogManager.writeChainLogInit("释放信息","核销功能释放") + ScannerManager.release() ScannerManager.removeListener(TAG) LanSocketManager.unRegisterSocketMessageListener(DPMsgType.TYPE_WRITEOFF_INFO_RESULT.type,writeOffResultMsg) } - override fun parseData(params: MutableMap, payload: String?) { - val expiryTime = params["expiryTime"] - val bookingTime = params["bookingTime"] - val lineId = params["lineId"] - val availableTimes = params["availableTimes"] - val orderNo = params["orderNo"] - val uid = params["uid"] - val phone = params["phone"] - val ticketSize = params["ticketSize"] - val ticketName = params["ticketName"] - val type = params["type"] - val pipe = params["pipe"] - val startStationId = params["startStationId"] - val tenantId = params["tenantId"] - val shiftsId = params["shiftsId"] - - if(orderNo is String && uid is String){ - var phoneNum = "" - if(phone is String){ - if (RegexUtils.isMobileExact(phone)) { - phoneNum = phone - } - } + override fun parseData(qrBean: QrBean) { try { - var tempType = 0 - if (type is String) { - when (type) { - "shuttle" -> { - tempType = 11 - } - - "bus" -> { - tempType = 10 - } - - else -> { - tempType = type.toInt()?:0 - } - } - } else { - tempType = type?.toInt() ?: 0 - } val writeOffDetail = WriteOffDetialMsg(0,"", - expiryTime?.toLong()?:0, - bookingTime?.toLong()?:0, - lineId?.toLong()?:0, - availableTimes?.toInt()?:0, - orderNo, - uid, - phoneNum, - ticketSize?.toInt()?:0, - URLDecoder.decode(ticketName?:"","UTF-8"), - tempType, - shiftsId?.toLong()?:0, - pipe, - startStationId?.toLong()?:0, - tenantId?.toLong()?:0 + qrBean.expiryTime, + qrBean.bookingTime, + qrBean.lineId, + qrBean.availableTimes, + qrBean.orderNo, + qrBean.uid, + qrBean.phone, + qrBean.ticketSize, + qrBean.ticketName, + qrBean.bizType, + qrBean.shiftsId, + qrBean.pipe, + qrBean.startStationId, + qrBean.tenantId ) CallerLogger.d(M_BUS_P + TAG, "sendTaskDetailsToClients = " + GsonUtils.toJson(writeOffDetail)) LanSocketManager.sendMsgToServer(writeOffDetail) @@ -145,17 +107,11 @@ object TicketModel : StateChangeListener { CallerLogger.d(M_BUS_P + TAG, "") // 通知司机屏二维码错误 val writeOffDetail = WriteOffDetialMsg(code = 3001, msg = "出示错误二维码") - OchChainLogManager.writeChainLogWriteOff("核销失败","二维码错误+参数错误:${payload}") + OchChainLogManager.writeChainLogWriteOff("核销失败","二维码错误+参数错误") CallerLogger.d(M_BUS_P + TAG, "sendTaskDetailsToClients = " + GsonUtils.toJson(writeOffDetail)) LanSocketManager.sendMsgToServer(writeOffDetail) } - }else{ - // 通知司机屏二维码错误 - val writeOffDetail = WriteOffDetialMsg(code = 3001, msg = "出示错误二维码") - OchChainLogManager.writeChainLogWriteOff("核销失败","二维码错误+参数错误:${payload}") - CallerLogger.d(M_BUS_P + TAG, "sendTaskDetailsToClients = " + GsonUtils.toJson(writeOffDetail)) - LanSocketManager.sendMsgToServer(writeOffDetail) - } + } fun getBleName(phone: String):String{ diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/jinlv/com/mogo/och/shuttle/weaknet/passenger/ui/BusPassengerBaseFragment.java b/OCH/shuttle/passenger_weaknet/src/main/java/jinlv/com/mogo/och/shuttle/weaknet/passenger/ui/BusPassengerBaseFragment.java index cc14edb921..96c020afef 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/java/jinlv/com/mogo/och/shuttle/weaknet/passenger/ui/BusPassengerBaseFragment.java +++ b/OCH/shuttle/passenger_weaknet/src/main/java/jinlv/com/mogo/och/shuttle/weaknet/passenger/ui/BusPassengerBaseFragment.java @@ -38,7 +38,7 @@ public abstract class BusPassengerBaseFragment - + + - {} } builder.countDownTime = 10 builder.listener = listener diff --git a/OCH/sweeper/driver/src/main/java/com/mogo/och/sweeper/operate/fragment/BaseSweeperOperateTabFragment.java b/OCH/sweeper/driver/src/main/java/com/mogo/och/sweeper/operate/fragment/BaseSweeperOperateTabFragment.java index 86ad4c77f6..9d07d95cc6 100644 --- a/OCH/sweeper/driver/src/main/java/com/mogo/och/sweeper/operate/fragment/BaseSweeperOperateTabFragment.java +++ b/OCH/sweeper/driver/src/main/java/com/mogo/och/sweeper/operate/fragment/BaseSweeperOperateTabFragment.java @@ -112,7 +112,7 @@ public abstract class BaseSweeperOperateTabFragment + + + \ No newline at end of file diff --git a/OCH/sweeper/driver/src/main/res/layout/sweeper_cloud_base_fragment.xml b/OCH/sweeper/driver/src/main/res/layout/sweeper_cloud_base_fragment.xml index a23259b1f4..d215570ba1 100644 --- a/OCH/sweeper/driver/src/main/res/layout/sweeper_cloud_base_fragment.xml +++ b/OCH/sweeper/driver/src/main/res/layout/sweeper_cloud_base_fragment.xml @@ -9,7 +9,7 @@ android:clickable="true"> + + + \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/bean/TaxiDriverTaskWithOrderBean.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/bean/TaxiDriverTaskWithOrderBean.kt index 3e5a5bc41a..c694040287 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/bean/TaxiDriverTaskWithOrderBean.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/bean/TaxiDriverTaskWithOrderBean.kt @@ -278,7 +278,7 @@ data class TrajectoryListRespBean(var data: MutableList?) : BaseData() { } val tempblackPoints = mutableListOf() blackPoints?.forEach { - tempPassPoints.add(it.toBusStationBean()) + tempblackPoints.add(it.toBusStationBean()) } val result = ContraiInfo(lineId,csvFileUrl,csvFileMd5,txtFileUrl,txtFileMd5,contrailSaveTime,tempPassPoints,tempblackPoints,source) return result diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/base/TaxiFragment.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/base/TaxiFragment.kt index 85b5243ff4..104f9bbab6 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/base/TaxiFragment.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/base/TaxiFragment.kt @@ -18,7 +18,7 @@ import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.eagle.core.utilcode.util.ToastUtils import com.mogo.map.listener.IMogoMapListener import com.mogo.map.uicontroller.VisualAngleMode -import com.mogo.och.common.module.biz.login.OpenOrderStatusEnum +import com.mogo.och.common.module.biz.login.EnumOpenOrderStatus import com.mogo.och.data.taxi.TaxiOrderStatusEnum import com.mogo.och.common.module.utils.FlowBus import com.mogo.och.common.module.wigets.StartAutopilotAnimationView @@ -307,14 +307,14 @@ class TaxiFragment :MvpFragment(), * @param inOperation true 可以接单 false 暂停接单 * @param role 测试车辆:测试 演示车辆:V 运营车辆: ""空 */ - fun updateOperationStatus(inOperation: OpenOrderStatusEnum) { + fun updateOperationStatus(inOperation: Boolean) { e( SceneConstant.M_TAXI + TAG, "onOperationChanged:$inOperation" ) updateOperationBtnStatusOnModeChange(MogoStatusManager.getInstance().isTaxiUnmanedDriverLineRoutingVerifyMode) MogoStatusManager.getInstance() - .setTaxiUnmanedDriverTakingOrders(TAG, inOperation == OpenOrderStatusEnum.Ordering) + .setTaxiUnmanedDriverTakingOrders(TAG, inOperation) } fun onNaviToEnd(isAmap: Boolean, isShow: Boolean) { if (isAmap) { diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/base/TaxiPresenter.java b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/base/TaxiPresenter.java index 298505d0a6..af16444d12 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/base/TaxiPresenter.java +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/base/TaxiPresenter.java @@ -11,9 +11,9 @@ import com.mogo.commons.mvp.Presenter; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; import com.mogo.och.bridge.autopilot.OCHAdasAbilityManager; import com.mogo.och.common.module.biz.login.ILoginCallback; -import com.mogo.och.common.module.biz.login.LoginStatusEnum; +import com.mogo.och.common.module.biz.login.EnumLoginStatus; import com.mogo.och.common.module.biz.login.LoginStatusManager; -import com.mogo.och.common.module.biz.login.OpenOrderStatusEnum; +import com.mogo.och.common.module.biz.login.EnumOpenOrderStatus; import com.mogo.och.unmanned.taxi.utils.order.OrderListener; import com.mogo.och.unmanned.taxi.utils.order.OrderModel; import com.mogo.och.data.taxi.TaxiOrderStatusEnum; @@ -164,12 +164,12 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS } @Override - public void onStatusChange(LoginStatusEnum currentStatus) { + public void onLoginStatusChange(EnumLoginStatus currentStatus) { UiThreadHandler.post(new Runnable() { @Override public void run() { if(mView!=null) { - mView.updateOperationStatus(LoginStatusManager.getOpenOrderType()); + mView.updateOperationStatus(LoginStatusManager.isOpenOrderType()); } } }, UiThreadHandler.MODE.QUEUE); @@ -179,12 +179,12 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS } @Override - public void onOpenOrderStatusEnumChange(OpenOrderStatusEnum businessEnum) { + public void onOpenOrderStatusEnumChange(EnumOpenOrderStatus businessEnum) { UiThreadHandler.post(new Runnable() { @Override public void run() { if(mView!=null) { - mView.updateOperationStatus(LoginStatusManager.getOpenOrderType()); + mView.updateOperationStatus(LoginStatusManager.isOpenOrderType()); } } }, UiThreadHandler.MODE.QUEUE); diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/TaxiTaskModel.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/TaxiTaskModel.kt index 98fb9688a2..61df40c1d9 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/TaxiTaskModel.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/TaxiTaskModel.kt @@ -53,6 +53,7 @@ import com.mogo.och.common.module.manager.socket.cloud.action.OperateAction2 import com.mogo.och.common.module.map.AmapNaviToDestinationModel import com.mogo.och.common.module.network.OchCommonServiceCallback import com.mogo.och.bridge.utils.CoordinateCalculateRouteUtil.coordinateConverterWgsToGcjLocations +import com.mogo.och.common.module.biz.birdge.BridgeManager import com.mogo.och.common.module.biz.order.IOrderListener import com.mogo.och.common.module.biz.order.OrderManager import com.mogo.och.common.module.manager.loop.BizLoopManager @@ -192,6 +193,10 @@ object TaxiTaskModel { return mCurrentTaskWithOrder } + fun getCalibrationOrder(): StartServiceRespBean.Result? { + return mDriveToNearestStationTask + } + fun getCurrentOrderTrajectoryList(): MutableList { return mTaskTrajectoryList } @@ -224,8 +229,6 @@ object TaxiTaskModel { OCHSocketMessageManager.msgMonitorType, OperateAction2() ) - IntentManager.getInstance() - .registerIntentListener(ConnectivityManager.CONNECTIVITY_ACTION, mNetWorkIntentListener) AbnormalFactorsLoopManager.startLoopAbnormalFactors(mContext) TrajectoryAndDistanceManager.addDistanceListener(TAG, localCalculateDistanceListener) TrajectoryAndDistanceManager.addTrajectoryListener(TAG, localCalculateTrajectoryListener) @@ -464,20 +467,6 @@ object TaxiTaskModel { } } - //监听网络变化,避免启动机器时无网导致无法更新订单信息 - private val mNetWorkIntentListener: IMogoIntentListener = - IMogoIntentListener { intentStr, _ -> - d(TAG, "mNetWorkIntentListener: onIntentReceived=$intentStr") - if ((ConnectivityManager.CONNECTIVITY_ACTION == intentStr)) { - if (NetworkUtils.isConnected(mContext)) { - LoginStatusManager.queryLoginStatusByNet() - DebugView.printInfoMsg("[网络状态变化] isConnected=true") - } else { - DebugView.printErrorMsg("[网络状态变化] isConnected=false") - } - } - } - private val localCalculateDistanceListener: IDistanceListener = object : IDistanceListener { override fun distanceCallback(distance: Float) { val lastTime = distance / TaxiUnmannedConst.TAXI_AVERAGE_SPEED * 3.6 //秒 @@ -794,7 +783,7 @@ object TaxiTaskModel { //订单到站结束轨迹剩余里程就算和高德计算, 防止到站查询订单全程的显示被覆盖 LineManager.setLineInfo(null) - TrajectoryAndDistanceManager.setStationPoint(null, null, -1L) + BridgeManager.setDistanceStation(null, null, -1L) destroyAmapNavi() mTaxiTaskWithOrderCallbackMap.forEach { @@ -869,7 +858,7 @@ object TaxiTaskModel { destroyAmapNavi() } LineManager.setLineInfo(null) - TrajectoryAndDistanceManager.setStationPoint(null, null, -1L) + BridgeManager.setDistanceStation(null, null, -1L) } fun queryOrderByOrderNo(orderNo: String) { @@ -1105,8 +1094,6 @@ object TaxiTaskModel { siteInfos = temp ) ) - traj.blackPoints?.clear() - traj.passPoints?.clear() LineManager.setContraiInfo(traj.toCommonContraiInfo()) } } diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/itinerarycurrent/ItineraryCurrentModel.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/itinerarycurrent/ItineraryCurrentModel.kt index a87c412a73..30f504c17f 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/itinerarycurrent/ItineraryCurrentModel.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/itinerarycurrent/ItineraryCurrentModel.kt @@ -18,8 +18,7 @@ import com.mogo.och.common.module.biz.login.LoginStatusManager import com.mogo.och.data.taxi.TaxiOrderStatusEnum import com.mogo.och.bridge.autopilot.line.LineManager import com.mogo.och.bridge.autopilot.location.OchLocationManager -import com.mogo.och.bridge.distance.TrajectoryAndDistanceManager -import com.mogo.och.common.module.biz.login.OpenOrderStatusEnum +import com.mogo.och.common.module.biz.birdge.BridgeManager import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager import com.mogo.och.common.module.network.OchCommonServiceCallback import com.mogo.och.common.module.utils.ToastUtilsOch @@ -297,7 +296,7 @@ class ItineraryCurrentModel : BaseViewModel(), val endStation = MogoLocation() endStation.longitude = curTaskAndOrder.endSite!!.gcjLon endStation.latitude = curTaskAndOrder.endSite!!.gcjLat - TrajectoryAndDistanceManager.setStationPoint( + BridgeManager.setDistanceStation( startStation, endStation, curTaskAndOrder.lineId @@ -514,14 +513,14 @@ class ItineraryCurrentModel : BaseViewModel(), fun cancleTask() { DebugView.printInfoMsg("[车辆复位] 准备发送请求") - val openOrderType = LoginStatusManager.getOpenOrderType() + val openOrderType = LoginStatusManager.isOpenOrderType() TaxiTaskWithOrderServiceManager.resetInit( AbsMogoApplication.getApp().applicationContext, object : OchCommonServiceCallback { override fun onSuccess(data: BaseData?) { DebugView.printInfoMsg("[车辆复位] 请求success") LoginStatusManager.queryLoginStatusByNet() - if(openOrderType== OpenOrderStatusEnum.Ordering) { + if(openOrderType) { VoiceNotice.showNotice("暂停接单啦!"); } TaxiTaskModel.cancelAutopilot() @@ -539,9 +538,26 @@ class ItineraryCurrentModel : BaseViewModel(), TaxiTaskModel.mockArriveAtNearestStation() } + fun arriveVirtualOrderView() { + val endSite = TaxiTaskModel.getCurrentTaskWithOrder()?.endSite + if(endSite!=null){ + val distance = BridgeManager.distance2Point(endSite.gcjLat,endSite.gcjLon) + if(TaxiUnmannedConst.ARRIVE_AT_START_STATION_DISTANCE <= distance){ + viewCallback?.askArrivedEndStationView() + }else{ + arriveVirtaulOrderImm() + } + } + } + + fun arriveVirtaulOrderImm(){ + TaxiTaskModel.mockArriveAtEndStation() + } + interface SwtichLineViewCallback { fun onStartTaskFail() + fun askArrivedEndStationView() } } diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/itinerarycurrent/ItineraryCurrentView.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/itinerarycurrent/ItineraryCurrentView.kt index 54fe8b531d..c6d6bde595 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/itinerarycurrent/ItineraryCurrentView.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/itinerarycurrent/ItineraryCurrentView.kt @@ -194,6 +194,8 @@ class ItineraryCurrentView: ConstraintLayout, ItineraryCurrentModel.SwtichLineVi taskAndOrderUiState.isStart ) } + + else -> {} } } } @@ -245,8 +247,14 @@ class ItineraryCurrentView: ConstraintLayout, ItineraryCurrentModel.SwtichLineVi viewModelSwitch?.switchSite() } actv_arriver_station.onClick { - // 标定单到站 - viewModel?.arriveCalibrationSite() + if (TaxiTaskModel.getCalibrationOrder()!=null) { + // 标定单到站 + viewModel?.arriveCalibrationSite() + }else{ + if(TaxiTaskModel.getCurrentTaskWithOrder()!=null&&TaxiTaskModel.getCurrentTaskWithOrder()?.order==null){ + viewModel?.arriveVirtualOrderView() + } + } } } @@ -745,6 +753,7 @@ class ItineraryCurrentView: ConstraintLayout, ItineraryCurrentModel.SwtichLineVi aciv_task_type_exercise.setImageResource(R.drawable.taxi_task_exercise) cancelTask.visibility = VISIBLE + actv_arriver_station.visibility = VISIBLE startStationName.text = startSite.siteName endStationName.text = endSite.siteName @@ -990,4 +999,25 @@ class ItineraryCurrentView: ConstraintLayout, ItineraryCurrentModel.SwtichLineVi commonSlideViewStartServer.reset() } + override fun askArrivedEndStationView() { + d(TAG,"closeOrderDialog") + val builder = CommonDialogStatus.Builder() + val closeOrderDialog = builder + .title(ResourcesUtils.getString(R.string.dialog_virtual_arrive_title)) + .tips(ResourcesUtils.getString(R.string.dialog_virtual_arrive_content)) + .confirmStr(ResourcesUtils.getString(R.string.dialog_order_close_confirm)) + .cancelStr(ResourcesUtils.getString(R.string.dialog_order_close_cancel)) + .build(context) + closeOrderDialog.setClickListener(object : CommonDialogStatus.ClickListener { + override fun confirm() { + viewModel?.arriveVirtaulOrderImm() + } + + override fun cancel() { + closeOrderDialog.dismiss() + } + }) + closeOrderDialog.show() + } + } diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/utils/TaxiTrajectoryManager.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/utils/TaxiTrajectoryManager.kt index 2e9e75135a..72025d94ff 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/utils/TaxiTrajectoryManager.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/utils/TaxiTrajectoryManager.kt @@ -8,8 +8,8 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.e import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.eagle.core.utilcode.util.GsonUtils import com.mogo.och.bridge.autopilot.line.LineManager -import com.mogo.och.bridge.autopilot.trajectory.ITrajectoryListListener -import com.mogo.och.bridge.autopilot.trajectory.TrajectoryManager +import com.mogo.och.bridge.trajectory.ITrajectoryListListener +import com.mogo.och.bridge.trajectory.TrajectoryManager import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager import com.mogo.och.unmanned.taxi.bean.TrajectoryListRespBean import com.mogo.och.unmanned.taxi.constant.TaskStatusEnum @@ -42,7 +42,7 @@ object TaxiTrajectoryManager : ITrajectoryListListener { private var mPreAutopilotControlParameters: AutopilotControlParameters? = null private var mSendReqDisposable: Disposable? = null - private var mPrevTaskLineId = "" +// private var mPrevTaskLineId = "" init { mAutopilotControlParameters = AutopilotControlParameters() @@ -70,13 +70,13 @@ object TaxiTrajectoryManager : ITrajectoryListListener { d(TAG, "syncTrajectoryInfo() stop.") stopTrajReqLoop() } else { - if (mPrevTaskLineId == taskAndOrder.lineId.toString()) { - d(TAG, "syncTrajectoryInfo() 重复订单.") - } else { - mPrevTaskLineId = taskAndOrder.lineId.toString() +// if (mPrevTaskLineId == taskAndOrder.lineId.toString()) { +// d(TAG, "syncTrajectoryInfo() 重复订单.") +// } else { +// mPrevTaskLineId = taskAndOrder.lineId.toString() d(TAG, "syncTrajectoryInfo() start.") startTrajReqLoop() - } +// } } } @@ -207,7 +207,7 @@ object TaxiTrajectoryManager : ITrajectoryListListener { .observeOn(AndroidSchedulers.mainThread()) .subscribe { aLong: Long -> if (aLong > TaxiUnmannedConst.LOOP_SEND_TRAJ_TIMES) { - mPrevTaskLineId = "" //重发超时后将mPrevOrderNo置空,这样订单进入下个状态时还可以重发 + //mPrevTaskLineId = "" //重发超时后将mPrevOrderNo置空,这样订单进入下个状态时还可以重发 stopTrajReqLoop() return@subscribe } @@ -238,9 +238,8 @@ object TaxiTrajectoryManager : ITrajectoryListListener { "sendTrajectoryReq() 下发轨迹 轨迹id:${mAutopilotControlParameters?.autoPilotLine?.lineId}" ) CallerAutoPilotControlManager.sendTrajectoryDownloadReq( - mAutopilotControlParameters!!.autoPilotLine!!, + mAutopilotControlParameters!!, COMMON_LOADING, - mAutopilotControlParameters!!.orderId ) } else { e(TAG, "sendTrajectoryReq(): mAutoPilotLine is null!!!") @@ -249,9 +248,8 @@ object TaxiTrajectoryManager : ITrajectoryListListener { if (mPreAutopilotControlParameters != null && mPreAutopilotControlParameters?.autoPilotLine != null) { printInfoMsg("[下发预加载轨迹] sendTrajectoryDownloadReq, lindId=" + mPreAutopilotControlParameters?.autoPilotLine?.lineId + ", lineName=" + mPreAutopilotControlParameters?.autoPilotLine?.lineName) CallerAutoPilotControlManager.sendTrajectoryDownloadReq( - mPreAutopilotControlParameters!!.autoPilotLine!!, + mPreAutopilotControlParameters!!, PRE_LOADING, - mPreAutopilotControlParameters!!.orderId ) } else { e(TAG, "sendTrajectoryReq(): mPreAutoPilotLine is null!!!") diff --git a/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_taxi_base_fragment.xml b/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_taxi_base_fragment.xml index 77eca5b889..253a4c832d 100644 --- a/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_taxi_base_fragment.xml +++ b/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_taxi_base_fragment.xml @@ -26,8 +26,8 @@ android:layout_height="wrap_content" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" - android:layout_marginTop="@dimen/dp_350" - android:layout_marginRight="@dimen/dp_50" + android:layout_marginTop="@dimen/dp_115" + android:layout_marginEnd="@dimen/dp_23" app:explorationUser="driver" android:visibility="gone" /> diff --git a/OCH/taxi/unmanned-driver/src/main/res/values/strings.xml b/OCH/taxi/unmanned-driver/src/main/res/values/strings.xml index 151cd62635..a67fbfefd8 100644 --- a/OCH/taxi/unmanned-driver/src/main/res/values/strings.xml +++ b/OCH/taxi/unmanned-driver/src/main/res/values/strings.xml @@ -29,6 +29,8 @@ 确认 取消 + 是否手动到站? + 检测到当前位置距离站点较远,请确认是否手动触发到站? 自动驾驶状态为0不可用 diff --git a/OCH/taxi/unmanned-passenger/build.gradle b/OCH/taxi/unmanned-passenger/build.gradle index 06bcf2d47a..b5cad78f93 100644 --- a/OCH/taxi/unmanned-passenger/build.gradle +++ b/OCH/taxi/unmanned-passenger/build.gradle @@ -72,7 +72,12 @@ dependencies { implementation project(":OCH:common:common") compileOnly project(":libraries:mogo-map") + implementation rootProject.ext.dependencies.mogocustommap implementation project(':core:mogo-core-res') + + implementation project(":libraries:mogo-speech") + implementation 'io.github.youth5201314:banner:2.2.3' + // implementation project(':OCH:taxi:pcommon') if (Boolean.valueOf(USE_MAVEN_PACKAGE)) { diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/TaxiUnmannedPassengerProvider.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/TaxiUnmannedPassengerProvider.kt index 21a7ed53b3..8cbc82d45a 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/TaxiUnmannedPassengerProvider.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/TaxiUnmannedPassengerProvider.kt @@ -6,6 +6,8 @@ import androidx.fragment.app.Fragment import com.alibaba.android.arouter.facade.annotation.Route import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant +import com.mogo.mgintelligent.speech.MGSpeech +import com.mogo.mgintelligent.speech.iflytek.WakeManager import com.mogo.och.common.module.constant.OchCommonConst import com.mogo.och.common.module.biz.provider.CommonServiceImpl import com.mogo.och.bridge.autopilot.autopilot.OchAutopilotAnalytics @@ -30,6 +32,8 @@ class TaxiUnmannedPassengerProvider : CommonServiceImpl() { override fun init(context: Context) { d(SceneConstant.M_TAXI_P + tag, "init") statusBarView = StatusBarView(context) + MGSpeech.init(context) + WakeManager.initWakeAi(context) } override fun getStatusBarView(context: Context): View { diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/bean/TaxiPassengerOrdersInServiceQueryRespBean.java b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/bean/TaxiPassengerOrdersInServiceQueryRespBean.java index 7a4918cf1b..2a0bd4ae25 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/bean/TaxiPassengerOrdersInServiceQueryRespBean.java +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/bean/TaxiPassengerOrdersInServiceQueryRespBean.java @@ -3,6 +3,8 @@ package com.mogo.och.unmanned.passenger.bean; import com.mogo.eagle.core.data.BaseData; import com.mogo.och.data.taxi.BaseOrderBean; +import org.jetbrains.annotations.Nullable; + import java.util.List; import java.util.Objects; @@ -80,6 +82,18 @@ public class TaxiPassengerOrdersInServiceQueryRespBean extends BaseData { public int hashCode() { return Objects.hash(siteId, siteName, gcjLon, gcjLat, wgs84Lon, wgs84Lat); } + + @Nullable + public SiteBean copy() { + SiteBean temp = new SiteBean(); + temp.siteId = siteId; + temp.siteName = siteName; + temp.gcjLon = gcjLon; + temp.gcjLat = gcjLat; + temp.wgs84Lat = wgs84Lat; + temp.wgs84Lon = wgs84Lon; + return temp; + } } public static class OrderBean extends BaseOrderBean { diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/bean/TaxiPassengerVideoPlay.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/bean/TaxiPassengerVideoPlay.kt index da6e23a8e8..1209e54ec9 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/bean/TaxiPassengerVideoPlay.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/bean/TaxiPassengerVideoPlay.kt @@ -1,3 +1,3 @@ package com.mogo.och.unmanned.passenger.bean -class TaxiPassengerVideoPlay(var url: String, var imageUrl: String, var title: String, var type: Int) \ No newline at end of file +class TaxiPassengerVideoPlay(var url: String, var imageUrl: String, var title: String, var type: Int,var isPlayiing:Boolean=false) \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/bean/ai/AiTrajectoryReqBean.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/bean/ai/AiTrajectoryReqBean.kt new file mode 100644 index 0000000000..48e6efcae9 --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/bean/ai/AiTrajectoryReqBean.kt @@ -0,0 +1,5 @@ +package com.mogo.och.unmanned.passenger.bean.ai + +data class AiTrajectoryReqBean( + val points: List, val sn: String, val ending:String = "0" +) \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/bean/ai/LatLonBody.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/bean/ai/LatLonBody.kt new file mode 100644 index 0000000000..3f39891b63 --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/bean/ai/LatLonBody.kt @@ -0,0 +1,20 @@ +package com.mogo.och.unmanned.passenger.bean.ai + +import com.mogo.eagle.core.data.map.MogoLocation + +/** + * Create by wyy + * TIME : 2024/6/25 \ 15:21 + * Description: + */ +data class LatLonBody(val lat: Double, val lon: Double){ + companion object{ + fun toLatLonBody(trajectoryList: MutableList): MutableList { + val result = mutableListOf() + trajectoryList.forEach { + result.add(LatLonBody(it.latitude,it.longitude)) + } + return result + } + } +} \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/model/AutopilotManager.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/model/AutopilotManager.kt index 86d6ea894c..a16afe3823 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/model/AutopilotManager.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/model/AutopilotManager.kt @@ -246,8 +246,8 @@ object AutopilotManager : IOchAutopilotStatusListener { true, TaxiPassengerModel.currentOCHOrder!!.orderStartSite.siteName, TaxiPassengerModel.currentOCHOrder!!.orderEndSite.siteName, - TaxiPassengerModel.currentOCHOrder!!.orderNo.toInt(), - TaxiPassengerModel.currentLineId.toString(), + TaxiPassengerModel.currentLineId?.toInt()?:0, + TaxiPassengerModel.currentOCHOrder!!.orderNo, System.currentTimeMillis(), "", 0 diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/model/TaxiPassengerModel.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/model/TaxiPassengerModel.kt index 3bb20e6889..a76facd3ae 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/model/TaxiPassengerModel.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/model/TaxiPassengerModel.kt @@ -22,6 +22,7 @@ import com.mogo.och.common.module.network.OchCommonServiceCallback import com.mogo.och.common.module.manager.socket.cloud.AbnormalFactorsLoopManager import com.mogo.och.bridge.distance.IDistanceListener import com.mogo.och.bridge.distance.TrajectoryAndDistanceManager +import com.mogo.och.common.module.biz.birdge.BridgeManager import com.mogo.och.common.module.manager.loop.BizLoopManager import com.mogo.och.common.module.manager.loop.LoopInfo import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager @@ -282,6 +283,7 @@ object TaxiPassengerModel { currentTrajectoryInfo = null currentTaskStatus = -1 } else { + OchChainLogManager.writeChainLogError("queryOrderById","订单状态异常 old:${currentOCHOrder}__new:${data.data}") currentOCHOrder = data.data orderStatusChange() } @@ -379,7 +381,7 @@ object TaxiPassengerModel { orderStatusChangeInner() d(M_TAXI_P + TAG, "最新的状态-->${curOrderStatus}") OchChainLogManager.writeChainLog(currentOCHOrder.toString(),"最新的状态-->${curOrderStatus}") - com.mogo.och.unmanned.taxi.utils.order.OrderModel.invokeListener(currentOCHOrder) + OrderModel.invokeListener(currentOCHOrder) } private fun orderStatusChangeInner() { @@ -449,33 +451,30 @@ object TaxiPassengerModel { } private fun setStation() { - try { - if (currentOCHOrder != null && currentLineId != null) { - val startStation = MogoLocation() - startStation.longitude = currentOCHOrder!!.orderStartSite.gcjLon - startStation.latitude = currentOCHOrder!!.orderStartSite.gcjLat - val endStation = MogoLocation() - endStation.longitude = currentOCHOrder!!.orderEndSite.gcjLon - endStation.latitude = currentOCHOrder!!.orderEndSite.gcjLat - TrajectoryAndDistanceManager.setStationPoint( - startStation, - endStation, - currentLineId - ) - } - }catch (e:Exception){ - RxUtils.createSubscribeOnOwnThread(10_000) { - if(currentOCHOrder!=null&¤tOCHOrder!!.orderEndSite!=null) { - setStation() - } - } - OchChainLogManager.writeChainLog("exception",e.toString()) + var tempStartPoint: TaxiPassengerOrdersInServiceQueryRespBean.SiteBean?=null + var tempEndPoint: TaxiPassengerOrdersInServiceQueryRespBean.SiteBean?=null + if(currentOCHOrder!=null){ + tempStartPoint = currentOCHOrder?.orderStartSite?.copy() + tempEndPoint = currentOCHOrder?.orderEndSite?.copy() + } + if (tempStartPoint!=null && tempEndPoint!=null && currentLineId != null) { + val startStation = MogoLocation() + startStation.longitude = tempStartPoint.gcjLon + startStation.latitude = tempStartPoint.gcjLat + val endStation = MogoLocation() + endStation.longitude = currentOCHOrder!!.orderEndSite.gcjLon + endStation.latitude = currentOCHOrder!!.orderEndSite.gcjLat + BridgeManager.setDistanceStation( + startStation, + endStation, + currentLineId + ) } } private fun clearStation() { - TrajectoryAndDistanceManager.setStationPoint(null, null, -1L) + BridgeManager.setDistanceStation(null, null, -1L) } } \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/network/ai/AiServiceApi.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/network/ai/AiServiceApi.kt new file mode 100644 index 0000000000..c0c8a1968a --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/network/ai/AiServiceApi.kt @@ -0,0 +1,29 @@ +package com.mogo.och.unmanned.passenger.network.ai + +import com.mogo.cloud.passport.MoGoAiCloudClientConfig +import com.mogo.commons.storage.SharedPrefsMgr +import com.mogo.eagle.core.data.BaseData +import com.mogo.och.unmanned.passenger.bean.ai.AiTrajectoryReqBean +import io.reactivex.Observable +import retrofit2.http.Body +import retrofit2.http.Header +import retrofit2.http.Headers +import retrofit2.http.POST + +/** + * Created by pangfan on 2021/8/19 + * + * 网约车-出租车接口定义 + */ +internal interface AiServiceApi { + @Headers("Content-type:application/json;charset=UTF-8") + @POST("/vehicleLocation/location/navigationLocationPoints") + fun navigationLocationPoints( + @Header("appId") appId: String = MoGoAiCloudClientConfig.getInstance().serviceAppId, + @Header("ticket") ticket: String = SharedPrefsMgr.getInstance().token, + @Header("MogoReqTime") mogoReqTime:String, + @Header("MogoAuthKey") MogoAuthKey:String, + @Body data: AiTrajectoryReqBean? + ): Observable + +} \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/network/ai/AiServiceManager.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/network/ai/AiServiceManager.kt new file mode 100644 index 0000000000..b43b96f006 --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/network/ai/AiServiceManager.kt @@ -0,0 +1,51 @@ +package com.mogo.och.unmanned.passenger.network.ai + +import com.mogo.commons.storage.SharedPrefsMgr +import com.mogo.eagle.core.data.BaseData +import com.mogo.eagle.core.network.MoGoRetrofitFactory +import com.mogo.eagle.core.network.utils.digest.DigestUtils +import com.mogo.och.common.module.constant.OchCommonConst +import com.mogo.och.common.module.network.OchCommonServiceCallback +import com.mogo.och.common.module.network.OchCommonSubscribeImpl +import com.mogo.och.common.module.network.interceptor.transformTry +import com.mogo.och.unmanned.passenger.bean.ai.AiTrajectoryReqBean +import com.mogo.och.unmanned.passenger.bean.ai.LatLonBody +import com.mogo.och.unmanned.passenger.network.TaxiPassengerServiceManager + +/** + * Created by pangfan on 2021/8/19 + */ +object AiServiceManager { + + private val mOCHTaxiServiceApi: AiServiceApi = + MoGoRetrofitFactory.getInstance(OchCommonConst.getAiUrl()) + .create(AiServiceApi::class.java) + + private const val TAG = "TaxiPassengerServiceManager" + + /** + * 根据订单号查询订单, 主要是拿完成或者被乘客取消的订单状态 + */ + @JvmStatic + fun uploadTrajectory( + ending:String = "0", + points: List, + callback: OchCommonServiceCallback? + ) { + + val mogoReqTime = System.currentTimeMillis().toString() + val encodedPath = "/vehicleLocation/location/navigationLocationPoints".toUpperCase() + + val mogoAuthKey = DigestUtils.md5Hex(encodedPath+ mogoReqTime) + + mOCHTaxiServiceApi.navigationLocationPoints( + data = AiTrajectoryReqBean(points, SharedPrefsMgr.getInstance().sn+"_PAD", ending), + mogoReqTime = mogoReqTime, + MogoAuthKey = mogoAuthKey + ).transformTry() + .subscribe(OchCommonSubscribeImpl(TaxiPassengerServiceManager.context, callback, "navigationLocationPoints")) + } + + + +} \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/presenter/BaseTaxiPassengerPresenter.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/presenter/BaseTaxiPassengerPresenter.kt index 3cb83799a4..494f9c1068 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/presenter/BaseTaxiPassengerPresenter.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/presenter/BaseTaxiPassengerPresenter.kt @@ -3,20 +3,26 @@ package com.mogo.och.unmanned.passenger.presenter import androidx.lifecycle.LifecycleOwner import com.mogo.commons.AbsMogoApplication import com.mogo.commons.mvp.Presenter +import com.mogo.eagle.core.data.map.MogoLocation +import com.mogo.eagle.core.data.och.OchInfo import com.mogo.eagle.core.function.call.biz.CallerFuncBizManager +import com.mogo.eagle.core.function.call.datacenter.CallerDataCenterBizListener import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.mogo.och.bridge.autopilot.OCHAdasAbilityManager -import com.mogo.och.unmanned.passenger.bean.TaxiPassengerOrdersInServiceQueryRespBean -import com.mogo.och.data.taxi.TaxiOrderStatusEnum -import com.mogo.och.data.taxi.BaseOrderBean -import com.mogo.och.bridge.autopilot.callback.OchAdasStartFailureCallback import com.mogo.och.bridge.autopilot.autopilot.OchAutopilotAnalytics +import com.mogo.och.bridge.autopilot.callback.OchAdasStartFailureCallback +import com.mogo.och.bridge.autopilot.line.LineManager import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager +import com.mogo.och.common.module.manager.loop.BizLoopManager +import com.mogo.och.data.taxi.BaseOrderBean +import com.mogo.och.data.taxi.TaxiOrderStatusEnum +import com.mogo.och.unmanned.passenger.bean.TaxiPassengerOrdersInServiceQueryRespBean import com.mogo.och.unmanned.passenger.callback.IOCHTaxiPassengerOrderStatusCallback import com.mogo.och.unmanned.passenger.model.TaxiPassengerModel import com.mogo.och.unmanned.passenger.ui.TaxiPassengerBaseFragment +import com.mogo.och.unmanned.passenger.ui.aiview.AIMessageManager /** * @author: wangmingjun @@ -91,6 +97,7 @@ class BaseTaxiPassengerPresenter(view: TaxiPassengerBaseFragment?) : mView?.showOrHideArrivedEndLayout(isShow = false) overMapViewClear() + AIMessageManager.clearData() } TaxiOrderStatusEnum.ArriveAtStart -> { @@ -125,6 +132,7 @@ class BaseTaxiPassengerPresenter(view: TaxiPassengerBaseFragment?) : mView?.showOrHideArrivedEndLayout(false) overMapViewClear() + AIMessageManager.clearData() } TaxiOrderStatusEnum.Cancel -> { @@ -133,6 +141,7 @@ class BaseTaxiPassengerPresenter(view: TaxiPassengerBaseFragment?) : mView?.showOrHideArrivedEndLayout(isShow = false) overMapViewClear() + AIMessageManager.clearData() } TaxiOrderStatusEnum.None -> { @@ -148,6 +157,24 @@ class BaseTaxiPassengerPresenter(view: TaxiPassengerBaseFragment?) : private fun overMapViewShow(){ CallerFuncBizManager.bizProvider.getAllV2XEvents() + + TaxiPassengerModel.currentOCHOrder?.let { + val startStation = it.orderStartSite + val endStation = it.orderEndSite + if(startStation!=null&&endStation!=null) { + val start = MogoLocation() + start.latitude = startStation.gcjLat + start.longitude = startStation.gcjLon + val end = MogoLocation() + end.latitude = endStation.gcjLat + end.longitude = endStation.gcjLon + val ochInfo = OchInfo(0, mutableListOf(start, end)) + CallerDataCenterBizListener.invokeOchInfo(ochInfo) + OchChainLogManager.writeChainLogMap("向地图传参数", "参数信息:${ochInfo}") + d(LineManager.TAG, "向地图传参数_参数信息:${ochInfo}") + } + } + } private fun overMapViewClear(){ CallerFuncBizManager.bizProvider.stopQueryV2XEvents() @@ -155,7 +182,7 @@ class BaseTaxiPassengerPresenter(view: TaxiPassengerBaseFragment?) : } fun setItineraryVisibility() { - UiThreadHandler.post { + BizLoopManager.runInMainThread { when (TaxiPassengerModel.curOrderStatus) { TaxiOrderStatusEnum.None, TaxiOrderStatusEnum.OnTheWayToStart, @@ -174,10 +201,10 @@ class BaseTaxiPassengerPresenter(view: TaxiPassengerBaseFragment?) : } override fun onCurrentOrderDistAndduration(mileage: Float, duration: Float) { - UiThreadHandler.post({ + BizLoopManager.runInMainThread({ OchChainLogManager.writeChainLog("到达目的地计算距离和时间","距离:${mileage} 时间:${duration}") mView?.showDuringAndDistance(mileage*1000,duration) - },UiThreadHandler.MODE.QUEUE) + }) } companion object { diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/TaxiPassengerBaseFragment.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/TaxiPassengerBaseFragment.kt index 1090830d39..e24e9a4ea3 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/TaxiPassengerBaseFragment.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/TaxiPassengerBaseFragment.kt @@ -9,46 +9,44 @@ import android.view.View import com.alibaba.android.arouter.launcher.ARouter 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.call.hmi.CallerHmiManager import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_TAXI_P -import com.mogo.eagle.core.utilcode.util.DeviceUtils import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.mogo.map.listener.IMogoMapListener +import com.mogo.mgintelligent.speech.iflytek.WakeUpManager import com.mogo.och.common.module.biz.provider.CommonService import com.mogo.och.common.module.constant.OchCommonConst -import com.mogo.och.bridge.autopilot.location.OchLocationManager +import com.mogo.och.common.module.manager.loop.BizLoopManager import com.mogo.och.common.module.manager.xiaozhi.ZhiStateManager import com.mogo.och.common.module.utils.RxUtils import com.mogo.och.common.module.voice.VoiceNotice import com.mogo.och.unmanned.taxi.passenger.R import com.mogo.och.unmanned.passenger.presenter.BaseTaxiPassengerPresenter +import com.mogo.och.unmanned.passenger.ui.aiview.AIMessageManager +import com.mogo.och.unmanned.passenger.ui.aiview.bean.AIMessage import com.mogo.och.unmanned.passenger.ui.arrived.ArrivedView import com.mogo.och.unmanned.passenger.ui.bar.LeftBarView -import com.mogo.och.unmanned.passenger.ui.bar.RightBarView import com.mogo.och.unmanned.passenger.ui.bottom.BottomBar import com.mogo.och.unmanned.passenger.ui.checkstartautopilot.ChekAndStartAutopilotView import com.mogo.och.unmanned.passenger.ui.debug.DebugCallback +import com.mogo.och.unmanned.passenger.ui.music.MusicModel import com.mogo.och.unmanned.passenger.ui.statusview.StatusBarView import io.reactivex.disposables.Disposable import kotlinx.android.synthetic.main.taxt_u_p_base_fragment.arrivedView import kotlinx.android.synthetic.main.taxt_u_p_base_fragment.bottom +import kotlinx.android.synthetic.main.taxt_u_p_base_fragment.cb_setting_light +import kotlinx.android.synthetic.main.taxt_u_p_base_fragment.cb_setting_voice import kotlinx.android.synthetic.main.taxt_u_p_base_fragment.chekAndStartAutopilotView -import kotlinx.android.synthetic.main.taxt_u_p_base_fragment.clSettingView -import kotlinx.android.synthetic.main.taxt_u_p_base_fragment.evaluate import kotlinx.android.synthetic.main.taxt_u_p_base_fragment.infoVideoView import kotlinx.android.synthetic.main.taxt_u_p_base_fragment.itinerary -import kotlinx.android.synthetic.main.taxt_u_p_base_fragment.lbv_go2_center -import kotlinx.android.synthetic.main.taxt_u_p_base_fragment.mapBizView +import kotlinx.android.synthetic.main.taxt_u_p_base_fragment.light_setting +import kotlinx.android.synthetic.main.taxt_u_p_base_fragment.mHomeView +import kotlinx.android.synthetic.main.taxt_u_p_base_fragment.musicBarView import kotlinx.android.synthetic.main.taxt_u_p_base_fragment.mv_music_info import kotlinx.android.synthetic.main.taxt_u_p_base_fragment.overMapView -import kotlinx.android.synthetic.main.taxt_u_p_base_fragment.pcnActionView -import kotlinx.android.synthetic.main.taxt_u_p_base_fragment.rbv_setting_music -import kotlinx.android.synthetic.main.taxt_u_p_base_fragment.romaDistanceView -import kotlinx.android.synthetic.main.taxt_u_p_base_fragment.romaPView -import kotlinx.android.synthetic.main.taxt_u_p_base_fragment.speedView +import kotlinx.android.synthetic.main.taxt_u_p_base_fragment.voice_setting /** * 网约车基础Fragment,主要负责布局通用界面,处理站点面板和通话面板互斥情况 @@ -58,7 +56,7 @@ import kotlinx.android.synthetic.main.taxt_u_p_base_fragment.speedView * * @author tongchenfei */ -class TaxiPassengerBaseFragment() : +class TaxiPassengerBaseFragment : MvpFragment(), IMogoMapListener, TaxiPassengerTaxiView, DebugCallback { @@ -80,11 +78,11 @@ class TaxiPassengerBaseFragment() : override fun initViews(savedInstanceState: Bundle?) { super.initViews(savedInstanceState) - mapBizView!!.onCreate(savedInstanceState) + mHomeView!!.onCreate(savedInstanceState) overMapView.onCreateView(savedInstanceState) //overMapView.hideResetView() - val commonService = ARouter.getInstance().build(OchCommonConst.TAXI_UNMANNED_PASSENGER).navigation(); + val commonService = ARouter.getInstance().build(OchCommonConst.TAXI_UNMANNED_PASSENGER).navigation() if(commonService is CommonService){ context?.let { val statusView = commonService.getStatusBarView(it) @@ -97,89 +95,82 @@ class TaxiPassengerBaseFragment() : } private fun settingAndMusicListener() { - rbv_setting_music.setOrderIdCallback(object : RightBarView.RightBarCallback{ - override fun setSettingAndMusicShow(settingShow: Boolean, musicShow: Boolean) { - clSettingView.visibility = if(settingShow) View.VISIBLE else View.GONE - mv_music_info.visibility = if(musicShow) View.VISIBLE else View.GONE - } - - }) - lbv_go2_center.setOrderIdCallback(object : LeftBarView.LeftBarCallback{ - override fun setGo2CenterClick() { - when (bottom.getCurrentPage()) { - BottomBar.SelectView.PRECISIONMAP -> { - //切换到地图中间 - mapBizView.getUI()?.let { - val wgs02Location = OchLocationManager.getWgs02Location() - it.moveToCenter(MogoLatLng(wgs02Location.latitude,wgs02Location.longitude)) - } - } - BottomBar.SelectView.OVERMAPVIEW -> { - //overMapView.displayCustomOverView() - } - - else -> {} + cb_setting_light.setOnCheckedChangeListener { buttonView, isChecked -> + if(buttonView.id==cb_setting_light.id){ + if(isChecked){ + light_setting.visibility = View.VISIBLE + }else{ + light_setting.visibility = View.GONE } } + } + cb_setting_voice.setOnCheckedChangeListener { buttonView, isChecked -> + if(buttonView.id==cb_setting_voice.id){ + if(isChecked){ + voice_setting.visibility = View.VISIBLE + }else{ + voice_setting.visibility = View.GONE + } + } + } - }) } private fun initListener() { settingAndMusicListener() bottom.setOverMapApplyClick(object : BottomBar.ApplyClickLintener{ override fun onApplyClick(selectItem: BottomBar.SelectView) { + CallerLogger.d(TAG,"选择的项:${selectItem}") + if(selectItem==BottomBar.SelectView.PRECISIONMAP){ + WakeUpManager.startWakeUp() + }else{ + WakeUpManager.stopWakeup() + } +// if(selectItem!=BottomBar.SelectView.MUSIC){ +// if(!MusicModel.isPlaying()){ +// musicBarView.visibility = View.GONE +// } +// } when (selectItem) { BottomBar.SelectView.PRECISIONMAP -> { CallerHmiViewControlListenerManager.invokeMainPageViewVisible(View.VISIBLE) overMapView.visibility = View.GONE - mapBizView.visibility = View.VISIBLE + mHomeView.visibility = View.VISIBLE presenter?.setItineraryVisibility() - speedView.visibility = View.VISIBLE - if (DeviceUtils.isLeOrEb5Model()) { - romaPView.updateVisible(true) - romaDistanceView.visibility = View.VISIBLE - } else { - romaPView.updateVisible(false) - romaDistanceView.visibility = View.GONE - } - rbv_setting_music.setShowOnlySetting(0) - lbv_go2_center.visibility = View.VISIBLE - lbv_go2_center.showAngle() - pcnActionView.visibility = View.VISIBLE CallerHmiManager.showTrafficLightView() infoVideoView.visibility = View.GONE + mv_music_info.visibility = View.GONE CallerHmiManager.showTurnLightView() } BottomBar.SelectView.OVERMAPVIEW -> { CallerHmiViewControlListenerManager.invokeMainPageViewVisible(View.GONE) overMapView.visibility = View.VISIBLE - mapBizView.visibility = View.GONE + mHomeView.visibility = View.GONE presenter?.setItineraryVisibility() - speedView.visibility = View.VISIBLE - romaPView.updateVisible(false) - romaDistanceView.visibility = View.GONE - rbv_setting_music.setShowOnlySetting(0) - lbv_go2_center.visibility = View.GONE //lbv_go2_center.showOnlyCenter() - pcnActionView.visibility = View.VISIBLE CallerHmiManager.showTrafficLightView() infoVideoView.visibility = View.GONE + mv_music_info.visibility = View.GONE CallerHmiManager.showTurnLightView() } BottomBar.SelectView.VIDEO -> { CallerHmiViewControlListenerManager.invokeMainPageViewVisible(View.GONE) overMapView.visibility = View.GONE - mapBizView.visibility = View.GONE + mHomeView.visibility = View.GONE presenter?.setItineraryVisibility() - speedView.visibility = View.GONE - rbv_setting_music.setShowOnlySetting(1) - lbv_go2_center.visibility = View.GONE - romaPView.updateVisible(false) - romaDistanceView.visibility = View.GONE - pcnActionView.visibility = View.GONE CallerHmiManager.hideTrafficLightView() infoVideoView.visibility = View.VISIBLE + mv_music_info.visibility = View.GONE + CallerHmiManager.hideTurnLightView() + } + BottomBar.SelectView.MUSIC -> { + CallerHmiViewControlListenerManager.invokeMainPageViewVisible(View.GONE) + overMapView.visibility = View.GONE + mHomeView.visibility = View.GONE + presenter?.setItineraryVisibility() + CallerHmiManager.hideTrafficLightView() + infoVideoView.visibility = View.GONE + mv_music_info.visibility = View.VISIBLE CallerHmiManager.hideTurnLightView() } @@ -215,7 +206,7 @@ class TaxiPassengerBaseFragment() : override fun onResume() { super.onResume() - mapBizView!!.onResume() + mHomeView!!.onResume() overMapView.onResume() CallerLogger.d(M_TAXI_P + TAG, "onResume") } @@ -226,23 +217,23 @@ class TaxiPassengerBaseFragment() : override fun onLowMemory() { super.onLowMemory() - mapBizView!!.onLowMemory() + mHomeView!!.onLowMemory() } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) - mapBizView!!.onSaveInstanceState(outState) + mHomeView!!.onSaveInstanceState(outState) } override fun onPause() { super.onPause() - mapBizView!!.onPause() + mHomeView!!.onPause() overMapView?.onPause() CallerLogger.d(M_TAXI_P + TAG, "onPause") } override fun onDestroyView() { - mapBizView!!.onDestroy() + mHomeView!!.onDestroy() overMapView?.onDestroy() super.onDestroyView() } @@ -265,7 +256,7 @@ class TaxiPassengerBaseFragment() : } } } - BottomBar.SelectView.VIDEO, BottomBar.SelectView.NONE -> { + BottomBar.SelectView.VIDEO,BottomBar.SelectView.MUSIC, BottomBar.SelectView.NONE -> { if(itinerary.visibility!=View.GONE) { itinerary.visibility = View.GONE } @@ -276,7 +267,7 @@ class TaxiPassengerBaseFragment() : override fun showOrHideCheckAndStartAutopilotView(status:Int){ - UiThreadHandler.post { + BizLoopManager.runInMainThread{ arrivedView.visibility = View.GONE when (status) { 0 -> { @@ -319,7 +310,11 @@ class TaxiPassengerBaseFragment() : showOrHide(true,"Debug 按钮") } override fun setEvaluateView(){ - evaluate.visibility = View.VISIBLE + val automaticExploration = AIMessage.EvaluateData(System.currentTimeMillis().toString(),"",true) + AIMessageManager.post(automaticExploration) + RxUtils.createSubscribe(6_000) { + AIMessageManager.clearData() + } } /** @@ -333,7 +328,6 @@ class TaxiPassengerBaseFragment() : */ override fun showOrHideArrivedEndLayout(isShow: Boolean) { //chekAndStartAutopilotView.visibility = View.GONE - evaluate.visibility = View.GONE if (isShow) { exitFullVideoScreen(true) arrivedView.aniArrived(true) @@ -371,11 +365,6 @@ class TaxiPassengerBaseFragment() : val allAnimator = mutableListOf() allAnimator.addAll(aniStatusBar(isShow)) allAnimator.addAll(aniBottomBar(isShow)) - - allAnimator.addAll(aniSpeedSettingRow(isShow,speedView)) - allAnimator.addAll(aniSpeedSettingRow(isShow,romaPView)) - allAnimator.addAll(aniSpeedSettingRow(isShow,romaDistanceView)) - allAnimator.addAll(aniOrderInfo(isShow)) animatorSet.playTogether(allAnimator) animatorSet.start() @@ -384,108 +373,88 @@ class TaxiPassengerBaseFragment() : @SuppressLint("ObjectAnimatorBinding") fun aniStatusBar(show:Boolean):List{ val statusBar = mutableListOf() - val translationYStart: Float - val translationYEnd: Float - val alphaStart: Float - val alphaEnd: Float +// val translationYStart: Float +// val translationYEnd: Float +// val alphaStart: Float +// val alphaEnd: Float +// if(show){ +// translationYStart = -statusBarView!!.height.toFloat() +// translationYEnd = 0f +// alphaStart = 0.3f +// alphaEnd = 1f +// }else{ +// translationYStart = 0f +// translationYEnd = -statusBarView!!.height.toFloat() +// alphaStart = 1f +// alphaEnd = 0.3f +// } +// statusBar.add(ObjectAnimator.ofFloat(statusBarView, "translationY", translationYStart, translationYEnd).apply { +// duration = 1000 +// }) +// //ofFloatMove.duration = 1000 +// statusBar.add( ObjectAnimator.ofFloat(statusBarView, "alpha", alphaStart, alphaEnd).apply { +// duration = 1000 +// }) if(show){ - translationYStart = -statusBarView!!.height.toFloat() - translationYEnd = 0f - alphaStart = 0.3f - alphaEnd = 1f + statusBarView?.visibility = View.VISIBLE }else{ - translationYStart = 0f - translationYEnd = -statusBarView!!.height.toFloat() - alphaStart = 1f - alphaEnd = 0.3f + statusBarView?.visibility = View.GONE } - statusBar.add(ObjectAnimator.ofFloat(statusBarView, "translationY", translationYStart, translationYEnd).apply { - duration = 1000 - }) - //ofFloatMove.duration = 1000 - statusBar.add( ObjectAnimator.ofFloat(statusBarView, "alpha", alphaStart, alphaEnd).apply { - duration = 1000 - }) return statusBar } private fun aniBottomBar(show:Boolean):List{ val statusBar = mutableListOf() - val translationYStart: Float - val translationYEnd: Float - val alphaStart: Float - val alphaEnd: Float - if(show){ - translationYStart = bottom!!.height.toFloat() - translationYEnd = 0f - alphaStart = 0.3f - alphaEnd = 1f - }else{ - translationYStart = 0f - translationYEnd = bottom!!.height.toFloat() - alphaStart = 1f - alphaEnd = 0.3f - } - - statusBar.add(ObjectAnimator.ofFloat(bottom, "translationY", translationYStart, translationYEnd).apply { - duration = 1000 - }) - statusBar.add(ObjectAnimator.ofFloat(bottom, "alpha", alphaStart, alphaEnd).apply { - duration = 1000 - }) +// val translationYStart: Float +// val translationYEnd: Float +// val alphaStart: Float +// val alphaEnd: Float +// if(show){ +// translationYStart = bottom!!.height.toFloat() +// translationYEnd = 0f +// alphaStart = 0.3f +// alphaEnd = 1f +// }else{ +// translationYStart = 0f +// translationYEnd = bottom!!.height.toFloat() +// alphaStart = 1f +// alphaEnd = 0.3f +// } +// +// statusBar.add(ObjectAnimator.ofFloat(bottom, "translationY", translationYStart, translationYEnd).apply { +// duration = 1000 +// }) +// statusBar.add(ObjectAnimator.ofFloat(bottom, "alpha", alphaStart, alphaEnd).apply { +// duration = 1000 +// }) return statusBar } - private fun aniSpeedSettingRow(show:Boolean,view:View):List{ - val statusBar = mutableListOf() - val translationYStart: Float - val translationYEnd: Float - val alphaStart: Float - val alphaEnd: Float - if(show){ - translationYStart = -view.height.toFloat() - translationYEnd = 0f - alphaStart = 0.0f - alphaEnd = 1f - }else{ - translationYStart = 0f - translationYEnd = -view.height.toFloat() - alphaStart = 1f - alphaEnd = 0.0f - } - statusBar.add(ObjectAnimator.ofFloat(view, "translationY", translationYStart, translationYEnd).apply { - duration = 1000 - }) - statusBar.add(ObjectAnimator.ofFloat(view, "alpha", alphaStart, alphaEnd).apply { - duration = 1000 - }) - return statusBar - } private fun aniOrderInfo(show:Boolean):List{ val statusBar = mutableListOf() - val translationYStart: Float - val translationYEnd: Float - val alphaStart: Float - val alphaEnd: Float - if(show){ - translationYStart = itinerary.height.toFloat()/5 - translationYEnd = 0f - alphaStart = 0.0f - alphaEnd = 1f - }else{ - translationYStart = 0f - translationYEnd = itinerary.height.toFloat()/5 - alphaStart = 1f - alphaEnd = 0.0f - } - - statusBar.add(ObjectAnimator.ofFloat(itinerary, "translationY", translationYStart, translationYEnd).apply { - duration = 1000 - }) - statusBar.add(ObjectAnimator.ofFloat(itinerary, "alpha", alphaStart, alphaEnd).apply { - duration = 1000 - }) +// val translationYStart: Float +// val translationYEnd: Float +// val alphaStart: Float +// val alphaEnd: Float +// if(show){ +// translationYStart = itinerary.height.toFloat()/5 +// translationYEnd = 0f +// alphaStart = 0.0f +// alphaEnd = 1f +// }else{ +// translationYStart = 0f +// translationYEnd = itinerary.height.toFloat()/5 +// alphaStart = 1f +// alphaEnd = 0.0f +// } +// +// statusBar.add(ObjectAnimator.ofFloat(itinerary, "translationY", translationYStart, translationYEnd).apply { +// duration = 1000 +// }) +// statusBar.add(ObjectAnimator.ofFloat(itinerary, "alpha", alphaStart, alphaEnd).apply { +// duration = 1000 +// }) return statusBar } diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/AIMessageManager.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/AIMessageManager.kt new file mode 100644 index 0000000000..566f8ebb66 --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/AIMessageManager.kt @@ -0,0 +1,64 @@ +package com.mogo.och.unmanned.passenger.ui.aiview + +import com.mogo.och.unmanned.passenger.ui.aiview.bean.AIMessage +import java.util.concurrent.CopyOnWriteArrayList + + +object AIMessageManager { + + // 使用 CopyOnWriteArrayList 来存储消息回调列表,保证线程安全 + private val messageListeners: MutableList = CopyOnWriteArrayList() + + + /** + * 注册一个消息监听器。 + * + * @param listener 要注册的 AiMessageListener 实例。 + */ + fun registerListener(listener: AIMessageListener) { + messageListeners.add(listener) + } + + /** + * 取消注册一个消息监听器。 + * + * @param listener 要取消注册的 AiMessageListener 实例。 + */ + fun unregisterListener(listener: AIMessageListener) { + messageListeners.remove(listener) + } + + /** + * 发布一条消息。 + * + * 这条消息会被发送给所有已注册的监听器。 + * + * @param msg 要发布的消息。 + */ + fun post(msg: AIMessage) { + // 遍历所有已注册的监听器,并调用它们的 onReceive 方法 + messageListeners.forEach { callback -> + callback.onReceive(msg) + } + } + + fun clearData(){ + messageListeners.forEach { callback -> + callback.clear() + } + } + + /** + * 消息监听器接口。 + */ + interface AIMessageListener { + /** + * 当接收到消息时,会调用此方法。 + * + * @param msg 接收到的消息。 + */ + fun onReceive(msg: AIMessage) + + fun clear() + } +} \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/AIViewModel.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/AIViewModel.kt new file mode 100644 index 0000000000..742fad0566 --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/AIViewModel.kt @@ -0,0 +1,385 @@ +package com.mogo.och.unmanned.passenger.ui.aiview + +import android.util.Log +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.mogo.eagle.core.data.BaseData +import com.mogo.eagle.core.data.ai.V2XRepository +import com.mogo.eagle.core.data.map.MogoLocation +import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Listener +import com.mogo.och.unmanned.passenger.ui.aiview.bean.AIMessage +import com.mogo.mgintelligent.speech.AsrResult +import com.mogo.mgintelligent.speech.AsrState +import com.mogo.mgintelligent.speech.IWakeUpListener +import com.mogo.mgintelligent.speech.MGSpeech +import com.mogo.mgintelligent.speech.iflytek.WakeUpListener +import com.mogo.mgintelligent.speech.iflytek.WakeUpManager +import com.mogo.och.bridge.autopilot.location.OchLocationManager +import com.mogo.och.common.module.biz.birdge.BridgeListener +import com.mogo.och.common.module.biz.birdge.BridgeManager +import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager +import com.mogo.och.common.module.network.OchCommonServiceCallback +import com.mogo.och.data.taxi.BaseOrderBean +import com.mogo.och.data.taxi.TaxiOrderStatusEnum +import com.mogo.och.unmanned.passenger.bean.ai.LatLonBody +import com.mogo.och.unmanned.passenger.network.ai.AiServiceManager +import com.mogo.och.unmanned.taxi.utils.order.OrderListener +import com.mogo.och.unmanned.taxi.utils.order.OrderModel +import com.mogo.service.v2n.bean.MGLlmQueryBean +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.SharedFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.launch + +class AIViewModel : ViewModel(), AIMessageManager.AIMessageListener, IWakeUpListener, + BridgeListener { + + private val msgList = mutableListOf() + private var lastTimestamp = System.currentTimeMillis() + + // 记录最后一次事件发生的时间,使用 private set 限制外部修改 + // private val TIMESTAMP_THRESHOLD = 1000 * 60 * 5 // 5分钟 + private val TIMESTAMP_THRESHOLD = 1000 * 30 + + private var llmResultJob: Job? = null + + private var isChecking = false + + private val _messagesFlow = MutableStateFlow>(emptyList()) + val messagesFlow: SharedFlow> get() = _messagesFlow + + private val _asrUIStateFlow = MutableStateFlow(AsrUIState.Idle) + val asrUIStateFlow: StateFlow get() = _asrUIStateFlow + + private val mgSpeech = MGSpeech + + private val tipsTimeOut = "小智还没反应过来,请稍后再试~" + private val tipsExit = "我先退下了" + val tipsQuestions = listOf( + "可以问我:前方路口有拥堵吗?", + "可以对我说:介绍一下蘑菇车联?", + "想要对话时可以点击:小智智能体", + "可以问我:今天天气怎么样?", + ) + private val tipsWakeUpList = listOf( + "嗯,我在呢", + "在的", + "在呢", + "你说", + ) + + private val orderListener = object : OrderListener { + override fun onCurrentOrderStatusChanged(order: BaseOrderBean?) { + if (order?.orderStatus == TaxiOrderStatusEnum.ArriveAtEnd.code) { + synchronized(msgList) { + msgList.clear() + _messagesFlow.value = msgList.toList() + } + } + if(order==null){ + clearNdeTra() + } + } + } + + private val locationCallback = object : IMoGoChassisLocationGCJ02Listener { + override fun onChassisLocationGCJ02(mogoLocation: MogoLocation?) { + mogoLocation?.let { + V2XRepository.provideLocation(it, 0) + } + + } + } + + private val wakeUpListener = object : WakeUpListener { + override fun wakeupSuccess() { + onWakeUp() + WakeUpManager.stopWakeup() + } + + } + + init { + + } + + fun setViewCallback(aiView: AiViewCallback) { + OrderModel.setOrderStatusCallback(TAG, orderListener) + OchLocationManager.addGCJ02Listener(TAG, 1, locationCallback) + AIMessageManager.registerListener(this) + WakeUpManager.setWakeUpListener(wakeUpListener) + mgSpeech.weakUpListener = this + mgSpeech.startWeakUp() + + BridgeManager.addBridgeListener(TAG,this) + + llmResultJob = viewModelScope.launch(Dispatchers.IO) { + V2XRepository.llmResultFlow.collect { result -> + Log.d(TAG, "llm result: $result") + + val msg = msgList.findLast { it.id == result.queryId } + + if (msg == null || msg !is AIMessage.QA) { + Log.w(TAG, "消息不匹配,${msg}") + return@collect + } + + AIMessageManager.post( + AIMessage.QA( + id = result.queryId, + title = result.answer, + tts = result.answer, + answer = result.answer, + question = msg.question, + state = AIMessage.QA.QuestionState.FINISH, + pictureUrl = result.imgUrls.getOrNull(0) ?: "", + pictureUrlList = result.imgUrls + ) + ) + } + } + } + + + override fun onCleared() { + AIMessageManager.unregisterListener(this) + mgSpeech.weakUpListener = null + WakeUpManager.setWakeUpListener(null) + mgSpeech.stopWeakUp() + llmResultJob?.cancel() + OrderModel.setOrderStatusCallback(TAG, null) + OchLocationManager.removeGCJ02Listener(TAG) + super.onCleared() + } + + override fun onReceive(msg: AIMessage) { + Log.d(TAG, "onReceive: $msg") + if (isChecking) { + if (msg is AIMessage.Event) { + msg.showScanFlag = true + } + } + + // 获更新消息 + updateMsg(msg) + } + + override fun clear() { + clearMsg() + } + + private fun handleMsg(newMessage: AIMessage) { + val existingIndex = findMessageIndex(newMessage.id) + if (existingIndex != -1) { + handleExistingMessage(existingIndex, newMessage) + } else { + handleNewMessage(newMessage) + } + } + + private fun findMessageIndex(messageId: String): Int { + return msgList.indexOfFirst { it.id == messageId } + } + + private fun handleExistingMessage(index: Int, newMessage: AIMessage) { + val oldMessage = msgList[index] + + if (shouldSkipUpdate(oldMessage, newMessage)) { + return + } + + newMessage.showTimestamp = oldMessage.showTimestamp + msgList[index] = newMessage + + speakMessageIfNeeded(newMessage, isLastMessage = msgList.last() == newMessage) + } + + private fun handleNewMessage(newMessage: AIMessage) { + updateTimestampIfNeeded(newMessage) + msgList.add(newMessage) + speakMessageIfNeeded(newMessage, isLastMessage = true) + } + + private fun shouldSkipUpdate(oldMessage: AIMessage, newMessage: AIMessage): Boolean { + if (oldMessage is AIMessage.QA + && (oldMessage.state == AIMessage.QA.QuestionState.FINISH || + oldMessage.state == AIMessage.QA.QuestionState.ERROR) + ) { + Log.d(TAG, "handleMsg: 消息拦截") + return true + } + return false + } + + private fun updateTimestampIfNeeded(newMessage: AIMessage) { + val time = newMessage.timestamp - lastTimestamp + if (time >= TIMESTAMP_THRESHOLD) { + newMessage.showTimestamp = true + lastTimestamp = newMessage.timestamp + } + } + + private fun speakMessageIfNeeded(newMessage: AIMessage, isLastMessage: Boolean) { + if (isLastMessage && newMessage.tts.isNotEmpty()) { + mgSpeech.speak(newMessage.tts) + } + } + + companion object { + private const val TAG = "AiViewModel" + } + + override fun onWakeUp() { + mgSpeech.isAssistantShow(true) + val random = tipsWakeUpList.random() + _asrUIStateFlow.value = AsrUIState.Listening(random) + mgSpeech.speak(random, true) { + mgSpeech.startAsr() + _asrUIStateFlow.value = AsrUIState.Listening("") + } + } + + override fun onListener(msg: AsrResult) { + when (msg.type) { + AsrState.STATE_PARTIAL -> { +// binding.tvContent.text = msg.content + + _asrUIStateFlow.value = AsrUIState.Listening(msg.content) + } + + AsrState.STATE_FINAL -> { +// assistantView?.showWaitingResult(msg.content) +// binding.tvContent.text = msg.content + _asrUIStateFlow.value = AsrUIState.Recognized(msg.content) + } + + AsrState.STATE_EXIT -> { + WakeUpManager.startWakeUp() + _asrUIStateFlow.value = AsrUIState.Idle + mgSpeech.speak(tipsExit) + mgSpeech.isAssistantShow(false) + val content = msg.content + if (content.isNotEmpty()) { + viewModelScope.launch(Dispatchers.IO) { + // 1.上报消息 + val msgId = "${System.currentTimeMillis()}" + V2XRepository.uploadLlmQuery(MGLlmQueryBean().apply { + //user = sn + conversationId = "" + query = content + queryId = msgId + }) + // 2.生成消息 + val qaMsg = AIMessage.QA( + id = msgId, + title = "", + question = content, + state = AIMessage.QA.QuestionState.UNDERSTAND, + answer = "", + ) + AIMessageManager.post(qaMsg) + // 3.延迟发送状态 + delay(2000) + val analyzeMsg = qaMsg.copy(state = AIMessage.QA.QuestionState.ANALYZE) + AIMessageManager.post(analyzeMsg) + // 4.延迟发送状态 + delay(2000) + val answerMsg = qaMsg.copy(state = AIMessage.QA.QuestionState.ANSWER) + AIMessageManager.post(answerMsg) + + // test + delay(10000) + val finishMsg = qaMsg.copy( + state = AIMessage.QA.QuestionState.ERROR, + answer = tipsTimeOut, + ) + AIMessageManager.post(finishMsg) + } + } + } + + else -> { + _asrUIStateFlow.value = AsrUIState.Idle + mgSpeech.isAssistantShow(false) + } + } + } + + private fun updateMsg(msg: AIMessage) { + synchronized(msgList) { + handleMsg(msg) + _messagesFlow.value = msgList.toList() + } + } + + private fun deleteMsg(msgId: String) { + synchronized(msgList) { + val iterator = msgList.iterator() + while (iterator.hasNext()) { + if (iterator.next().id == msgId) { + iterator.remove() + } + } + _messagesFlow.value = msgList.toList() + } + } + + private fun clearMsg() { + synchronized(msgList) { + msgList.clear() + _messagesFlow.value = msgList.toList() + } + } + + + fun getQuestionsRandomIndex(): Int { + return tipsQuestions.indexOf(tipsQuestions.random()) + } + + interface AiViewCallback { + + } + + override fun onTrajectoryPointsAndDistanceListener( + trajectoryList: MutableList, + distance: Double + ) { + if(trajectoryList.size>2&&distance<40_000){ + AiServiceManager.uploadTrajectory("0",LatLonBody.toLatLonBody(trajectoryList),object :OchCommonServiceCallback{ + override fun onSuccess(data: BaseData?) { + OchChainLogManager.writeChainLogTrajectory("nde日志","获取到轨迹向nde上报轨迹成功") + } + + override fun onFail(code: Int, msg: String?) { + OchChainLogManager.writeChainLogTrajectory("nde日志","获取到轨迹轨迹上报失败") + } + + }) + } + } + + private fun clearNdeTra() { + AiServiceManager.uploadTrajectory("1", mutableListOf(),object :OchCommonServiceCallback{ + override fun onSuccess(data: BaseData?) { + OchChainLogManager.writeChainLogTrajectory("nde日志","删除向nde上报轨迹成功") + } + + override fun onFail(code: Int, msg: String?) { + OchChainLogManager.writeChainLogTrajectory("nde日志","删除轨迹轨迹上报失败") + } + + }) + } +} + +sealed class AsrUIState { + object Idle : AsrUIState() + data class Listening(val partialText: String) : AsrUIState() + data class Recognized(val finalText: String) : AsrUIState() +} + + + diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/AiView.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/AiView.kt new file mode 100644 index 0000000000..50d8d9a1a6 --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/AiView.kt @@ -0,0 +1,358 @@ +package com.mogo.och.unmanned.passenger.ui.aiview + +import android.animation.ObjectAnimator +import android.content.Context +import android.util.AttributeSet +import androidx.lifecycle.lifecycleScope +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.widget.TextView +import androidx.constraintlayout.motion.widget.MotionLayout +import androidx.core.animation.addListener +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.findViewTreeLifecycleOwner +import androidx.lifecycle.findViewTreeViewModelStoreOwner +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.mogo.eagle.core.function.call.autopilot.CallerPlanningActionsListenerManager +import com.mogo.eagle.core.utilcode.kotlin.onClick +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.mgintelligent.speech.iflytek.WakeUpManager +import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager +import com.mogo.och.common.module.utils.BigFrameAnimatorContainer +import com.mogo.och.common.module.utils.RxUtils +import com.mogo.och.unmanned.passenger.ui.aiview.adapter.AIMessageAdapter +import com.mogo.och.unmanned.passenger.ui.aiview.adapter.OnItemClickListener +import com.mogo.och.unmanned.passenger.ui.aiview.adapter.PaddingItemDecoration +import com.mogo.och.unmanned.passenger.ui.aiview.bean.AIMessage +import com.mogo.och.unmanned.taxi.passenger.R +import kotlinx.android.synthetic.main.taxt_p_ai.view.aiMotionLayout +import kotlinx.android.synthetic.main.taxt_p_ai.view.ivIcon +import kotlinx.android.synthetic.main.taxt_p_ai.view.ivListening +import kotlinx.android.synthetic.main.taxt_p_ai.view.rvMessages +import kotlinx.android.synthetic.main.taxt_p_ai.view.rvMessagesEmpty +import kotlinx.android.synthetic.main.taxt_p_ai.view.tvContent +import kotlinx.coroutines.Job +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import kotlinx.coroutines.suspendCancellableCoroutine + +class AiView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : MotionLayout(context, attrs, defStyleAttr), AIViewModel.AiViewCallback{ + + + + private var viewModel:AIViewModel?=null +// private var pncActionsModel:PNCActionsViewModel ?= null + private var roadV2NEventModel:RoadV2NEventViewModel ?= null + private var roadCrossRoamModel:RoadCrossRoamViewModel ?= null + private var automaticExplorationModel:AutomaticExplorationViewModel ?= null + private var ndeViewModel: NDEViewModel ?= null + + private var aiAnimator: BigFrameAnimatorContainer?=null + private var aiAnimatorBg: BigFrameAnimatorContainer?=null + + private var tipLooperJob: Job? = null + + @Volatile + private var isTipsLooperRunning = false + + private var tipsIndex = 0 + + private var isUserScrollingTime = 0L + + + private val messageAdapter: AIMessageAdapter by lazy { AIMessageAdapter() } + private val messageLayoutManager: LinearLayoutManager by lazy { + LinearLayoutManager(context).apply { + stackFromEnd = true + } + } + + companion object{ + private const val TIPS_ROTATION_DELAY = 3000L + private const val TAG ="AiView" + private const val SCROLL_THRESHOLD = 5000L + } + + + + + init { + LayoutInflater.from(context).inflate(R.layout.taxt_p_ai, this, true) + + rvMessages.layoutManager = messageLayoutManager + rvMessages.adapter = messageAdapter + rvMessages.addItemDecoration(PaddingItemDecoration(200, 300)) + messageAdapter.onItemClickListener = OnItemClickListener { item, position -> + if (item is AIMessage.Event) { + + } + } + rvMessages.addOnScrollListener(object : RecyclerView.OnScrollListener() { + override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) { + super.onScrollStateChanged(recyclerView, newState) + if (newState != RecyclerView.SCROLL_STATE_IDLE) { + isUserScrollingTime = System.currentTimeMillis() + } + } + }) + + if(aiAnimator==null) { + aiAnimator = BigFrameAnimatorContainer(R.array.ai_animator, 31, ivIcon) + } +// aiAnimator?.start() + + ivIcon.onClick { + viewModel?.onWakeUp() + } + + ivListening.onClick { + + } + + + } + + private fun showListening(show: Boolean) { + if (aiAnimatorBg == null) { + aiAnimatorBg = BigFrameAnimatorContainer(R.array.ai_animator_listening, 31, ivListening) + } + + CallerLogger.d(TAG,"showListening: $show") + if (show) { + ivListening.alpha = 1F + aiAnimatorBg?.start() + } else { + aiAnimatorBg?.stop() + ivListening.alpha = 0F + } + } + + private fun startTips() { + if (isTipsLooperRunning) { + CallerLogger.d(TAG,"${tName()} startTips: Already running") + return + } + tipLooperJob?.cancel() + + tipLooperJob = findViewTreeLifecycleOwner()?.lifecycleScope?.launch { + isTipsLooperRunning = true + CallerLogger.d(TAG,"${tName()} startTipsLooper: start") + while (isTipsLooperRunning) { + CallerLogger.d(TAG,"${tName()} startTipsLooper: next") + viewModel?.let { + val tips = it.tipsQuestions + val index = tipsIndex++ % tips.size + tvContent.changeTextWithFade(tips[index]) + } + delay(TIPS_ROTATION_DELAY) + } + } + } + + private fun stopTips() { + Log.i(TAG, "${tName()} stopTips: stop") + tipLooperJob?.cancel() + tipLooperJob = null + isTipsLooperRunning = false + } + + override fun onVisibilityAggregated(isVisible: Boolean) { + super.onVisibilityAggregated(isVisible) + CallerLogger.d(TAG,"是否展示中:${isVisible}") + try { + if(isVisible){ + aiAnimator?.start() + RxUtils.createSubscribe(3_000) { + aiMotionLayout.setTransitionListener(object :TransitionListener{ + override fun onTransitionStarted( + motionLayout: MotionLayout?, + startId: Int, + endId: Int + ) { + CallerLogger.d(TAG,"onTransitionStarted:${motionLayout?.id}_$startId $endId") + } + + override fun onTransitionChange( + motionLayout: MotionLayout?, + startId: Int, + endId: Int, + progress: Float + ) { + CallerLogger.d(TAG,"onTransitionChange:${motionLayout?.id}_$startId $endId ————${progress}") + } + + override fun onTransitionCompleted( + motionLayout: MotionLayout?, + currentId: Int + ) { + CallerLogger.d(TAG,"${tName()} onTransitionCompleted:${motionLayout?.id}_$currentId") + rvMessagesEmpty.visibility = View.VISIBLE + WakeUpManager.startWakeUp() + startContextInfo() + startListInfo() + } + + override fun onTransitionTrigger( + motionLayout: MotionLayout?, + triggerId: Int, + positive: Boolean, + progress: Float + ) { + CallerLogger.d(TAG,"onTransitionTrigger:${motionLayout?.id}_$triggerId ${triggerId} $positive $progress") + } + + }) + aiMotionLayout.transitionToEnd() + } + }else{ + aiAnimator?.stop() + } + }catch (e:Exception){ + OchChainLogManager.writeChainLog("展示崩溃","${e.message}") + } + + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + viewModel = findViewTreeViewModelStoreOwner()?.let { + ViewModelProvider(it).get(AIViewModel::class.java) + } + viewModel?.setViewCallback(this) +// pncActionsModel = findViewTreeViewModelStoreOwner()?.let { +// ViewModelProvider(it)[PNCActionsViewModel::class.java] +// } +// pncActionsModel?.init() + roadV2NEventModel = findViewTreeViewModelStoreOwner()?.let{ + ViewModelProvider(it)[RoadV2NEventViewModel::class.java] + } + roadV2NEventModel?.init() + roadCrossRoamModel = findViewTreeViewModelStoreOwner()?.let{ + ViewModelProvider(it)[RoadCrossRoamViewModel::class.java] + } + roadCrossRoamModel?.init(context) + automaticExplorationModel = findViewTreeViewModelStoreOwner()?.let{ + ViewModelProvider(it)[AutomaticExplorationViewModel::class.java] + } + automaticExplorationModel?.init() + ndeViewModel = findViewTreeViewModelStoreOwner()?.let{ + ViewModelProvider(it)[NDEViewModel::class.java] + } + ndeViewModel?.init() + } + + private fun startListInfo(){ + tipsIndex = viewModel?.getQuestionsRandomIndex()?:0 + findViewTreeLifecycleOwner()?.lifecycleScope?.launch { + viewModel?.messagesFlow?.collect { + Log.d(TAG, "${tName()} onMessages update: ${it}") + if(it.isNotEmpty()){ + rvMessagesEmpty.visibility = View.INVISIBLE + }else{ + rvMessagesEmpty.visibility = View.VISIBLE + } + messageAdapter.submitList(it) { + Log.d(TAG, "${tName()} adapter submit: ") + scrollToBottom() + } + } + } + } + + private fun startContextInfo(){ + findViewTreeLifecycleOwner()?.lifecycleScope?.launch { + viewModel?.asrUIStateFlow?.collect { + Log.d(TAG, "${tName()}asr ui state $it") + + when (it) { + is AsrUIState.Idle -> { + startTips() + showListening(false) + } + + is AsrUIState.Listening -> { + stopTips() + showListening(true) + tvContent.text = it.partialText + } + + is AsrUIState.Recognized -> { + stopTips() + tvContent.text = it.finalText + showListening(false) + } + } + } + } + } + + override fun onDetachedFromWindow() { + aiAnimator?.stop() + aiAnimator = null + aiAnimatorBg?.stop() + aiAnimatorBg = null + tipLooperJob?.cancel() + CallerPlanningActionsListenerManager.removeListener(TAG) + super.onDetachedFromWindow() + } + + // 滚动到RecyclerView底部 + private fun scrollToBottom() { + val delay = System.currentTimeMillis() - isUserScrollingTime + if (delay < SCROLL_THRESHOLD) { + return + } + val layoutManager = rvMessages.layoutManager as LinearLayoutManager + layoutManager.scrollToPositionWithOffset(messageAdapter.itemCount - 1, 0) + } + + fun tName(): String { + return "【${Thread.currentThread().name}】" + } + + private suspend fun TextView.changeTextWithFade(newText: String) { + fadeOutFlow() + text = newText + fadeInFlow() + } + + private suspend fun View.fadeOutFlow(duration: Long = 100) = suspendCancellableCoroutine { continuation -> + val animator = ObjectAnimator.ofFloat(this@fadeOutFlow, "alpha", 1f, 0f).apply { + this.duration = duration + } + animator.addListener(onEnd = { + continuation.resume(Unit) { + animator.cancel() + } + }) + animator.start() + continuation.invokeOnCancellation { + Log.i(TAG, "fadeOutFlow: cancel") + animator.cancel() + } + } + + private suspend fun View.fadeInFlow(duration: Long = 100) = + suspendCancellableCoroutine { continuation -> + val animator = ObjectAnimator.ofFloat(this@fadeInFlow, "alpha", 0f, 1f).apply { + this.duration = duration + } + animator.addListener(onEnd = { + continuation.resume(Unit) { + animator.cancel() + } + }) + animator.start() + continuation.invokeOnCancellation { + CallerLogger.d(TAG,"fadeInFlow: cancel") + animator.cancel() + } + } + +} \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/AutomaticExplorationViewModel.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/AutomaticExplorationViewModel.kt new file mode 100644 index 0000000000..153b91e0d2 --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/AutomaticExplorationViewModel.kt @@ -0,0 +1,167 @@ +package com.mogo.och.unmanned.passenger.ui.aiview + +import android.os.CountDownTimer +import androidx.lifecycle.ViewModel +import com.mogo.commons.storage.SharedPrefsMgr +import com.mogo.eagle.core.data.msgbox.MsgBoxBean +import com.mogo.eagle.core.data.msgbox.MsgBoxType +import com.mogo.eagle.core.data.msgbox.MsgCategory +import com.mogo.eagle.core.function.api.datacenter.msgbox.IMsgBoxListener +import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxListenerManager +import com.mogo.eagle.core.utilcode.util.StringUtils +import com.mogo.eagle.core.utilcode.util.ThreadUtils +import com.mogo.eagle.core.utilcode.util.UiThreadHandler +import com.mogo.och.bridge.distance.IDistanceListener +import com.mogo.och.bridge.distance.TrajectoryAndDistanceManager +import com.mogo.och.data.taxi.BaseOrderBean +import com.mogo.och.data.taxi.TaxiOrderStatusEnum +import com.mogo.och.unmanned.passenger.ui.aiview.bean.AIMessage +import com.mogo.och.unmanned.taxi.utils.order.OrderListener +import com.mogo.och.unmanned.taxi.utils.order.OrderModel + +/** + * 自动探查 + */ +class AutomaticExplorationViewModel: ViewModel(), OrderListener, IMsgBoxListener, + IDistanceListener { + + companion object{ + private const val TAG = "AutomaticExplorationViewModel" + private const val EXPLORATION_SHOW_TIME = 300000L //距离用户在触发上一次事件播报的时间5分钟后,自动触发常规道路情况检测 + } + + private var showViewTimer: CountDownTimer?= null //展示自动探查倒计时 + private var isCountingDown: Boolean = false //是否处于倒计时中 + private var hasOrder: Boolean = false // 车当前是否有订单 + + fun init(){ + OrderModel.setOrderStatusCallback(TAG,this) + CallerMsgBoxListenerManager.addListener(TAG,this) + TrajectoryAndDistanceManager.addDistanceListener(TAG, this) + } + + override fun onCurrentOrderStatusChanged(order: BaseOrderBean?) { + if(order==null){ + cancelTimer() + currentOrderStatus(false) + }else { + when (order.orderStatus) { + TaxiOrderStatusEnum.None.code -> { + cancelTimer() + currentOrderStatus(false) + } + TaxiOrderStatusEnum.OnTheWayToStart.code -> { + startShowTimer() + currentOrderStatus(true) + } + TaxiOrderStatusEnum.ArriveAtStart.code -> { + startShowTimer() + currentOrderStatus(true) + } + TaxiOrderStatusEnum.UserArriveAtStart.code -> { + startShowTimer() + currentOrderStatus(true) + } + TaxiOrderStatusEnum.OnTheWayToEnd.code -> { + startShowTimer() + currentOrderStatus(true) + } + TaxiOrderStatusEnum.ArriveAtEnd.code -> { + startShowTimer() + currentOrderStatus(true) + } + TaxiOrderStatusEnum.JourneyCompleted.code -> { + cancelTimer() + currentOrderStatus(false) + } + TaxiOrderStatusEnum.Cancel.code -> { + cancelTimer() + currentOrderStatus(false) + } + else -> { + cancelTimer() + currentOrderStatus(false) + } + } + } + } + + override fun onDataChanged(category: MsgCategory, msgBoxList: MsgBoxBean) { + if(category == MsgCategory.NOTICE){ + if(msgBoxList.type == MsgBoxType.V2X){ + //重置倒计时时长 + cancelTimer() + if(hasOrder){ + startShowTimer() + } + } + } + } + + /** + * 取消倒计时 + */ + private fun cancelTimer(){ + showViewTimer?.cancel() + showViewTimer = null + isCountingDown = false + } + + /** + * 开始倒计时 + */ + private fun startShowTimer(){ + if(!isCountingDown){ + ThreadUtils.runOnUiThread { + if(showViewTimer == null){ + showViewTimer = object: CountDownTimer(EXPLORATION_SHOW_TIME,EXPLORATION_SHOW_TIME){ + override fun onTick(millisUntilFinished: Long) { + + } + + override fun onFinish() { + if(hasOrder){ + showAutoExploration() + } + isCountingDown = false + } + } + } + isCountingDown = true + showViewTimer?.start() + } + } + } + + /** + * 设置当前订单状态 + * @param orderStatus true有订单;false没有订单 + */ + private fun currentOrderStatus(orderStatus: Boolean){ + hasOrder = orderStatus + } + + + + private fun showAutoExploration(){ + val automaticExploration = AIMessage.AutomaticExploration(System.currentTimeMillis().toString(),"") + AIMessageManager.post(automaticExploration) + } + + private val orderShowEvaluate = "SHOWEVALUATE" + + override fun distanceCallback(distance: Float) { + if(distance<=500) { + OrderModel.orderBean?.orderNo?.let { + val string = SharedPrefsMgr.getInstance().getString(orderShowEvaluate) + if (StringUtils.isEmpty(string) || !string.equals(it)) { + val automaticExploration = AIMessage.EvaluateData(System.currentTimeMillis().toString(),"",true) + AIMessageManager.post(automaticExploration) + SharedPrefsMgr.getInstance().putString(orderShowEvaluate, it) + } + } + } + + } + +} \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/NDEViewModel.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/NDEViewModel.kt new file mode 100644 index 0000000000..66c3fc90a0 --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/NDEViewModel.kt @@ -0,0 +1,83 @@ +package com.mogo.och.unmanned.passenger.ui.aiview + +import androidx.lifecycle.ViewModel +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotIdentifyListener +import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotIdentifyListenerManager +import com.mogo.och.unmanned.passenger.ui.aiview.bean.AIMessage +import mogo.telematics.pad.MessagePad.TrackedObject + +class NDEViewModel: ViewModel(), IMoGoAutopilotIdentifyListener { + + companion object{ + private const val TAG = "NDEViewModel" + } + + private var lastMap2 = HashMap() + private var lastTime = 0L + + fun init(){ + CallerAutopilotIdentifyListenerManager.addListener(TAG, this) + } + + override fun onAutopilotIdentifyDataUpdate(trafficData: List?){ + super.onAutopilotIdentifyDataUpdate(trafficData) + handleCheLong(trafficData) + } + + private fun handleCheLong(trafficData: List?) { + var hasCheLong = false + var isNewData = false + val roadMsgList = ArrayList() + val curMap = HashMap() + if (lastTime > 0 && System.currentTimeMillis() - lastTime > 60000) { + lastMap2.clear()// 清除上次车龙事件的缓存 + } + var lastLocStr: String? = "" + trafficData?.forEach { obj -> + if (obj.type == 707) {// 当前方向所有车道 + if (obj.polygonCount > 1) {// 当次数据有车龙事件 + lastLocStr = lastMap2[obj.laneNum] + // 1. 上次无车龙但此次有车龙,认为是新车龙事件 + // 2. 两次都有车龙,则判断车龙的长度是否相同 + if (lastLocStr == null || lastLocStr == "0" || lastLocStr != "${obj.polygonList[0]}-${obj.polygonList[obj.polygonCount - 1]}") { + isNewData = true + } + hasCheLong = true + + // key: 车道号,value: 非0代表有车龙且首、尾两个点可计算车龙长度 + curMap[obj.laneNum] = + "${obj.polygonList[0]}-${obj.polygonList[obj.polygonCount - 1]}" + } else {// 当次没有车龙 + if (lastMap2[obj.laneNum] != null && lastMap2[obj.laneNum] != "0") {// 3. 上次有车龙,这次无车龙 + isNewData = true + } + // key: 车道号,value: 0代表无车龙 + curMap[obj.laneNum] = "0" + } + // 保存所有车道信息 + roadMsgList.add( + AIMessage.RoadMsg( + obj.arrowType, + laneNum = obj.laneNum, + isRecommend = obj.suggestedLanes, + isCheLong = obj.polygonCount > 1 + ) + ) + } + } + if (isNewData) { + // 清除上次车道信息 + lastMap2.clear() + if (hasCheLong) { + // 缓存当次车龙事件所有车道信息 + lastMap2.putAll(curMap) + lastTime = System.currentTimeMillis() + + val sortedList = roadMsgList.sortedWith(compareByDescending { it.laneNum }) + val ndeEvent = AIMessage.NDEData(System.currentTimeMillis().toString(),"路口车龙","前方路口有车龙",sortedList) + AIMessageManager.post(ndeEvent) + } + } + } + +} \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/PNCActionsViewModel.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/PNCActionsViewModel.kt new file mode 100644 index 0000000000..c3875ae4f7 --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/PNCActionsViewModel.kt @@ -0,0 +1,228 @@ +package com.mogo.och.unmanned.passenger.ui.aiview + +import androidx.lifecycle.ViewModel +import com.mogo.eagle.core.data.autopilot.pnc.PncActionsHelper +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotPlanningActionsListener +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerPlanningActionsListenerManager +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.util.UiThreadHandler +import com.mogo.och.common.module.manager.loop.BizLoopManager +import com.mogo.och.unmanned.passenger.model.TaxiPassengerModel +import com.mogo.och.unmanned.passenger.ui.aiview.bean.AIMessage +import mogo.telematics.pad.MessagePad + +class PNCActionsViewModel: ViewModel(), IMoGoAutopilotPlanningActionsListener { + + companion object{ + private const val TAG = "PNCActionsViewModel" + } + + private var currentAction = "" + + fun init(){ + CallerPlanningActionsListenerManager.addListener(TAG, this) + } + + override fun pncActions(planningActionMsg: MessagePad.PlanningActionMsg) { + try { + BizLoopManager.runInMainThread { + if (CallerAutoPilotStatusListenerManager.getState() == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) { + var actions: String? = null + planningActionMsg.actionMsg?.let { + try { + actions = PncActionsHelper.getAction( + it.drivingState.number, + it.drivingAction.number + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + planningActionMsg.v2NActionMsgList?.forEach { v2nAction -> + actions = PncActionsHelper.getAction( + v2nAction.drivingState.number, + v2nAction.drivingAction.number + ) + } + // update view + actions?.let { + if(it.isNotEmpty() && it != currentAction){ + currentAction = it + val title = getActionTitle(it) + if(title.isNotEmpty()){ + val desc = getActionDesc(title) + val action = AIMessage.PNCAction(it+System.currentTimeMillis(),title,desc,System.currentTimeMillis()) + AIMessageManager.post(action) + } + } + } + + } + } + } catch (e: Exception) { + e.printStackTrace() + } + } + + private fun getActionTitle(pncAction: String): String{ + return when(pncAction){ + "正在进站"->{ + "车辆进站" + } + "等待进站"->{ + "车辆等待进站" + } + "正在出站"->{ + "车辆出站" + } + "等待出站"->{ + "车辆等待出站" + } + "正在向左变道"->{ + "车辆向左变道" + } + "正在向右变道"->{ + "车辆向右变道" + } + "正在完成变道"->{ + "车辆完成变道" + } + "正在绕过障碍物"->{ + "车辆正在绕过前方障碍物" + } + "正在向左绕行避让前方静止障碍物"->{ + "车辆正在绕过前方障碍物" + } + "正在向右绕行避让前方静止障碍物"->{ + "车辆正在绕过前方障碍物" + } + "正在避让障碍物"->{ + "车辆正在避让前方障碍物" + } + "正在向左变道避让前方静止障碍物"->{ + "车辆正在避让前方障碍物" + } + "正在向右变道避让前方静止障碍物"->{ + "车辆正在避让前方障碍物" + } + "正在等红灯"->{ + "路口等红灯" + } + "正在向左变道避让前方道路施工"->{ + "车辆正在变道避让前方道路施工" + } + "正在向右变道避让前方道路施工"->{ + "车辆正在变道避让前方道路施工" + } + "正在向左绕行避让前方道路施工"->{ + "车辆正在绕行避让前方道路施工" + } + "正在向右绕行避让前方道路施工"->{ + "车辆正在绕行避让前方道路施工" + } + + "正在向左变道避让前方道路事故"->{ + "车辆正在变道避让前方道路事故" + } + "正在向右变道避让前方道路事故"->{ + "车辆正在变道避让前方道路事故" + } + "正在向左绕行避让前方道路事故"->{ + "车辆正在绕行避让前方道路事故" + } + "正在向右绕行避让前方道路事故"->{ + "车辆正在绕行避让前方道路事故" + } + "正在跟随车辆行驶"->{ + "车辆正在跟车通行" + } + "正在跟车行驶"->{ + "车辆正在跟车通行" + } + "正在向左变道避让前方车龙"->{ + "车辆正在绕行前方车龙" + } + "正在向右变道避让前方车龙"->{ + "车辆正在绕行前方车龙" + } + "正在使用云端规划通过路口"->{ + "车辆正在使用云端轨迹通行" + } + "正在避让后方来车"->{ + "车辆正在避让后方来车" + } + else->{ + "" + } + } + } + + private fun getActionDesc(action: String): String{ + return when(action){ + "车辆进站"->{ + "前方即将到达${TaxiPassengerModel.currentOCHOrder?.orderEndSite?.siteName}," + + "车辆正在规划减速并进站停靠,请安心等待车辆停稳再下车哦~" + } + "车辆等待进站"->{ + "车辆待环境安全后进站,耐心等几秒,安全比赶路更重要~" + } + "车辆出站"->{ + "欢迎乘坐MOGO RoboTaxi~车辆正在规划出站,坐稳扶好哦,我们出发啦!小智持续守护您的行程。" + } + "车辆等待出站"->{ + "车辆待环境安全后出站,耐心等几秒,安全比赶路更重要~" + } + "车辆向左变道"->{ + "确认环境安全,车辆正在规划平稳向左变道,同时持续监测周边交通参与者动向,放心交给我们吧!" + } + "车辆向右变道"->{ + "确认环境安全,车辆正在规划平稳向右变道,同时持续监测周边交通参与者动向,放心交给我们吧!" + } + "车辆完成变道"->{ + "变道完成啦,继续前进!小智持续守护您的行程。" + } + "车辆正在绕过前方障碍物"->{ + "发现前方障碍物,车辆正在规划平稳变道,即将画出一条完美弧线~" + } + "车辆正在避让前方障碍物"->{ + "发现前方障碍物,车辆正在规划平稳避让,诠释优雅与丝滑~" + } + "车辆完成绕障"->{ + "绕障完成啦,继续前进!小智持续守护您的行程。" + } + "路口等红灯"->{ + "车辆正在路口等红灯,可以安心放空望望窗外~小智一直在您身边哦!" + } + "车辆正在变道避让前方道路施工"->{ + "车辆正在提前规划变道避让前方道路施工,稳稳的很安心~您已体验到车路云一体化协同应用场景,是当之无愧的先锋体验官!" + } + "车辆正在绕行避让前方道路施工"->{ + "车辆正在提前规划绕行避让前方道路施工,稳稳的很安心~您已体验到车路云一体化协同应用场景,是当之无愧的先锋体验官!" + } + "车辆正在变道避让前方道路事故"->{ + "车辆正在提前规划变道避让前方道路事故,放心看我表现吧!您已体验到车路云一体化协同应用场景,小智为您欢呼!" + } + "车辆正在绕行避让前方道路事故"->{ + "车辆正在提前规划绕行避让前方道路事故,放心看我表现吧!您已体验到车路云一体化协同应用场景,小智为您欢呼!" + } + "车辆正在跟车通行"->{ + "车辆正在跟随前车通行,舒适度MAX~您已体验到车路云一体化协同应用场景,超越全国99%的乘客!" + } + "车辆正在绕行前方车龙"->{ + "车辆正在提前规划变道避让路口车龙,舒适度MAX~。您已体验到车路云一体化协同应用场景,超越全国99%的乘客!" + } + "车辆正在使用云端轨迹通行"->{ + "前方智慧路口内有障碍物,车辆正在使用云端规划轨迹通行。您已体验到车路云一体化协同应用场景,超越全国99%的乘客!" + } + "车辆正在避让后方来车"->{ + "车辆正在避让后方来车,耐心等几秒,安全比赶路更重要~" + } + else->{ + "" + } + } + } + +} \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/RoadCrossRoamViewModel.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/RoadCrossRoamViewModel.kt new file mode 100644 index 0000000000..c7f836ed4d --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/RoadCrossRoamViewModel.kt @@ -0,0 +1,73 @@ +package com.mogo.och.unmanned.passenger.ui.aiview + +import android.content.Context +import android.view.View +import androidx.lifecycle.ViewModel +import com.mogo.commons.voice.AIAssist +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.function.api.map.road.IMoGoMapRoadListener +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerServicesEventManager +import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager +import com.mogo.eagle.core.function.call.map.CallerMapIdentifyManager +import com.mogo.eagle.core.function.call.map.CallerMapRoadListenerManager +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.mogo.och.unmanned.passenger.ui.aiview.bean.AIMessage + +class RoadCrossRoamViewModel: ViewModel(), IMoGoMapRoadListener { + + companion object{ + const val TAG = "RoadCrossRoamViewModel" + } + + private lateinit var mContext: Context + + fun init(context: Context){ + CallerMapRoadListenerManager.addListener(TAG, this) + mContext = context + } + + override fun onCrossDevice(trigger: Boolean) { + super.onCrossDevice(trigger) + if(trigger){ + show() + } + } + + private fun show(){ + // 没有路线不做提示 + if (CallerAutoPilotStatusListenerManager.getLineId() == 0L) { + CallerLogger.d(TAG, "没有路线不做提示") + return + } + // 处于漫游模式下不做处理 + if (CallerMapIdentifyManager.roam.second) { + if (CallerMapIdentifyManager.roam.first != TAG) { + ToastUtils.showLong("正在漫游中,不展示路口漫游") + } + CallerLogger.d(TAG, "正在漫游中,不展示路口漫游") + return + } + // 首页被遮挡不做提示 + if (!CallerHmiViewControlListenerManager.getMainPageVisible()) { + CallerLogger.d(TAG, "attachView return , mainPageVisible is false") + return + } + // 没有路侧设备,不做处理 + CallerLogger.d(TAG, "命中,attachView") + val cross = CallerMapRoadListenerManager.getCrossEndInfo() + if (cross.isNullOrEmpty()) { + CallerLogger.d(TAG, "未触发,路口ID:$cross") + return + } + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)){ + val disStr = "为您提供路口全息影像,助力出行" + AIAssist.getInstance(mContext).speakTTSVoiceWithLevel(disStr, AIAssist.NEW_LEVEL_2) + } + CallerServicesEventManager.updateServicesNum(CallerServicesEventManager.ServiceType.ROAD) + AIMessageManager.post(AIMessage.RoadCrossRoam(System.currentTimeMillis().toString(),"")) + } + +} \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/RoadV2NEventViewModel.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/RoadV2NEventViewModel.kt new file mode 100644 index 0000000000..b850341ea7 --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/RoadV2NEventViewModel.kt @@ -0,0 +1,73 @@ +package com.mogo.och.unmanned.passenger.ui.aiview + +import androidx.lifecycle.ProcessLifecycleOwner +import androidx.lifecycle.ViewModel +import androidx.lifecycle.lifecycleScope +import com.mogo.commons.utils.MogoAnalyticUtils +import com.mogo.eagle.core.data.v2x.RoadV2NEventWindowBean +import com.mogo.eagle.core.function.api.hmi.v2n.IRoadV2NEventWindowListener +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager +import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager +import com.mogo.eagle.core.function.call.hmi.CallerRoadV2NEventWindowListenerManager +import com.mogo.eagle.core.function.hmi.ui.utils.HmiActionLog +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.och.unmanned.passenger.ui.aiview.bean.AIMessage +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch + +class RoadV2NEventViewModel: ViewModel(), IRoadV2NEventWindowListener { + + companion object{ + const val TAG = "RoadV2NEventViewModel" + const val ANALYTICS_KEY = "hmi_road_event_window_view" + + fun trackEvent(msg: String) { + ProcessLifecycleOwner.get().lifecycleScope.launch(Dispatchers.IO) { + val map: MutableMap = HashMap() + map["msg"] = msg + MogoAnalyticUtils.track( + ANALYTICS_KEY, + map + ) + HmiActionLog.hmiAction(TAG, msg) + } + CallerLogger.i(TAG, msg) + } + } + + fun init(){ + CallerRoadV2NEventWindowListenerManager.addListener(TAG, this) + } + + override fun show(dataBean: RoadV2NEventWindowBean) { + trackEvent("show --> $dataBean") + val canShowV2NEventWindowView = CallerHmiViewControlListenerManager.getMainPageVisible() + if (!canShowV2NEventWindowView) { + trackEvent("show --> 当前不在高精地图页面,跳过") + return + } + val lineId = CallerAutoPilotStatusListenerManager.getLineId() + if (lineId <= 0) { + trackEvent("show --> 当前无订单,跳过") + return + } + val event = AIMessage.RoadV2NEvent( + dataBean.eventId, + dataBean.hintStr, + "", + dataBean.eventType, + dataBean.timestamp, + dataBean.iconResId, + false, + dataBean.contentImageUrl, + dataBean.cameraIp, + dataBean.lon, + dataBean.lat + ) + AIMessageManager.post(event) + } + + override fun dismiss(eventId: String) { + + } +} \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/adapter/AIMessageAdapter.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/adapter/AIMessageAdapter.kt new file mode 100644 index 0000000000..665e2f7b04 --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/adapter/AIMessageAdapter.kt @@ -0,0 +1,55 @@ +package com.mogo.och.unmanned.passenger.ui.aiview.adapter + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.ListAdapter +import com.mogo.och.unmanned.passenger.ui.aiview.bean.AIMessage +import com.mogo.och.unmanned.taxi.passenger.R + +class AIMessageAdapter : ListAdapter(MessageDiffCallback()) { + + var onItemClickListener: OnItemClickListener? = null + + override fun onBindViewHolder(holder: MessageViewHolder, position: Int) { + getItem(position)?.let { + holder.bind(it, onItemClickListener) + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MessageViewHolder { + val inflater = LayoutInflater.from(parent.context) + return when (viewType) { + AIMessage.TYPE_QA -> QAViewHolder(inflater.inflate(R.layout.item_ai_msg_qa, parent, false)) + AIMessage.TYPE_PNC_ACTION -> PNCActionViewHolder(inflater.inflate(R.layout.item_ai_pnc_action,parent,false)) + AIMessage.TYPE_ROAD_V2N -> RoadV2NEventViewHolder(inflater.inflate(R.layout.item_ai_road_v2n_event,parent,false)) + AIMessage.TYPE_ROAD_CROSS -> RoadCrossRoamViewHolder(inflater.inflate(R.layout.item_ai_road_cross_roam,parent,false)) + AIMessage.TYPE_AUTOMATIC_EXPLORATION -> AutomaticExplorationViewHolder(inflater.inflate(R.layout.item_ai_automatic_exploration,parent,false)) + AIMessage.TYPE_EVALUATE -> EvaluateViewViewHolder(inflater.inflate(R.layout.taxi_p_evaluate,parent,false)) + AIMessage.TYPE_NDE -> NDEViewHolder(inflater.inflate(R.layout.item_ai_nde_event,parent,false)) + else -> throw IllegalArgumentException("Invalid view type") + } + } + + override fun getItemViewType(position: Int): Int { + return when (getItem(position)) { + is AIMessage.Event -> AIMessage.TYPE_EVENT + is AIMessage.QA -> AIMessage.TYPE_QA + is AIMessage.Scan -> AIMessage.TYPE_SCAN + is AIMessage.Light -> AIMessage.TYPE_LIGHT + is AIMessage.Speed -> AIMessage.TYPE_SPEED + is AIMessage.Warning -> AIMessage.TYPE_WARNING + is AIMessage.PNCAction -> AIMessage.TYPE_PNC_ACTION + is AIMessage.RoadV2NEvent -> AIMessage.TYPE_ROAD_V2N + is AIMessage.RoadCrossRoam -> AIMessage.TYPE_ROAD_CROSS + is AIMessage.AutomaticExploration -> AIMessage.TYPE_AUTOMATIC_EXPLORATION + is AIMessage.EvaluateData -> AIMessage.TYPE_EVALUATE + is AIMessage.NDEData -> AIMessage.TYPE_NDE + else -> AIMessage.TYPE_EVENT + } + } + + override fun onViewRecycled(holder: MessageViewHolder) { + super.onViewRecycled(holder) + holder.viewRecycled(holder) + } +} diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/adapter/AIMessageViewHolder.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/adapter/AIMessageViewHolder.kt new file mode 100644 index 0000000000..ee03645972 --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/adapter/AIMessageViewHolder.kt @@ -0,0 +1,450 @@ +package com.mogo.och.unmanned.passenger.ui.aiview.adapter + +import android.animation.Animator +import android.animation.AnimatorListenerAdapter +import android.animation.ObjectAnimator +import android.animation.ValueAnimator +import android.content.Context +import android.graphics.Rect +import android.text.TextUtils +import android.util.Log +import android.view.View +import android.view.animation.LinearInterpolator +import android.widget.FrameLayout +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.core.content.ContextCompat +import androidx.core.graphics.toColorInt +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.mogo.commons.voice.AIAssist +import com.mogo.eagle.core.data.notice.AutoExplorationEntity +import com.mogo.eagle.core.data.v2x.RoadV2NEventType +import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager +import com.mogo.eagle.core.function.hmi.ui.notice.exploration.AutomaticExplorationAdapter +import com.mogo.eagle.core.function.hmi.ui.v2n.RoadV2NEventLivePlayView +import com.mogo.eagle.core.function.view.MapRoamView +import com.mogo.eagle.core.function.view.RoadCrossRoamListAdapter +import com.mogo.eagle.core.utilcode.kotlin.onClick +import com.mogo.eagle.core.utilcode.mogo.glide.GlideImageLoader +import com.mogo.eagle.core.utilcode.mogo.imageloader.MogoImageView +import com.mogo.eagle.core.utilcode.util.DateTimeUtils +import com.mogo.och.common.module.utils.FrameAnimatorContainer +import com.mogo.och.common.module.voice.VoiceNotice +import com.mogo.och.unmanned.passenger.ui.aiview.bean.AIMessage +import com.mogo.och.unmanned.taxi.passenger.R +import com.youth.banner.Banner +import com.youth.banner.indicator.CircleIndicator +import com.youth.banner.transformer.ScaleInTransformer +import kotlinx.android.synthetic.main.taxi_p_evaluate.view.iv_evaluate_great +import kotlinx.android.synthetic.main.taxi_p_evaluate.view.iv_evaluate_low +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Locale + + +abstract class MessageViewHolder(view: View) : RecyclerView.ViewHolder(view) { + abstract fun bind(item: AIMessage, onItemClickListener: OnItemClickListener? = null) + open fun viewRecycled(holder: MessageViewHolder){} + private val sampleDateFormat = SimpleDateFormat("HH:mm", Locale.CHINA) + protected val TAG = javaClass.simpleName + + fun handleTimestamp(item: AIMessage, tvTimestamp: TextView) { + if (item.showTimestamp) { + tvTimestamp.visibility = View.VISIBLE + tvTimestamp.text = sampleDateFormat.format(Date(item.timestamp)) + } else { + tvTimestamp.visibility = View.GONE + } + } + + fun View.setVisibilityBasedOn(condition: Boolean) { + visibility = if (condition) View.VISIBLE else View.GONE + } + + fun TextView.setTextAndVisibility(text: String) { + if (text.isEmpty()) { + visibility = View.GONE + this.text = "" + } else { + visibility = View.VISIBLE + this.text = text + } + } + + fun ImageView.showOrHideWithUrl(url: String) { + if (url.isEmpty()) { + visibility = View.GONE + + } else { + visibility = View.VISIBLE + Glide.with(this) + .load(url) + .placeholder(R.drawable.icon_pic_holder) + .error(R.drawable.icon_pic_error) +// .error(R.drawable.icon_marker_window_place_holder) +// .placeholder(R.drawable.icon_marker_window_place_holder) + .into(this) + + } + } +} + + +class QAViewHolder(val binding: View) : MessageViewHolder(binding) { + private var tvQuestion: TextView = binding.findViewById(R.id.tvQuestion) + private var tvAnswer: TextView = binding.findViewById(R.id.tvAnswer) + private var tvTimestamp: TextView = binding.findViewById(R.id.tvTimestamp) + private var tvStateContent: TextView = binding.findViewById(R.id.tvStateContent) +// private var ivPicture: OchRoundImageView = binding.findViewById(R.id.ivPicture) + private var llState: LinearLayout = binding.findViewById(R.id.llState) + private var tvStateUnderstand: TextView = binding.findViewById(R.id.tvStateUnderstand) + private var tvStateAnalyze: TextView = binding.findViewById(R.id.tvStateAnalyze) + private var tvStateAnswer: TextView = binding.findViewById(R.id.tvStateAnswer) + private var picBanner = binding.findViewById>(R.id.picBanner) + + + override fun bind(item: AIMessage, onItemClickListener: OnItemClickListener?) { + if (item is AIMessage.QA) { + binding.apply { + handleState(item.state) + tvQuestion.text = item.question + Log.d(TAG, "bind: ${item}") + + tvAnswer.setTextAndVisibility(item.answer) +// ivPicture.showOrHideWithUrl(item.pictureUrl) + + handleTimestamp(item, tvTimestamp) + + val pictureUrlList = item.pictureUrlList + if (pictureUrlList.isEmpty()) { + picBanner.visibility = View.GONE + } else { + picBanner.visibility = View.VISIBLE + picBanner.setAdapter(BannerImageAdapter(pictureUrlList)) +// .addBannerLifecycleObserver(picBanner.context) //添加生命周期观察者 + .setIndicator(CircleIndicator(picBanner.context)) + .setIndicatorSelectedColor("#40B4FF".toColorInt()) + .setIndicatorNormalColor("#FFFFFF".toColorInt()) + .setPageTransformer(ScaleInTransformer()) + } + } + } + } + + private fun handleState(state: AIMessage.QA.QuestionState) { + when (state) { + AIMessage.QA.QuestionState.UNDERSTAND -> { + llState.visibility = View.VISIBLE + tvStateContent.text = "正在理解问题…" + tvStateUnderstand.visibility = View.GONE + tvStateAnalyze.visibility = View.GONE + tvStateAnswer.visibility = View.GONE + } + + AIMessage.QA.QuestionState.ANALYZE -> { + tvStateUnderstand.visibility = View.VISIBLE + llState.visibility = View.VISIBLE + tvStateContent.text = "正在分析处理…" + tvStateAnalyze.visibility = View.GONE + tvStateAnswer.visibility = View.GONE + } + + AIMessage.QA.QuestionState.ANSWER -> { + tvStateUnderstand.visibility = View.VISIBLE + tvStateAnalyze.visibility = View.VISIBLE + llState.visibility = View.VISIBLE + tvStateContent.text = "正在总结回答…" + tvStateAnswer.visibility = View.GONE + } + + + AIMessage.QA.QuestionState.FINISH -> { + tvStateUnderstand.visibility = View.VISIBLE + tvStateAnalyze.visibility = View.VISIBLE + tvStateAnswer.visibility = View.VISIBLE + + llState.visibility = View.GONE + tvStateContent.text = "" + } + + AIMessage.QA.QuestionState.ERROR -> { + tvStateUnderstand.visibility = View.VISIBLE + tvStateAnalyze.visibility = View.VISIBLE + tvStateAnswer.visibility = View.VISIBLE + + llState.visibility = View.GONE + tvStateContent.text = "" + } + } + } +} + +class PNCActionViewHolder(binding: View) : MessageViewHolder(binding){ + + private var tvPncAction: TextView = binding.findViewById(R.id.tvPncAction) + private var tvPncActionDesc: TextView = binding.findViewById(R.id.tvPncActionDesc) + private var tvPncActionTime: TextView = binding.findViewById(R.id.tvPncActionTime) + + override fun bind(item: AIMessage, onItemClickListener: OnItemClickListener?) { + if(item is AIMessage.PNCAction){ + tvPncAction.text = item.title + tvPncActionDesc.text = item.actionDesc + tvPncActionTime.text = DateTimeUtils.getTimeText(item.timeStamp, DateTimeUtils.HH_mm_ss) + } + } + +} + +class RoadV2NEventViewHolder(binding: View) : MessageViewHolder(binding){ + + private var ivV2XImage: ImageView = binding.findViewById(R.id.ivV2XImage) + private var tvV2XHintContent: TextView = binding.findViewById(R.id.tvV2XHintContent) + private var containerImageAndLiveVideo: FrameLayout = binding.findViewById(R.id.containerImageAndLiveVideo) + private var livePlayView: RoadV2NEventLivePlayView = binding.findViewById(R.id.livePlayView) + private var contentImageView: MogoImageView = binding.findViewById(R.id.contentImageView) + private var tvV2XTimeStr: TextView = binding.findViewById(R.id.tvV2XTimeStr) + + override fun bind(item: AIMessage, onItemClickListener: OnItemClickListener?) { + if(item is AIMessage.RoadV2NEvent){ + ivV2XImage.setImageDrawable(ContextCompat.getDrawable(itemView.context, item.iconResId)) + tvV2XHintContent.text = item.title + tvV2XTimeStr.text = + "更新时间:${DateTimeUtils.getTimeText(item.timeStamp, DateTimeUtils.HH_mm_ss)}" + when (item.eventType) { + RoadV2NEventType.TEXT -> { + containerImageAndLiveVideo.visibility = View.GONE + contentImageView.visibility = View.GONE + livePlayView.visibility = View.GONE + } + + RoadV2NEventType.IMAGE -> { + containerImageAndLiveVideo.visibility = View.VISIBLE + contentImageView.visibility = View.VISIBLE + livePlayView.visibility = View.GONE + GlideImageLoader.getInstance() + .displayImage(item.contentImageUrl, contentImageView) + } + + RoadV2NEventType.LIVE_VIDEO -> { + containerImageAndLiveVideo.visibility = View.VISIBLE + contentImageView.visibility = View.GONE + livePlayView.visibility = View.VISIBLE + val cityCode = + CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84().cityCode + livePlayView.startRoadCameraLive( + item.id, + item.cameraIp, item.lon, item.lat, cityCode + ) + } + } + } + + + } + +} + +class RoadCrossRoamViewHolder(binding: View) : MessageViewHolder(binding){ + + private var ivZhiRoadRoamView: ImageView = binding.findViewById(R.id.ivZhiRoadRoamView) + private var tvRoadRoamTitle: TextView = binding.findViewById(R.id.tvRoadRoamTitle) + private var mapRoamView: MapRoamView = binding.findViewById(R.id.mapRoamView) + private var ivCoverRoam: ImageView = binding.findViewById(R.id.ivCoverRoam) + private var lvRoadCrossRoamTip: RecyclerView = binding.findViewById(R.id.lvRoadCrossRoamTip) + + override fun bind(item: AIMessage, onItemClickListener: OnItemClickListener?) { + if(item is AIMessage.RoadCrossRoam){ + lvRoadCrossRoamTip.layoutManager = NoScrollLayoutManager(itemView.context) + lvRoadCrossRoamTip.addItemDecoration(object : RecyclerView.ItemDecoration() { + override fun getItemOffsets( + outRect: Rect, + view: View, + parent: RecyclerView, + state: RecyclerView.State + ) { + super.getItemOffsets(outRect, view, parent, state) + outRect.bottom = 24 + } + }) + mapRoamView.openRoam() + lvRoadCrossRoamTip.adapter = RoadCrossRoamListAdapter(itemView.context, true) + // 创建横向移动的动画 + val animator = + ObjectAnimator.ofFloat( + ivCoverRoam, + "translationX", + -120f, + 540f + ) + animator.duration = 1500 // 设置动画持续时间,单位为毫秒 + animator.repeatCount = 6 + animator.repeatMode = ValueAnimator.RESTART // 设置动画来回移动 + animator.start() + val rotationAnim = ObjectAnimator.ofFloat(ivZhiRoadRoamView, "rotation", 0f, 360f) + rotationAnim.repeatCount = 9 + rotationAnim.repeatMode = ValueAnimator.RESTART + rotationAnim.duration = 1000 + rotationAnim.interpolator = LinearInterpolator() + rotationAnim.start() + tvRoadRoamTitle.setTextColor(itemView.context.getColor(R.color.color_131415)) + + } + } + +} + +class AutomaticExplorationViewHolder(binding: View) : MessageViewHolder(binding){ + + private var ivScan: ImageView = binding.findViewById(R.id.ivScan) + private var rvExplorationList: RecyclerView = binding.findViewById(R.id.rvExplorationList) + private lateinit var automaticExplorationAdapter: AutomaticExplorationAdapter + private var rotationAnim: ObjectAnimator ?= null + + override fun bind(item: AIMessage, onItemClickListener: OnItemClickListener?) { + val linearLayoutManager = LinearLayoutManager(itemView.context) + linearLayoutManager.orientation = LinearLayoutManager.VERTICAL + automaticExplorationAdapter = AutomaticExplorationAdapter(itemView.context,1) + rvExplorationList.adapter = automaticExplorationAdapter + rvExplorationList.layoutManager = linearLayoutManager + initData() + } + + private fun initData() { + val dataList = ArrayList(7) + dataList.add(AutoExplorationEntity("当前道路事件分析",2000L,false)) + dataList.add(AutoExplorationEntity("前方车辆",2000L,false)) + dataList.add(AutoExplorationEntity("两侧车辆",2600L,false)) + dataList.add(AutoExplorationEntity("后方车辆",3000L,false)) + dataList.add(AutoExplorationEntity("前方路口车辆流速分析",4000L,false)) + dataList.add(AutoExplorationEntity("前方路口行人/非机动车分析",4300L,false)) + dataList.add(AutoExplorationEntity("路侧视频分析",5000L,false)) + automaticExplorationAdapter.setListener(object: AutomaticExplorationAdapter.CompleteListener{ + override fun onComplete(entity: AutoExplorationEntity) { + var allComplete = true //所有探查项目都探查完毕 + dataList.forEach { + if(it.explorationContent == entity.explorationContent){ + it.explorationComplete = true + } + if(!it.explorationComplete){ + allComplete = false + } + } + if(allComplete){ + //停止左上角扫描动画 + rotationAnim?.cancel() + } + } + + }) + automaticExplorationAdapter.setData(dataList) + //启动扫描 + ivScan.let { + rotationAnim = ObjectAnimator.ofFloat(it, "rotation", 0f, 360f) + rotationAnim?.repeatCount = ValueAnimator.INFINITE + rotationAnim?.repeatMode = ValueAnimator.RESTART + rotationAnim?.duration = 2000 + rotationAnim?.interpolator = LinearInterpolator() + rotationAnim?.start() + } + } + +} + + +class EvaluateViewViewHolder(binding: View) : MessageViewHolder(binding) { + private var ivEvaluateGreat: ImageView = binding.findViewById(R.id.iv_evaluate_great) + private var ivEvaluateLow: ImageView = binding.findViewById(R.id.iv_evaluate_low) + private var ivEvaluateGreatAni: FrameAnimatorContainer?=null + + init { + } + + override fun bind(item: AIMessage, onItemClickListener: OnItemClickListener?) { + if(item is AIMessage.EvaluateData){ + if(item.isFirst){ + VoiceNotice.showNotice("行程即将结束咯~小智很想知道您的体验如何呢", AIAssist.LEVEL2) + ivEvaluateGreat.setImageResource(R.drawable.arrive_dest_great_000) + ivEvaluateLow.scaleY = 1f + } + } + ivEvaluateGreat.onClick { + if(item is AIMessage.EvaluateData) { + if (item.isFirst) { + if (ivEvaluateGreatAni == null) { + ivEvaluateGreatAni = FrameAnimatorContainer( + R.array.taxi_p_arrive_dest_great, + 31, + ivEvaluateGreat, + isOnce = true + ) + ivEvaluateGreatAni?.start() + + } else { + ivEvaluateGreatAni?.reStart() + } + ivEvaluateGreatAni?.setOnAnimStopListener(object : + FrameAnimatorContainer.OnAnimationStoppedListener { + override fun AnimationStopped() { + + } + }) + VoiceNotice.showNotice("感谢您的认可,我们会再接再厉", AIAssist.LEVEL2) + item.isFirst = false + } + } + } + ivEvaluateLow.onClick { + if(item is AIMessage.EvaluateData) { + if (item.isFirst) { + ivEvaluateLow.pivotX = (ivEvaluateLow.width / 2).toFloat() + ivEvaluateLow.pivotY = ivEvaluateLow.height.toFloat() + ivEvaluateLow.animate().scaleY(1.2f).scaleX(1.2f).setListener(object : + AnimatorListenerAdapter() { + override fun onAnimationStart(animation: Animator) { + VoiceNotice.showNotice("感谢您的反馈,我们会继续努力!", AIAssist.LEVEL2) + } + }).duration = 1000 + item.isFirst = false + } + } + } + } +} + +class NDEViewHolder(binding: View) : MessageViewHolder(binding){ + + private var tvNdeTitle: TextView = binding.findViewById(R.id.tvNdeTitle) + private var tvNdeContent: TextView = binding.findViewById(R.id.tvNdeContent) + private var rvNdeList: RecyclerView = binding.findViewById(R.id.rvNdeList) + + override fun bind(item: AIMessage, onItemClickListener: OnItemClickListener?) { + if(item is AIMessage.NDEData){ + tvNdeTitle.text = item.title + tvNdeContent.text = item.desc + val linearLayoutManager = LinearLayoutManager(itemView.context) + linearLayoutManager.orientation = LinearLayoutManager.HORIZONTAL + val ndeRoadAdapter = AINDERoadAdapter(itemView.context) + rvNdeList.adapter = ndeRoadAdapter + rvNdeList.layoutManager = linearLayoutManager + ndeRoadAdapter.setData(item.roadList) + } + } + +} + +private class NoScrollLayoutManager(context: Context?) : LinearLayoutManager(context) { + override fun canScrollVertically(): Boolean { + return false + } + + override fun canScrollHorizontally(): Boolean { + return false + } +} + +fun interface OnItemClickListener { + fun onItemClick(item: AIMessage, position: Int) +} diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/adapter/AINDERoadAdapter.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/adapter/AINDERoadAdapter.kt new file mode 100644 index 0000000000..0d2ec97ca1 --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/adapter/AINDERoadAdapter.kt @@ -0,0 +1,237 @@ +package com.mogo.och.unmanned.passenger.ui.aiview.adapter + +import android.content.Context +import android.util.TypedValue +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.RecyclerView +import com.mogo.och.unmanned.passenger.ui.aiview.bean.AIMessage +import com.mogo.och.unmanned.taxi.passenger.R + +class AINDERoadAdapter(private val context: Context): RecyclerView.Adapter() { + + private var roadList: List?= null + + fun setData(list: List){ + roadList = list + notifyDataSetChanged() + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AIRoadHolder { + val view = LayoutInflater.from(parent.context) + .inflate(R.layout.item_ai_nde_road, parent, false) + return AIRoadHolder(view) + } + + override fun onBindViewHolder(holder: AIRoadHolder, position: Int) { + roadList?.let{ + val roadMsg = it[position] + if(it.size < 3){ + //设置item宽度为最大宽度180dp + val params = ConstraintLayout.LayoutParams( + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 180f, + context.resources.displayMetrics).toInt(), + ConstraintLayout.LayoutParams.WRAP_CONTENT) + holder.clRoadLayout.layoutParams = params + }else if(it.size == 3){ + //设置item宽度为最大宽度180dp + val params = ConstraintLayout.LayoutParams( + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 120f, + context.resources.displayMetrics).toInt(), + ConstraintLayout.LayoutParams.WRAP_CONTENT) + holder.clRoadLayout.layoutParams = params + }else if(it.size == 4){ + //设置item宽度为最大宽度180dp + val params = ConstraintLayout.LayoutParams( + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 100f, + context.resources.displayMetrics).toInt(), + ConstraintLayout.LayoutParams.WRAP_CONTENT) + holder.clRoadLayout.layoutParams = params + }else{ + val params = ConstraintLayout.LayoutParams( + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 90f, + context.resources.displayMetrics).toInt(), + ConstraintLayout.LayoutParams.WRAP_CONTENT) + holder.clRoadLayout.layoutParams = params + } + when(roadMsg.arrowType){ + //直行 + 201->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_forward + )) + } + //直行或左转 + 202->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_forward_or_turn_left + )) + } + //直行或右转 + 203->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_forward_or_turn_right + )) + } + //直行或掉头 + 204->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_forward_or_reverse + )) + } + //左转 + 205->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_turn_left + )) + } + //左转或掉头 + 206->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_turn_left_or_reverse + )) + } + //左弯或向左合流 + 207->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_turn_or_merge_left + )) + } + //右转 + 208->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_turn_right + )) + } + //右转或向右合流 + 209->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_turn_or_merge_right + )) + } + //左右转弯 + 210->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_turn_left_or_right + )) + } + //掉头 + 211->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_reverse + )) + } + //禁止左转 + 212->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_prohibit_turn_left + )) + } + //禁止右转 + 213->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_prohibit_turn_right + )) + } + //禁止掉头 + 214->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_prohibit_reverse + )) + } + //直行或左转或右转 + 215->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_forward_turn_left_right + )) + } + //直行或掉头或左转 + 216->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_forward_turn_left_reverse + )) + } + //右转或掉头 + 217->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_turn_right_or_reverse + )) + } + //禁止右转或向右合流 + 218->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_prohibit_turn_or_merge_right + )) + } + } + //是否是推荐车道 + if(roadMsg.isRecommend){ + holder.tvRoadStatus.text = context.getString(R.string.nde_road_recommend) + holder.tvRoadStatus.setTextColor(context.getColor(R.color.msg_nde_road_recommend)) + holder.clRoadLayout.background = ContextCompat.getDrawable( + context, + R.drawable.bg_nde_road_recommend + ) + } + //是否有车龙,代表拥堵、行驶缓慢 + if(roadMsg.isCheLong){ + holder.tvRoadStatus.text = context.getString(R.string.nde_road_slow) + holder.tvRoadStatus.setTextColor(context.getColor(R.color.msg_nde_road_slow)) + } + if(position == it.lastIndex){ + holder.viewDivider.visibility = View.INVISIBLE + } + } + } + + override fun getItemCount() = roadList?.size ?: 0 + + class AIRoadHolder(itemView: View) : RecyclerView.ViewHolder(itemView){ + var clRoadLayout: ConstraintLayout = itemView.findViewById(R.id.clRoadLayout) + var ivRoadType: ImageView = itemView.findViewById(R.id.ivRoadType) + var tvRoadStatus: TextView = itemView.findViewById(R.id.tvRoadStatus) + var viewDivider: View = itemView.findViewById(R.id.viewDivider) + } + +} \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/adapter/BannerImageAdapter.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/adapter/BannerImageAdapter.kt new file mode 100644 index 0000000000..58b00d0ffe --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/adapter/BannerImageAdapter.kt @@ -0,0 +1,31 @@ +package com.mogo.och.unmanned.passenger.ui.aiview.adapter + +import android.view.LayoutInflater +import android.view.ViewGroup +import android.widget.ImageView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.mogo.och.unmanned.taxi.passenger.R +import com.youth.banner.adapter.BannerAdapter + +open class BannerImageAdapter(imgList: List) : + BannerAdapter(imgList) { + override fun onBindView(holder: BannerHolder?, data: String?, position: Int, size: Int) { + //图片加载自己实现 + holder ?: return + val imageView = holder.view + Glide.with(imageView) + .load(data) +// .apply(RequestOptions.bitmapTransform(RoundedCorners(30))) + .into(imageView) + } + + override fun onCreateHolder(parent: ViewGroup, viewType: Int): BannerHolder { + val inflater = LayoutInflater.from(parent.context) + val view = inflater.inflate(R.layout.item_ai_banner_item, parent, false) as ImageView + return BannerHolder(view) + } +} + + +class BannerHolder(val view: ImageView) : RecyclerView.ViewHolder(view) \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/adapter/MessageDiffCallback.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/adapter/MessageDiffCallback.kt new file mode 100644 index 0000000000..c5936542d9 --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/adapter/MessageDiffCallback.kt @@ -0,0 +1,15 @@ +package com.mogo.och.unmanned.passenger.ui.aiview.adapter + +import androidx.recyclerview.widget.DiffUtil +import com.mogo.och.unmanned.passenger.ui.aiview.bean.AIMessage + +class MessageDiffCallback: DiffUtil.ItemCallback() { + + override fun areContentsTheSame(oldItem: AIMessage, newItem: AIMessage): Boolean { + return oldItem == newItem + } + + override fun areItemsTheSame(oldItem: AIMessage, newItem: AIMessage): Boolean { + return oldItem.id == newItem.id + } +} \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/adapter/PaddingItemDecoration.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/adapter/PaddingItemDecoration.kt new file mode 100644 index 0000000000..132afe2439 --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/adapter/PaddingItemDecoration.kt @@ -0,0 +1,26 @@ +package com.mogo.och.unmanned.passenger.ui.aiview.adapter + +import android.graphics.Rect +import android.view.View +import androidx.recyclerview.widget.RecyclerView + +class PaddingItemDecoration(private val topPadding: Int, private val bottomPadding: Int) : RecyclerView.ItemDecoration() { + override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) { + super.getItemOffsets(outRect, view, parent, state) + + + // 只有第一个 item 的顶部添加空白 + if (parent.getChildAdapterPosition(view) == 0) { + outRect.top = topPadding + } else{ + outRect.top = 0 + } + + // 最后一个 item 的底部添加空白 +// if (parent.getChildAdapterPosition(view) == state.itemCount - 1) { +// outRect.bottom = bottomPadding +// } else{ +// outRect.bottom = 0 +// } + } +} \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/bean/AssistantMessage.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/bean/AssistantMessage.kt new file mode 100644 index 0000000000..2b7ca9a3e4 --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/bean/AssistantMessage.kt @@ -0,0 +1,187 @@ +package com.mogo.och.unmanned.passenger.ui.aiview.bean + +import android.os.CountDownTimer +import android.util.Log +import com.mogo.eagle.core.data.v2x.RoadV2NEventType +import kotlin.math.floor + + +sealed class AIMessage( + open val id: String, + open val title: String, + open val tts: String = "", + val timestamp: Long = System.currentTimeMillis(), + var showTimestamp: Boolean = false +) { + + companion object { + const val TYPE_SCAN = 0 + const val TYPE_EVENT = 1 + const val TYPE_QA = 2 + const val TYPE_LIGHT = 3 + const val TYPE_SPEED = 4 + const val TYPE_WARNING = 5 + const val TYPE_PNC_ACTION = 6 + const val TYPE_ROAD_V2N = 7 + const val TYPE_ROAD_CROSS = 8 + const val TYPE_AUTOMATIC_EXPLORATION = 9 + const val TYPE_EVALUATE = 10 + const val TYPE_NDE = 11 + } + + data class Scan( + override val id: String, + override val title: String, + val pictureUrl: String = "", + var showScanFlag: Boolean = false + ) : AIMessage(id, title) + + data class Event( + override val id: String, + override val title: String, + override val tts: String = "", + val position: String = "", + val distance: String = "", + val range: String = "", + val time: String = "", + val pictureUrl: String = "", + val videoUrl: String = "", + var showScanFlag: Boolean = false + ) : AIMessage(id, title, tts) + + data class QA( + override val id: String, + override val title: String, + override val tts: String = "", + val question: String, + val answer: String, + var state: QuestionState = QuestionState.UNDERSTAND, + val pictureUrl: String = "", + var pictureUrlList: List = listOf(), + val videoUrl: String = "", + ) : AIMessage(id, title, tts) { + + enum class QuestionState(val code: Int) { + UNDERSTAND(1), + ANALYZE(2), + ANSWER(3), + FINISH(4), + ERROR(-1), + } + } + + data class Light( + override val id: String, + override val title: String, + override val tts: String = "", + var seconds: Int, + val status: Int + ) : AIMessage(id, title, tts) { + private var countDownTimer: CountDownTimer? = null + private var listener: OnCountdownUpdateListener? = null + + fun startCountdown(millisInFuture: Long, countDownInternal: Long) { + countDownTimer?.cancel() + countDownTimer = object : CountDownTimer(millisInFuture, countDownInternal) { + override fun onTick(millisUntilFinished: Long) { + //倒计时开始 + Log.d( + "StartOrSlowDownTip", + "millisUntilFinished = $millisUntilFinished, countDownInternal = $countDownInternal" + ) + val cd = millisUntilFinished / 1000.0 +// val split = String.format("%.2f", cd).split(".") + seconds = floor(cd).toInt() + listener?.onCountdownUpdate() + } + + override fun onFinish() { + //倒计时完成 + seconds = 0 + listener?.onCountdownFinish() + } + } + countDownTimer?.start() + } + + fun stopCountdown() { + countDownTimer?.cancel() + } + + fun setOnCountdownUpdateListener(listener: OnCountdownUpdateListener) { + this.listener = listener + } + + interface OnCountdownUpdateListener { + fun onCountdownUpdate() + fun onCountdownFinish() + } + } + + + data class Speed( + override val id: String, + override val title: String, + override val tts: String = "", + val speedMax: Int, + val speedMin: Int, + ) : AIMessage(id, title, tts) + + data class Warning( + override val id: String, + override val title: String, + override val tts: String = "", + ) : AIMessage(id, title, tts) + + data class PNCAction( + override val id: String, + override val title: String, + var actionDesc: String, + var timeStamp: Long = 0, //事件发生事件戳 + ): AIMessage(id,title) + + data class RoadV2NEvent( + override val id: String, + override val title: String, + override val tts: String = "", //TTS的文案 + var eventType: RoadV2NEventType, //事件弹框类型 + var timeStamp: Long = 0, //事件发生事件戳 + var iconResId: Int, //事件icon res id + var isNeedTTS: Boolean = false, //事件文案是否需要同步tts + var contentImageUrl: String, // Image 类型时图片 url + var cameraIp: String, // 路侧camera ip,用于请求获取拉流地址 + var lon: Double, //事件坐标-经度 + var lat: Double, //事件坐标-纬度 + ):AIMessage(id,title,tts) + + data class RoadCrossRoam( + override val id: String, + override val title: String + ): AIMessage(id,title) + + data class AutomaticExploration( + override val id: String, + override val title: String + ): AIMessage(id,title) + + data class EvaluateData( + override val id: String, + override val title: String, + var isFirst:Boolean = true + ): AIMessage(id,title) + + data class NDEData( + override val id: String, + override val title: String, + var desc: String, + var roadList: List + ):AIMessage(id,title) + + data class RoadMsg( + var arrowType: Int, // 车道类型,如直行201(详情参考文件:message_pad.proto) + var laneNum: Int,// 车道号 + var isRecommend: Boolean,// 是否是推荐车道 + var isCheLong: Boolean// 是否有车龙,代表拥堵、行驶缓慢 + ) + +} \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/bean/ListenUIState.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/bean/ListenUIState.kt new file mode 100644 index 0000000000..7fd872cf8c --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/bean/ListenUIState.kt @@ -0,0 +1,3 @@ +package com.mogo.och.unmanned.passenger.ui.aiview.bean + +data class ListenUIState(val show: Boolean, val text: String, val showTips: Boolean = false) \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/bar/RightBarView.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/bar/RightBarView.kt index 2640cd19a7..10aece16a5 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/bar/RightBarView.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/bar/RightBarView.kt @@ -21,6 +21,7 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.och.common.module.manager.audition.AuditionManager import com.mogo.och.common.module.manager.audition.MusicData import com.mogo.och.common.module.manager.audition.PlayState +import com.mogo.och.common.module.manager.loop.BizLoopManager import com.mogo.och.unmanned.passenger.ui.music.playing.MusicPlayingViewModel import com.mogo.och.unmanned.taxi.passenger.R @@ -196,7 +197,7 @@ class RightBarView : ConstraintLayout, AuditionManager.MusicDataChangeListener { } override fun updateState(oldData: MusicData?, musicData: MusicData) { - UiThreadHandler.post { + BizLoopManager.runInMainThread { if (musicData.state == PlayState.Playing) { if(!ck_music.isChecked){ Glide.with(context) diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/bottom/BottomBar.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/bottom/BottomBar.kt index 100bdd8888..562ebd47a1 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/bottom/BottomBar.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/bottom/BottomBar.kt @@ -5,6 +5,7 @@ import android.util.AttributeSet import android.view.LayoutInflater import androidx.constraintlayout.widget.ConstraintLayout import com.mogo.och.unmanned.taxi.passenger.R +import kotlinx.android.synthetic.main.taxt_p_bottom_bar.view.actv_music import kotlinx.android.synthetic.main.taxt_p_bottom_bar.view.actv_overmap import kotlinx.android.synthetic.main.taxt_p_bottom_bar.view.actv_precisionmap import kotlinx.android.synthetic.main.taxt_p_bottom_bar.view.actv_video @@ -31,6 +32,10 @@ class BottomBar @JvmOverloads constructor( actv_video.setOnClickListener { setCheckIndex(SelectView.VIDEO) } + actv_music.setOnClickListener { + setCheckIndex(SelectView.MUSIC) + } + } fun getCurrentPage(): SelectView { @@ -57,6 +62,11 @@ class BottomBar @JvmOverloads constructor( SelectView.VIDEO -> { actv_video.setBagVisable(visibility) } + SelectView.MUSIC -> { + actv_music.setBagVisable(visibility) + } + + else -> {} } } @@ -72,20 +82,28 @@ class BottomBar @JvmOverloads constructor( }else{ actv_overmap.setCheckItem(false) } + if(checkIndex == SelectView.VIDEO){ actv_video.setCheckItem(true) }else{ actv_video.setCheckItem(false) } + if(checkIndex == SelectView.PRECISIONMAP){ actv_precisionmap.setCheckItem(true) }else{ actv_precisionmap.setCheckItem(false) } + + if(checkIndex == SelectView.MUSIC){ + actv_music.setCheckItem(true) + }else{ + actv_music.setCheckItem(false) + } } enum class SelectView{ - NONE,PRECISIONMAP,OVERMAPVIEW,VIDEO + NONE,PRECISIONMAP,OVERMAPVIEW,VIDEO,MUSIC } interface ApplyClickLintener{ diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/bottom/BottomCheckView.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/bottom/BottomCheckView.kt index 9612518fd8..d197eb57f0 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/bottom/BottomCheckView.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/bottom/BottomCheckView.kt @@ -81,7 +81,7 @@ open class BottomCheckView @JvmOverloads constructor( actv_title.setTextColor(bottomTitleCheckedColor) setBagVisable(GONE) } else { - backageView?.visibility = View.GONE + backageView?.visibility = View.INVISIBLE aciv_center_image.setImageResource(normalDrawable) actv_title.setTextColor(bottomTitleNormalColor) } diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/checkstartautopilot/startautopilot/StartAutopilotViewModel.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/checkstartautopilot/startautopilot/StartAutopilotViewModel.kt index 7a133d96ef..6f3231e9ed 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/checkstartautopilot/startautopilot/StartAutopilotViewModel.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/checkstartautopilot/startautopilot/StartAutopilotViewModel.kt @@ -13,6 +13,7 @@ import com.mogo.och.bridge.device.TaxiDoorStateManager import com.mogo.och.bridge.device.callback.DoorStateCallback import com.mogo.och.bridge.device.data.DoorPosition import com.mogo.och.bridge.device.data.DoorState +import com.mogo.och.common.module.manager.loop.BizLoopManager import com.mogo.och.common.module.utils.RxUtils import com.mogo.och.common.module.voice.VoiceNotice import com.mogo.och.unmanned.passenger.model.AutopilotManager @@ -105,7 +106,7 @@ class StartAutopilotViewModel : ViewModel(), override fun hasOpenDoor(have: Boolean) { CallerLogger.d(SceneConstant.M_TAXI_P + TAG, "车门是否开着:${have}") doorOpenState = have - UiThreadHandler.post { + BizLoopManager.runInMainThread { viewCallback?.canStartAutopilot(!doorOpenState) } } diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/evaluate/EvaluateView.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/evaluate/EvaluateView.kt index 9f4ffb599c..87a1292d32 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/evaluate/EvaluateView.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/evaluate/EvaluateView.kt @@ -16,7 +16,6 @@ import com.mogo.och.common.module.utils.FrameAnimatorContainer import com.mogo.och.common.module.utils.RxUtils import com.mogo.och.common.module.voice.VoiceNotice import com.mogo.och.unmanned.taxi.passenger.R -import kotlinx.android.synthetic.main.taxi_p_evaluate.view.iv_close import kotlinx.android.synthetic.main.taxi_p_evaluate.view.iv_evaluate_great import kotlinx.android.synthetic.main.taxi_p_evaluate.view.iv_evaluate_low @@ -94,9 +93,6 @@ class EvaluateView : ConstraintLayout, EvaluateViewModel.EvaluateCallback { isFirat = false } } - iv_close.onClick { - visibility = GONE - } } diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/evaluate/EvaluateViewModel.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/evaluate/EvaluateViewModel.kt index 7aa2d43370..a053ae87ec 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/evaluate/EvaluateViewModel.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/evaluate/EvaluateViewModel.kt @@ -6,6 +6,7 @@ import com.mogo.eagle.core.utilcode.util.StringUtils import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.mogo.och.bridge.distance.IDistanceListener import com.mogo.och.bridge.distance.TrajectoryAndDistanceManager +import com.mogo.och.common.module.manager.loop.BizLoopManager import com.mogo.och.unmanned.taxi.utils.order.OrderModel class EvaluateViewModel : ViewModel(), IDistanceListener { @@ -25,7 +26,7 @@ class EvaluateViewModel : ViewModel(), IDistanceListener { com.mogo.och.unmanned.taxi.utils.order.OrderModel.orderBean?.orderNo?.let { val string = SharedPrefsMgr.getInstance().getString(orderShowEvaluate) if (StringUtils.isEmpty(string) || !string.equals(it)) { - UiThreadHandler.post { + BizLoopManager.runInMainThread { this.viewCallback?.showEvaluate(true) } SharedPrefsMgr.getInstance().putString(orderShowEvaluate, it) diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/homepage/HomeView.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/homepage/HomeView.kt new file mode 100644 index 0000000000..4060c0e58e --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/homepage/HomeView.kt @@ -0,0 +1,258 @@ +package com.mogo.och.unmanned.passenger.ui.homepage + +import android.animation.Animator +import android.animation.ObjectAnimator +import android.animation.ValueAnimator +import android.content.Context +import android.os.Bundle +import android.util.AttributeSet +import android.view.LayoutInflater +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.constraintlayout.widget.Guideline +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.findViewTreeViewModelStoreOwner +import com.mogo.eagle.core.data.map.MogoLatLng +import com.mogo.eagle.core.utilcode.kotlin.onClick +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.och.bridge.autopilot.location.OchLocationManager +import com.mogo.och.unmanned.passenger.ui.bar.LeftBarView +import com.mogo.och.unmanned.taxi.passenger.R +import kotlinx.android.synthetic.main.taxi_p_home.view.acbtn_show_all +import kotlinx.android.synthetic.main.taxi_p_home.view.acbtn_show_hdmap +import kotlinx.android.synthetic.main.taxi_p_home.view.hdMapView +import kotlinx.android.synthetic.main.taxi_p_home.view.lbv_go2_center +import kotlinx.android.synthetic.main.taxi_p_home.view.leftEndGuideline +import kotlinx.android.synthetic.main.taxi_p_home.view.midContainer +import kotlinx.android.synthetic.main.taxi_p_home.view.midStartGuideline + +class HomeView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : ConstraintLayout(context, attrs, defStyleAttr), HomeViewModel.HomeCallback { + + + private var isAMapShow = true + private var isHDMapShow = false + private var isReadyForShowHDMap = false + private var currentAnimator: ValueAnimator? = null + + private var TAG = "HomeView" + + private var viewModel: HomeViewModel?=null + + + + private fun initView() { + LayoutInflater.from(context).inflate(R.layout.taxi_p_home, this, true) + + initlistener() + } + + private fun initlistener() { + lbv_go2_center.setOrderIdCallback(object : LeftBarView.LeftBarCallback{ + override fun setGo2CenterClick() { + //切换到地图中间 + hdMapView.getUI()?.let { + val wgs02Location = OchLocationManager.getWgs02Location() + it.moveToCenter(MogoLatLng(wgs02Location.latitude, wgs02Location.longitude)) + } + //overMapView.displayCustomOverView() + } + + }) + + acbtn_show_hdmap.onClick { + showHdMap() + } + acbtn_show_all.onClick { + showAmapAndHdMap() + } + + } + + /** + * 展示两屏幕 + */ + fun showHdMap(){ + updateViewState(true,false,false) + } + + /** + * 展示3屏 + */ + fun showAmapAndHdMap(){ + updateViewState(true,true,false) + } + + fun onCreate(savedInstanceState: Bundle?) { + hdMapView.onCreate(savedInstanceState) +// preContainer.onCreate(savedInstanceState) +// decContainer.onCreate(savedInstanceState) + } + + fun onSaveInstanceState(outState: Bundle) { + hdMapView.onSaveInstanceState(outState) +// preContainer.onSaveInstanceState(outState) +// decContainer.onSaveInstanceState(outState) + } + + fun onResume() { + hdMapView.onResume() +// preContainer.onResume() +// decContainer.onResume() + } + + fun onLowMemory() { + hdMapView.onLowMemory() +// preContainer.onLowMemory() +// decContainer.onLowMemory() + } + + fun onPause() { + hdMapView.onPause() +// preContainer.onPause() +// decContainer.onPause() + } + + fun onDestroy() { + hdMapView.onDestroy() +// preContainer.onDestroy() +// decContainer.onDestroy() + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + viewModel = findViewTreeViewModelStoreOwner()?.let { + ViewModelProvider(it).get(HomeViewModel::class.java) + } + viewModel?.setViewCallback(this) + } + + + private fun updateViewState( + showHDMapView: Boolean, + showAMapView: Boolean, + animate: Boolean = true + ) { + // 展示预测地图和高精地图 + if (showHDMapView && showAMapView) { + CallerLogger.d(TAG,"展示高德地图和高精地图${showHDMapView}_$showAMapView") + midStartGuideline.setGuidelinePercent(0.333f) + if (animate) { + animateGuidelinePercent( + leftEndGuideline, + 0.333f, + 1000 + ) { + lbv_go2_center.visibility = GONE + midContainer.visibility = VISIBLE + } + } else { + leftEndGuideline.setGuidelinePercent(0.333f) + lbv_go2_center.visibility = GONE + midContainer.visibility = VISIBLE + } + } + // 不展示预测 展示高精 + if (showHDMapView && !showAMapView) { + CallerLogger.d(TAG,"展示高德 不展示高精${showHDMapView}_$showAMapView") + if (animate) { + animateGuidelinePercent( + leftEndGuideline, + 0.666f, + 1000, + end = { + lbv_go2_center.visibility = VISIBLE + midContainer.visibility = GONE + } + ) + } else { + leftEndGuideline.setGuidelinePercent(0.666f) + lbv_go2_center.visibility = VISIBLE + midContainer.visibility = GONE + } + } + // 不展示高精 展示高德 + if (!showHDMapView && showAMapView) { + CallerLogger.d(TAG,"展示高精 不展示高德${showHDMapView}_$showAMapView") + if (animate) { + midStartGuideline.setGuidelinePercent(0.0f) + animateGuidelinePercent( + leftEndGuideline, + 0.0f, + 1000 + ) { + lbv_go2_center.visibility = GONE + } + } + else { + leftEndGuideline.setGuidelinePercent(0.0f) + midStartGuideline.setGuidelinePercent(0.0f) + lbv_go2_center.visibility = GONE + } + } + } + + private fun animateGuidelinePercent( + guideline: Guideline, + endPercent: Float, + duration: Long, + start: (() -> Unit)? = null, + end: (() -> Unit)? = null + ) { + // 如果当前已有动画在运行,先取消它 + if (currentAnimator?.isRunning == true) { + currentAnimator?.cancel() + } + + val startPercent = (guideline.layoutParams as ConstraintLayout.LayoutParams).guidePercent + // 创建新的 ObjectAnimator + currentAnimator = ObjectAnimator.ofFloat( + guideline, + "guidelinePercent", + startPercent, + endPercent + ) + // 设置动画时长 + currentAnimator?.setDuration(duration) + + // 设置动画回调监听器 + currentAnimator?.addListener(object : Animator.AnimatorListener { + override fun onAnimationStart(animation: Animator) { + start?.invoke() + } + + override fun onAnimationEnd(animation: Animator) { + end?.invoke() + } + + override fun onAnimationCancel(animation: Animator) { + } + + override fun onAnimationRepeat(animation: Animator) { + } + }) + + // 启动新的动画 + currentAnimator?.start() + } + + + init { + try { + initView() + } catch (e: Exception) { + e.printStackTrace() + } + } + + override fun showTwoScreen() { + showHdMap() + } + + override fun showThreeScreen() { + showAmapAndHdMap() + } + +} \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/homepage/HomeViewModel.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/homepage/HomeViewModel.kt new file mode 100644 index 0000000000..57a84256d6 --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/homepage/HomeViewModel.kt @@ -0,0 +1,75 @@ +package com.mogo.och.unmanned.passenger.ui.homepage + +import androidx.lifecycle.ViewModel +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.och.common.module.biz.birdge.BridgeListener +import com.mogo.och.common.module.biz.birdge.BridgeManager +import com.mogo.och.common.module.manager.loop.BizLoopManager +import com.mogo.och.data.taxi.BaseOrderBean +import com.mogo.och.unmanned.taxi.utils.order.OrderListener +import com.mogo.och.unmanned.taxi.utils.order.OrderModel + +class HomeViewModel : ViewModel(), BridgeListener, OrderListener { + + private val TAG = HomeViewModel::class.java.simpleName + + private val orderShowEvaluate = "SHOWEVALUATE" + + private var viewCallback: HomeCallback? = null + + private var order:BaseOrderBean?=null + private var haveTrajectoryInfos:Boolean = false + private var havePredictionInfos:Boolean = false + + fun setViewCallback(viewCallback: HomeCallback) { + this.viewCallback = viewCallback + BridgeManager.addBridgeListener(TAG,this) + OrderModel.setOrderStatusCallback(TAG,this) + } + + override fun onCleared() { + super.onCleared() + this.viewCallback = null + BridgeManager.removeBridgeListener(TAG) + } + + interface HomeCallback { + fun showTwoScreen() + fun showThreeScreen() + } + + override fun onTrajectoryHaveData(haveTrajectoryInfos: Boolean) { + this.haveTrajectoryInfos = haveTrajectoryInfos +// checkScreenChange() + } + + override fun onPredictionHavaData(havePredictionInfos: Boolean) { + this.havePredictionInfos = havePredictionInfos +// checkScreenChange() + } + + override fun onCurrentOrderStatusChanged(order: BaseOrderBean?) { + this.order = order +// checkScreenChange() + } + + fun checkScreenChange(){ +// CallerLogger.d(TAG,"havePredictionInfos:${havePredictionInfos}--haveTrajectoryInfos:${haveTrajectoryInfos}--order:${order}") +// if(order!=null&&havePredictionInfos&&havePredictionInfos){ +// FunctionBuildConfig.isDrawDecIdentifyData = true +// FunctionBuildConfig.isDrawPreIdentifyData = true +// // 展示三联屏 +// BizLoopManager.runInMainThread{ +// this.viewCallback?.showThreeScreen() +// } +// }else{ +// FunctionBuildConfig.isDrawDecIdentifyData = false +// FunctionBuildConfig.isDrawPreIdentifyData = false +// // 展示二联屏幕 +// BizLoopManager.runInMainThread{ +// this.viewCallback?.showTwoScreen() +// } +// } + } +} \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/homepage/MapBizPView.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/homepage/MapBizPView.kt new file mode 100644 index 0000000000..0a7bc5aec8 --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/homepage/MapBizPView.kt @@ -0,0 +1,19 @@ +package com.mogo.och.unmanned.passenger.ui.homepage + +import android.content.Context +import android.util.AttributeSet +import com.mogo.eagle.core.function.view.MapBizView +import com.mogo.eagle.core.widget.media.video.TextureVideoViewOutlineProvider +import me.jessyan.autosize.utils.AutoSizeUtils + +class MapBizPView(context: Context?, attrs: AttributeSet?) : MapBizView(context, attrs) { + + + override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) { + super.onSizeChanged(w, h, oldw, oldh) + this.outlineProvider = + TextureVideoViewOutlineProvider(AutoSizeUtils.dp2px(context, 36f).toFloat()) + this.clipToOutline = true + } + +} diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/MusicModel.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/MusicModel.kt index 6678e0d8a3..653f695aca 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/MusicModel.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/MusicModel.kt @@ -2,20 +2,29 @@ package com.mogo.och.unmanned.passenger.ui.music import com.mogo.commons.storage.SharedPrefsMgr import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener -import com.mogo.eagle.core.utilcode.util.TAG +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.och.common.module.manager.audition.AuditionManager import com.mogo.och.bridge.autopilot.autopilot.IOchAutopilotStatusListener import com.mogo.och.bridge.autopilot.autopilot.OchAutoPilotStatusListenerManager +import com.mogo.och.common.module.manager.audition.MusicData +import com.mogo.och.common.module.manager.loop.BizLoopManager +import com.mogo.och.common.module.utils.CallerBase import com.mogo.och.common.module.utils.RxUtils import com.mogo.och.data.taxi.BaseOrderBean import com.mogo.och.data.taxi.TaxiOrderStatusEnum import io.reactivex.disposables.Disposable +import com.mogo.och.unmanned.taxi.utils.order.OrderListener +import com.mogo.och.unmanned.taxi.utils.order.OrderModel + +object MusicModel : CallerBase(), OrderListener, IOchAutopilotStatusListener, AuditionManager.MusicDataChangeListener { + + private const val TAG = "MusicModel" -object MusicModel : com.mogo.och.unmanned.taxi.utils.order.OrderListener, IOchAutopilotStatusListener { init { - com.mogo.och.unmanned.taxi.utils.order.OrderModel.setOrderStatusCallback(TAG,this) + OrderModel.setOrderStatusCallback(TAG,this) //自动驾驶状态监听 OchAutoPilotStatusListenerManager.addListener(TAG, this) + AuditionManager.addDataChangeListener(TAG,this) } private var stopMusicDisposable: Disposable? = null @@ -61,14 +70,18 @@ object MusicModel : com.mogo.och.unmanned.taxi.utils.order.OrderListener, IOchAu orderInfo?.let { cancelStopMusicDisposable() SharedPrefsMgr.getInstance().putString(startMusicWithOrderKey, it.orderNo) - AuditionManager.playFirst() + BizLoopManager.runInMainThread{ + checkMusic(AuditionManager.musicList.first(),true) + } } } else { orderInfo?.let { if (it.orderNo != string) { cancelStopMusicDisposable() SharedPrefsMgr.getInstance().putString(startMusicWithOrderKey, it.orderNo) - AuditionManager.playFirst() + BizLoopManager.runInMainThread { + checkMusic(AuditionManager.musicList.first(), true) + } } } } @@ -87,4 +100,119 @@ object MusicModel : com.mogo.och.unmanned.taxi.utils.order.OrderListener, IOchAu } + + fun getCheckMusic(): MusicData? { + AuditionManager.musicList.forEach { + if (it.select==true) { + return it + } + } + return null + } + + fun seekTo(progress: Int) { + AuditionManager.seekTo(progress) + } + + override fun addOneData(musicData: MusicData) { + M_LISTENERS.forEach{ + it.value.addOneData(musicData) + } + } + + /** + * 1、更新选中状态 + * 2、如果正在播放 需要开始播放选中音乐 + */ + fun checkMusic(musicData: MusicData,startPlay:Boolean = true){ + AuditionManager.musicList.forEach { + // 上一个选中歌曲 + if (it.select==true) { + if(it!=musicData){ + it.select = false + notifySelectChange(it) + }else{ + return + } + } + if(it==musicData){ + it.select = true + musicData.select = true + } + } + notifySelectChange(musicData) + if(startPlay) { + AuditionManager.play(musicData) + } + } + + private fun notifySelectChange(musicData: MusicData) { + M_LISTENERS.forEach{ + it.value.checkChangeListener(musicData) + } + } + + fun clickPreMusic(){ + val checkMusic = getCheckMusic() + checkMusic?.let { + val preMusicData = AuditionManager.getPreMusicData(it) + checkMusic(preMusicData) + } + } + + fun clickNextMusic(){ + val checkMusic = getCheckMusic() + checkMusic?.let { + val nextMusicData = AuditionManager.getNextMusicData(it) + checkMusic(nextMusicData) + } + } + + fun toggleMusic(){ + val checkMusic = getCheckMusic() + checkMusic?.let { + AuditionManager.toggle(it) + } + } + + // 播放状态发生变化 + override fun updateState(oldData: MusicData?, musicData: MusicData) { + CallerLogger.d(TAG,"updateState") + M_LISTENERS.forEach{ + it.value.updateState(oldData,musicData) + } + } + + // 播放进度变化 + override fun updatePlayCurrent(currentPlay: Long, duration: Long, second: MusicData) { + CallerLogger.d(TAG, "updatePlayCurrent:currentPlay:${currentPlay}") + M_LISTENERS.forEach{ + it.value.updatePlayCurrent(currentPlay,duration,second) + } + } + + // 播放完毕 + override fun onMusicCompletion(musicData: MusicData) { + CallerLogger.d(TAG, "onMusicCompletion:${musicData}") + M_LISTENERS.forEach{ + it.value.onMusicCompletion(musicData) + } + } + + fun isPlaying(): Boolean { +// val checkMusic = getCheckMusic() +// if (checkMusic?.state== PlayState.None) { +// return false +// } +// return true + return AuditionManager.isPlaying() + } + + interface MusicDataListener{ + fun checkChangeListener(musicData: MusicData){} + fun addOneData(it: MusicData){} + fun updatePlayCurrent(currentPlay: Long, duration: Long, second: MusicData){} + fun updateState(oldData: MusicData?, musicData: MusicData) {} + fun onMusicCompletion(musicData: MusicData) {} + } } \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/MusicView.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/MusicView.kt index 856ece399f..a2338a6660 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/MusicView.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/MusicView.kt @@ -7,16 +7,13 @@ import android.view.View import androidx.constraintlayout.widget.ConstraintLayout import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.findViewTreeViewModelStoreOwner -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger -import com.mogo.och.common.module.manager.audition.AuditionManager import com.mogo.och.common.module.manager.audition.MusicData import com.mogo.och.unmanned.passenger.ui.music.list.MusicListView import com.mogo.och.unmanned.taxi.passenger.R -import kotlinx.android.synthetic.main.taxi_p_music.view.iv_toggle_list_playing import kotlinx.android.synthetic.main.taxi_p_music.view.mlv_list import kotlinx.android.synthetic.main.taxi_p_music.view.mpv_playing -class MusicView : ConstraintLayout, MusicViewModel.IMusicViewCallback, MusicListView.CheckListener { +class MusicView : ConstraintLayout, MusicViewModel.IMusicViewCallback { private val TAG = "MusicView" @@ -39,28 +36,12 @@ class MusicView : ConstraintLayout, MusicViewModel.IMusicViewCallback, MusicList private fun initView() { LayoutInflater.from(context).inflate(R.layout.taxi_p_music, this, true) - setBackgroundResource(R.drawable.taxt_p_music_bg) setListener() } private fun setListener() { - iv_toggle_list_playing.setOnClickListener { - if (mpv_playing.visibility == VISIBLE && mlv_list.visibility == GONE) { - showMusicList() - } else if (mpv_playing.visibility == GONE && mlv_list.visibility == VISIBLE) { - if (!AuditionManager.isPlaying()) { - CallerLogger.i(TAG, "当前无播放音乐,不能切到MusicPlayingView") - return@setOnClickListener - } - showMusicPlaying() - mpv_playing.setData(null) - }else{ - showMusicPlaying() - mpv_playing.setData(null) - } - } - mlv_list.setCheckItemListener(this) + } override fun onAttachedToWindow() { @@ -82,22 +63,5 @@ class MusicView : ConstraintLayout, MusicViewModel.IMusicViewCallback, MusicList } } - private fun showMusicList(){ - mpv_playing.visibility = GONE - mlv_list.visibility = View.VISIBLE - iv_toggle_list_playing.setImageResource(R.drawable.taxt_p_go2_playing) - } - private fun showMusicPlaying(){ - mpv_playing.visibility = VISIBLE - mlv_list.visibility = GONE - iv_toggle_list_playing.setImageResource(R.drawable.taxt_p_go2_list) - } - - override fun checkItem(musicData: MusicData) { - mpv_playing.setDatafromCheck(musicData) - // 详情页显示歌曲 - showMusicPlaying() - } - } \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/bar/MusicBarView.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/bar/MusicBarView.kt new file mode 100644 index 0000000000..a2ec92ff80 --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/bar/MusicBarView.kt @@ -0,0 +1,157 @@ +package com.mogo.och.unmanned.passenger.ui.music.bar + +import android.animation.ObjectAnimator +import android.animation.ValueAnimator +import android.content.Context +import android.os.Build +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.animation.LinearInterpolator +import android.widget.SeekBar +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.findViewTreeViewModelStoreOwner +import com.mogo.eagle.core.utilcode.kotlin.onClick +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.och.common.module.manager.audition.MusicData +import com.mogo.och.common.module.manager.audition.PlayState +import com.mogo.och.unmanned.taxi.passenger.R +import kotlinx.android.synthetic.main.taxi_p_music_bar.view.aciv_music_next_bar +import kotlinx.android.synthetic.main.taxi_p_music_bar.view.aciv_music_toggle_bar +import kotlinx.android.synthetic.main.taxi_p_music_bar.view.aciv_music_top +import kotlinx.android.synthetic.main.taxi_p_music_bar.view.actv_music_title +import kotlinx.android.synthetic.main.taxi_p_music_bar.view.sb_musuc_bar_progess + +class MusicBarView : ConstraintLayout, MusicBarViewModel.IMusicViewBarCallback { + + private val TAG = "MusicBarView" + + var viewModel: MusicBarViewModel?=null + + private var isSeekBarTouch = false + + private var animator:ObjectAnimator?=null + + + constructor(context: Context) : super(context) + + constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet) + + constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int) : super( + context, + attributeSet, + defStyleAttr + ) + + constructor( + context: Context, + attributeSet: AttributeSet, + defStyleAttr: Int, + defStyleRes: Int + ) : super(context, attributeSet, defStyleAttr, defStyleRes) + + private fun initView() { + LayoutInflater.from(context).inflate(R.layout.taxi_p_music_bar, this, true) + + setListener() + } + + private fun setListener() { + aciv_music_toggle_bar.onClick { + viewModel?.toggle() + } + aciv_music_next_bar.onClick { + viewModel?.playNext() + } + sb_musuc_bar_progess.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener{ + var seekToProgress = 0 + override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { + if(isSeekBarTouch) { + CallerLogger.d(TAG, "progress:${progress}----fromUser:${fromUser}") + seekToProgress = progress + }else{ + + } + } + + override fun onStartTrackingTouch(seekBar: SeekBar?) { + isSeekBarTouch = true + } + + override fun onStopTrackingTouch(seekBar: SeekBar?) { + isSeekBarTouch = false + viewModel?.seekTo(seekToProgress) + seekToProgress = 0 + } + + }) + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + + viewModel = findViewTreeViewModelStoreOwner()?.let { + ViewModelProvider(it).get(MusicBarViewModel::class.java) + } + + viewModel?.setDistanceCallback(this) + } + + + init { + try { + initView() + } catch (e: Exception) { + e.printStackTrace() + } + } + + override fun setCurrentMusicData(musicData: MusicData?) { + if(musicData==null){ + visibility = GONE + }else{ + visibility = VISIBLE + actv_music_title.text = musicData.songName + if(musicData.state== PlayState.Playing){ + aciv_music_toggle_bar.setImageResource(R.drawable.taxi_p_music_pause_bar) + startAnimal() + }else{ + aciv_music_toggle_bar.setImageResource(R.drawable.taxi_p_music_play_bar) + endAnimal() + } + } + } + + private fun startAnimal(){ + if(animator!=null){ + animator?.cancel() + animator = null + } + animator = ObjectAnimator.ofFloat(aciv_music_top, "rotation", 0f, 360f) + animator?.duration = 3000 + animator?.repeatCount = -1 + animator?.repeatMode = ValueAnimator.RESTART + animator?.interpolator = LinearInterpolator() + animator?.start() + } + private fun endAnimal(){ + if(animator!=null){ + animator?.cancel() + animator = null + } + } + + + override fun setProgress(currentPlay: Long, duration: Long) { + if(isSeekBarTouch){ + + }else{ + sb_musuc_bar_progess.max = duration.toInt() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + sb_musuc_bar_progess.setProgress(currentPlay.toInt(),true) + }else{ + sb_musuc_bar_progess.progress=currentPlay.toInt() + } + } + } +} \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/bar/MusicBarViewModel.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/bar/MusicBarViewModel.kt new file mode 100644 index 0000000000..8fee84cb9a --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/bar/MusicBarViewModel.kt @@ -0,0 +1,55 @@ +package com.mogo.och.unmanned.passenger.ui.music.bar + +import androidx.lifecycle.ViewModel +import com.mogo.och.common.module.manager.audition.MusicData +import com.mogo.och.common.module.manager.loop.BizLoopManager +import com.mogo.och.unmanned.passenger.ui.music.MusicModel + +class MusicBarViewModel : ViewModel(), MusicModel.MusicDataListener { + + private val TAG = MusicBarViewModel::class.java.simpleName + + private var viewCallback: IMusicViewBarCallback? = null + + fun setDistanceCallback(viewCallback: IMusicViewBarCallback) { + this.viewCallback = viewCallback + MusicModel.addListener(TAG, this) + } + + override fun onCleared() { + super.onCleared() + this.viewCallback = null + MusicModel.removeListener(TAG) + } + + interface IMusicViewBarCallback { + fun setCurrentMusicData(musicData: MusicData?) + fun setProgress(currentPlay: Long, duration: Long) + } + + override fun updateState(oldData: MusicData?, musicData: MusicData) { + this.viewCallback?.setCurrentMusicData(musicData) + } + + fun toggle() { + MusicModel.toggleMusic() + } + + fun playNext() { + MusicModel.clickNextMusic() + } + + fun seekTo(seekToProgress: Int) { + MusicModel.seekTo(seekToProgress) + } + + override fun checkChangeListener(musicData: MusicData) { + this.viewCallback?.setCurrentMusicData(musicData) + } + + override fun updatePlayCurrent(currentPlay: Long, duration: Long, musicData: MusicData) { + BizLoopManager.runInMainThread { + viewCallback?.setProgress(currentPlay, duration) + } + } +} \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/list/MusicListItemAdapter.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/list/MusicListItemAdapter.kt index b5cadfbe94..899c28293a 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/list/MusicListItemAdapter.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/list/MusicListItemAdapter.kt @@ -34,7 +34,7 @@ class MusicListItemAdapter( it.orientation = GradientDrawable.Orientation.LEFT_RIGHT if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { it.setColors(intArrayOf(firstColor, setondColor, thirdColor, fourceColor,fifthColor), - floatArrayOf(0.0f,0.3f,0.6f,0.9f,1f) + floatArrayOf(0.0f,0.1f,0.3f,0.6f,1f) ) }else{ it.colors = intArrayOf(firstColor, setondColor, thirdColor, fourceColor) @@ -57,13 +57,26 @@ class MusicListItemAdapter( } holder.itemView.setOnClickListener { clickListener.clickItem(musicData) + dataList.forEachIndexed { index, musicData4Loop -> + if(musicData4Loop.select==true){ + musicData4Loop.select = false + notifyItemChanged(index) + return@forEachIndexed + } + } + musicData.select = true + notifyItemChanged(position) } - if (musicData.state==PlayState.Playing||musicData.state==PlayState.Pause) { - holder.musicPlayState.visibility = View.VISIBLE + if(musicData.select==true){ holder.itemView.background = gradientDrawable }else{ holder.itemView.background = null + } + + if (musicData.state==PlayState.Playing) { + holder.musicPlayState.visibility = View.VISIBLE + }else{ holder.musicPlayState.visibility = View.GONE } } @@ -72,39 +85,10 @@ class MusicListItemAdapter( return dataList.size } - fun setNewData(data: MutableList) { - dataList.clear() - dataList.addAll(data) - notifyDataSetChanged() - } - - fun addOneData(musicData: MusicData){ - dataList.add(musicData) - notifyItemInserted(dataList.size) - } - - fun upDateMusicData(oldData: MusicData?,musicData: MusicData) { - dataList.forEachIndexed { index, musicDataIn -> - if (musicDataIn.id==musicData.id) { - musicDataIn.state = musicData.state - notifyItemChanged(index,0) - } - if(oldData?.id==musicDataIn.id){ - notifyItemChanged(index,0) - } - } - } - inner class TextVH(itemView: View) : RecyclerView.ViewHolder(itemView) { - var musicName: TextView - var musicPlayState: ImageView - var tvTag: TextView - - init { - musicName = itemView.findViewById(R.id.tv_song_name) - tvTag = itemView.findViewById(R.id.tv_tag) - musicPlayState = itemView.findViewById(R.id.iv_music_playing) - } + var musicName: TextView = itemView.findViewById(R.id.tv_song_name) + var musicPlayState: ImageView = itemView.findViewById(R.id.iv_music_playing) + var tvTag: TextView = itemView.findViewById(R.id.tv_tag) } interface ClickListener { diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/list/MusicListView.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/list/MusicListView.kt index 6ac9f328a9..9db7ad9b86 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/list/MusicListView.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/list/MusicListView.kt @@ -1,5 +1,6 @@ package com.mogo.och.unmanned.passenger.ui.music.list +import android.annotation.SuppressLint import android.content.Context import android.util.AttributeSet import android.view.LayoutInflater @@ -7,8 +8,8 @@ import androidx.constraintlayout.widget.ConstraintLayout import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.findViewTreeViewModelStoreOwner import androidx.recyclerview.widget.LinearLayoutManager -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.och.common.module.manager.audition.MusicData +import com.mogo.och.unmanned.passenger.ui.music.MusicModel import com.mogo.och.unmanned.taxi.passenger.R import kotlinx.android.synthetic.main.taxi_p_music_list.view.rv_music_list @@ -27,7 +28,8 @@ class MusicListView : ConstraintLayout, MusicListViewModel.IMusicListViewCaLillb private val dataList = mutableListOf() private lateinit var lineAdapter:MusicListItemAdapter - private var checkListener:CheckListener?=null + + private var isFirstVisable = false private fun initView() { LayoutInflater.from(context).inflate(R.layout.taxi_p_music_list, this, true) @@ -39,6 +41,8 @@ class MusicListView : ConstraintLayout, MusicListViewModel.IMusicListViewCaLillb override fun onAttachedToWindow() { super.onAttachedToWindow() + isFirstVisable = true + val viewModel = findViewTreeViewModelStoreOwner()?.let { ViewModelProvider(it).get(MusicListViewModel::class.java) } @@ -46,6 +50,16 @@ class MusicListView : ConstraintLayout, MusicListViewModel.IMusicListViewCaLillb viewModel?.setDistanceCallback(this) } + override fun onVisibilityAggregated(isVisible: Boolean) { + super.onVisibilityAggregated(isVisible) + if(isVisible&&isFirstVisable){ + isFirstVisable = false + if (dataList.isNotEmpty()) { + MusicModel.checkMusic(dataList.first(),false) + } + } + } + init { try { @@ -55,32 +69,42 @@ class MusicListView : ConstraintLayout, MusicListViewModel.IMusicListViewCaLillb } } + @SuppressLint("NotifyDataSetChanged") override fun addAllData(data: MutableList) { - lineAdapter.setNewData(data) + dataList.clear() + dataList.addAll(data) + lineAdapter.notifyDataSetChanged() } override fun addOneData(it: MusicData) { - lineAdapter.addOneData(it) + dataList.add(it) + lineAdapter.notifyItemInserted(dataList.size) } - override fun updateMusicData(oldData: MusicData?,musicData: MusicData) { - lineAdapter.upDateMusicData(oldData,musicData) - CallerLogger.d(TAG,"${Thread.currentThread().name}----更新数据${oldData}-----${musicData}") + + override fun updateSelect(musicData: MusicData) { + dataList.forEachIndexed { index, musicDataIn -> + if (musicDataIn == musicData) { + musicDataIn.select = musicData.select + lineAdapter.notifyItemChanged(index) + return + } + } + } + + override fun updateStete(musicData: MusicData) { + dataList.forEachIndexed { index, musicDataIn -> + if (musicDataIn == musicData) { + musicDataIn.state = musicData.state + lineAdapter.notifyItemChanged(index) + return + } + } } override fun clickItem(musicData: MusicData) { // 通知主页面去显示详情 - this.checkListener?.checkItem(musicData) + MusicModel.checkMusic(musicData) } - fun setCheckItemListener(checkListener:CheckListener) { - this.checkListener = checkListener - } - - interface CheckListener { - fun checkItem(musicData: MusicData) - } - - - } \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/list/MusicListViewModel.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/list/MusicListViewModel.kt index f10768c617..4368af86d0 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/list/MusicListViewModel.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/list/MusicListViewModel.kt @@ -5,54 +5,63 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.mogo.och.common.module.manager.audition.AuditionManager import com.mogo.och.common.module.manager.audition.MusicData +import com.mogo.och.common.module.manager.loop.BizLoopManager +import com.mogo.och.unmanned.passenger.ui.music.MusicModel -class MusicListViewModel : ViewModel(), - AuditionManager.MusicDataChangeListener { +class MusicListViewModel : ViewModel(), MusicModel.MusicDataListener { private val TAG = MusicListViewModel::class.java.simpleName private var viewCallback: IMusicListViewCaLillback? = null - init { - - } fun setDistanceCallback(viewCallback: IMusicListViewCaLillback) { this.viewCallback = viewCallback viewCallback.addAllData(AuditionManager.musicList) - CallerLogger.d(TAG,"初始化音乐${AuditionManager.musicList.size}") - AuditionManager.addDataChangeListener(TAG,this) + CallerLogger.d(TAG, "初始化音乐${AuditionManager.musicList.size}") + MusicModel.addListener(TAG, this) } override fun onCleared() { - AuditionManager.removeDataChangeListener(TAG) super.onCleared() this.viewCallback = null + MusicModel.removeListener(TAG) } interface IMusicListViewCaLillback { - fun addAllData(data:MutableList) + fun addAllData(data: MutableList) fun addOneData(it: MusicData) - fun updateMusicData(oldData: MusicData?,musicData: MusicData) + fun updateSelect(musicData: MusicData) + fun updateStete(musicData: MusicData) } - override fun addOneData(it: MusicData) { - CallerLogger.d(TAG,"添加音乐:${it.songName}--${it.path}") - UiThreadHandler.post({ - this.viewCallback?.addOneData(it) - }, UiThreadHandler.MODE.QUEUE) - } - - override fun updateState(oldData: MusicData?,musicData: MusicData) { - UiThreadHandler.post({ - viewCallback?.updateMusicData(oldData, musicData) - }, UiThreadHandler.MODE.QUEUE) + override fun updateState(oldData: MusicData?, musicData: MusicData) { + BizLoopManager.runInMainThread{ + if(oldData!=null&&oldData!=musicData){ + viewCallback?.updateStete(oldData) + } + viewCallback?.updateStete(musicData) + } } override fun onMusicCompletion(musicData: MusicData) { - super.onMusicCompletion(musicData) - UiThreadHandler.post({ - viewCallback?.updateMusicData(musicData, musicData) - }, UiThreadHandler.MODE.QUEUE) + BizLoopManager.runInMainThread{ + MusicModel.clickNextMusic() + } } + + override fun checkChangeListener(musicData: MusicData) { + BizLoopManager.runInMainThread { + viewCallback?.updateSelect(musicData) + } + } + + override fun addOneData(it: MusicData) { + CallerLogger.d(TAG, "添加音乐:${it.songName}--${it.path}") + BizLoopManager.runInMainThread { + this.viewCallback?.addOneData(it) + } + } + + } \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/playing/MusicPlayingView.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/playing/MusicPlayingView.kt index 3331d5ec32..1a74a621e3 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/playing/MusicPlayingView.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/playing/MusicPlayingView.kt @@ -11,16 +11,16 @@ import android.widget.SeekBar import androidx.constraintlayout.widget.ConstraintLayout import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.findViewTreeViewModelStoreOwner -import com.bumptech.glide.Glide -import com.bumptech.glide.request.RequestOptions import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.util.TimeTransformUtils +import com.mogo.och.common.module.manager.audiofocus.AudioFocusManager import com.mogo.och.common.module.manager.audition.MusicData import com.mogo.och.common.module.manager.audition.PlayState import com.mogo.och.common.module.utils.DateTimeUtil import com.mogo.och.unmanned.taxi.passenger.R import kotlinx.android.synthetic.main.taxi_p_music_playing.view.iv_music_cover import kotlinx.android.synthetic.main.taxi_p_music_playing.view.iv_music_cover_bg +import kotlinx.android.synthetic.main.taxi_p_music_playing.view.iv_music_point import kotlinx.android.synthetic.main.taxi_p_music_playing.view.iv_show_next import kotlinx.android.synthetic.main.taxi_p_music_playing.view.iv_show_pre import kotlinx.android.synthetic.main.taxi_p_music_playing.view.iv_toggle @@ -47,10 +47,13 @@ class MusicPlayingView : ConstraintLayout, MusicPlayingViewModel.IMusicPlayingVi private var viewModel:MusicPlayingViewModel?=null private var animator:ObjectAnimator?=null + private var animatorBg:ObjectAnimator?=null + private var animatorPoint:ObjectAnimator?=null private var isSeekBarTouch = false - private val centerWidth = AutoSizeUtils.dp2px(context,146f) + private val centerWidth = AutoSizeUtils.dp2px(context,294f) + private val centerHeight = AutoSizeUtils.dp2px(context,130f) private fun initView() { LayoutInflater.from(context).inflate(R.layout.taxi_p_music_playing, this, true) @@ -104,14 +107,6 @@ class MusicPlayingView : ConstraintLayout, MusicPlayingViewModel.IMusicPlayingVi super.onVisibilityAggregated(isVisible) } - fun setData(musicData: MusicData?) { - viewModel?.setMusicData(musicData) - } - - fun setDatafromCheck(musicData: MusicData){ - viewModel?.setMusciDataFromCheck(musicData) - } - override fun setViewData(musicData: MusicData){ tv_music_name.text = musicData.songName tv_tag.text = musicData.tag.first() @@ -129,15 +124,6 @@ class MusicPlayingView : ConstraintLayout, MusicPlayingViewModel.IMusicPlayingVi }else{ sb_musuc_progess.progress=0.toInt() } - - Glide.with(context) - .load(musicData.coverHeadImageUrl) - .apply(RequestOptions().placeholder(R.drawable.taxt_p_music_bg_relax_head)) - .into(iv_music_cover) - Glide.with(context) - .load(musicData.coverBottomImageUrl) - .apply(RequestOptions().placeholder(R.drawable.taxt_p_music_bg_relax_bottom)) - .into(iv_music_cover_bg) } private fun startAnimal(){ @@ -146,19 +132,52 @@ class MusicPlayingView : ConstraintLayout, MusicPlayingViewModel.IMusicPlayingVi animator = null } animator = ObjectAnimator.ofFloat(iv_music_cover, "rotation", 0f, 360f) - iv_music_cover.pivotX = (centerWidth).toFloat() - iv_music_cover.pivotY = (centerWidth).toFloat() animator?.duration = 3000 animator?.repeatCount = -1 animator?.repeatMode = ValueAnimator.RESTART animator?.interpolator = LinearInterpolator() animator?.start() + if(animatorBg!=null){ + animatorBg?.cancel() + animatorBg = null + } + animatorBg = ObjectAnimator.ofFloat(iv_music_cover_bg, "rotation", 0f, 360f) + animatorBg?.duration = 3000 + animatorBg?.repeatCount = -1 + animatorBg?.repeatMode = ValueAnimator.RESTART + animatorBg?.interpolator = LinearInterpolator() + animatorBg?.start() + if(animatorPoint!=null){ + animatorPoint?.cancel() + animatorPoint = null + } + animatorPoint = ObjectAnimator.ofFloat(iv_music_point, "rotation", iv_music_point.rotation, 25f) + iv_music_point.pivotX = (centerWidth).toFloat() + iv_music_point.pivotY = (centerHeight).toFloat() + animatorPoint?.duration = 1000 + animatorPoint?.interpolator = LinearInterpolator() + animatorPoint?.start() } private fun endAnimal(){ if(animator!=null){ animator?.cancel() animator = null } + if(animatorBg!=null){ + animatorBg?.cancel() + animatorBg = null + } + + if(animatorPoint!=null){ + animatorPoint?.cancel() + animatorPoint = null + } + animatorPoint = ObjectAnimator.ofFloat(iv_music_point, "rotation", iv_music_point.rotation,0f) + iv_music_point.pivotX = (centerWidth).toFloat() + iv_music_point.pivotY = (centerHeight).toFloat() + animatorPoint?.duration = 1000 + animatorPoint?.interpolator = LinearInterpolator() + animatorPoint?.start() } override fun setPlayOrpause(it: MusicData) { @@ -187,11 +206,6 @@ class MusicPlayingView : ConstraintLayout, MusicPlayingViewModel.IMusicPlayingVi tv_playing_during.text = TimeTransformUtils.stringForTime(duration.toInt()) } - fun listenerPlaying(){ - - } - - init { try { initView() diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/playing/MusicPlayingViewModel.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/playing/MusicPlayingViewModel.kt index 052f38e271..fb242a7d00 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/playing/MusicPlayingViewModel.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/playing/MusicPlayingViewModel.kt @@ -1,106 +1,41 @@ package com.mogo.och.unmanned.passenger.ui.music.playing import androidx.lifecycle.ViewModel -import com.elegant.utils.UiThreadHandler import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger -import com.mogo.eagle.core.utilcode.util.GsonUtils -import com.mogo.eagle.core.utilcode.util.ThreadUtils -import com.mogo.och.common.module.manager.audition.AuditionManager import com.mogo.och.common.module.manager.audition.MusicData +import com.mogo.och.common.module.manager.loop.BizLoopManager +import com.mogo.och.unmanned.passenger.ui.music.MusicModel -class MusicPlayingViewModel : ViewModel(), AuditionManager.MusicDataChangeListener { +class MusicPlayingViewModel : ViewModel(), MusicModel.MusicDataListener { private val TAG = MusicPlayingViewModel::class.java.simpleName private var viewCallback: IMusicPlayingViewCallback? = null - private var checkMusicData:MusicData?=null - init { - AuditionManager.addDataChangeListener(TAG,this) CallerLogger.d(TAG, "init") } fun setDistanceCallback(viewCallback: IMusicPlayingViewCallback) { this.viewCallback = viewCallback + MusicModel.addListener(TAG,this) } override fun onCleared() { super.onCleared() this.viewCallback = null - AuditionManager.removeDataChangeListener(TAG) - } - - fun setMusicData(musicData: MusicData?) { - if (ThreadUtils.isMainThread()) { - showData(musicData) - }else { - UiThreadHandler.post { - showData(musicData) - } - } - } - - fun setMusciDataFromCheck(musicData: MusicData){ - val playing = AuditionManager.isPlaying() - showData(musicData) - if(playing){ - play() - } - } - - private fun showData(musicData: MusicData?){ - if(musicData==null){ - if(AuditionManager.isPlaying()){ - if (AuditionManager.musicDataPlaying==null) { - this.checkMusicData = AuditionManager.musicList.first() - }else { - this.checkMusicData = AuditionManager.musicDataPlaying!! - } - }else { - //暂停播放的时候,如果在选择页面什么也不选,应该也需要默认是当前暂停播放的音乐 - return - } - }else { - this.checkMusicData = musicData - } - this.checkMusicData?.let { - this.viewCallback?.setViewData(it) - } } fun toggle() { - checkMusicData?.let { - AuditionManager.toggle(it) - } - } - - fun play(){ - checkMusicData?.let { - AuditionManager.play(it) - } + MusicModel.toggleMusic() } fun showPreMusic() { - checkMusicData?.let { - val playing = AuditionManager.isPlaying() - val nextMusicData = AuditionManager.getPreMusicData(it) - setMusicData(nextMusicData) - if(playing){ - play() - } - } + MusicModel.clickPreMusic() } fun showNextMusic() { - checkMusicData?.let { - val playing = AuditionManager.isPlaying() - val nextMusicData = AuditionManager.getNextMusicData(it) - setMusicData(nextMusicData) - if(playing){ - play() - } - } + MusicModel.clickNextMusic() } interface IMusicPlayingViewCallback { @@ -109,44 +44,26 @@ class MusicPlayingViewModel : ViewModel(), AuditionManager.MusicDataChangeListen fun setProgress(currentPlay: Long, duration: Long) } - override fun updateState(oldData:MusicData?,musicData: MusicData) { - checkMusicData?.let { - if(it.id==musicData.id){ - it.state = musicData.state - UiThreadHandler.post { - viewCallback?.setPlayOrpause(it) - } - } - } - } - override fun updatePlayCurrent(currentPlay: Long, duration: Long, musicData: MusicData){ - checkMusicData?.let { - if(it.id==musicData.id){ - UiThreadHandler.post { - viewCallback?.setProgress(currentPlay, duration) - } - } - } - } - - override fun onMusicCompletion(musicData: MusicData) { - super.onMusicCompletion(musicData) - CallerLogger.d(TAG, "onMusicCompletion:${GsonUtils.toJson(musicData)}") - checkMusicData?.let { - if(it.id==musicData.id){ - it.state = musicData.state - UiThreadHandler.post { - viewCallback?.setPlayOrpause(it) - } - } - } - val nextMusicData = AuditionManager.getNextMusicData(musicData) - CallerLogger.d(TAG, "onMusicCompletion-nextMusic:${GsonUtils.toJson(nextMusicData)}") - setMusicData(nextMusicData) - play() - } - fun seekTo(progress: Int) { - AuditionManager.seekTo(progress) + MusicModel.seekTo(progress) + } + + override fun checkChangeListener(musicData: MusicData) { + CallerLogger.d(TAG, "showData:setMusicData:${musicData}") + BizLoopManager.runInMainThread{ + this.viewCallback?.setViewData(musicData) + } + } + + override fun updatePlayCurrent(currentPlay: Long, duration: Long, second: MusicData) { + BizLoopManager.runInMainThread{ + this.viewCallback?.setProgress(currentPlay,duration) + } + } + + override fun updateState(oldData: MusicData?, musicData: MusicData) { + BizLoopManager.runInMainThread{ + this.viewCallback?.setPlayOrpause(musicData) + } } } \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/orderinfo/ItineraryView.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/orderinfo/ItineraryView.kt index c85830a99c..052e19fc76 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/orderinfo/ItineraryView.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/orderinfo/ItineraryView.kt @@ -14,11 +14,8 @@ import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.findViewTreeViewModelStoreOwner import com.mogo.och.unmanned.taxi.passenger.R import kotlinx.android.synthetic.main.taxt_u_p_itinerary.view.actv_arrived_time -import kotlinx.android.synthetic.main.taxt_u_p_itinerary.view.actv_distance -import kotlinx.android.synthetic.main.taxt_u_p_itinerary.view.actv_distance_unit import kotlinx.android.synthetic.main.taxt_u_p_itinerary.view.actv_endstation -import kotlinx.android.synthetic.main.taxt_u_p_itinerary.view.actv_surplus_time -import kotlinx.android.synthetic.main.taxt_u_p_itinerary.view.actv_surplus_time_unit +import kotlinx.android.synthetic.main.taxt_u_p_itinerary.view.actv_surplus import kotlinx.android.synthetic.main.taxt_u_p_itinerary.view.progress_distance import me.jessyan.autosize.utils.AutoSizeUtils @@ -44,10 +41,26 @@ class ItineraryView : ConstraintLayout, OrderInfoViewModel.ItineraryViewCallback } private fun setDrawable(normal:Boolean) { + + val corner = AutoSizeUtils.dp2px(context, 20f).toFloat() + val cornerTop = AutoSizeUtils.dp2px(context, 20f).toFloat() + + + + + + + val bottomColorEnd = ContextCompat.getColor(context, R.color.taxi_cp_80D4E4F0) + val bottomColorStart = ContextCompat.getColor(context, R.color.taxi_cp_A3C9EA) + + val temp01 = GradientDrawable() + temp01.cornerRadii = floatArrayOf(0f, 0f, 0f, 0f, corner, corner, corner, corner) + temp01.colors = intArrayOf(bottomColorStart, bottomColorEnd) + temp01.orientation = GradientDrawable.Orientation.LEFT_RIGHT + + val gradientDrawable = GradientDrawable() gradientDrawable.shape = GradientDrawable.RECTANGLE - val corner = AutoSizeUtils.dp2px(context, 40f).toFloat() - val cornerTop = AutoSizeUtils.dp2px(context, 20f).toFloat() if(normal) { gradientDrawable.cornerRadii = floatArrayOf(0f, 0f, cornerTop, cornerTop, cornerTop, cornerTop, corner, corner) @@ -55,20 +68,19 @@ class ItineraryView : ConstraintLayout, OrderInfoViewModel.ItineraryViewCallback gradientDrawable.cornerRadii = floatArrayOf(0f, 0f, 0f, 0f, corner, corner, corner, corner) } + val firstColor = ContextCompat.getColor(context, R.color.taxi_p_0F5FFF) val setondColor = ContextCompat.getColor(context, R.color.taxi_p_44C8FF) val thirdColor = ContextCompat.getColor(context, R.color.taxi_p_8AE4ED) val fourceColor = ContextCompat.getColor(context, R.color.taxi_p_C8F3F4) - val bottomColor = ContextCompat.getColor(context, android.R.color.transparent) + gradientDrawable.colors = intArrayOf(firstColor, setondColor, thirdColor, fourceColor) gradientDrawable.orientation = GradientDrawable.Orientation.LEFT_RIGHT - - val temp01 = GradientDrawable() - temp01.cornerRadii = floatArrayOf(0f, 0f, 0f, 0f, corner, corner, corner, corner) - temp01.colors = intArrayOf(bottomColor, bottomColor) - val scaleDrawable3 = ScaleDrawable(gradientDrawable, Gravity.START, 1f, -1f) + + val arr = arrayOf(temp01, scaleDrawable3) + val ld = LayerDrawable(arr) ld.setDrawableByLayerId(android.R.id.background, temp01) ld.setDrawableByLayerId(android.R.id.progress, scaleDrawable3) @@ -101,12 +113,10 @@ class ItineraryView : ConstraintLayout, OrderInfoViewModel.ItineraryViewCallback surplusTime:String,surplusTimeUnit:String, arrivedTime:String,alreadyGone:Int,stationDistance:Int ){ - actv_distance.text = surplusdistance - actv_distance_unit.text = distanceUnit - actv_surplus_time .text= surplusTime - actv_surplus_time_unit.text = surplusTimeUnit actv_arrived_time.text= arrivedTime + actv_surplus.text = "剩余${surplusdistance}${distanceUnit},${surplusTime}${surplusTimeUnit}" + if(stationDistance>0&&alreadyGone{ - UiThreadHandler.post { + BizLoopManager.runInMainThread { viewCallback?.setDistanceInfo( "--", disUnit, "--", surplusTimeUnit, "--", 0, 100 ) diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/overmapview/OverMapView.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/overmapview/OverMapView.kt index 0c1c9a9989..bd935d0252 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/overmapview/OverMapView.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/overmapview/OverMapView.kt @@ -6,7 +6,7 @@ import android.graphics.drawable.GradientDrawable import android.os.Bundle import android.util.AttributeSet import android.view.LayoutInflater -import android.widget.RelativeLayout +import androidx.constraintlayout.widget.ConstraintLayout import com.google.android.flexbox.AlignItems import com.google.android.flexbox.FlexDirection import com.google.android.flexbox.FlexWrap @@ -24,7 +24,7 @@ class OverMapView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 -) : RelativeLayout(context, attrs, defStyleAttr){ +) : ConstraintLayout(context, attrs, defStyleAttr){ private var iconListItemAdapter:IconListItemAdapter?=null diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/rootview/RootViewConstrainLayout.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/rootview/RootViewConstrainLayout.kt new file mode 100644 index 0000000000..07b13ff122 --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/rootview/RootViewConstrainLayout.kt @@ -0,0 +1,100 @@ +package com.mogo.och.unmanned.passenger.ui.rootview + +import android.content.Context +import android.util.AttributeSet +import android.view.MotionEvent +import android.view.View +import android.widget.CheckBox +import androidx.constraintlayout.widget.ConstraintLayout +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.och.unmanned.taxi.passenger.R + +class RootViewConstrainLayout : ConstraintLayout { + + private val TAG = "LockView" + + constructor(context: Context) : super(context) + + constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet) + + constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int) : super( + context, + attributeSet, + defStyleAttr + ) + + private var light_setting: View?=null + private var voice_setting:View?=null + private var cb_setting_light: CheckBox?=null + private var cb_setting_voice:CheckBox?=null + + override fun onAttachedToWindow() { + light_setting = findViewById(R.id.light_setting) + voice_setting = findViewById(R.id.voice_setting) + + cb_setting_light = findViewById(R.id.cb_setting_light) + cb_setting_voice = findViewById(R.id.cb_setting_voice) + super.onAttachedToWindow() + } + + override fun onDetachedFromWindow() { + cb_setting_light = null + cb_setting_voice = null + super.onDetachedFromWindow() + } + + override fun onInterceptTouchEvent(event: MotionEvent?): Boolean { + + event?.let { + if (it.action==MotionEvent.ACTION_DOWN) { + val needInterceptLight = needIntercept(it, light_setting)// + val needInterceptLightCheckBox = needIntercept(it, cb_setting_light)// + + if(needInterceptLight&&needInterceptLightCheckBox){ + if(cb_setting_light?.isChecked==true){ + cb_setting_light?.isChecked = false + } + } + + val needInterceptVoice = needIntercept(it, voice_setting)// + val pressCbSettingVoice = needIntercept(it, cb_setting_voice)// + + if(needInterceptVoice&&pressCbSettingVoice){ + if(cb_setting_voice?.isChecked==true){ + cb_setting_voice?.isChecked = false + } + } + } + } + + CallerLogger.d("LockViewConstrainLayout", "是否拦截") + return super.onInterceptTouchEvent(event) + } + + /** + * event 事件 落在了view 外部 + */ + private fun needIntercept(event: MotionEvent,view: View?):Boolean { + view?.apply { + val location = IntArray(2) + getLocationInWindow(location) + CallerLogger.d( + "LockViewConstrainLayout", + "${location[0]}---${location[1]}--${location[0] + width}---${location[1] + height}---${event.rawX}----${event.rawY}" + ) + val mleft = location[0] + val mtop = location[1] + val mright = location[0] + width + val mbottom = location[1] + height + if (event.rawX > mleft && event.rawX < mright && event.rawY > mtop && event.rawY < mbottom) { + CallerLogger.d("LockViewConstrainLayout", "不拦截") + // 不拦截 + return false + } + } + return true + } + + + +} \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/setting/LightSetting.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/setting/LightSetting.kt new file mode 100644 index 0000000000..8e6359b534 --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/setting/LightSetting.kt @@ -0,0 +1,40 @@ +package com.mogo.och.unmanned.passenger.ui.setting + +import android.content.Context +import android.util.AttributeSet +import com.mogo.eagle.core.utilcode.util.ActivityUtils +import com.mogo.eagle.core.utilcode.util.BrightnessUtils +import com.mogo.och.common.module.utils.NumberFormatUtil + + +class LightSetting @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : VerticalSeekBar(context, attrs, defStyleAttr) { + + private val TAG = "LightSetting" + + override fun upDateLight(percentaget: Float) { +// if (!Settings.System.canWrite(context)) { +// CallerRequestActivityHandleManager.requestPermission( +// TAG, +// Settings.ACTION_MANAGE_WRITE_SETTINGS +// ) +// return +// } + +// if (BrightnessUtils.isAutoBrightnessEnabled()) { + BrightnessUtils.setWindowBrightness(ActivityUtils.getTopActivity().window,(percentaget*255).toInt()) +// } else { +// BrightnessUtils.setAutoBrightnessEnabled(true) +// } + } + + override fun initLightAndVoice(){ + val percentaget = BrightnessUtils.getWindowBrightness(ActivityUtils.getTopActivity().window).toFloat() / 255 + setHeightBar(1-percentaget) + setTextValue(NumberFormatUtil.percentage(percentaget,0)) + } + +} \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/setting/TaxiPSettingView.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/setting/TaxiPSettingView.kt deleted file mode 100644 index 3b6050f4cd..0000000000 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/setting/TaxiPSettingView.kt +++ /dev/null @@ -1,180 +0,0 @@ -package com.mogo.och.unmanned.passenger.ui.setting - -import android.annotation.SuppressLint -import android.content.Context -import android.content.Intent -import android.graphics.drawable.ClipDrawable -import android.graphics.drawable.Drawable -import android.graphics.drawable.LayerDrawable -import android.media.AudioManager -import android.provider.Settings -import android.text.TextUtils -import android.util.AttributeSet -import android.view.Gravity -import android.view.LayoutInflater -import android.view.View -import android.widget.SeekBar -import androidx.constraintlayout.widget.ConstraintLayout -import androidx.core.content.ContextCompat -import com.mogo.commons.module.intent.IMogoIntentListener -import com.mogo.commons.module.intent.IntentManager -import com.mogo.commons.module.receiver.MogoReceiver -import com.mogo.commons.module.receiver.MogoReceiver.ACTION_VOLUME_CHANGE -import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener -import com.mogo.eagle.core.function.call.setting.CallerRequestActivityHandleManager -import com.mogo.eagle.core.utilcode.util.BrightnessUtils -import com.mogo.eagle.core.utilcode.util.ThreadUtils -import com.mogo.och.common.module.wigets.MineGradientDrawable -import com.mogo.och.unmanned.taxi.passenger.R -import kotlinx.android.synthetic.main.taxi_p_setting_view.view.* -import me.jessyan.autosize.utils.AutoSizeUtils - -class TaxiPSettingView @JvmOverloads constructor( - context: Context, - attrs: AttributeSet? = null, - defStyleAttr: Int = 0 -) : ConstraintLayout(context, attrs, defStyleAttr), IMoGoAutopilotStatusListener, - IMogoIntentListener { - - companion object { - const val TAG = "TaxiPSettingView" - } - - init { - LayoutInflater.from(context).inflate(R.layout.taxi_p_setting_view, this, true) - initView() - } - - private var mAudioManager: AudioManager? = null - private var mMaxVolume: Int? = 15 - - @SuppressLint("NewApi") - private fun initView() { - sb_light_bar.setProgressDrawableTiled(getDrawable()) - sb_light_bar.max = 100 - sb_light_bar.min = 5 - sb_light_bar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { - override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { - tvSoundPer.text = "$progress%" - if (fromUser) { - if (!Settings.System.canWrite(context)) { - CallerRequestActivityHandleManager.requestPermission( - TAG, - Settings.ACTION_MANAGE_WRITE_SETTINGS - ) - return - } - if (BrightnessUtils.isAutoBrightnessEnabled()) { - BrightnessUtils.setBrightness(((progress.toFloat() / 100) * 255).toInt()) - } else { - BrightnessUtils.setAutoBrightnessEnabled(true) - } - } - } - - override fun onStartTrackingTouch(seekBar: SeekBar?) {} - override fun onStopTrackingTouch(seekBar: SeekBar?) {} - }) - sb_light_bar.progress = (BrightnessUtils.getBrightness() * 100) / 255 - - sb_voice_bar.setProgressDrawableTiled(getDrawable()) - sb_voice_bar.max = 100 - sb_voice_bar.min = 5 - sb_voice_bar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { - override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { - tvVoicePer.text = "$progress%" - if (fromUser) { - mMaxVolume?.let { - var currentValue = ((progress.toFloat() / 100) * it).toInt() - if (currentValue <= 0) { - currentValue = 1 - } - mAudioManager?.setStreamVolume( - AudioManager.STREAM_MUSIC, - currentValue, - AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE - ) - } - } - } - - override fun onStartTrackingTouch(seekBar: SeekBar?) {} - override fun onStopTrackingTouch(seekBar: SeekBar?) {} - }) - - context?.let { - mAudioManager = it.getSystemService(Context.AUDIO_SERVICE) as AudioManager - mMaxVolume = mAudioManager?.getStreamMaxVolume(AudioManager.STREAM_MUSIC) - updateVolume() - } - } - - private fun updateVolume() { - val mCurrentVolume = mAudioManager?.getStreamVolume(AudioManager.STREAM_MUSIC) - mMaxVolume?.let { max -> - mCurrentVolume?.let { current -> - if (current == 1) { - sb_voice_bar.progress = 5 - tvVoicePer.text = "5%" - } else { - val fl = current.toFloat() / max * 100 - sb_voice_bar.progress = fl.toInt() - tvVoicePer.text = "${fl.toInt()}%" - } - } - } - } - - private fun getDrawable(): Drawable { - val dp2px = AutoSizeUtils.dp2px(context, 26f)//进度条高度 - val color2CBFFC = ContextCompat.getColor(context, R.color.taxi_cp_2CBFFC) - val color1060FF = ContextCompat.getColor(context, R.color.taxi_cp_1060ff) - val color96A5C2 = ContextCompat.getColor(context, R.color.taxi_cp_96a5c2) - val temp03 = MineGradientDrawable(color2CBFFC, color1060FF, dp2px) - val clipDrawable3 = ClipDrawable(temp03, Gravity.START, ClipDrawable.HORIZONTAL) - val temp01 = MineGradientDrawable(color96A5C2, color96A5C2, dp2px) - val arr = arrayOf(temp01, clipDrawable3) - val ld = LayerDrawable(arr) - ld.setDrawableByLayerId(android.R.id.background, temp01) - ld.setDrawableByLayerId(android.R.id.progress, clipDrawable3) - return ld - } - - override fun onAttachedToWindow() { - super.onAttachedToWindow() - IntentManager.getInstance().registerIntentListener(ACTION_VOLUME_CHANGE, this) - } - - override fun onDetachedFromWindow() { - super.onDetachedFromWindow() - IntentManager.getInstance().unregisterIntentListener(ACTION_VOLUME_CHANGE, this) - } - - override fun onWindowVisibilityChanged(visibility: Int) { - super.onWindowVisibilityChanged(visibility) - if (visibility == View.VISIBLE) { - sb_light_bar.progress = (BrightnessUtils.getBrightness() * 100) / 255 - } - } - - override fun onWindowFocusChanged(hasWindowFocus: Boolean) { - super.onWindowFocusChanged(hasWindowFocus) - if (hasWindowFocus) { - sb_light_bar.progress = (BrightnessUtils.getBrightness() * 100) / 255 - } - } - - override fun onIntentReceived(intentStr: String?, intent: Intent?) { - if (TextUtils.equals(ACTION_VOLUME_CHANGE, intentStr)) { - if (intent!!.getIntExtra( - MogoReceiver.EXTRA_VOLUME_STREAM_TYPE, -1 - ) == AudioManager.STREAM_MUSIC - ) { - ThreadUtils.runOnUiThread { - updateVolume() - } - } - } - } - -} \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/setting/VerticalSeekBar.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/setting/VerticalSeekBar.kt new file mode 100644 index 0000000000..c7812e4501 --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/setting/VerticalSeekBar.kt @@ -0,0 +1,165 @@ +package com.mogo.och.unmanned.passenger.ui.setting + +import android.animation.ObjectAnimator +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.MotionEvent +import android.view.View +import android.widget.ImageView +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.constraintlayout.widget.ConstraintSet +import androidx.core.view.marginBottom +import androidx.core.view.marginTop +import com.mogo.eagle.core.utilcode.kotlin.onClick +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.mgintelligent.speech.iflytek.WakeManager +import com.mogo.och.common.module.utils.NumberFormatUtil +import com.mogo.och.unmanned.taxi.passenger.R +import kotlinx.android.synthetic.main.taxi_p_setting_light_view.view.tv_current_value + +open class VerticalSeekBar @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : ConstraintLayout(context, attrs, defStyleAttr) { + + lateinit var draggableButton: ImageView + var maxHeightValue = 0 + + private var marginTop:Int = 0 + private var marginBottom:Int = 0 + + private val TAG = "VerticalSeekBar" + + + init { + LayoutInflater.from(context).inflate(R.layout.taxi_p_setting_light_view, this, true) + background = resources.getDrawable(R.drawable.taxi_p_voice_bg) + initView() + } + + private fun initView() { + draggableButton = findViewById(R.id.aciv_voice_thum) + marginTop = draggableButton.marginTop + marginBottom = draggableButton.marginBottom + } + + override fun onVisibilityAggregated(isVisible: Boolean) { + super.onVisibilityAggregated(isVisible) + if(isVisible){ + post { + maxHeightValue = height-marginBottom-marginTop-draggableButton.height + initLightAndVoice() + } + } + } + + private var initialX = 0f + private var initialY = 0f + private val tempSet = ConstraintSet() + + /** + * 为该组件的触碰事件重写事件处理方法 + */ + override fun onTouchEvent(event: MotionEvent?): Boolean { + when (event?.action) { + MotionEvent.ACTION_DOWN -> { + initialX = event.rawX; + initialY = event.rawY; + } + MotionEvent.ACTION_MOVE -> { + + if(draggableButton.translationY<0){ + draggableButton.translationY = 0f + return true + }else if (draggableButton.translationY+marginTop>(height)){ + tempSet.clone(this) + tempSet.setTranslationY(draggableButton.id,(height-marginTop).toFloat()) + tempSet.applyTo(this) + return true + } + + val dx = event.rawX - initialX; + val dy = event.rawY - initialY; + initialX = event.rawX; + initialY = event.rawY; + if(draggableButton.translationY+dy<0){ + return true + } + if(draggableButton.translationY+dy+marginBottom+marginTop+draggableButton.height>height){ + return true + } + CallerLogger.d(TAG,"旧的dy:${draggableButton.translationY}") + + tempSet.clone(this) + tempSet.setTranslationY(draggableButton.id,draggableButton.translationY+dy) + tempSet.applyTo(this) + CallerLogger.d(TAG,"新的dy:${draggableButton.translationY}") + + setTextValue(NumberFormatUtil.percentage(getPercentaget(),0)) + upDateLight(getPercentaget()) + } + + MotionEvent.ACTION_UP -> { + + } + else -> {} + } + return true + } + + private fun getPercentaget(): Float { + var percentaget = draggableButton.translationY / maxHeightValue + if (percentaget > 0.99) { + percentaget = 0.0f + draggableButton.translationY = maxHeightValue.toFloat() + } else if (percentaget < 0.01) { + percentaget = 1.0f + draggableButton.translationY = 0f + }else{ + percentaget = 1-percentaget + } + return percentaget + } + + open fun upDateLight(percentaget: Float) { + + } + + /** + * + */ + open fun initLightAndVoice(){ + + } + + fun setTextValue(value:String){ + tv_current_value.text = value + } + + fun setHeightBar(percentaget:Float){ + val currentLight = percentaget * maxHeightValue + ObjectAnimator.ofFloat( + draggableButton, "translationY", draggableButton.translationY, + currentLight + ).apply { + duration = 500 + }.start() + } + + override fun onWindowVisibilityChanged(visibility: Int) { + super.onWindowVisibilityChanged(visibility) + if (visibility == View.VISIBLE) { + initLightAndVoice() + } + } + + override fun onWindowFocusChanged(hasWindowFocus: Boolean) { + super.onWindowFocusChanged(hasWindowFocus) + if (hasWindowFocus) { + initLightAndVoice() + } + } + +} \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/setting/VoiceSetting.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/setting/VoiceSetting.kt new file mode 100644 index 0000000000..744efee0d9 --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/setting/VoiceSetting.kt @@ -0,0 +1,59 @@ +package com.mogo.och.unmanned.passenger.ui.setting + +import android.content.Context +import android.media.AudioManager +import android.util.AttributeSet +import com.mogo.och.common.module.utils.NumberFormatUtil + + +class VoiceSetting @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : VerticalSeekBar(context, attrs, defStyleAttr) { + + private val TAG = "VoiceSetting" + + private var mAudioManager: AudioManager? = null + private var mMaxVolume: Int = -1 + + + override fun upDateLight(percentaget: Float) { + context?.let { ctx -> + if (mAudioManager == null) { + mAudioManager = ctx.getSystemService(Context.AUDIO_SERVICE) as AudioManager + } + mAudioManager?.let { + if (mMaxVolume < 0) { + mMaxVolume = it.getStreamMaxVolume(AudioManager.STREAM_MUSIC) + } + val currentValue = (percentaget * mMaxVolume).toInt() + mAudioManager?.setStreamVolume( + AudioManager.STREAM_MUSIC, + currentValue, + AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE + ) + } + } + + } + + override fun initLightAndVoice(){ + context?.let {ctx-> + if(mAudioManager==null) { + mAudioManager = ctx.getSystemService(Context.AUDIO_SERVICE) as AudioManager + } + mAudioManager?.let { + if(mMaxVolume<0) { + mMaxVolume = it.getStreamMaxVolume(AudioManager.STREAM_MUSIC) + } + val mCurrentVolume = it.getStreamVolume(AudioManager.STREAM_MUSIC) + val percentaget = mCurrentVolume.toFloat() / mMaxVolume + setHeightBar(1-percentaget) + setTextValue(NumberFormatUtil.percentage(percentaget,0)) + } + + } + } + +} \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/speed/SpeedView.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/speed/SpeedView.kt index beaa25c9fc..37aec98da1 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/speed/SpeedView.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/speed/SpeedView.kt @@ -9,6 +9,7 @@ import com.mogo.eagle.core.data.map.MogoLocation import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Listener import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.mogo.och.bridge.autopilot.location.OchLocationManager +import com.mogo.och.common.module.manager.loop.BizLoopManager import com.mogo.och.unmanned.taxi.passenger.R import kotlinx.android.synthetic.main.taxt_u_p_speed.view.actv_speed_value import kotlin.math.abs @@ -48,7 +49,7 @@ class SpeedView : ConstraintLayout, IMoGoChassisLocationGCJ02Listener { override fun onChassisLocationGCJ02(mogoLocation: MogoLocation?) { mogoLocation?.let { - UiThreadHandler.post { + BizLoopManager.runInMainThread { val speedKM = (abs(it.gnssSpeed) * 3.6f).toInt() actv_speed_value.text = speedKM.toString() } diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/statusview/StatusBarView.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/statusview/StatusBarView.kt index b23c6035c9..13f5dbd5a3 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/statusview/StatusBarView.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/statusview/StatusBarView.kt @@ -11,14 +11,18 @@ import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager import com.mogo.eagle.core.function.call.setting.CallerSkinModeListenerManager import com.mogo.eagle.core.function.hmi.ui.setting.ToggleDebugView +import com.mogo.eagle.core.utilcode.kotlin.onClick import com.mogo.eagle.core.utilcode.util.ActivityUtils +import com.mogo.mgintelligent.speech.iflytek.WakeManager import com.mogo.och.bridge.autopilot.autopilot.IOchAutopilotStatusListener import com.mogo.och.bridge.autopilot.autopilot.OchAutoPilotStatusListenerManager import com.mogo.och.common.module.manager.debug.DebugViewWatchDogFragment import com.mogo.och.unmanned.passenger.ui.debug.DebugEvent import com.mogo.och.unmanned.taxi.passenger.R +import kotlinx.android.synthetic.main.taxt_u_p_statusview.view.bcsv_status import kotlinx.android.synthetic.main.taxt_u_p_statusview.view.vShowDebugView import kotlinx.android.synthetic.main.taxt_u_p_statusview.view.iv_biz_icon +import kotlinx.android.synthetic.main.taxt_u_p_statusview.view.textClockDate import me.jessyan.autosize.utils.AutoSizeUtils import org.greenrobot.eventbus.EventBus import java.lang.ref.WeakReference @@ -56,7 +60,6 @@ class StatusBarView @JvmOverloads constructor( init { LayoutInflater.from(context).inflate(R.layout.taxt_u_p_statusview, this, true) - setBackgroundResource(R.drawable.taxt_u_p_status_bg) isClickable = true isFocusable = true } diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/systemsetting/TaxiPSettingView.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/systemsetting/TaxiPSettingView.kt deleted file mode 100644 index 9b4c47c9cb..0000000000 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/systemsetting/TaxiPSettingView.kt +++ /dev/null @@ -1,183 +0,0 @@ -package com.mogo.och.unmanned.passenger.ui.systemsetting - -import android.annotation.SuppressLint -import android.content.Context -import android.content.Intent -import android.graphics.drawable.ClipDrawable -import android.graphics.drawable.Drawable -import android.graphics.drawable.LayerDrawable -import android.media.AudioManager -import android.provider.Settings -import android.text.TextUtils -import android.util.AttributeSet -import android.view.Gravity -import android.view.LayoutInflater -import android.view.View -import android.widget.SeekBar -import androidx.constraintlayout.widget.ConstraintLayout -import androidx.core.content.ContextCompat -import com.mogo.commons.module.intent.IMogoIntentListener -import com.mogo.commons.module.intent.IntentManager -import com.mogo.commons.module.receiver.MogoReceiver -import com.mogo.commons.module.receiver.MogoReceiver.ACTION_VOLUME_CHANGE -import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener -import com.mogo.eagle.core.function.call.setting.CallerRequestActivityHandleManager -import com.mogo.eagle.core.utilcode.util.BrightnessUtils -import com.mogo.eagle.core.utilcode.util.ThreadUtils -import com.mogo.och.common.module.wigets.MineGradientDrawable -import com.mogo.och.unmanned.taxi.passenger.R -import kotlinx.android.synthetic.main.taxt_u_p_setting_view.view.sb_light_bar -import kotlinx.android.synthetic.main.taxt_u_p_setting_view.view.sb_voice_bar -import kotlinx.android.synthetic.main.taxt_u_p_setting_view.view.tvSoundPer -import kotlinx.android.synthetic.main.taxt_u_p_setting_view.view.tvVoicePer -import me.jessyan.autosize.utils.AutoSizeUtils - -class TaxiPSettingView @JvmOverloads constructor( - context: Context, - attrs: AttributeSet? = null, - defStyleAttr: Int = 0 -) : ConstraintLayout(context, attrs, defStyleAttr), IMoGoAutopilotStatusListener, - IMogoIntentListener { - - companion object { - const val TAG = "TaxiPSettingView" - } - - init { - LayoutInflater.from(context).inflate(R.layout.taxt_u_p_setting_view, this, true) - initView() - } - - private var mAudioManager: AudioManager? = null - private var mMaxVolume: Int? = 15 - - @SuppressLint("NewApi") - private fun initView() { - sb_light_bar.setProgressDrawableTiled(getDrawable()) - sb_light_bar.max = 100 - sb_light_bar.min = 5 - sb_light_bar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { - override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { - tvSoundPer.text = "$progress%" - if (fromUser) { - if (!Settings.System.canWrite(context)) { - CallerRequestActivityHandleManager.requestPermission( - TAG, - Settings.ACTION_MANAGE_WRITE_SETTINGS - ) - return - } - if (BrightnessUtils.isAutoBrightnessEnabled()) { - BrightnessUtils.setBrightness(((progress.toFloat() / 100) * 255).toInt()) - } else { - BrightnessUtils.setAutoBrightnessEnabled(true) - } - } - } - - override fun onStartTrackingTouch(seekBar: SeekBar?) {} - override fun onStopTrackingTouch(seekBar: SeekBar?) {} - }) - sb_light_bar.progress = (BrightnessUtils.getBrightness() * 100) / 255 - - sb_voice_bar.setProgressDrawableTiled(getDrawable()) - sb_voice_bar.max = 100 - sb_voice_bar.min = 5 - sb_voice_bar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { - override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { - tvVoicePer.text = "$progress%" - if (fromUser) { - mMaxVolume?.let { - var currentValue = ((progress.toFloat() / 100) * it).toInt() - if (currentValue <= 0) { - currentValue = 1 - } - mAudioManager?.setStreamVolume( - AudioManager.STREAM_MUSIC, - currentValue, - AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE - ) - } - } - } - - override fun onStartTrackingTouch(seekBar: SeekBar?) {} - override fun onStopTrackingTouch(seekBar: SeekBar?) {} - }) - - context?.let { - mAudioManager = it.getSystemService(Context.AUDIO_SERVICE) as AudioManager - mMaxVolume = mAudioManager?.getStreamMaxVolume(AudioManager.STREAM_MUSIC) - updateVolume() - } - } - - private fun updateVolume() { - val mCurrentVolume = mAudioManager?.getStreamVolume(AudioManager.STREAM_MUSIC) - mMaxVolume?.let { max -> - mCurrentVolume?.let { current -> - if (current == 1) { - sb_voice_bar.progress = 5 - tvVoicePer.text = "5%" - } else { - val fl = current.toFloat() / max * 100 - sb_voice_bar.progress = fl.toInt() - tvVoicePer.text = "${fl.toInt()}%" - } - } - } - } - - private fun getDrawable(): Drawable { - val dp2px = AutoSizeUtils.dp2px(context, 26f)//进度条高度 - val color2CBFFC = ContextCompat.getColor(context, R.color.taxi_p_2CBFFC) - val color1060FF = ContextCompat.getColor(context, R.color.taxi_p_1060ff) - val color96A5C2 = ContextCompat.getColor(context, R.color.taxi_p_96a5c2) - val temp03 = MineGradientDrawable(color2CBFFC, color1060FF, dp2px) - val clipDrawable3 = ClipDrawable(temp03, Gravity.START, ClipDrawable.HORIZONTAL) - val temp01 = MineGradientDrawable(color96A5C2, color96A5C2, dp2px) - val arr = arrayOf(temp01, clipDrawable3) - val ld = LayerDrawable(arr) - ld.setDrawableByLayerId(android.R.id.background, temp01) - ld.setDrawableByLayerId(android.R.id.progress, clipDrawable3) - return ld - } - - override fun onAttachedToWindow() { - super.onAttachedToWindow() - IntentManager.getInstance().registerIntentListener(ACTION_VOLUME_CHANGE, this) - } - - override fun onDetachedFromWindow() { - super.onDetachedFromWindow() - IntentManager.getInstance().unregisterIntentListener(ACTION_VOLUME_CHANGE, this) - } - - override fun onWindowVisibilityChanged(visibility: Int) { - super.onWindowVisibilityChanged(visibility) - if (visibility == View.VISIBLE) { - sb_light_bar.progress = (BrightnessUtils.getBrightness() * 100) / 255 - } - } - - override fun onWindowFocusChanged(hasWindowFocus: Boolean) { - super.onWindowFocusChanged(hasWindowFocus) - if (hasWindowFocus) { - sb_light_bar.progress = (BrightnessUtils.getBrightness() * 100) / 255 - } - } - - override fun onIntentReceived(intentStr: String?, intent: Intent?) { - if (TextUtils.equals(ACTION_VOLUME_CHANGE, intentStr)) { - if (intent!!.getIntExtra( - MogoReceiver.EXTRA_VOLUME_STREAM_TYPE, -1 - ) == AudioManager.STREAM_MUSIC - ) { - ThreadUtils.runOnUiThread { - updateVolume() - } - } - } - } - -} \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/video/InfoVideoView.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/video/InfoVideoView.kt index 0e7df5a5de..c30791465c 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/video/InfoVideoView.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/video/InfoVideoView.kt @@ -1,35 +1,41 @@ package com.mogo.och.unmanned.passenger.ui.video import android.content.Context -import android.graphics.Color +import android.graphics.drawable.Drawable import android.util.AttributeSet import android.view.LayoutInflater import android.view.View -import android.widget.FrameLayout import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.view.isVisible import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.CenterCrop +import com.bumptech.glide.load.resource.bitmap.RoundedCorners +import com.bumptech.glide.request.RequestOptions import com.mogo.eagle.core.function.main.MainMoGoApplication +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.util.GsonUtils -import com.mogo.eagle.core.utilcode.util.UiThreadHandler +import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.mogo.och.common.module.manager.audiofocus.AudioFocusManager +import com.mogo.och.common.module.manager.loop.BizLoopManager +import com.mogo.och.common.module.wigets.WrapContentLinearLayoutManager import com.mogo.och.common.module.wigets.media.IMediaDataSourceListener import com.mogo.och.common.module.wigets.media.MediaDataSourceManager import com.mogo.och.common.module.wigets.media.MediaFileCacheManager import com.mogo.och.common.module.wigets.media.MediaItem import com.mogo.och.common.module.wigets.media.MediaPlayLogger import com.mogo.och.unmanned.passenger.bean.TaxiPassengerVideoPlay -import com.mogo.och.unmanned.taxi.passenger.R -import com.mogo.och.unmanned.passenger.ui.video.layoutmanage.CarouselLayoutManager -import com.mogo.och.unmanned.passenger.ui.video.layoutmanage.CarouselZoomPostLayoutListener -import com.mogo.och.unmanned.passenger.ui.video.layoutmanage.CenterScrollListener +import com.mogo.och.unmanned.passenger.ui.video.RecyclerVideoAdapterNew.OnThumbImageClilckListener import com.mogo.och.unmanned.passenger.widget.ConsultVideoPlayer -import com.mogo.och.unmanned.passenger.widget.indicator.IndicatorView -import com.mogo.och.unmanned.passenger.widget.indicator.enums.IndicatorOrientation -import com.mogo.och.unmanned.passenger.widget.indicator.enums.IndicatorSlideMode -import com.mogo.och.unmanned.passenger.widget.indicator.enums.IndicatorStyle +import com.mogo.och.unmanned.taxi.passenger.R +import com.mogo.skin.utils.SkinResources import com.shuyu.gsyvideoplayer.GSYVideoManager +import com.shuyu.gsyvideoplayer.listener.GSYSampleCallBack import com.shuyu.gsyvideoplayer.video.base.GSYVideoView -import kotlin.math.floor +import kotlinx.android.synthetic.main.taxt_u_p_mogo_video_layout.view.image_item_player +import kotlinx.android.synthetic.main.taxt_u_p_mogo_video_layout.view.infoVideoPlaylist +import kotlinx.android.synthetic.main.taxt_u_p_mogo_video_layout.view.tv_playing_title +import kotlinx.android.synthetic.main.taxt_u_p_mogo_video_layout.view.video_item_player /** * @author ChenFufeng @@ -39,7 +45,7 @@ internal class InfoVideoView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 -) : FrameLayout( +) : ConstraintLayout( context, attrs, defStyleAttr @@ -49,38 +55,57 @@ internal class InfoVideoView @JvmOverloads constructor( private const val TAG = "VideoView" } + private val mediaList = mutableListOf() + + //新的数据,在view不展示的时候完成新数据更新 + private val mNewMediaList = mutableListOf() + + private var currentMedia: TaxiPassengerVideoPlay? = null + + private var currentMediaIndex = 0 + + var placeholderDrawable: Drawable = SkinResources.getInstance().getDrawable(R.drawable.taxi_p_road_video_bg) + + init { LayoutInflater.from(context).inflate(R.layout.taxt_u_p_mogo_video_layout, this, true) initView() } - private var rvVideoPlaylist: RecyclerView? = null - private lateinit var indicatorView: IndicatorView - private lateinit var clContain: ConstraintLayout - private val mediaList = mutableListOf() - //新的数据,在view不展示的时候完成新数据更新 - private val mNewMediaList = mutableListOf() fun exitFullScreenMode(resetVideoPlayer: Boolean) { - val carouselLayoutManager = rvVideoPlaylist?.layoutManager as CarouselLayoutManager - val (_: Int, player) = getPlayer(carouselLayoutManager) - player?.let { - it.exitFullScreenMode() - it.onVideoPause() - if (resetVideoPlayer) { - it.onVideoReset() - } + video_item_player.exitFullScreenMode() + video_item_player.onVideoPause() + if (resetVideoPlayer) { + video_item_player.onVideoReset() } + + } + + override fun onVisibilityAggregated(isVisible: Boolean) { + super.onVisibilityAggregated(isVisible) + if(!isVisible){ + video_item_player.onVideoPause() + } + } + + override fun onVisibilityChanged(changedView: View, visibility: Int) { + super.onVisibilityChanged(changedView, visibility) } override fun onAttachedToWindow() { super.onAttachedToWindow() - initData() MediaFileCacheManager.createFileCacheDir(MainMoGoApplication.getApp().applicationContext) MediaDataSourceManager.init(TAG, object : IMediaDataSourceListener { override fun onMediaDataSourceChanged(list: List) { val isNewData = mediaList.isNotEmpty() - MediaPlayLogger.printInfoLog("onMediaDataSourceChanged:isNewData=$isNewData, dataSize=${list.size}, list=${GsonUtils.toJson(list)}") + MediaPlayLogger.printInfoLog( + "onMediaDataSourceChanged:isNewData=$isNewData, dataSize=${list.size}, list=${ + GsonUtils.toJson( + list + ) + }" + ) val localMediaList = mutableListOf() list.forEach { val taxiPassengerVideoPlay = TaxiPassengerVideoPlay( @@ -110,155 +135,91 @@ internal class InfoVideoView @JvmOverloads constructor( private fun updateMediaListDataAndView(newList: MutableList) { mediaList.clear() mediaList.addAll(newList) - UiThreadHandler.post { - initData() - } - } - - override fun onVisibilityChanged(changedView: View, visibility: Int) { - super.onVisibilityChanged(changedView, visibility) - if (changedView != this) { - return - } - val carouselLayoutManager = rvVideoPlaylist?.layoutManager as CarouselLayoutManager - val (_: Int, player) = getPlayer(carouselLayoutManager) - when (visibility) { - View.VISIBLE -> { - player?.let { - if (!player.isIfCurrentIsFullscreen) { - when (player.currentState) { - GSYVideoView.CURRENT_STATE_PAUSE -> { - //player.onVideoResume(false) - } - - else -> {} - } - } - } - } - - else -> { - player?.let { - if (!player.isIfCurrentIsFullscreen) { - player.onVideoPause() - } - } - try { - // 在播放完成的时机更新整体数据 - if (mNewMediaList.isNotEmpty()) { - updateMediaListDataAndView(mNewMediaList) - mNewMediaList.clear() - MediaPlayLogger.printInfoLog("onVisibilityChanged, 宣传视频数据已更新") - } - } catch (e: Exception) { - e.printStackTrace() - } - } + BizLoopManager.runInMainThread { + updateData() + infoVideoPlaylist.adapter?.notifyDataSetChanged() } } private fun initView() { - rvVideoPlaylist = findViewById(R.id.infoVideoPlaylist) - indicatorView = findViewById(R.id.infoIndicatorView) - clContain = findViewById(R.id.infoContainer) - } - - private fun initData() { - val carouselLayoutManager = - CarouselLayoutManager( - CarouselLayoutManager.HORIZONTAL, - true - ) - carouselLayoutManager.setPostLayoutListener(CarouselZoomPostLayoutListener()) - carouselLayoutManager.maxVisibleItems = 1 - indicatorView.notifyDataChanged(mediaList.size) - indicatorView.setSlideMode(IndicatorSlideMode.SCALE) - indicatorView.setOrientation(IndicatorOrientation.INDICATOR_HORIZONTAL) - indicatorView.setIndicatorStyle(IndicatorStyle.ROUND_RECT) - indicatorView.setSliderColor( - Color.parseColor("#80FFFFFF"), Color.parseColor("#3FACFD"), - Color.parseColor("#3FACFD") - ) - indicatorView.setSliderWidth(9f, 54f) - indicatorView.setSliderHeight(9f) - indicatorView.setSliderGap(36f) - rvVideoPlaylist?.addOnScrollListener(object : CenterScrollListener() { - var prePlayerPosition = 0 - override fun pageSelect(recyclerView: RecyclerView?, newState: Int) { - //播放视频 - val (centerItemPosition: Int, player) = getPlayer(carouselLayoutManager) - indicatorView.onPageSelected(centerItemPosition) - if (player is ConsultVideoPlayer) { - if (prePlayerPosition != centerItemPosition) { - if (player.currentState == GSYVideoView.CURRENT_STATE_PAUSE) { - player.onVideoReset() - } - val playerHolder = - carouselLayoutManager.findViewByPosition(prePlayerPosition) - val prePlayer = - playerHolder?.findViewById(R.id.video_item_player) - prePlayer?.onVideoReset() - } else { - player.onVideoResume(false) + infoVideoPlaylist.layoutManager = + WrapContentLinearLayoutManager(context, RecyclerView.VERTICAL, false) + infoVideoPlaylist.addItemDecoration(SpacesItemDecoration(40, 140)) + infoVideoPlaylist.adapter = RecyclerVideoAdapterNew(context, mediaList).apply { + setOnThumbImageClilckListener(object : OnThumbImageClilckListener{ + override fun onDxChanged(targetPosition: Int) { + currentMediaIndex = targetPosition + updateData() + } + }) + } + video_item_player.onStatusChangeListener = object :ConsultVideoPlayer.OnPlayStatusListener{ + override fun onStatusChange(status: Int) { + mediaList.forEachIndexed { index, taxiPassengerVideoPlay -> + if (taxiPassengerVideoPlay.isPlayiing) { + taxiPassengerVideoPlay.isPlayiing = false + infoVideoPlaylist.adapter?.notifyItemChanged(index) + } + } + when (status) { + GSYVideoView.CURRENT_STATE_PLAYING ->{ + currentMedia?.isPlayiing = true + infoVideoPlaylist.adapter?.notifyItemChanged(currentMediaIndex) + AudioFocusManager.setVideoFocusChange(true) + } + else ->{ + currentMedia?.isPlayiing = false + infoVideoPlaylist.adapter?.notifyItemChanged(currentMediaIndex) + AudioFocusManager.setVideoFocusChange(false) } } - prePlayerPosition = centerItemPosition - MediaPlayLogger.printInfoLog("pageSelect, currentPosition=$prePlayerPosition") } - override fun pageStop() { - val (_: Int, player) = getPlayer(carouselLayoutManager) - if (player is ConsultVideoPlayer) { - player.onVideoPause() + } + video_item_player.setVideoAllCallBack(object : GSYSampleCallBack() { + override fun onAutoComplete(url: String?, vararg objects: Any?) { + if (currentMediaIndex + 1 >= mediaList.size) { + currentMediaIndex = 0 + } else { + currentMediaIndex += 1 } + updateData() + } + + override fun onClickStartIcon(url: String?, vararg objects: Any?) { + CallerLogger.d(TAG,"开始播放了:${url}") + } + + override fun onPlayError(url: String?, vararg objects: Any?) { + ToastUtils.showLong("哎呀,出错了,看看其他视频吧") + } + + override fun onClickStartError(url: String?, vararg objects: Any?) { + ToastUtils.showLong("哎呀,出错了,看看其他视频吧") } }) - carouselLayoutManager.addOnDargAutoDiffListener { adapterPosition, currentPosition -> - val fl = adapterPosition - floor(adapterPosition) - var currentIndex = currentPosition - if (fl > 0.5) { - if (currentPosition == 0) { - currentIndex = rvVideoPlaylist?.adapter!!.itemCount - 1 - } else { - currentIndex -= 1 + } + + private fun updateData() { + if (mediaList.isNotEmpty() && currentMediaIndex < mediaList.size) { + currentMedia = mediaList[currentMediaIndex] + tv_playing_title.text = currentMedia?.title + currentMedia?.let { + if(it.type==MediaItem.MEDIA_TYPE_IMAGE) { + video_item_player.onVideoReset() + video_item_player.visibility = View.GONE + image_item_player.visibility = View.VISIBLE + Glide.with(context) + .load(it.url) + .apply(RequestOptions() + .transform(CenterCrop(),RoundedCorners(12)).placeholder(placeholderDrawable)) + .into(image_item_player) + }else{ + video_item_player.visibility = View.VISIBLE + image_item_player.visibility = View.GONE + video_item_player.setData(currentMedia!!) } } - indicatorView.onPageScrolled(currentIndex, fl, 0) - } - val recyclerVideoAdapter = - RecyclerVideoAdapter( - context, - mediaList, - rvVideoPlaylist - ) - recyclerVideoAdapter.setOnThumbImageClilckListener { - val (_: Int, player) = getPlayer(carouselLayoutManager) - if (player is ConsultVideoPlayer) { - player.onVideoReset() - player.thumbImageViewLayout.visibility = View.VISIBLE - } - rvVideoPlaylist?.smoothScrollToPosition(it) - } - rvVideoPlaylist?.layoutManager = carouselLayoutManager - rvVideoPlaylist?.setHasFixedSize(true) - rvVideoPlaylist?.adapter = recyclerVideoAdapter - } - - private fun getPlayer(carouselLayoutManager: CarouselLayoutManager): Pair { - val centerItemPosition: Int = carouselLayoutManager.centerItemPosition - val playerHolder = carouselLayoutManager.findViewByPosition(centerItemPosition) - val player = playerHolder?.findViewById(R.id.video_item_player) - return Pair(centerItemPosition, player) - } - - override fun onWindowFocusChanged(hasWindowFocus: Boolean) { - super.onWindowFocusChanged(hasWindowFocus) - val carouselLayoutManager = rvVideoPlaylist?.layoutManager as CarouselLayoutManager - val (_: Int, player) = getPlayer(carouselLayoutManager) - player?.let { - if (it.isInPlayingState && !it.isIfCurrentIsFullscreen && !hasWindowFocus) { - player.onVideoPause() - } } } diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/video/RecyclerVideoAdapter.java b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/video/RecyclerVideoAdapter.java index c895d429ae..6bc8df9efb 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/video/RecyclerVideoAdapter.java +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/video/RecyclerVideoAdapter.java @@ -73,7 +73,7 @@ public class RecyclerVideoAdapter extends RecyclerView.Adapter +) : RecyclerView.Adapter() { + private var onThumbImageClilckListener: OnThumbImageClilckListener? = null + + + val placeholderDrawable = SkinResources.getInstance().getDrawable(R.drawable.taxi_p_road_video_bg) + + fun setOnThumbImageClilckListener(onThumbImageClilckListener: OnThumbImageClilckListener?) { + this.onThumbImageClilckListener = onThumbImageClilckListener + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SwitchLineViewHolder { + val v = + LayoutInflater.from(context).inflate(R.layout.taxt_u_p_list_video_item, parent, false) + return SwitchLineViewHolder(v) + } + + override fun onBindViewHolder(holder: SwitchLineViewHolder, position: Int) { + + AutoSizeCompat.autoConvertDensityOfGlobal(holder.itemView.resources) + + val currentPosition = holder.bindingAdapterPosition + val taxiPassengerVideoPlay = itemDataList[currentPosition] + val isVideo = taxiPassengerVideoPlay.type == MediaItem.MEDIA_TYPE_VIDEO + + holder.adName.text = taxiPassengerVideoPlay.title + + val imageUrl = if (isVideo) { + taxiPassengerVideoPlay.imageUrl + } else { + taxiPassengerVideoPlay.url + } + + Glide.with(context) + .load(imageUrl) + .apply(RequestOptions().placeholder(placeholderDrawable).centerCrop()) + .into(holder.adHeader) + holder.itemView.setOnClickListener { + this.onThumbImageClilckListener?.onDxChanged(currentPosition) + } + + if(taxiPassengerVideoPlay.isPlayiing){ + holder.isPlaying.visibility = View.VISIBLE + }else{ + holder.isPlaying.visibility = View.GONE + } + + } + + override fun getItemCount(): Int { + return itemDataList.size + } + + override fun getItemViewType(position: Int): Int { + return 1 + } + + class SwitchLineViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val adHeader: AppCompatImageView = itemView.findViewById(R.id.video_item_image)//线路名称 + val adName: AppCompatTextView = itemView.findViewById(R.id.actv_video_head)//线路名称 + val isPlaying: AppCompatImageView = itemView.findViewById(R.id.aciv_playing_bar) //终点 + } + + + interface OnThumbImageClilckListener { + fun onDxChanged(targetPosition: Int) + } + + companion object { + private const val TAG = "RecyclerVideoAdapter" + } +} diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/video/RoundedViewConstrainLayout.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/video/RoundedViewConstrainLayout.kt new file mode 100644 index 0000000000..3b992d1a76 --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/video/RoundedViewConstrainLayout.kt @@ -0,0 +1,35 @@ +package com.mogo.och.unmanned.passenger.ui.video + +import android.content.Context +import android.util.AttributeSet +import android.view.MotionEvent +import android.view.View +import android.widget.CheckBox +import androidx.constraintlayout.widget.ConstraintLayout +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.widget.media.video.TextureVideoViewOutlineProvider +import com.mogo.och.unmanned.taxi.passenger.R +import me.jessyan.autosize.utils.AutoSizeUtils + +class RoundedViewConstrainLayout : ConstraintLayout { + + private val TAG = "LockView" + + constructor(context: Context) : super(context) + + constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet) + + constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int) : super( + context, + attributeSet, + defStyleAttr + ) + + override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) { + super.onSizeChanged(w, h, oldw, oldh) + this.outlineProvider = TextureVideoViewOutlineProvider(AutoSizeUtils.dp2px(context,36f).toFloat()) + this.clipToOutline = true + } + + +} \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/video/SpacesItemDecoration.java b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/video/SpacesItemDecoration.java new file mode 100644 index 0000000000..c06c9baeb8 --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/video/SpacesItemDecoration.java @@ -0,0 +1,37 @@ +package com.mogo.och.unmanned.passenger.ui.video; + +import android.graphics.Rect; +import android.view.View; + +import androidx.recyclerview.widget.RecyclerView; + +/** + * 这是LinearLayoutManager设置Item间距的的一个辅助类 + * + * @author donghongyu + */ +public class SpacesItemDecoration extends RecyclerView.ItemDecoration { + private final int space; + private final int top; + + public SpacesItemDecoration(int space,int top) { + this.space = space; + this.top = top; + } + + @Override + public void getItemOffsets(Rect outRect, View view, + RecyclerView parent, RecyclerView.State state) { + int pos = parent.getChildAdapterPosition(view); + RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams)view.getLayoutParams(); + if(pos == 0){ + layoutParams.setMargins(0,top,0,space); + }else { + layoutParams.setMargins(0,0,0,space); + } + + view.setLayoutParams(layoutParams); + + super.getItemOffsets(outRect, view, parent, state); + } +} diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/ConsultVideoPlayer.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/ConsultVideoPlayer.kt index 1f1a938879..2d6af4d7fe 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/ConsultVideoPlayer.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/ConsultVideoPlayer.kt @@ -3,11 +3,13 @@ package com.mogo.och.unmanned.passenger.widget import android.app.Activity import android.content.Context import android.graphics.Color +import android.graphics.drawable.Drawable import android.graphics.drawable.GradientDrawable import android.os.Build import android.util.AttributeSet import android.util.TypedValue import android.view.Gravity +import android.view.MotionEvent import android.view.Surface import android.view.View import android.view.ViewGroup @@ -17,15 +19,22 @@ import android.widget.TextView import androidx.appcompat.widget.AppCompatImageView import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.app.ActivityCompat +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.util.TAG import com.mogo.eagle.core.utilcode.util.TimeTransformUtils import com.mogo.eagle.core.utilcode.util.ToastUtils import com.mogo.eagle.core.widget.media.video.TextureVideoViewOutlineProvider import com.mogo.och.common.module.manager.audiofocus.AudioFocusManager import com.mogo.och.common.module.wigets.media.MediaItem +import com.mogo.och.unmanned.passenger.bean.TaxiPassengerVideoPlay import com.mogo.och.unmanned.passenger.ui.statusview.StatusBarView -import com.mogo.och.unmanned.taxi.passenger.R import com.mogo.och.unmanned.passenger.ui.video.FullVideoUtils import com.mogo.och.unmanned.passenger.utils.ZoomDrawable +import com.mogo.och.unmanned.taxi.passenger.R +import com.mogo.skin.utils.SkinResources +import com.shuyu.gsyvideoplayer.builder.GSYVideoOptionBuilder import com.shuyu.gsyvideoplayer.listener.VideoAllCallBack import com.shuyu.gsyvideoplayer.utils.GSYVideoType import com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer @@ -49,7 +58,6 @@ class ConsultVideoPlayer : StandardGSYVideoPlayer { private lateinit var totalTimeTextView: TextView private lateinit var aivStartPlay: AppCompatImageView private lateinit var layoutBottom: ConstraintLayout - private lateinit var vPpenLeft: View private var fullVideoPlayer:ConsultVideoPlayer?=null var smalllPlayer:ConsultVideoPlayer?=null @@ -57,6 +65,14 @@ class ConsultVideoPlayer : StandardGSYVideoPlayer { private var currentTime = 0 private var fileType = 0 + private var imageUrl = "" + + private var gsyVideoOptionBuilder: GSYVideoOptionBuilder? = null + + var placeholderDrawable: Drawable = SkinResources.getInstance().getDrawable(R.drawable.taxi_p_road_video_bg) + var placeholderBigDrawable: Drawable = SkinResources.getInstance().getDrawable(R.drawable.taxi_p_road_video_big_bg) + + var onStatusChangeListener:OnPlayStatusListener?= null constructor(context: Context?) : super(context) constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) @@ -71,7 +87,6 @@ class ConsultVideoPlayer : StandardGSYVideoPlayer { totalTimeTextView = findViewById(R.id.total) aivStartPlay = findViewById(R.id.aiv_start_play) layoutBottom = findViewById(R.id.layout_bottom) - vPpenLeft = findViewById(R.id.v_open_left) fullscreenButton.setOnClickListener(this) aivStartPlay.setOnClickListener(this) if (mThumbImageViewLayout != null @@ -87,7 +102,6 @@ class ConsultVideoPlayer : StandardGSYVideoPlayer { } private fun addDrageAnchor(){ - vPpenLeft.visibility = VISIBLE layoutBottom.post { val layoutParams = layoutBottom.layoutParams as ConstraintLayout.LayoutParams layoutParams.setMargins(333,0,333,90) @@ -134,6 +148,8 @@ class ConsultVideoPlayer : StandardGSYVideoPlayer { } override fun updateStartImage() { + CallerLogger.d(TAG,"当前的状态:${mCurrentState}") + this.onStatusChangeListener?.onStatusChange(mCurrentState) when (mCurrentState) { GSYVideoView.CURRENT_STATE_PLAYING ->{ start.setImageResource(R.drawable.notice_video_pause) @@ -168,7 +184,7 @@ class ConsultVideoPlayer : StandardGSYVideoPlayer { } } - override fun touchDoubleUp() { + override fun touchDoubleUp(e: MotionEvent?) { } @@ -186,6 +202,7 @@ class ConsultVideoPlayer : StandardGSYVideoPlayer { override fun changeUiToPlayingShow() { super.changeUiToPlayingShow() setViewShowState(fullscreenButton, VISIBLE) + setViewShowState(mStartButton, VISIBLE); this.statusBarView?.visibility = View.VISIBLE } @@ -202,6 +219,19 @@ class ConsultVideoPlayer : StandardGSYVideoPlayer { override fun changeUiToPlayingBufferingShow() { super.changeUiToPlayingBufferingShow() this.statusBarView?.visibility = View.VISIBLE + setViewShowState(mStartButton, VISIBLE); + } + override fun changeUiToPrepareingClear() { + super.changeUiToPrepareingClear() + setViewShowState(mStartButton, VISIBLE); + } + override fun changeUiToPlayingBufferingClear() { + super.changeUiToPlayingBufferingClear() + setViewShowState(mStartButton, VISIBLE); + } + override fun changeUiToClear() { + super.changeUiToClear() + setViewShowState(mStartButton, VISIBLE); } override fun changeUiToCompleteShow() { @@ -215,23 +245,23 @@ class ConsultVideoPlayer : StandardGSYVideoPlayer { } override fun setProgressAndTime( - progress: Int, - secProgress: Int, - currentTime: Int, - totalTime: Int, - forceChange: Boolean + progress: Long, + secProgress: Long, + currentTime: Long, + totalTime: Long, + forceChange: Boolean ) { super.setProgressAndTime(progress, secProgress, currentTime, totalTime, forceChange) //时间显示 - currentTimeTextView.text = TimeTransformUtils.stringForTime(currentTime) - totalTimeTextView.text = TimeTransformUtils.stringForTime(totalTime) + currentTimeTextView.text = TimeTransformUtils.stringForTime(currentTime.toInt()) + totalTimeTextView.text = TimeTransformUtils.stringForTime(totalTime.toInt()) if(currentTime>=totalTime-3000){// this.currentTime = -1 }else{ - this.currentTime = currentTime + this.currentTime = currentTime.toInt() } - if (progress != 0) { - mProgressBar?.progress = progress + if (progress != 0L) { + mProgressBar?.progress = progress.toInt() } } @@ -360,14 +390,14 @@ class ConsultVideoPlayer : StandardGSYVideoPlayer { private fun startWindowFullscreenOwn(context:Context){ val gsyBaseVideoPlayer = startWindowFullscreen(context) gsyBaseVideoPlayer?.let { - val gsyVideoPlayer = it as StandardGSYVideoPlayer + val gsyVideoPlayer = it as ConsultVideoPlayer gsyVideoPlayer.setLockClickListener(mLockClickListener) gsyVideoPlayer.isNeedLockFull = isNeedLockFull initFullUI(gsyVideoPlayer) } } - private fun initFullUI(standardGSYVideoPlayer: StandardGSYVideoPlayer) { + private fun initFullUI(standardGSYVideoPlayer: ConsultVideoPlayer) { if (mBottomProgressDrawable != null) { standardGSYVideoPlayer.setBottomProgressBarDrawable(mBottomProgressDrawable) } @@ -390,6 +420,10 @@ class ConsultVideoPlayer : StandardGSYVideoPlayer { ) } standardGSYVideoPlayer.titleTextView?.text = titleTextView.text + Glide.with(context) + .load(standardGSYVideoPlayer.imageUrl) + .apply(RequestOptions().placeholder(placeholderBigDrawable).centerCrop()) + .into(standardGSYVideoPlayer.coverImage) } private fun startWindowFullscreen(context:Context):GSYBaseVideoPlayer?{ @@ -540,11 +574,36 @@ class ConsultVideoPlayer : StandardGSYVideoPlayer { } fun showOrHideStartPlayButton(isShow: Boolean) { - if (fileType == MediaItem.MEDIA_TYPE_IMAGE) { - aivStartPlay?.visibility = View.GONE - return - } aivStartPlay?.visibility = if (isShow ) View.VISIBLE else View.GONE } + fun playStatusListener(){ + + } + + fun setData(currentMedia: TaxiPassengerVideoPlay) { + + setFileType(currentMedia.type) + if(gsyVideoOptionBuilder==null){ + gsyVideoOptionBuilder = GSYVideoOptionBuilder() + } + gsyVideoOptionBuilder + ?.setEnlargeImageRes(R.drawable.taxt_u_p_change_full) + ?.setUrl(currentMedia.url) + ?.setCacheWithPlay(true) + ?.setPlayTag(currentMedia.url) + ?.setThumbPlay(false) + ?.setStartAfterPrepared(currentMedia.type == MediaItem.MEDIA_TYPE_VIDEO) + ?.build(this) + imageUrl = currentMedia.imageUrl + Glide.with(context) + .load(currentMedia.imageUrl) + .apply(RequestOptions().placeholder(placeholderDrawable).centerCrop()) + .into(coverImage) + } + + interface OnPlayStatusListener { + fun onStatusChange(status: Int) + } + } diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/IndicatorView.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/IndicatorView.kt deleted file mode 100644 index 9dcef43d9c..0000000000 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/IndicatorView.kt +++ /dev/null @@ -1,68 +0,0 @@ -package com.mogo.och.unmanned.passenger.widget.indicator - -import android.content.Context -import android.graphics.Canvas -import android.util.AttributeSet -import com.mogo.och.unmanned.passenger.widget.indicator.annotation.AIndicatorOrientation - -import com.mogo.och.unmanned.passenger.widget.indicator.base.BaseIndicatorView -import com.mogo.och.unmanned.passenger.widget.indicator.drawer.DrawerProxy -import com.mogo.och.unmanned.passenger.widget.indicator.enums.IndicatorOrientation -import com.mogo.och.unmanned.passenger.widget.indicator.option.AttrsController -import com.mogo.och.unmanned.passenger.widget.indicator.option.IndicatorOptions - -class IndicatorView @JvmOverloads constructor( - context: Context, - attrs: AttributeSet? = null, - defStyleAttr: Int = 0 -) : BaseIndicatorView(context, attrs, defStyleAttr) { - - private var mDrawerProxy: DrawerProxy - - init { - AttrsController.initAttrs(context, attrs, mIndicatorOptions) - mDrawerProxy = DrawerProxy(mIndicatorOptions) - } - - override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) { - super.onLayout(changed, left, top, right, bottom) - mDrawerProxy.onLayout(changed, left, top, right, bottom) - } - - override fun onMeasure( - widthMeasureSpec: Int, - heightMeasureSpec: Int - ) { - super.onMeasure(widthMeasureSpec, heightMeasureSpec) - val measureResult = mDrawerProxy.onMeasure(widthMeasureSpec, heightMeasureSpec) - setMeasuredDimension(measureResult.measureWidth, measureResult.measureHeight) - } - - override fun onDraw(canvas: Canvas) { - super.onDraw(canvas) - rotateCanvas(canvas) - mDrawerProxy.onDraw(canvas) - } - - override fun setIndicatorOptions(options: IndicatorOptions) { - super.setIndicatorOptions(options) - mDrawerProxy.setIndicatorOptions(options) - } - - override fun notifyDataChanged(itemCount:Int) { - mDrawerProxy = DrawerProxy(mIndicatorOptions) - super.notifyDataChanged(itemCount) - } - - private fun rotateCanvas(canvas: Canvas) { - if (mIndicatorOptions.orientation == IndicatorOrientation.INDICATOR_VERTICAL) { - canvas.rotate(90f, width / 2f, width / 2f) - } else if (mIndicatorOptions.orientation == IndicatorOrientation.INDICATOR_RTL) { - canvas.rotate(180f, width / 2f, height / 2f) - } - } - - fun setOrientation(@AIndicatorOrientation orientation: Int) { - mIndicatorOptions.orientation = orientation - } -} diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/annotation/AIndicatorOrientation.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/annotation/AIndicatorOrientation.kt deleted file mode 100644 index fa93f87e08..0000000000 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/annotation/AIndicatorOrientation.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.mogo.och.unmanned.passenger.widget.indicator.annotation - -import androidx.annotation.IntDef -import com.mogo.och.unmanned.passenger.widget.indicator.enums.IndicatorOrientation - -/** - * - * @author zhangpan - * @date 2021/1/21 - */ -@IntDef( - IndicatorOrientation.INDICATOR_HORIZONTAL, IndicatorOrientation.INDICATOR_VERTICAL, - IndicatorOrientation.INDICATOR_RTL -) -@kotlin.annotation.Retention(AnnotationRetention.SOURCE) -@Target(AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.FIELD) -annotation class AIndicatorOrientation() diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/annotation/AIndicatorSlideMode.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/annotation/AIndicatorSlideMode.kt deleted file mode 100644 index 1d897b30e8..0000000000 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/annotation/AIndicatorSlideMode.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.mogo.och.unmanned.passenger.widget.indicator.annotation - -import androidx.annotation.IntDef -import com.mogo.och.unmanned.passenger.widget.indicator.enums.IndicatorSlideMode.Companion.NORMAL -import com.mogo.och.unmanned.passenger.widget.indicator.enums.IndicatorSlideMode.Companion.SMOOTH -import com.mogo.och.unmanned.passenger.widget.indicator.enums.IndicatorSlideMode.Companion.WORM -import com.mogo.och.unmanned.passenger.widget.indicator.enums.IndicatorSlideMode.Companion.COLOR -import com.mogo.och.unmanned.passenger.widget.indicator.enums.IndicatorSlideMode.Companion.SCALE - -/** - *

- * Created by zhangpan on 2019-10-18.
- * Description:
-
* - */ -@IntDef(NORMAL, SMOOTH, WORM, COLOR, SCALE) -@kotlin.annotation.Retention(AnnotationRetention.SOURCE) -@Target(AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.FIELD) -annotation class AIndicatorSlideMode diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/annotation/AIndicatorStyle.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/annotation/AIndicatorStyle.kt deleted file mode 100644 index 007c9eca5f..0000000000 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/annotation/AIndicatorStyle.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.mogo.och.unmanned.passenger.widget.indicator.annotation - -import androidx.annotation.IntDef -import com.mogo.och.unmanned.passenger.widget.indicator.enums.IndicatorStyle - -/** - *
- * Created by zhangpan on 2019-10-18.
- * Description:
-
* - */ -@IntDef(IndicatorStyle.CIRCLE, IndicatorStyle.DASH, IndicatorStyle.ROUND_RECT) -@kotlin.annotation.Retention(AnnotationRetention.SOURCE) -@Target(AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.FIELD) -annotation class AIndicatorStyle diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/base/BaseIndicatorView.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/base/BaseIndicatorView.kt deleted file mode 100644 index 2dd118276e..0000000000 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/base/BaseIndicatorView.kt +++ /dev/null @@ -1,203 +0,0 @@ -package com.mogo.och.unmanned.passenger.widget.indicator.base - -import android.content.Context -import android.util.AttributeSet -import android.view.View - -import androidx.annotation.ColorInt -import androidx.recyclerview.widget.RecyclerView -import com.mogo.och.unmanned.passenger.widget.indicator.annotation.AIndicatorSlideMode -import com.mogo.och.unmanned.passenger.widget.indicator.annotation.AIndicatorStyle -import com.mogo.och.unmanned.passenger.widget.indicator.enums.IndicatorSlideMode -import com.mogo.och.unmanned.passenger.widget.indicator.option.IndicatorOptions - -/** - *
- * Created by zhangpan on 2019-09-04.
- * Description:IndicatorView基类,处理了页面滑动。
- * 
- */ -@Suppress("UNUSED") -open class BaseIndicatorView constructor( - context: Context, - attrs: AttributeSet?, - defStyleAttr: Int -) : View(context, attrs, defStyleAttr), IIndicator { - - var mIndicatorOptions: IndicatorOptions - - private var recyclerView: RecyclerView? = null - - init { - mIndicatorOptions = IndicatorOptions() - } - - fun setPageSize(pageSize: Int): BaseIndicatorView { - mIndicatorOptions.pageSize = pageSize - return this - } - - // 页面选定 - fun onPageSelected(position: Int) { - if (getSlideMode() == IndicatorSlideMode.NORMAL) { - setCurrentPosition(position) - setSlideProgress(0f) - invalidate() - } - } - - // 滚动距离 - fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) { - if (getSlideMode() != IndicatorSlideMode.NORMAL && getPageSize() > 1) { - scrollSlider(position, positionOffset) - invalidate() - } - } - - private fun scrollSlider(position: Int, positionOffset: Float) { - if (mIndicatorOptions.slideMode == IndicatorSlideMode.SCALE - || mIndicatorOptions.slideMode == IndicatorSlideMode.COLOR) { - setCurrentPosition(position) - setSlideProgress(positionOffset) - } else { - if (position % getPageSize() == getPageSize() - 1) { // 最后一个页面与第一个页面 - if (positionOffset < 0.5) { - setCurrentPosition(position) - setSlideProgress(0f) - } else { - setCurrentPosition(0) - setSlideProgress(0f) - } - } else { // 中间页面 - setCurrentPosition(position) - setSlideProgress(positionOffset) - } - } - } - - override fun notifyDataChanged(itemCount: Int) { - setPageSize(itemCount) - requestLayout() - invalidate() - } - - private fun setupViewPager() { - - } - - fun getNormalSlideWidth(): Float { - return mIndicatorOptions.normalSliderWidth - } - - fun setNormalSlideWidth(normalSliderWidth: Float) { - mIndicatorOptions.normalSliderWidth = normalSliderWidth - } - - fun getCheckedSlideWidth(): Float { - return mIndicatorOptions.checkedSliderWidth - } - - fun setCheckedSlideWidth(checkedSliderWidth: Float) { - mIndicatorOptions.checkedSliderWidth = checkedSliderWidth - } - - val checkedSliderWidth: Float - get() = mIndicatorOptions.checkedSliderWidth - - fun setCurrentPosition(currentPosition: Int) { - mIndicatorOptions.currentPosition = currentPosition - } - - fun getCurrentPosition(): Int { - return mIndicatorOptions.currentPosition - } - - fun getIndicatorGap(indicatorGap: Float) { - mIndicatorOptions.sliderGap = indicatorGap - } - - fun setIndicatorGap(indicatorGap: Float) { - mIndicatorOptions.sliderGap = indicatorGap - } - - fun setCheckedColor(@ColorInt normalColor: Int) { - mIndicatorOptions.checkedSliderColor = normalColor - } - - fun getCheckedColor(): Int { - return mIndicatorOptions.checkedSliderColor - } - - fun setNormalColor(@ColorInt normalColor: Int) { - mIndicatorOptions.normalSliderColor = normalColor - } - - fun getSlideProgress(): Float { - return mIndicatorOptions.slideProgress - } - - fun setSlideProgress(slideProgress: Float) { - mIndicatorOptions.slideProgress = slideProgress - } - - fun getPageSize(): Int { - return mIndicatorOptions.pageSize - } - - fun setSliderColor( - @ColorInt normalColor: Int, - @ColorInt selectedColor: Int, - @ColorInt selectedEndColor: Int - ): BaseIndicatorView { - mIndicatorOptions.setSliderColor(normalColor, selectedColor,selectedEndColor) - return this - } - - fun setSliderWidth(sliderWidth: Float): BaseIndicatorView { - mIndicatorOptions.setSliderWidth(sliderWidth) - return this - } - - fun setSliderWidth( - normalSliderWidth: Float, - selectedSliderWidth: Float - ): BaseIndicatorView { - mIndicatorOptions.setSliderWidth(normalSliderWidth, selectedSliderWidth) - return this - } - - fun setSliderGap(sliderGap: Float): BaseIndicatorView { - mIndicatorOptions.sliderGap = sliderGap - return this - } - - fun getSlideMode(): Int { - return mIndicatorOptions.slideMode - } - - fun setSlideMode(@AIndicatorSlideMode slideMode: Int): BaseIndicatorView { - mIndicatorOptions.slideMode = slideMode - return this - } - - fun setIndicatorStyle(@AIndicatorStyle indicatorStyle: Int): BaseIndicatorView { - mIndicatorOptions.indicatorStyle = indicatorStyle - return this - } - - fun setSliderHeight(sliderHeight: Float): BaseIndicatorView { - mIndicatorOptions.sliderHeight = sliderHeight - return this - } - - fun showIndicatorWhenOneItem(showIndicatorWhenOneItem: Boolean) { - mIndicatorOptions.showIndicatorOneItem = showIndicatorWhenOneItem - } - - fun onPageScrollStateChanged(state: Int) { - } - - override fun setIndicatorOptions(options: IndicatorOptions) { - mIndicatorOptions = options - } -} diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/base/IIndicator.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/base/IIndicator.kt deleted file mode 100644 index 6ca305bb51..0000000000 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/base/IIndicator.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.mogo.och.unmanned.passenger.widget.indicator.base - -import com.mogo.och.unmanned.passenger.widget.indicator.option.IndicatorOptions - -/** - *
- * Created by zhangpan on 2019-09-02.
- * Description:
-
* - */ -interface IIndicator { - - fun notifyDataChanged(itemCount:Int) - - fun setIndicatorOptions(options: IndicatorOptions) -} diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/drawer/BaseDrawer.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/drawer/BaseDrawer.kt deleted file mode 100644 index 8fb291c677..0000000000 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/drawer/BaseDrawer.kt +++ /dev/null @@ -1,93 +0,0 @@ -package com.mogo.och.unmanned.passenger.widget.indicator.drawer - -import android.animation.ArgbEvaluator -import android.graphics.Paint -import com.mogo.och.unmanned.passenger.widget.indicator.enums.IndicatorOrientation -import com.mogo.och.unmanned.passenger.widget.indicator.enums.IndicatorSlideMode -import com.mogo.och.unmanned.passenger.widget.indicator.option.IndicatorOptions - -/** - *
- * Created by zhpan on 2019/11/23.
- * Description:
-
* - */ -abstract class BaseDrawer internal constructor(internal var mIndicatorOptions: IndicatorOptions) : - IDrawer { - - private val mMeasureResult: MeasureResult - internal var maxWidth: Float = 0.toFloat() - internal var minWidth: Float = 0.toFloat() - internal var mPaint: Paint = Paint() - internal var argbEvaluator: ArgbEvaluator? = null - - companion object { - const val INDICATOR_PADDING_ADDITION = 6 - const val INDICATOR_PADDING = 3 - } - - protected val isWidthEquals: Boolean - get() = mIndicatorOptions.normalSliderWidth == mIndicatorOptions.checkedSliderWidth - - init { - mPaint.isAntiAlias = true - mMeasureResult = MeasureResult() - if (mIndicatorOptions.slideMode == IndicatorSlideMode.SCALE - || mIndicatorOptions.slideMode == IndicatorSlideMode.COLOR - ) { - argbEvaluator = ArgbEvaluator() - } - } - - override fun onMeasure( - widthMeasureSpec: Int, - heightMeasureSpec: Int - ): MeasureResult { - maxWidth = - mIndicatorOptions.normalSliderWidth.coerceAtLeast(mIndicatorOptions.checkedSliderWidth) - minWidth = - mIndicatorOptions.normalSliderWidth.coerceAtMost(mIndicatorOptions.checkedSliderWidth) - if (mIndicatorOptions.orientation == IndicatorOrientation.INDICATOR_VERTICAL) { - mMeasureResult.setMeasureResult(measureHeight(), measureWidth()) - } else { - mMeasureResult.setMeasureResult(measureWidth(), measureHeight()) - } - return mMeasureResult - } - - protected open fun measureHeight(): Int { - return mIndicatorOptions.sliderHeight.toInt() + INDICATOR_PADDING - } - - private fun measureWidth(): Int { - val pageSize = mIndicatorOptions.pageSize - val indicatorGap = mIndicatorOptions.sliderGap - return ((pageSize - 1) * indicatorGap + maxWidth + (pageSize - 1) * minWidth).toInt() + INDICATOR_PADDING_ADDITION - } - - override fun onLayout( - changed: Boolean, - left: Int, - top: Int, - right: Int, - bottom: Int - ) { - } - - inner class MeasureResult { - - var measureWidth: Int = 0 - internal set - - var measureHeight: Int = 0 - internal set - - internal fun setMeasureResult( - measureWidth: Int, - measureHeight: Int - ) { - this.measureWidth = measureWidth - this.measureHeight = measureHeight - } - } -} diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/drawer/CircleDrawer.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/drawer/CircleDrawer.kt deleted file mode 100644 index d2c08b10dc..0000000000 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/drawer/CircleDrawer.kt +++ /dev/null @@ -1,156 +0,0 @@ -package com.mogo.och.unmanned.passenger.widget.indicator.drawer - -import android.graphics.Canvas -import android.graphics.RectF -import com.mogo.och.unmanned.passenger.widget.indicator.enums.IndicatorSlideMode -import com.mogo.och.unmanned.passenger.widget.indicator.option.IndicatorOptions -import com.mogo.och.unmanned.passenger.widget.indicator.utils.IndicatorUtils - -/** - *
- * Created by zhpan on 2019/11/23.
- * Description: Circle Indicator drawer.
-
* - */ -class CircleDrawer internal constructor(indicatorOptions: IndicatorOptions) : BaseDrawer( - indicatorOptions -) { - - private val rectF = RectF() - - override fun measureHeight(): Int { - return maxWidth.toInt() + INDICATOR_PADDING_ADDITION - } - - override fun onDraw(canvas: Canvas) { - val pageSize = mIndicatorOptions.pageSize - if (pageSize > 1 || mIndicatorOptions.showIndicatorOneItem && pageSize == 1) { - drawNormal(canvas) - drawSlider(canvas) - } - } - - private fun drawNormal(canvas: Canvas) { - val normalIndicatorWidth = mIndicatorOptions.normalSliderWidth - mPaint.color = mIndicatorOptions.normalSliderColor - for (i in 0 until mIndicatorOptions.pageSize) { - val coordinateX = IndicatorUtils.getCoordinateX(mIndicatorOptions, maxWidth, i) - val coordinateY = IndicatorUtils.getCoordinateY(maxWidth) - drawCircle(canvas, coordinateX, coordinateY, normalIndicatorWidth / 2) - } - } - - private fun drawSlider(canvas: Canvas) { - mPaint.color = mIndicatorOptions.checkedSliderColor - when (mIndicatorOptions.slideMode) { - IndicatorSlideMode.NORMAL, IndicatorSlideMode.SMOOTH -> drawCircleSlider(canvas) - IndicatorSlideMode.WORM -> drawWormSlider(canvas) - IndicatorSlideMode.SCALE -> drawScaleSlider(canvas) - IndicatorSlideMode.COLOR -> drawColor(canvas) - } - } - - private fun drawColor(canvas: Canvas) { - val currentPosition = mIndicatorOptions.currentPosition - val slideProgress = mIndicatorOptions.slideProgress - val coordinateX = IndicatorUtils.getCoordinateX(mIndicatorOptions, maxWidth, currentPosition) - val coordinateY = IndicatorUtils.getCoordinateY(maxWidth) - var evaluate = argbEvaluator?.evaluate( - slideProgress, mIndicatorOptions.checkedSliderColor, mIndicatorOptions.normalSliderColor - ) - mPaint.color = (evaluate as Int) - drawCircle(canvas, coordinateX, coordinateY, mIndicatorOptions.normalSliderWidth / 2) - - // 绘制可循环的ViewPager指示器渐变 - evaluate = argbEvaluator?.evaluate( - 1 - slideProgress, mIndicatorOptions.checkedSliderColor, mIndicatorOptions.normalSliderColor - ) - mPaint.color = evaluate as Int - val nextCoordinateX = if (currentPosition == mIndicatorOptions.pageSize - 1) { - IndicatorUtils.getCoordinateX(mIndicatorOptions, maxWidth, 0) - } else { - coordinateX + mIndicatorOptions.sliderGap + mIndicatorOptions.normalSliderWidth - } - drawCircle(canvas, nextCoordinateX, coordinateY, mIndicatorOptions.checkedSliderWidth / 2) - } - - private fun drawScaleSlider(canvas: Canvas) { - val currentPosition = mIndicatorOptions.currentPosition - val slideProgress = mIndicatorOptions.slideProgress - val coordinateX = IndicatorUtils.getCoordinateX(mIndicatorOptions, maxWidth, currentPosition) - val coordinateY = IndicatorUtils.getCoordinateY(maxWidth) - if (slideProgress < 1) { - val evaluate = argbEvaluator?.evaluate( - slideProgress, mIndicatorOptions.checkedSliderColor, mIndicatorOptions.normalSliderColor - ) - mPaint.color = (evaluate as Int) - val radius = - mIndicatorOptions.checkedSliderWidth / 2 - (mIndicatorOptions.checkedSliderWidth / 2 - mIndicatorOptions.normalSliderWidth / 2) * slideProgress - drawCircle(canvas, coordinateX, coordinateY, radius) - } - - if (currentPosition == mIndicatorOptions.pageSize - 1) { - val evaluate = argbEvaluator?.evaluate( - slideProgress, mIndicatorOptions.normalSliderColor, mIndicatorOptions.checkedSliderColor - ) - mPaint.color = evaluate as Int - val nextCoordinateX = maxWidth / 2 - val nextRadius = minWidth / 2 + (maxWidth / 2 - minWidth / 2) * (slideProgress) - drawCircle(canvas, nextCoordinateX, coordinateY, nextRadius) - } else { - if (slideProgress > 0) { - val evaluate = argbEvaluator?.evaluate( - slideProgress, mIndicatorOptions.normalSliderColor, mIndicatorOptions.checkedSliderColor - ) - mPaint.color = evaluate as Int - val nextCoordinateX = - coordinateX + mIndicatorOptions.sliderGap + mIndicatorOptions.normalSliderWidth - val nextRadius = - mIndicatorOptions.normalSliderWidth / 2 + (mIndicatorOptions.checkedSliderWidth / 2 - mIndicatorOptions.normalSliderWidth / 2) * slideProgress - drawCircle(canvas, nextCoordinateX, coordinateY, nextRadius) - } - } - } - - private fun drawCircleSlider(canvas: Canvas) { - val currentPosition = mIndicatorOptions.currentPosition - val startCoordinateX = - IndicatorUtils.getCoordinateX(mIndicatorOptions, maxWidth, currentPosition) - val endCoordinateX = IndicatorUtils.getCoordinateX( - mIndicatorOptions, maxWidth, (currentPosition + 1) % mIndicatorOptions.pageSize - ) - val coordinateX = - startCoordinateX + (endCoordinateX - startCoordinateX) * mIndicatorOptions.slideProgress - val coordinateY = IndicatorUtils.getCoordinateY(maxWidth) - val radius = mIndicatorOptions.checkedSliderWidth / 2 - drawCircle(canvas, coordinateX, coordinateY, radius) - } - - private fun drawWormSlider(canvas: Canvas) { - val sliderHeight = mIndicatorOptions.normalSliderWidth - val slideProgress = mIndicatorOptions.slideProgress - val currentPosition = mIndicatorOptions.currentPosition - val distance = mIndicatorOptions.sliderGap + mIndicatorOptions.normalSliderWidth - val startCoordinateX = - IndicatorUtils.getCoordinateX(mIndicatorOptions, maxWidth, currentPosition) - val left = startCoordinateX + (distance * (slideProgress - 0.5f) * 2.0f).coerceAtLeast( - 0f - ) - mIndicatorOptions.normalSliderWidth / 2 + INDICATOR_PADDING - val right = startCoordinateX + (distance * slideProgress * 2f).coerceAtMost( - distance - ) + mIndicatorOptions.normalSliderWidth / 2 + INDICATOR_PADDING - rectF.set(left, INDICATOR_PADDING.toFloat(), right, sliderHeight + INDICATOR_PADDING) - canvas.drawRoundRect(rectF, sliderHeight, sliderHeight, mPaint) - } - - private fun drawCircle( - canvas: Canvas, - coordinateX: Float, - coordinateY: Float, - radius: Float - ) { - canvas.drawCircle( - coordinateX + INDICATOR_PADDING, coordinateY + INDICATOR_PADDING, radius, mPaint - ) - } -} diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/drawer/DashDrawer.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/drawer/DashDrawer.kt deleted file mode 100644 index 42450c518d..0000000000 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/drawer/DashDrawer.kt +++ /dev/null @@ -1,20 +0,0 @@ -package com.mogo.och.unmanned.passenger.widget.indicator.drawer - -import android.graphics.Canvas - -import com.mogo.och.unmanned.passenger.widget.indicator.option.IndicatorOptions - -/** - *
- * Created by zhpan on 2019/11/23.
- * Description: Dash Indicator Drawer.
-
* - */ -class DashDrawer internal constructor(indicatorOptions: IndicatorOptions) : RectDrawer( - indicatorOptions -) { - - override fun drawDash(canvas: Canvas) { - canvas.drawRect(mRectF, mPaint) - } -} diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/drawer/DrawerFactory.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/drawer/DrawerFactory.kt deleted file mode 100644 index df41877e28..0000000000 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/drawer/DrawerFactory.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.mogo.och.unmanned.passenger.widget.indicator.drawer - -import com.mogo.och.unmanned.passenger.widget.indicator.enums.IndicatorStyle -import com.mogo.och.unmanned.passenger.widget.indicator.option.IndicatorOptions - - -/** - *
- * Created by zhpan on 2019/11/24.
- * Description: Indicator Drawer Factory.
-
* - */ -internal object DrawerFactory { - fun createDrawer(indicatorOptions: IndicatorOptions): IDrawer { - return when (indicatorOptions.indicatorStyle) { - IndicatorStyle.DASH -> DashDrawer(indicatorOptions) - IndicatorStyle.ROUND_RECT -> RoundRectDrawer(indicatorOptions) - else -> CircleDrawer(indicatorOptions) - } - } -} diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/drawer/DrawerProxy.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/drawer/DrawerProxy.kt deleted file mode 100644 index 080f6bb6b3..0000000000 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/drawer/DrawerProxy.kt +++ /dev/null @@ -1,48 +0,0 @@ -package com.mogo.och.unmanned.passenger.widget.indicator.drawer - -import android.graphics.Canvas - -import com.mogo.och.unmanned.passenger.widget.indicator.option.IndicatorOptions - -/** - *
- * Created by zhpan on 2019/11/23.
- * Description: Indicator Drawer Proxy.
-
* - */ -class DrawerProxy(indicatorOptions: IndicatorOptions) : IDrawer { - - private lateinit var mIDrawer: IDrawer - - init { - init(indicatorOptions) - } - - private fun init(indicatorOptions: IndicatorOptions) { - mIDrawer = DrawerFactory.createDrawer(indicatorOptions) - } - - override fun onLayout( - changed: Boolean, - left: Int, - top: Int, - right: Int, - bottom: Int - ) { - } - - override fun onMeasure( - widthMeasureSpec: Int, - heightMeasureSpec: Int - ): BaseDrawer.MeasureResult { - return mIDrawer.onMeasure(widthMeasureSpec, heightMeasureSpec) - } - - override fun onDraw(canvas: Canvas) { - mIDrawer.onDraw(canvas) - } - - fun setIndicatorOptions(indicatorOptions: IndicatorOptions) { - init(indicatorOptions) - } -} diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/drawer/IDrawer.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/drawer/IDrawer.kt deleted file mode 100644 index 0a9afbf39b..0000000000 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/drawer/IDrawer.kt +++ /dev/null @@ -1,27 +0,0 @@ -package com.mogo.och.unmanned.passenger.widget.indicator.drawer - -import android.graphics.Canvas - -/** - *
- * Created by zhpan on 2019/11/23.
- * Description:
-
* - */ -interface IDrawer { - - fun onLayout( - changed: Boolean, - left: Int, - top: Int, - right: Int, - bottom: Int - ) - - fun onMeasure( - widthMeasureSpec: Int, - heightMeasureSpec: Int - ): BaseDrawer.MeasureResult - - fun onDraw(canvas: Canvas) -} diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/drawer/RectDrawer.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/drawer/RectDrawer.kt deleted file mode 100644 index 3859dc5757..0000000000 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/drawer/RectDrawer.kt +++ /dev/null @@ -1,219 +0,0 @@ -package com.mogo.och.unmanned.passenger.widget.indicator.drawer - -import android.graphics.* -import com.mogo.och.unmanned.passenger.widget.indicator.enums.IndicatorSlideMode -import com.mogo.och.unmanned.passenger.widget.indicator.option.IndicatorOptions -import com.mogo.och.unmanned.passenger.widget.indicator.utils.IndicatorUtils - -/** - *
- * Created by zhpan on 2020/1/17.
- * Description:
-
* - */ -open class RectDrawer internal constructor(indicatorOptions: IndicatorOptions) : BaseDrawer( - indicatorOptions -) { - internal var mRectF: RectF = RectF() - - override fun onDraw(canvas: Canvas) { - val pageSize = mIndicatorOptions.pageSize - if (pageSize > 1 || mIndicatorOptions.showIndicatorOneItem && pageSize == 1) { - if (isWidthEquals && mIndicatorOptions.slideMode != IndicatorSlideMode.NORMAL) { - drawUncheckedSlider(canvas, pageSize) - drawCheckedSlider(canvas) - } else { // 单独处理normalWidth与checkedWidth不一致的情况 - if (mIndicatorOptions.slideMode == IndicatorSlideMode.SCALE) { - for (i in 0 until pageSize) { - drawScaleSlider(canvas, i) - } - } else { - drawInequalitySlider(canvas, pageSize) - } - } - } - } - - private fun drawScaleSlider( - canvas: Canvas, - i: Int - ) { - val checkedColor = mIndicatorOptions.checkedSliderColor - val indicatorGap = mIndicatorOptions.sliderGap - val sliderHeight = mIndicatorOptions.sliderHeight - val currentPosition = mIndicatorOptions.currentPosition - val normalWidth = mIndicatorOptions.normalSliderWidth - val checkedWidth = mIndicatorOptions.checkedSliderWidth - when { - i < currentPosition -> { - mPaint.color = mIndicatorOptions.normalSliderColor - val left: Float = if (currentPosition == mIndicatorOptions.pageSize - 1) { - (i * normalWidth + i * indicatorGap) + (checkedWidth - normalWidth) * mIndicatorOptions.slideProgress - } else { - (i * normalWidth + i * indicatorGap) - } - mRectF.set(left, 0f, left + normalWidth, sliderHeight) - drawRoundRect(canvas, sliderHeight, sliderHeight,mRectF.width()>checkedWidth/2) - } - i == currentPosition -> { - mPaint.color = checkedColor - val slideProgress = mIndicatorOptions.slideProgress - if (currentPosition == mIndicatorOptions.pageSize - 1) { - val evaluate = argbEvaluator?.evaluate( - slideProgress, checkedColor, mIndicatorOptions.normalSliderColor - ) - mPaint.color = (evaluate as Int) - val right = - (mIndicatorOptions.pageSize - 1) * (normalWidth + mIndicatorOptions.sliderGap) + checkedWidth - val left = right - checkedWidth + (checkedWidth - normalWidth) * (slideProgress) - mRectF.set(left, 0f, right, sliderHeight) - drawRoundRect(canvas, sliderHeight, sliderHeight,mRectF.width()>checkedWidth/2) - } else { - if (slideProgress < 1) { - val evaluate = argbEvaluator?.evaluate( - slideProgress, checkedColor, mIndicatorOptions.normalSliderColor - ) - mPaint.color = (evaluate as Int) - val left = i * normalWidth + i * indicatorGap - val right = left + normalWidth + (checkedWidth - normalWidth) * (1 - slideProgress) - mRectF.set(left, 0f, right, sliderHeight) - drawRoundRect(canvas, sliderHeight, sliderHeight,mRectF.width()>checkedWidth/2) - } - } - - if (currentPosition == mIndicatorOptions.pageSize - 1) { - if (slideProgress > 0) { - val evaluate = argbEvaluator?.evaluate( - 1 - slideProgress, checkedColor, mIndicatorOptions.normalSliderColor - ) - mPaint.color = evaluate as Int - val left = 0f - val right = left + normalWidth + (checkedWidth - normalWidth) * slideProgress - - mRectF.set(left, 0f, right, sliderHeight) - drawRoundRect(canvas, sliderHeight, sliderHeight,mRectF.width()>checkedWidth/2) - } - } else { - if (slideProgress > 0) { - val evaluate = argbEvaluator?.evaluate( - 1 - slideProgress, checkedColor, mIndicatorOptions.normalSliderColor - ) - mPaint.color = evaluate as Int - val right = - i * normalWidth + i * indicatorGap + normalWidth + (indicatorGap + checkedWidth) - val left = right - (normalWidth) - (checkedWidth - normalWidth) * (slideProgress) - mRectF.set(left, 0f, right, sliderHeight) - drawRoundRect(canvas, sliderHeight, sliderHeight,mRectF.width()>checkedWidth/2) - } - } - } - else -> { - if ((currentPosition + 1 != i || mIndicatorOptions.slideProgress == 0f)) { // 避免多余绘制 - mPaint.color = mIndicatorOptions.normalSliderColor - val left = i * minWidth + i * indicatorGap + (checkedWidth - minWidth) - mRectF.set(left, 0f, left + minWidth, sliderHeight) - drawRoundRect(canvas, sliderHeight, sliderHeight,false) - } - } - } - } - - private fun drawUncheckedSlider( - canvas: Canvas, - pageSize: Int - ) { - for (i in 0 until pageSize) { - mPaint.color = mIndicatorOptions.normalSliderColor - val left = i * maxWidth + i * +mIndicatorOptions.sliderGap + (maxWidth - minWidth) - mRectF.set(left, 0f, left + minWidth, mIndicatorOptions.sliderHeight) - drawRoundRect(canvas, mIndicatorOptions.sliderHeight, mIndicatorOptions.sliderHeight,false) - } - } - - private fun drawInequalitySlider( - canvas: Canvas, - pageSize: Int - ) { - var left = 0f - for (i in 0 until pageSize) { - val sliderWidth = (if (i == mIndicatorOptions.currentPosition) maxWidth else minWidth) - mPaint.color = - if (i == mIndicatorOptions.currentPosition) mIndicatorOptions.checkedSliderColor else mIndicatorOptions.normalSliderColor - mRectF.set(left, 0f, left + sliderWidth, mIndicatorOptions.sliderHeight) - drawRoundRect(canvas, mIndicatorOptions.sliderHeight, mIndicatorOptions.sliderHeight,false) - left += sliderWidth + mIndicatorOptions.sliderGap - } - } - - private fun drawCheckedSlider(canvas: Canvas) { - mPaint.color = mIndicatorOptions.checkedSliderColor - when (mIndicatorOptions.slideMode) { - IndicatorSlideMode.SMOOTH -> drawSmoothSlider(canvas) - IndicatorSlideMode.WORM -> drawWormSlider(canvas) - IndicatorSlideMode.COLOR -> drawColorSlider(canvas) - } - } - - private fun drawColorSlider(canvas: Canvas) { - val currentPosition = mIndicatorOptions.currentPosition - val slideProgress = mIndicatorOptions.slideProgress - val left = currentPosition * minWidth + currentPosition * mIndicatorOptions.sliderGap - if (slideProgress < 0.99) { - val evaluate = argbEvaluator?.evaluate( - slideProgress, mIndicatorOptions.checkedSliderColor, mIndicatorOptions.normalSliderColor - ) - mPaint.color = (evaluate as Int) - mRectF.set(left, 0f, left + minWidth, mIndicatorOptions.sliderHeight) - drawRoundRect(canvas, mIndicatorOptions.sliderHeight, mIndicatorOptions.sliderHeight,false) - } - - var nextSliderLeft = left + mIndicatorOptions.sliderGap + mIndicatorOptions.normalSliderWidth - if (currentPosition == mIndicatorOptions.pageSize - 1) { - nextSliderLeft = 0f - } - val evaluate = argbEvaluator?.evaluate( - 1 - slideProgress, mIndicatorOptions.checkedSliderColor, mIndicatorOptions.normalSliderColor - ) - mPaint.color = evaluate as Int - mRectF.set(nextSliderLeft, 0f, nextSliderLeft + minWidth, mIndicatorOptions.sliderHeight) - drawRoundRect(canvas, mIndicatorOptions.sliderHeight, mIndicatorOptions.sliderHeight,false) - } - - private fun drawWormSlider(canvas: Canvas) { - val sliderHeight = mIndicatorOptions.sliderHeight - val slideProgress = mIndicatorOptions.slideProgress - val currentPosition = mIndicatorOptions.currentPosition - val distance = mIndicatorOptions.sliderGap + mIndicatorOptions.normalSliderWidth - val startCoordinateX = - IndicatorUtils.getCoordinateX(mIndicatorOptions, maxWidth, currentPosition) - val left = startCoordinateX + (distance * (slideProgress - 0.5f) * 2.0f).coerceAtLeast( - 0f - ) - mIndicatorOptions.normalSliderWidth / 2 - val right = startCoordinateX + (distance * slideProgress * 2f).coerceAtMost( - distance - ) + mIndicatorOptions.normalSliderWidth / 2 - mRectF.set(left, 0f, right, sliderHeight) - drawRoundRect(canvas, sliderHeight, sliderHeight,false) - } - - private fun drawSmoothSlider(canvas: Canvas) { - val currentPosition = mIndicatorOptions.currentPosition - val indicatorGap = mIndicatorOptions.sliderGap - val sliderHeight = mIndicatorOptions.sliderHeight - val left = - currentPosition * maxWidth + currentPosition * +indicatorGap + (maxWidth + indicatorGap) * mIndicatorOptions.slideProgress - mRectF.set(left, 0f, left + maxWidth, sliderHeight) - drawRoundRect(canvas, sliderHeight, sliderHeight,false) - } - - protected open fun drawRoundRect( - canvas: Canvas, - rx: Float, - ry: Float, - isWidth:Boolean - ) { - drawDash(canvas) - } - - protected open fun drawDash(canvas: Canvas) {} -} diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/drawer/RoundRectDrawer.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/drawer/RoundRectDrawer.kt deleted file mode 100644 index a3d801afd2..0000000000 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/drawer/RoundRectDrawer.kt +++ /dev/null @@ -1,38 +0,0 @@ -package com.mogo.och.unmanned.passenger.widget.indicator.drawer - -import android.graphics.Canvas -import android.graphics.LinearGradient -import android.graphics.Shader -import com.mogo.och.unmanned.passenger.widget.indicator.option.IndicatorOptions - - -/** - *
- * Created by zhpan on 2019/11/26.
- * Description:
-
* - */ -class RoundRectDrawer internal constructor(val indicatorOptions: IndicatorOptions) : RectDrawer( - indicatorOptions -) { - - override fun drawRoundRect(canvas: Canvas, rx: Float, ry: Float, isWidth: Boolean) { - if(isWidth) { - val linearGradient = - LinearGradient( - mRectF.left, - (mRectF.bottom - mRectF.top) / 2, - mRectF.right, - (mRectF.bottom - mRectF.top) / 2, - indicatorOptions.checkedSliderColor, - indicatorOptions.checkedEndSliderColor, - Shader.TileMode.CLAMP - ) - mPaint.shader = linearGradient - }else{ - mPaint.color = indicatorOptions.normalSliderColor - mPaint.shader = null - } - canvas.drawRoundRect(mRectF, rx, ry, mPaint) - } -} diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/enums/IndicatorOrientation.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/enums/IndicatorOrientation.kt deleted file mode 100644 index 3738ba418e..0000000000 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/enums/IndicatorOrientation.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.mogo.och.unmanned.passenger.widget.indicator.enums - -import android.widget.LinearLayout - -/** - * - * @author zhangpan - * @date 2021/1/21 - */ -class IndicatorOrientation { - companion object { - const val INDICATOR_HORIZONTAL = LinearLayout.HORIZONTAL - const val INDICATOR_VERTICAL = LinearLayout.VERTICAL - const val INDICATOR_RTL = 3 - } -} \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/enums/IndicatorSlideMode.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/enums/IndicatorSlideMode.kt deleted file mode 100644 index 5b4b0855e9..0000000000 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/enums/IndicatorSlideMode.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.mogo.och.unmanned.passenger.widget.indicator.enums - -/** - *
- * Created by zhangpan on 2019-10-18.
- * Description:
-
* - */ -interface IndicatorSlideMode { - companion object { - const val NORMAL = 0 - const val SMOOTH = 2 - const val WORM = 3 - const val SCALE = 4 - const val COLOR = 5 - } -} diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/enums/IndicatorStyle.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/enums/IndicatorStyle.kt deleted file mode 100644 index 13b688241d..0000000000 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/enums/IndicatorStyle.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.mogo.och.unmanned.passenger.widget.indicator.enums - -/** - *
- * Created by zhangpan on 2019-10-18.
- * Description:
-
* - */ -interface IndicatorStyle { - companion object { - const val CIRCLE = 0 - const val DASH = 1 shl 1 - const val ROUND_RECT = 1 shl 2 - } -} diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/option/AttrsController.java b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/option/AttrsController.java deleted file mode 100644 index 029301c199..0000000000 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/option/AttrsController.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.mogo.och.unmanned.passenger.widget.indicator.option; - -import android.content.Context; -import android.content.res.TypedArray; -import android.graphics.Color; -import android.util.AttributeSet; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import com.mogo.och.unmanned.passenger.widget.indicator.utils.IndicatorUtils; -import com.mogo.och.unmanned.taxi.passenger.R; - -public class AttrsController { - - public static void initAttrs(@NonNull Context context, @Nullable AttributeSet attrs, - IndicatorOptions indicatorOptions) { - if (attrs != null) { - TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.IndicatorView); - int indicatorSlideMode = typedArray.getInt(R.styleable.IndicatorView_vpi_slide_mode, 0); - int indicatorStyle = typedArray.getInt(R.styleable.IndicatorView_vpi_style, 0); - int checkedColor = typedArray.getColor(R.styleable.IndicatorView_vpi_slider_checked_color, - Color.parseColor("#6C6D72")); - int normalColor = typedArray.getColor(R.styleable.IndicatorView_vpi_slider_normal_color, - Color.parseColor("#8C18171C")); - int orientation = typedArray.getInt(R.styleable.IndicatorView_vpi_orientation, 0); - float radius = typedArray.getDimension(R.styleable.IndicatorView_vpi_slider_radius, - IndicatorUtils.dp2px(8)); - indicatorOptions.setCheckedColor(checkedColor); - indicatorOptions.setNormalSliderColor(normalColor); - indicatorOptions.setOrientation(orientation); - indicatorOptions.setIndicatorStyle(indicatorStyle); - indicatorOptions.setSlideMode(indicatorSlideMode); - indicatorOptions.setSliderWidth(radius * 2, radius * 2); - typedArray.recycle(); - } - } -} diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/option/IndicatorOptions.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/option/IndicatorOptions.kt deleted file mode 100644 index e68d2fa9c8..0000000000 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/option/IndicatorOptions.kt +++ /dev/null @@ -1,113 +0,0 @@ -package com.mogo.och.unmanned.passenger.widget.indicator.option - -import android.graphics.Color -import com.mogo.och.unmanned.passenger.widget.indicator.annotation.AIndicatorOrientation -import com.mogo.och.unmanned.passenger.widget.indicator.annotation.AIndicatorSlideMode -import com.mogo.och.unmanned.passenger.widget.indicator.annotation.AIndicatorStyle -import com.mogo.och.unmanned.passenger.widget.indicator.enums.IndicatorOrientation -import com.mogo.och.unmanned.passenger.widget.indicator.enums.IndicatorSlideMode -import com.mogo.och.unmanned.passenger.widget.indicator.utils.IndicatorUtils - -/** - *
- * Created by zhpan on 2019/11/20.
- * Description:Indicator的配置参数
-
* - */ -class IndicatorOptions { - - @AIndicatorOrientation - var orientation = IndicatorOrientation.INDICATOR_HORIZONTAL - - @AIndicatorStyle - var indicatorStyle: Int = 0 - - /** - * Indicator滑动模式,目前仅支持两种 - * - * @see IndicatorSlideMode.NORMAL - * - * @see IndicatorSlideMode.SMOOTH - */ - @AIndicatorSlideMode - var slideMode: Int = 0 - - /** - * 页面size - */ - var pageSize: Int = 0 - - /** - * 未选中时Indicator颜色 - */ - var normalSliderColor: Int = 0 - - /** - * 选中时Indicator颜色 - */ - var checkedSliderColor: Int = 0 - /** - * 选中时IndicatorEnd颜色 - */ - var checkedEndSliderColor: Int = 0 - - /** - * Indicator间距 - */ - var sliderGap: Float = 0f - - var sliderHeight: Float = 0f - get() = if (field > 0) field else normalSliderWidth / 2 - - var normalSliderWidth: Float = 0f - - var checkedSliderWidth: Float = 0f - - /** - * 指示器当前位置 - */ - var currentPosition: Int = 0 - - /** - * 从一个点滑动到另一个点的进度 - */ - var slideProgress: Float = 0f - - var showIndicatorOneItem: Boolean = false - - init { - normalSliderWidth = IndicatorUtils.dp2px(8f) - .toFloat() - checkedSliderWidth = normalSliderWidth - sliderGap = normalSliderWidth - normalSliderColor = Color.parseColor("#8C18171C") - checkedSliderColor = Color.parseColor("#8C6C6D72") - slideMode = IndicatorSlideMode.NORMAL - } - - fun setCheckedColor(checkedColor: Int) { - this.checkedSliderColor = checkedColor - } - - fun setSliderWidth( - normalIndicatorWidth: Float, - checkedIndicatorWidth: Float - ) { - this.normalSliderWidth = normalIndicatorWidth - this.checkedSliderWidth = checkedIndicatorWidth - } - - fun setSliderWidth(sliderWidth: Float) { - setSliderWidth(sliderWidth, sliderWidth) - } - - fun setSliderColor( - normalColor: Int, - checkedColor: Int, - selectedEndColor: Int - ) { - this.normalSliderColor = normalColor - this.checkedSliderColor = checkedColor - this.checkedEndSliderColor = selectedEndColor - } -} diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/utils/IndicatorUtils.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/utils/IndicatorUtils.kt deleted file mode 100644 index 51616e8ea0..0000000000 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/indicator/utils/IndicatorUtils.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.mogo.och.unmanned.passenger.widget.indicator.utils - -import android.content.res.Resources -import com.mogo.och.unmanned.passenger.widget.indicator.option.IndicatorOptions - -/** - *
- * Created by zhangpan on 2020-01-20.
- * Description:
-
* - */ -object IndicatorUtils { - - @JvmStatic - fun dp2px(dpValue: Float): Int { - return (0.5f + dpValue * Resources.getSystem().displayMetrics.density).toInt() - } - - fun getCoordinateX( - indicatorOptions: IndicatorOptions, - maxDiameter: Float, - index: Int - ): Float { - val normalIndicatorWidth = indicatorOptions.normalSliderWidth - return maxDiameter / 2 + (normalIndicatorWidth + indicatorOptions.sliderGap) * index - } - - fun getCoordinateY(maxDiameter: Float): Float { - return maxDiameter / 2 - } -} diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_01.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_01.webp new file mode 100644 index 0000000000..6b4f4306ec Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_01.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_02.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_02.webp new file mode 100644 index 0000000000..3dbff5f787 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_02.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_03.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_03.webp new file mode 100644 index 0000000000..9752651d85 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_03.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_04.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_04.webp new file mode 100644 index 0000000000..f3b092aa6d Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_04.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_05.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_05.webp new file mode 100644 index 0000000000..e73389d1d9 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_05.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_06.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_06.webp new file mode 100644 index 0000000000..bed96396bb Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_06.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_07.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_07.webp new file mode 100644 index 0000000000..adc91a7958 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_07.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_08.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_08.webp new file mode 100644 index 0000000000..9c65009417 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_08.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_09.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_09.webp new file mode 100644 index 0000000000..15d9b8ae19 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_09.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_10.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_10.webp new file mode 100644 index 0000000000..65b78a6fb3 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_10.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_100.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_100.webp new file mode 100644 index 0000000000..fe6d63010d Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_100.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_11.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_11.webp new file mode 100644 index 0000000000..79f4b9c34f Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_11.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_12.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_12.webp new file mode 100644 index 0000000000..1bae2d5c7a Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_12.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_13.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_13.webp new file mode 100644 index 0000000000..373f770f0d Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_13.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_14.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_14.webp new file mode 100644 index 0000000000..11c1ae98fa Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_14.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_15.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_15.webp new file mode 100644 index 0000000000..65e1f0bfff Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_15.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_16.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_16.webp new file mode 100644 index 0000000000..d75150e2f2 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_16.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_17.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_17.webp new file mode 100644 index 0000000000..e2d13882d3 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_17.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_18.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_18.webp new file mode 100644 index 0000000000..0e84b6fc9c Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_18.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_19.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_19.webp new file mode 100644 index 0000000000..93a6218ce2 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_19.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_20.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_20.webp new file mode 100644 index 0000000000..5b604c5576 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_20.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_21.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_21.webp new file mode 100644 index 0000000000..a937518c16 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_21.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_22.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_22.webp new file mode 100644 index 0000000000..39fb1fea8a Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_22.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_23.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_23.webp new file mode 100644 index 0000000000..3df50a739b Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_23.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_24.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_24.webp new file mode 100644 index 0000000000..39820d1999 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_24.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_25.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_25.webp new file mode 100644 index 0000000000..0bbea56fb9 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_25.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_26.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_26.webp new file mode 100644 index 0000000000..75cda44ebf Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_26.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_27.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_27.webp new file mode 100644 index 0000000000..8fe11311ac Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_27.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_28.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_28.webp new file mode 100644 index 0000000000..5d3073a67d Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_28.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_29.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_29.webp new file mode 100644 index 0000000000..a04b1e4ca9 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_29.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_30.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_30.webp new file mode 100644 index 0000000000..fc9fcc5401 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_30.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_31.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_31.webp new file mode 100644 index 0000000000..9e6ef15aa5 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_31.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_32.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_32.webp new file mode 100644 index 0000000000..47e414d71e Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_32.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_33.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_33.webp new file mode 100644 index 0000000000..b674719078 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_33.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_34.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_34.webp new file mode 100644 index 0000000000..2286c059de Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_34.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_35.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_35.webp new file mode 100644 index 0000000000..5cbf8d8e54 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_35.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_36.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_36.webp new file mode 100644 index 0000000000..92af4bccb5 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_36.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_37.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_37.webp new file mode 100644 index 0000000000..83e072bf44 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_37.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_38.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_38.webp new file mode 100644 index 0000000000..b96b5b2ac8 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_38.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_39.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_39.webp new file mode 100644 index 0000000000..629f61cdd5 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_39.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_40.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_40.webp new file mode 100644 index 0000000000..9a5f07ff0b Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_40.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_41.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_41.webp new file mode 100644 index 0000000000..0f5d29acea Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_41.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_42.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_42.webp new file mode 100644 index 0000000000..bed3ce67b3 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_42.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_43.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_43.webp new file mode 100644 index 0000000000..404a075292 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_43.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_44.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_44.webp new file mode 100644 index 0000000000..3578bb2f19 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_44.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_45.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_45.webp new file mode 100644 index 0000000000..c5fb0d0a3b Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_45.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_46.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_46.webp new file mode 100644 index 0000000000..3b346373ee Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_46.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_47.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_47.webp new file mode 100644 index 0000000000..7d3010f838 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_47.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_48.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_48.webp new file mode 100644 index 0000000000..69bad18a38 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_48.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_49.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_49.webp new file mode 100644 index 0000000000..d39950515f Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_49.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_50.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_50.webp new file mode 100644 index 0000000000..8a07ff89ca Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_50.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_51.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_51.webp new file mode 100644 index 0000000000..413a290ff5 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_51.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_52.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_52.webp new file mode 100644 index 0000000000..04d42b353d Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_52.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_53.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_53.webp new file mode 100644 index 0000000000..5f181da3b2 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_53.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_54.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_54.webp new file mode 100644 index 0000000000..82a77ad510 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_54.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_55.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_55.webp new file mode 100644 index 0000000000..266bb0ea53 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_55.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_56.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_56.webp new file mode 100644 index 0000000000..390c687b4b Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_56.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_57.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_57.webp new file mode 100644 index 0000000000..b89ff7a53f Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_57.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_58.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_58.webp new file mode 100644 index 0000000000..37be517e39 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_58.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_59.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_59.webp new file mode 100644 index 0000000000..10500d1bd8 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_59.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_60.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_60.webp new file mode 100644 index 0000000000..3a9ca2b135 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_60.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_61.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_61.webp new file mode 100644 index 0000000000..f1f15b09b9 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_61.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_62.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_62.webp new file mode 100644 index 0000000000..36ac568e29 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_62.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_63.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_63.webp new file mode 100644 index 0000000000..92a4a699b7 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_63.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_64.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_64.webp new file mode 100644 index 0000000000..c013e4e7a9 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_64.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_65.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_65.webp new file mode 100644 index 0000000000..49aeb97d73 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_65.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_66.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_66.webp new file mode 100644 index 0000000000..aab4c5b373 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_66.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_67.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_67.webp new file mode 100644 index 0000000000..e89c0a8ce4 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_67.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_68.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_68.webp new file mode 100644 index 0000000000..d1d24aaae4 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_68.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_69.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_69.webp new file mode 100644 index 0000000000..9f74c1421b Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_69.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_70.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_70.webp new file mode 100644 index 0000000000..ff413a191a Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_70.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_71.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_71.webp new file mode 100644 index 0000000000..ecbb0f0448 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_71.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_72.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_72.webp new file mode 100644 index 0000000000..9776560e08 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_72.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_73.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_73.webp new file mode 100644 index 0000000000..b7c5ee478a Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_73.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_74.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_74.webp new file mode 100644 index 0000000000..77f04d978f Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_74.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_75.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_75.webp new file mode 100644 index 0000000000..4863c07dcd Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_75.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_76.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_76.webp new file mode 100644 index 0000000000..2890b7c416 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_76.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_77.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_77.webp new file mode 100644 index 0000000000..c46b150a45 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_77.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_78.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_78.webp new file mode 100644 index 0000000000..560743d781 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_78.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_79.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_79.webp new file mode 100644 index 0000000000..1b4f9de0f5 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_79.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_80.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_80.webp new file mode 100644 index 0000000000..09e5baded4 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_80.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_81.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_81.webp new file mode 100644 index 0000000000..7cbe07a874 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_81.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_82.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_82.webp new file mode 100644 index 0000000000..8c764eed3a Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_82.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_83.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_83.webp new file mode 100644 index 0000000000..4376a5b527 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_83.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_84.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_84.webp new file mode 100644 index 0000000000..8d23a7306b Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_84.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_85.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_85.webp new file mode 100644 index 0000000000..25ab506111 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_85.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_86.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_86.webp new file mode 100644 index 0000000000..e17fbe51a3 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_86.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_87.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_87.webp new file mode 100644 index 0000000000..d4f66c8e97 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_87.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_88.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_88.webp new file mode 100644 index 0000000000..6d5b509c01 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_88.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_89.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_89.webp new file mode 100644 index 0000000000..f165990782 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_89.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_90.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_90.webp new file mode 100644 index 0000000000..7dd83b3617 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_90.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_91.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_91.webp new file mode 100644 index 0000000000..4762c95b6c Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_91.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_92.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_92.webp new file mode 100644 index 0000000000..17a1e7ca85 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_92.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_93.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_93.webp new file mode 100644 index 0000000000..ee8fd72f33 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_93.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_94.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_94.webp new file mode 100644 index 0000000000..6865bf5d3e Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_94.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_95.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_95.webp new file mode 100644 index 0000000000..89d61e30d9 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_95.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_96.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_96.webp new file mode 100644 index 0000000000..213be04d2c Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_96.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_97.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_97.webp new file mode 100644 index 0000000000..10921d599f Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_97.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_98.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_98.webp new file mode 100644 index 0000000000..8ea38d7ca1 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_98.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_99.webp b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_99.webp new file mode 100644 index 0000000000..d8c07824a5 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_99.webp differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_00.png b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_00.png new file mode 100644 index 0000000000..e6251b3e9b Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_00.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_01.png b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_01.png new file mode 100644 index 0000000000..2ebcb608df Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_01.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_02.png b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_02.png new file mode 100644 index 0000000000..edb8b077ed Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_02.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_03.png b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_03.png new file mode 100644 index 0000000000..867b0283ff Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_03.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_04.png b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_04.png new file mode 100644 index 0000000000..d94af63ca0 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_04.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_05.png b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_05.png new file mode 100644 index 0000000000..02275e7c44 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_05.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_06.png b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_06.png new file mode 100644 index 0000000000..79172c0904 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_06.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_07.png b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_07.png new file mode 100644 index 0000000000..648be20fe9 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_07.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_08.png b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_08.png new file mode 100644 index 0000000000..8aa456573f Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_08.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_09.png b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_09.png new file mode 100644 index 0000000000..45e04b6df7 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_09.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_10.png b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_10.png new file mode 100644 index 0000000000..a125fa2a11 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_10.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_11.png b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_11.png new file mode 100644 index 0000000000..f025adaf45 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_11.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_12.png b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_12.png new file mode 100644 index 0000000000..bade4e7fa0 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_12.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_13.png b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_13.png new file mode 100644 index 0000000000..20415ad3d5 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_13.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_14.png b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_14.png new file mode 100644 index 0000000000..9667980607 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_14.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_15.png b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_15.png new file mode 100644 index 0000000000..f1b4aa07ec Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_15.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_16.png b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_16.png new file mode 100644 index 0000000000..ade00f137f Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_16.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_17.png b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_17.png new file mode 100644 index 0000000000..19b2d879fe Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_17.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_18.png b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_18.png new file mode 100644 index 0000000000..26462ef724 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_18.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_19.png b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_19.png new file mode 100644 index 0000000000..7838464877 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_19.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_20.png b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_20.png new file mode 100644 index 0000000000..3820cd4725 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_20.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_21.png b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_21.png new file mode 100644 index 0000000000..3cece8dc68 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_21.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_22.png b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_22.png new file mode 100644 index 0000000000..48966b0901 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_22.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_23.png b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_23.png new file mode 100644 index 0000000000..d05bea95f8 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_23.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_24.png b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_24.png new file mode 100644 index 0000000000..61a14d3d31 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_24.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_25.png b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_25.png new file mode 100644 index 0000000000..42d3cb07bb Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_25.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_26.png b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_26.png new file mode 100644 index 0000000000..f3ff9de974 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_26.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_27.png b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_27.png new file mode 100644 index 0000000000..aad3e72a94 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_27.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_28.png b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_28.png new file mode 100644 index 0000000000..939f057983 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_28.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_29.png b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_29.png new file mode 100644 index 0000000000..d537a73dc1 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_29.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_30.png b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_30.png new file mode 100644 index 0000000000..cbf447d296 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_30.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_31.png b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_31.png new file mode 100644 index 0000000000..3cb32e80f0 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_31.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_32.png b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_32.png new file mode 100644 index 0000000000..893b64936f Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_32.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_33.png b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_33.png new file mode 100644 index 0000000000..c6bd9cb25f Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_33.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_34.png b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_34.png new file mode 100644 index 0000000000..c30c5e3da5 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_34.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_35.png b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_35.png new file mode 100644 index 0000000000..216fc11d85 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_35.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_36.png b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_36.png new file mode 100644 index 0000000000..d4b413ff24 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_36.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_37.png b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_37.png new file mode 100644 index 0000000000..6f5f4d8475 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_37.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_38.png b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_38.png new file mode 100644 index 0000000000..988fe6e0d0 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_38.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_39.png b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_39.png new file mode 100644 index 0000000000..ac41b22f37 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_39.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_40.png b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_40.png new file mode 100644 index 0000000000..639886dd88 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_40.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_41.png b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_41.png new file mode 100644 index 0000000000..c9c45eda17 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_41.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_42.png b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_42.png new file mode 100644 index 0000000000..9e2636712e Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_42.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_43.png b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_43.png new file mode 100644 index 0000000000..06e4be3956 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_43.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_44.png b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_44.png new file mode 100644 index 0000000000..66dc6001ca Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_44.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_45.png b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_45.png new file mode 100644 index 0000000000..37f02d59e2 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_45.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_46.png b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_46.png new file mode 100644 index 0000000000..311a25105b Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_46.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_47.png b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_47.png new file mode 100644 index 0000000000..8d0b4affaf Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_47.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_48.png b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_48.png new file mode 100644 index 0000000000..124a146839 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_48.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_49.png b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_49.png new file mode 100644 index 0000000000..e6251b3e9b Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/ani/drawable-nodpi/anim_ai_listening_49.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/ani/values/arrays.xml b/OCH/taxi/unmanned-passenger/src/main/res/ani/values/arrays.xml index 1dfcf8e5e6..f17eebd89c 100644 --- a/OCH/taxi/unmanned-passenger/src/main/res/ani/values/arrays.xml +++ b/OCH/taxi/unmanned-passenger/src/main/res/ani/values/arrays.xml @@ -302,4 +302,179 @@ + + @drawable/anim_ai_01 + @drawable/anim_ai_02 + @drawable/anim_ai_03 + @drawable/anim_ai_04 + @drawable/anim_ai_05 + @drawable/anim_ai_06 + @drawable/anim_ai_07 + @drawable/anim_ai_08 + @drawable/anim_ai_09 + + @drawable/anim_ai_10 + @drawable/anim_ai_11 + @drawable/anim_ai_12 + @drawable/anim_ai_13 + @drawable/anim_ai_14 + @drawable/anim_ai_15 + @drawable/anim_ai_16 + @drawable/anim_ai_17 + @drawable/anim_ai_18 + @drawable/anim_ai_19 + + @drawable/anim_ai_20 + @drawable/anim_ai_21 + @drawable/anim_ai_22 + @drawable/anim_ai_23 + @drawable/anim_ai_24 + @drawable/anim_ai_25 + @drawable/anim_ai_26 + @drawable/anim_ai_27 + @drawable/anim_ai_28 + @drawable/anim_ai_29 + + + @drawable/anim_ai_30 + @drawable/anim_ai_31 + @drawable/anim_ai_32 + @drawable/anim_ai_33 + @drawable/anim_ai_34 + @drawable/anim_ai_35 + @drawable/anim_ai_36 + @drawable/anim_ai_37 + @drawable/anim_ai_38 + @drawable/anim_ai_39 + + @drawable/anim_ai_40 + @drawable/anim_ai_41 + @drawable/anim_ai_42 + @drawable/anim_ai_43 + @drawable/anim_ai_44 + @drawable/anim_ai_45 + @drawable/anim_ai_46 + @drawable/anim_ai_47 + @drawable/anim_ai_48 + @drawable/anim_ai_49 + + + @drawable/anim_ai_50 + @drawable/anim_ai_51 + @drawable/anim_ai_52 + @drawable/anim_ai_53 + @drawable/anim_ai_54 + @drawable/anim_ai_55 + @drawable/anim_ai_56 + @drawable/anim_ai_57 + @drawable/anim_ai_58 + @drawable/anim_ai_59 + + @drawable/anim_ai_60 + @drawable/anim_ai_61 + @drawable/anim_ai_62 + @drawable/anim_ai_63 + @drawable/anim_ai_64 + @drawable/anim_ai_65 + @drawable/anim_ai_66 + @drawable/anim_ai_67 + @drawable/anim_ai_68 + @drawable/anim_ai_69 + + @drawable/anim_ai_70 + @drawable/anim_ai_71 + @drawable/anim_ai_72 + @drawable/anim_ai_73 + @drawable/anim_ai_74 + @drawable/anim_ai_75 + @drawable/anim_ai_76 + @drawable/anim_ai_77 + @drawable/anim_ai_78 + @drawable/anim_ai_79 + + @drawable/anim_ai_80 + @drawable/anim_ai_81 + @drawable/anim_ai_82 + @drawable/anim_ai_83 + @drawable/anim_ai_84 + @drawable/anim_ai_85 + @drawable/anim_ai_86 + @drawable/anim_ai_87 + @drawable/anim_ai_88 + @drawable/anim_ai_89 + + @drawable/anim_ai_90 + @drawable/anim_ai_91 + @drawable/anim_ai_92 + @drawable/anim_ai_93 + @drawable/anim_ai_94 + @drawable/anim_ai_95 + @drawable/anim_ai_96 + @drawable/anim_ai_97 + @drawable/anim_ai_98 + @drawable/anim_ai_99 + @drawable/anim_ai_100 + + + + + @drawable/anim_ai_listening_00 + @drawable/anim_ai_listening_01 + @drawable/anim_ai_listening_02 + @drawable/anim_ai_listening_03 + @drawable/anim_ai_listening_04 + @drawable/anim_ai_listening_05 + @drawable/anim_ai_listening_06 + @drawable/anim_ai_listening_07 + @drawable/anim_ai_listening_08 + @drawable/anim_ai_listening_09 + + @drawable/anim_ai_listening_10 + @drawable/anim_ai_listening_11 + @drawable/anim_ai_listening_12 + @drawable/anim_ai_listening_13 + @drawable/anim_ai_listening_14 + @drawable/anim_ai_listening_15 + @drawable/anim_ai_listening_16 + @drawable/anim_ai_listening_17 + @drawable/anim_ai_listening_18 + @drawable/anim_ai_listening_19 + + @drawable/anim_ai_listening_20 + @drawable/anim_ai_listening_21 + @drawable/anim_ai_listening_22 + @drawable/anim_ai_listening_23 + @drawable/anim_ai_listening_24 + @drawable/anim_ai_listening_25 + @drawable/anim_ai_listening_26 + @drawable/anim_ai_listening_27 + @drawable/anim_ai_listening_28 + @drawable/anim_ai_listening_29 + + + @drawable/anim_ai_listening_30 + @drawable/anim_ai_listening_31 + @drawable/anim_ai_listening_32 + @drawable/anim_ai_listening_33 + @drawable/anim_ai_listening_34 + @drawable/anim_ai_listening_35 + @drawable/anim_ai_listening_36 + @drawable/anim_ai_listening_37 + @drawable/anim_ai_listening_38 + @drawable/anim_ai_listening_39 + + @drawable/anim_ai_listening_40 + @drawable/anim_ai_listening_41 + @drawable/anim_ai_listening_42 + @drawable/anim_ai_listening_43 + @drawable/anim_ai_listening_44 + @drawable/anim_ai_listening_45 + @drawable/anim_ai_listening_46 + @drawable/anim_ai_listening_47 + @drawable/anim_ai_listening_48 + @drawable/anim_ai_listening_49 + + + + \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/icon_cover_line.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/icon_cover_line.png new file mode 100644 index 0000000000..206f9c8d9e Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/icon_cover_line.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/icon_image_error.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/icon_image_error.png new file mode 100644 index 0000000000..4cadae7774 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/icon_image_error.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/icon_image_holder.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/icon_image_holder.png new file mode 100644 index 0000000000..3febfc5587 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/icon_image_holder.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/icon_pnc_action.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/icon_pnc_action.png new file mode 100644 index 0000000000..b551721a54 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/icon_pnc_action.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/iv_show_next_bar.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/iv_show_next_bar.png new file mode 100644 index 0000000000..343db6bc2f Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/iv_show_next_bar.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_ai_bg.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_ai_bg.png new file mode 100644 index 0000000000..64323d5e89 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_ai_bg.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_ai_head.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_ai_head.png new file mode 100644 index 0000000000..3c14d19549 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_ai_head.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_ai_title_bg.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_ai_title_bg.png new file mode 100644 index 0000000000..a4706fb634 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_ai_title_bg.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_all_bg.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_all_bg.png new file mode 100644 index 0000000000..ca90fea660 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_all_bg.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_bar_center_logo.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_bar_center_logo.png new file mode 100644 index 0000000000..fb42de7ec0 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_bar_center_logo.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_function_voice_humb.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_function_voice_humb.png deleted file mode 100644 index 347bb58d46..0000000000 Binary files a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_function_voice_humb.png and /dev/null differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_home_map_bg_1.9.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_home_map_bg_1.9.png new file mode 100644 index 0000000000..af046bb4e0 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_home_map_bg_1.9.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_home_middle_bottom_bg.9.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_home_middle_bottom_bg.9.png new file mode 100644 index 0000000000..c164452548 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_home_middle_bottom_bg.9.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_home_middle_top_bg.9.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_home_middle_top_bg.9.png new file mode 100644 index 0000000000..21c2f9f74b Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_home_middle_top_bg.9.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_iv_light_increase_set.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_iv_light_increase_set.png deleted file mode 100644 index 5ec15568b0..0000000000 Binary files a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_iv_light_increase_set.png and /dev/null differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_iv_light_set.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_iv_light_set.png deleted file mode 100644 index de1f7f064f..0000000000 Binary files a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_iv_light_set.png and /dev/null differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_iv_voice_increase_set.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_iv_voice_increase_set.png deleted file mode 100644 index 7e62e77a05..0000000000 Binary files a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_iv_voice_increase_set.png and /dev/null differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_iv_voice_set.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_iv_voice_set.png deleted file mode 100644 index c0f586f35e..0000000000 Binary files a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_iv_voice_set.png and /dev/null differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_light_voice_thum.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_light_voice_thum.png new file mode 100644 index 0000000000..14392e2123 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_light_voice_thum.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_bar_bottom.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_bar_bottom.png new file mode 100644 index 0000000000..639ff84620 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_bar_bottom.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_bar_top.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_bar_top.png new file mode 100644 index 0000000000..28c5f82575 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_bar_top.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_bg.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_bg.png new file mode 100644 index 0000000000..36a7996887 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_bg.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_list_playing.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_list_playing.png index 6a1a124d21..5494edc8ce 100644 Binary files a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_list_playing.png and b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_list_playing.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_next.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_next.png index 8610c57bfc..3a310984b7 100644 Binary files a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_next.png and b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_next.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_pause.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_pause.png index af55d1099e..bd73245ddb 100644 Binary files a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_pause.png and b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_pause.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_pause_bar.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_pause_bar.png new file mode 100644 index 0000000000..bbd87a9865 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_pause_bar.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_play.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_play.png index 32db628355..8e379e9397 100644 Binary files a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_play.png and b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_play.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_play_bar.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_play_bar.png new file mode 100644 index 0000000000..c623535991 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_play_bar.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_playing_pointer.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_playing_pointer.png new file mode 100644 index 0000000000..b08d0064d0 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_playing_pointer.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_pre.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_pre.png index 97f630aecd..6cb67fb738 100644 Binary files a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_pre.png and b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_pre.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_shade_bg.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_shade_bg.png new file mode 100644 index 0000000000..8674ed1c04 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_shade_bg.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_road_video_bg.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_road_video_bg.png new file mode 100644 index 0000000000..52a3802f75 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_road_video_bg.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_road_video_big_bg.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_road_video_big_bg.png new file mode 100644 index 0000000000..e6c92dc1ef Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_road_video_big_bg.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_setting_light_normal.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_setting_light_normal.png new file mode 100644 index 0000000000..52f495dcb7 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_setting_light_normal.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_setting_light_selected.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_setting_light_selected.png new file mode 100644 index 0000000000..d502a60992 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_setting_light_selected.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_setting_view_bg.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_setting_view_bg.png deleted file mode 100644 index 2936e90060..0000000000 Binary files a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_setting_view_bg.png and /dev/null differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_setting_voice_normal.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_setting_voice_normal.png new file mode 100644 index 0000000000..882e1939f2 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_setting_voice_normal.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_setting_voice_selected.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_setting_voice_selected.png new file mode 100644 index 0000000000..f243647c5b Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_setting_voice_selected.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_vodeo_list_bottom_shade.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_vodeo_list_bottom_shade.png new file mode 100644 index 0000000000..53a1cc0ac3 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_vodeo_list_bottom_shade.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_vodeo_list_top_shade.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_vodeo_list_top_shade.png new file mode 100644 index 0000000000..60f6fbf490 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_vodeo_list_top_shade.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_voice_bg.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_voice_bg.png new file mode 100644 index 0000000000..1199f28683 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_voice_bg.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_p_bottom_bar_bg.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_p_bottom_bar_bg.png index b05a7024f3..93a44b0de5 100644 Binary files a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_p_bottom_bar_bg.png and b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_p_bottom_bar_bg.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_p_bottom_bar_select_bg.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_p_bottom_bar_select_bg.png index 4b60612ea3..886f2acc46 100644 Binary files a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_p_bottom_bar_select_bg.png and b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_p_bottom_bar_select_bg.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_p_bottom_music_normal.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_p_bottom_music_normal.png new file mode 100644 index 0000000000..b4e2cc2853 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_p_bottom_music_normal.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_p_bottom_overmap_normal.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_p_bottom_overmap_normal.png index 039096dd66..3bfebee0ff 100644 Binary files a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_p_bottom_overmap_normal.png and b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_p_bottom_overmap_normal.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_p_bottom_precisionmap_normal.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_p_bottom_precisionmap_normal.png index ebc9258cb7..be0dd28423 100644 Binary files a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_p_bottom_precisionmap_normal.png and b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_p_bottom_precisionmap_normal.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_p_bottom_video_normal.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_p_bottom_video_normal.png index 92ed61f399..54f8173354 100644 Binary files a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_p_bottom_video_normal.png and b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_p_bottom_video_normal.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_p_music_bg_middle.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_p_music_bg_middle.png index c88126dfbd..35e3f8cd63 100644 Binary files a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_p_music_bg_middle.png and b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_p_music_bg_middle.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_p_music_bg_relax_head.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_p_music_bg_relax_head.png index 7bf877cbf0..c0af6fd403 100644 Binary files a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_p_music_bg_relax_head.png and b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_p_music_bg_relax_head.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_p_music_bg_relax_head_top.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_p_music_bg_relax_head_top.png new file mode 100644 index 0000000000..c96a2e9183 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_p_music_bg_relax_head_top.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_function_voice_humb.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_function_voice_humb.png deleted file mode 100644 index 347bb58d46..0000000000 Binary files a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_function_voice_humb.png and /dev/null differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_itinerary_bg.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_itinerary_bg.png index a626a703f3..7d4b9ead72 100755 Binary files a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_itinerary_bg.png and b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_itinerary_bg.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_iv_light_increase_set.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_iv_light_increase_set.png deleted file mode 100644 index 5ec15568b0..0000000000 Binary files a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_iv_light_increase_set.png and /dev/null differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_iv_light_set.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_iv_light_set.png deleted file mode 100644 index de1f7f064f..0000000000 Binary files a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_iv_light_set.png and /dev/null differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_iv_voice_increase_set.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_iv_voice_increase_set.png deleted file mode 100644 index 7e62e77a05..0000000000 Binary files a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_iv_voice_increase_set.png and /dev/null differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_iv_voice_set.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_iv_voice_set.png deleted file mode 100644 index c0f586f35e..0000000000 Binary files a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_iv_voice_set.png and /dev/null differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_setting_view_bg.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_setting_view_bg.png deleted file mode 100755 index 2936e90060..0000000000 Binary files a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_setting_view_bg.png and /dev/null differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable/bg_assistant_item_point.xml b/OCH/taxi/unmanned-passenger/src/main/res/drawable/bg_assistant_item_point.xml new file mode 100644 index 0000000000..cab7ec214e --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/res/drawable/bg_assistant_item_point.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable/icon_pic_error.xml b/OCH/taxi/unmanned-passenger/src/main/res/drawable/icon_pic_error.xml new file mode 100644 index 0000000000..5de9d5afff --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/res/drawable/icon_pic_error.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable/icon_pic_holder.xml b/OCH/taxi/unmanned-passenger/src/main/res/drawable/icon_pic_holder.xml new file mode 100644 index 0000000000..67373cd139 --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/res/drawable/icon_pic_holder.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable/taxi_p_function_voice_right_process_humb.xml b/OCH/taxi/unmanned-passenger/src/main/res/drawable/taxi_p_function_voice_right_process_humb.xml deleted file mode 100644 index 1c98f8cad6..0000000000 --- a/OCH/taxi/unmanned-passenger/src/main/res/drawable/taxi_p_function_voice_right_process_humb.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable/taxi_p_left_bar_split.xml b/OCH/taxi/unmanned-passenger/src/main/res/drawable/taxi_p_left_bar_split.xml index 7bedff4f74..635d645ae7 100644 --- a/OCH/taxi/unmanned-passenger/src/main/res/drawable/taxi_p_left_bar_split.xml +++ b/OCH/taxi/unmanned-passenger/src/main/res/drawable/taxi_p_left_bar_split.xml @@ -1,8 +1,5 @@ - + \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable/taxt_u_p_function_voice_right_process_humb.xml b/OCH/taxi/unmanned-passenger/src/main/res/drawable/taxt_u_p_function_voice_right_process_humb.xml deleted file mode 100644 index a22cae0b5a..0000000000 --- a/OCH/taxi/unmanned-passenger/src/main/res/drawable/taxt_u_p_function_voice_right_process_humb.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable/taxt_u_p_setting_light_selector.xml b/OCH/taxi/unmanned-passenger/src/main/res/drawable/taxt_u_p_setting_light_selector.xml new file mode 100644 index 0000000000..ea232f53ec --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/res/drawable/taxt_u_p_setting_light_selector.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable/taxt_u_p_setting_voice_selector.xml b/OCH/taxi/unmanned-passenger/src/main/res/drawable/taxt_u_p_setting_voice_selector.xml new file mode 100644 index 0000000000..2655abe115 --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/res/drawable/taxt_u_p_setting_voice_selector.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/res/layout/item_ai_automatic_exploration.xml b/OCH/taxi/unmanned-passenger/src/main/res/layout/item_ai_automatic_exploration.xml new file mode 100644 index 0000000000..66c0f0e8f7 --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/res/layout/item_ai_automatic_exploration.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/res/layout/item_ai_banner_item.xml b/OCH/taxi/unmanned-passenger/src/main/res/layout/item_ai_banner_item.xml new file mode 100644 index 0000000000..b74b2bfce4 --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/res/layout/item_ai_banner_item.xml @@ -0,0 +1,10 @@ + + + diff --git a/OCH/taxi/unmanned-passenger/src/main/res/layout/item_ai_msg_qa.xml b/OCH/taxi/unmanned-passenger/src/main/res/layout/item_ai_msg_qa.xml new file mode 100644 index 0000000000..44171a642c --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/res/layout/item_ai_msg_qa.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/res/layout/item_ai_nde_event.xml b/OCH/taxi/unmanned-passenger/src/main/res/layout/item_ai_nde_event.xml new file mode 100644 index 0000000000..12b5324bb9 --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/res/layout/item_ai_nde_event.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/res/layout/item_ai_pnc_action.xml b/OCH/taxi/unmanned-passenger/src/main/res/layout/item_ai_pnc_action.xml new file mode 100644 index 0000000000..701ab43851 --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/res/layout/item_ai_pnc_action.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/res/layout/item_ai_road_cross_roam.xml b/OCH/taxi/unmanned-passenger/src/main/res/layout/item_ai_road_cross_roam.xml new file mode 100644 index 0000000000..d6ca80b3a9 --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/res/layout/item_ai_road_cross_roam.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/res/layout/item_ai_road_v2n_event.xml b/OCH/taxi/unmanned-passenger/src/main/res/layout/item_ai_road_v2n_event.xml new file mode 100644 index 0000000000..a40483e64c --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/res/layout/item_ai_road_v2n_event.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_evaluate.xml b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_evaluate.xml index 926249621d..21ef5d93de 100644 --- a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_evaluate.xml +++ b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_evaluate.xml @@ -1,92 +1,86 @@ - + android:layout_width="@dimen/dp_799" + android:layout_height="@dimen/dp_400" + app:blurRadius="@dimen/dp_26" + app:shadowColor="#26666666" + app:shadowRadius="@dimen/dp_20" + app:xOffset="0dp" + app:yOffset="0dp"> + + - - - - + app:layout_constraintTop_toTopOf="parent"> + + + + + + + + + + + app:layout_constraintEnd_toEndOf="@+id/iv_evaluate_great" + app:layout_constraintStart_toStartOf="@+id/iv_evaluate_great" /> - - - - - - - - - - - - \ No newline at end of file + + \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_home.xml b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_home.xml new file mode 100644 index 0000000000..ba62606abf --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_home.xml @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_music.xml b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_music.xml index 2be3fd0516..9f053ad87e 100644 --- a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_music.xml +++ b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_music.xml @@ -2,40 +2,27 @@ + android:layout_marginStart="@dimen/dp_193" + android:layout_width="wrap_content" + android:layout_height="wrap_content"/> - - + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toEndOf="@+id/mpv_playing" + android:layout_marginStart="-146dp" + android:layout_width="1197dp" + android:layout_height="0dp"/> \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_music_bar.xml b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_music_bar.xml new file mode 100644 index 0000000000..8194c82004 --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_music_bar.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_music_list.xml b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_music_list.xml index 4a43d0676c..7a13c11293 100644 --- a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_music_list.xml +++ b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_music_list.xml @@ -2,22 +2,10 @@ - - - - + android:layout_marginBottom="@dimen/dp_200" + app:layout_constraintTop_toTopOf="parent" + android:layout_height="wrap_content"/> \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_music_list_item.xml b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_music_list_item.xml index 833d2494f3..f1b42f37cb 100644 --- a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_music_list_item.xml +++ b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_music_list_item.xml @@ -12,7 +12,7 @@ app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" android:textColor="@color/taxi_cp_303C52" - android:layout_marginStart="@dimen/dp_55" + android:layout_marginStart="@dimen/dp_187" android:text="音乐名称" android:textSize="@dimen/dp_32" android:layout_width="wrap_content" @@ -22,16 +22,18 @@ android:id="@+id/iv_music_playing" app:layout_constraintTop_toTopOf="@+id/tv_song_name" app:layout_constraintBottom_toBottomOf="@+id/tv_song_name" - app:layout_constraintStart_toEndOf="@+id/tv_song_name" - android:layout_marginStart="@dimen/dp_28" + app:layout_constraintEnd_toStartOf="@+id/tv_song_name" + android:layout_marginEnd="@dimen/dp_25" android:src="@drawable/taxi_p_music_list_playing" android:visibility="gone" + tools:visibility="visible" android:layout_width="wrap_content" android:layout_height="wrap_content"/> + android:src="@drawable/taxi_p_music_shade_bg" + android:layout_width="@dimen/dp_794" + android:layout_height="@dimen/dp_794"/> + + + + android:layout_width="@dimen/dp_734" + android:layout_height="@dimen/dp_734"/> + android:layout_width="@dimen/dp_352" + android:layout_height="@dimen/dp_352"/> + + + + + + + + + + + + - - - - - - - \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_overmap.xml b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_overmap.xml index 96017b653f..7009998be1 100644 --- a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_overmap.xml +++ b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_overmap.xml @@ -4,7 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:parentTag="RelativeLayout"> + tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout"> + + + + \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_setting_light_view.xml b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_setting_light_view.xml new file mode 100644 index 0000000000..3c93ec1346 --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_setting_light_view.xml @@ -0,0 +1,33 @@ + + + + + + + + \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_setting_view.xml b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_setting_view.xml deleted file mode 100644 index e83b88ef1c..0000000000 --- a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_setting_view.xml +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_p_ai.xml b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_p_ai.xml new file mode 100644 index 0000000000..f833f8f175 --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_p_ai.xml @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_p_bottom_bar.xml b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_p_bottom_bar.xml index 923b54aa0f..e453b0981c 100644 --- a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_p_bottom_bar.xml +++ b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_p_bottom_bar.xml @@ -1,131 +1,118 @@ - - - - + tools:ignore="MissingDefaultResource" + tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout"> + android:visibility="invisible" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintBottom_toBottomOf="parent" + tools:visibility="visible" /> - - + android:layout_height="match_parent" + app:backageViewId="@+id/actv_precisionmap_press" + app:bottomShowIcon="false" + app:bottomTitle="首页" + app:bottomTitleCheckedColor="@color/taxi_cp_41444D" + app:bottomTitleNormalColor="@color/taxi_cp_41444D" + app:layout_constraintStart_toStartOf="@+id/actv_precisionmap_press" + app:layout_constraintEnd_toEndOf="@+id/actv_precisionmap_press" + app:normalDrawable="@drawable/taxt_p_bottom_precisionmap_normal" + app:selectedDrawable="@drawable/taxt_p_bottom_precisionmap_normal" /> + android:visibility="invisible" + app:layout_constraintStart_toEndOf="@+id/actv_precisionmap_press" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintBottom_toBottomOf="parent" + tools:visibility="visible" /> - - + app:layout_constraintStart_toStartOf="@+id/actv_overmap_press" + app:layout_constraintEnd_toEndOf="@+id/actv_overmap_press" + app:normalDrawable="@drawable/taxt_p_bottom_overmap_normal" + app:selectedDrawable="@drawable/taxt_p_bottom_overmap_normal" /> + android:visibility="invisible" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toEndOf="@+id/actv_overmap_press" + tools:visibility="visible" /> + + + + + + android:layout_height="match_parent" + app:backageViewId="@+id/actv_music_press" + app:bottomShowIcon="false" + app:bottomTitle="娱乐" + app:bottomTitleCheckedColor="@color/taxi_cp_41444D" + app:bottomTitleNormalColor="@color/taxi_cp_41444D" + app:isUseSkin="true" + app:layout_constraintStart_toStartOf="@+id/actv_music_press" + app:layout_constraintEnd_toEndOf="@+id/actv_music_press" + app:normalDrawable="@drawable/taxt_p_bottom_music_normal" + app:selectedDrawable="@drawable/taxt_p_bottom_music_normal" /> \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_p_bottom_check.xml b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_p_bottom_check.xml index 0db8c6d706..e60e9d3341 100644 --- a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_p_bottom_check.xml +++ b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_p_bottom_check.xml @@ -12,9 +12,10 @@ app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" + android:src="@drawable/taxt_p_bottom_precisionmap_normal" android:layout_marginTop="@dimen/dp_16" - android:layout_width="@dimen/dp_81" - android:layout_height="@dimen/dp_81"/> + android:layout_width="@dimen/dp_70" + android:layout_height="@dimen/dp_71"/> - + - + android:layout_height="0dp" /> - - - - - - - - - - + android:visibility="gone" + android:clickable="true" + android:layout_width="match_parent" + android:layout_height="match_parent"/> @@ -96,27 +65,6 @@ app:fusionLightUser="passenger" /> - - - - - - - - - - - - - - - - @@ -213,9 +121,65 @@ + + + + + + + + + + + + - - - - - - - - - - - @@ -287,4 +213,4 @@ android:layout_height="match_parent"/> - \ No newline at end of file + \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_itinerary.xml b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_itinerary.xml index bb211edaf0..2063ab654b 100644 --- a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_itinerary.xml +++ b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_itinerary.xml @@ -2,15 +2,15 @@ @@ -18,7 +18,7 @@ @@ -34,12 +34,12 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="@dimen/dp_12" - android:layout_marginStart="@dimen/dp_93" + android:layout_marginStart="@dimen/dp_71" + android:layout_marginTop="@dimen/dp_28" android:textColor="@color/taxi_p_004DC4" android:textSize="@dimen/dp_38" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@+id/gl_horizontal_top" - app:layout_constraintBottom_toBottomOf="@+id/gl_horizontal_center" android:text="前往" /> @@ -66,132 +65,48 @@ android:textSize="@dimen/dp_38" android:layout_marginEnd="@dimen/dp_8" app:layout_constraintEnd_toStartOf="@+id/actv_arrived_time" - app:layout_constraintTop_toTopOf="@+id/gl_horizontal_top" - app:layout_constraintBottom_toBottomOf="@+id/gl_horizontal_center" + app:layout_constraintBaseline_toBaselineOf="@+id/actv_endstation_title" android:text="到达" /> - - - - - - - - - - - - - - - - - - - - - - + + + \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_list_video_item.xml b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_list_video_item.xml new file mode 100644 index 0000000000..1ac274eb50 --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_list_video_item.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + diff --git a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_mogo_video_layout.xml b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_mogo_video_layout.xml index b6de5bb3a8..33851aa552 100644 --- a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_mogo_video_layout.xml +++ b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_mogo_video_layout.xml @@ -5,33 +5,65 @@ android:id="@+id/infoContainer" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@drawable/taxt_u_p_video_light_bg" tools:ignore="MissingDefaultResource"> + + + + + + + - + + + android:layout_marginBottom="@dimen/dp_160" + android:src="@drawable/taxi_p_vodeo_list_bottom_shade" + android:layout_width="@dimen/dp_520" + android:layout_height="@dimen/dp_103"/> \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_setting_view.xml b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_setting_view.xml deleted file mode 100644 index 22728eb65d..0000000000 --- a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_setting_view.xml +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_speed.xml b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_speed.xml index 8cef74a1d7..3dc4d2ae70 100644 --- a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_speed.xml +++ b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_speed.xml @@ -2,47 +2,33 @@ - - - + \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_statusview.xml b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_statusview.xml index 412d075b04..6435519341 100644 --- a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_statusview.xml +++ b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_statusview.xml @@ -3,49 +3,74 @@ xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" - android:layout_height="@dimen/dp_120" - android:background="@drawable/taxt_u_p_status_bg" + android:layout_height="@dimen/dp_121" tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout" tools:ignore="MissingDefaultResource"> - + + + + android:src="@drawable/taxi_p_bar_center_logo" + android:layout_width="@dimen/dp_225" + android:layout_height="@dimen/dp_58"/> + + - + + + + diff --git a/OCH/taxi/unmanned-passenger/src/main/res/raw/lottie_ai_msg_waiting.json b/OCH/taxi/unmanned-passenger/src/main/res/raw/lottie_ai_msg_waiting.json new file mode 100644 index 0000000000..be7e2a3a70 --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/res/raw/lottie_ai_msg_waiting.json @@ -0,0 +1 @@ +{"v":"5.5.8","fr":29.9700012207031,"ip":0,"op":45.0000018328876,"w":200,"h":200,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"circle_group","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[100,100,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":15,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":23,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":30,"s":[100,100,100]},{"t":45.0000018328876,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[0.57,0.926],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.5294,0.2745,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.5294,0.2745,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-277.715,-177.537],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[72,72],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.5294,0.2745,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0.3255,0.349,0.9922,1]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":23,"s":[0,0.7137,0.9961,1]},{"t":45.0000018328876,"s":[0.3255,0.349,0.9922,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[0,-50],"to":[-9.167,16.667],"ti":[-9.167,-16.667]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":15,"s":[-55,50],"to":[9.167,16.667],"ti":[-9.167,16.667]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":30,"s":[55,50],"to":[9.167,-16.667],"ti":[9.167,16.667]},{"t":45.0000018328876,"s":[0,-50]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"circle_A","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[72,72],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.5294,0.2745,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0.3255,0.349,0.9922,1]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":23,"s":[0,0.7137,0.9961,1]},{"t":45.0000018328876,"s":[0.3255,0.349,0.9922,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[-55,50],"to":[18.333,0],"ti":[-9.167,16.667]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":15,"s":[55,50],"to":[9.167,-16.667],"ti":[18.333,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":30,"s":[0,-50],"to":[-18.333,0],"ti":[9.167,-16.667]},{"t":45.0000018328876,"s":[-55,50]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"circle_B","np":3,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[72,72],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.5294,0.2745,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0.3255,0.349,0.9922,1]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":23,"s":[0,0.7137,0.9961,1]},{"t":45.0000018328876,"s":[0.3255,0.349,0.9922,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[55,50],"to":[-9.167,-16.667],"ti":[18.333,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":15,"s":[0,-50],"to":[-18.333,0],"ti":[-9.167,-16.667]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":30,"s":[-55,50],"to":[9.167,16.667],"ti":[-18.333,0]},{"t":45.0000018328876,"s":[55,50]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"circle_C","np":3,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900.000036657751,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/res/values/colors.xml b/OCH/taxi/unmanned-passenger/src/main/res/values/colors.xml index 6c546c9d69..097c7567c1 100644 --- a/OCH/taxi/unmanned-passenger/src/main/res/values/colors.xml +++ b/OCH/taxi/unmanned-passenger/src/main/res/values/colors.xml @@ -87,7 +87,12 @@ #41444D #9EB0D3 - #009EB0D3 + + #80D4E4F0 + + #A3C9EA + #394047 + #66000000 diff --git a/OCH/taxi/unmanned-passenger/src/main/res/values/ids.xml b/OCH/taxi/unmanned-passenger/src/main/res/values/ids.xml new file mode 100644 index 0000000000..b9a90c85af --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/res/values/ids.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/res/values/strings.xml b/OCH/taxi/unmanned-passenger/src/main/res/values/strings.xml index 29fcc1a9a9..a7ee3ad5e2 100644 --- a/OCH/taxi/unmanned-passenger/src/main/res/values/strings.xml +++ b/OCH/taxi/unmanned-passenger/src/main/res/values/strings.xml @@ -37,17 +37,11 @@ 自动驾驶启动失败,请与司机确认车辆状态 车辆尚未完成准备,不能启动自动驾驶 - 距离(KM) - 距离(M) - 剩余(分) + 公里 + + 分钟 - 亮度 - 音量 - - 亮度 - 音量 - 蘑菇资讯 diff --git a/OCH/taxi/unmanned-passenger/src/main/res/values/styles.xml b/OCH/taxi/unmanned-passenger/src/main/res/values/styles.xml index c25b0cb016..244df190fa 100644 --- a/OCH/taxi/unmanned-passenger/src/main/res/values/styles.xml +++ b/OCH/taxi/unmanned-passenger/src/main/res/values/styles.xml @@ -58,4 +58,41 @@ #80000000 11 + + + + + + + + + \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/res/xml/fragment_ai_scene.xml b/OCH/taxi/unmanned-passenger/src/main/res/xml/fragment_ai_scene.xml new file mode 100644 index 0000000000..31dd7b1a27 --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/res/xml/fragment_ai_scene.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 5603bbbcb4..00ee8f07cc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -14,6 +14,10 @@ apply from: rootProject.file('gradle/bytex/bytex.gradle') Properties properties = new Properties() properties.load(project.rootProject.file("gradle.properties").newDataInputStream()) +def getBooleanProperty(String key, boolean defaultValue) { + return project.hasProperty(key) ? project.property(key).toBoolean() : defaultValue +} + android { compileSdkVersion rootProject.ext.android.compileSdkVersion defaultConfig { @@ -38,6 +42,8 @@ android { buildConfigField 'String', 'MAP_SDK_VERSION', "\"${MAP_SDK_VERSION}\"" buildConfigField 'String', 'MAP_SDK_OPT_VERSION', "\"${MAP_SDK_OPERATION_VERSION}\"" + buildConfigField "boolean", "enableSweeper", "${getBooleanProperty('enableSweeper', false)}" + // ②车机类型,主要用于区分自研车机还是别人家的车机,自研车机类型为0 buildConfigField 'int', 'CAR_MACHINE_TYPE', '2' @@ -140,7 +146,7 @@ android { // 项目 business // 业务线 product // 车型 vehicle - flavorDimensions "project","vehicle" ,"role", "env" + flavorDimensions "project","role", "env" productFlavors { } @@ -150,15 +156,7 @@ android { apply from: "./script/roleFlavors/passenger.gradle" apply from: "./script/roleFlavors/driverpassenger.gradle" - // 配置不同渠道参数,直接影响功能完整度 - apply from: "./script/vehicleFlavors/B1.gradle" - apply from: "./script/vehicleFlavors/B2.gradle" - apply from: "./script/vehicleFlavors/T1T2.gradle" - apply from: "./script/vehicleFlavors/ALL.gradle" - apply from: "./script/vehicleFlavors/C1.gradle" - //包车 - apply from: "./script/vehicleFlavors/M1.gradle" - apply from: "./script/flavorfilter/flavorsFilterConfig.gradle" +// apply from: "./script/flavorfilter/flavorsFilterConfig.gradle" packagingOptions { exclude 'META-INF/io.netty.versions.properties' diff --git a/app/config/MediaUrlConfig.json b/app/config/MediaUrlConfig.json index 2a41f95842..0d77d0bcc2 100644 --- a/app/config/MediaUrlConfig.json +++ b/app/config/MediaUrlConfig.json @@ -1,6 +1,6 @@ { "mogo": { - "b1passenger": { + "B1": { "medias": [ { "fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1676357256102/1.jpg", @@ -74,7 +74,7 @@ } ] }, - "b2passenger": { + "B2": { "medias": [ { "fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1681716116231/6923474a99a1983c9a0410ad3357888d.mov", @@ -92,7 +92,7 @@ } ] }, - "t1t2passengeroch": { + "T1T2": { "medias": [ { "fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655708499497/大运会合作解说版.m4v", @@ -122,9 +122,131 @@ "priority": 2, "title": "多视角体验蘑菇车联自动驾驶" } + ], + "musics": [ + { + "id": "1", + "md5": "C24399007B8DBAAEAA6EF448A25393CE", + "songName": "钢琴曲", + "songUrl": "android.resource://com.mogo.launcher.f/raw/piano_music.mp3", + "songUrlType": "local", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332930796/taxt_p_music_head_05.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_05.png", + "tag": [ + "放松" + ] + }, + { + "id": "2", + "md5": "ECA45497D915E0B933E45B5A5411B30E", + "songName": "唯美的梦", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523329643/beautiful_dream.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332917335/taxt_p_music_head_04.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718199388/taxt_p_music_bottom_04.png", + "tag": [ + "放松" + ] + }, + { + "id": "3", + "md5": "8FA0DE702443CD05BCA6DB1B7E6BE036", + "songName": "有趣的时光", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523382842/fun_times.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332904487/taxt_p_music_head_03.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718184532/taxt_p_music_bottom_03.png", + "tag": [ + "欢快" + ] + }, + { + "id": "4", + "md5": "FB1EF41BC69216AAA90323F3FBABDDDF", + "songName": "游乐场", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523484705/playground_fun.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332890890/taxt_p_music_head_02.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718167794/taxt_p_music_bottom_02.png", + "tag": [ + "欢快" + ] + }, + { + "id": "5", + "md5": "B721B4FBAE2D472F875A3A539135337A", + "songName": "鼓舞我", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523537118/uplift_me.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332876104/taxt_p_music_head_01.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png", + "tag": [ + "动感" + ] + }, + { + "id": "6", + "md5": "836B99E70B7BC5C2283D602DF60F45F2", + "songName": "假日乐趣", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523604653/summer_fun.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332876104/taxt_p_music_head_01.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png", + "tag": [ + "动感" + ] + }, + { + "id": "7", + "md5": "6B0B9FEF15B0FC8F1A1EAB6793DE5C02", + "songName": "伟大梦想", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523656707/dreaming_big.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332876104/taxt_p_music_head_01.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png", + "tag": [ + "浪漫" + ] + }, + { + "id": "8", + "md5": "3E8EE95E9E838709601D8BB8E2CC6B2A", + "songName": "钢琴映像", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523740974/piano_reflections.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332890890/taxt_p_music_head_02.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718167794/taxt_p_music_bottom_02.png", + "tag": [ + "浪漫" + ] + }, + { + "id": "9", + "md5": "59D695BB96DF67DBC0F5B064D727DA4A", + "songName": "宁静的景色", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523785714/serene_view.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332917335/taxt_p_music_head_04.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718199388/taxt_p_music_bottom_04.png", + "tag": [ + "静谧" + ] + }, + { + "id": "10", + "md5": "1FBFA6AB04AA76168FDFDAFB0E189F4D", + "songName": "困倦小猫", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523857450/sleepy_cat.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332876104/taxt_p_music_head_01.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png", + "tag": [ + "静谧" + ] + } ] }, - "m1passenger": { + "M1": { "medias": [ { "fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655708499497/大运会合作解说版.m4v", @@ -154,11 +276,133 @@ "priority": 2, "title": "多视角体验蘑菇车联自动驾驶" } + ], + "musics": [ + { + "id": "1", + "md5": "C24399007B8DBAAEAA6EF448A25393CE", + "songName": "钢琴曲", + "songUrl": "android.resource://com.mogo.launcher.f/raw/piano_music.mp3", + "songUrlType": "local", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332930796/taxt_p_music_head_05.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_05.png", + "tag": [ + "放松" + ] + }, + { + "id": "2", + "md5": "ECA45497D915E0B933E45B5A5411B30E", + "songName": "唯美的梦", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523329643/beautiful_dream.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332917335/taxt_p_music_head_04.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718199388/taxt_p_music_bottom_04.png", + "tag": [ + "放松" + ] + }, + { + "id": "3", + "md5": "8FA0DE702443CD05BCA6DB1B7E6BE036", + "songName": "有趣的时光", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523382842/fun_times.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332904487/taxt_p_music_head_03.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718184532/taxt_p_music_bottom_03.png", + "tag": [ + "欢快" + ] + }, + { + "id": "4", + "md5": "FB1EF41BC69216AAA90323F3FBABDDDF", + "songName": "游乐场", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523484705/playground_fun.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332890890/taxt_p_music_head_02.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718167794/taxt_p_music_bottom_02.png", + "tag": [ + "欢快" + ] + }, + { + "id": "5", + "md5": "B721B4FBAE2D472F875A3A539135337A", + "songName": "鼓舞我", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523537118/uplift_me.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332876104/taxt_p_music_head_01.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png", + "tag": [ + "动感" + ] + }, + { + "id": "6", + "md5": "836B99E70B7BC5C2283D602DF60F45F2", + "songName": "假日乐趣", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523604653/summer_fun.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332876104/taxt_p_music_head_01.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png", + "tag": [ + "动感" + ] + }, + { + "id": "7", + "md5": "6B0B9FEF15B0FC8F1A1EAB6793DE5C02", + "songName": "伟大梦想", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523656707/dreaming_big.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332876104/taxt_p_music_head_01.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png", + "tag": [ + "浪漫" + ] + }, + { + "id": "8", + "md5": "3E8EE95E9E838709601D8BB8E2CC6B2A", + "songName": "钢琴映像", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523740974/piano_reflections.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332890890/taxt_p_music_head_02.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718167794/taxt_p_music_bottom_02.png", + "tag": [ + "浪漫" + ] + }, + { + "id": "9", + "md5": "59D695BB96DF67DBC0F5B064D727DA4A", + "songName": "宁静的景色", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523785714/serene_view.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332917335/taxt_p_music_head_04.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718199388/taxt_p_music_bottom_04.png", + "tag": [ + "静谧" + ] + }, + { + "id": "10", + "md5": "1FBFA6AB04AA76168FDFDAFB0E189F4D", + "songName": "困倦小猫", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523857450/sleepy_cat.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332876104/taxt_p_music_head_01.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png", + "tag": [ + "静谧" + ] + } ] } }, "dali": { - "b1passenger": { + "B1": { "medias": [ { "fileUrl": "https://img.zhidaozhixing.com/fileServer/defaultPath/e6b517469d016169621298c18f7e5bbe/dl.mp4", @@ -244,7 +488,7 @@ } ] }, - "b2passenger": { + "B2": { "medias": [ { "fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1681716116231/6923474a99a1983c9a0410ad3357888d.mov", @@ -262,7 +506,7 @@ } ] }, - "t1t2passengerochd": { + "T1T2": { "medias": [ { "fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655708499497/大运会合作解说版.m4v", @@ -294,7 +538,7 @@ } ] }, - "m1passenger": { + "M1": { "medias": [ { "fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655708499497/大运会合作解说版.m4v", @@ -324,11 +568,133 @@ "priority": 2, "title": "多视角体验蘑菇车联自动驾驶" } + ], + "musics": [ + { + "id": "1", + "md5": "C24399007B8DBAAEAA6EF448A25393CE", + "songName": "钢琴曲", + "songUrl": "android.resource://com.mogo.launcher.f/raw/piano_music.mp3", + "songUrlType": "local", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332930796/taxt_p_music_head_05.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_05.png", + "tag": [ + "放松" + ] + }, + { + "id": "2", + "md5": "ECA45497D915E0B933E45B5A5411B30E", + "songName": "唯美的梦", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523329643/beautiful_dream.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332917335/taxt_p_music_head_04.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718199388/taxt_p_music_bottom_04.png", + "tag": [ + "放松" + ] + }, + { + "id": "3", + "md5": "8FA0DE702443CD05BCA6DB1B7E6BE036", + "songName": "有趣的时光", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523382842/fun_times.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332904487/taxt_p_music_head_03.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718184532/taxt_p_music_bottom_03.png", + "tag": [ + "欢快" + ] + }, + { + "id": "4", + "md5": "FB1EF41BC69216AAA90323F3FBABDDDF", + "songName": "游乐场", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523484705/playground_fun.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332890890/taxt_p_music_head_02.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718167794/taxt_p_music_bottom_02.png", + "tag": [ + "欢快" + ] + }, + { + "id": "5", + "md5": "B721B4FBAE2D472F875A3A539135337A", + "songName": "鼓舞我", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523537118/uplift_me.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332876104/taxt_p_music_head_01.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png", + "tag": [ + "动感" + ] + }, + { + "id": "6", + "md5": "836B99E70B7BC5C2283D602DF60F45F2", + "songName": "假日乐趣", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523604653/summer_fun.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332876104/taxt_p_music_head_01.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png", + "tag": [ + "动感" + ] + }, + { + "id": "7", + "md5": "6B0B9FEF15B0FC8F1A1EAB6793DE5C02", + "songName": "伟大梦想", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523656707/dreaming_big.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332876104/taxt_p_music_head_01.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png", + "tag": [ + "浪漫" + ] + }, + { + "id": "8", + "md5": "3E8EE95E9E838709601D8BB8E2CC6B2A", + "songName": "钢琴映像", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523740974/piano_reflections.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332890890/taxt_p_music_head_02.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718167794/taxt_p_music_bottom_02.png", + "tag": [ + "浪漫" + ] + }, + { + "id": "9", + "md5": "59D695BB96DF67DBC0F5B064D727DA4A", + "songName": "宁静的景色", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523785714/serene_view.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332917335/taxt_p_music_head_04.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718199388/taxt_p_music_bottom_04.png", + "tag": [ + "静谧" + ] + }, + { + "id": "10", + "md5": "1FBFA6AB04AA76168FDFDAFB0E189F4D", + "songName": "困倦小猫", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523857450/sleepy_cat.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332876104/taxt_p_music_head_01.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png", + "tag": [ + "静谧" + ] + } ] } }, "yantai": { - "b1passenger": { + "B1": { "medias": [ { "fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1681210971943/yangmadou.mp4", @@ -346,7 +712,7 @@ } ] }, - "b2passenger": { + "B2": { "medias": [ { "fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1681716116231/6923474a99a1983c9a0410ad3357888d.mov", @@ -364,7 +730,7 @@ } ] }, - "t1t2passengeroch": { + "T1T2": { "medias": [ { "fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655708499497/大运会合作解说版.m4v", @@ -396,7 +762,7 @@ } ] }, - "m1passenger": { + "M1": { "medias": [ { "fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655708499497/大运会合作解说版.m4v", @@ -426,11 +792,133 @@ "priority": 2, "title": "多视角体验蘑菇车联自动驾驶" } + ], + "musics": [ + { + "id": "1", + "md5": "C24399007B8DBAAEAA6EF448A25393CE", + "songName": "钢琴曲", + "songUrl": "android.resource://com.mogo.launcher.f/raw/piano_music.mp3", + "songUrlType": "local", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332930796/taxt_p_music_head_05.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_05.png", + "tag": [ + "放松" + ] + }, + { + "id": "2", + "md5": "ECA45497D915E0B933E45B5A5411B30E", + "songName": "唯美的梦", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523329643/beautiful_dream.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332917335/taxt_p_music_head_04.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718199388/taxt_p_music_bottom_04.png", + "tag": [ + "放松" + ] + }, + { + "id": "3", + "md5": "8FA0DE702443CD05BCA6DB1B7E6BE036", + "songName": "有趣的时光", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523382842/fun_times.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332904487/taxt_p_music_head_03.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718184532/taxt_p_music_bottom_03.png", + "tag": [ + "欢快" + ] + }, + { + "id": "4", + "md5": "FB1EF41BC69216AAA90323F3FBABDDDF", + "songName": "游乐场", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523484705/playground_fun.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332890890/taxt_p_music_head_02.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718167794/taxt_p_music_bottom_02.png", + "tag": [ + "欢快" + ] + }, + { + "id": "5", + "md5": "B721B4FBAE2D472F875A3A539135337A", + "songName": "鼓舞我", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523537118/uplift_me.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332876104/taxt_p_music_head_01.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png", + "tag": [ + "动感" + ] + }, + { + "id": "6", + "md5": "836B99E70B7BC5C2283D602DF60F45F2", + "songName": "假日乐趣", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523604653/summer_fun.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332876104/taxt_p_music_head_01.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png", + "tag": [ + "动感" + ] + }, + { + "id": "7", + "md5": "6B0B9FEF15B0FC8F1A1EAB6793DE5C02", + "songName": "伟大梦想", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523656707/dreaming_big.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332876104/taxt_p_music_head_01.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png", + "tag": [ + "浪漫" + ] + }, + { + "id": "8", + "md5": "3E8EE95E9E838709601D8BB8E2CC6B2A", + "songName": "钢琴映像", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523740974/piano_reflections.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332890890/taxt_p_music_head_02.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718167794/taxt_p_music_bottom_02.png", + "tag": [ + "浪漫" + ] + }, + { + "id": "9", + "md5": "59D695BB96DF67DBC0F5B064D727DA4A", + "songName": "宁静的景色", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523785714/serene_view.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332917335/taxt_p_music_head_04.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718199388/taxt_p_music_bottom_04.png", + "tag": [ + "静谧" + ] + }, + { + "id": "10", + "md5": "1FBFA6AB04AA76168FDFDAFB0E189F4D", + "songName": "困倦小猫", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523857450/sleepy_cat.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332876104/taxt_p_music_head_01.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png", + "tag": [ + "静谧" + ] + } ] } }, "saas": { - "b1passenger": { + "B1": { "medias": [ { "fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1676357256102/1.jpg", @@ -504,7 +992,7 @@ } ] }, - "b2passenger": { + "B2": { "medias": [ { "fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1681716116231/6923474a99a1983c9a0410ad3357888d.mov", @@ -522,7 +1010,7 @@ } ] }, - "t1t2passengeroch": { + "T1T2": { "medias": [ { "fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655708499497/大运会合作解说版.m4v", @@ -552,9 +1040,131 @@ "priority": 2, "title": "多视角体验蘑菇车联自动驾驶" } + ], + "musics": [ + { + "id": "1", + "md5": "C24399007B8DBAAEAA6EF448A25393CE", + "songName": "钢琴曲", + "songUrl": "android.resource://com.mogo.launcher.f/raw/piano_music.mp3", + "songUrlType": "local", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332930796/taxt_p_music_head_05.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_05.png", + "tag": [ + "放松" + ] + }, + { + "id": "2", + "md5": "ECA45497D915E0B933E45B5A5411B30E", + "songName": "唯美的梦", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523329643/beautiful_dream.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332917335/taxt_p_music_head_04.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718199388/taxt_p_music_bottom_04.png", + "tag": [ + "放松" + ] + }, + { + "id": "3", + "md5": "8FA0DE702443CD05BCA6DB1B7E6BE036", + "songName": "有趣的时光", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523382842/fun_times.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332904487/taxt_p_music_head_03.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718184532/taxt_p_music_bottom_03.png", + "tag": [ + "欢快" + ] + }, + { + "id": "4", + "md5": "FB1EF41BC69216AAA90323F3FBABDDDF", + "songName": "游乐场", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523484705/playground_fun.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332890890/taxt_p_music_head_02.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718167794/taxt_p_music_bottom_02.png", + "tag": [ + "欢快" + ] + }, + { + "id": "5", + "md5": "B721B4FBAE2D472F875A3A539135337A", + "songName": "鼓舞我", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523537118/uplift_me.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332876104/taxt_p_music_head_01.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png", + "tag": [ + "动感" + ] + }, + { + "id": "6", + "md5": "836B99E70B7BC5C2283D602DF60F45F2", + "songName": "假日乐趣", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523604653/summer_fun.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332876104/taxt_p_music_head_01.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png", + "tag": [ + "动感" + ] + }, + { + "id": "7", + "md5": "6B0B9FEF15B0FC8F1A1EAB6793DE5C02", + "songName": "伟大梦想", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523656707/dreaming_big.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332876104/taxt_p_music_head_01.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png", + "tag": [ + "浪漫" + ] + }, + { + "id": "8", + "md5": "3E8EE95E9E838709601D8BB8E2CC6B2A", + "songName": "钢琴映像", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523740974/piano_reflections.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332890890/taxt_p_music_head_02.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718167794/taxt_p_music_bottom_02.png", + "tag": [ + "浪漫" + ] + }, + { + "id": "9", + "md5": "59D695BB96DF67DBC0F5B064D727DA4A", + "songName": "宁静的景色", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523785714/serene_view.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332917335/taxt_p_music_head_04.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718199388/taxt_p_music_bottom_04.png", + "tag": [ + "静谧" + ] + }, + { + "id": "10", + "md5": "1FBFA6AB04AA76168FDFDAFB0E189F4D", + "songName": "困倦小猫", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523857450/sleepy_cat.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332876104/taxt_p_music_head_01.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png", + "tag": [ + "静谧" + ] + } ] }, - "m1passenger": { + "M1": { "medias": [ { "fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655708499497/大运会合作解说版.m4v", @@ -584,6 +1194,128 @@ "priority": 2, "title": "多视角体验蘑菇车联自动驾驶" } + ], + "musics": [ + { + "id": "1", + "md5": "C24399007B8DBAAEAA6EF448A25393CE", + "songName": "钢琴曲", + "songUrl": "android.resource://com.mogo.launcher.f/raw/piano_music.mp3", + "songUrlType": "local", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332930796/taxt_p_music_head_05.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_05.png", + "tag": [ + "放松" + ] + }, + { + "id": "2", + "md5": "ECA45497D915E0B933E45B5A5411B30E", + "songName": "唯美的梦", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523329643/beautiful_dream.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332917335/taxt_p_music_head_04.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718199388/taxt_p_music_bottom_04.png", + "tag": [ + "放松" + ] + }, + { + "id": "3", + "md5": "8FA0DE702443CD05BCA6DB1B7E6BE036", + "songName": "有趣的时光", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523382842/fun_times.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332904487/taxt_p_music_head_03.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718184532/taxt_p_music_bottom_03.png", + "tag": [ + "欢快" + ] + }, + { + "id": "4", + "md5": "FB1EF41BC69216AAA90323F3FBABDDDF", + "songName": "游乐场", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523484705/playground_fun.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332890890/taxt_p_music_head_02.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718167794/taxt_p_music_bottom_02.png", + "tag": [ + "欢快" + ] + }, + { + "id": "5", + "md5": "B721B4FBAE2D472F875A3A539135337A", + "songName": "鼓舞我", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523537118/uplift_me.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332876104/taxt_p_music_head_01.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png", + "tag": [ + "动感" + ] + }, + { + "id": "6", + "md5": "836B99E70B7BC5C2283D602DF60F45F2", + "songName": "假日乐趣", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523604653/summer_fun.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332876104/taxt_p_music_head_01.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png", + "tag": [ + "动感" + ] + }, + { + "id": "7", + "md5": "6B0B9FEF15B0FC8F1A1EAB6793DE5C02", + "songName": "伟大梦想", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523656707/dreaming_big.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332876104/taxt_p_music_head_01.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png", + "tag": [ + "浪漫" + ] + }, + { + "id": "8", + "md5": "3E8EE95E9E838709601D8BB8E2CC6B2A", + "songName": "钢琴映像", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523740974/piano_reflections.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332890890/taxt_p_music_head_02.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718167794/taxt_p_music_bottom_02.png", + "tag": [ + "浪漫" + ] + }, + { + "id": "9", + "md5": "59D695BB96DF67DBC0F5B064D727DA4A", + "songName": "宁静的景色", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523785714/serene_view.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332917335/taxt_p_music_head_04.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718199388/taxt_p_music_bottom_04.png", + "tag": [ + "静谧" + ] + }, + { + "id": "10", + "md5": "1FBFA6AB04AA76168FDFDAFB0E189F4D", + "songName": "困倦小猫", + "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523857450/sleepy_cat.mp3", + "songUrlType": "cloud", + "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332876104/taxt_p_music_head_01.png", + "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png", + "tag": [ + "静谧" + ] + } ] } } diff --git a/app/config/MusicUrlConfig.json b/app/config/MusicUrlConfig.json deleted file mode 100644 index 69cd168ea2..0000000000 --- a/app/config/MusicUrlConfig.json +++ /dev/null @@ -1,754 +0,0 @@ -{ - "mogo": { - "t1t2passenger": { - "musics": [ - { - "id": "1", - "md5": "C24399007B8DBAAEAA6EF448A25393CE", - "songName": "钢琴曲", - "songUrl": "android.resource://com.mogo.launcher.f/raw/piano_music.mp3", - "songUrlType": "local", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332930796/taxt_p_music_head_05.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_05.png", - "tag": [ - "放松" - ] - }, - { - "id": "2", - "md5": "ECA45497D915E0B933E45B5A5411B30E", - "songName": "唯美的梦", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523329643/beautiful_dream.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332917335/taxt_p_music_head_04.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718199388/taxt_p_music_bottom_04.png", - "tag": [ - "放松" - ] - }, - { - "id": "3", - "md5": "8FA0DE702443CD05BCA6DB1B7E6BE036", - "songName": "有趣的时光", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523382842/fun_times.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332904487/taxt_p_music_head_03.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718184532/taxt_p_music_bottom_03.png", - "tag": [ - "欢快" - ] - }, - { - "id": "4", - "md5": "FB1EF41BC69216AAA90323F3FBABDDDF", - "songName": "游乐场", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523484705/playground_fun.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332890890/taxt_p_music_head_02.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718167794/taxt_p_music_bottom_02.png", - "tag": [ - "欢快" - ] - }, - { - "id": "5", - "md5": "B721B4FBAE2D472F875A3A539135337A", - "songName": "鼓舞我", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523537118/uplift_me.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332876104/taxt_p_music_head_01.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png", - "tag": [ - "动感" - ] - }, - { - "id": "6", - "md5": "836B99E70B7BC5C2283D602DF60F45F2", - "songName": "假日乐趣", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523604653/summer_fun.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332876104/taxt_p_music_head_01.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png", - "tag": [ - "动感" - ] - }, - { - "id": "7", - "md5": "6B0B9FEF15B0FC8F1A1EAB6793DE5C02", - "songName": "伟大梦想", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523656707/dreaming_big.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332876104/taxt_p_music_head_01.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png", - "tag": [ - "浪漫" - ] - }, - { - "id": "8", - "md5": "3E8EE95E9E838709601D8BB8E2CC6B2A", - "songName": "钢琴映像", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523740974/piano_reflections.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332890890/taxt_p_music_head_02.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718167794/taxt_p_music_bottom_02.png", - "tag": [ - "浪漫" - ] - }, - { - "id": "9", - "md5": "59D695BB96DF67DBC0F5B064D727DA4A", - "songName": "宁静的景色", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523785714/serene_view.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332917335/taxt_p_music_head_04.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718199388/taxt_p_music_bottom_04.png", - "tag": [ - "静谧" - ] - }, - { - "id": "10", - "md5": "1FBFA6AB04AA76168FDFDAFB0E189F4D", - "songName": "困倦小猫", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523857450/sleepy_cat.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332876104/taxt_p_music_head_01.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png", - "tag": [ - "静谧" - ] - } - ] - }, - "m1passenger": { - "musics": [ - { - "id": "1", - "md5": "C24399007B8DBAAEAA6EF448A25393CE", - "songName": "钢琴曲", - "songUrl": "android.resource://com.mogo.launcher.f/raw/piano_music.mp3", - "songUrlType": "local", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332930796/taxt_p_music_head_05.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_05.png", - "tag": [ - "放松" - ] - }, - { - "id": "2", - "md5": "ECA45497D915E0B933E45B5A5411B30E", - "songName": "唯美的梦", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523329643/beautiful_dream.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332917335/taxt_p_music_head_04.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718199388/taxt_p_music_bottom_04.png", - "tag": [ - "放松" - ] - }, - { - "id": "3", - "md5": "8FA0DE702443CD05BCA6DB1B7E6BE036", - "songName": "有趣的时光", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523382842/fun_times.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332904487/taxt_p_music_head_03.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718184532/taxt_p_music_bottom_03.png", - "tag": [ - "欢快" - ] - }, - { - "id": "4", - "md5": "FB1EF41BC69216AAA90323F3FBABDDDF", - "songName": "游乐场", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523484705/playground_fun.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332890890/taxt_p_music_head_02.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718167794/taxt_p_music_bottom_02.png", - "tag": [ - "欢快" - ] - }, - { - "id": "5", - "md5": "B721B4FBAE2D472F875A3A539135337A", - "songName": "鼓舞我", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523537118/uplift_me.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332876104/taxt_p_music_head_01.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png", - "tag": [ - "动感" - ] - }, - { - "id": "6", - "md5": "836B99E70B7BC5C2283D602DF60F45F2", - "songName": "假日乐趣", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523604653/summer_fun.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332876104/taxt_p_music_head_01.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png", - "tag": [ - "动感" - ] - }, - { - "id": "7", - "md5": "6B0B9FEF15B0FC8F1A1EAB6793DE5C02", - "songName": "伟大梦想", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523656707/dreaming_big.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332876104/taxt_p_music_head_01.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png", - "tag": [ - "浪漫" - ] - }, - { - "id": "8", - "md5": "3E8EE95E9E838709601D8BB8E2CC6B2A", - "songName": "钢琴映像", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523740974/piano_reflections.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332890890/taxt_p_music_head_02.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718167794/taxt_p_music_bottom_02.png", - "tag": [ - "浪漫" - ] - }, - { - "id": "9", - "md5": "59D695BB96DF67DBC0F5B064D727DA4A", - "songName": "宁静的景色", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523785714/serene_view.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332917335/taxt_p_music_head_04.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718199388/taxt_p_music_bottom_04.png", - "tag": [ - "静谧" - ] - }, - { - "id": "10", - "md5": "1FBFA6AB04AA76168FDFDAFB0E189F4D", - "songName": "困倦小猫", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523857450/sleepy_cat.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332876104/taxt_p_music_head_01.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png", - "tag": [ - "静谧" - ] - } - ] - } - }, - "dali": { - "m1passenger": { - "musics": [ - { - "id": "1", - "md5": "C24399007B8DBAAEAA6EF448A25393CE", - "songName": "钢琴曲", - "songUrl": "android.resource://com.mogo.launcher.f/raw/piano_music.mp3", - "songUrlType": "local", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332930796/taxt_p_music_head_05.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_05.png", - "tag": [ - "放松" - ] - }, - { - "id": "2", - "md5": "ECA45497D915E0B933E45B5A5411B30E", - "songName": "唯美的梦", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523329643/beautiful_dream.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332917335/taxt_p_music_head_04.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718199388/taxt_p_music_bottom_04.png", - "tag": [ - "放松" - ] - }, - { - "id": "3", - "md5": "8FA0DE702443CD05BCA6DB1B7E6BE036", - "songName": "有趣的时光", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523382842/fun_times.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332904487/taxt_p_music_head_03.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718184532/taxt_p_music_bottom_03.png", - "tag": [ - "欢快" - ] - }, - { - "id": "4", - "md5": "FB1EF41BC69216AAA90323F3FBABDDDF", - "songName": "游乐场", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523484705/playground_fun.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332890890/taxt_p_music_head_02.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718167794/taxt_p_music_bottom_02.png", - "tag": [ - "欢快" - ] - }, - { - "id": "5", - "md5": "B721B4FBAE2D472F875A3A539135337A", - "songName": "鼓舞我", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523537118/uplift_me.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332876104/taxt_p_music_head_01.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png", - "tag": [ - "动感" - ] - }, - { - "id": "6", - "md5": "836B99E70B7BC5C2283D602DF60F45F2", - "songName": "假日乐趣", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523604653/summer_fun.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332876104/taxt_p_music_head_01.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png", - "tag": [ - "动感" - ] - }, - { - "id": "7", - "md5": "6B0B9FEF15B0FC8F1A1EAB6793DE5C02", - "songName": "伟大梦想", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523656707/dreaming_big.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332876104/taxt_p_music_head_01.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png", - "tag": [ - "浪漫" - ] - }, - { - "id": "8", - "md5": "3E8EE95E9E838709601D8BB8E2CC6B2A", - "songName": "钢琴映像", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523740974/piano_reflections.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332890890/taxt_p_music_head_02.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718167794/taxt_p_music_bottom_02.png", - "tag": [ - "浪漫" - ] - }, - { - "id": "9", - "md5": "59D695BB96DF67DBC0F5B064D727DA4A", - "songName": "宁静的景色", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523785714/serene_view.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332917335/taxt_p_music_head_04.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718199388/taxt_p_music_bottom_04.png", - "tag": [ - "静谧" - ] - }, - { - "id": "10", - "md5": "1FBFA6AB04AA76168FDFDAFB0E189F4D", - "songName": "困倦小猫", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523857450/sleepy_cat.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332876104/taxt_p_music_head_01.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png", - "tag": [ - "静谧" - ] - } - ] - } - }, - "yantai": { - "m1passenger": { - "musics": [ - { - "id": "1", - "md5": "C24399007B8DBAAEAA6EF448A25393CE", - "songName": "钢琴曲", - "songUrl": "android.resource://com.mogo.launcher.f/raw/piano_music.mp3", - "songUrlType": "local", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332930796/taxt_p_music_head_05.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_05.png", - "tag": [ - "放松" - ] - }, - { - "id": "2", - "md5": "ECA45497D915E0B933E45B5A5411B30E", - "songName": "唯美的梦", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523329643/beautiful_dream.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332917335/taxt_p_music_head_04.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718199388/taxt_p_music_bottom_04.png", - "tag": [ - "放松" - ] - }, - { - "id": "3", - "md5": "8FA0DE702443CD05BCA6DB1B7E6BE036", - "songName": "有趣的时光", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523382842/fun_times.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332904487/taxt_p_music_head_03.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718184532/taxt_p_music_bottom_03.png", - "tag": [ - "欢快" - ] - }, - { - "id": "4", - "md5": "FB1EF41BC69216AAA90323F3FBABDDDF", - "songName": "游乐场", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523484705/playground_fun.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332890890/taxt_p_music_head_02.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718167794/taxt_p_music_bottom_02.png", - "tag": [ - "欢快" - ] - }, - { - "id": "5", - "md5": "B721B4FBAE2D472F875A3A539135337A", - "songName": "鼓舞我", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523537118/uplift_me.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332876104/taxt_p_music_head_01.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png", - "tag": [ - "动感" - ] - }, - { - "id": "6", - "md5": "836B99E70B7BC5C2283D602DF60F45F2", - "songName": "假日乐趣", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523604653/summer_fun.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332876104/taxt_p_music_head_01.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png", - "tag": [ - "动感" - ] - }, - { - "id": "7", - "md5": "6B0B9FEF15B0FC8F1A1EAB6793DE5C02", - "songName": "伟大梦想", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523656707/dreaming_big.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332876104/taxt_p_music_head_01.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png", - "tag": [ - "浪漫" - ] - }, - { - "id": "8", - "md5": "3E8EE95E9E838709601D8BB8E2CC6B2A", - "songName": "钢琴映像", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523740974/piano_reflections.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332890890/taxt_p_music_head_02.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718167794/taxt_p_music_bottom_02.png", - "tag": [ - "浪漫" - ] - }, - { - "id": "9", - "md5": "59D695BB96DF67DBC0F5B064D727DA4A", - "songName": "宁静的景色", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523785714/serene_view.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332917335/taxt_p_music_head_04.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718199388/taxt_p_music_bottom_04.png", - "tag": [ - "静谧" - ] - }, - { - "id": "10", - "md5": "1FBFA6AB04AA76168FDFDAFB0E189F4D", - "songName": "困倦小猫", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523857450/sleepy_cat.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332876104/taxt_p_music_head_01.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png", - "tag": [ - "静谧" - ] - } - ] - } - }, - "saas": { - "t1t2passenger": { - "musics": [ - { - "id": "1", - "md5": "C24399007B8DBAAEAA6EF448A25393CE", - "songName": "钢琴曲", - "songUrl": "android.resource://com.mogo.launcher.f/raw/piano_music.mp3", - "songUrlType": "local", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332930796/taxt_p_music_head_05.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_05.png", - "tag": [ - "放松" - ] - }, - { - "id": "2", - "md5": "ECA45497D915E0B933E45B5A5411B30E", - "songName": "唯美的梦", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523329643/beautiful_dream.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332917335/taxt_p_music_head_04.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718199388/taxt_p_music_bottom_04.png", - "tag": [ - "放松" - ] - }, - { - "id": "3", - "md5": "8FA0DE702443CD05BCA6DB1B7E6BE036", - "songName": "有趣的时光", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523382842/fun_times.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332904487/taxt_p_music_head_03.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718184532/taxt_p_music_bottom_03.png", - "tag": [ - "欢快" - ] - }, - { - "id": "4", - "md5": "FB1EF41BC69216AAA90323F3FBABDDDF", - "songName": "游乐场", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523484705/playground_fun.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332890890/taxt_p_music_head_02.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718167794/taxt_p_music_bottom_02.png", - "tag": [ - "欢快" - ] - }, - { - "id": "5", - "md5": "B721B4FBAE2D472F875A3A539135337A", - "songName": "鼓舞我", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523537118/uplift_me.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332876104/taxt_p_music_head_01.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png", - "tag": [ - "动感" - ] - }, - { - "id": "6", - "md5": "836B99E70B7BC5C2283D602DF60F45F2", - "songName": "假日乐趣", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523604653/summer_fun.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332876104/taxt_p_music_head_01.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png", - "tag": [ - "动感" - ] - }, - { - "id": "7", - "md5": "6B0B9FEF15B0FC8F1A1EAB6793DE5C02", - "songName": "伟大梦想", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523656707/dreaming_big.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332876104/taxt_p_music_head_01.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png", - "tag": [ - "浪漫" - ] - }, - { - "id": "8", - "md5": "3E8EE95E9E838709601D8BB8E2CC6B2A", - "songName": "钢琴映像", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523740974/piano_reflections.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332890890/taxt_p_music_head_02.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718167794/taxt_p_music_bottom_02.png", - "tag": [ - "浪漫" - ] - }, - { - "id": "9", - "md5": "59D695BB96DF67DBC0F5B064D727DA4A", - "songName": "宁静的景色", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523785714/serene_view.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332917335/taxt_p_music_head_04.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718199388/taxt_p_music_bottom_04.png", - "tag": [ - "静谧" - ] - }, - { - "id": "10", - "md5": "1FBFA6AB04AA76168FDFDAFB0E189F4D", - "songName": "困倦小猫", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523857450/sleepy_cat.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332876104/taxt_p_music_head_01.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png", - "tag": [ - "静谧" - ] - } - ] - }, - "m1passenger": { - "musics": [ - { - "id": "1", - "md5": "C24399007B8DBAAEAA6EF448A25393CE", - "songName": "钢琴曲", - "songUrl": "android.resource://com.mogo.launcher.f/raw/piano_music.mp3", - "songUrlType": "local", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332930796/taxt_p_music_head_05.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_05.png", - "tag": [ - "放松" - ] - }, - { - "id": "2", - "md5": "ECA45497D915E0B933E45B5A5411B30E", - "songName": "唯美的梦", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523329643/beautiful_dream.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332917335/taxt_p_music_head_04.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718199388/taxt_p_music_bottom_04.png", - "tag": [ - "放松" - ] - }, - { - "id": "3", - "md5": "8FA0DE702443CD05BCA6DB1B7E6BE036", - "songName": "有趣的时光", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523382842/fun_times.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332904487/taxt_p_music_head_03.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718184532/taxt_p_music_bottom_03.png", - "tag": [ - "欢快" - ] - }, - { - "id": "4", - "md5": "FB1EF41BC69216AAA90323F3FBABDDDF", - "songName": "游乐场", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523484705/playground_fun.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332890890/taxt_p_music_head_02.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718167794/taxt_p_music_bottom_02.png", - "tag": [ - "欢快" - ] - }, - { - "id": "5", - "md5": "B721B4FBAE2D472F875A3A539135337A", - "songName": "鼓舞我", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523537118/uplift_me.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332876104/taxt_p_music_head_01.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png", - "tag": [ - "动感" - ] - }, - { - "id": "6", - "md5": "836B99E70B7BC5C2283D602DF60F45F2", - "songName": "假日乐趣", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523604653/summer_fun.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332876104/taxt_p_music_head_01.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png", - "tag": [ - "动感" - ] - }, - { - "id": "7", - "md5": "6B0B9FEF15B0FC8F1A1EAB6793DE5C02", - "songName": "伟大梦想", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523656707/dreaming_big.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332876104/taxt_p_music_head_01.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png", - "tag": [ - "浪漫" - ] - }, - { - "id": "8", - "md5": "3E8EE95E9E838709601D8BB8E2CC6B2A", - "songName": "钢琴映像", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523740974/piano_reflections.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332890890/taxt_p_music_head_02.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718167794/taxt_p_music_bottom_02.png", - "tag": [ - "浪漫" - ] - }, - { - "id": "9", - "md5": "59D695BB96DF67DBC0F5B064D727DA4A", - "songName": "宁静的景色", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523785714/serene_view.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332917335/taxt_p_music_head_04.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718199388/taxt_p_music_bottom_04.png", - "tag": [ - "静谧" - ] - }, - { - "id": "10", - "md5": "1FBFA6AB04AA76168FDFDAFB0E189F4D", - "songName": "困倦小猫", - "songUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709523857450/sleepy_cat.mp3", - "songUrlType": "cloud", - "coverHeadImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1711332876104/taxt_p_music_head_01.png", - "coverBottomImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png", - "tag": [ - "静谧" - ] - } - ] - } - } -} diff --git a/app/config/productWithVehicle.json b/app/config/productWithVehicle.json deleted file mode 100644 index 156ca0d5cb..0000000000 --- a/app/config/productWithVehicle.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "mogo": { - "B1":["shuttle","bus"], - "B2":["shuttle","bus"], - "T1T2":["taxi"], - "ALL":["charter","shuttle","bus","taxi"] - }, - "dali": { - "B1":["shuttle"], - "B2":["shuttle"], - "M1":["charter"] - }, - "yantai": { - "B1":["shuttle"], - "B2":["shuttle"], - "M1":["charter"] - }, - "saas": { - "T1T2":["taxi"], - "B1":["shuttle","bus","scheduled"], - "B2":["shuttle","bus","scheduled"], - "M1":["charter","shuttle"], - "ALL":["charter","shuttle","bus","taxi","scheduled"] - } -} diff --git a/app/config/urlConfig.json b/app/config/urlConfig.json index 2c2869e5f8..1ff2715885 100644 --- a/app/config/urlConfig.json +++ b/app/config/urlConfig.json @@ -11,6 +11,7 @@ "eagle_dns_url": "", "bind_driver_qr_url": "", "chart_socket_url":"", + "nde_url":"https://nde-qa-city.zhidaozhixing.com", "secure_active_url":"http://gateway.ee-private-dev1.myghost.zhidaoauto.com/openapi/security/deviceCert/active", "secure_refresh_url":"http://gateway.ee-private-dev1.myghost.zhidaoauto.com/openapi/security/deviceCert/refresh", "secure_auth_url":"http://gateway.ee-private-dev1.myghost.zhidaoauto.com/openapi/security/deviceCert/auth", @@ -28,6 +29,7 @@ "eagle_dns_url": "", "bind_driver_qr_url": "", "chart_socket_url":"", + "nde_url":"https://nde-qa-city.zhidaozhixing.com", "secure_active_url":"https://mygateway.zhidaozhixing.com/openapi/security/deviceCert/active", "secure_refresh_url":"https://mygateway.zhidaozhixing.com/openapi/security/deviceCert/refresh", "secure_auth_url":"https://mygateway.zhidaozhixing.com/openapi/security/deviceCert/auth", @@ -47,6 +49,7 @@ "eagle_dns_url": "http://eagle-dns-a.zhidaozhixing.com/", "bind_driver_qr_url": "https://och-mini-eh.zhidaozhixing.com?pipe=ehsafety&sn=%1$s", "chart_socket_url":"wss://acp-eh.zhidaozhixing.com/ws", + "nde_url":"https://nde-qa-city.zhidaozhixing.com", "secure_active_url":"http://gateway.ee-private-dev1.myghost.zhidaoauto.com/openapi/security/deviceCert/active", "secure_refresh_url":"http://gateway.ee-private-dev1.myghost.zhidaoauto.com/openapi/security/deviceCert/refresh", "secure_auth_url":"http://gateway.ee-private-dev1.myghost.zhidaoauto.com/openapi/security/deviceCert/auth", @@ -64,6 +67,7 @@ "eagle_dns_url": "https://och-hailing-eh.zhidaozhixing.com/", "bind_driver_qr_url": "https://och-mini-eh.zhidaozhixing.com?pipe=ehsafety&sn=%1$s", "chart_socket_url":"wss://acp-eh.zhidaozhixing.com/ws", + "nde_url":"https://nde-qa-city.zhidaozhixing.com", "secure_active_url":"https://mygateway.zhidaozhixing.com/openapi/security/deviceCert/active", "secure_refresh_url":"https://mygateway.zhidaozhixing.com/openapi/security/deviceCert/refresh", "secure_auth_url":"https://mygateway.zhidaozhixing.com/openapi/security/deviceCert/auth", @@ -83,6 +87,7 @@ "eagle_dns_url": "http://eagle-dns-a.zhidaozhixing.com/", "bind_driver_qr_url": "https://och-mini-yt.zhidaozhixing.com?pipe=ytsafety&sn=%1$s", "chart_socket_url":"", + "nde_url":"https://nde-qa-city.zhidaozhixing.com", "secure_active_url":"http://gateway.ee-private-dev1.myghost.zhidaoauto.com/openapi/security/deviceCert/active", "secure_refresh_url":"http://gateway.ee-private-dev1.myghost.zhidaoauto.com/openapi/security/deviceCert/refresh", "secure_auth_url":"http://gateway.ee-private-dev1.myghost.zhidaoauto.com/openapi/security/deviceCert/auth", @@ -100,6 +105,7 @@ "eagle_dns_url": "https://och-hailing-yt.zhidaozhixing.com/", "bind_driver_qr_url": "https://och-mini-yt.zhidaozhixing.com?pipe=ytsafety&sn=%1$s", "chart_socket_url":"", + "nde_url":"https://nde-qa-city.zhidaozhixing.com", "secure_active_url":"https://mygateway.zhidaozhixing.com/openapi/security/deviceCert/active", "secure_refresh_url":"https://mygateway.zhidaozhixing.com/openapi/security/deviceCert/refresh", "secure_auth_url":"https://mygateway.zhidaozhixing.com/openapi/security/deviceCert/auth", @@ -118,6 +124,7 @@ "eagle_dns_url": "https://mogogo-qa.zhidaozhixing.com/", "bind_driver_qr_url": "https://och-mini-mogogo.zhidaozhixing.com?pipe=mogogosafety&sn=%1$s", "chart_socket_url":"", + "nde_url":"https://nde-qa-city.zhidaozhixing.com", "secure_active_url":"http://gateway.ee-private-dev1.myghost.zhidaoauto.com/openapi/security/deviceCert/active", "secure_refresh_url":"http://gateway.ee-private-dev1.myghost.zhidaoauto.com/openapi/security/deviceCert/refresh", "secure_auth_url":"http://gateway.ee-private-dev1.myghost.zhidaoauto.com/openapi/security/deviceCert/auth", @@ -134,6 +141,7 @@ "eagle_dns_url": "https://mogogo.zhidaozhixing.com/", "bind_driver_qr_url": "https://och-mini-mogogo.zhidaozhixing.com?pipe=mogogosafety&sn=%1$s", "chart_socket_url":"", + "nde_url":"https://nde-qa-city.zhidaozhixing.com", "secure_active_url":"https://mygateway.zhidaozhixing.com/openapi/security/deviceCert/active", "secure_refresh_url":"https://mygateway.zhidaozhixing.com/openapi/security/deviceCert/refresh", "secure_auth_url":"https://mygateway.zhidaozhixing.com/openapi/security/deviceCert/auth", diff --git a/app/script/projectFlavors/project.gradle b/app/script/projectFlavors/project.gradle index 6739f8e53d..dae81db6df 100644 --- a/app/script/projectFlavors/project.gradle +++ b/app/script/projectFlavors/project.gradle @@ -8,8 +8,6 @@ project.android.productFlavors { buildConfigField 'int', 'ttsLanguage', "1" // 仅中文 buildConfigField 'String', 'URLs', "\"${readFileToJson("mogo").replace("\"", "\\\"")}\"" buildConfigField 'String', 'mediaUrlConfig', "\"${readMediaUrlConfigFromJsonFile("mogo").replace("\"", "\\\"")}\"" - buildConfigField 'String', 'musicUrlConfig', "\"${readMusicUrlConfigFromJsonFile("mogo").replace("\"", "\\\"")}\"" - buildConfigField 'String', 'supportBusiness', "\"${readProductWithVehicleConfigFromJsonFile("mogo").replace("\"", "\\\"")}\"" } yantai { dimension "project" @@ -17,8 +15,6 @@ project.android.productFlavors { buildConfigField 'int', 'ttsLanguage', "1 << 1" // 中英韩 buildConfigField 'String', 'URLs', "\"${readFileToJson("yantai").replace("\"", "\\\"")}\"" buildConfigField 'String', 'mediaUrlConfig', "\"${readMediaUrlConfigFromJsonFile("yantai").replace("\"", "\\\"")}\"" - buildConfigField 'String', 'musicUrlConfig', "\"${readMusicUrlConfigFromJsonFile("yantai").replace("\"", "\\\"")}\"" - buildConfigField 'String', 'supportBusiness', "\"${readProductWithVehicleConfigFromJsonFile("yantai").replace("\"", "\\\"")}\"" } dali { @@ -27,8 +23,6 @@ project.android.productFlavors { buildConfigField 'int', 'ttsLanguage', "1" // 仅中文 buildConfigField 'String', 'URLs', "\"${readFileToJson("dali").replace("\"", "\\\"")}\"" buildConfigField 'String', 'mediaUrlConfig', "\"${readMediaUrlConfigFromJsonFile("dali").replace("\"", "\\\"")}\"" - buildConfigField 'String', 'musicUrlConfig', "\"${readMusicUrlConfigFromJsonFile("dali").replace("\"", "\\\"")}\"" - buildConfigField 'String', 'supportBusiness', "\"${readProductWithVehicleConfigFromJsonFile("dali").replace("\"", "\\\"")}\"" } saas { dimension "project" @@ -36,8 +30,6 @@ project.android.productFlavors { buildConfigField 'int', 'ttsLanguage', "1" // 仅中文 buildConfigField 'String', 'URLs', "\"${readFileToJson("saas").replace("\"", "\\\"")}\"" buildConfigField 'String', 'mediaUrlConfig', "\"${readMediaUrlConfigFromJsonFile("saas").replace("\"", "\\\"")}\"" - buildConfigField 'String', 'musicUrlConfig', "\"${readMusicUrlConfigFromJsonFile("saas").replace("\"", "\\\"")}\"" - buildConfigField 'String', 'supportBusiness', "\"${readProductWithVehicleConfigFromJsonFile("saas").replace("\"", "\\\"")}\"" } // 配置网络环境,QA、线上、演示 diff --git a/app/script/roleFlavors/driver.gradle b/app/script/roleFlavors/driver.gradle index 5ae2d77a2d..8c73ff9abb 100644 --- a/app/script/roleFlavors/driver.gradle +++ b/app/script/roleFlavors/driver.gradle @@ -8,10 +8,6 @@ project.android.productFlavors { } } - manifestPlaceholders = [ - CHANNEL_VALUE_BODY : "Driver", - ] - // ①标识 buildConfigField 'String', 'APP_IDENTITY_MODE_BODY', "\"Driver\"" diff --git a/app/script/roleFlavors/driverpassenger.gradle b/app/script/roleFlavors/driverpassenger.gradle index 6498a96254..677db4c3a2 100644 --- a/app/script/roleFlavors/driverpassenger.gradle +++ b/app/script/roleFlavors/driverpassenger.gradle @@ -9,10 +9,6 @@ project.android.productFlavors { } } - manifestPlaceholders = [ - CHANNEL_VALUE_BODY : "Passenger", - ] - // ①标识 buildConfigField 'String', 'APP_IDENTITY_MODE_BODY', "\"Passenger\"" diff --git a/app/script/roleFlavors/passenger.gradle b/app/script/roleFlavors/passenger.gradle index 5dc3c3c98b..a3bfb0376a 100644 --- a/app/script/roleFlavors/passenger.gradle +++ b/app/script/roleFlavors/passenger.gradle @@ -8,10 +8,6 @@ project.android.productFlavors { } } - manifestPlaceholders = [ - CHANNEL_VALUE_BODY : "Passenger", - ] - // ①标识 buildConfigField 'String', 'APP_IDENTITY_MODE_BODY', "\"Passenger\"" diff --git a/app/script/utils.gradle b/app/script/utils.gradle index 5769fbdc43..12ece0a793 100644 --- a/app/script/utils.gradle +++ b/app/script/utils.gradle @@ -13,49 +13,9 @@ Object readMediaUrlConfigFromJsonFile(env){ def jsonSlurper = new JsonSlurper() // 解析json def config = jsonSlurper.parse(file) - def flavorNames = variantVehicleName() def jsonOutput = new JsonOutput() - def getKey = flavorNames - config.get(env).each {key, value -> - // 匹配flavor对应的 json - if(flavorNames.toLowerCase().contains(key)){ - getKey = key - return true - } - } - return jsonOutput.toJson(config.get(env).get(getKey)) - } catch (IOException e) { - e.printStackTrace() - } - return null -} - -/** - * 读取各车型宣传视频本地配置 - * @param env - * @return - */ -Object readProductWithVehicleConfigFromJsonFile(env){ - try { - // 加载config.json 文件 - File file = new File("${rootDir}/app/config/productWithVehicle.json") - def jsonSlurper = new JsonSlurper() - // 解析json - def config = jsonSlurper.parse(file) - def flavorNames = variantVehicleName() - def jsonOutput = new JsonOutput() - def getKey = flavorNames - config.get(env).each {key, value -> - // 匹配flavor对应的 json - println "${env}____ 对比${flavorNames.toLowerCase()}---------${key}---${value}" - if(flavorNames.toLowerCase().contains("${env}${key.toLowerCase()}")){ - getKey = key - println "对比结果${flavorNames.toLowerCase()}---------${key}" - return true - } - } - - return jsonOutput.toJson(config.get(env).get(getKey)) + printf("----------------"+config.get(env)) + return jsonOutput.toJson(config.get(env)) } catch (IOException e) { e.printStackTrace() } @@ -64,35 +24,6 @@ Object readProductWithVehicleConfigFromJsonFile(env){ -/** - * 读取各车型宣传视频本地配置 - * @param env - * @return - */ -Object readMusicUrlConfigFromJsonFile(env){ - try { - // 加载config.json 文件 - File file = new File("${rootDir}/app/config/MusicUrlConfig.json") - def jsonSlurper = new JsonSlurper() - // 解析json - def config = jsonSlurper.parse(file) - def flavorNames = variantVehicleName() - def jsonOutput = new JsonOutput() - def getKey = flavorNames - config.get(env).each {key, value -> - // 匹配flavor对应的 json - if(flavorNames.toLowerCase().contains(key)){ - getKey = key - return true - } - } - return jsonOutput.toJson(config.get(env).get(getKey)) - } catch (IOException e) { - e.printStackTrace() - } - return null -} - def variantVehicleName() { if(gradle.startParameter.taskNames.size()>0) { for (String taskName : gradle.startParameter.taskNames) { @@ -138,6 +69,4 @@ ext { isDriver = this.&isDriver isBaiLing = this.&isBaiLing readMediaUrlConfigFromJsonFile = this.&readMediaUrlConfigFromJsonFile - readMusicUrlConfigFromJsonFile = this.&readMusicUrlConfigFromJsonFile - readProductWithVehicleConfigFromJsonFile = this.&readProductWithVehicleConfigFromJsonFile } \ No newline at end of file diff --git a/app/script/vehicleFlavors/ALL.gradle b/app/script/vehicleFlavors/ALL.gradle index 627a5f12f3..2781e92856 100644 --- a/app/script/vehicleFlavors/ALL.gradle +++ b/app/script/vehicleFlavors/ALL.gradle @@ -4,24 +4,6 @@ project.android.productFlavors { dimension "vehicle" missingDimensionStrategy "vehicle","dfhq","jinlvvan" - - // 配置AndroidManifest.xml中用到的参数 - manifestPlaceholders = [ - CHANNEL_VALUE_TAIL: "ALL", - ] - - - // ①标识构建的应用身份类型,具体查看 README.md APP_IDENTITY_MODE规则 - buildConfigField 'String', 'APP_IDENTITY_MODE_TAIL', "\"ALL\"" - - // ②构建的是否要动态更换模型 - buildConfigField 'boolean', 'IS_CAR_MODEL_CHANGE', 'true' - - // ③能启动自驾的档位 MAP<360代码中会移除P档 - buildConfigField 'java.util.Set', 'LAUNCH_AUTOPILOT_GEAR', 'new java.util.HashSet(){{add(chassis.Chassis.GearPosition.GEAR_D);add(chassis.Chassis.GearPosition.GEAR_N);add(chassis.Chassis.GearPosition.GEAR_P);}}' - - // ④是否支持多屏显示 - buildConfigField 'boolean', 'IS_MULTI_DISPLAY', 'false' } } \ No newline at end of file diff --git a/app/script/vehicleFlavors/B1.gradle b/app/script/vehicleFlavors/B1.gradle index e1d9705357..82959214ba 100644 --- a/app/script/vehicleFlavors/B1.gradle +++ b/app/script/vehicleFlavors/B1.gradle @@ -5,21 +5,5 @@ project.android.productFlavors { matchingFallbacks = ['jinlvvan'] missingDimensionStrategy "vehicle", "jinlvvan" - // 配置AndroidManifest.xml中用到的参数 - manifestPlaceholders = [ - CHANNEL_VALUE_TAIL : "B1", - ] - - // ①标识构建的应用身份类型,具体查看 README.md APP_IDENTITY_MODE规则 - buildConfigField 'String', 'APP_IDENTITY_MODE_TAIL', "\"B1\"" - - // ②构建的是否要动态更换模型 - buildConfigField 'boolean', 'IS_CAR_MODEL_CHANGE', 'true' - - // ③能启动自驾的档位 - buildConfigField 'java.util.Set', 'LAUNCH_AUTOPILOT_GEAR', 'new java.util.HashSet(){{add(chassis.Chassis.GearPosition.GEAR_D);}}' - - // ④是否支持多屏显示 - buildConfigField 'boolean', 'IS_MULTI_DISPLAY', 'false' } } \ No newline at end of file diff --git a/app/script/vehicleFlavors/B2.gradle b/app/script/vehicleFlavors/B2.gradle index 86b5ab9c8f..7dd6aa658d 100644 --- a/app/script/vehicleFlavors/B2.gradle +++ b/app/script/vehicleFlavors/B2.gradle @@ -12,21 +12,6 @@ project.android.productFlavors { matchingFallbacks = ['jinlvvan'] missingDimensionStrategy "vehicle", "m21", "jinlvvan" } - //高德地图鉴权信息 - manifestPlaceholders = [ - CHANNEL_VALUE_TAIL: "B2", - ] - // ①标识构建的应用身份类型,具体查看 README.md APP_IDENTITY_MODE规则 - buildConfigField 'String', 'APP_IDENTITY_MODE_TAIL', "\"B2\"" - - // ②构建的是否要动态更换模型 - buildConfigField 'boolean', 'IS_CAR_MODEL_CHANGE', 'false' - - // ③M2能启动自驾的档位 - buildConfigField 'java.util.Set', 'LAUNCH_AUTOPILOT_GEAR', 'new java.util.HashSet(){{add(chassis.Chassis.GearPosition.GEAR_D);}}' - - // ④是否支持多屏显示 - buildConfigField 'boolean', 'IS_MULTI_DISPLAY', 'false' } } \ No newline at end of file diff --git a/app/script/vehicleFlavors/C1.gradle b/app/script/vehicleFlavors/C1.gradle index 121618105e..ff726f5cba 100644 --- a/app/script/vehicleFlavors/C1.gradle +++ b/app/script/vehicleFlavors/C1.gradle @@ -5,26 +5,11 @@ project.android.productFlavors { missingDimensionStrategy "vehicle","ft","jinlvvan" - // 配置AndroidManifest.xml中用到的参数 - manifestPlaceholders = [ - CHANNEL_VALUE_TAIL: "C1", - ] - - // ①标识构建的应用身份类型,具体查看 README.md APP_IDENTITY_MODE规则 - buildConfigField 'String', 'APP_IDENTITY_MODE_TAIL', "\"C1\"" - - // ②构建的是否要动态更换模型 - buildConfigField 'boolean', 'IS_CAR_MODEL_CHANGE', 'true' - - // ③能启动自驾的档位 - buildConfigField 'java.util.Set', 'LAUNCH_AUTOPILOT_GEAR', 'null' // ⑤清扫车 默认模式(运营/云控) buildConfigField 'String', 'SWEEPER_DEFAULT_MODE', '\"Cloud\"' // ⑥清扫车 是否能切换模式 buildConfigField 'boolean', 'SWEEPER_CAN_SWITCH_MODE', 'true' - // ④是否支持多屏显示 - buildConfigField 'boolean', 'IS_MULTI_DISPLAY', 'false' } } \ No newline at end of file diff --git a/app/script/vehicleFlavors/M1.gradle b/app/script/vehicleFlavors/M1.gradle index 9a3a593967..bd7cb2a099 100644 --- a/app/script/vehicleFlavors/M1.gradle +++ b/app/script/vehicleFlavors/M1.gradle @@ -3,21 +3,5 @@ project.android.productFlavors { M1 { dimension "vehicle" missingDimensionStrategy "vehicle", "jinlvvan" - - // 配置AndroidManifest.xml中用到的参数 - manifestPlaceholders = [ - CHANNEL_VALUE_TAIL: "M1", - ] - - // ①标识构建的应用身份类型,具体查看 README.md APP_IDENTITY_MODE规则 - buildConfigField 'String', 'APP_IDENTITY_MODE_TAIL', "\"M1\"" - // ②M1能启动自驾的档位 - buildConfigField 'java.util.Set', 'LAUNCH_AUTOPILOT_GEAR', 'new java.util.HashSet(){{add(chassis.Chassis.GearPosition.GEAR_D);}}' - // ③不能启动自驾的档位 - buildConfigField 'boolean', 'IS_CAR_MODEL_CHANGE', 'false' - - // ④是否支持多屏显示 - buildConfigField 'boolean', 'IS_MULTI_DISPLAY', 'false' - } } \ No newline at end of file diff --git a/app/script/vehicleFlavors/T1T2.gradle b/app/script/vehicleFlavors/T1T2.gradle index 0f06f2e528..469c7963da 100644 --- a/app/script/vehicleFlavors/T1T2.gradle +++ b/app/script/vehicleFlavors/T1T2.gradle @@ -4,24 +4,9 @@ project.android.productFlavors { dimension "vehicle" missingDimensionStrategy "vehicle","dfhq","jinlvvan" - - // 配置AndroidManifest.xml中用到的参数 - manifestPlaceholders = [ - CHANNEL_VALUE_TAIL: "T1T2", - ] - - // ①标识构建的应用身份类型,具体查看 README.md APP_IDENTITY_MODE规则 buildConfigField 'String', 'APP_IDENTITY_MODE_TAIL', "\"T1T2\"" - // ②构建的是否要动态更换模型 - buildConfigField 'boolean', 'IS_CAR_MODEL_CHANGE', 'true' - - // ③能启动自驾的档位 MAP<360代码中会移除P档 - buildConfigField 'java.util.Set', 'LAUNCH_AUTOPILOT_GEAR', 'new java.util.HashSet(){{add(chassis.Chassis.GearPosition.GEAR_D);add(chassis.Chassis.GearPosition.GEAR_N);add(chassis.Chassis.GearPosition.GEAR_P);}}' - - // ④是否支持多屏显示 - buildConfigField 'boolean', 'IS_MULTI_DISPLAY', 'false' } } \ No newline at end of file diff --git a/app/src/main/java/com/mogo/launcher/startup/ConfigStartUp.kt b/app/src/main/java/com/mogo/launcher/startup/ConfigStartUp.kt index 8874aab760..c667dca004 100644 --- a/app/src/main/java/com/mogo/launcher/startup/ConfigStartUp.kt +++ b/app/src/main/java/com/mogo/launcher/startup/ConfigStartUp.kt @@ -51,17 +51,11 @@ object ConfigStartUp { // 演示模式,上一次勾选的数据 FunctionBuildConfig.isDemoMode = BuildConfig.IS_DEMO_MODE FunctionBuildConfig.ttsLanguage = BuildConfig.ttsLanguage - // 支持的业务类型 - if(!StringUtils.isEmpty(BuildConfig.supportBusiness)&&BuildConfig.supportBusiness!="null"){ - FunctionBuildConfig.supportBusiness = GsonUtils.fromJson(BuildConfig.supportBusiness, object : TypeToken>() {}.type) - } // 各个module需要的url FunctionBuildConfig.urlJson = GsonUtils.fromJson(BuildConfig.URLs, UrlConfig::class.java) - //不能启动自动驾驶的档位 - FunctionBuildConfig.launchAutopilotGear = BuildConfig.LAUNCH_AUTOPILOT_GEAR + // 各车型宣传视频本地配置json FunctionBuildConfig.mediaUrlConfig = BuildConfig.mediaUrlConfig - FunctionBuildConfig.musicUrlConfig = BuildConfig.musicUrlConfig //是否支持Patch升级 FunctionBuildConfig.isSupportPatchUpgrade = BuildConfig.IS_SUPPORT_PATCH_UPGRADE @@ -69,14 +63,10 @@ object ConfigStartUp { // app安装的身份信息 // 这里影响当前Activity的身份信息,多进程,主进程为司机端,:passenger 进程为乘客端 // TODO emArrow isMultiDisplay暂时不启用,仅测试3588,在B2 2024车预研 - if (DebugConfig.isMultiDisplay()) { - if(ProcessUtils.getCurrentProcessName().contains("passenger")){ - FunctionBuildConfig.appIdentityMode = "Product_Passenger_${BuildConfig.APP_IDENTITY_MODE_TAIL}" - }else{ - FunctionBuildConfig.appIdentityMode = "Product_Driver_${BuildConfig.APP_IDENTITY_MODE_TAIL}" - } - }else{ - FunctionBuildConfig.appIdentityMode = "Product_${BuildConfig.APP_IDENTITY_MODE_BODY}_${BuildConfig.APP_IDENTITY_MODE_TAIL}" + if(BuildConfig.enableSweeper==true){ + FunctionBuildConfig.appIdentityMode = "Sweeper_${BuildConfig.APP_IDENTITY_MODE_BODY}_C1" + }else { + FunctionBuildConfig.appIdentityMode = "Product_${BuildConfig.APP_IDENTITY_MODE_BODY}_Vehicle" } // 不同身份对应不同的IP地址 FunctionBuildConfig.adasConnectIP = BuildConfig.ADAS_CONNECT_IP @@ -103,11 +93,10 @@ object ConfigStartUp { DebugConfig.setCarMachineType(BuildConfig.CAR_MACHINE_TYPE) // todo DebugConfig.setProductFlavor(BuildConfig.FLAVOR_product) DebugConfig.setProjectFlavor(BuildConfig.FLAVOR_project) + DebugConfig.setEnvFlavor(BuildConfig.FLAVOR_env) DebugConfig.setSocketAppId(BuildConfig.SOCKET_APP_ID) DebugConfig.setMapVersion(BuildConfig.MAP_SDK_VERSION) DebugConfig.setMapOptVersion(BuildConfig.MAP_SDK_OPT_VERSION) - DebugConfig.setMultiDisplay(BuildConfig.IS_MULTI_DISPLAY) - DebugConfig.setCarModelChange(BuildConfig.IS_CAR_MODEL_CHANGE) } private fun initOtherConfig(context: Context) { diff --git a/app_mogo_magic_ring/src/main/java/com/zhidao/adas/magic/ui/MainActivity.java b/app_mogo_magic_ring/src/main/java/com/zhidao/adas/magic/ui/MainActivity.java index 0274d15758..64d4ca0f51 100644 --- a/app_mogo_magic_ring/src/main/java/com/zhidao/adas/magic/ui/MainActivity.java +++ b/app_mogo_magic_ring/src/main/java/com/zhidao/adas/magic/ui/MainActivity.java @@ -845,11 +845,6 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas } } - @Override - public void onCompatibility(VersionCompatibility versionCompatibility) { - showToastCenter("所连工控机:\n" + (versionCompatibility == null ? "未连接" : versionCompatibility.toString()), Toast.LENGTH_LONG); - } - private void showLocalIP() { showToastCenter("已刷新本机IP"); localIp.setText("本机IP:" + getIpAddressString()); diff --git a/build.gradle b/build.gradle index a181b4f700..3bae515ebd 100644 --- a/build.gradle +++ b/build.gradle @@ -17,6 +17,7 @@ buildscript { maven { url "https://plugins.gradle.org/m2/" } maven { url "https://artifact.bytedance.com/repository/Volcengine/" } maven { url "https://artifact.bytedance.com/repository/byteX/" } + maven { url 'https://jitpack.io' } gradlePluginPortal() // mavenCentral() google() @@ -62,7 +63,7 @@ allprojects { maven { url 'https://maven.aliyun.com/repository/jcenter' } maven { url 'https://plugins.gradle.org/m2/' } // mavenCentral() - + maven { url 'https://jitpack.io' } maven { url "https://artifact.bytedance.com/repository/Volcengine/" } diff --git a/config.gradle b/config.gradle index c5566f1532..e6ea98f23f 100644 --- a/config.gradle +++ b/config.gradle @@ -81,9 +81,9 @@ ext { kotlinstdlib : "org.jetbrains.kotlin:kotlin-stdlib:${kotlin_version}", //探路使用的直播组件 - videoarmv7 : "com.shuyu:gsyVideoPlayer-armv7a:7.1.2", - videoarm64 : "com.shuyu:gsyVideoPlayer-arm64:7.1.2", - videojava : "com.shuyu:gsyVideoPlayer-java:7.1.2", + videoarmv7 : "com.github.CarGuo.GSYVideoPlayer:gsyvideoplayer-armv7a:10.0.0", + videoarm64 : "com.github.CarGuo.GSYVideoPlayer:gsyvideoplayer-arm64:10.0.0", + videojava : "com.github.CarGuo.GSYVideoPlayer:gsyvideoplayer-java:10.0.0", eventbus : "org.greenrobot:eventbus:3.3.1", videoprocessor : "com.zhidao.video:video-processor:1.0.2.1", livesdk : "com.tencent.liteavsdk:LiteAVSDK_Smart:7.4.9211", @@ -103,15 +103,15 @@ ext { litezxing : "com.google.zxing:litezxing:1.0.29.8", // android - room - androidxroomruntime : "androidx.room:room-runtime:2.4.2", - androidxroomcompiler : "androidx.room:room-compiler:2.4.2", - androidxroomktx : "androidx.room:room-ktx:2.4.2", + androidxroomruntime : "androidx.room:room-runtime:2.6.1", + androidxroomcompiler : "androidx.room:room-compiler:2.6.1", + androidxroomktx : "androidx.room:room-ktx:2.6.1", // androidx-lifecycle-process androidxlifecycleprocess : "androidx.lifecycle:lifecycle-process:2.4.0", androidxlifecycleservice : "androidx.lifecycle:lifecycle-service:2.4.0", // rxjava2 with room - roomRxjava : 'androidx.room:room-rxjava2:2.4.2', + roomRxjava : 'androidx.room:room-rxjava2:2.6.1', circleimageview : "de.hdodenhof:circleimageview:3.0.1", //plugin diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/FuncBizProvider.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/FuncBizProvider.kt index cd5048facd..67e58104e0 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/FuncBizProvider.kt +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/FuncBizProvider.kt @@ -12,6 +12,7 @@ import com.mogo.eagle.core.function.call.autopilot.CallerV2XListenerManager.V2NC import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.function.biz.dispatch.DispatchAutoPilotManager.Companion.dispatchAutoPilotManager import com.mogo.eagle.function.biz.monitoring.CronTaskManager.Companion.cronTaskManager +import com.mogo.eagle.function.biz.nde.NdeNetworkManager import com.mogo.eagle.function.biz.notice.NoticeSocketManager.Companion.noticeSocketManager import com.mogo.eagle.function.biz.notice.network.NoticeNetWorkManager import com.mogo.eagle.function.biz.v2x.busstation.PassBusStationEventManager @@ -52,6 +53,7 @@ class FuncBizProvider : IMoGoFuncBizProvider { V2NIdentifyDrawer.init() // RedLightWarningManager.INSTANCE.listenTrafficLight() V2XEventAnalyticsManager.init() + NdeNetworkManager.init() PassBusStationEventManager.init() } diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/nde/INDEApiService.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/nde/INDEApiService.kt new file mode 100644 index 0000000000..c00bfbbe96 --- /dev/null +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/nde/INDEApiService.kt @@ -0,0 +1,15 @@ +package com.mogo.eagle.function.biz.nde + +import com.mogo.eagle.core.data.BaseResponse +import retrofit2.http.GET +import retrofit2.http.Headers +import retrofit2.http.Query + +const val ROUTE_ADDRESS = "/nde-urlRoute-service/alloc/routeUrlAddr" + +interface INDEApiService { + + @Headers("Content-type:application/json;charset=UTF-8" ) + @GET(ROUTE_ADDRESS) + fun queryNDEHost(@Query("lon") lon: Double, @Query("lat") lat: Double,): BaseResponse +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/nde/NDEV2NModel.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/nde/NDEV2NModel.kt new file mode 100644 index 0000000000..a5a3d20f00 --- /dev/null +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/nde/NDEV2NModel.kt @@ -0,0 +1,47 @@ +package com.mogo.eagle.function.biz.nde + +import com.mogo.commons.constants.HostConst +import com.mogo.eagle.core.data.BaseResponse +import com.mogo.eagle.core.network.MoGoRetrofitFactory +import com.mogo.eagle.core.network.apiCall +import com.mogo.eagle.core.network.cancel +import com.mogo.eagle.core.network.request + +class NDEV2NModel private constructor() { + + companion object { + val ndeV2NModel by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + NDEV2NModel() + } + } + + private fun getNetWorkApi(baseUrl: String = HostConst.getNDEHost()): INDEApiService { + return MoGoRetrofitFactory.getInstanceNoCallAdapter(baseUrl) + .create(INDEApiService::class.java) + } + + fun queryNdeHostByLoc( + lon: Double, + lat: Double, + onSuccess: ((NdeHostResult?) -> Unit), + onError: ((String) -> Unit) + ) { + request>("queryNdeHostByLoc") { + loader { + apiCall { + getNetWorkApi().queryNDEHost(lon, lat) + } + } + onSuccess { + onSuccess.invoke(it.result) + } + onError { + onError.invoke(it.message.toString()) + } + } + } + + fun cancelRequest(tag: String) { + cancel(tag) + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/nde/NdeHostResult.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/nde/NdeHostResult.kt new file mode 100644 index 0000000000..e56f9962b1 --- /dev/null +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/nde/NdeHostResult.kt @@ -0,0 +1,9 @@ +package com.mogo.eagle.function.biz.nde + +data class NdeHostResult( + val ip: String?, + val host: String?, + val port: Int,// 长连接用的 + val address: String?, + val httpAddr: String?// Http请求用的 +) \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/nde/NdeNetworkManager.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/nde/NdeNetworkManager.kt new file mode 100644 index 0000000000..90d0fbd900 --- /dev/null +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/nde/NdeNetworkManager.kt @@ -0,0 +1,65 @@ +package com.mogo.eagle.function.biz.nde + +import com.mogo.commons.constants.HostConst +import com.mogo.eagle.core.data.map.MogoLocation +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener +import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationWGS84Listener +import com.mogo.eagle.core.function.api.autopilot.IMoGoCloudConfigListener +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerCloudConfigListenerManager +import com.mogo.eagle.core.utilcode.util.TAG +import mogo.telematics.pad.MessagePad +import com.zhjt.mogo.adas.data.AdasConstants + +object NdeNetworkManager: IMoGoChassisLocationWGS84Listener, IMoGoCloudConfigListener, + IMoGoAutopilotStatusListener { + @Volatile + private var isFirst = true + + fun init() { + // 监听连上域控 + CallerAutoPilotStatusListenerManager.addListener("${TAG}${this.hashCode()}", this) + // 监听发过来的配置信息 + CallerCloudConfigListenerManager.addListener("${TAG}${this.hashCode()}", this) + CallerChassisLocationWGS84ListenerManager.addListener("${TAG}${this.hashCode()}", this) + } + + override fun onAutopilotIpcConnectStatusChanged( + status: AdasConstants.IpcConnectionStatus, + reason: String? + ) { + if (status == AdasConstants.IpcConnectionStatus.CONNECTED) { + CallerAutoPilotControlManager.sendCloudConfigRequest() + } + } + + override fun onCloudConfig(config: MessagePad.CloudConfig) { + config.addrsList.forEach { + if (it.type == 1) {// NDE云 + HostConst.updateNdeHost(it.domain, 1) + } + } + } + + override fun onChassisLocationWGS84(gnssInfo: MogoLocation) { + if (gnssInfo.longitude < 0.000001 || gnssInfo.latitude < 0.000001) { + return + } else { + if (isFirst) { + isFirst = false + if (HostConst.getHostSource() < 0) { + NDEV2NModel.ndeV2NModel.queryNdeHostByLoc(gnssInfo.longitude, gnssInfo.latitude, { it-> + it?.let { result -> + if (HostConst.getHostSource() <= 0) { + HostConst.updateNdeHost(result.httpAddr, 0) + } + } + }, {}) + CallerChassisLocationWGS84ListenerManager.removeListener("${TAG}${this.hashCode()}") + } + } + } + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/busstation/PassBusStationEventManager.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/busstation/PassBusStationEventManager.kt index 4efb757a18..9d05d7436b 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/busstation/PassBusStationEventManager.kt +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/busstation/PassBusStationEventManager.kt @@ -180,7 +180,10 @@ object PassBusStationEventManager : IMoGoChassisLocationWGS84Listener { it.notifyDistance ), isDriverScreen, - EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ROAD_BUS_STATION.poiType), + String.format( + EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ROAD_BUS_STATION.poiType), + it.notifyDistance + ), UriUtils.res2Uri( EventTypeEnumNew.getPoiTypeBg( EventTypeEnumNew.TYPE_USECASE_ROAD_BUS_STATION.poiType, diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/pnc/V2NIdentifyDrawer.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/pnc/V2NIdentifyDrawer.kt index 1e10f7d885..477ef7528d 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/pnc/V2NIdentifyDrawer.kt +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/pnc/V2NIdentifyDrawer.kt @@ -35,7 +35,6 @@ import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager.saveMsgBox import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.Logger -import com.mogo.eagle.core.utilcode.util.AppStateManager import com.mogo.eagle.core.utilcode.util.CoordinateTransform import com.mogo.eagle.core.utilcode.util.CoordinateUtils import com.mogo.eagle.core.utilcode.util.DrivingDirectionUtils @@ -66,7 +65,7 @@ import kotlin.math.abs /** * V2N上车相关事件绘制 */ -internal object V2NIdentifyDrawer: IEventDismissListener { +internal object V2NIdentifyDrawer : IEventDismissListener { private const val TAG = "V2NIdentifyDataSubscriber" @@ -79,6 +78,10 @@ internal object V2NIdentifyDrawer: IEventDismissListener { private val scope by lazy { CoroutineScope(ThreadUtils.getCpuPool().asCoroutineDispatcher()) } + private var lastMap = HashMap() + private var lastMap2 = HashMap() + private var lastTime = 0L + private val callback = Handler.Callback { msg -> if (msg.what == MSG_WHAT_DRAW_SHIGONE || msg.what == MSG_WHAT_DRAW_SHIGU) { val events = msg.obj as? List<*> @@ -94,7 +97,12 @@ internal object V2NIdentifyDrawer: IEventDismissListener { itx.longitude, itx.latitude, car.heading.toInt() - ) < 90 && CoordinateUtils.calculateLineDistance(car.longitude, car.latitude, itx.longitude, itx.latitude) <= 300 + ) < 90 && CoordinateUtils.calculateLineDistance( + car.longitude, + car.latitude, + itx.longitude, + itx.latitude + ) <= 300 } if (filtered.isEmpty()) { V2XBizTrace.onAck(TAG, mapOf("shiGong-shiGu-filter" to ""), true) @@ -112,36 +120,44 @@ internal object V2NIdentifyDrawer: IEventDismissListener { // } // Log.d("V2NIdentifyDrawer", "--- 不在路口了 ---") if (msg.what == MSG_WHAT_DRAW_SHIGONE) { - CallerServicesEventManager.updateServicesNum(CallerServicesEventManager.ServiceType.ROAD_CONSTRUCTION) + CallerServicesEventManager.updateServicesNum( + CallerServicesEventManager.ServiceType.ROAD_CONSTRUCTION + ) } else { - CallerServicesEventManager.updateServicesNum(CallerServicesEventManager.ServiceType.ROAD_ACCIDENT) + CallerServicesEventManager.updateServicesNum( + CallerServicesEventManager.ServiceType.ROAD_ACCIDENT + ) } val poiType = getPoiType(itx.type).poiType - val polygon = itx.polygonList.map { Pair.create(it.longitude, it.latitude) } - marker(Marker(id, - poiType, - itx.longitude, - itx.latitude, - itx.heading, - polygon, - null, - V2XRoadEventEntity().also { e -> - e.poiType = poiType - e.location = MarkerLocation().also { l -> - val p = CoordinateTransform.WGS84ToGCJ02( - itx.longitude, - itx.latitude - ) - l.lon = p[0] - l.lat = p[1] - l.angle = itx.heading - } - e.noveltyInfo = MarkerExploreWay().also { - it.poiType = poiType - it.location = e.location - it.polygon = polygon - } - }, isUseGps = true), true, isDrawRoadLine(poiType) + val polygon = + itx.polygonList.map { Pair.create(it.longitude, it.latitude) } + marker( + Marker( + id, + poiType, + itx.longitude, + itx.latitude, + itx.heading, + polygon, + null, + V2XRoadEventEntity().also { e -> + e.poiType = poiType + e.location = MarkerLocation().also { l -> + val p = CoordinateTransform.WGS84ToGCJ02( + itx.longitude, + itx.latitude + ) + l.lon = p[0] + l.lat = p[1] + l.angle = itx.heading + } + e.noveltyInfo = MarkerExploreWay().also { + it.poiType = poiType + it.location = e.location + it.polygon = polygon + } + }, isUseGps = true + ), true, isDrawRoadLine(poiType) ) val distance = CoordinateUtils.calculateLineDistance( @@ -150,21 +166,33 @@ internal object V2NIdentifyDrawer: IEventDismissListener { car.longitude, car.latitude ) - val isDriver = AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode) + val isDriver = + AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode) if (!isDriver) { runCatching { - CallerHmiManager.notifyXiaoZhiStatusChanged(V2N(EventTypeEnumNew.getEnumType(poiType)), START) + CallerHmiManager.notifyXiaoZhiStatusChanged( + V2N( + EventTypeEnumNew.getEnumType( + poiType + ) + ), START + ) } scope.launch { delay(5000) runCatching { - CallerHmiManager.notifyXiaoZhiStatusChanged(V2N(EventTypeEnumNew.getEnumType(poiType)), STOP) + CallerHmiManager.notifyXiaoZhiStatusChanged( + V2N( + EventTypeEnumNew.getEnumType(poiType) + ), STOP + ) } } } - val contentType = if (poiType == EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGONG.poiType) "道路施工" else "道路事故" + val contentType = + if (poiType == EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGONG.poiType) "道路施工" else "道路事故" val content = "前方${distance.toInt()}米有$contentType" - val tts = "${SkinResources.getInstance().getString(R.string.operation_platform_name)}发现前方$contentType, 提醒您注意行人及来车" + val tts = "注意行人及来车" V2XBizTrace.onAck(TAG, "绘制poi事件:$poiType") saveMsgBox( MsgBoxBean( @@ -177,7 +205,16 @@ internal object V2NIdentifyDrawer: IEventDismissListener { ) ) ) - CallerRoadV2NEventWindowListenerManager.showLiveVideo(id, itx.detectStartTime.takeIf { it > 0 } ?: System.currentTimeMillis(), EventTypeEnumNew.getUpdateIconRes(poiType), content, isDriver, tts, itx.cameraIp, itx.longitude, itx.latitude) + CallerRoadV2NEventWindowListenerManager.showLiveVideo( + id, + itx.detectStartTime.takeIf { it > 0 } ?: System.currentTimeMillis(), + EventTypeEnumNew.getUpdateIconRes(poiType), + content, + isDriver, + tts, + itx.cameraIp, + itx.longitude, + itx.latitude) //消息埋点 V2XEventAnalyticsManager.triggerV2XEvent( poiType, content, tts, @@ -193,7 +230,8 @@ internal object V2NIdentifyDrawer: IEventDismissListener { V2XBizTrace.onAck(TAG, mapOf("other_retrograde_vehicle" to "event == null"), true) return@Callback true } - val body = runCatching { GsonUtils.fromJson(event.exts, Extras::class.java) }.getOrNull() + val body = + runCatching { GsonUtils.fromJson(event.exts, Extras::class.java) }.getOrNull() val cameraIp = body?.cameraIp val array = body?.eventExtUnits var heading = 0.0 @@ -206,42 +244,77 @@ internal object V2NIdentifyDrawer: IEventDismissListener { } val newEventId = "other_retrograde_vehicle_${event.eventId}" val isUseGps = event.gnssType != 0 - V2XBizTrace.onAck(TAG, mapOf("cameraIp" to cameraIp, "heading" to heading, "uuid" to uuid, "isUseGps" to isUseGps, "newEventId" to newEventId), true) + V2XBizTrace.onAck( + TAG, + mapOf( + "cameraIp" to cameraIp, + "heading" to heading, + "uuid" to uuid, + "isUseGps" to isUseGps, + "newEventId" to newEventId + ), + true + ) val eventLocation = arrayOf(event.longitude, event.latitude) - val carLocation = if (isUseGps) CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() else CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02() + val carLocation = + if (isUseGps) CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() else CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02() if (DrivingDirectionUtils.getDegreeOfCar2Poi( carLocation.longitude, carLocation.latitude, eventLocation[0], eventLocation[1], carLocation.heading.toInt() - ) >= 90) { - V2XBizTrace.onAck(event, "other-retrograde-vehicle" to "事件在车的后面,不触发", true) + ) >= 90 + ) { + V2XBizTrace.onAck( + event, + "other-retrograde-vehicle" to "事件在车的后面,不触发", + true + ) return@Callback true } AiRoadMarker.aiMakers.getOrPut(newEventId) { - val distance = CoordinateUtils.calculateLineDistance(carLocation.longitude, carLocation.latitude, eventLocation[0], eventLocation[1]) + val distance = CoordinateUtils.calculateLineDistance( + carLocation.longitude, + carLocation.latitude, + eventLocation[0], + eventLocation[1] + ) if (distance > 150) { Logger.i(TAG, "other_retrograde_vehicle --> distance > 150") - V2XBizTrace.onAck(TAG, mapOf("other_retrograde_vehicle" to "distance > 150"), true) + V2XBizTrace.onAck( + TAG, + mapOf("other_retrograde_vehicle" to "distance > 150"), + true + ) return@Callback true } CallerServicesEventManager.updateServicesNum(CallerServicesEventManager.ServiceType.RETROGRADE_EVENT) val isDriver = AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode) if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { runCatching { - CallerHmiManager.notifyXiaoZhiStatusChanged(V2N(EventTypeEnumNew.TYPE_SOCKET_ROAD_OTHER_RETROGRADE_VEHICLE), START) + CallerHmiManager.notifyXiaoZhiStatusChanged( + V2N(EventTypeEnumNew.TYPE_SOCKET_ROAD_OTHER_RETROGRADE_VEHICLE), + START + ) } scope.launch { delay(5000) runCatching { - CallerHmiManager.notifyXiaoZhiStatusChanged(V2N(EventTypeEnumNew.TYPE_SOCKET_ROAD_OTHER_RETROGRADE_VEHICLE), STOP) + CallerHmiManager.notifyXiaoZhiStatusChanged( + V2N(EventTypeEnumNew.TYPE_SOCKET_ROAD_OTHER_RETROGRADE_VEHICLE), + STOP + ) } } } // 弹事件框 - val alertContent = String.format(EventTypeEnumNew.getAlarmContent(EventTypeEnumNew.TYPE_SOCKET_ROAD_OTHER_RETROGRADE_VEHICLE.poiType), distance.toInt()) - val alertTts = EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_SOCKET_ROAD_OTHER_RETROGRADE_VEHICLE.poiType) + val alertContent = String.format( + EventTypeEnumNew.getAlarmContent(EventTypeEnumNew.TYPE_SOCKET_ROAD_OTHER_RETROGRADE_VEHICLE.poiType), + distance.toInt() + ) + val alertTts = + EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_SOCKET_ROAD_OTHER_RETROGRADE_VEHICLE.poiType) CallerRoadV2NEventWindowListenerManager.showLiveVideo( newEventId, event.timestamp, @@ -251,69 +324,118 @@ internal object V2NIdentifyDrawer: IEventDismissListener { alertTts, cameraIp.toString(), eventLocation[0], - eventLocation[1]) + eventLocation[1] + ) //消息埋点 V2XEventAnalyticsManager.triggerV2XEvent( - EventTypeEnumNew.TYPE_SOCKET_ROAD_OTHER_RETROGRADE_VEHICLE.poiType, alertContent, alertTts, - DataSourceType.AICLOUD, CommunicationType.V2N + EventTypeEnumNew.TYPE_SOCKET_ROAD_OTHER_RETROGRADE_VEHICLE.poiType, + alertContent, + alertTts, + DataSourceType.AICLOUD, + CommunicationType.V2N ) AiRoadMarker() }.also { - it.marker(Marker(newEventId, EventTypeEnumNew.TYPE_SOCKET_ROAD_OTHER_RETROGRADE_VEHICLE.poiType, eventLocation[0], eventLocation[1], heading, isUseGps = isUseGps), drawMarker = true, false, isHighFrequency = true) + it.marker( + Marker( + newEventId, + EventTypeEnumNew.TYPE_SOCKET_ROAD_OTHER_RETROGRADE_VEHICLE.poiType, + eventLocation[0], + eventLocation[1], + heading, + isUseGps = isUseGps + ), drawMarker = true, false, isHighFrequency = true + ) }.receive() } else if (msg.what == MSG_WHAT_DRAW_GREEN_WAVE) { - val data = msg.obj as? V2nCrossSpeed ?: return@Callback true - val destX = data.lng - val destY = data.lat - val location = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() - if (DrivingDirectionUtils.getDegreeOfCar2Poi( - location.longitude, - location.latitude, - destX, - destY, - location.heading.toInt() - ) >= 90) { - V2XBizTrace.onAck(data, "green-wave-event" to "事件在车的后面,不触发", true) - return@Callback true - } - val id = "${destX}_${destY}" - AiRoadMarker.aiMakers.getOrPut(id) { - AiRoadMarker().apply { - try { - val current = abs(location.gnssSpeed).toInt() - val min = abs(data.speedStraightMin).toInt() - val max = abs(data.speedStraightMax).toInt() - marker(Marker(id, EventTypeEnumNew.TYPE_SOCKET_ROAD_GREE_WAVE.poiType, destX, destY, 0.0, null, null, null), drawMarker = false, false) - var alertTts = "" - var alertContent = "" - if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { - AppStateManager.currentActivity()?.let { - val speakText = StringBuilder("保持当前车速即可通过路口,好丝滑!") - if (current < min) { - speakText.setLength(0) - speakText.append("${SkinResources.getInstance().getString(R.string.operation_platform_name)}推荐您提升车速至${min}千米每小时, 当前车速${current}千米每小时") - } - if (current > max) { - speakText.setLength(0) - speakText.append("${SkinResources.getInstance().getString(R.string.operation_platform_name)}推荐您降低车速至${max}千米每小时, 当前车速${current}千米每小时") - } - val tts = speakText.toString() - alertTts = tts - alertContent = tts - AIAssist.getInstance(it).speakTTSVoice(tts) - } - } - //消息埋点 - V2XEventAnalyticsManager.triggerV2XEvent( - EventTypeEnumNew.TYPE_SOCKET_ROAD_GREE_WAVE.poiType, alertContent, alertTts, - DataSourceType.AICLOUD, CommunicationType.V2N - ) - CallerHmiManager.showGreenWave(min, max, computeCrossCountBetween(Triple(location.longitude, location.latitude, location.heading), kotlin.Pair(destX, destY))) - } finally { - receive() - } - } - } + //下架V2N绿波通行 +// val data = msg.obj as? V2nCrossSpeed ?: return@Callback true +// val destX = data.lng +// val destY = data.lat +// val location = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() +// if (DrivingDirectionUtils.getDegreeOfCar2Poi( +// location.longitude, +// location.latitude, +// destX, +// destY, +// location.heading.toInt() +// ) >= 90 +// ) { +// V2XBizTrace.onAck(data, "green-wave-event" to "事件在车的后面,不触发", true) +// return@Callback true +// } +// val id = "${destX}_${destY}" +// AiRoadMarker.aiMakers.getOrPut(id) { +// AiRoadMarker().apply { +// try { +// val current = abs(location.gnssSpeed).toInt() +// val min = abs(data.speedStraightMin).toInt() +// val max = abs(data.speedStraightMax).toInt() +// marker( +// Marker( +// id, +// EventTypeEnumNew.TYPE_SOCKET_ROAD_GREE_WAVE.poiType, +// destX, +// destY, +// 0.0, +// null, +// null, +// null +// ), drawMarker = false, false +// ) +// var alertTts = "" +// var alertContent = "" +// if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { +// AppStateManager.currentActivity()?.let { +// val speakText = StringBuilder("保持当前车速即可通过路口,好丝滑!") +// if (current < min) { +// speakText.setLength(0) +// speakText.append( +// "${ +// SkinResources.getInstance() +// .getString(R.string.operation_platform_name) +// }推荐您提升车速至${min}千米每小时, 当前车速${current}千米每小时" +// ) +// } +// if (current > max) { +// speakText.setLength(0) +// speakText.append( +// "${ +// SkinResources.getInstance() +// .getString(R.string.operation_platform_name) +// }推荐您降低车速至${max}千米每小时, 当前车速${current}千米每小时" +// ) +// } +// val tts = speakText.toString() +// alertTts = tts +// alertContent = tts +// AIAssist.getInstance(it).speakTTSVoice(tts) +// } +// } +// //消息埋点 +// V2XEventAnalyticsManager.triggerV2XEvent( +// EventTypeEnumNew.TYPE_SOCKET_ROAD_GREE_WAVE.poiType, +// alertContent, +// alertTts, +// DataSourceType.AICLOUD, +// CommunicationType.V2N +// ) +// CallerHmiManager.showGreenWave( +// min, +// max, +// computeCrossCountBetween( +// Triple( +// location.longitude, +// location.latitude, +// location.heading +// ), kotlin.Pair(destX, destY) +// ) +// ) +// } finally { +// receive() +// } +// } +// } } else if (msg.what == MSG_WHAT_DRAW_PEOPLE_CROSS) { Logger.i(TAG, "people cross -- 1 --") val data = msg.obj as? MessagePad.Event ?: return@Callback true @@ -332,15 +454,22 @@ internal object V2NIdentifyDrawer: IEventDismissListener { val isUseGps = data.gnssType != 0 Logger.i(TAG, "isUseGps --> $isUseGps") val eventLocation = arrayOf(data.longitude, data.latitude) - val carLocation = if (isUseGps) CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() else CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02() - val distance = CoordinateUtils.calculateLineDistance(carLocation.longitude, carLocation.latitude, eventLocation[0], eventLocation[1]) + val carLocation = + if (isUseGps) CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() else CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02() + val distance = CoordinateUtils.calculateLineDistance( + carLocation.longitude, + carLocation.latitude, + eventLocation[0], + eventLocation[1] + ) if (DrivingDirectionUtils.getDegreeOfCar2Poi( carLocation.longitude, carLocation.latitude, eventLocation[0], eventLocation[1], carLocation.heading.toInt() - ) >= 90) { + ) >= 90 + ) { V2XBizTrace.onAck(data, "people-cross" to "事件在车的后面,不触发", true) return@Callback true } @@ -356,18 +485,28 @@ internal object V2NIdentifyDrawer: IEventDismissListener { val isDriver = AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode) if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { runCatching { - CallerHmiManager.notifyXiaoZhiStatusChanged(V2N(EventTypeEnumNew.TYPE_SOCKET_ROAD_PEOPLE_CROSS), START) + CallerHmiManager.notifyXiaoZhiStatusChanged( + V2N(EventTypeEnumNew.TYPE_SOCKET_ROAD_PEOPLE_CROSS), + START + ) } scope.launch { delay(5000) runCatching { - CallerHmiManager.notifyXiaoZhiStatusChanged(V2N(EventTypeEnumNew.TYPE_SOCKET_ROAD_PEOPLE_CROSS), STOP) + CallerHmiManager.notifyXiaoZhiStatusChanged( + V2N(EventTypeEnumNew.TYPE_SOCKET_ROAD_PEOPLE_CROSS), + STOP + ) } } } // 弹事件框 - val alertContent = String.format(EventTypeEnumNew.getAlarmContent(EventTypeEnumNew.TYPE_SOCKET_ROAD_PEOPLE_CROSS.poiType), distance.toInt()) - val alertTts = EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_SOCKET_ROAD_PEOPLE_CROSS.poiType) + val alertContent = String.format( + EventTypeEnumNew.getAlarmContent(EventTypeEnumNew.TYPE_SOCKET_ROAD_PEOPLE_CROSS.poiType), + distance.toInt() + ) + val alertTts = + EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_SOCKET_ROAD_PEOPLE_CROSS.poiType) CallerRoadV2NEventWindowListenerManager.showLiveVideo( data.eventId, data.timestamp, @@ -377,16 +516,26 @@ internal object V2NIdentifyDrawer: IEventDismissListener { alertTts, cameraIp.toString(), eventLocation[0], - eventLocation[1]) + eventLocation[1] + ) //消息埋点 V2XEventAnalyticsManager.triggerV2XEvent( EventTypeEnumNew.TYPE_SOCKET_ROAD_PEOPLE_CROSS.poiType, alertContent, alertTts, DataSourceType.AICLOUD, CommunicationType.V2N ) - AiRoadMarker() + AiRoadMarker() }.also { Logger.i(TAG, "people cross -- 4 --") - it.marker(Marker(data.eventId, EventTypeEnumNew.TYPE_SOCKET_ROAD_PEOPLE_CROSS.poiType, eventLocation[0], eventLocation[1], heading, isUseGps = isUseGps), drawMarker = true, false, isHighFrequency = true) + it.marker( + Marker( + data.eventId, + EventTypeEnumNew.TYPE_SOCKET_ROAD_PEOPLE_CROSS.poiType, + eventLocation[0], + eventLocation[1], + heading, + isUseGps = isUseGps + ), drawMarker = true, false, isHighFrequency = true + ) }.receive() } true @@ -418,7 +567,10 @@ internal object V2NIdentifyDrawer: IEventDismissListener { // } // } - private fun computeCrossCountBetween(start: Triple, end: kotlin.Pair): Int { + private fun computeCrossCountBetween( + start: Triple, + end: kotlin.Pair + ): Int { // val points = V2NUtils.generateIntermediatePoints(kotlin.Pair(start.first, start.second), end, 50.0 * 1e-7) // V2XBizTrace.onAck(points, "computeCrossCountBetween", true) // var crossId = MapDataWrapper.getCrossRoad(start.first, start.second, start.third)?.cross_id @@ -472,31 +624,17 @@ internal object V2NIdentifyDrawer: IEventDismissListener { override fun onAutopilotIdentifyDataUpdate(trafficData: List?) { super.onAutopilotIdentifyDataUpdate(trafficData) //source: 1 -> 感知数据; 2 -> 融合数据 - val shiGong = trafficData?.filter { itx -> (itx.type == 501 || itx.type == 502) && itx.trackedSourceList.find { it.source != 1 } != null } + val shiGong = + trafficData?.filter { itx -> (itx.type == 501 || itx.type == 502) && itx.trackedSourceList.find { it.source != 1 } != null } if (!shiGong.isNullOrEmpty()) { drawShiGong(shiGong) } - val shiGu = trafficData?.filter { itx -> itx.type == 13 && itx.trackedSourceList.find { it.source != 1 } != null } + val shiGu = + trafficData?.filter { itx -> itx.type == 13 && itx.trackedSourceList.find { it.source != 1 } != null } if (!shiGu.isNullOrEmpty()) { drawShiGu(shiGu) } - val chelong = trafficData?.find { itx -> - itx.addAttribute == MessagePad.AdditionalAttribute.ATTR_ROAD_CONGESTION - } - if (chelong != null) { - saveMsgBox(MsgBoxBean( - MsgBoxType.NDE, - NDEMsg( - "","路口车龙","前方路口有车龙" - ) - )) - // 司机屏才TTS - if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { - ThreadUtils.runOnUiThread { - AIAssist.getInstance(Utils.getApp()).speakTTSVoiceWithLevel("蘑菇发现前方路口有车龙", AIAssist.NEW_LEVEL_2) - } - } - } + handleCheLong(trafficData) } @@ -537,12 +675,18 @@ internal object V2NIdentifyDrawer: IEventDismissListener { private fun drawOtherRetrogradeVehicle(event: MessagePad.Event) { if (V2NCarTypeCheck.verifyCarType() && FunctionBuildConfig.v2nTotalSwitch) { handler.removeMessages(MSG_WHAT_DRAW_OTHER_RETROGRADE_VEHICLE) - handler.sendMessage(Message.obtain(handler, MSG_WHAT_DRAW_OTHER_RETROGRADE_VEHICLE, event)) + handler.sendMessage( + Message.obtain( + handler, + MSG_WHAT_DRAW_OTHER_RETROGRADE_VEHICLE, + event + ) + ) } } private fun drawGreenWave(crossSpeed: V2nCrossSpeed) { - if (V2NCarTypeCheck.verifyCarType() && FunctionBuildConfig.v2nTotalSwitch && FunctionBuildConfig.v2nGreenWave) { + if (V2NCarTypeCheck.verifyCarType() && FunctionBuildConfig.v2nTotalSwitch) { handler.removeMessages(MSG_WHAT_DRAW_GREEN_WAVE) handler.sendMessage(Message.obtain(handler, MSG_WHAT_DRAW_GREEN_WAVE, crossSpeed)) } @@ -563,20 +707,20 @@ internal object V2NIdentifyDrawer: IEventDismissListener { override fun onV2nNioCrossoverEvent(event: MessagePad.Event) { super.onV2nNioCrossoverEvent(event) - V2XBizTrace.onAck(event,"onV2nNioCrossoverEvent", true) + V2XBizTrace.onAck(event, "onV2nNioCrossoverEvent", true) drawPeopleCross(event) } override fun onV2nNioGreenWavePassageEvent(crossSpeed: V2nCrossSpeed) { super.onV2nNioGreenWavePassageEvent(crossSpeed) - V2XBizTrace.onAck(crossSpeed, "onV2nNioGreenWavePassageEvent", true) + V2XBizTrace.onAck(crossSpeed, "onV2nNioGreenWavePassageEvent", true) drawGreenWave(crossSpeed) } override fun onV2nNioOtherRetrogradeEvent(event: MessagePad.Event) { super.onV2nNioOtherRetrogradeEvent(event) CallerLogger.i(TAG, "onV2nNioOtherRetrogradeEvent --> ${event}") - V2XBizTrace.onAck(event, "onV2nNioOtherRetrogradeEvent", true) + V2XBizTrace.onAck(event, "onV2nNioOtherRetrogradeEvent", true) drawOtherRetrogradeVehicle(event) } } @@ -608,4 +752,73 @@ internal object V2NIdentifyDrawer: IEventDismissListener { // val targetIds = event.exts.split(",") // } } + + private fun handleCheLong(trafficData: List?) { + var hasCheLong = false + var isNewData = false + val roadMsgList = ArrayList() + val curMap = HashMap() + if (lastTime > 0 && System.currentTimeMillis() - lastTime > 60000) { + lastMap2.clear()// 清除上次车龙事件的缓存 + } + var lastLocStr: String? = "" + trafficData?.forEach { obj -> + if (obj.type == 707) {// 当前方向所有车道 + if (obj.polygonCount > 1) {// 当次数据有车龙事件 + lastLocStr = lastMap2[obj.laneNum] + // 1. 上次无车龙但此次有车龙,认为是新车龙事件 + // 2. 两次都有车龙,则判断车龙的长度是否相同 + if (lastLocStr == null || lastLocStr == "0" || lastLocStr != "${obj.polygonList[0]}-${obj.polygonList[obj.polygonCount - 1]}") { + isNewData = true + } + hasCheLong = true + + // key: 车道号,value: 非0代表有车龙且首、尾两个点可计算车龙长度 + curMap[obj.laneNum] = + "${obj.polygonList[0]}-${obj.polygonList[obj.polygonCount - 1]}" + } else {// 当次没有车龙 + if (lastMap2[obj.laneNum] != null && lastMap2[obj.laneNum] != "0") {// 3. 上次有车龙,这次无车龙 + isNewData = true + } + // key: 车道号,value: 0代表无车龙 + curMap[obj.laneNum] = "0" + } + // 保存所有车道信息 + roadMsgList.add( + NDEMsg.RoadMsg( + obj.arrowType, + laneNum = obj.laneNum, + isRecommend = obj.suggestedLanes, + isCheLong = obj.polygonCount > 1 + ) + ) + } + } + if (isNewData) { + // 清除上次车道信息 + lastMap2.clear() + if (hasCheLong) { + // 缓存当次车龙事件所有车道信息 + lastMap2.putAll(curMap) + lastTime = System.currentTimeMillis() + + val sortedList = roadMsgList.sortedWith(compareByDescending { it.laneNum }) + saveMsgBox(MsgBoxBean( + MsgBoxType.NDE, + NDEMsg( + "", "路口车龙", "前方路口有车龙" + ).also { + it.setRoadList(sortedList) + } + )) + // 司机屏才TTS + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + ThreadUtils.runOnUiThread { + AIAssist.getInstance(Utils.getApp()) + .speakTTSVoiceWithLevel("前方路口有车龙", AIAssist.NEW_LEVEL_2) + } + } + } + } + } } diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/DataCenterProvider.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/DataCenterProvider.kt index 895fbc9706..dd8cb13fa5 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/DataCenterProvider.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/DataCenterProvider.kt @@ -4,7 +4,9 @@ import android.content.Context import com.alibaba.android.arouter.facade.annotation.Route import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.constants.MogoServicePaths +import com.mogo.eagle.core.function.api.datacenter.IDataCenterBizListener import com.mogo.eagle.core.function.api.datacenter.IDataCenterProvider +import com.mogo.eagle.core.function.call.datacenter.CallerDataCenterBizListener import com.mogo.eagle.core.function.call.datacenter.CallerDataCenterBizManager import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager import com.mogo.eagle.core.function.datacenter.iot.IotManager @@ -14,31 +16,38 @@ import com.mogo.eagle.core.function.datacenter.v2x.TrafficLightDispatcher import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils @Route(path = MogoServicePaths.PATH_DATA_CENTER_MODULE) -class DataCenterProvider : IDataCenterProvider { +class DataCenterProvider : IDataCenterProvider, IDataCenterBizListener { override val functionName: String get() = "DataCenterProvider" private var mContext: Context? = null + private val TAG = "DataCenterProvider" override fun init(context: Context?) { MoGoLocationDispatcher.initListener() + CallerDataCenterBizListener.addListener(TAG,this) mContext = context mContext?.let { CallerDataCenterBizManager.init() CallerMsgBoxManager.queryAllMessages(it) TrafficLightDispatcher.INSTANCE.initServer(it) SpeedLimitDispatcher.INSTANCE.initLimit(it) - IotManager.init( - AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode), - AppIdentityModeUtils.isB2(FunctionBuildConfig.appIdentityMode) - ) } } + override fun invokeVehicleChange() { + super.invokeVehicleChange() + IotManager.init( + AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode), + AppIdentityModeUtils.isB2(FunctionBuildConfig.appIdentityMode) + ) + } + override fun onDestroy() { TrafficLightDispatcher.INSTANCE.destroy() SpeedLimitDispatcher.INSTANCE.destroy() IotManager.destroy() + CallerDataCenterBizListener.removeListener(TAG) } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt index 1013e929a5..6659595c39 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt @@ -140,7 +140,7 @@ class MoGoAutopilotControlProvider : .setEnableCertification(SharedPrefsMgr.getInstance().getBoolean("${MoGoConfig.AUTOPILOT_CERTIFICATION}-${DebugConfig.getNetMode()}", MoGoConfig.AUTOPILOT_CERTIFICATION_DEFAULT_VALUE)) .setRootCrt(CallerCloudCertManager.getRootCrtFDecode()) .setDeviceCrt(CallerCloudCertManager.getDeviceCrtFDecode()) - .setLaunchAutopilotGear(FunctionBuildConfig.launchAutopilotGear) +// .setLaunchAutopilotGear(FunctionBuildConfig.launchAutopilotGear) // .setSubscribeInterfaceOptions(subscribeInterfaceOptions)// .build() @@ -237,7 +237,7 @@ class MoGoAutopilotControlProvider : val options = AdasOptions .newBuilder() .setPassenger(true) - .setLaunchAutopilotGear(FunctionBuildConfig.launchAutopilotGear) +// .setLaunchAutopilotGear(FunctionBuildConfig.launchAutopilotGear) .build() AdasManager.getInstance() .create(mContext, options, MoGoAdasMsgConnectStatusListenerImpl()) @@ -272,7 +272,7 @@ class MoGoAutopilotControlProvider : .setEnableCertification(SharedPrefsMgr.getInstance().getBoolean("${MoGoConfig.AUTOPILOT_CERTIFICATION}-${DebugConfig.getNetMode()}", MoGoConfig.AUTOPILOT_CERTIFICATION_DEFAULT_VALUE)) .setRootCrt(CallerCloudCertManager.getRootCrtFDecode()) .setDeviceCrt(CallerCloudCertManager.getDeviceCrtFDecode()) - .setLaunchAutopilotGear(FunctionBuildConfig.launchAutopilotGear) +// .setLaunchAutopilotGear(FunctionBuildConfig.launchAutopilotGear) .build() AdasManager.getInstance().create(mContext, options, MoGoAdasMsgConnectStatusListenerImpl()) //////////////////////////////////注意先后顺序,AdasManager.getInstance().create后才可以设置监听///////////////////////////////////////////// @@ -1566,4 +1566,54 @@ class MoGoAutopilotControlProvider : return AdasManager.getInstance().sendCaptureImgReqOnTakeOver(uuid)>-1 } + /** + * 数据落盘 硬盘挂载状态查询 + */ + override fun sendCopyBagDiskStatus(): Boolean { + return AdasManager.getInstance().sendCopyBagDiskStatus() > -1 + } + + /** + * 数据落盘 拷贝日期 + */ + override fun sendCopyBagCopyDate(date: Int): Boolean { + return AdasManager.getInstance().sendCopyBagCopyDate(date) > -1 + } + + /** + * 数据落盘 硬盘安全弹出请求 + */ + override fun sendCopyBagSafeUnmount(): Boolean { + return AdasManager.getInstance().sendCopyBagSafeUnmount() > -1 + } + + /** + * 数据落盘 终止拷贝 + */ + override fun sendCopyBagAbortCopy(): Boolean { + return AdasManager.getInstance().sendCopyBagAbortCopy() > -1 + } + + /** + * 域控摄像头上传NDE云开关命令 + * @param enable false: 关闭, true: 打开 + */ + override fun sendImgUploadCloudEnable(enable: Boolean): Boolean { + return AdasManager.getInstance().sendImgUploadCloudEnable(enable) > -1 + } + + /** + * 查询域控摄像头上传NDE云开关状态查询 + */ + override fun sendImgUploadCloudStatusQuery(): Boolean { + return AdasManager.getInstance().sendImgUploadCloudStatusQuery() > -1 + } + + /** + * 云端配置查询 + */ + override fun sendCloudConfigRequest(): Boolean { + return AdasManager.getInstance().sendCloudConfigRequest() > -1 + } + } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt index 8780f7e7c6..1c66b56dd4 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt @@ -14,6 +14,7 @@ import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_AD import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_CAR_CONFIG import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_CAR_LOC import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_COLD_START_STATE +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_ALL_ERROR import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_FM_MSG import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_FSM_MSG import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_GUARDIAN @@ -55,6 +56,7 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotGetParamRespon import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotIdentifyListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotIdentifyListenerManager.invokeAutopilotIdentifyDataUpdate import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotIdentifyListenerManager.invokeAutopilotIdentifyPlanningObj +import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotIdentifyListenerManager.invokePredictionObstacleTrajectory import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotPointCloudListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotRecordListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotRecordListenerManager.invokeAutopilotRecordConfig @@ -64,6 +66,7 @@ import com.mogo.eagle.core.function.call.autopilot.CallerBackCameraVideoListener import com.mogo.eagle.core.function.call.autopilot.CallerChassisDoorStateListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerChassisGnssListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerChassisStatesListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerCloudConfigListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerColdStartStateListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerFaultManagementStateListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerFsm2024ListenerManager @@ -84,6 +87,8 @@ import com.mogo.eagle.core.function.call.autopilot.CallerTakeoverListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerV2XListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerV2nNioEventListenerManager import com.mogo.eagle.core.function.call.devatools.CallerCaptureImgManager +import com.mogo.eagle.core.function.call.devatools.CallerDiskCopyManager +import com.mogo.eagle.core.function.call.devatools.CallerImgUploadCloudManager import com.mogo.eagle.core.function.call.devatools.CallerOTAManager import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager import com.mogo.eagle.core.function.call.obu.CallerObuMapMathListenerManager @@ -118,6 +123,7 @@ import com.zhjt.mogo.adas.data.sweeper.task.confirm.SweeperTaskConfirm import com.zhjt.mogo.adas.data.sweeper.task.s_r.SweeperTaskSuspendResume import com.zhjt.mogo.adas.data.sweeper.task.status.SweeperTaskStatus import com.zhjt.mogo.adas.data.sweeper.task.stop.SweeperTaskStop +import com.zhjt.mogo.adas.utils.ByteUtil import com.zhjt.service.chain.ChainLog import fault_management.FmInfo import fsm.Fsm2024 @@ -129,13 +135,16 @@ import mogo.v2x.MogoV2X import mogo.v2x.RoadOverviewEvents import mogo.yycp.paralleldriving.protocol.ParallelTaskProcessNoticeOuterClass import mogo_msg.MogoReportMsg +import packet_mytest_upload.CopyBag import perception.FusionTrafficLightOuterClass import perception.LaneMarkOuterClass import planning.RoboSweeperTaskIndexOuterClass -import prediction.Prediction +import prediction2025.Prediction2025 import record_cache.RecordPanelOuterClass import system_master.SsmInfo import system_master.SystemStatusInfo +import java.io.PrintWriter +import java.io.StringWriter import kotlin.math.roundToInt /** @@ -429,12 +438,12 @@ class MoGoAdasListenerImpl : OnAdasListener { return type } - //他车轨迹预测 + //障碍物轨迹预测 override fun onPredictionObstacleTrajectory( - header: MessagePad.Header?, - predictionObjects: Prediction.mPredictionObjects? + header: MessagePad.Header, + predictionObjects: Prediction2025.mPredictionObjects ) { - //他车轨迹预测 + invokePredictionObstacleTrajectory(predictionObjects) } //todo 新增稳定设备类型需要添加,目的避免在nuc设备上使用此类功能 @@ -824,18 +833,16 @@ class MoGoAdasListenerImpl : OnAdasListener { autopilotMode: Int ) { CallerFsm2024ListenerManager.invokeFSM2024State(fsmState) -// val mode: Int = if (fsmState.functionState != Fsm2024.State.ACTIVE) { -// 0//人工驾驶 -// } else { -// if (fsmState.activeMode == Fsm2024.ActiveMode.PILOT_ACTIVE) { -// 1//自动驾驶 -// } else if (fsmState.activeMode == Fsm2024.ActiveMode.PARALLEL_ACTIVE || fsmState.activeMode.number == 6) { -// 6//远程驾驶 -// } else { -// 0//人工驾驶 -// } -// } - updateAutoPilotStatus(2, autopilotState, autopilotMode) + //M1方向盘驾驶状态转为非自动驾驶状态 + var mode = autopilotMode + if (autopilotMode == 9) { + mode = 0 + } + var state = autopilotState + if (autopilotState == 10) { + state = 1 + } + updateAutoPilotStatus(2, state, mode) } /** @@ -1461,6 +1468,24 @@ class MoGoAdasListenerImpl : OnAdasListener { CallerCaptureImgManager.invokeCaptureImgOnTakeOver(isFront, data) } + /** + * 数据落盘辅助工具拷贝信息响应 + */ + override fun onCopyBag(header: MessagePad.Header, diskCopy: CopyBag.DiskCopy) { + CallerDiskCopyManager.invokeCopyBag(diskCopy) + } + + override fun onCloudConfig(header: MessagePad.Header, config: MessagePad.CloudConfig) { + CallerCloudConfigListenerManager.invokeCloudConfig(config) + } + + override fun onImgUploadCloudStatusResp( + header: MessagePad.Header, + resp: MessagePad.ImgUploadCloudStatusResp + ) { + CallerImgUploadCloudManager.invokeImgUploadCloudStatusResp(resp) + } + /** * 是否可以启动自动驾驶 * 使用方法查看:app_ipc_monitoring/uiMainActivity/onAutopilotAbility @@ -1527,11 +1552,43 @@ class MoGoAdasListenerImpl : OnAdasListener { } /** - * 数据解析失败、数据异常回调 - * @param status 错误原因 - * @param bytes 原始数据 + * ADAS LIB中进行的异常捕获,包括解析异常和数据使用异常(UI层) + * + * @param status 错误原因 + * @param bytes 原始数据 + * @param exception 异常堆栈 status==ProtocolStatus.BUSINESS_DATA_PARSE_FAILED 或 ProtocolStatus.HEADER_DECODE_FAILED 时才存在异常信息 */ - override fun onError(status: ProtocolStatus, bytes: ByteArray) { - CallerLogger.e("$M_D_C$TAG", "status===$status") + override fun onError( + status: ProtocolStatus, + bytes: ByteArray?, + exception: java.lang.Exception? + ) { + val s = status.desc + val b = try { + if (bytes == null || bytes.isEmpty()) "NULL" else ByteUtil.byteArrToHex(bytes, false) + } catch (ex: Exception) { + "转换异常:" + ex.message + } + val e = + if ((status == ProtocolStatus.BUSINESS_DATA_PARSE_FAILED || status == ProtocolStatus.HEADER_DECODE_FAILED) && exception != null) { + val sw = StringWriter() + val pw = PrintWriter(sw) + exception.printStackTrace(pw) + sw.toString().trim() + } else { + "NULL" + } + adasError(s, b, e) + CallerLogger.e("$M_D_C$TAG", "数据错误 协议状态:$s 异常堆栈:$e") + } + + @ChainLog( + linkChainLog = CHAIN_TYPE_SOCKET_AUTOPILOT, + linkCode = CHAIN_SOURCE_ADAS, + nodeAliasCode = CHAIN_CODE_ADAS_ALL_ERROR, + paramIndexes = [0, 1, 2] + ) + private fun adasError(status: String, bytes: String, error: String) { + } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasMsgConnectStatusListenerImpl.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasMsgConnectStatusListenerImpl.kt index 1011bed827..c0ff93bfab 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasMsgConnectStatusListenerImpl.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasMsgConnectStatusListenerImpl.kt @@ -32,7 +32,6 @@ import com.mogo.eagle.core.utilcode.util.AppUtils import com.mogo.eagle.core.utilcode.util.ToastUtils import com.zhidao.support.adas.high.AdasManager import com.zhidao.support.adas.high.OnAdasConnectStatusListener -import com.zhidao.support.adas.high.bean.VersionCompatibility import com.zhidao.support.adas.high.common.Constants.ENVIRONMENT.DEMO import com.zhidao.support.adas.high.common.Constants.ENVIRONMENT.DEVELOP import com.zhidao.support.adas.high.common.Constants.ENVIRONMENT.PRODUCTION @@ -243,6 +242,8 @@ class MoGoAdasMsgConnectStatusListenerImpl : ) resetArgs() } + + else -> {} } AppConfigInfo.connectStatusDescribe = connectStatusDescribe CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().ipcConnStatus = status @@ -356,10 +357,6 @@ class MoGoAdasMsgConnectStatusListenerImpl : } } - override fun onCompatibility(versionCompatibility: VersionCompatibility?) { - // 与所连接工控机版本兼容性检查通知 - } - /** * 工控机获取SN */ diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/biz/DataCenterBizProvider.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/biz/DataCenterBizProvider.kt index a3db3c79ad..421c0054f6 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/biz/DataCenterBizProvider.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/biz/DataCenterBizProvider.kt @@ -49,6 +49,14 @@ class DataCenterBizProvider:IDataCenterBizProvider { CallerDataCenterBizListener.invokeLoginStatus(isLogin) } + override fun onProductChange() { + CallerDataCenterBizListener.invokeProductChange() + } + + override fun onVehicleChange() { + CallerDataCenterBizListener.invokeVehicleChange() + } + override fun onDestroy() { } diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/iot/IotManager.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/iot/IotManager.kt index 42e622c8f3..fef9c96c91 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/iot/IotManager.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/iot/IotManager.kt @@ -23,6 +23,7 @@ object IotManager : IMoGoCloudListener, IWriteChainLogListener { private var isPassenger: Boolean = false fun init(isPassenger: Boolean, isB2: Boolean) { + destroy()//重新初始化时销毁之前调用的数据 this.isPassenger = isPassenger if (isPassenger) { CallerCloudListenerManager.addListener(TAG, this) diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoObuDcCombineManager.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoObuDcCombineManager.kt index 1824a5bb98..439d5e5ccb 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoObuDcCombineManager.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoObuDcCombineManager.kt @@ -631,9 +631,9 @@ class MogoObuDcCombineManager private constructor() : IMoGoObuWarningRsiListener if (currentSpeed > 0) { ttsContentNew = if ((currentSpeed * 3.6).roundToInt() in (minSpeedTemp + 1) until maxSpeedTemp) { - "${SkinResources.getInstance().getString(R.string.operation_platform_name)}路侧提醒您,推荐保持当前车速通过路口" + "建议保持当前车速通过路口" } else { - "${SkinResources.getInstance().getString(R.string.operation_platform_name)}路侧提醒您,推荐保持车速$minSpeedTemp - $maxSpeedTemp KM/H通过路口" + "推荐保持车速10-30KM/H通过路口" } alertContentNew = "推荐车速$minSpeedTemp - $maxSpeedTemp KM/H" } diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoPrivateObuNewManager.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoPrivateObuNewManager.kt index daed0329ee..bda0b7989c 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoPrivateObuNewManager.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoPrivateObuNewManager.kt @@ -1113,9 +1113,9 @@ class MogoPrivateObuNewManager private constructor() : OnUpgradeListener { if (currentSpeed > 0) { ttsContentNew = if ((currentSpeed * 3.6).roundToInt() in (minSpeedTemp + 1) until maxSpeedTemp) { - "${SkinResources.getInstance().getString(R.string.operation_platform_name)}路侧提醒您,推荐保持当前车速通过路口" + "建议保持当前车速通过路口" } else { - "${SkinResources.getInstance().getString(R.string.operation_platform_name)}路侧提醒您,推荐保持车速$minSpeedTemp - $maxSpeedTemp KM/H通过路口" + "推荐保持车速10-30KM/H通过路口" } alertContentNew = "推荐车速$minSpeedTemp - $maxSpeedTemp KM/H" } diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/v2x/TrafficLightDispatcher.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/v2x/TrafficLightDispatcher.kt index 59d9ff213b..8e9cd40442 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/v2x/TrafficLightDispatcher.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/v2x/TrafficLightDispatcher.kt @@ -238,42 +238,42 @@ class TrafficLightDispatcher : IMoGoAutopilotIdentifyListener, IMoGoTrafficLight } } - if(AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode) - && AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode) && !isPrompted){ - //车辆行驶中,若判断当前绿灯自车无法通过,在绿灯剩余5s且下一灯态为红/黄灯时,提示“蘑菇提醒您及时减速,避免路口急刹” - if(light.state == FusionTrafficLightOuterClass.FusionLightState.STATE_GREEN_FUSION && light.duration < 5){ - CallerMapRoadListenerManager.getStopLineDistance()?.let { dis-> - if(currentSpeed*light.duration < dis){ - //语音播放:蘑菇提醒您及时减速,避免路口急刹 - AIAssist.getInstance(mContext).speakTTSVoice( - "${SkinResources.getInstance().getString(R.string.operation_platform_name)}提醒您及时减速,避免路口急刹") - isPrompted = true - } - } - } - //车辆行驶中,若判断当前绿灯自车基于当前速度需提速10%以上才可通过时,提示“蘑菇提醒您及时减速,避免路口急刹” - if(light.state == FusionTrafficLightOuterClass.FusionLightState.STATE_GREEN_FUSION){ - CallerMapRoadListenerManager.getStopLineDistance()?.let{distance-> - if(currentSpeed*light.duration*1.1 < distance){ - //语音播放:蘑菇提醒您及时减速,避免路口急刹 - AIAssist.getInstance(mContext).speakTTSVoice( - "${SkinResources.getInstance().getString(R.string.operation_platform_name)}提醒您及时减速,避免路口急刹") - isPrompted = true - } - } - } - //车辆行驶中,若判断当前红灯自车基于当前速度需降低60%以上才可通过时,提示“蘑菇提醒您及时减速,避免路口急刹” - if(light.state ==FusionTrafficLightOuterClass.FusionLightState.STATE_RED_FUSION){ - CallerMapRoadListenerManager.getStopLineDistance()?.let{distance-> - if(currentSpeed*0.4*light.duration > distance){ - //语音播放:蘑菇提醒您及时减速,避免路口急刹 - AIAssist.getInstance(mContext).speakTTSVoice( - "${SkinResources.getInstance().getString(R.string.operation_platform_name)}提醒您及时减速,避免路口急刹") - isPrompted = true - } - } - } - } +// if(AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode) +// && AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode) && !isPrompted){ +// //车辆行驶中,若判断当前绿灯自车无法通过,在绿灯剩余5s且下一灯态为红/黄灯时,提示“蘑菇提醒您及时减速,避免路口急刹” +// if(light.state == FusionTrafficLightOuterClass.FusionLightState.STATE_GREEN_FUSION && light.duration < 5){ +// CallerMapRoadListenerManager.getStopLineDistance()?.let { dis-> +// if(currentSpeed*light.duration < dis){ +// //语音播放:蘑菇提醒您及时减速,避免路口急刹 +// AIAssist.getInstance(mContext).speakTTSVoice( +// "${SkinResources.getInstance().getString(R.string.operation_platform_name)}提醒您及时减速,避免路口急刹") +// isPrompted = true +// } +// } +// } +// //车辆行驶中,若判断当前绿灯自车基于当前速度需提速10%以上才可通过时,提示“蘑菇提醒您及时减速,避免路口急刹” +// if(light.state == FusionTrafficLightOuterClass.FusionLightState.STATE_GREEN_FUSION){ +// CallerMapRoadListenerManager.getStopLineDistance()?.let{distance-> +// if(currentSpeed*light.duration*1.1 < distance){ +// //语音播放:蘑菇提醒您及时减速,避免路口急刹 +// AIAssist.getInstance(mContext).speakTTSVoice( +// "${SkinResources.getInstance().getString(R.string.operation_platform_name)}提醒您及时减速,避免路口急刹") +// isPrompted = true +// } +// } +// } +// //车辆行驶中,若判断当前红灯自车基于当前速度需降低60%以上才可通过时,提示“蘑菇提醒您及时减速,避免路口急刹” +// if(light.state ==FusionTrafficLightOuterClass.FusionLightState.STATE_RED_FUSION){ +// CallerMapRoadListenerManager.getStopLineDistance()?.let{distance-> +// if(currentSpeed*0.4*light.duration > distance){ +// //语音播放:蘑菇提醒您及时减速,避免路口急刹 +// AIAssist.getInstance(mContext).speakTTSVoice( +// "${SkinResources.getInstance().getString(R.string.operation_platform_name)}提醒您及时减速,避免路口急刹") +// isPrompted = true +// } +// } +// } +// } } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt index fc34e3643c..ad36c8db3d 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt @@ -61,6 +61,7 @@ import com.zhjt.mogo_core_function_devatools.coldstart.ColdStartManager import com.zhjt.mogo_core_function_devatools.driver.video.DriveSeatVideoProviderImpl import com.mogo.eagle.core.function.api.driver.video.IDriveSeatVideoProvider import com.mogo.eagle.core.function.call.hmi.CallerHmiManager +import com.zhjt.mogo_core_function_devatools.diskcopy.DiskCopyManager import com.zhjt.mogo_core_function_devatools.env.EnvChangeManager import com.zhjt.mogo_core_function_devatools.exam.ExamControlManager import com.zhjt.mogo_core_function_devatools.funcconfig.FuncConfigCenter.Companion.bizConfigCenter @@ -163,7 +164,7 @@ class DevaToolsProvider : IDevaToolsProvider, IAppStateListener { if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { CallerHmiManager.toggleSafetyStopCarWarning(false) AppStateManager.currentActivity()?.also { - AIAssist.getInstance(it).speakTTSVoice("请接管恢复停车状态") + AIAssist.getInstance(it).speakTTSVoice("请接管恢复车辆状态") } } } @@ -205,7 +206,8 @@ class DevaToolsProvider : IDevaToolsProvider, IAppStateListener { // apmEnvProvider.init(if(DebugConfig.isDebug()) "0" else "1", "${ DebugConfig.getNetMode() }", mDockerVersion ?: "") BadCaseManager.init(mContext!!) ColdStartManager.init(mContext!!) -// OTAUpgradeManager.init(mContext!!) + OTAUpgradeManager.init(mContext!!) + DiskCopyManager.init(mContext!!) if (DebugConfig.isDebug()) { SdtManager.init(mContext!!, true, DetectResultImpl()) } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt index 9962aa08aa..58c170d4e3 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt @@ -156,6 +156,10 @@ internal object BadCaseManager : LifecycleEventObserver, IMoGoAutopilotRecordLis BadCaseConfig.setStartTime(currentDay) //删除前一天的接管记录 CallerTakeOverManager.deleteAllRecord(context) + //遍历是否有非当日的文件并删除 + RecordBitmapUtils.deleteExpiredFile(currentDay,"FrontCamera") + RecordBitmapUtils.deleteExpiredFile(currentDay,"RearCamera") + RecordBitmapUtils.deleteExpiredFile(currentDay,"MapScreen") } } @@ -417,7 +421,6 @@ internal object BadCaseManager : LifecycleEventObserver, IMoGoAutopilotRecordLis override fun onAutopilotRecordResult(recordPanel: RecordPanelOuterClass.RecordPanel) { super.onAutopilotRecordResult(recordPanel) CallerLogger.d("$M_DEVA$TAG", "recordKey=${recordPanel.key},stat=${recordPanel.stat},type=${recordPanel.type}") - CallerLogger.i(TestTag,"onAutopilotRecordResult receive recordKey=${recordPanel.key},stat=${recordPanel.stat},type=${recordPanel.type},lineName=${BadCaseConfig.lineName}") if(BadCaseConfig.notDisplayBagWindow){ //此时点击主动录包按钮,不能展示上报弹窗,需要在此处做主动录包弹窗中的一些逻辑 //开始录制 @@ -441,22 +444,18 @@ internal object BadCaseManager : LifecycleEventObserver, IMoGoAutopilotRecordLis CallerLogger.i(TestTag,"onAutopilotRecordResult contains recordKey=${recordPanel.key},stat=${recordPanel.stat},type=${recordPanel.type},lineName=${BadCaseConfig.lineName}") //目前type == 3包括接管被动录包和其他一些故障录包 if(recordPanel.type == 3){ - CallerLogger.i(TestTag,"onAutopilotRecordResult 符合type=3 recordKey=${recordPanel.key},stat=${recordPanel.stat},type=${recordPanel.type},lineName=${BadCaseConfig.lineName}") //录包成功 if(recordPanel.stat == 100 || recordPanel.stat == 101){ - CallerLogger.i(TestTag,"onAutopilotRecordResult 录包成功 recordKey=${recordPanel.key},stat=${recordPanel.stat},type=${recordPanel.type},lineName=${BadCaseConfig.lineName}") val activity = AppStateManager.currentActivity() if (activity !is AppCompatActivity) { return } - CallerLogger.i(TestTag,"activity符合条件") val geocodeSearch = GeocodeSearch(activity) geocodeSearch.setOnGeocodeSearchListener(object: GeocodeSearch.OnGeocodeSearchListener { override fun onRegeocodeSearched(regeocodeResult: RegeocodeResult?, p1: Int) { regeocodeResult?.regeocodeAddress?.formatAddress?.let { address = it } - CallerLogger.i(TestTag,"onRegeocodeSearched address=${address}") val takeOverRecordInfo = TakeOverRecordInfo(System.currentTimeMillis(), address,level1Id,level2Id,level3Id, level1Name, level2Name, level3Name, @@ -477,12 +476,12 @@ internal object BadCaseManager : LifecycleEventObserver, IMoGoAutopilotRecordLis val q = RegeocodeQuery(latLon,200f,GeocodeSearch.AMAP) geocodeSearch.getFromLocationAsyn(q) takeOverBagId = recordPanel.key -// //触发域控前后120度摄像头截图和高精地图截图 -// CallerAutoPilotControlManager.sendCaptureImgReqOnTakeOver(recordPanel.key) -// //高精地图屏幕截图 -// CallerMapScreenListenerManager.addListener(TAG,this) -// //开启高精地图截图 -// CallerMapUIServiceManager.getMapUIController()?.getMapScreenShot() + //触发域控前后120度摄像头截图和高精地图截图 + CallerAutoPilotControlManager.sendCaptureImgReqOnTakeOver(recordPanel.key) + //高精地图屏幕截图 + CallerMapScreenListenerManager.addListener(TAG,this) + //开启高精地图截图 + CallerMapUIServiceManager.getMapUIController()?.getMapScreenShot() } } } @@ -655,7 +654,7 @@ internal object BadCaseManager : LifecycleEventObserver, IMoGoAutopilotRecordLis override fun onCaptureImgOnTakeOver(isFront: Boolean, data: MessagePad.CaptureImgOnTakeOver) { super.onCaptureImgOnTakeOver(isFront, data) //将byte字节流转为Bitmap - val bitmap = BitmapFactory.decodeByteArray(data.data.toByteArray(),0,data.toByteArray().size) + val bitmap = BitmapFactory.decodeByteArray(data.data.toByteArray(),0,data.data.toByteArray().size) //图片保存本地 val currentDay = millis2String(System.currentTimeMillis(), TimeUtils.getMdFormat()) val imageName = if(isFront){ diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/util/RecordBitmapUtils.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/util/RecordBitmapUtils.kt index b65884d61d..a4864f5089 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/util/RecordBitmapUtils.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/util/RecordBitmapUtils.kt @@ -36,9 +36,11 @@ object RecordBitmapUtils { /** * 删除过期文件夹 + * @param currentDay 要删除的文件日期 + * @param deleteFile 要删除的文件目录 */ - fun deleteExpiredFile(currentDay: String){ - val checkFileName = Environment.getExternalStorageDirectory().absolutePath + File.separator+ "MapScreen" + fun deleteExpiredFile(currentDay: String,deleteFile: String){ + val checkFileName = Environment.getExternalStorageDirectory().absolutePath + File.separator+ deleteFile val checkFileFolder = File(checkFileName) if(checkFileFolder.exists()){ checkFileFolder.listFiles()?.forEach {dir-> diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/binding/BindingCarNetWorkManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/binding/BindingCarNetWorkManager.kt index 0a6de8dc1d..9e5d3784a5 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/binding/BindingCarNetWorkManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/binding/BindingCarNetWorkManager.kt @@ -165,21 +165,6 @@ class BindingCarNetWorkManager private constructor() { }) } - private fun updateCarVrIconRes(brandId: String?) { - d(SceneConstant.M_DEVA + TAG, "CarModelChange : ${DebugConfig.isCarModelChange()}") - if (!DebugConfig.isCarModelChange()) { - return - } - if (brandId == null || brandId.isEmpty()) { - return - } - d(SceneConstant.M_DEVA + TAG, "getDefaultId() : ${getDefaultId()} ---- brandId = $brandId") - if (getDefaultId() == brandId) { - return - } - d(SceneConstant.M_DEVA + TAG, "updateCarVrIconRes : $brandId") - } - @ChainLog( linkChainLog = ChainConstant.CHAIN_TYPE_STATUS, linkCode = ChainConstant.CHAIN_SOURCE_INIT, diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/coldstart/ColdStartFaultAdapter.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/coldstart/ColdStartFaultAdapter.kt new file mode 100644 index 0000000000..727ee685d4 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/coldstart/ColdStartFaultAdapter.kt @@ -0,0 +1,40 @@ +package com.zhjt.mogo_core_function_devatools.coldstart + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.zhjt.mogo_core_function_devatools.R + +/** + * 冷启动故障列表适配器 + */ +class ColdStartFaultAdapter: RecyclerView.Adapter() { + + private var faultList: ArrayList ?= null + + fun setData(list: ArrayList){ + faultList = list + notifyDataSetChanged() + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FaultInfoHolder { + val view = LayoutInflater.from(parent.context) + .inflate(R.layout.item_fault_code, parent, false) + return FaultInfoHolder(view) + } + + override fun onBindViewHolder(holder: FaultInfoHolder, position: Int) { + faultList?.let { + holder.tvFaultCode.text = it[position] + } + } + + override fun getItemCount() = faultList?.size ?: 0 + + class FaultInfoHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var tvFaultCode: TextView = itemView.findViewById(R.id.tvFaultCode) + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/diskcopy/DiskCopyManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/diskcopy/DiskCopyManager.kt new file mode 100644 index 0000000000..ef520e7fda --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/diskcopy/DiskCopyManager.kt @@ -0,0 +1,31 @@ +package com.zhjt.mogo_core_function_devatools.diskcopy + +import android.content.Context +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.function.api.devatools.IDiskCopyListener +import com.mogo.eagle.core.function.call.devatools.CallerDiskCopyManager +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils +import packet_mytest_upload.CopyBag + +/** + * 数据落盘辅助工具管理 + */ +object DiskCopyManager: IDiskCopyListener{ + + const val TAG = "DiskCopyManager" + + fun init(context: Context){ + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)){ + CallerDiskCopyManager.addListener(TAG, this) + } + } + + /** + * 数据落盘拷贝信息回调 + */ + override fun onCopyBag(diskCopy: CopyBag.DiskCopy) { + super.onCopyBag(diskCopy) + + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/lookaround/MoGoLookAroundProviderImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/lookaround/MoGoLookAroundProviderImpl.kt index 89ea5f8921..2ff36f568f 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/lookaround/MoGoLookAroundProviderImpl.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/lookaround/MoGoLookAroundProviderImpl.kt @@ -6,9 +6,11 @@ import android.util.* import androidx.core.util.Pools import com.mogo.eagle.core.data.config.* import com.mogo.eagle.core.function.api.autopilot.* +import com.mogo.eagle.core.function.api.datacenter.IDataCenterBizListener import com.mogo.eagle.core.function.api.lookaround.* import com.mogo.eagle.core.function.api.lookaround.data.* import com.mogo.eagle.core.function.call.autopilot.* +import com.mogo.eagle.core.function.call.datacenter.CallerDataCenterBizListener import com.mogo.eagle.core.utilcode.mogo.* import com.zhjt.mogo.adas.data.* import com.zhjt.mogo.adas.data.bean.* @@ -20,7 +22,8 @@ import mogo.telematics.pad.MessagePad.Header import mogo.telematics.pad.MessagePad.SetParamReq import java.util.concurrent.atomic.AtomicInteger -internal class MoGoLookAroundProviderImpl: IMoGoLookAroundProvider, IMoGoBackCameraVideoListener, IMoGoRoboBusJinlvM1StitchedVideoListener, IMoGoGetParamResponseListener { +internal class MoGoLookAroundProviderImpl: IMoGoLookAroundProvider, IMoGoBackCameraVideoListener, IMoGoRoboBusJinlvM1StitchedVideoListener, IMoGoGetParamResponseListener, + IDataCenterBizListener { companion object { private const val TAG = "MoGoLookAroundProvider" @@ -60,6 +63,14 @@ internal class MoGoLookAroundProviderImpl: IMoGoLookAroundProvider, IMoGoBackCam CallerBackCameraVideoListenerManager.addListener(TAG, this) CallerRoboBusJinlvM1StitchedVideoListenerManager.addListener(TAG, this) CallerAutopilotGetParamResponseDispatcher.addListener(TAG, this) + CallerDataCenterBizListener.addListener(TAG,this) + } + + /** + * 车型发生变化回调 + */ + override fun invokeVehicleChange() { + super.invokeVehicleChange() if (AppIdentityModeUtils.isM1(FunctionBuildConfig.appIdentityMode)) { sendReqForParamPeriod() } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoGoMoFangProviderImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoGoMoFangProviderImpl.kt index 0ccb0c161f..3d7ecc34e3 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoGoMoFangProviderImpl.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoGoMoFangProviderImpl.kt @@ -342,8 +342,10 @@ internal class MoGoMoFangProviderImpl: IMoGoMoFangProvider, OnMoFangDeviceListen } } val mode = FunctionBuildConfig.appIdentityMode - val channel = AppIdentityModeUtils.getMisChannelCode(mode) - val isBusOrB1OrB2 = (channel == 4 || channel == 11 || channel == 15) + val isBusOrB1OrB2 = AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode) + && (AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode) + || AppIdentityModeUtils.isB1(FunctionBuildConfig.appIdentityMode) + || AppIdentityModeUtils.isB2(FunctionBuildConfig.appIdentityMode)) val isM1 = AppIdentityModeUtils.isM1(mode) if (isBusOrB1OrB2 || isM1) { if (inputType == 1 && keyCodes.size == 1) { diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/ota/OTAUpgradeManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/ota/OTAUpgradeManager.kt index 17597bd3f9..0976b77e33 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/ota/OTAUpgradeManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/ota/OTAUpgradeManager.kt @@ -1,6 +1,9 @@ package com.zhjt.mogo_core_function_devatools.ota import android.content.Context +import android.os.Handler +import android.os.Looper +import android.os.Message import android.text.TextUtils import android.util.Log import com.mogo.eagle.core.data.config.FunctionBuildConfig @@ -39,6 +42,26 @@ object OTAUpgradeManager: IMoGoAutopilotStatusListener, IDataCenterBizListener, } } + private var responseTimeoutNum: Int = 0 //响应超时次数 + private val handler =object : Handler(Looper.getMainLooper()){ + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + if(msg.what == 1){ + if(responseTimeoutNum<40){ + responseTimeoutNum++ + //30秒没有收到OTA升级推送主动进行查询 + Log.i(TAG,"30秒没有收到OTA升级推送主动进行查询") + CallerAutoPilotControlManager.sendSsmFuncOtaStatusQuery(OTAUpgradeConfig.otaToken) + this.sendEmptyMessageDelayed(1,30000) + }else{ + Log.i(TAG,"20分钟没有收到OTA升级推送置为失败") + CallerHmiManager.showOTADownloadStatusDialog(false, emptyList()) + CallerHmiManager.showOTAResultDialog(false) + } + } + } + } + /** * 自动驾驶状态信息 * @param state 状态信息 @@ -112,6 +135,7 @@ object OTAUpgradeManager: IMoGoAutopilotStatusListener, IDataCenterBizListener, val isDelay = productInfo.optBoolean("is_delay") val curSize = productInfo.optDouble("cur_size") val totalSize = productInfo.optDouble("total_size") + val taskNumber = productInfo.optInt("task_number") Log.i(TAG, "index=$index") Log.i(TAG, "token=$token") @@ -126,6 +150,7 @@ object OTAUpgradeManager: IMoGoAutopilotStatusListener, IDataCenterBizListener, Log.i(TAG, "is_delay=$isDelay") Log.i(TAG, "cur_size=$curSize") Log.i(TAG, "total_size=$totalSize") + Log.i(TAG,"taskNumber=$taskNumber") if(index == 0){ //是否需要触发提示升级只判断第一个任务 @@ -153,14 +178,25 @@ object OTAUpgradeManager: IMoGoAutopilotStatusListener, IDataCenterBizListener, if(productStatus == 0 || productStatus == 1 || productStatus == 2){ upgradeComplete = false } + if(productArray.length() != taskNumber){ + upgradeComplete = false + } if(productName.contains(":")){ productName = productName.trim().substringAfterLast(":") } val otaUpgradeInfo = OtaUpgradeInfo(token, productStatus,failReason,upgradeReason, - taskId,taskItemId,otaType,productName,needRestart,isDelay,curSize,totalSize) + taskId,taskItemId,otaType,productName,needRestart,isDelay,curSize,totalSize) otaUpgradeList.add(otaUpgradeInfo) } CallerHmiManager.showOTADownloadStatusDialog(true,otaUpgradeList) + if(!upgradeComplete){ + responseTimeoutNum = 0 + handler.removeMessages(1) + handler.sendEmptyMessageDelayed(1,30000) + }else{ + responseTimeoutNum = 0 + handler.removeMessages(1) + } if(upgradeComplete){ OTAUpgradeConfig.otaToken = "" CallerOTAManager.invokeOtaDownloadStatus(false) @@ -183,7 +219,6 @@ object OTAUpgradeManager: IMoGoAutopilotStatusListener, IDataCenterBizListener, super.onOtaStatus(status) Log.i(TAG,"onOtaStatus status.otaInfo.otaToken"+status.otaInfo.otaToken) Log.i(TAG,"onOtaStatus status.otaInfo.productName"+status.otaInfo.productName) - if(status.otaInfo.otaToken.isNotEmpty()){ if(OTAUpgradeConfig.otaToken != status.otaInfo.otaToken){ OTAUpgradeConfig.otaToken = status.otaInfo.otaToken @@ -191,6 +226,21 @@ object OTAUpgradeManager: IMoGoAutopilotStatusListener, IDataCenterBizListener, } //解析JSON + if(status.otaInfo.productName.isEmpty()){ + if(OTAUpgradeConfig.isQuery){ + ToastUtils.showLong("暂无待升级任务!") + OTAUpgradeConfig.isQuery = false + }else{ + //没有升级任务,取消查询,关掉弹窗 + responseTimeoutNum = 0 + handler.removeMessages(1) + CallerHmiManager.showOTAUpgradeDialog(false) + CallerHmiManager.showOTADownloadStatusDialog(false, emptyList()) + CallerOTAManager.invokeOtaDownloadStatus(false) + } + return + } + val otaUpgradeList = ArrayList() val productArray = JSONArray(status.otaInfo.productName) var upgradeComplete = true @@ -210,6 +260,7 @@ object OTAUpgradeManager: IMoGoAutopilotStatusListener, IDataCenterBizListener, val isDelay = productInfo.optBoolean("is_delay") val curSize = productInfo.optDouble("cur_size") val totalSize = productInfo.optDouble("total_size") + val taskNumber = productInfo.optInt("task_number") Log.i(TAG, "index=$index") Log.i(TAG, "token=$token") @@ -224,6 +275,7 @@ object OTAUpgradeManager: IMoGoAutopilotStatusListener, IDataCenterBizListener, Log.i(TAG, "is_delay=$isDelay") Log.i(TAG, "cur_size=$curSize") Log.i(TAG, "total_size=$totalSize") + Log.i(TAG,"task_number=$taskNumber") if(index == 0){ //是否需要触发提示升级只判断第一个任务 @@ -243,6 +295,7 @@ object OTAUpgradeManager: IMoGoAutopilotStatusListener, IDataCenterBizListener, } OTAUpgradeConfig.promptedUpgrade.add(status.otaInfo.otaToken) } + OTAUpgradeConfig.isQuery = false return } } @@ -252,8 +305,12 @@ object OTAUpgradeManager: IMoGoAutopilotStatusListener, IDataCenterBizListener, if(productStatus == 0 || productStatus == 1 || productStatus == 2){ upgradeComplete = false } + if(productArray.length() != taskNumber){ + upgradeComplete = false + } if(productStatus == 4){ upgradeResult = false + upgradeComplete = true } if(productName.contains(":")){ productName = productName.trim().substringAfterLast(":") @@ -262,22 +319,28 @@ object OTAUpgradeManager: IMoGoAutopilotStatusListener, IDataCenterBizListener, taskId,taskItemId,otaType,productName,needRestart,isDelay,curSize,totalSize) otaUpgradeList.add(otaUpgradeInfo) } + if(!upgradeComplete){ + responseTimeoutNum = 0 + handler.removeMessages(1) + handler.sendEmptyMessageDelayed(1,30000) + }else{ + responseTimeoutNum = 0 + handler.removeMessages(1) + } if(upgradeComplete){ OTAUpgradeConfig.otaToken = "" if(OTAUpgradeConfig.isQuery){ ToastUtils.showLong("暂无待升级任务!") OTAUpgradeConfig.isQuery = false }else{ - if(!OTAUpgradeConfig.upgradeFinish.contains(status.otaInfo.otaToken)){ - CallerHmiManager.showOTADownloadStatusDialog(true,otaUpgradeList) - CallerHmiManager.showOTAResultDialog(upgradeResult) - OTAUpgradeConfig.upgradeFinish.add(status.otaInfo.otaToken) - } + CallerHmiManager.showOTADownloadStatusDialog(false,otaUpgradeList) + CallerHmiManager.showOTAResultDialog(upgradeResult) } CallerOTAManager.invokeOtaDownloadStatus(false) }else{ //通知关闭提示升级窗口(存在域控也在进行5min倒计时,与app存在时间差,域控会更早完成倒计时触发升级, // 此时通知app开始升级,app收到后即使未完成倒计时,也关闭提示弹窗,开始展示下载进展) + OTAUpgradeConfig.isQuery = false CallerHmiManager.showOTAUpgradeDialog(false) CallerHmiManager.showOTADownloadStatusDialog(true,otaUpgradeList) CallerOTAManager.invokeOtaDownloadStatus(true) diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/model/StatusModel.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/model/StatusModel.kt index 4bc25acfb2..0adb584cbf 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/model/StatusModel.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/model/StatusModel.kt @@ -15,7 +15,7 @@ internal class StatusModel : ViewModel() { val DEFAULTS = Pair(null, ArrayList().also { it += OverViewStatus() it += FSMStatus(FSMStateCode.UnKnown, listOf("")) - it += RTKStatus("", -1) +// it += RTKStatus("", -1) it += IpcStatus(CallerAutoPilotStatusListenerManager.isConnect()) it += CanStatus(false) // it += TracingStatus(UNKNOWN) diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/UpgradeAnalyticsManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/UpgradeAnalyticsManager.kt new file mode 100644 index 0000000000..8a4cc376c5 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/UpgradeAnalyticsManager.kt @@ -0,0 +1,48 @@ +package com.zhjt.mogo_core_function_devatools.upgrade + +import com.mogo.commons.storage.SharedPrefsMgr +import com.mogo.commons.utils.MogoAnalyticUtils +import com.mogo.eagle.core.data.app.AppConfigInfo +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils +import com.mogo.eagle.core.utilcode.util.AppUtils + +/** + * APP升级埋点管理 + */ +object UpgradeAnalyticsManager { + + private const val installedApkInfo = "installedApkInfo" + + private const val eventParamAppFlavor = "appFlavor" //渠道信息 + private const val eventParamBranchHash = "branchHash" //Git Hash + private const val eventParamPackageInfoList = "packageInfoList" + private const val eventParamIsInstallAppStore = "isInstallAppStore" + + /** + * @param appFlavor 渠道信息 + * @param branchHash Git Hash + * @param packageInfoList 已安装应用列表 + * @param isInstallAppStore 是否安装应用商店 + */ + private fun realUpgradeAnalytics(appFlavor: String,branchHash: String, + packageInfoList: List,isInstallAppStore: Boolean){ + val upgradeParams = HashMap() + upgradeParams[eventParamAppFlavor] = appFlavor + upgradeParams[eventParamBranchHash] = branchHash + upgradeParams[eventParamPackageInfoList] = packageInfoList + upgradeParams[eventParamIsInstallAppStore] = isInstallAppStore + MogoAnalyticUtils.track(installedApkInfo,upgradeParams) + } + + /** + * @param packageInfoList 已安装应用列表 + * @param isInstallAppStore 是否安装应用商店 + */ + fun upgradeAnalytics(packageInfoList: List,isInstallAppStore: Boolean){ + realUpgradeAnalytics(AppConfigInfo.flavor, + AppConfigInfo.workingBranchHash, packageInfoList, isInstallAppStore) + } + + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/UpgradeAppNetWorkManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/UpgradeAppNetWorkManager.kt index 3622d924ba..c88e2df8d2 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/UpgradeAppNetWorkManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/UpgradeAppNetWorkManager.kt @@ -1,9 +1,12 @@ package com.zhjt.mogo_core_function_devatools.upgrade import android.content.* +import android.content.pm.PackageManager +import android.os.Build import android.text.TextUtils import android.util.* import android.widget.Toast +import androidx.annotation.RequiresApi import com.mogo.commons.constants.* import com.mogo.commons.utils.* import com.mogo.eagle.core.data.config.* @@ -177,6 +180,8 @@ class UpgradeAppNetWorkManager private constructor() { Log.d("ApkInstaller", "走全量升级 --- 1 ----") provider?.recordUpgradeRecord(info.result.versionName, null, 0) } + //系统安装所有APP列表埋点统计 + installedInfoAnalytics() if (ApkInstaller.isInstallAppStore(Utils.getApp())) { if (mDownloadRequested) { return @@ -213,6 +218,22 @@ class UpgradeAppNetWorkManager private constructor() { } } + /** + *系统安装所有APP列表埋点统计 + */ + private fun installedInfoAnalytics(){ + val installedPackages = Utils.getApp().packageManager.getInstalledPackages(0) + val packageInfoList = ArrayList() + var isInstallAppStore = false + installedPackages.forEach { + packageInfoList.add("packageName="+it.packageName+" versionName="+it.versionName+" versionCode="+it.versionCode) + if(it.packageName == "com.mogo.appstore"){ + isInstallAppStore = true + } + } + UpgradeAnalyticsManager.upgradeAnalytics(packageInfoList,isInstallAppStore) + } + /** * 删除APK 相关的文件 */ diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/provider/db/dao/IUpgradeRecordDao.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/provider/db/dao/IUpgradeRecordDao.kt index e9a75d7be6..e774847ce1 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/provider/db/dao/IUpgradeRecordDao.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/provider/db/dao/IUpgradeRecordDao.kt @@ -2,8 +2,8 @@ package com.zhjt.mogo_core_function_devatools.upgrade.provider.db.dao import androidx.room.Dao import androidx.room.Insert -import androidx.room.OnConflictStrategy.IGNORE -import androidx.room.OnConflictStrategy.REPLACE +import androidx.room.OnConflictStrategy.Companion.IGNORE +import androidx.room.OnConflictStrategy.Companion.REPLACE import androidx.room.Query import androidx.room.Transaction import com.zhjt.mogo_core_function_devatools.upgrade.provider.db.vo.* diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/provider/db/vo/Vo.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/provider/db/vo/Vo.kt index f454491560..b27468887e 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/provider/db/vo/Vo.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/provider/db/vo/Vo.kt @@ -1,7 +1,7 @@ package com.zhjt.mogo_core_function_devatools.upgrade.provider.db.vo import androidx.room.* -import androidx.room.ForeignKey.CASCADE +import androidx.room.ForeignKey.Companion.CASCADE import com.mogo.eagle.core.utilcode.util.* @Entity(tableName = "records") diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/TakeOverReasonWindow.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/TakeOverReasonWindow.kt index c57fd8122b..7d5cea2ea8 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/TakeOverReasonWindow.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/TakeOverReasonWindow.kt @@ -3,7 +3,9 @@ package com.zhjt.mogo_core_function_devatools.workorder import android.annotation.SuppressLint import android.app.Activity import android.graphics.PixelFormat +import android.net.Uri import android.os.Bundle +import android.os.Environment import android.text.Editable import android.text.TextWatcher import android.util.DisplayMetrics @@ -33,27 +35,31 @@ import com.iflytek.cloud.SpeechError import com.iflytek.cloud.SpeechRecognizer import com.mogo.eagle.core.data.deva.report.CategoryInfo import com.mogo.eagle.core.data.deva.report.TakeOverRecordInfo +import com.mogo.eagle.core.function.api.datacenter.takeover.ITakeOverRecordEventListener import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsListener import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsListenerManager import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager import com.mogo.eagle.core.function.call.takeover.CallerTakeOverManager +import com.mogo.eagle.core.function.call.takeover.CallerTakeOverRecordEventManager import com.mogo.eagle.core.utilcode.util.BarUtils import com.mogo.eagle.core.utilcode.util.JsonParser import com.mogo.eagle.core.utilcode.util.ThreadUtils import com.mogo.eagle.core.utilcode.util.TimeUtils +import com.mogo.eagle.core.utilcode.util.TimeUtils.getMdFormat import com.mogo.eagle.core.utilcode.util.TimeUtils.millis2String import com.mogo.eagle.core.utilcode.util.ToastUtils import com.mogo.tts.base.SpeechUtils import com.zhjt.mogo_core_function_devatools.R import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig import com.zhjt.mogo_core_function_devatools.workorder.adapter.OrderReasonAdapter -import kotlin.math.absoluteValue +import java.io.File + /** * 接管原因编辑窗口 */ class TakeOverReasonWindow constructor(activity: Activity) : View.OnTouchListener, - IMoGoDevaToolsListener { + IMoGoDevaToolsListener, ITakeOverRecordEventListener { companion object{ const val TAG = "TakeOverReasonWindow" @@ -63,11 +69,7 @@ class TakeOverReasonWindow constructor(activity: Activity) : View.OnTouchListene private var mWindowParams: WindowManager.LayoutParams? = null private var mWindowManager: WindowManager? = null private lateinit var mFloatLayout: View - - private var mInViewX = 0f - private var mInViewY = 0f - private var mInScreenX = 0f - private var mInScreenY = 0f + private var takeOverSceneWindow: TakeOverSceneWindow ?= null // 语音听写对象 private var mIat: SpeechRecognizer? = null @@ -84,6 +86,9 @@ class TakeOverReasonWindow constructor(activity: Activity) : View.OnTouchListene private lateinit var tvTakeOverReason: AppCompatTextView private lateinit var etNoteInput: AppCompatEditText private lateinit var ivNoteAudio: ImageView + private lateinit var ivFrontCamera: ImageView + private lateinit var ivRearCamera: ImageView + private lateinit var ivMapScreen: ImageView private lateinit var tvTakeOverSave: TextView private lateinit var tvTakeOverCancel: TextView private lateinit var rvTakeOverList: RecyclerView @@ -132,7 +137,7 @@ class TakeOverReasonWindow constructor(activity: Activity) : View.OnTouchListene it.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL it.gravity = Gravity.START or Gravity.TOP it.width = 902 - it.height = 1530 + it.height = 1535 it.alpha = 1.0f } } @@ -143,6 +148,9 @@ class TakeOverReasonWindow constructor(activity: Activity) : View.OnTouchListene tvTakeOverReason = mFloatLayout.findViewById(R.id.tvTakeOverReason) etNoteInput = mFloatLayout.findViewById(R.id.etNoteInput) ivNoteAudio = mFloatLayout.findViewById(R.id.ivNoteAudio) + ivFrontCamera = mFloatLayout.findViewById(R.id.ivFrontCamera) + ivRearCamera = mFloatLayout.findViewById(R.id.ivRearCamera) + ivMapScreen = mFloatLayout.findViewById(R.id.ivMapScreen) tvTakeOverSave = mFloatLayout.findViewById(R.id.tvTakeOverSave) tvTakeOverCancel = mFloatLayout.findViewById(R.id.tvTakeOverCancel) rvTakeOverList = mFloatLayout.findViewById(R.id.rvTakeOverList) @@ -187,6 +195,7 @@ class TakeOverReasonWindow constructor(activity: Activity) : View.OnTouchListene @SuppressLint("SetTextI18n") private fun initEvent(){ CallerDevaToolsListenerManager.addListener(this.hashCode().toString(), this) + CallerTakeOverRecordEventManager.addListener(this.hashCode().toString(), this) val iconDown = ContextCompat.getDrawable(mActivity, R.drawable.icon_fault_expand) iconDown?.setBounds(0, 0, iconDown.minimumWidth, iconDown.minimumHeight) val iconUp = ContextCompat.getDrawable(mActivity, R.drawable.icon_fault_retract) @@ -316,6 +325,18 @@ class TakeOverReasonWindow constructor(activity: Activity) : View.OnTouchListene } } + private fun showSceneWindow(frontCameraUri: Uri,rearCameraUri: Uri,mapScreenUri: Uri,currentItem: Int){ + if(takeOverSceneWindow == null){ + takeOverSceneWindow = TakeOverSceneWindow(mActivity) + } + takeOverSceneWindow?.setClickListener(object: TakeOverSceneWindow.ClickListener{ + override fun closeWindow() { + takeOverSceneWindow = null + } + }) + takeOverSceneWindow?.showFloatWindow(frontCameraUri,rearCameraUri,mapScreenUri,currentItem) + } + private fun setAudio(status: Boolean){ if(status){ //开始录音 @@ -417,25 +438,6 @@ class TakeOverReasonWindow constructor(activity: Activity) : View.OnTouchListene @SuppressLint("ClickableViewAccessibility") override fun onTouch(v: View?, motionEvent: MotionEvent?): Boolean { -// when (motionEvent?.action) { -// MotionEvent.ACTION_DOWN -> { -// // 获取相对View的坐标,即以此View左上角为原点 -// mInViewX = motionEvent.x -// mInViewY = motionEvent.y -// // 获取相对屏幕的坐标,即以屏幕左上角为原点 -// mInScreenX = motionEvent.rawX -// mInScreenY = motionEvent.rawY -// } -// MotionEvent.ACTION_MOVE -> { -// // 更新浮动窗口位置参数 -// mInScreenX = motionEvent.rawX -// mInScreenY = motionEvent.rawY -// mWindowParams!!.x = (mInScreenX - mInViewX).toInt() -// mWindowParams!!.y = (mInScreenY - mInViewY).toInt() -// // 手指移动的时候更新小悬浮窗的位置 -// mWindowManager!!.updateViewLayout(mFloatLayout, mWindowParams) -// } -// } return true } @@ -457,6 +459,40 @@ class TakeOverReasonWindow constructor(activity: Activity) : View.OnTouchListene tvTakeOverTime.text = mActivity.resources.getString(R.string.take_over_time) + millis2String(mTakeOverRecordInfo.faultStartTime, TimeUtils.getHourMinSecondFormat()) } + //展示前向摄像头 + val frontCameraPath: String = ((Environment.getExternalStorageDirectory() + .absolutePath + File.separator) + + "FrontCamera" + File.separator + millis2String(System.currentTimeMillis(), getMdFormat()) + + File.separator + mTakeOverRecordInfo.bagId) + ".png" + val frontCameraUri = Uri.parse(frontCameraPath) + ivFrontCamera.setImageURI(frontCameraUri) + //展示后向摄像头 + val rearCameraPath: String = ((Environment.getExternalStorageDirectory() + .absolutePath + File.separator) + + "RearCamera" + File.separator + millis2String(System.currentTimeMillis(), getMdFormat()) + + File.separator + mTakeOverRecordInfo.bagId) + ".png" + val rearCameraUri = Uri.parse(rearCameraPath) + ivRearCamera.setImageURI(rearCameraUri) + //展示高精地图截图 + val mapScreenPath: String = ((Environment.getExternalStorageDirectory() + .absolutePath + File.separator) + + "MapScreen" + File.separator + millis2String(System.currentTimeMillis(), getMdFormat()) + + File.separator + mTakeOverRecordInfo.bagId) + ".png" + val mapScreenUri = Uri.parse(mapScreenPath) + ivMapScreen.setImageURI(mapScreenUri) + + //前向120°摄像头 + ivFrontCamera.setOnClickListener { + showSceneWindow(frontCameraUri,rearCameraUri,mapScreenUri,0) + } + //后向120°摄像头 + ivRearCamera.setOnClickListener { + showSceneWindow(frontCameraUri,rearCameraUri,mapScreenUri,1) + } + //高精地图截图 + ivMapScreen.setOnClickListener { + showSceneWindow(frontCameraUri,rearCameraUri,mapScreenUri,2) + } setWindowShowStatus(true) } @@ -530,4 +566,38 @@ class TakeOverReasonWindow constructor(activity: Activity) : View.OnTouchListene ToastUtils.showShort("接管列表获取失败:$msg") } + /** + * 上传接管记录监听 + * @param uploadRecordList 上传接管记录列表 + */ + override fun onUploadRecord(uploadRecordList: ArrayList) { + //如果上传列表中包含当前编辑接管,则关闭接管原因窗口 + uploadRecordList.forEach { + if(it.faultStartTime == mTakeOverRecordInfo.faultStartTime){ + ThreadUtils.runOnUiThread { + clickListener?.closeWindow() + hideFloatWindow() + } + return@forEach + } + } + } + + /** + * 删除接管记录监听 + * @param removeRecordList 删除接管记录列表 + */ + override fun onRemoveRecord(removeRecordList: ArrayList) { + //如果删除列表中包含当前编辑接管,则关闭接管原因窗口 + removeRecordList.forEach { + if(it.faultStartTime == mTakeOverRecordInfo.faultStartTime){ + ThreadUtils.runOnUiThread { + clickListener?.closeWindow() + hideFloatWindow() + } + return@forEach + } + } + } + } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/TakeOverRecordView.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/TakeOverRecordView.kt index 36821661e7..5659b7e68b 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/TakeOverRecordView.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/TakeOverRecordView.kt @@ -18,6 +18,7 @@ import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsListener import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsListenerManager import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager import com.mogo.eagle.core.function.call.takeover.CallerTakeOverManager +import com.mogo.eagle.core.function.call.takeover.CallerTakeOverRecordEventManager import com.mogo.eagle.core.utilcode.kotlin.lifeCycleScope import com.mogo.eagle.core.utilcode.util.ThreadUtils import com.mogo.eagle.core.utilcode.util.TimeUtils @@ -72,6 +73,8 @@ class TakeOverRecordView @JvmOverloads constructor( ivTakeOverRecordClose.setOnClickListener { clickListener?.onClose() CallerDevaToolsListenerManager.removeListener(TAG) + takeOverReasonWindow?.hideFloatWindow() + takeOverReasonWindow = null } //接管记录日期 tvTakeOverRecordDate.text = millis2String(System.currentTimeMillis(), getYMDFormat()) @@ -158,6 +161,7 @@ class TakeOverRecordView @JvmOverloads constructor( ToastUtils.showShort("请选择需要删除的接管记录") }else{ scope.launch(Dispatchers.IO){ + CallerTakeOverRecordEventManager.invokeRemoveRecord(selectedUploadRecord) val iterator = selectedUploadRecord.iterator() while (iterator.hasNext()){ val removeRecord = iterator.next() @@ -226,6 +230,7 @@ class TakeOverRecordView @JvmOverloads constructor( CallerTakeOverManager.updateRecord(context,it) takeOverListAdapter?.notifyRecordItemChanged(it) } + CallerTakeOverRecordEventManager.invokeUploadRecord(selectedUploadRecord) selectedUploadRecord.clear() } } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/TakeOverSceneWindow.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/TakeOverSceneWindow.kt new file mode 100644 index 0000000000..a69064ee82 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/TakeOverSceneWindow.kt @@ -0,0 +1,123 @@ +package com.zhjt.mogo_core_function_devatools.workorder + +import android.annotation.SuppressLint +import android.app.Activity +import android.graphics.PixelFormat +import android.net.Uri +import android.util.DisplayMetrics +import android.view.Gravity +import android.view.LayoutInflater +import android.view.View +import android.view.WindowManager +import android.widget.ImageView +import androidx.viewpager.widget.ViewPager +import com.mogo.eagle.core.utilcode.util.BarUtils +import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.zhjt.mogo_core_function_devatools.R +import com.zhjt.mogo_core_function_devatools.workorder.adapter.TakeOverSceneAdapter + +/** + * 场景图像查看窗口 + */ +class TakeOverSceneWindow constructor(activity: Activity) { + + companion object{ + const val TAG = "TakeOverSceneWindow" + } + + private var mActivity: Activity = activity + private var mWindowParams: WindowManager.LayoutParams? = null + private var mWindowManager: WindowManager? = null + private lateinit var mFloatLayout: View + private lateinit var vpSceneImage: ViewPager + private lateinit var ivSceneClose: ImageView + private lateinit var ivScenePrevious: ImageView + private lateinit var ivSceneNext: ImageView + private val takeOverSceneAdapter = TakeOverSceneAdapter() + private var currentIndex = 0 + private var clickListener: ClickListener? = null + + init { + initFloatWindow() + } + + private fun initFloatWindow(){ + mFloatLayout = LayoutInflater.from(mActivity).inflate(R.layout.view_take_over_scene, null) as View + initView() + initEvent() + mWindowParams = WindowManager.LayoutParams() + mWindowManager = mActivity.windowManager + mWindowParams?.let { + it.format = PixelFormat.RGBA_8888 + it.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE + it.gravity = Gravity.START or Gravity.TOP + it.width = WindowManager.LayoutParams.MATCH_PARENT + it.height = 1535 + it.alpha = 1.0f + } + } + + private fun initView(){ + vpSceneImage = mFloatLayout.findViewById(R.id.vpSceneImage) + ivSceneClose = mFloatLayout.findViewById(R.id.ivSceneClose) + ivScenePrevious = mFloatLayout.findViewById(R.id.ivScenePrevious) + ivSceneNext = mFloatLayout.findViewById(R.id.ivSceneNext) + } + + private fun initEvent(){ + vpSceneImage.adapter =takeOverSceneAdapter + //关闭弹窗 + ivSceneClose.setOnClickListener { + clickListener?.closeWindow() + hideFloatWindow() + } + //前一个场景 + ivScenePrevious.setOnClickListener { + if(currentIndex == 0){ + ToastUtils.showShort("没有上一个场景了") + }else{ + currentIndex = (currentIndex-1).coerceAtLeast(0) + vpSceneImage.currentItem = currentIndex + } + } + //后一个场景 + ivSceneNext.setOnClickListener { + if(currentIndex < 2){ + currentIndex = (currentIndex + 1).coerceAtMost(2) + vpSceneImage.currentItem = currentIndex + }else{ + ToastUtils.showShort("没有下一个场景了") + } + } + } + + @SuppressLint("SetTextI18n") + fun showFloatWindow(frontCameraUri: Uri, rearCameraUri: Uri, mapScreenUri: Uri, currentItem: Int) { + if (mFloatLayout.parent == null) { + val metrics = DisplayMetrics() + // 默认固定位置,靠屏幕右边缘的中间 + mWindowManager!!.defaultDisplay.getMetrics(metrics) + mWindowParams!!.x = 0 + mWindowParams!!.y = metrics.heightPixels - BarUtils.getStatusBarHeight() + mWindowManager!!.addView(mFloatLayout, mWindowParams) + takeOverSceneAdapter.setSceneUri(frontCameraUri, rearCameraUri, mapScreenUri) + currentIndex = currentItem + vpSceneImage.currentItem = currentItem + } + } + + fun hideFloatWindow() { + if (mFloatLayout.parent != null){ + mWindowManager!!.removeView(mFloatLayout) + } + } + + interface ClickListener{ + fun closeWindow() + } + + fun setClickListener(clickListener: ClickListener) { + this.clickListener = clickListener + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/adapter/TakeOverSceneAdapter.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/adapter/TakeOverSceneAdapter.kt new file mode 100644 index 0000000000..f02a37b97b --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/adapter/TakeOverSceneAdapter.kt @@ -0,0 +1,69 @@ +package com.zhjt.mogo_core_function_devatools.workorder.adapter + +import android.net.Uri +import android.os.Environment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.viewpager.widget.PagerAdapter +import com.mogo.eagle.core.utilcode.util.TimeUtils.getMdFormat +import com.mogo.eagle.core.utilcode.util.TimeUtils.millis2String +import com.zhjt.mogo_core_function_devatools.R +import java.io.File + + +class TakeOverSceneAdapter: PagerAdapter() { + + private lateinit var mFrontCameraUri: Uri + private lateinit var mRearCameraUri: Uri + private lateinit var mMapScreenUri: Uri + + fun setSceneUri(frontCameraUri: Uri,rearCameraUri: Uri,mapScreenUri: Uri){ + mFrontCameraUri = frontCameraUri + mRearCameraUri = rearCameraUri + mMapScreenUri = mapScreenUri + } + + // 获取要滑动的控件的数量 + override fun getCount(): Int { + return 3 + } + + // 来判断显示的是否是同一张图片,这里我们将两个参数相比较返回即可 + override fun isViewFromObject(view: View, `object`: Any): Boolean { + return view == `object` + } + + // 当要显示的图片可以进行缓存的时候,会调用这个方法进行显示图片的初始化, + // 我们将要显示的ImageView加入到ViewGroup中,然后作为返回值返回即可 + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val inflater = LayoutInflater.from(container.context) + val view = inflater.inflate(R.layout.layout_scene_pager,container,false) + val sceneName: TextView = view.findViewById(R.id.tvSceneName) + val ivSceneImage: ImageView = view.findViewById(R.id.ivSceneImage) + when (position) { + 0 -> { + sceneName.text = container.resources.getString(R.string.take_over_front_camera) + ivSceneImage.setImageURI(mFrontCameraUri) + } + 1 -> { + sceneName.text = container.resources.getString(R.string.take_over_rear_camera) + ivSceneImage.setImageURI(mRearCameraUri) + } + else -> { + sceneName.text = container.resources.getString(R.string.take_over_map_screen) + ivSceneImage.setImageURI(mMapScreenUri) + } + } + container.addView(view) + return view + } + + // PagerAdapter只缓存三张要显示的图片,如果滑动的图片超出了缓存的范围,就会调用这个方法,将图片销毁 + override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) { + container.removeView(`object` as View) + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_image_load_fail_large.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_image_load_fail_large.png new file mode 100644 index 0000000000..c16cb96922 Binary files /dev/null and b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_image_load_fail_large.png differ diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_image_load_fail_small.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_image_load_fail_small.png new file mode 100644 index 0000000000..c15097437d Binary files /dev/null and b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_image_load_fail_small.png differ diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_scene_close.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_scene_close.png new file mode 100644 index 0000000000..84513b5885 Binary files /dev/null and b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_scene_close.png differ diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_scene_left.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_scene_left.png new file mode 100644 index 0000000000..ad46b155c6 Binary files /dev/null and b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_scene_left.png differ diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_scene_right.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_scene_right.png new file mode 100644 index 0000000000..b9c0a12a09 Binary files /dev/null and b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_scene_right.png differ diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_scene_name.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_scene_name.xml new file mode 100644 index 0000000000..dd0222ad49 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_scene_name.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_take_over_image.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_take_over_image.xml new file mode 100644 index 0000000000..f5be4de350 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_take_over_image.xml @@ -0,0 +1,15 @@ + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_take_over_scene_image.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_take_over_scene_image.xml new file mode 100644 index 0000000000..b7852b035f --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_take_over_scene_image.xml @@ -0,0 +1,15 @@ + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/layout/item_fault_code.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/item_fault_code.xml new file mode 100644 index 0000000000..0939a9e9ca --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/item_fault_code.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/layout/layout_scene_pager.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/layout_scene_pager.xml new file mode 100644 index 0000000000..db695b0e2d --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/layout_scene_pager.xml @@ -0,0 +1,27 @@ + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/layout/view_take_over_reason.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/view_take_over_reason.xml index 2735fe0efb..c39a1da297 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/res/layout/view_take_over_reason.xml +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/view_take_over_reason.xml @@ -5,152 +5,273 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:background="@drawable/bg_take_over_reason"> - + - + - + - + - + + + + + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + - - - \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/layout/view_take_over_scene.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/view_take_over_scene.xml new file mode 100644 index 0000000000..b687b3f5f1 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/view_take_over_scene.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/values/strings.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/values/strings.xml index ba13a4df93..42e32d54ed 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/res/values/strings.xml +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/values/strings.xml @@ -66,6 +66,13 @@ (选填) 手动输入 补充描述语音输入 + 场景图像 + 前向120°摄像头 + 后向120°摄像头 + 高精地图截图 + 上一个场景 + 关闭场景 + 下一个场景 上报 保存 取消 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/AndroidManifest.xml b/core/function-impl/mogo-core-function-hmi/src/main/AndroidManifest.xml index f3f3138647..005c63a38c 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/AndroidManifest.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/AndroidManifest.xml @@ -59,7 +59,7 @@ android:hardwareAccelerated="true" android:launchMode="singleTask" android:resizeableActivity="false" - android:screenOrientation="landscape" + android:screenOrientation="locked" android:resumeWhilePausing="true" android:stateNotNeeded="true" android:theme="@style/Main" @@ -89,7 +89,7 @@ android:process=":passenger" android:resizeableActivity="false" android:resumeWhilePausing="true" - android:screenOrientation="landscape" + android:screenOrientation="locked" android:stateNotNeeded="true" android:theme="@style/Main" android:windowSoftInputMode="adjustPan|stateHidden"> diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/status/StartAutoPilotStatusView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/status/StartAutoPilotStatusView.kt index 551dfe6341..8fa7ff297c 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/status/StartAutoPilotStatusView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/status/StartAutoPilotStatusView.kt @@ -18,6 +18,7 @@ import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.utilcode.kotlin.onClick import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.Logger +import com.mogo.eagle.core.utilcode.util.SoundPoolUtils import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.zhjt.mogo_core_function_devatools.status.StatusManager import com.zhjt.mogo_core_function_devatools.status.entity.AcceleratorStatus @@ -30,6 +31,7 @@ import com.zhjt.mogo_core_function_devatools.status.entity.IAutopilotBeforeLaunc import com.zhjt.mogo_core_function_devatools.status.entity.Status import com.zhjt.mogo_core_function_devatools.status.entity.SteerStatus import kotlinx.android.synthetic.main.view_start_autopilot_status.view.fSMStatusLayout +import kotlinx.android.synthetic.main.view_start_autopilot_status.view.ivFsmDemoModeError import kotlinx.android.synthetic.main.view_start_autopilot_status.view.iv_accelerator import kotlinx.android.synthetic.main.view_start_autopilot_status.view.iv_brake import kotlinx.android.synthetic.main.view_start_autopilot_status.view.iv_double_flash @@ -68,7 +70,8 @@ class StartAutoPilotStatusView @JvmOverloads constructor( } private val hasFSM by lazy { AtomicBoolean(true) } - + //是否进行了语音提示(当开启美化模式后,若fsm输出自车处于安全停车状态中提示音提示一次) + private var isAlreadyPrompted: Boolean = false init { LayoutInflater.from(context).inflate(R.layout.view_start_autopilot_status, this, true) @@ -87,9 +90,11 @@ class StartAutoPilotStatusView @JvmOverloads constructor( CallerLogger.i(TAG, "changeStatusContainer 切换展示,hasFSM=$hasFSMModule") if (hasFSMModule) { fSMStatusLayout?.visibility = View.VISIBLE + ivFsmDemoModeError?.visibility = View.GONE withoutFSMStatusLayout?.visibility = View.GONE } else { fSMStatusLayout?.visibility = View.GONE + ivFsmDemoModeError?.visibility = View.GONE withoutFSMStatusLayout?.visibility = View.VISIBLE } } @@ -104,11 +109,6 @@ class StartAutoPilotStatusView @JvmOverloads constructor( } hasFSM.set(newHasFSM) - if (FunctionBuildConfig.isDemoMode && status.isException()) { - // 美化模式下如果是异常的,修改成正常的 - status.state = FSMStateCode.ExistNormal - } - when (status.state) { FSMStateCode.UnKnown -> { fSMStatusLayout?.setOnClickListener(null) @@ -118,6 +118,8 @@ class StartAutoPilotStatusView @JvmOverloads constructor( R.drawable.icon_fsm_status_bg_unknown ) ) + ivFsmDemoModeError?.visibility = View.GONE + isAlreadyPrompted = false } FSMStateCode.NotExist -> { @@ -128,6 +130,8 @@ class StartAutoPilotStatusView @JvmOverloads constructor( R.drawable.icon_fsm_status_bg_unknown ) ) + ivFsmDemoModeError?.visibility = View.GONE + isAlreadyPrompted = false } FSMStateCode.ExistNormal -> { @@ -138,18 +142,41 @@ class StartAutoPilotStatusView @JvmOverloads constructor( R.drawable.icon_fsm_status_bg_normal ) ) + ivFsmDemoModeError?.visibility = View.GONE + isAlreadyPrompted = false } FSMStateCode.ExistError -> { - fSMStatusLayout?.onClick { - CallerHmiManager.showFSMExceptionStatusWindow(status.descList) - } - fSMStatusLayout?.setImageDrawable( - ContextCompat.getDrawable( - context, - R.drawable.icon_fsm_status_bg_error + if(FunctionBuildConfig.isDemoMode){ + fSMStatusLayout?.setOnClickListener(null) + fSMStatusLayout?.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_fsm_status_bg_normal + ) ) - ) + ivFsmDemoModeError?.visibility = View.VISIBLE + if(!isAlreadyPrompted){ + try { + SoundPoolUtils.getSoundPool().playSoundWithRedId(context,R.raw.weak_net_tips) + }catch (e: Exception){ + e.printStackTrace() + } + isAlreadyPrompted = true + } + }else{ + fSMStatusLayout?.onClick { + CallerHmiManager.showFSMExceptionStatusWindow(status.descList) + } + fSMStatusLayout?.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_fsm_status_bg_error + ) + ) + ivFsmDemoModeError?.visibility = View.GONE + isAlreadyPrompted = false + } } } notifyStatus(status.isException()) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/CarInfoTabView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/CarInfoTabView.kt index 5bf3577a34..d039924888 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/CarInfoTabView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/CarInfoTabView.kt @@ -4,6 +4,7 @@ import android.content.Context import android.util.AttributeSet import android.util.Log import android.view.LayoutInflater +import android.view.View import androidx.constraintlayout.widget.ConstraintLayout import com.mogo.commons.debug.DebugConfig import com.mogo.commons.storage.SharedPrefsMgr @@ -14,6 +15,7 @@ import com.mogo.eagle.core.function.api.datacenter.IDataCenterBizListener import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsListener import com.mogo.eagle.core.function.api.devatools.IOTAListener import com.mogo.eagle.core.function.api.hmi.autopilot.IMoGoCheckAutoPilotBtnListener +import com.mogo.eagle.core.function.api.setting.IMapShowNameListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager @@ -24,6 +26,7 @@ import com.mogo.eagle.core.function.call.hmi.CallerHmiListenerManager import com.mogo.eagle.core.function.call.hmi.CallerHmiManager import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager import com.mogo.eagle.core.function.call.och.CallerOchCustomViewManager +import com.mogo.eagle.core.function.call.setting.CallerMapShowNameManager import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.function.hmi.ui.tools.OfflineMapDialog import com.mogo.eagle.core.function.hmi.ui.utils.HmiActionLog @@ -44,10 +47,12 @@ import kotlinx.android.synthetic.main.view_car_info_tab.view.tvADVersionName import kotlinx.android.synthetic.main.view_car_info_tab.view.tvCarExit import kotlinx.android.synthetic.main.view_car_info_tab.view.tvCarLoginInfo import kotlinx.android.synthetic.main.view_car_info_tab.view.tvCarNo +import kotlinx.android.synthetic.main.view_car_info_tab.view.tvGridMapVersion import kotlinx.android.synthetic.main.view_car_info_tab.view.tvHDMapUpdate import kotlinx.android.synthetic.main.view_car_info_tab.view.tvHDMapVersion import kotlinx.android.synthetic.main.view_car_info_tab.view.tvPADUpdate import kotlinx.android.synthetic.main.view_car_info_tab.view.tvPadVersion +import kotlinx.android.synthetic.main.view_car_info_tab.view.tvSlamMapVersion import kotlinx.android.synthetic.main.view_car_info_tab.view.tvSnInfo import system_master.SsmInfo import system_master.SystemStatusInfo @@ -65,7 +70,8 @@ class CarInfoTabView @JvmOverloads constructor( attrs: AttributeSet? = null, defStyleAttr: Int = 0 ) : ConstraintLayout(context, attrs, defStyleAttr), IMoGoCheckAutoPilotBtnListener, - IMoGoAutopilotStatusListener, IMoGoDevaToolsListener, IDataCenterBizListener, IOTAListener { + IMoGoAutopilotStatusListener, IMoGoDevaToolsListener, IDataCenterBizListener, IOTAListener, + IMapShowNameListener { companion object { private const val TAG = "CarInfoTabView" @@ -88,6 +94,7 @@ class CarInfoTabView @JvmOverloads constructor( CallerAutoPilotStatusListenerManager.addListener(TAG, this) CallerDevaToolsListenerManager.addListener(TAG, this) CallerDataCenterBizListener.addListener(TAG, this) + CallerMapShowNameManager.addListener(TAG, this) } override fun onDetachedFromWindow() { @@ -96,6 +103,7 @@ class CarInfoTabView @JvmOverloads constructor( CallerAutoPilotStatusListenerManager.removeListener(TAG) CallerDevaToolsListenerManager.removeListener(TAG) CallerDataCenterBizListener.removeListener(TAG) + CallerMapShowNameManager.removeListener(TAG) } private fun initView() { @@ -108,6 +116,8 @@ class CarInfoTabView @JvmOverloads constructor( showCurrentPadVersion() showCurrentAdVersion() updateAdHdMapVersion() + updateGridMapVersion() + updateSlamMapVersion() tvSnInfo.text = SharedPrefsMgr.getInstance().sn tvCarExit.setOnClickListener { @@ -143,7 +153,7 @@ class CarInfoTabView @JvmOverloads constructor( OTAUpgradeConfig.promptedUpgrade.remove(OTAUpgradeConfig.otaToken) CallerAutoPilotControlManager.sendSsmFuncOtaStatusQuery(OTAUpgradeConfig.otaToken) }else{ - ToastUtils.showLong("当前域控版本不支持OTA升级") + ToastUtils.showLong("当前SSM节点未成功启动或当前版本不支持OTA升级") } } tvHDMapVersion.text = tvHDMapVersion.text.toString() + DebugConfig.getMapVersion() @@ -243,8 +253,12 @@ class CarInfoTabView @JvmOverloads constructor( private fun showCurrentAdVersion() { UiThreadHandler.post { - CallerAutoPilotStatusListenerManager.getDockerVersion()?.let { - tvADVersionName.text = it + if(AppConfigInfo.mapShowName.isNotEmpty()){ + tvADVersionName.text = AppConfigInfo.mapShowName + }else{ + CallerAutoPilotStatusListenerManager.getDockerVersion()?.let { + tvADVersionName.text = it + } } } } @@ -254,21 +268,66 @@ class CarInfoTabView @JvmOverloads constructor( showCurrentAdVersion() } + /** + * 更新域控高精地图版本 + */ private fun updateAdHdMapVersion() { if (AppConfigInfo.adHdMapVersion.isNotEmpty()) { UiThreadHandler.post { - CallerLogger.i(SceneConstant.M_HMI + TAG, "updateAdHdMapVersion, adHdMapVersion:${AppConfigInfo.adHdMapVersion} , text:${tvADMapVersion.text}") if(tvADMapVersion.text.contains(AppConfigInfo.adHdMapVersion)){ return@post } + CallerLogger.i(SceneConstant.M_HMI + TAG, "updateAdHdMapVersion, adHdMapVersion:${AppConfigInfo.adHdMapVersion} , text:${tvADMapVersion.text}") tvADMapVersion.text = context.getString(R.string.tab_version_admap_info) + AppConfigInfo.adHdMapVersion } } } + /** + * 更新工控机栅格地图版本 + */ + private fun updateGridMapVersion(){ + if(AppConfigInfo.gridMapVersion.isNotEmpty()){ + UiThreadHandler.post{ + if(tvGridMapVersion.text.contains(AppConfigInfo.gridMapVersion)){ + return@post + } + CallerLogger.i(SceneConstant.M_HMI + TAG, "updateGridMapVersion, gridMapVersion:${AppConfigInfo.gridMapVersion}") + tvGridMapVersion.text = context.getString(R.string.tab_version_grid_map_info) + AppConfigInfo.gridMapVersion + tvGridMapVersion.visibility = View.VISIBLE + } + }else{ + UiThreadHandler.post{ + tvGridMapVersion.visibility = View.GONE + } + } + } + + /** + * 更新工控机激光Slam地图版本 + */ + private fun updateSlamMapVersion(){ + if(AppConfigInfo.slamMapVersion.isNotEmpty()){ + UiThreadHandler.post{ + if(tvSlamMapVersion.text.contains(AppConfigInfo.slamMapVersion)){ + return@post + } + CallerLogger.i(SceneConstant.M_HMI + TAG, "updateSlamMapVersion, slamMapVersion:${AppConfigInfo.slamMapVersion}") + tvSlamMapVersion.text = context.getString(R.string.tab_version_slam_map_info) + AppConfigInfo.slamMapVersion + tvSlamMapVersion.visibility = View.VISIBLE + } + }else{ + UiThreadHandler.post{ + tvSlamMapVersion.visibility = View.GONE + } + } + } + override fun onAutopilotStatusRespByQuery(status: SystemStatusInfo.StatusInfo) { CallerLogger.i(SceneConstant.M_HMI + TAG, "hdMapVer=" + status.hdMapVer) updateAdHdMapVersion() + updateGridMapVersion() + updateSlamMapVersion() } /** @@ -280,6 +339,8 @@ class CarInfoTabView @JvmOverloads constructor( override fun onSystemStatus(statusInf: SsmInfo.SsmStatusInf) { CallerLogger.i(SceneConstant.M_HMI + TAG, "hdMapVer=" + statusInf.hdMapVer) updateAdHdMapVersion() + updateGridMapVersion() + updateSlamMapVersion() } /** @@ -304,4 +365,9 @@ class CarInfoTabView @JvmOverloads constructor( } } + override fun changeMapShowName(showName: String) { + super.changeMapShowName(showName) + showCurrentAdVersion() + } + } \ 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/bone/toolkit/custom/ToolRestartSystemView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/toolkit/custom/ToolRestartSystemView.kt index 5eac10a8d1..6fd17e6b59 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/toolkit/custom/ToolRestartSystemView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/toolkit/custom/ToolRestartSystemView.kt @@ -7,6 +7,7 @@ import androidx.constraintlayout.widget.ConstraintLayout import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager +import com.mogo.eagle.core.function.call.hmi.CallerHmiManager import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.function.hmi.ui.tools.DockerRebootDialog import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger @@ -63,6 +64,8 @@ class ToolRestartSystemView @JvmOverloads constructor( CallerLogger.d("$M_HMI$TAG", "reboot confirm") CallerAutoPilotControlManager.sendIpcReboot() ToastUtils.showLong("重启命令已发送") + //打开冷启动页面 + CallerHmiManager.showColdStartWindow() } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/map/MapContainerLayout.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/map/MapContainerLayout.kt index 1911e2d39a..65396284c0 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/map/MapContainerLayout.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/map/MapContainerLayout.kt @@ -25,7 +25,7 @@ import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.mogo.view.OnPreventFastClickListener import com.mogo.map.listener.IMogoMapListener import com.mogo.map.listener.MogoMapListenerHandler -import kotlinx.android.synthetic.main.view_map_container.view.mapBizView +import kotlinx.android.synthetic.main.view_map_container.view.mHomeView import kotlinx.android.synthetic.main.view_map_container.view.overMapView import kotlinx.android.synthetic.main.view_map_container.view.shadowView import kotlinx.android.synthetic.main.view_map_container.view.visualAngleToggle @@ -63,30 +63,30 @@ class MapContainerLayout @JvmOverloads constructor( } fun onCreate(savedInstanceState: Bundle?) { - mapBizView.onCreate(savedInstanceState) + mHomeView.onCreate(savedInstanceState) overMapView.onCreateView(savedInstanceState) } fun onResume() { - mapBizView.onResume() + mHomeView.onResume() overMapView.onResume() } fun onPause() { - mapBizView.onPause() + mHomeView.onPause() overMapView.onPause() } fun onLowMemory() { - mapBizView.onLowMemory() + mHomeView.onLowMemory() } fun onSaveInstanceState(outState: Bundle) { - mapBizView.onSaveInstanceState(outState) + mHomeView.onSaveInstanceState(outState) } fun onDestroy() { - mapBizView.onDestroy() + mHomeView.onDestroy() overMapView.onDestroy() } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiProvider.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiProvider.kt index 0b9d7fb0d0..ba66a8430a 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiProvider.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiProvider.kt @@ -48,6 +48,9 @@ import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.function.hmi.bone.status.fsm.FSMStatusDetailWindowManager import com.mogo.eagle.core.function.hmi.bone.toolkit.ToolKitDataManager import com.mogo.eagle.core.function.hmi.ui.camera.RoadVideoDialog +import com.mogo.eagle.core.function.hmi.ui.diskcopy.CopyBagSuccessDialog +import com.mogo.eagle.core.function.hmi.ui.diskcopy.DiskCopyExceptionDialog +import com.mogo.eagle.core.function.hmi.ui.diskcopy.TerminateCopyDataDialog import com.mogo.eagle.core.function.hmi.ui.lookaround.M1LookAroundView import com.mogo.eagle.core.function.hmi.ui.notice.DispatchDialogManager import com.mogo.eagle.core.function.hmi.ui.notice.NoticeCheckDialog @@ -733,4 +736,40 @@ class MoGoHmiProvider : IMoGoHmiProvider { } } + /** + * 展示数据落盘拷贝成功对话框 + */ + override fun showCopyBagSuccessDialog(title: String,content: String) { + ThreadUtils.runOnUiThread{ + context?.let{ + val copyBagSuccessDialog = CopyBagSuccessDialog(it,title, content) + copyBagSuccessDialog.show() + } + } + } + + /** + * 展示数据落盘辅助工具-异常情况及建议操作弹窗 + */ + override fun showDiskCopyExceptionDialog(title: String,content: String) { + ThreadUtils.runOnUiThread{ + context?.let{ + val diskCopyExceptionDialog = DiskCopyExceptionDialog(it, title, content) + diskCopyExceptionDialog.show() + } + } + } + + /** + * 展示数据落盘-终止数据拷贝确认弹窗 + */ + override fun showTerminateCopyDataDialog() { + ThreadUtils.runOnUiThread{ + context?.let{ + val terminateCopyDataDialog = TerminateCopyDataDialog(it) + terminateCopyDataDialog.show() + } + } + } + } \ 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/diskcopy/CopyBagSuccessDialog.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/diskcopy/CopyBagSuccessDialog.kt new file mode 100644 index 0000000000..da2277a672 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/diskcopy/CopyBagSuccessDialog.kt @@ -0,0 +1,45 @@ +package com.mogo.eagle.core.function.hmi.ui.diskcopy + +import android.content.Context +import androidx.lifecycle.LifecycleObserver +import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.function.hmi.dialog.BaseFloatDialog +import kotlinx.android.synthetic.main.dialog_copy_bag_success.tvCopyBagSuccessClose +import kotlinx.android.synthetic.main.dialog_copy_bag_success.tvCopyBagSuccessContent +import kotlinx.android.synthetic.main.dialog_copy_bag_success.tvCopyBagSuccessTitle + +/** + * 数据落盘拷贝成功对话框 + */ +class CopyBagSuccessDialog(context: Context,private val title: String,private val content: String) : + BaseFloatDialog(context,TAG), LifecycleObserver { + + companion object { + private const val TAG = "CopyBagSuccessDialog" + } + + init{ + setContentView(R.layout.dialog_copy_bag_success) + setCanceledOnTouchOutside(false) + initView() + } + + private fun initView(){ + tvCopyBagSuccessTitle.text = title + tvCopyBagSuccessContent.text = content + tvCopyBagSuccessClose.setOnClickListener { + dismiss() + } + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + + } + +} \ 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/diskcopy/DiskCopyExceptionDialog.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/diskcopy/DiskCopyExceptionDialog.kt new file mode 100644 index 0000000000..0771cf5be0 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/diskcopy/DiskCopyExceptionDialog.kt @@ -0,0 +1,46 @@ +package com.mogo.eagle.core.function.hmi.ui.diskcopy + +import android.content.Context +import androidx.lifecycle.LifecycleObserver +import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.function.hmi.dialog.BaseFloatDialog +import kotlinx.android.synthetic.main.dialog_disk_copy_exception.tvCopyExceptionClose +import kotlinx.android.synthetic.main.dialog_disk_copy_exception.tvCopyExceptionContent +import kotlinx.android.synthetic.main.dialog_disk_copy_exception.tvCopyExceptionTitle + +/** + * 数据落盘辅助工具-异常情况及建议操作弹窗 + */ +class DiskCopyExceptionDialog(context: Context,private var title: String,private var content: String) : + BaseFloatDialog(context,TAG), LifecycleObserver { + + companion object { + private const val TAG = "DiskCopyExceptionDialog" + } + + init{ + setContentView(R.layout.dialog_disk_copy_exception) + setCanceledOnTouchOutside(false) + initView() + } + + private fun initView(){ + tvCopyExceptionTitle.text = title + tvCopyExceptionContent.text = content + //关闭异常弹窗 + tvCopyExceptionClose.setOnClickListener { + dismiss() + } + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + + } + +} \ 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/diskcopy/DiskCopyView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/diskcopy/DiskCopyView.kt new file mode 100644 index 0000000000..2909847e64 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/diskcopy/DiskCopyView.kt @@ -0,0 +1,574 @@ +package com.mogo.eagle.core.function.hmi.ui.diskcopy + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.GridLayoutManager +import com.mogo.eagle.core.data.deva.diskcopy.CopyCalendarInfo +import com.mogo.eagle.core.function.api.devatools.IDiskCopyListener +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager +import com.mogo.eagle.core.function.call.devatools.CallerDiskCopyManager +import com.mogo.eagle.core.function.call.hmi.CallerHmiManager +import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.function.hmi.ui.diskcopy.adapter.DiskCopyCalendarAdapter +import com.mogo.eagle.core.utilcode.mogo.logger.Logger +import com.mogo.eagle.core.utilcode.util.ClickUtils +import com.mogo.eagle.core.utilcode.util.ThreadUtils +import com.mogo.eagle.core.utilcode.util.ToastUtils +import kotlinx.android.synthetic.main.view_disk_copy.view.groupDateSelect +import kotlinx.android.synthetic.main.view_disk_copy.view.groupDiskCopy +import kotlinx.android.synthetic.main.view_disk_copy.view.ivDiskUnplug +import kotlinx.android.synthetic.main.view_disk_copy.view.pbDiskCopyProgress +import kotlinx.android.synthetic.main.view_disk_copy.view.pbDiskUsedSpaces +import kotlinx.android.synthetic.main.view_disk_copy.view.rvCalendar +import kotlinx.android.synthetic.main.view_disk_copy.view.tvCopyStatus +import kotlinx.android.synthetic.main.view_disk_copy.view.tvCurrentDate +import kotlinx.android.synthetic.main.view_disk_copy.view.tvCurrentMonth +import kotlinx.android.synthetic.main.view_disk_copy.view.tvCurrentWeek +import kotlinx.android.synthetic.main.view_disk_copy.view.tvDiskFreeSpace +import kotlinx.android.synthetic.main.view_disk_copy.view.tvDiskUsedPercent +import kotlinx.android.synthetic.main.view_disk_copy.view.viewDiskCopyDate +import packet_mytest_upload.CopyBag +import java.lang.Exception +import java.text.SimpleDateFormat +import java.util.Calendar +import java.util.Locale +import java.util.TimeZone + +/** + * 数据落盘辅助工具 + */ +class DiskCopyView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : ConstraintLayout(context, attrs, defStyleAttr), IDiskCopyListener { + + companion object { + const val TAG = "DiskCopyView" + } + + private var diskCopyCalendarAdapter: DiskCopyCalendarAdapter ?= null + private var calendarList: ArrayList = ArrayList() + //当前拷贝日期 + private var currentCopyDate: Int = 0 + //当前拷贝状态 0:默认状态;1:开始拷贝数据;2:拷贝中;3:拷贝成功;4:剩余空间不足;5:所选日期无法拷贝 + private var copyStatus: Int = 0 + + init{ + LayoutInflater.from(context).inflate(R.layout.view_disk_copy, this, true) + initView() + initData() + } + + private fun initView(){ + val gridLayoutManager = GridLayoutManager(context,7) + diskCopyCalendarAdapter = DiskCopyCalendarAdapter(context) + diskCopyCalendarAdapter?.setDateSelectListener(object: DiskCopyCalendarAdapter.DateSelectListener{ + override fun onDateSelect(info: CopyCalendarInfo) { + //切换页面隐藏日历显示,切换为硬盘接入页面 + pbDiskCopyProgress.visibility = View.GONE + groupDiskCopy.visibility = View.VISIBLE + groupDateSelect.visibility = View.GONE + //显示选择日期 + tvCurrentDate.text = info.uiDateFormat + tvCurrentWeek.text = parseWeekDescribe(info.currentDayOfWeek) + if(info.canCopy){ + //开始拷贝数据 + copyStatus = 1 + currentCopyDate = info.ipcDateFormat.toInt() + notifyCopyStatusDisplay(copyStatus) + }else{ + //所选日期无法拷贝 + copyStatus = 5 + notifyCopyStatusDisplay(copyStatus) + } + } + }) + rvCalendar.adapter = diskCopyCalendarAdapter + rvCalendar.layoutManager = gridLayoutManager + //拷贝状态 + tvCopyStatus.setOnClickListener { + if(ClickUtils.isFastClick()){ + when (copyStatus) { + 1 -> { + //开始拷贝数据 + val result = CallerAutoPilotControlManager.sendCopyBagCopyDate(currentCopyDate) + if(result){ + ToastUtils.showShort("已发起拷贝") + }else{ + ToastUtils.showShort("拷贝命令发送失败") + } + } + 2 -> { + //拷贝中 + ToastUtils.showShort("正在拷贝中...") + } + 3 -> { + //拷贝成功 + ToastUtils.showShort("当前日期数据已拷贝成功") + } + 4 -> { + //剩余空间不足 + ToastUtils.showShort("当前硬盘剩余空间不足") + } + 5 -> { + //所选日期无法拷贝 + ToastUtils.showShort("所选日期无法拷贝") + } + } + }else{ + ToastUtils.showShort("请勿连续点击,稍后再试") + } + } + //拔出硬盘 + ivDiskUnplug.setOnClickListener { + if(ClickUtils.isFastClick()){ + if(copyStatus == 2){ + //如果处于拷贝中,弹出终止数据拷贝确认提示窗 + CallerHmiManager.showTerminateCopyDataDialog() + }else{ + //如果处于未拷贝状态,则调用硬盘安全弹出请求 + val result = CallerAutoPilotControlManager.sendCopyBagSafeUnmount() + if(result){ + ToastUtils.showShort("硬盘安全弹出命令已发送") + }else{ + ToastUtils.showShort("硬盘安全弹出命令发送失败") + } + } + }else{ + ToastUtils.showShort("请勿连续点击,稍后再试") + } + } + + //数据日期 + viewDiskCopyDate.setOnClickListener { + if(copyStatus == 2){ + //数据拷贝中,不可再选择日期 + ToastUtils.showShort("数据拷贝中,不可再次选择日期,请耐心等待") + }else{ + //隐藏当前视图 + pbDiskCopyProgress.visibility = View.GONE + groupDiskCopy.visibility = View.GONE + //展示日历 + groupDateSelect.visibility = View.VISIBLE + } + } + } + + private fun initData(){ + val formatIpc = SimpleDateFormat("yyyyMMdd", Locale.CHINA) + val formatUi = SimpleDateFormat("yyyy.MM.dd",Locale.CHINA) + //添加日历星期标题头 + calendarList.add(CopyCalendarInfo(true,"日")) + calendarList.add(CopyCalendarInfo(true,"一")) + calendarList.add(CopyCalendarInfo(true,"二")) + calendarList.add(CopyCalendarInfo(true,"三")) + calendarList.add(CopyCalendarInfo(true,"四")) + calendarList.add(CopyCalendarInfo(true,"五")) + calendarList.add(CopyCalendarInfo(true,"六")) + + val calendar: Calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+8")) + val currentMonth = calendar.get(Calendar.MONTH) + tvCurrentMonth.text = when(currentMonth){ + Calendar.JANUARY->{ + "一月" + } + Calendar.FEBRUARY->{ + "二月" + } + Calendar.MARCH->{ + "三月" + } + Calendar.APRIL->{ + "四月" + } + Calendar.MAY->{ + "五月" + } + Calendar.JUNE->{ + "六月" + } + Calendar.JULY->{ + "七月" + } + Calendar.AUGUST->{ + "八月" + } + Calendar.SEPTEMBER->{ + "九月" + } + Calendar.OCTOBER->{ + "十月" + } + Calendar.NOVEMBER->{ + "十一月" + } + Calendar.DECEMBER->{ + "十二月" + } + else -> { + "" + } + } + val today = calendar.get(Calendar.DAY_OF_MONTH) + val todayOfIpc = formatIpc.format(calendar.time) + val todayOfUi = formatUi.format(calendar.time) + val todayOfWeek = calendar.get(Calendar.DAY_OF_WEEK) + calendar.add(Calendar.DAY_OF_MONTH,-1) + val yesterday = calendar.get(Calendar.DAY_OF_MONTH) + val yesterdayOfIpc = formatIpc.format(calendar.time) + val yesterdayOfUi = formatUi.format(calendar.time) + val yesterdayOfWeek = calendar.get(Calendar.DAY_OF_WEEK) + calendar.add(Calendar.DAY_OF_MONTH,-1) + val twoDaysAgo = calendar.get(Calendar.DAY_OF_MONTH) + val twoDaysAgoOfIpc = formatIpc.format(calendar.time) + val twoDaysAgoOfUi = formatUi.format(calendar.time) + val twoDaysAgoOfWeek = calendar.get(Calendar.DAY_OF_WEEK) + calendar.add(Calendar.DAY_OF_MONTH,-1) + val threeDaysAgo = calendar.get(Calendar.DAY_OF_MONTH) + val threeDaysAgoOfIpc = formatIpc.format(calendar.time) + val threeDaysAgoOfUi = formatUi.format(calendar.time) + val threeDaysAgoOfWeek = calendar.get(Calendar.DAY_OF_WEEK) + calendar.add(Calendar.DAY_OF_MONTH,-1) + val fourDaysAgo = calendar.get(Calendar.DAY_OF_MONTH) + val fourDaysAgoOfIpc = formatIpc.format(calendar.time) + val fourDaysAgoOfUi = formatUi.format(calendar.time) + val fourDaysAgoOfWeek = calendar.get(Calendar.DAY_OF_WEEK) + calendar.add(Calendar.DAY_OF_MONTH,-1) + val fiveDaysAgo = calendar.get(Calendar.DAY_OF_MONTH) + val fiveDaysAgoOfIpc = formatIpc.format(calendar.time) + val fiveDaysAgoOfUi = formatUi.format(calendar.time) + val fiveDaysAgoOfWeek = calendar.get(Calendar.DAY_OF_WEEK) + calendar.add(Calendar.DAY_OF_MONTH,-1) + val sixDaysAgo = calendar.get(Calendar.DAY_OF_MONTH) + val sixDaysAgoOfIpc = formatIpc.format(calendar.time) + val sixDaysAgoOfUi = formatUi.format(calendar.time) + val sixDaysAgoOfWeek = calendar.get(Calendar.DAY_OF_WEEK) + //根据判断六天前是几增加空格占位 + when(calendar.get(Calendar.DAY_OF_WEEK)){ + //星期日 + Calendar.SUNDAY->{ + + } + //星期一 + Calendar.MONDAY->{ + calendarList.add(CopyCalendarInfo(false,"")) + } + //星期二 + Calendar.TUESDAY->{ + calendarList.add(CopyCalendarInfo(false,"")) + calendarList.add(CopyCalendarInfo(false,"")) + } + //星期三 + Calendar.WEDNESDAY->{ + calendarList.add(CopyCalendarInfo(false,"")) + calendarList.add(CopyCalendarInfo(false,"")) + calendarList.add(CopyCalendarInfo(false,"")) + } + //星期四 + Calendar.THURSDAY->{ + calendarList.add(CopyCalendarInfo(false,"")) + calendarList.add(CopyCalendarInfo(false,"")) + calendarList.add(CopyCalendarInfo(false,"")) + calendarList.add(CopyCalendarInfo(false,"")) + } + //星期五 + Calendar.FRIDAY->{ + calendarList.add(CopyCalendarInfo(false,"")) + calendarList.add(CopyCalendarInfo(false,"")) + calendarList.add(CopyCalendarInfo(false,"")) + calendarList.add(CopyCalendarInfo(false,"")) + calendarList.add(CopyCalendarInfo(false,"")) + } + //星期六 + Calendar.SATURDAY->{ + calendarList.add(CopyCalendarInfo(false,"")) + calendarList.add(CopyCalendarInfo(false,"")) + calendarList.add(CopyCalendarInfo(false,"")) + calendarList.add(CopyCalendarInfo(false,"")) + calendarList.add(CopyCalendarInfo(false,"")) + calendarList.add(CopyCalendarInfo(false,"")) + } + else->{ + + } + } + + calendarList.add(CopyCalendarInfo(false,sixDaysAgo.toString(),sixDaysAgoOfIpc,sixDaysAgoOfUi,sixDaysAgoOfWeek)) + calendarList.add(CopyCalendarInfo(false,fiveDaysAgo.toString(),fiveDaysAgoOfIpc,fiveDaysAgoOfUi,fiveDaysAgoOfWeek)) + calendarList.add(CopyCalendarInfo(false,fourDaysAgo.toString(),fourDaysAgoOfIpc,fourDaysAgoOfUi,fourDaysAgoOfWeek)) + calendarList.add(CopyCalendarInfo(false,threeDaysAgo.toString(),threeDaysAgoOfIpc,threeDaysAgoOfUi,threeDaysAgoOfWeek)) + calendarList.add(CopyCalendarInfo(false,twoDaysAgo.toString(),twoDaysAgoOfIpc,twoDaysAgoOfUi,twoDaysAgoOfWeek)) + calendarList.add(CopyCalendarInfo(false,yesterday.toString(),yesterdayOfIpc,yesterdayOfUi,yesterdayOfWeek)) + calendarList.add(CopyCalendarInfo(false,today.toString(),todayOfIpc,todayOfUi,todayOfWeek, isSelected = true)) + diskCopyCalendarAdapter?.setData(calendarList) + //展示当天日期 + tvCurrentDate.text = todayOfUi + tvCurrentWeek.text = parseWeekDescribe(todayOfWeek) + try { + currentCopyDate = todayOfIpc.toInt() + }catch (e: Exception){ + Logger.i(TAG,"日期转换异常:$e") + } + } + + /** + * 刷新当前拔出硬盘图标显示状态 + */ + private fun notifyCopyStatusDisplay(copyStatus: Int,copyProgress: Int = 0){ + if(copyStatus == 2){ + //拷贝中,显示黄色图标 + ivDiskUnplug.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_disk_unplug_copying + )) + }else{ + //显示蓝色图标 + ivDiskUnplug.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_disk_unplug_connected + )) + } + when(copyStatus){ + //默认状态 + 0->{ + tvCopyStatus.text = "" + } + //开始拷贝数据 + 1->{ + tvCopyStatus.text = resources.getString(R.string.copy_bag_start) + tvCopyStatus.setTextColor(context.getColor(R.color.color_copy_bag_start)) + } + //拷贝中 + 2->{ + //配合进度条展示,最小拷贝进度显示1% + if(copyProgress == 0){ + tvCopyStatus.text = String.format(resources.getString(R.string.disk_copy_progress),1) + }else{ + tvCopyStatus.text = String.format(resources.getString(R.string.disk_copy_progress),copyProgress) + } + tvCopyStatus.setTextColor(context.getColor(R.color.color_disk_copy_progress)) + } + //拷贝成功 + 3->{ + tvCopyStatus.text = resources.getString(R.string.copy_bag_success) + tvCopyStatus.setTextColor(context.getColor(R.color.color_copy_bag_success)) + //隐藏拷贝进度条 + pbDiskCopyProgress.visibility = View.GONE + } + //剩余空间不足 + 4->{ + tvCopyStatus.text = resources.getString(R.string.disk_not_enough_space) + tvCopyStatus.setTextColor(context.getColor(R.color.color_disk_not_enough_space)) + } + //所选日期无法拷贝 + 5->{ + tvCopyStatus.text = resources.getString(R.string.date_cannot_copy) + tvCopyStatus.setTextColor(context.getColor(R.color.color_date_cannot_copy)) + } + } + + } + + private fun parseWeekDescribe(currentWeek: Int?): String{ + return when(currentWeek){ + //星期日 + Calendar.SUNDAY->{ + "周日" + } + //星期一 + Calendar.MONDAY->{ + "周一" + } + //星期二 + Calendar.TUESDAY->{ + "周二" + } + //星期三 + Calendar.WEDNESDAY->{ + "周三" + } + //星期四 + Calendar.THURSDAY->{ + "周四" + } + //星期五 + Calendar.FRIDAY->{ + "周五" + } + //星期六 + Calendar.SATURDAY->{ + "周六" + } + else->{ + "" + } + + } + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + CallerDiskCopyManager.addListener(TAG, this) + //硬盘挂载状态查询 + CallerAutoPilotControlManager.sendCopyBagDiskStatus() + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + CallerDiskCopyManager.removeListener(TAG) + } + + /** + * 数据落盘拷贝信息回调 + */ + override fun onCopyBag(diskCopy: CopyBag.DiskCopy) { + super.onCopyBag(diskCopy) + ThreadUtils.runOnUiThread { + //挂载状态 + Logger.i(TAG,"diskCopy.status="+diskCopy.status) + when(diskCopy.status){ + //挂载成功 + 0->{ + //显示数据落盘辅助工具视图 + this@DiskCopyView.visibility = View.VISIBLE + } + //挂载异常 + 1->{ + //隐藏数据落盘辅助工具视图 + this@DiskCopyView.visibility = View.GONE + } + //未挂载 + 2->{ + //隐藏数据落盘辅助工具视图 + this@DiskCopyView.visibility = View.GONE + } + } + //挂载成功的信息集合 + Logger.i(TAG,"磁盘总空间="+diskCopy.mountSuccess.totalSize) + Logger.i(TAG,"磁盘剩余空间="+diskCopy.mountSuccess.diskFree) + //磁盘剩余空间显示 + tvDiskFreeSpace.text = String.format(resources.getString(R.string.disk_free_space),diskCopy.mountSuccess.diskFree) + if(diskCopy.mountSuccess.totalSize > 0){ + val diskUsedPercent = ((diskCopy.mountSuccess.totalSize-diskCopy.mountSuccess.diskFree)*100/diskCopy.mountSuccess.totalSize).toInt() + //磁盘已用空间百分比文字显示 + tvDiskUsedPercent.text = String.format(resources.getString(R.string.disk_used_percent),diskUsedPercent) + //磁盘已用空间百分比进度条 + pbDiskUsedSpaces.progress = diskUsedPercent + } + Logger.i(TAG,"可拷贝日期数量="+diskCopy.mountSuccess.datesCount) + diskCopy.mountSuccess.datesList.forEach { + Logger.i(TAG, "可拷贝日期=$it") + } + calendarList.forEach { + if(!it.isTitle && it.ipcDateFormat.isNotEmpty()){ + if(diskCopy.mountSuccess.datesList.contains(it.ipcDateFormat)){ + it.canCopy = true + } + } + } + diskCopyCalendarAdapter?.setData(calendarList) + //挂载异常: 移动硬盘挂载失败,请重插或更换硬盘 + Logger.i(TAG,"挂载异常="+diskCopy.mountError) + if(diskCopy.mountError.isNotEmpty()){ + CallerHmiManager.showDiskCopyExceptionDialog("数据拷贝工具异常",diskCopy.mountError) + } + //需要拷贝的文件总大小 + Logger.i(TAG,"需要拷贝的文件总大小="+diskCopy.copyTotalSize) + //已拷贝大小 + Logger.i(TAG,"已拷贝大小="+diskCopy.copiedSize) + if(diskCopy.copyTotalSize == 0L){ + //隐藏拷贝进度条 + pbDiskCopyProgress.visibility = View.GONE + //判断当前日期是否有可拷贝数据,有可拷贝数据显示“开始拷贝数据”否则显示“所选日期无法拷贝” + copyStatus = if(diskCopy.mountSuccess.datesList.contains(currentCopyDate.toString())){ + 1 + }else{ + 5 + } + notifyCopyStatusDisplay(copyStatus) + }else{ + //展示拷贝进度条,并且展示进度 + pbDiskCopyProgress.visibility = View.VISIBLE + val copyProgress = (diskCopy.copiedSize*100/diskCopy.copyTotalSize).toInt() + if(copyProgress < 95){ + pbDiskCopyProgress.progressDrawable = ContextCompat.getDrawable( + context, + R.drawable.progressbar_disk_copy_progress + ) + }else{ + pbDiskCopyProgress.progressDrawable = ContextCompat.getDrawable( + context, + R.drawable.progressbar_disk_copy_progress_end + ) + } + if(copyProgress < 4){ + pbDiskCopyProgress.progress = 4 + }else{ + pbDiskCopyProgress.progress = copyProgress + } + //拷贝状态控件显示当前拷贝进度 + copyStatus = 2 + notifyCopyStatusDisplay(copyStatus,copyProgress) + } + //拷贝剩余时间 + Logger.i(TAG,"拷贝剩余时间="+diskCopy.freeTime) + //拷贝是否成功,是-True,否-False + Logger.i(TAG,"拷贝是否成功,是-True,否-False="+diskCopy.copyStatus) + Logger.i(TAG,"磁盘空间不足提示: 移动硬盘剩余空间不足,建议更换硬盘="+diskCopy.mountSuccess.tips) + if(diskCopy.mountSuccess.tips.isNotEmpty()){ + //如果磁盘空间不足字段不为空(默认设置的不足100G会提示空间不足,如果收到拷贝开始时会再检查本次拷贝总大小和剩余空间,如果剩余空间不满足本次拷贝也会提示不足) + //则更换磁盘空间进度条展示样式,并且进行弹窗提示 + pbDiskUsedSpaces.progressDrawable = ContextCompat.getDrawable( + context, + R.drawable.progressbar_disk_not_enough_space + ) + //数据拷贝工具异常 + CallerHmiManager.showDiskCopyExceptionDialog("数据拷贝工具异常",diskCopy.mountSuccess.tips) + copyStatus = 4 + notifyCopyStatusDisplay(copyStatus) + }else{ + pbDiskUsedSpaces.progressDrawable = ContextCompat.getDrawable( + context, + R.drawable.progressbar_disk_used_space + ) + } + if(diskCopy.copyStatus){ + //将当前拷贝状态置为拷贝成功 + copyStatus = 3 + notifyCopyStatusDisplay(copyStatus) + CallerHmiManager.showCopyBagSuccessDialog("数据拷贝完成",diskCopy.successInfo) + } + //拷贝异常提示,如域控间连接超时拷贝失败,建议查看各域控是否在线,不在线请重启车辆再试 + Logger.i(TAG,"拷贝异常提示="+diskCopy.copyErr) + if(diskCopy.copyErr.isNotEmpty()){ + //拷贝异常 + CallerHmiManager.showDiskCopyExceptionDialog("数据拷贝工具异常",diskCopy.copyErr) + } + //即将中止数据拷贝并安全弹出硬盘,是否继续操作? + Logger.i(TAG,"即将中止数据拷贝并安全弹出硬盘,是否继续操作?="+diskCopy.abortData) + //硬盘是否已安全弹出,是-True,否-False + Logger.i(TAG,"硬盘是否已安全弹出,是-True,否-False="+diskCopy.diskUnmount) + if(diskCopy.diskUnmount){ + ToastUtils.showShort("硬盘已安全弹出") + //隐藏数据落盘辅助工具视图 + this@DiskCopyView.visibility = View.GONE + } + //硬盘弹出失败提示:安全弹出失败,建议车辆下电后拔走硬盘 + Logger.i(TAG,"硬盘弹出失败提示="+diskCopy.unmountErr) + if(diskCopy.unmountErr.isNotEmpty()){ + //硬盘安全弹出异常 + CallerHmiManager.showDiskCopyExceptionDialog("硬盘安全弹出异常",diskCopy.unmountErr) + } + //拷贝成功的信息提示,如当前车辆拷贝的各类型的包各有多少个 + Logger.i(TAG,"拷贝成功的信息提示="+diskCopy.successInfo) + } + } + +} \ 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/diskcopy/TerminateCopyDataDialog.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/diskcopy/TerminateCopyDataDialog.kt new file mode 100644 index 0000000000..a900e10ec4 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/diskcopy/TerminateCopyDataDialog.kt @@ -0,0 +1,44 @@ +package com.mogo.eagle.core.function.hmi.ui.diskcopy + +import android.content.Context +import androidx.lifecycle.LifecycleObserver +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager +import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.function.hmi.dialog.BaseFloatDialog +import com.mogo.eagle.core.utilcode.util.ToastUtils +import kotlinx.android.synthetic.main.dialog_terminate_copy_data.tvCopyTerminateCancel +import kotlinx.android.synthetic.main.dialog_terminate_copy_data.tvCopyTerminateConfirm + +/** + * 数据落盘-终止数据拷贝确认弹窗 + */ +class TerminateCopyDataDialog(context: Context) : + BaseFloatDialog(context,TAG), LifecycleObserver { + + companion object { + private const val TAG = "TerminateCopyDataDialog" + } + + init{ + setContentView(R.layout.dialog_terminate_copy_data) + setCanceledOnTouchOutside(false) + initView() + } + + private fun initView(){ + //确认终止数据拷贝 + tvCopyTerminateConfirm.setOnClickListener { + val result = CallerAutoPilotControlManager.sendCopyBagAbortCopy() + if(result){ + ToastUtils.showShort("终止数据拷贝命令已发送") + }else{ + ToastUtils.showShort("终止数据拷贝命令发送失败") + } + dismiss() + } + //取消终止数据拷贝 + tvCopyTerminateCancel.setOnClickListener { + dismiss() + } + } +} \ 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/diskcopy/adapter/DiskCopyCalendarAdapter.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/diskcopy/adapter/DiskCopyCalendarAdapter.kt new file mode 100644 index 0000000000..8e79cdd736 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/diskcopy/adapter/DiskCopyCalendarAdapter.kt @@ -0,0 +1,112 @@ +package com.mogo.eagle.core.function.hmi.ui.diskcopy.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.appcompat.content.res.AppCompatResources +import androidx.recyclerview.widget.RecyclerView +import com.mogo.eagle.core.data.deva.diskcopy.CopyCalendarInfo +import com.mogo.eagle.core.function.hmi.R + +/** + * 数据落盘日历适配器 + */ +class DiskCopyCalendarAdapter(private val context: Context): RecyclerView.Adapter() { + + private var data: ArrayList ?= null + private val title: Int = 0 + private var dateSelectListener: DateSelectListener ?= null + private var previousDate: CopyCalendarInfo ?= null + + fun setData(list: ArrayList){ + data = list + notifyDataSetChanged() + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return when(viewType){ + title->{ + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_calendar_title,parent,false) + CalendarTitleHolder(view) + } + else->{ + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_calendar_content,parent,false) + CalendarContentHolder(view) + } + } + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + when(holder){ + is CalendarTitleHolder->{ + data?.let { + holder.tvCalendarTitle.text = it[position].calendarDateFormat + } + } + is CalendarContentHolder->{ + data?.let { + val dateInfo = it[position] + holder.tvCalendarContent.text = dateInfo.calendarDateFormat + if(dateInfo.canCopy){ + holder.tvCalendarContent.setTextColor(context.getColor(R.color.white)) + }else{ + holder.tvCalendarContent.setTextColor(context.getColor(R.color.color_disk_copy_date)) + } + if(dateInfo.isSelected){ + holder.tvCalendarContent.background = AppCompatResources + .getDrawable(context,R.drawable.bg_current_select_date) + previousDate = dateInfo + }else{ + holder.tvCalendarContent.background = null + } + holder.tvCalendarContent.setOnClickListener { + previousDate?.isSelected = false + dateInfo.isSelected = true + holder.tvCalendarContent.background = AppCompatResources + .getDrawable(context,R.drawable.bg_current_select_date) + previousDate = dateInfo + notifyDataSetChanged() + dateSelectListener?.onDateSelect(dateInfo) + } + } + } + } + } + + override fun getItemCount() = data?.size ?: 0 + + override fun getItemViewType(position: Int): Int{ + return if(data!![position].isTitle){ + 0 + }else { + 1 + } + } + + //Title + class CalendarTitleHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var tvCalendarTitle: TextView = itemView.findViewById(R.id.tvCalendarTitle) + } + + //Content + class CalendarContentHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var tvCalendarContent: TextView = itemView.findViewById(R.id.tvCalendarContent) + } + + /** + * 日期选择回调接口 + */ + interface DateSelectListener{ + fun onDateSelect(info: CopyCalendarInfo) + } + + /** + * 设置日期选择回调接口 + */ + fun setDateSelectListener(listener: DateSelectListener){ + dateSelectListener = listener + } + +} \ 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/msgbox/BusPassengerMsgBoxBubbleView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/BusPassengerMsgBoxBubbleView.kt index ed9c9303bc..cee53028c3 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/BusPassengerMsgBoxBubbleView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/BusPassengerMsgBoxBubbleView.kt @@ -55,7 +55,8 @@ class BusPassengerMsgBoxBubbleView @JvmOverloads constructor( UiThreadHandler.post({ if(category == MsgCategory.NOTICE){ if(msgBoxList.type == MsgBoxType.NOTICE - || msgBoxList.type == MsgBoxType.OBU || msgBoxList.type == MsgBoxType.OPERATION){ + || msgBoxList.type == MsgBoxType.OBU || msgBoxList.type == MsgBoxType.OPERATION + || msgBoxList.type == MsgBoxType.NDE){ MsgBoxConfig.noticeList.add(msgBoxList) if(isShowData){ CallerMsgBoxEventListenerManager.invokeUpdateTipListener(true) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/MBoxBubbleView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/MBoxBubbleView.kt index f581c4f496..5fb6671983 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/MBoxBubbleView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/MBoxBubbleView.kt @@ -58,7 +58,8 @@ class MBoxBubbleView @JvmOverloads constructor( UiThreadHandler.post({ if(category == MsgCategory.NOTICE){ if(msgBoxList.type == MsgBoxType.NOTICE - || msgBoxList.type == MsgBoxType.OBU || msgBoxList.type == MsgBoxType.OPERATION){ + || msgBoxList.type == MsgBoxType.OBU || msgBoxList.type == MsgBoxType.OPERATION + || msgBoxList.type == MsgBoxType.NDE){ MsgBoxConfig.noticeList.add(msgBoxList) if(isShowData){ CallerMsgBoxEventListenerManager.invokeUpdateTipListener(true) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/MMsgBoxBubbleView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/MMsgBoxBubbleView.kt index 6fc7280b14..86e2990083 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/MMsgBoxBubbleView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/MMsgBoxBubbleView.kt @@ -55,7 +55,8 @@ class MMsgBoxBubbleView @JvmOverloads constructor( UiThreadHandler.post({ if(category == MsgCategory.NOTICE){ if(msgBoxList.type == MsgBoxType.NOTICE - || msgBoxList.type == MsgBoxType.OBU || msgBoxList.type == MsgBoxType.OPERATION){ + || msgBoxList.type == MsgBoxType.OBU || msgBoxList.type == MsgBoxType.OPERATION + || msgBoxList.type == MsgBoxType.NDE){ update(msgBoxList) } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/PassengerMsgBoxBubbleView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/PassengerMsgBoxBubbleView.kt index 809a47c7aa..02f3b39bca 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/PassengerMsgBoxBubbleView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/PassengerMsgBoxBubbleView.kt @@ -70,7 +70,8 @@ class PassengerMsgBoxBubbleView @JvmOverloads constructor( override fun onDataChanged(category: MsgCategory, msgBoxList: MsgBoxBean) { UiThreadHandler.post({ if(category == MsgCategory.NOTICE){ - if(msgBoxList.type == MsgBoxType.NOTICE || msgBoxList.type == MsgBoxType.OBU){ + if(msgBoxList.type == MsgBoxType.NOTICE || msgBoxList.type == MsgBoxType.OBU + || msgBoxList.type == MsgBoxType.NDE){ if(isCacheMsg){ //将消息缓存到未播放列表等待小智语音播放完成后取出播放 MsgBoxConfig.unPlayList.add(msgBoxList) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/BusPassengerMsgBoxBubbleAdapter.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/BusPassengerMsgBoxBubbleAdapter.kt index d39ac2adae..8f643dca85 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/BusPassengerMsgBoxBubbleAdapter.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/BusPassengerMsgBoxBubbleAdapter.kt @@ -8,6 +8,7 @@ import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView import androidx.core.content.res.ResourcesCompat +import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.mogo.eagle.core.data.enums.EventTypeEnumNew import com.mogo.eagle.core.data.msgbox.* @@ -23,6 +24,7 @@ class BusPassengerMsgBoxBubbleAdapter(private val activity: Activity): RecyclerV private val notice: Int = 1 private val v2x: Int = 2 private val operation: Int = 3 + private val nde: Int = 4 fun setData(data: ArrayList){ this.data = data @@ -42,6 +44,10 @@ class BusPassengerMsgBoxBubbleAdapter(private val activity: Activity): RecyclerV val view = LayoutInflater.from(parent.context).inflate(R.layout.item_bus_box_operation,parent,false) BusBubbleOperationHolder(view) } + nde->{ + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_passenger_nde,parent,false) + BusBubbleNdeHolder(view) + } else ->{ val view = LayoutInflater.from(parent.context).inflate(R.layout.item_bus_box_v2x,parent,false) BusBubbleV2XHolder(view) @@ -84,6 +90,21 @@ class BusPassengerMsgBoxBubbleAdapter(private val activity: Activity): RecyclerV holder.tvBusPV2XTitle.text = EventTypeEnumNew.getEventTitle(v2XMsg.type) } } + is BusBubbleNdeHolder ->{ + data?.let { + val ndeMsg = it[position].msgBoxBean.bean as NDEMsg + holder.tvNdeTitle.text = ndeMsg.title + holder.tvNdeContent.text = ndeMsg.des + val linearLayoutManager = LinearLayoutManager(activity) + linearLayoutManager.orientation = LinearLayoutManager.HORIZONTAL + val ndeRoadAdapter = PassengerNDERoadAdapter(activity) + holder.rvNdeList.adapter = ndeRoadAdapter + holder.rvNdeList.layoutManager = linearLayoutManager + ndeMsg.getRoadList()?.let {roadList-> + ndeRoadAdapter.setData(roadList) + } + } + } } val msgBoxBean: MsgBoxCountDownBean = data!![position] @@ -107,12 +128,19 @@ class BusPassengerMsgBoxBubbleAdapter(private val activity: Activity): RecyclerV override fun getItemCount() = data?.size ?: 0 override fun getItemViewType(position: Int): Int{ - return if(data!![position].msgBoxBean.type == MsgBoxType.NOTICE){ - notice - }else if(data!![position].msgBoxBean.type == MsgBoxType.OPERATION){ - operation - } else{ - v2x + return when (data!![position].msgBoxBean.type) { + MsgBoxType.NOTICE -> { + notice + } + MsgBoxType.OPERATION -> { + operation + } + MsgBoxType.NDE -> { + nde + } + else -> { + v2x + } } } @@ -136,4 +164,12 @@ class BusPassengerMsgBoxBubbleAdapter(private val activity: Activity): RecyclerV var tvBusPOperationContent: TextView = itemView.findViewById(R.id.tvBusPOperationContent) } + //NDE + class BusBubbleNdeHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var ivNdeImage: ImageView = itemView.findViewById(R.id.ivNdeImage) + var tvNdeTitle: TextView = itemView.findViewById(R.id.tvNdeTitle) + var tvNdeContent: TextView = itemView.findViewById(R.id.tvNdeContent) + var rvNdeList: RecyclerView = itemView.findViewById(R.id.rvNdeList) + } + } \ 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/msgbox/adapter/MBoxBubbleAdapter.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/MBoxBubbleAdapter.kt index 57f1c7afe1..8c66767006 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/MBoxBubbleAdapter.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/MBoxBubbleAdapter.kt @@ -8,6 +8,7 @@ import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView import androidx.core.content.res.ResourcesCompat +import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.mogo.eagle.core.data.enums.EventTypeEnumNew import com.mogo.eagle.core.data.msgbox.* @@ -23,6 +24,7 @@ class MBoxBubbleAdapter(private val activity: Activity): RecyclerView.Adapter){ @@ -43,6 +45,10 @@ class MBoxBubbleAdapter(private val activity: Activity): RecyclerView.Adapter{ + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_passenger_nde,parent,false) + BubbleNdeHolder(view) + } else -> { val view = LayoutInflater.from(parent.context).inflate(R.layout.item_m_box_v2x,parent,false) BubbleV2XHolder(view) @@ -85,6 +91,21 @@ class MBoxBubbleAdapter(private val activity: Activity): RecyclerView.Adapter{ + data?.let { + val ndeMsg = it[position].msgBoxBean.bean as NDEMsg + holder.tvNdeTitle.text = ndeMsg.title + holder.tvNdeContent.text = ndeMsg.des + val linearLayoutManager = LinearLayoutManager(activity) + linearLayoutManager.orientation = LinearLayoutManager.HORIZONTAL + val ndeRoadAdapter = PassengerNDERoadAdapter(activity) + holder.rvNdeList.adapter = ndeRoadAdapter + holder.rvNdeList.layoutManager = linearLayoutManager + ndeMsg.getRoadList()?.let {roadList-> + ndeRoadAdapter.setData(roadList) + } + } + } } val msgBoxBean: MsgBoxCountDownBean = data!![position] @@ -114,6 +135,9 @@ class MBoxBubbleAdapter(private val activity: Activity): RecyclerView.Adapter { operation } + MsgBoxType.NDE -> { + nde + } else -> { v2x } @@ -142,5 +166,12 @@ class MBoxBubbleAdapter(private val activity: Activity): RecyclerView.Adapter){ @@ -55,6 +57,10 @@ class MMsgBoxBubbleAdapter(private val activity: Activity): RecyclerView.Adapter val view = LayoutInflater.from(parent.context).inflate(R.layout.item_m_msg_box_operation,parent,false) BubbleOperationHolder(view) } + nde -> { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_passenger_nde,parent,false) + BubbleNdeHolder(view) + } else -> { val view = LayoutInflater.from(parent.context).inflate(R.layout.item_m_msg_box_v2x,parent,false) BubbleV2XHolder(view) @@ -137,6 +143,21 @@ class MMsgBoxBubbleAdapter(private val activity: Activity): RecyclerView.Adapter holder.tvMOperationContent.text = operationMsg.content } } + is BubbleNdeHolder ->{ + data?.let { + val ndeMsg = it[position].msgBoxBean.bean as NDEMsg + holder.tvNdeTitle.text = ndeMsg.title + holder.tvNdeContent.text = ndeMsg.des + val linearLayoutManager = LinearLayoutManager(activity) + linearLayoutManager.orientation = LinearLayoutManager.HORIZONTAL + val ndeRoadAdapter = PassengerNDERoadAdapter(activity) + holder.rvNdeList.adapter = ndeRoadAdapter + holder.rvNdeList.layoutManager = linearLayoutManager + ndeMsg.getRoadList()?.let {roadList-> + ndeRoadAdapter.setData(roadList) + } + } + } } val msgBoxBean: MsgBoxCountDownBean = data!![position] @@ -165,7 +186,9 @@ class MMsgBoxBubbleAdapter(private val activity: Activity): RecyclerView.Adapter summary }else if(data!![position].msgBoxBean.type == MsgBoxType.OPERATION){ operation - } else{ + }else if(data!![position].msgBoxBean.type == MsgBoxType.NDE){ + nde + }else{ v2x } } @@ -201,4 +224,12 @@ class MMsgBoxBubbleAdapter(private val activity: Activity): RecyclerView.Adapter var tvMOperationContent: TextView = itemView.findViewById(R.id.tvMOperationContent) } + //NDE + class BubbleNdeHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var ivNdeImage: ImageView = itemView.findViewById(R.id.ivNdeImage) + var tvNdeTitle: TextView = itemView.findViewById(R.id.tvNdeTitle) + var tvNdeContent: TextView = itemView.findViewById(R.id.tvNdeContent) + var rvNdeList: RecyclerView = itemView.findViewById(R.id.rvNdeList) + } + } \ 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/msgbox/adapter/MsgBoxToastAdapter.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/MsgBoxToastAdapter.kt index 3a11acdf89..f56e3a49af 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/MsgBoxToastAdapter.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/MsgBoxToastAdapter.kt @@ -10,6 +10,8 @@ import android.widget.TextView import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.content.ContextCompat import androidx.core.content.res.ResourcesCompat +import androidx.recyclerview.widget.DividerItemDecoration +import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.mogo.eagle.core.data.deva.report.ReportEntity import com.mogo.eagle.core.data.enums.DataSourceType @@ -150,6 +152,15 @@ class MsgBoxToastAdapter(private val activity: Activity) : RecyclerView.Adapter< val ndeMsg = it[position].msgBoxBean.bean as NDEMsg holder.tvNdeTitle.text = ndeMsg.title holder.tvNdeContent.text = ndeMsg.des + val linearLayoutManager = LinearLayoutManager(activity) + linearLayoutManager.orientation = LinearLayoutManager.HORIZONTAL + val ndeRoadAdapter = NDERoadAdapter(activity) + holder.rvRoadList.adapter = ndeRoadAdapter + holder.rvRoadList.layoutManager = linearLayoutManager +// holder.rvRoadList.addItemDecoration(divider) + ndeMsg.getRoadList()?.let {roadList-> + ndeRoadAdapter.setData(roadList) + } } } //OTA升级消息 @@ -387,6 +398,7 @@ class MsgBoxToastAdapter(private val activity: Activity) : RecyclerView.Adapter< class BubbleNDEHolder(itemView: View): RecyclerView.ViewHolder(itemView){ var tvNdeTitle: TextView = itemView.findViewById(R.id.tvNdeTitle) var tvNdeContent: TextView = itemView.findViewById(R.id.tvNdeContent) + var rvRoadList: RecyclerView = itemView.findViewById(R.id.rvRoadList) } //OTA升级消息 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/NDERoadAdapter.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/NDERoadAdapter.kt new file mode 100644 index 0000000000..1cc1b5015a --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/NDERoadAdapter.kt @@ -0,0 +1,251 @@ +package com.mogo.eagle.core.function.hmi.ui.msgbox.adapter + +import android.content.Context +import android.util.TypedValue +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.RecyclerView +import com.mogo.eagle.core.data.msgbox.NDEMsg +import com.mogo.eagle.core.function.hmi.R + +/** + * NDE消息车龙车道列表适配器 + */ +class NDERoadAdapter(private val context: Context): RecyclerView.Adapter() { + + private var roadList: List ?= null + + fun setData(list: List){ + roadList = list + notifyDataSetChanged() + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RoadHolder { + val view = LayoutInflater.from(parent.context) + .inflate(R.layout.item_nde_road, parent, false) + return RoadHolder(view) + } + + override fun onBindViewHolder(holder: RoadHolder, position: Int) { + roadList?.let { + val roadMsg = it[position] + if(it.size <= 3){ + //设置item宽度为最大宽度180dp + val params = ConstraintLayout.LayoutParams( + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 180f, + context.resources.displayMetrics).toInt(), + ConstraintLayout.LayoutParams.WRAP_CONTENT) + holder.clRoadLayout.layoutParams = params + }else if(it.size == 4){ + //设置item宽度为最大宽度180dp + val params = ConstraintLayout.LayoutParams( + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 152f, + context.resources.displayMetrics).toInt(), + ConstraintLayout.LayoutParams.WRAP_CONTENT) + holder.clRoadLayout.layoutParams = params + }else if(it.size == 5){ + val params = ConstraintLayout.LayoutParams( + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 120f, + context.resources.displayMetrics).toInt(), + ConstraintLayout.LayoutParams.WRAP_CONTENT) + holder.clRoadLayout.layoutParams = params + }else{ + val params = ConstraintLayout.LayoutParams( + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 90f, + context.resources.displayMetrics).toInt(), + ConstraintLayout.LayoutParams.WRAP_CONTENT) + holder.clRoadLayout.layoutParams = params + } + when(roadMsg.arrowType){ + //直行 + 201->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_forward + )) + } + //直行或左转 + 202->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_forward_or_turn_left + )) + } + //直行或右转 + 203->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_forward_or_turn_right + )) + } + //直行或掉头 + 204->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_forward_or_reverse + )) + } + //左转 + 205->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_turn_left + )) + } + //左转或掉头 + 206->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_turn_left_or_reverse + )) + } + //左弯或向左合流 + 207->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_turn_or_merge_left + )) + } + //右转 + 208->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_turn_right + )) + } + //右转或向右合流 + 209->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_turn_or_merge_right + )) + } + //左右转弯 + 210->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_turn_left_or_right + )) + } + //掉头 + 211->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_reverse + )) + } + //禁止左转 + 212->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_prohibit_turn_left + )) + } + //禁止右转 + 213->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_prohibit_turn_right + )) + } + //禁止掉头 + 214->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_prohibit_reverse + )) + } + //直行或左转或右转 + 215->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_forward_turn_left_right + )) + } + //直行或掉头或左转 + 216->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_forward_turn_left_reverse + )) + } + //右转或掉头 + 217->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_turn_right_or_reverse + )) + } + //禁止右转或向右合流 + 218->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_prohibit_turn_or_merge_right + )) + } + } + //是否是推荐车道 + if(roadMsg.isRecommend){ + holder.tvRoadStatus.text = context.getString(R.string.nde_road_recommend) + holder.tvRoadStatus.setTextColor(context.getColor(R.color.msg_nde_road_recommend)) + if(it.size<=3){ + holder.clRoadLayout.background = ContextCompat.getDrawable( + context, + R.drawable.bg_road_recommend_one + ) + }else if(it.size == 4){ + holder.clRoadLayout.background = ContextCompat.getDrawable( + context, + R.drawable.bg_road_recommend_two + ) + }else{ + holder.clRoadLayout.background = ContextCompat.getDrawable( + context, + R.drawable.bg_road_recommend_three + ) + } + } + //是否有车龙,代表拥堵、行驶缓慢 + if(roadMsg.isCheLong){ + holder.tvRoadStatus.text = context.getString(R.string.nde_road_slow) + holder.tvRoadStatus.setTextColor(context.getColor(R.color.msg_nde_road_slow)) + } + if(position == it.lastIndex){ + holder.viewDivider.visibility = View.INVISIBLE + } + } + } + + override fun getItemCount() = roadList?.size ?: 0 + + class RoadHolder(itemView: View) : RecyclerView.ViewHolder(itemView){ + var clRoadLayout: ConstraintLayout = itemView.findViewById(R.id.clRoadLayout) + var ivRoadType: ImageView = itemView.findViewById(R.id.ivRoadType) + var tvRoadStatus: TextView = itemView.findViewById(R.id.tvRoadStatus) + var viewDivider: View = itemView.findViewById(R.id.viewDivider) + } + +} \ 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/msgbox/adapter/PassengerMsgBoxBubbleAdapter.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/PassengerMsgBoxBubbleAdapter.kt index 8207016a7e..6f1854dc0c 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/PassengerMsgBoxBubbleAdapter.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/PassengerMsgBoxBubbleAdapter.kt @@ -8,6 +8,7 @@ import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView import androidx.core.content.res.ResourcesCompat +import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.mogo.eagle.core.data.enums.DataSourceType import com.mogo.eagle.core.data.enums.EventTypeEnumNew @@ -35,6 +36,7 @@ class PassengerMsgBoxBubbleAdapter(private val activity: Activity): RecyclerView private val v2x: Int = 2 private val summary: Int = 3 private val voice: Int = 4 + private val nde: Int = 5 fun setData(data: ArrayList){ this.data = data @@ -70,6 +72,10 @@ class PassengerMsgBoxBubbleAdapter(private val activity: Activity): RecyclerView val view = LayoutInflater.from(parent.context).inflate(R.layout.item_passenger_msg_box_voice,parent,false) BubbleVoiceHolder(view) } + nde -> { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_passenger_nde,parent,false) + BubbleNdeHolder(view) + } else -> { val view = LayoutInflater.from(parent.context).inflate(R.layout.item_passenger_msg_box_v2x,parent,false) BubbleV2XHolder(view) @@ -149,6 +155,21 @@ class PassengerMsgBoxBubbleAdapter(private val activity: Activity): RecyclerView } } } + is BubbleNdeHolder ->{ + data?.let { + val ndeMsg = it[position].msgBoxBean.bean as NDEMsg + holder.tvNdeTitle.text = ndeMsg.title + holder.tvNdeContent.text = ndeMsg.des + val linearLayoutManager = LinearLayoutManager(activity) + linearLayoutManager.orientation = LinearLayoutManager.HORIZONTAL + val ndeRoadAdapter = PassengerNDERoadAdapter(activity) + holder.rvNdeList.adapter = ndeRoadAdapter + holder.rvNdeList.layoutManager = linearLayoutManager + ndeMsg.getRoadList()?.let {roadList-> + ndeRoadAdapter.setData(roadList) + } + } + } } val msgBoxBean: MsgBoxCountDownBean = data!![position] @@ -181,6 +202,8 @@ class PassengerMsgBoxBubbleAdapter(private val activity: Activity): RecyclerView summary }else if(data!![position].msgBoxBean.type == MsgBoxType.VOICE){ voice + }else if(data!![position].msgBoxBean.type == MsgBoxType.NDE){ + nde }else{ v2x } @@ -213,4 +236,12 @@ class PassengerMsgBoxBubbleAdapter(private val activity: Activity): RecyclerView var tvVoiceRes: AlignTwoTextView = itemView.findViewById(R.id.tvVoiceRes) } + //NDE + class BubbleNdeHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var ivNdeImage: ImageView = itemView.findViewById(R.id.ivNdeImage) + var tvNdeTitle: TextView = itemView.findViewById(R.id.tvNdeTitle) + var tvNdeContent: TextView = itemView.findViewById(R.id.tvNdeContent) + var rvNdeList: RecyclerView = itemView.findViewById(R.id.rvNdeList) + } + } \ 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/msgbox/adapter/PassengerNDERoadAdapter.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/PassengerNDERoadAdapter.kt new file mode 100644 index 0000000000..a6ada4fb98 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/PassengerNDERoadAdapter.kt @@ -0,0 +1,236 @@ +package com.mogo.eagle.core.function.hmi.ui.msgbox.adapter + +import android.content.Context +import android.util.TypedValue +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.RecyclerView +import com.mogo.eagle.core.data.msgbox.NDEMsg +import com.mogo.eagle.core.function.hmi.R + +class PassengerNDERoadAdapter(private val context: Context): RecyclerView.Adapter() { + + private var roadList: List ?= null + + fun setData(list: List){ + roadList = list + notifyDataSetChanged() + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PassengerRoadHolder { + val view = LayoutInflater.from(parent.context) + .inflate(R.layout.item_passenger_nde_road, parent, false) + return PassengerRoadHolder(view) + } + + override fun onBindViewHolder(holder: PassengerRoadHolder, position: Int) { + roadList?.let{ + val roadMsg = it[position] + if(it.size < 3){ + //设置item宽度为最大宽度180dp + val params = ConstraintLayout.LayoutParams( + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 180f, + context.resources.displayMetrics).toInt(), + ConstraintLayout.LayoutParams.WRAP_CONTENT) + holder.clRoadLayout.layoutParams = params + }else if(it.size == 3){ + //设置item宽度为最大宽度180dp + val params = ConstraintLayout.LayoutParams( + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 120f, + context.resources.displayMetrics).toInt(), + ConstraintLayout.LayoutParams.WRAP_CONTENT) + holder.clRoadLayout.layoutParams = params + }else if(it.size == 4){ + //设置item宽度为最大宽度180dp + val params = ConstraintLayout.LayoutParams( + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 100f, + context.resources.displayMetrics).toInt(), + ConstraintLayout.LayoutParams.WRAP_CONTENT) + holder.clRoadLayout.layoutParams = params + }else{ + val params = ConstraintLayout.LayoutParams( + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 90f, + context.resources.displayMetrics).toInt(), + ConstraintLayout.LayoutParams.WRAP_CONTENT) + holder.clRoadLayout.layoutParams = params + } + when(roadMsg.arrowType){ + //直行 + 201->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_forward + )) + } + //直行或左转 + 202->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_forward_or_turn_left + )) + } + //直行或右转 + 203->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_forward_or_turn_right + )) + } + //直行或掉头 + 204->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_forward_or_reverse + )) + } + //左转 + 205->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_turn_left + )) + } + //左转或掉头 + 206->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_turn_left_or_reverse + )) + } + //左弯或向左合流 + 207->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_turn_or_merge_left + )) + } + //右转 + 208->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_turn_right + )) + } + //右转或向右合流 + 209->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_turn_or_merge_right + )) + } + //左右转弯 + 210->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_turn_left_or_right + )) + } + //掉头 + 211->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_reverse + )) + } + //禁止左转 + 212->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_prohibit_turn_left + )) + } + //禁止右转 + 213->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_prohibit_turn_right + )) + } + //禁止掉头 + 214->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_prohibit_reverse + )) + } + //直行或左转或右转 + 215->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_forward_turn_left_right + )) + } + //直行或掉头或左转 + 216->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_forward_turn_left_reverse + )) + } + //右转或掉头 + 217->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_turn_right_or_reverse + )) + } + //禁止右转或向右合流 + 218->{ + holder.ivRoadType.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_road_prohibit_turn_or_merge_right + )) + } + } + //是否是推荐车道 + if(roadMsg.isRecommend){ + holder.tvRoadStatus.text = context.getString(R.string.nde_road_recommend) + holder.tvRoadStatus.setTextColor(context.getColor(R.color.msg_nde_road_recommend)) + holder.clRoadLayout.background = ContextCompat.getDrawable( + context, + R.drawable.bg_nde_road_recommend + ) + } + //是否有车龙,代表拥堵、行驶缓慢 + if(roadMsg.isCheLong){ + holder.tvRoadStatus.text = context.getString(R.string.nde_road_slow) + holder.tvRoadStatus.setTextColor(context.getColor(R.color.msg_nde_road_slow)) + } + if(position == it.lastIndex){ + holder.viewDivider.visibility = View.INVISIBLE + } + } + } + + override fun getItemCount() = roadList?.size ?: 0 + + class PassengerRoadHolder(itemView: View) : RecyclerView.ViewHolder(itemView){ + var clRoadLayout: ConstraintLayout = itemView.findViewById(R.id.clRoadLayout) + var ivRoadType: ImageView = itemView.findViewById(R.id.ivRoadType) + var tvRoadStatus: TextView = itemView.findViewById(R.id.tvRoadStatus) + var viewDivider: View = itemView.findViewById(R.id.viewDivider) + } +} \ 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/notice/NoticeCheckDialog.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/NoticeCheckDialog.kt index 84829e2696..6d560f5c8e 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/NoticeCheckDialog.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/NoticeCheckDialog.kt @@ -232,6 +232,10 @@ class NoticeCheckDialog(context: Context) : BaseFloatDialog(context), LifecycleO complete(firstBitmap, path) } + override fun onComplete(url: String?, vararg objects: Any?) { + + } + override fun onClickResume(url: String, vararg objects: Any) { thumbnailImageView!!.visibility = View.GONE playImageView!!.visibility = View.GONE diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/exploration/AutomaticExplorationView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/exploration/AutomaticExplorationView.kt index 0522e443c3..e63f893d62 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/exploration/AutomaticExplorationView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/exploration/AutomaticExplorationView.kt @@ -14,7 +14,6 @@ import androidx.constraintlayout.widget.ConstraintLayout import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.mogo.commons.voice.AIAssist -import com.mogo.eagle.core.data.autopilot.AutopilotSummaryInfo import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.msgbox.MsgBoxBean import com.mogo.eagle.core.data.msgbox.MsgBoxType @@ -27,7 +26,6 @@ import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxListenerManager import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.util.ThreadUtils -import com.mogo.skin.utils.SkinResources /** @@ -162,8 +160,7 @@ open class AutomaticExplorationView @JvmOverloads constructor( rotationAnim?.cancel() //语音播放,只在司机端播放 if(AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)){ - AIAssist.getInstance(context).speakTTSVoice("道路畅通一切正常${SkinResources.getInstance().getString( - R.string.operation_platform_name)}型车助手将持续守候您的出行") + AIAssist.getInstance(context).speakTTSVoice("正为您探查道路情况") } //5秒后关闭弹窗 val hideViewTimer =object: CountDownTimer(EXPLORATION_HIDE_TIME,EXPLORATION_HIDE_TIME){ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/traffic/NoticeTrafficDialog.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/traffic/NoticeTrafficDialog.kt index 63f4e35681..cdbbc58f73 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/traffic/NoticeTrafficDialog.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/traffic/NoticeTrafficDialog.kt @@ -276,6 +276,10 @@ class NoticeTrafficDialog : BaseFloatDialog, LifecycleObserver { complete(firstBitmap) } + override fun onComplete(url: String?, vararg objects: Any?) { + + } + override fun onClickResume(url: String, vararg objects: Any) { thumbnailImage!!.visibility = View.GONE playImageView!!.visibility = View.GONE diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/operate/OperatePanelLayout.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/operate/OperatePanelLayout.kt index 1a4326f280..4a0af9ae10 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/operate/OperatePanelLayout.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/operate/OperatePanelLayout.kt @@ -28,6 +28,7 @@ import com.mogo.eagle.core.data.multidisplay.TelematicConstant import com.mogo.eagle.core.data.obu.MogoObuConst import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotCarConfigListener import com.mogo.eagle.core.function.api.autopilot.IMoGoGetParamResponseListener +import com.mogo.eagle.core.function.api.devatools.IImgUploadCloudListener import com.mogo.eagle.core.function.api.devatools.mofang.IMoGoMoFangProvider import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener.Companion.FUNC_MODE_DEMO @@ -39,6 +40,7 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListener import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotCarConfigListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotGetParamResponseDispatcher import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager +import com.mogo.eagle.core.function.call.devatools.CallerImgUploadCloudManager import com.mogo.eagle.core.function.call.hmi.CallerHmiManager import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager @@ -66,6 +68,7 @@ import com.mogo.eagle.core.utilcode.util.AppStateManager import com.mogo.eagle.core.utilcode.util.GsonUtils.* import com.mogo.eagle.core.utilcode.util.ThreadUtils import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.mogo.support.device.led.ILedForeverChangeWelcomeContentListener import com.mogo.support.device.led.LedSourceManager import com.zhjt.mogo.adas.data.AdasConstants @@ -327,7 +330,6 @@ class OperatePanelLayout : LinearLayout { private const val KEY_V2X_TOTAL_SWITCH = "v2x_total_switch" private const val KEY_V2N_TOTAL_SWITCH = "v2n_total_switch" private const val KEY_V2N_NEW_LINKED_TO_PNC = "v2n_new_linked_to_pnc" - private const val KEY_V2N_NEW_LINKED_GREEN_WAVE = "v2n_new_linked_green_wave" private const val KEY_V2I_TOTAL_SWITCH = "v2i_total_switch" private const val KEY_V2I_TO_PNC = "v2i_to_pnc" private const val KEY_V2I_RED_LIGHT_WARNING = "v2i_red_light_warning" @@ -351,9 +353,6 @@ class OperatePanelLayout : LinearLayout { KEY_V2N_NEW_LINKED_TO_PNC -> { return FunctionBuildConfig.v2nNewLinkedToPNC } - KEY_V2N_NEW_LINKED_GREEN_WAVE -> { - return FunctionBuildConfig.v2nGreenWave - } KEY_V2I_TOTAL_SWITCH -> { return HmiBuildConfig.v2iTotalSwitch } @@ -404,7 +403,6 @@ class OperatePanelLayout : LinearLayout { clickEventAnalytics("V2N总开关", isChecked) if (!isChecked) { // preferenceScreen.findPreferenceReal(KEY_V2N_NEW_LINKED)?.also { changeValue(it, false) } preferenceScreen.findPreferenceReal(KEY_V2N_NEW_LINKED_TO_PNC)?.also { changeValue(it, false) } - preferenceScreen.findPreferenceReal(KEY_V2N_NEW_LINKED_GREEN_WAVE)?.also { changeValue(it, false) } } val map = HashMap().also { it["f1"] = isChecked @@ -420,14 +418,6 @@ class OperatePanelLayout : LinearLayout { CallerAutoPilotControlManager.sendV2nToPncCmd(isChecked) return true } - KEY_V2N_NEW_LINKED_GREEN_WAVE -> { - val isChecked = newValue as? Boolean ?: false - FunctionBuildConfig.v2nGreenWave = isChecked - hmiAction("绿波通行", isChecked) - clickEventAnalytics("绿波通行", isChecked) - CallerTelematicManager.sendMsgToAllClients(TelematicConstant.OBU_GREENWAVE_WARNING, (if (isChecked) "1" else "0").toByteArray()) - return true - } KEY_V2I_TOTAL_SWITCH -> { val isChecked = newValue as? Boolean ?: false HmiBuildConfig.v2iTotalSwitch = isChecked @@ -443,7 +433,7 @@ class OperatePanelLayout : LinearLayout { KEY_V2I_TO_PNC -> { val isChecked = newValue as? Boolean ?: false FunctionBuildConfig.v2iToPNC = isChecked - FunctionBuildConfig.isFusionColor = isChecked //6.6.2版本基于运营需求-产品设计-v2i进pnc,感知目标颜色替换 +// FunctionBuildConfig.isFusionColor = isChecked //6.6.2版本基于运营需求-产品设计-v2i进pnc,感知目标颜色替换 FunctionBuildConfig.fusionMode = 2 CallerAutoPilotControlManager.sendFusionMode(2) CallerAutoPilotControlManager.setFusionColor(isChecked) @@ -1071,7 +1061,8 @@ class OperatePanelLayout : LinearLayout { } } - class VehiclesPreferenceFragmentCompat : OperatePanelDetailBase(), IMoGoAutopilotCarConfigListener, ISopSettingListener, IViewControlListener, IMoGoGetParamResponseListener { + class VehiclesPreferenceFragmentCompat : OperatePanelDetailBase(), IMoGoAutopilotCarConfigListener, ISopSettingListener, IViewControlListener, IMoGoGetParamResponseListener, + IImgUploadCloudListener { companion object { private const val TAG = "VehiclesPreferenceFragmentCompat" private const val KEY_PNC_PARK_INTERSECTION_CAR = "pnc_park_intersection_car" @@ -1081,6 +1072,7 @@ class OperatePanelLayout : LinearLayout { private const val KEY_FAULT_DECELERATION_PARK = "fault_deceleration_park" private const val KEY_WEAK_NET_DECELERATION_PARK = "weak_net_deceleration_park" private const val KEY_EXAM_FUNCTION_PANEL = "exam_function_panel" + private const val KEY_IMAGE_UPLOAD = "image_upload" private const val KEY_ALL_MERGE_MODE = "all_merge_mode" private const val KEY_BLIND_AREA_MODE = "blind_area_mode" private const val KEY_BEYOND_VISUAL_RANGE_MODE = "beyond_visual_range_mode" @@ -1095,16 +1087,18 @@ class OperatePanelLayout : LinearLayout { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { Logger.d(TAG, "--- onCreateView --- 1 ---") + CallerAutopilotGetParamResponseDispatcher.addListener(TAG, this) + CallerAutopilotCarConfigListenerManager.addListener(TAG, this) + CallerSopSettingManager.addListener(TAG, this) + CallerHmiViewControlListenerManager.addListener(TAG, this) + CallerImgUploadCloudManager.addListener(TAG, this) if (AppConfigInfo.isConnectAutopilot) { Logger.d(TAG, "--- onCreateView --- 2 ---") //获取车辆配置 CallerAutoPilotControlManager.getCarConfig() //查询融合模式 CallerAutoPilotControlManager.sendGetParamReq(AdasConstants.MapSystemParamType.FUSION_MODE) CallerAutoPilotControlManager.sendGetParamReq(AdasConstants.MapSystemParamType.OVERTAKE_MAX_SPEED) + CallerAutoPilotControlManager.sendImgUploadCloudStatusQuery() } - CallerAutopilotGetParamResponseDispatcher.addListener(TAG, this) - CallerAutopilotCarConfigListenerManager.addListener(TAG, this) - CallerSopSettingManager.addListener(TAG, this) - CallerHmiViewControlListenerManager.addListener(TAG, this) return super.onCreateView(inflater, container, savedInstanceState) } @@ -1113,6 +1107,7 @@ class OperatePanelLayout : LinearLayout { CallerAutopilotCarConfigListenerManager.removeListener(TAG) CallerSopSettingManager.removeListener(TAG) CallerHmiViewControlListenerManager.removeListener(TAG) + CallerImgUploadCloudManager.removeListener(TAG) super.onDestroyView() } @@ -1250,6 +1245,9 @@ class OperatePanelLayout : LinearLayout { KEY_RAIN_DAY -> { return FunctionBuildConfig.isRainMode } + KEY_IMAGE_UPLOAD -> { + return FunctionBuildConfig.isImageUpload + } KEY_WEAK_NET_DECELERATION_PARK -> { return FunctionBuildConfig.isWeakNetSlowDown } @@ -1399,6 +1397,19 @@ class OperatePanelLayout : LinearLayout { clickEventAnalytics("考试功能面板", isChecked) return true } + KEY_IMAGE_UPLOAD -> { + val isChecked = newValue as? Boolean ?: false + FunctionBuildConfig.isImageUpload = isChecked + //域控摄像头上传NDE云开关命令 + CallerAutoPilotControlManager.sendImgUploadCloudEnable(isChecked) + //查询域控摄像头上传NDE云开关状态查询,设置完成后延迟500毫秒进行查询 + UiThreadHandler.postDelayed({ + CallerAutoPilotControlManager.sendImgUploadCloudStatusQuery() + }, 500) + hmiAction("SOP 车辆图像上传行云大模型, ", isChecked) + clickEventAnalytics("车辆图像上传行云大模型", isChecked) + return true + } KEY_ALL_MERGE_MODE -> { if (preference.extras.containsKey("is_checked")) { preference.extras.remove("is_checked") @@ -1502,6 +1513,13 @@ class OperatePanelLayout : LinearLayout { } return super.onPreferenceChange(preference, newValue) } + + /** + * 查询摄像头上传NDE云状态返回 + */ + override fun onImgUploadCloudStatusResp(resp: MessagePad.ImgUploadCloudStatusResp) { + preferenceScreen.findPreferenceReal(KEY_IMAGE_UPLOAD)?.also { changeValue(it, resp.enable) } + } } class WelcomeWordsPreferenceCompat : OperatePanelDetailBase() { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt index ed527f57e5..abcca5fe3c 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt @@ -96,6 +96,7 @@ import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager import com.mogo.eagle.core.function.call.obu.CallerObuApiManager import com.mogo.eagle.core.function.call.obu.CallerObuConnectListenerManager import com.mogo.eagle.core.function.call.obu.CallerObuInfoListenerManager +import com.mogo.eagle.core.function.call.setting.CallerMapShowNameManager import com.mogo.eagle.core.function.call.setting.CallerMoGoUiSettingManager import com.mogo.eagle.core.function.call.setting.CallerSopSettingManager import com.mogo.eagle.core.function.call.telematic.CallerTelematicListenerManager @@ -337,6 +338,8 @@ import kotlin.collections.set import kotlin.math.abs import kotlin.system.exitProcess import com.mogo.eagle.core.function.hmi.ui.tools.ShowDevicesManagerStateDialog +import kotlinx.android.synthetic.main.view_debug_setting.view.btnEnsureMap +import kotlinx.android.synthetic.main.view_debug_setting.view.etMapShowName import kotlinx.android.synthetic.main.view_debug_setting.view.tbTileFileLog @@ -597,6 +600,18 @@ internal class DebugSettingView @JvmOverloads constructor( appVersionInfoLayout.visibility = View.GONE } } + //动态配置鹰眼显示MAP版本 + if(AppConfigInfo.mapShowName.isEmpty()){ + AppConfigInfo.mapShowName = CallerAutoPilotStatusListenerManager.getDockerVersion()+"" + } + etMapShowName.setText(AppConfigInfo.mapShowName) + etMapShowName.text?.let { etMapShowName.setSelection(it.length) } + btnEnsureMap.setOnClickListener { + AppConfigInfo.mapShowName = etMapShowName.text.toString() + tvIpcVersionInfo.text = "MAP:${AppConfigInfo.mapShowName}" + tvIpcVersionInfoKey.text = "MAP:${AppConfigInfo.mapShowName}" + CallerMapShowNameManager.invokeMapShowName(AppConfigInfo.mapShowName) + } /** * 状态中心 @@ -953,7 +968,7 @@ internal class DebugSettingView @JvmOverloads constructor( btnDrawFusion.isChecked = FunctionBuildConfig.isFusionColor btnDrawFusion.setOnCheckedChangeListener { _, isChecked -> - FunctionBuildConfig.isFusionColor = isChecked +// FunctionBuildConfig.isFusionColor = isChecked CallerAutoPilotControlManager.setFusionColor(isChecked) } @@ -2093,13 +2108,13 @@ internal class DebugSettingView @JvmOverloads constructor( AppIdentityModeUtils.getProduct( FunctionBuildConfig.appIdentityMode ) - }" + }_${AppIdentityModeUtils.getVehicle(FunctionBuildConfig.appIdentityMode)}" tvAppVersionNameKey.text = "鹰眼版本:${AppUtils.getAppVersionName()} Git Hash:${AppConfigInfo.workingBranchHash}\n渠道信息:${AppConfigInfo.flavor}_${ AppIdentityModeUtils.getProduct( FunctionBuildConfig.appIdentityMode ) - }" + }_${AppIdentityModeUtils.getVehicle(FunctionBuildConfig.appIdentityMode)}" tvAutopilotProtocolVersionInfo.text = "Autopilot协议版本:${CallerAutoPilotControlManager.getProtocolVersion()}" @@ -2108,7 +2123,11 @@ internal class DebugSettingView @JvmOverloads constructor( } else { tvIpcProtocolVersionInfo.text = "工控机协议版本:${AppConfigInfo.protocolVersionNumber}" } - val dockerVersion = CallerAutoPilotStatusListenerManager.getDockerVersion() + val dockerVersion = if(AppConfigInfo.mapShowName.isNotEmpty() && AppConfigInfo.mapShowName!=CallerAutoPilotStatusListenerManager.getDockerVersion()){ + AppConfigInfo.mapShowName + }else{ + CallerAutoPilotStatusListenerManager.getDockerVersion() + } tvIpcVersionInfo.text = "MAP:$dockerVersion" tvIpcVersionInfoKey.text = "MAP:$dockerVersion" tvMoGoMapVersion.text = "HD-Map版本:${DebugConfig.getMapVersion()}" @@ -2326,16 +2345,16 @@ internal class DebugSettingView @JvmOverloads constructor( val msg = Html.fromHtml("工控机连接状态:${color}${AppConfigInfo.connectStatusDescribe}") ThreadUtils.runOnUiThread { tvAutopilotConnectStatus.text = msg - if (status == AdasConstants.IpcConnectionStatus.CONNECTED || - status == AdasConstants.IpcConnectionStatus.CONNECTING || - status == AdasConstants.IpcConnectionStatus.RECONNECTING_TIMER || - status == AdasConstants.IpcConnectionStatus.RECONNECTING_NETWORK || - status == AdasConstants.IpcConnectionStatus.SEARCH_ADDRESS - ) { - tvIpcConnectStatus.minLines = 1 - } else { - tvIpcConnectStatus.minLines = 4 - } +// if (status == AdasConstants.IpcConnectionStatus.CONNECTED || +// status == AdasConstants.IpcConnectionStatus.CONNECTING || +// status == AdasConstants.IpcConnectionStatus.RECONNECTING_TIMER || +// status == AdasConstants.IpcConnectionStatus.RECONNECTING_NETWORK || +// status == AdasConstants.IpcConnectionStatus.SEARCH_ADDRESS +// ) { +// tvIpcConnectStatus.minLines = 1 +// } else { +// tvIpcConnectStatus.minLines = 4 +// } tvIpcConnectStatus.text = msg //如果是乘客端,则不显示工控机连接状态 if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/SOPSettingView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/SOPSettingView.kt index 4f4ebaf05e..d8b9928078 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/SOPSettingView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/SOPSettingView.kt @@ -252,7 +252,7 @@ internal class SOPSettingView @JvmOverloads constructor( //V2I场景进PNC scV2iPnc.isChecked = FunctionBuildConfig.v2iToPNC if(FunctionBuildConfig.v2iToPNC){ - FunctionBuildConfig.isFusionColor = true //6.6.2版本基于运营需求-产品设计-开启v2i进pnc,开启感知目标颜色替换 +// FunctionBuildConfig.isFusionColor = true //6.6.2版本基于运营需求-产品设计-开启v2i进pnc,开启感知目标颜色替换 } hmiAction("SOP V2I场景进PNC, ", FunctionBuildConfig.v2iToPNC) CallerAutoPilotControlManager.sendV2iToPncCmd(FunctionBuildConfig.v2iToPNC) @@ -269,7 +269,7 @@ internal class SOPSettingView @JvmOverloads constructor( } else { //V2I场景进PNC scV2iPnc.isChecked = false - FunctionBuildConfig.isFusionColor = false //6.6.2版本基于运营需求-产品设计-关闭v2i进pnc,关闭感知目标颜色替换 +// FunctionBuildConfig.isFusionColor = false //6.6.2版本基于运营需求-产品设计-关闭v2i进pnc,关闭感知目标颜色替换 CallerAutoPilotControlManager.sendV2iToPncCmd(false) hmiAction("SOP V2I场景进PNC, ", false) //闯红灯预警 @@ -350,7 +350,7 @@ internal class SOPSettingView @JvmOverloads constructor( } clickEventAnalytics("V2I场景进PNC",isChecked) hmiAction("SOP V2I场景进PNC, ", isChecked) - FunctionBuildConfig.isFusionColor = isChecked //6.6.2版本基于运营需求-产品设计-v2i进pnc,感知目标颜色替换 +// FunctionBuildConfig.isFusionColor = isChecked //6.6.2版本基于运营需求-产品设计-v2i进pnc,感知目标颜色替换 FunctionBuildConfig.fusionMode = 2 CallerAutoPilotControlManager.sendFusionMode(2) updateFusionModeUI() @@ -829,7 +829,7 @@ internal class SOPSettingView @JvmOverloads constructor( if (scLineRoutingVerify.visibility == VISIBLE) { params.topToBottom = R.id.scLineRoutingVerify } else { - params.topToBottom = R.id.scIPCReport + params.topToBottom = R.id.scSweeperModeSwitch } it.layoutParams = params it.setOnCheckedChangeListener { _, isChecked -> diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/StatusSummaryView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/StatusSummaryView.kt index 3239ff5131..0252565ead 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/StatusSummaryView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/StatusSummaryView.kt @@ -197,6 +197,8 @@ class StatusSummaryView @JvmOverloads constructor(context: Context, attrs: Attri AdasConstants.IpcConnectionStatus.SERVER_DISCONNECTED -> { pair = Pair("域控主动断开连接", true) } + + else -> {} } UiThreadHandler.post { if (data.size < 5 || pair == null) return@post diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/OTAUpgradeDialog.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/OTAUpgradeDialog.kt index d14461553b..17d1253da9 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/OTAUpgradeDialog.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/OTAUpgradeDialog.kt @@ -9,6 +9,7 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.function.hmi.dialog.BaseFloatDialog import com.mogo.eagle.core.utilcode.util.ThreadUtils +import com.mogo.eagle.core.utilcode.util.ToastUtils import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.zhjt.mogo_core_function_devatools.ota.OTAUpgradeConfig import kotlinx.android.synthetic.main.dialog_ota_upgrade.tv_upgrade_later @@ -38,12 +39,22 @@ class OTAUpgradeDialog(context: Context) : private fun initView(){ //立即升级 tv_upgrade_now.setOnClickListener { - CallerAutoPilotControlManager.sendSsmFuncOtaDownloadResponse(OTAUpgradeConfig.otaToken,SsmInfo.IfUpgrade.IMMEDIATELY) + val result = CallerAutoPilotControlManager.sendSsmFuncOtaDownloadResponse(OTAUpgradeConfig.otaToken,SsmInfo.IfUpgrade.IMMEDIATELY) + if(result){ + ToastUtils.showShort("立即升级命令发送成功") + }else{ + ToastUtils.showShort("立即升级命令发送失败") + } dismiss() } //稍后升级 tv_upgrade_later.setOnClickListener { - CallerAutoPilotControlManager.sendSsmFuncOtaDownloadResponse(OTAUpgradeConfig.otaToken,SsmInfo.IfUpgrade.DELAY) + val delayResult = CallerAutoPilotControlManager.sendSsmFuncOtaDownloadResponse(OTAUpgradeConfig.otaToken,SsmInfo.IfUpgrade.DELAY) + if(delayResult){ + ToastUtils.showShort("稍后升级命令发送成功") + }else{ + ToastUtils.showShort("稍后升级命令发送失败") + } dismiss() } upgradeWaitingTimer = object: CountDownTimer(UPGRADE_WAITING_TIME,UPGRADE_WAITING_TIME){ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/vehicle/PncActionsView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/vehicle/PncActionsView.kt index ef6e9f2562..e85b9093b5 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/vehicle/PncActionsView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/vehicle/PncActionsView.kt @@ -7,11 +7,13 @@ import android.util.TypedValue.COMPLEX_UNIT_PX import android.view.LayoutInflater import androidx.appcompat.content.res.AppCompatResources import androidx.constraintlayout.widget.ConstraintLayout +import com.mogo.commons.voice.AIAssist import com.mogo.eagle.core.data.autopilot.pnc.PncActionsHelper import com.mogo.eagle.core.data.biz.trafficlight.TrafficLightResult import com.mogo.eagle.core.data.biz.trafficlight.currentRoadTrafficLight import com.mogo.eagle.core.data.biz.trafficlight.isRed import com.mogo.eagle.core.data.biz.trafficlight.time +import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_PNC_ACTIONS import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.FOUNDATION import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotPlanningActionsListener @@ -22,11 +24,14 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListener import com.mogo.eagle.core.function.call.autopilot.CallerPlanningActionsListenerManager import com.mogo.eagle.core.function.call.v2x.CallerTrafficLightListenerManager import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.util.SoundPoolUtils import com.mogo.eagle.core.utilcode.util.UiThreadHandler +import com.mogo.eagle.core.utilcode.util.Utils import com.zhjt.service_biz.BizConfig import kotlinx.android.synthetic.main.view_pnc_actions.view.* import mogo.telematics.pad.MessagePad +import mogo.telematics.pad.MessagePad.DrivingState.USING_RSI_LINK_VALUE class PncActionsView @JvmOverloads constructor( context: Context, @@ -92,8 +97,12 @@ class PncActionsView @JvmOverloads constructor( UiThreadHandler.post { if (CallerAutoPilotStatusListenerManager.getState() == STATUS_AUTOPILOT_RUNNING) { var actions: String? = null + var isPlanningFromServer = false planningActionMsg.actionMsg?.let { try { + if (it.drivingState.number == USING_RSI_LINK_VALUE) { + isPlanningFromServer = true + } actions = PncActionsHelper.getAction( it.drivingState.number, it.drivingAction.number @@ -116,11 +125,18 @@ class PncActionsView @JvmOverloads constructor( } } planningActionMsg.v2NActionMsgList?.forEach { v2nAction -> + if (v2nAction.drivingState.number == USING_RSI_LINK_VALUE) { + isPlanningFromServer = true + } actions = PncActionsHelper.getAction( v2nAction.drivingState.number, v2nAction.drivingAction.number ) } + if (isPlanningFromServer && AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + AIAssist.getInstance(Utils.getApp()) + .speakTTSVoiceWithLevel("正在使用云端规划通过路口", AIAssist.NEW_LEVEL_2) + } // update view if (actions.isNullOrEmpty()) { tvHmiPncActions.background = null diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ColdStartView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ColdStartView.kt index ba47e9f56c..019f9f0788 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ColdStartView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ColdStartView.kt @@ -30,14 +30,18 @@ import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.zhjt.mogo.adas.data.AdasConstants import com.zhjt.mogo_core_function_devatools.coldstart.ColdStartAnalyticsManager import com.zhjt.mogo_core_function_devatools.coldstart.ColdStartConfig +import com.zhjt.mogo_core_function_devatools.coldstart.ColdStartFaultAdapter import com.zhjt.mogo_core_function_devatools.coldstart.ColdStartNodeAdapter import com.zhjt.mogo_core_function_devatools.ota.OTAUpgradeConfig import kotlinx.android.synthetic.main.view_cold_start.view.ivColdStartNow import kotlinx.android.synthetic.main.view_cold_start.view.ivColdStartStatus +import kotlinx.android.synthetic.main.view_cold_start.view.ivFaultIcon import kotlinx.android.synthetic.main.view_cold_start.view.ivIpcConnectStatus import kotlinx.android.synthetic.main.view_cold_start.view.ivNodeListMask +import kotlinx.android.synthetic.main.view_cold_start.view.ivSoftIcon import kotlinx.android.synthetic.main.view_cold_start.view.ivSsmConnectStatus import kotlinx.android.synthetic.main.view_cold_start.view.ivWifiConnectStatus +import kotlinx.android.synthetic.main.view_cold_start.view.rvFaultList import kotlinx.android.synthetic.main.view_cold_start.view.rvNodeList import kotlinx.android.synthetic.main.view_cold_start.view.tvColdStartContent import kotlinx.android.synthetic.main.view_cold_start.view.tvColdStartNow @@ -45,6 +49,7 @@ import kotlinx.android.synthetic.main.view_cold_start.view.tvIpcConnectContent import kotlinx.android.synthetic.main.view_cold_start.view.tvSsmConnectContent import kotlinx.android.synthetic.main.view_cold_start.view.tvSystemStartupTitle import kotlinx.android.synthetic.main.view_cold_start.view.tvWifiConnectContent +import kotlinx.android.synthetic.main.view_cold_start.view.viewFaultDivider import system_master.SsmInfo import system_master.SystemStatusInfo import java.util.Locale @@ -67,6 +72,7 @@ class ColdStartView @JvmOverloads constructor( const val TAG = "ColdStartView" const val LOAD_SSM_WAITING_TIME = 180000L //SSM加载超时等待时间 const val COLD_START_WAITING_TIME = 600000L //冷启动超时等待时间 + const val COLD_START_RETRY_INTERVAL = 5000L //冷启动查询命令超时重试间隔时间 } private var wifiConnectStatus = false //WIFI连接状态,默认是未连接 @@ -74,6 +80,8 @@ class ColdStartView @JvmOverloads constructor( private var ssmConnectStatus = false //SSM连接状态,默认是未连接 private var coldStartStatus = false //冷启动状态,默认是未冷启动成功 + private var needRetry = false //是否需要重试查询冷启动状态 + private var currentColdStartSuccess = false //冷启动成功状态,也是成功后动画完成状态 private var wifiRotationAnim: ObjectAnimator?= null //WIFI连接状态动画 @@ -87,12 +95,14 @@ class ColdStartView @JvmOverloads constructor( private var connectColdStartTimer: CountDownTimer?= null //连接冷启动等待倒计时 private val nodeList = ArrayList() + private val faultList = ArrayList() private var coldStartResultListener: ColdStartResultListener ?= null private var newColdStart: Boolean = false //SSM是否支持新版冷启动 private var coldStartNodeAdapter: ColdStartNodeAdapter ?= null + private var coldStartFaultAdapter: ColdStartFaultAdapter ?= null private var reason: String = "" //上报原因 @@ -102,11 +112,18 @@ class ColdStartView @JvmOverloads constructor( } private fun initView(){ + //软件节点启动状态列表适配器设置 val linearLayoutManager = LinearLayoutManager(context) linearLayoutManager.orientation = LinearLayoutManager.VERTICAL coldStartNodeAdapter = ColdStartNodeAdapter() rvNodeList.adapter =coldStartNodeAdapter rvNodeList.layoutManager = linearLayoutManager + //故障码列表适配器设置 + val faultLinearLayoutManager = LinearLayoutManager(context) + faultLinearLayoutManager.orientation = LinearLayoutManager.VERTICAL + coldStartFaultAdapter = ColdStartFaultAdapter() + rvFaultList.adapter = coldStartFaultAdapter + rvFaultList.layoutManager = faultLinearLayoutManager //立即用车 tvColdStartNow.setOnClickListener{ hideColdStartView() @@ -217,6 +234,8 @@ class ColdStartView @JvmOverloads constructor( AdasConstants.IpcConnectionStatus.SERVER_DISCONNECTED ->{ showIPCConnectFailView("域控主动断开连接,建议重启车辆并上报问题") } + + else -> {} } } } @@ -264,6 +283,7 @@ class ColdStartView @JvmOverloads constructor( if(!newColdStart){ newColdStart = true CallerAutoPilotControlManager.sendSsmFuncQueryColdStartState() + needRetry = true } }else{ newColdStart = false @@ -298,17 +318,11 @@ class ColdStartView @JvmOverloads constructor( ) { if(newColdStart){ coldStartState?.let { + needRetry = false Log.i(TAG,"节点自上报冷启动状态="+it.eventStatus) Log.i(TAG,"旧冷启动状态="+it.processStatus) Log.i(TAG,"旧冷启动超时原因="+it.processTimeoutReason) Log.i(TAG,"硬件故障Node数量="+it.hardwareNodeCount) - it.hardwareNodeList.forEach {startFlt-> - Log.i(TAG,"硬件故障 startFlt.fltId="+ startFlt.fltId) - } - Log.i(TAG,"其他故障数量="+it.otherFltsCount) - it.otherFltsList.forEach {startFlt-> - Log.i(TAG,"其他故障 startFlt.fltId="+startFlt.fltId) - } ThreadUtils.runOnUiThread { tvColdStartContent.text = getColdStartEventStatus(it.eventStatus) if(it.eventStatus == SsmInfo.CSState.COLD_START_READY){ @@ -355,12 +369,32 @@ class ColdStartView @JvmOverloads constructor( nodeList.add(nodeInfo) } } + if(nodeList.size > 0){ + ivSoftIcon.visibility = View.VISIBLE + } coldStartNodeAdapter?.setData(nodeList) if(nodeList.size > 12){ ivNodeListMask.visibility = View.VISIBLE }else{ ivNodeListMask.visibility = View.GONE } + //故障码列表 + faultList.clear() + it.hardwareNodeList.forEach {startFlt-> + Log.i(TAG,"硬件故障 startFlt.fltId="+ startFlt.fltId) + faultList.add(startFlt.fltId) + } + Log.i(TAG,"其他故障数量="+it.otherFltsCount) + it.otherFltsList.forEach {startFlt-> + Log.i(TAG,"其他故障 startFlt.fltId="+startFlt.fltId) + faultList.add(startFlt.fltId) + } + if(faultList.size>0){ + viewFaultDivider.visibility = View.VISIBLE + ivFaultIcon.visibility = View.VISIBLE + rvFaultList.visibility = View.VISIBLE + coldStartFaultAdapter?.setData(faultList) + } } } } @@ -482,8 +516,13 @@ class ColdStartView @JvmOverloads constructor( tvColdStartContent.text = resources.getString(R.string.cold_start_wait) tvColdStartContent.setTextColor(ContextCompat.getColor(context, R.color.white)) //隐藏冷启动相关视图 + ivSoftIcon.visibility = View.GONE rvNodeList.visibility = View.GONE ivNodeListMask.visibility = View.GONE + viewFaultDivider.visibility = View.GONE + ivFaultIcon.visibility = View.GONE + rvFaultList.visibility = View.GONE + //域控连接成功埋点统计 reason = "域控连接成功" ColdStartAnalyticsManager.coldStartStepAnalytics(ColdStartAnalyticsManager.ipcConnectSuccess,reason) @@ -524,8 +563,12 @@ class ColdStartView @JvmOverloads constructor( tvColdStartContent.text = resources.getString(R.string.cold_start_wait) tvColdStartContent.setTextColor(ContextCompat.getColor(context, R.color.white)) //隐藏冷启动相关视图 + ivSoftIcon.visibility = View.GONE rvNodeList.visibility = View.GONE ivNodeListMask.visibility = View.GONE + viewFaultDivider.visibility = View.GONE + ivFaultIcon.visibility = View.GONE + rvFaultList.visibility = View.GONE //域控连接失败埋点统计 this.reason = "域控连接失败:$failReason" ColdStartAnalyticsManager.coldStartStepAnalytics(ColdStartAnalyticsManager.ipcConnectFail,reason) @@ -574,8 +617,12 @@ class ColdStartView @JvmOverloads constructor( tvColdStartContent.text = resources.getString(R.string.cold_start_wait) tvColdStartContent.setTextColor(ContextCompat.getColor(context, R.color.white)) //隐藏Topic列表 + ivSoftIcon.visibility = View.GONE rvNodeList.visibility = View.GONE ivNodeListMask.visibility = View.GONE + viewFaultDivider.visibility = View.GONE + ivFaultIcon.visibility = View.GONE + rvFaultList.visibility = View.GONE ipcConnectStatus = false ssmConnectStatus = false coldStartStatus = false @@ -619,8 +666,12 @@ class ColdStartView @JvmOverloads constructor( tvColdStartContent.text = resources.getString(R.string.cold_start_wait) tvColdStartContent.setTextColor(ContextCompat.getColor(context, R.color.white)) //隐藏冷启动相关视图 + ivSoftIcon.visibility = View.GONE rvNodeList.visibility = View.GONE ivNodeListMask.visibility = View.GONE + viewFaultDivider.visibility = View.GONE + ivFaultIcon.visibility = View.GONE + rvFaultList.visibility = View.GONE if(ipcConnectStatus){ showIPCConnectSuccessView() } @@ -657,8 +708,12 @@ class ColdStartView @JvmOverloads constructor( tvColdStartContent.text = resources.getString(R.string.cold_start_wait) tvColdStartContent.setTextColor(ContextCompat.getColor(context, R.color.white)) //隐藏冷启动相关视图 + ivSoftIcon.visibility = View.GONE rvNodeList.visibility = View.GONE ivNodeListMask.visibility = View.GONE + viewFaultDivider.visibility = View.GONE + ivFaultIcon.visibility = View.GONE + rvFaultList.visibility = View.GONE } /** @@ -757,8 +812,11 @@ class ColdStartView @JvmOverloads constructor( */ private fun coldStartProcess(){ ThreadUtils.runOnUiThread { - connectColdStartTimer = object: CountDownTimer(COLD_START_WAITING_TIME,COLD_START_WAITING_TIME){ + connectColdStartTimer = object: CountDownTimer(COLD_START_WAITING_TIME,COLD_START_RETRY_INTERVAL){ override fun onTick(millisUntilFinished: Long) { + if(needRetry){ + CallerAutoPilotControlManager.sendSsmFuncQueryColdStartState() + } } override fun onFinish() { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ConnectStatusView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ConnectStatusView.kt index b03e6c6491..74514a8de5 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ConnectStatusView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ConnectStatusView.kt @@ -168,6 +168,8 @@ class ConnectStatusView @JvmOverloads constructor( .setForegroundColor(Color.RED) adasSpan.create() } + + else -> {} } } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/MapDownloadView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/MapDownloadView.kt new file mode 100644 index 0000000000..632c709691 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/MapDownloadView.kt @@ -0,0 +1,97 @@ +package com.mogo.eagle.core.function.hmi.ui.widget + +import android.content.Context +import android.os.Looper +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import androidx.constraintlayout.widget.ConstraintLayout +import com.mogo.eagle.core.function.api.map.deva.IMoGoMapDevaProvider +import com.mogo.eagle.core.function.call.map.CallerMapDevaListenerManager +import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.utilcode.util.ThreadUtils +import com.mogo.eagle.core.utilcode.util.UiThreadHandler +import com.mogo.map.MogoData.Companion.mogoMapData +import kotlinx.android.synthetic.main.view_map_download_progress.view.download_pb +import kotlinx.android.synthetic.main.view_map_download_progress.view.ivBackground + +class MapDownloadView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : ConstraintLayout(context, attrs, defStyleAttr), IMoGoMapDevaProvider { + + companion object { + private const val TAG = "MapDownloadView" + } + + init { + LayoutInflater.from(context).inflate(R.layout.view_map_download_progress, this) + } + + fun setProgress(pg: Int) { + download_pb.progress = pg + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + CallerMapDevaListenerManager.addListener("${TAG}${this.hashCode()}", this) + initDownloadProgress() + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + CallerMapDevaListenerManager.removeListener("${TAG}${this.hashCode()}") + } + + private fun updateMapStatus(type: Int, progress: Int) { + when (type) { + -1 -> {// 下载失败 + visibility = View.VISIBLE + download_pb.visibility = View.GONE + ivBackground.setBackgroundResource(R.drawable.map_download_failed) + } + 0 -> {// 下载成功 + visibility = View.VISIBLE + download_pb.visibility = View.GONE + ivBackground.setBackgroundResource(R.drawable.map_download_success) + ThreadUtils.runOnUiThreadDelayed({ + visibility = View.GONE + }, 3000) + } + -2 -> { + // 初始状态 + } + else -> {// 下载中 + visibility = View.VISIBLE + download_pb.visibility = View.VISIBLE + ivBackground.setBackgroundResource(R.drawable.map_download_bg) + download_pb.progress = progress + } + } + } + + override fun downloadStatus(type: Int, progress: Int) { + if (Thread.currentThread() != Looper.getMainLooper().thread) { + UiThreadHandler.post { + updateMapStatus(type, progress) + } + } else { + updateMapStatus(type, progress) + } + } + + private fun initDownloadProgress() { + ThreadUtils.getIoPool().execute { + mogoMapData.get()?.isCityDataCached { isCached -> + if (isCached) { + UiThreadHandler.post { + visibility = View.VISIBLE + download_pb.visibility = View.GONE + ivBackground.setBackgroundResource(R.drawable.map_download_success) + } + } + } + } + } +} \ 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/widget/RoundProgressBar.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/RoundProgressBar.kt new file mode 100644 index 0000000000..532b224c17 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/RoundProgressBar.kt @@ -0,0 +1,18 @@ +package com.mogo.eagle.core.function.hmi.ui.widget + +import android.content.Context +import android.util.AttributeSet +import android.widget.ProgressBar +import com.mogo.eagle.core.widget.media.video.TextureVideoViewOutlineProvider +import me.jessyan.autosize.utils.AutoSizeUtils + +class RoundProgressBar @JvmOverloads constructor( + context: Context, attrs: AttributeSet? = null +) : ProgressBar(context, attrs) { + + override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) { + super.onSizeChanged(w, h, oldw, oldh) + outlineProvider = TextureVideoViewOutlineProvider(AutoSizeUtils.dp2px(context, 1f).toFloat()) + clipToOutline = 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/ui/widget/SingleTrafficLightView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SingleTrafficLightView.kt index 2dea4c4420..11f0a9eae1 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SingleTrafficLightView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SingleTrafficLightView.kt @@ -166,14 +166,14 @@ class SingleTrafficLightView @JvmOverloads constructor( if(trafficLightUser==1){ //乘客屏 val lp = this.layoutParams as MarginLayoutParams - lp.width = context.resources.getDimension(R.dimen.dp_325).toInt() + lp.width = context.resources.getDimension(R.dimen.dp_244).toInt() this.layoutParams = lp mLightSourceTV?.visibility = VISIBLE mLightSourceDivider!!.visibility = VISIBLE mLightTimeTVP?.visibility = GONE mLightSourceTV?.setPadding(0, 0, 75, 0) mLightIconBG?.layoutParams?.width = - context.resources.getDimension(R.dimen.dp_310).toInt() + context.resources.getDimension(R.dimen.dp_233).toInt() }else{ //司机屏 val lp = this.layoutParams as MarginLayoutParams @@ -382,14 +382,14 @@ class SingleTrafficLightView @JvmOverloads constructor( //乘客屏 val lp = this.layoutParams as MarginLayoutParams lp.width = - context.resources.getDimension(R.dimen.hmi_traffic_light_bus_layout_width).toInt() + context.resources.getDimension(R.dimen.dp_300).toInt() this.layoutParams = lp mLightTimeTVP?.visibility = View.VISIBLE mLightSourceDivider?.visibility = View.VISIBLE mLightSourceTV?.visibility = View.VISIBLE mLightSourceTV?.setPadding(0, 0, 0, 0) mLightIconBG?.layoutParams?.width = - context.resources.getDimension(R.dimen.hmi_traffic_light_bus_bg_width).toInt() + context.resources.getDimension(R.dimen.dp_288).toInt() }else{ //司机屏 val lp = this.layoutParams as MarginLayoutParams diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/VersionNameView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/VersionNameView.kt index 922c5c7fa1..36882a73d0 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/VersionNameView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/VersionNameView.kt @@ -3,11 +3,15 @@ package com.mogo.eagle.core.function.hmi.ui.widget import android.annotation.SuppressLint import android.content.Context import android.util.AttributeSet +import android.util.Log import android.view.LayoutInflater import android.widget.LinearLayout +import com.mogo.eagle.core.data.app.AppConfigInfo import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener +import com.mogo.eagle.core.function.api.setting.IMapShowNameListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager +import com.mogo.eagle.core.function.call.setting.CallerMapShowNameManager import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.utilcode.kotlin.* import com.mogo.eagle.core.utilcode.util.AppUtils @@ -23,7 +27,7 @@ class VersionNameView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 -) : LinearLayout(context, attrs, defStyleAttr),IMoGoAutopilotStatusListener { +) : LinearLayout(context, attrs, defStyleAttr),IMoGoAutopilotStatusListener, IMapShowNameListener { companion object { const val TAG = "VersionNameView" @@ -64,7 +68,9 @@ class VersionNameView @JvmOverloads constructor( @SuppressLint("SetTextI18n") private fun showCurrentMapVersion() { val old = tvMapVersionName?.text - val version = dockerVersion + val version = AppConfigInfo.mapShowName.ifEmpty { + dockerVersion + } if (!version.isNullOrEmpty() && old != version) { scope.launch { tvMapVersionName?.also { @@ -78,11 +84,13 @@ class VersionNameView @JvmOverloads constructor( override fun onAttachedToWindow() { super.onAttachedToWindow() CallerAutoPilotStatusListenerManager.addListener(TAG, this) + CallerMapShowNameManager.addListener(TAG,this) } override fun onDetachedFromWindow() { super.onDetachedFromWindow() CallerAutoPilotStatusListenerManager.removeListener(TAG) + CallerMapShowNameManager.removeListener(TAG) } override fun onAutopilotDockerInfo(dockerVersion: String) { @@ -93,4 +101,9 @@ class VersionNameView @JvmOverloads constructor( CallerDevaToolsManager.dockerVersion(dockerVersion) } + override fun changeMapShowName(showName: String) { + super.changeMapShowName(showName) + showCurrentMapVersion() + } + } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainLauncherActivity.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainLauncherActivity.java index a2d67be768..97aa5eb3a3 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainLauncherActivity.java +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainLauncherActivity.java @@ -45,17 +45,6 @@ public class MainLauncherActivity extends MainActivity { EventBus.getDefault().register(this); CallerLogger.i(M_HMI + TAG, "onCreate"); - if(DebugConfig.isMultiDisplay()){ - try { - // 在第二个屏幕启动乘客端app - // 多进程方案 - CallerLogger.i(M_HMI + TAG, "MultiDisplayUtils startActWithSecond"); -// MultiDisplayUtils.INSTANCE.startActWithSecond(this, "com.mogo.launcher.passenger"); -// MultiDisplayUtils.INSTANCE.startActWithSecond(this, PassengerLauncherActivity.class); - } catch (Exception e) { - e.printStackTrace(); - } - } } @Override @@ -89,24 +78,17 @@ public class MainLauncherActivity extends MainActivity { private void loadOCHModule() { IMoGoFunctionProvider ochProvider; // 兼容处理之前联想PAD及小巴车多个设备部署不同APP方案 - if (!DebugConfig.isMultiDisplay()) { - if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { - Log.i("emArrow","Driver start"); - ochProvider = (IMoGoFunctionProvider) ARouter.getInstance() - .build("/driver/api") - .navigation(getContext()); - } else if(AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)){ - Log.i("emArrow","Passenger start"); - ochProvider = (IMoGoFunctionProvider) ARouter.getInstance() - .build("/passenger/api") - .navigation(getContext()); - } else { - ochProvider = (IMoGoFunctionProvider) ARouter.getInstance() - .build("/driver/api") - .navigation(getContext()); - } + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + Log.i("emArrow","Driver start"); + ochProvider = (IMoGoFunctionProvider) ARouter.getInstance() + .build("/driver/api") + .navigation(getContext()); + } else if(AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)){ + Log.i("emArrow","Passenger start"); + ochProvider = (IMoGoFunctionProvider) ARouter.getInstance() + .build("/passenger/api") + .navigation(getContext()); } else { - // 目前只有金旅星辰乘客屏是连接的双屏 ochProvider = (IMoGoFunctionProvider) ARouter.getInstance() .build("/driver/api") .navigation(getContext()); diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainMoGoApplication.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainMoGoApplication.java index 3f574ac7ef..4fa08617f8 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainMoGoApplication.java +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainMoGoApplication.java @@ -9,6 +9,7 @@ import com.mogo.commons.AbsMogoApplication; import com.mogo.commons.debug.DebugConfig; import com.mogo.commons.module.MogoModule; import com.mogo.commons.module.MogoModulePaths; +import com.mogo.commons.storage.SharedPrefsMgr; import com.mogo.commons.utils.MogoAnalyticUtils; import com.mogo.eagle.core.data.config.FunctionBuildConfig; import com.mogo.eagle.core.data.constants.MogoServicePaths; diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bg_current_select_date.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bg_current_select_date.png new file mode 100644 index 0000000000..734b583af9 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bg_current_select_date.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bg_disk_copy.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bg_disk_copy.png new file mode 100644 index 0000000000..16eedd0bc3 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bg_disk_copy.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_cold_start_fault.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_cold_start_fault.png new file mode 100644 index 0000000000..207e8cb750 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_cold_start_fault.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_cold_start_soft.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_cold_start_soft.png new file mode 100644 index 0000000000..edaee7dd41 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_cold_start_soft.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_disk_copy_calendar.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_disk_copy_calendar.png new file mode 100644 index 0000000000..7e0d1496ae Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_disk_copy_calendar.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_disk_copy_exception.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_disk_copy_exception.png new file mode 100644 index 0000000000..3e1e27d6bd Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_disk_copy_exception.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_disk_copy_terminate.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_disk_copy_terminate.png new file mode 100644 index 0000000000..23b5882db7 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_disk_copy_terminate.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_disk_unplug_connected.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_disk_unplug_connected.png new file mode 100644 index 0000000000..ff96a8dc67 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_disk_unplug_connected.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_disk_unplug_copying.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_disk_unplug_copying.png new file mode 100644 index 0000000000..dd81604e4a Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_disk_unplug_copying.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_fsm_demo_mode_error.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_fsm_demo_mode_error.png new file mode 100644 index 0000000000..f61e1e87c5 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_fsm_demo_mode_error.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_forward.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_forward.png new file mode 100644 index 0000000000..968513dc7f Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_forward.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_forward_or_reverse.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_forward_or_reverse.png new file mode 100644 index 0000000000..56bf8cc9be Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_forward_or_reverse.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_forward_or_turn_left.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_forward_or_turn_left.png new file mode 100644 index 0000000000..d08eaa9931 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_forward_or_turn_left.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_forward_or_turn_right.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_forward_or_turn_right.png new file mode 100644 index 0000000000..81c87d5d65 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_forward_or_turn_right.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_forward_turn_left_reverse.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_forward_turn_left_reverse.png new file mode 100644 index 0000000000..d7ea9ff10f Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_forward_turn_left_reverse.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_forward_turn_left_right.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_forward_turn_left_right.png new file mode 100644 index 0000000000..52dae061eb Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_forward_turn_left_right.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_prohibit_reverse.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_prohibit_reverse.png new file mode 100644 index 0000000000..57306893b0 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_prohibit_reverse.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_prohibit_turn_left.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_prohibit_turn_left.png new file mode 100644 index 0000000000..b4f7f1035e Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_prohibit_turn_left.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_prohibit_turn_or_merge_right.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_prohibit_turn_or_merge_right.png new file mode 100644 index 0000000000..6c744f9e3c Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_prohibit_turn_or_merge_right.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_prohibit_turn_right.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_prohibit_turn_right.png new file mode 100644 index 0000000000..70bae333e6 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_prohibit_turn_right.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_reverse.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_reverse.png new file mode 100644 index 0000000000..c67794b0c8 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_reverse.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_turn_left.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_turn_left.png new file mode 100644 index 0000000000..a1f87490b2 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_turn_left.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_turn_left_or_reverse.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_turn_left_or_reverse.png new file mode 100644 index 0000000000..338a91596e Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_turn_left_or_reverse.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_turn_left_or_right.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_turn_left_or_right.png new file mode 100644 index 0000000000..d7ca57c0ea Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_turn_left_or_right.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_turn_or_merge_left.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_turn_or_merge_left.png new file mode 100644 index 0000000000..f713cb55f7 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_turn_or_merge_left.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_turn_or_merge_right.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_turn_or_merge_right.png new file mode 100644 index 0000000000..e1ee604896 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_turn_or_merge_right.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_turn_right.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_turn_right.png new file mode 100644 index 0000000000..00f5dfbb60 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_turn_right.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_turn_right_or_reverse.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_turn_right_or_reverse.png new file mode 100644 index 0000000000..4c11060a91 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_road_turn_right_or_reverse.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/map_download_bg.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/map_download_bg.png new file mode 100644 index 0000000000..a72e4bffdb Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/map_download_bg.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/map_download_failed.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/map_download_failed.png new file mode 100644 index 0000000000..836c37e05b Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/map_download_failed.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/map_download_success.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/map_download_success.png new file mode 100644 index 0000000000..4f0e9c4d3e Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/map_download_success.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_cold_start_fault_divider.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_cold_start_fault_divider.xml new file mode 100644 index 0000000000..c306e4fb9d --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_cold_start_fault_divider.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_disk_copy_date.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_disk_copy_date.xml new file mode 100644 index 0000000000..b221cde9cd --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_disk_copy_date.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_msg_box_toast_nde.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_msg_box_toast_nde.png new file mode 100644 index 0000000000..28169aeaea Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_msg_box_toast_nde.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_nde_road_recommend.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_nde_road_recommend.xml new file mode 100644 index 0000000000..6cdfd89974 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_nde_road_recommend.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_road_recommend_one.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_road_recommend_one.png new file mode 100644 index 0000000000..21dd9b8d2c Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_road_recommend_one.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_road_recommend_three.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_road_recommend_three.png new file mode 100644 index 0000000000..21dd9b8d2c Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_road_recommend_three.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_road_recommend_two.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_road_recommend_two.png new file mode 100644 index 0000000000..b4e6e33b69 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_road_recommend_two.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/pb_vertical_drawable.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/pb_vertical_drawable.xml new file mode 100644 index 0000000000..f36fa53a81 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/pb_vertical_drawable.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/progressbar_disk_copy_progress.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/progressbar_disk_copy_progress.xml new file mode 100644 index 0000000000..1a60062dd4 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/progressbar_disk_copy_progress.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/progressbar_disk_copy_progress_end.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/progressbar_disk_copy_progress_end.xml new file mode 100644 index 0000000000..f52ea1eff1 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/progressbar_disk_copy_progress_end.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/progressbar_disk_not_enough_space.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/progressbar_disk_not_enough_space.xml new file mode 100644 index 0000000000..6a5a76e902 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/progressbar_disk_not_enough_space.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/progressbar_disk_used_space.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/progressbar_disk_used_space.xml new file mode 100644 index 0000000000..cc0ecc22e4 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/progressbar_disk_used_space.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/rv_divider_line_road.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/rv_divider_line_road.xml new file mode 100644 index 0000000000..1173a22cdb --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/rv_divider_line_road.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/dialog_copy_bag_success.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/dialog_copy_bag_success.xml new file mode 100644 index 0000000000..2940522d05 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/dialog_copy_bag_success.xml @@ -0,0 +1,54 @@ + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/dialog_disk_copy_exception.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/dialog_disk_copy_exception.xml new file mode 100644 index 0000000000..ad97d82203 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/dialog_disk_copy_exception.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/dialog_terminate_copy_data.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/dialog_terminate_copy_data.xml new file mode 100644 index 0000000000..b436c4249a --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/dialog_terminate_copy_data.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_view_traffic_light_taxi_p.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_view_traffic_light_taxi_p.xml index 5289aecff1..139b12eb48 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_view_traffic_light_taxi_p.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_view_traffic_light_taxi_p.xml @@ -1,29 +1,29 @@ @@ -32,13 +32,13 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" - android:textSize="@dimen/hmi_traffic_light_time_size" + android:textSize="@dimen/sp_45" android:textStyle="bold" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toLeftOf="@id/hmi_traffic_light_divider" - android:layout_marginStart="@dimen/dp_116" + android:layout_marginStart="@dimen/dp_87" /> \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_ai_nde_road.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_ai_nde_road.xml new file mode 100644 index 0000000000..9232a72486 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_ai_nde_road.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_auto_exploration_p.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_auto_exploration_p.xml index 120efa9776..675d31bf7e 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_auto_exploration_p.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_auto_exploration_p.xml @@ -21,7 +21,7 @@ android:id="@+id/tvExplorationContent" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:textSize="@dimen/sp_22" + android:textSize="@dimen/sp_26" android:textColor="@color/auto_exploration_content_p" android:layout_marginStart="@dimen/dp_13" android:layout_gravity="center_vertical" diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_calendar_content.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_calendar_content.xml new file mode 100644 index 0000000000..dadbbcef31 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_calendar_content.xml @@ -0,0 +1,20 @@ + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_calendar_title.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_calendar_title.xml new file mode 100644 index 0000000000..50674f6b7b --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_calendar_title.xml @@ -0,0 +1,11 @@ + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_toast_nde.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_toast_nde.xml index c44a3b0348..8e5fcda9fc 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_toast_nde.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_toast_nde.xml @@ -2,9 +2,9 @@ @@ -16,6 +16,8 @@ app:layout_constraintLeft_toLeftOf="parent" android:src="@drawable/icon_nde" android:contentDescription="@string/msg_box_toast_icon" + android:layout_marginTop="@dimen/dp_50" + android:layout_marginStart="@dimen/dp_50" /> @@ -42,4 +45,14 @@ android:layout_marginTop="@dimen/dp_6" /> + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_nde_road.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_nde_road.xml new file mode 100644 index 0000000000..f74d45eac7 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_nde_road.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_passenger_nde.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_passenger_nde.xml new file mode 100644 index 0000000000..da101ee8c3 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_passenger_nde.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_passenger_nde_road.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_passenger_nde_road.xml new file mode 100644 index 0000000000..9a3be4e275 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_passenger_nde_road.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_car_info_tab.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_car_info_tab.xml index 214df8ce41..0d7505ac8e 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_car_info_tab.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_car_info_tab.xml @@ -194,7 +194,6 @@ app:layout_constraintBottom_toBottomOf="@+id/tvADVersion" app:layout_constraintRight_toRightOf="@+id/tvCarExit" app:layout_constraintTop_toTopOf="@+id/tvADVersion" - android:visibility="gone" /> + app:layout_constraintTop_toBottomOf="@+id/tvHDMapVersion" + app:layout_constraintRight_toRightOf="@id/tvCarExit" + /> + + + + + app:layout_constraintTop_toBottomOf="@+id/tvSlamMapVersion" /> + + + + + + + + + android:layout_height="wrap_content" + android:ellipsize="end" + android:maxLines="2" + android:minLines="2" /> + + + + +