Merge branch 'dev_robotaxi-d_250417_8.0.0' into 'master'

Dev robotaxi d 250417 8.0.0

See merge request SCA/L4HA/AndroidApp/MoGoEagleEye!874
This commit is contained in:
yangyakun
2025-06-03 03:08:09 +00:00
837 changed files with 22777 additions and 6974 deletions

View File

@@ -55,7 +55,7 @@ abstract class CharterBaseFragment<V : IView?, P : Presenter<V>?>() : 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)

View File

@@ -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

View File

@@ -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 {

View File

@@ -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 -> {}
}
}

View File

@@ -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)
}
}

View File

@@ -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)
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

View File

@@ -7,7 +7,7 @@
android:layout_marginTop="@dimen/dp_status_bar_height">
<!--高精地图-->
<com.mogo.eagle.core.function.view.MapBizView
android:id="@+id/mapBizView"
android:id="@+id/mHomeView"
app:isWeatherEnable="false"
app:locationIcon3DRes="@raw/m1"
android:layout_width="match_parent"
@@ -197,7 +197,7 @@
android:layout_width="@dimen/dp_142"
android:layout_height="@dimen/dp_142"/>
<com.mogo.och.bridge.ui.drawline.LineView
<com.magic.mogo.och.charter.view.view.drawline.LineView
android:id="@+id/lineView"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toRightOf="@id/reportworkorderview"
@@ -309,5 +309,16 @@
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<!--数据落盘-->
<com.mogo.eagle.core.function.hmi.ui.diskcopy.DiskCopyView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_180"
android:layout_marginEnd="@dimen/dp_23"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:visibility="gone"
/>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -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)
}
}

View File

@@ -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<MainFragment?, BusPassengerPresenter?>(), 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<MainFragment?, BusPassengerPresenter?>(), 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<MainFragment?, BusPassengerPresenter?>(), 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)

View File

@@ -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)
}

View File

@@ -51,7 +51,6 @@ class MusicListViewModel : ViewModel(),
}
override fun onMusicCompletion(musicData: MusicData) {
super.onMusicCompletion(musicData)
UiThreadHandler.post({
viewCallback?.updateMusicData(musicData, musicData)
}, UiThreadHandler.MODE.QUEUE)

View File

@@ -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

View File

@@ -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()
}
}

View File

@@ -5,7 +5,7 @@
android:layout_height="match_parent">
<com.mogo.och.charter.passenger.ui.map.BizMapView
android:id="@+id/mapBizView"
android:id="@+id/mHomeView"
android:layout_width="0dp"
app:layout_constraintWidth_percent="0.6045"
android:layout_height="match_parent"
@@ -21,7 +21,7 @@
app:isClearArrived="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/mapBizView"
app:layout_constraintStart_toEndOf="@+id/mHomeView"
app:layout_constraintTop_toTopOf="parent"
app:mapStyleExtraPath="m1_style_extra.data"
app:mapStylePath="m1_style.data"
@@ -56,7 +56,7 @@
android:layout_height="@dimen/dp_100"
android:layout_marginBottom="@dimen/dp_180"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@+id/mapBizView"
app:layout_constraintEnd_toEndOf="@+id/mHomeView"
app:layout_constraintStart_toStartOf="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" />
<!--锁定状态和解锁入口-->

View File

@@ -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

View File

@@ -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<LoginInfo2Client> {
override fun targetLan(): Class<LoginInfo2Client> {
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()
}
}

View File

@@ -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<LoginInfo>(loginInfoKey)
}
return loginInfo
}
fun getOchBizInfo(): OchBizInfo? {
supply6100()
d(tag, "getOchBizInfo")
if (ochBizInfo == null) {
this.ochBizInfo = getInfoFromSp<OchBizInfo>(OCHBIZINFOKEY)
}
return ochBizInfo
}
fun getOchCarInfo(): OchCarInfo? {
supply6100()
d(tag, "getOchCarInfo")
if (ochCarInfo == null) {
this.ochCarInfo = getInfoFromSp<OchCarInfo>(OCHCARINFOKEY)
}
return ochCarInfo
}
fun getOchLoginInfo(): OchLoginInfo? {
supply6100()
d(tag, "getOchLoginInfo")
if (ochLoginInfo == null) {
this.ochLoginInfo = getInfoFromSp<OchLoginInfo>(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 <reified T> 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<String, Any> = 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)
}
}
}

View File

@@ -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

View File

@@ -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
}
}

View File

@@ -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

View File

@@ -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(){}
}

View File

@@ -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<BaseData> {
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<DriverStatusQueryRespBean> {
override fun onSuccess(data: DriverStatusQueryRespBean?) {
OchCommonServiceManager.queryDriverServiceStatus(
it,
object : OchCommonServiceCallback<DriverStatusQueryRespBean> {
override fun onSuccess(data: DriverStatusQueryRespBean) {
val map: MutableMap<String, Any> = HashMap()
map["msg"] = data.toString()
MogoAnalyticUtils.track("QueryCarStatus",map)
go2LoginInfo(data,"接口获取")
MogoAnalyticUtils.track("QueryCarStatus", map)
go2LoginInfo(data.data, "接口获取")
}
override fun onError() {
val map: MutableMap<String, Any> = 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<String, Any> = 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<BaseData> {
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)
}
}

View File

@@ -77,7 +77,7 @@ object OchCommonServiceManager {
location4Login: TaxiLoginReqBean.Location4Login,
callback: OchCommonServiceCallback<TaxiLoginRespBean>?
) {
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<BaseData>?
) {
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,

View File

@@ -26,7 +26,6 @@ class LoginPassengerPresenter(view: LoginPassengerFragment?) : Presenter<LoginPa
}
private fun initListeners() {
LoginModel.init(AbsMogoApplication.getApp())
LoginModel.setiTaxiLoginCallback(this)
BizLoopManager.setLoopFunction(TAG, LoopInfo(2,::showStatus))
}
@@ -45,12 +44,4 @@ class LoginPassengerPresenter(view: LoginPassengerFragment?) : Presenter<LoginPa
BizLoopManager.removeLoopFunction(TAG)
}
override fun getPhoneCodeSuccess() {
}
override fun netErrorCallback() {
}
}

View File

@@ -3,15 +3,20 @@ package com.mogo.och.biz.login.presenter
import androidx.lifecycle.LifecycleOwner
import com.mogo.commons.AbsMogoApplication
import com.mogo.commons.mvp.Presenter
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
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.RegexUtils
import com.mogo.eagle.core.utilcode.util.StringUtils
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.callback.ITaxiLoginCallback
import com.mogo.och.biz.login.ui.LoginFragment
import com.mogo.och.biz.login.model.LoginModel
import com.mogo.och.common.module.biz.login.ILoginCallback
import com.mogo.och.common.module.biz.login.LoginStatusManager
import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager
import com.mogo.och.common.module.wigets.toast.ToastCharterUtils
@@ -27,26 +32,30 @@ import java.util.concurrent.TimeUnit
*
* 描述
*/
class LoginPresenter(view: LoginFragment?) : Presenter<LoginFragment?>(view), ITaxiLoginCallback {
class LoginPresenter(view: LoginFragment?) : Presenter<LoginFragment?>(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<LoginFragment?>(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<LoginFragment?>(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<LoginFragment?>(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() {

View File

@@ -257,11 +257,7 @@ class LoginFragment : MvpFragment<LoginFragment?, LoginPresenter?>(), 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<LoginFragment?, LoginPresenter?>(), 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()

View File

@@ -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<LoginPassengerFragment?, LoginPassengerPresenter?>(),
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<String>()
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)<abs(screenWidth-width1920)){
// 使用2560的横屏配置
biz_cl_passenger_main?.setBackgroundResource(R.drawable.biz_login_passenger_2560x1600)
textSize = AutoSizeUtils.dp2px(context, 30f).toFloat()
marginBottom = AutoSizeUtils.dp2px(context, 70f)
CallerLogger.d(TAG,"width:${screenWidth}----height:${screenHeight}----001")
}else{
// 使用1920的横屏效果
biz_cl_passenger_main?.setBackgroundResource(R.drawable.biz_login_passenger_1920x1080)
textSize = AutoSizeUtils.dp2px(context, 28f).toFloat()
marginBottom = AutoSizeUtils.dp2px(context, 41f)
CallerLogger.d(TAG,"width:${screenWidth}----height:${screenHeight}----002")
}
}else{// 竖屏 使用1080 的横屏效果
biz_cl_passenger_main?.setBackgroundResource(R.drawable.biz_login_passenger_1080x1920)
textSize = AutoSizeUtils.dp2px(context, 28f).toFloat()
marginBottom = AutoSizeUtils.dp2px(context, 41f)
CallerLogger.d(TAG,"width:${screenWidth}----height:${screenHeight}----003")
}
return R.layout.biz_login_passenger_view_2560x1600
actv_connect_status?.setTextSize(TypedValue.COMPLEX_UNIT_PX,textSize)
actv_app_version?.setTextSize(TypedValue.COMPLEX_UNIT_PX,textSize)
val layoutParams = actv_app_version.layoutParams as ConstraintLayout.LayoutParams
layoutParams.bottomMargin = marginBottom
actv_app_version.layoutParams = layoutParams
}
override fun initViews() {
biz_cl_passenger_main = findViewById(R.id.biz_cl_passenger_main)
biz_actv_login_show_sn= findViewById(R.id.biz_actv_login_show_sn)
bv_switch_business= findViewById(R.id.bv_switch_business)
actv_app_version= findViewById(R.id.actv_app_version)
actv_connect_status= findViewById(R.id.actv_connect_status)
CallerLogger.d(TAG, "init")
actv_app_version?.text = FlavorUtils.getInfo()
if(BuildConfig.DEBUG) {
@@ -74,8 +94,7 @@ class LoginPassengerFragment : MvpFragment<LoginPassengerFragment?, LoginPasseng
true
}
}
CallerLogger.d(TAG, "init")
changeUi()
}
override fun createPresenter(): LoginPassengerPresenter {
@@ -87,14 +106,9 @@ class LoginPassengerFragment : MvpFragment<LoginPassengerFragment?, LoginPasseng
}
companion object {
val TAG = LoginPassengerFragment::class.java.simpleName
}
override fun showErrorInfo(errorInfo: String) {
}
override fun checkAllEnv(
reason:String
) {
@@ -103,7 +117,7 @@ class LoginPassengerFragment : MvpFragment<LoginPassengerFragment?, LoginPasseng
}
override fun updateStatus(status: String) {
statusList?.add(status)
statusList.add(status)
}
override fun onResume() {
@@ -134,5 +148,7 @@ class LoginPassengerFragment : MvpFragment<LoginPassengerFragment?, LoginPasseng
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
CallerLogger.d(TAG, newConfig)
AutoSizeCompat.autoConvertDensityOfGlobal(resources)
changeUi()
}
}

View File

@@ -10,11 +10,18 @@ import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.function.hmi.ui.setting.ToggleDebugView
import com.mogo.eagle.core.utilcode.kotlin.onClick
import com.mogo.eagle.core.utilcode.mogo.Product
import com.mogo.eagle.core.utilcode.mogo.Vehicle
import com.mogo.eagle.core.utilcode.util.GsonUtils
import com.mogo.och.biz.R
import com.mogo.och.common.module.biz.login.LoginStatusManager
import kotlinx.android.synthetic.main.biz_login_business_view.view.actv_business_bus
import com.mogo.och.biz.login.LoginServiceManager
import com.mogo.och.biz.login.bean.LoginInfo
import com.mogo.och.common.module.biz.login.EnumLoginStatus
import kotlinx.android.synthetic.main.biz_login_business_view.view.actv_business_bus_B1
import kotlinx.android.synthetic.main.biz_login_business_view.view.actv_business_bus_B2
import kotlinx.android.synthetic.main.biz_login_business_view.view.actv_business_charter
import kotlinx.android.synthetic.main.biz_login_business_view.view.actv_business_shuttle
import kotlinx.android.synthetic.main.biz_login_business_view.view.actv_business_shuttle_B1
import kotlinx.android.synthetic.main.biz_login_business_view.view.actv_business_shuttle_B2
import kotlinx.android.synthetic.main.biz_login_business_view.view.actv_business_sweeper
import kotlinx.android.synthetic.main.biz_login_business_view.view.actv_business_taxi
import kotlinx.android.synthetic.main.biz_login_business_view.view.actv_debugview
@@ -23,6 +30,8 @@ class BusinessView : ConstraintLayout, BusinessViewModel.IErrorInfoViewCallback
private val TAG = "ItineraryView"
private val tempLoginJson = "{\"brand\":\"东风\",\"businessStatus\":0,\"businessType\":9,\"carModel\":\"E70\",\"cityCode\":\"110000\",\"currentSite\":0,\"driverId\":0,\"driverStatus\":0,\"leaving\":false,\"lineId\":null,\"orderNo\":\"\",\"phone\":\"\",\"photos\":\"https://img.zhidaohulian.com/fileServer/defaultPath/d46c5a1a778313d997e77b67efdaf8cc/1080x1920_01.png\",\"plateNumber\":\"测123456\",\"purpose\":0,\"servingStatus\":0,\"shiftsId\":0,\"siteId\":0,\"sn\":\"20230712ED9M636\",\"taskDate\":0,\"taskId\":null,\"tenantId\":201779277258031992,\"vin\":\"20230712ED9M636\"}"
constructor(context: Context) : super(context)
constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet)
@@ -55,16 +64,26 @@ class BusinessView : ConstraintLayout, BusinessViewModel.IErrorInfoViewCallback
viewModel?.setDistanceCallback(this)
actv_business_shuttle.onClick { swtichBusiness(Product.SHUTTLE) }
actv_business_bus.onClick { swtichBusiness(Product.BUS) }
actv_business_taxi.onClick { swtichBusiness(Product.TAXI) }
actv_business_charter.onClick { swtichBusiness(Product.CHARTER) }
actv_business_shuttle_B1.onClick { swtichBusiness(Product.SHUTTLE, Vehicle.B1) }
actv_business_shuttle_B2.onClick { swtichBusiness(Product.SHUTTLE,Vehicle.B2) }
actv_business_bus_B1.onClick { swtichBusiness(Product.BUS,Vehicle.B1) }
actv_business_bus_B2.onClick { swtichBusiness(Product.BUS,Vehicle.B2) }
actv_business_taxi.onClick { swtichBusiness(Product.TAXI,Vehicle.T1T2) }
actv_business_charter.onClick { swtichBusiness(Product.CHARTER,Vehicle.M1) }
actv_business_sweeper.onClick { swtichBusiness(Product.SWEEPER,Vehicle.C1) }
actv_debugview.onClick { ToggleDebugView.toggleDebugView.toggle(context) }
}
private fun swtichBusiness(businessEnum: Product) {
LoginStatusManager.invokeLBusinessTypeChangeDebug(businessEnum)
visibility = GONE
private fun swtichBusiness(businessEnum: Product, vehicle: Vehicle) {
var loginInfo = LoginServiceManager.getLoginInfo()
if(loginInfo==null) {
loginInfo = GsonUtils.fromJson(tempLoginJson, LoginInfo::class.java)
}
loginInfo?.driverStatus = EnumLoginStatus.Login.code
loginInfo?.businessType = businessEnum.code
loginInfo?.carModel = vehicle.code
LoginServiceManager.setLoginInfo(loginInfo!!)
FunctionBuildConfig.ochdebug = true
}
@@ -78,31 +97,10 @@ class BusinessView : ConstraintLayout, BusinessViewModel.IErrorInfoViewCallback
}
fun selectBusniess() {
visibility = VISIBLE
actv_business_shuttle.visibility = GONE
actv_business_bus.visibility = GONE
actv_business_taxi.visibility = GONE
actv_business_charter.visibility = GONE
FunctionBuildConfig.supportBusiness.forEach {
when (it) {
"shuttle" -> {
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
}
}

View File

@@ -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<String, String>): 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<String, String> {
val params: MutableMap<String, String> = 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
}
}

View File

@@ -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
}
}

View File

@@ -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<String, StateChangeListener> =
ConcurrentHashMap()
private val stateChanageListeners: ConcurrentHashMap<String, StateChangeListener> = 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<WriteOffDevicesMsg> {
override fun targetLan(): Class<WriteOffDevicesMsg> = 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<String, String>()
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
}

View File

@@ -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<WriteOffDevicesMsg> {
override fun targetLan(): Class<WriteOffDevicesMsg> = 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,
""
)
)
)
}
}
}
}
}

View File

@@ -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("皮肤信息","请求皮肤信息")

View File

@@ -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

View File

@@ -1,19 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="@dimen/dp_200"
android:layout_height="@dimen/dp_400"
android:layout_width="@dimen/dp_300"
android:layout_height="@dimen/dp_680"
android:orientation="vertical"
android:background="@drawable/biz_login_error_info">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/actv_business_bus"
android:id="@+id/actv_business_bus_B1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:paddingTop="@dimen/dp_20"
android:paddingBottom="@dimen/dp_20"
android:text="公交模式"
android:text="公交模式B1"
android:textColor="@color/white"
app:layout_constraintBottom_toTopOf="@+id/actv_business_charter"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/actv_business_bus_B2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:paddingTop="@dimen/dp_20"
android:paddingBottom="@dimen/dp_20"
android:text="公交模式B2"
android:textColor="@color/white"
app:layout_constraintBottom_toTopOf="@+id/actv_business_charter"
app:layout_constraintEnd_toEndOf="parent"
@@ -35,19 +50,34 @@
app:layout_constraintTop_toBottomOf="@+id/actv_business_bus" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/actv_business_shuttle"
android:id="@+id/actv_business_shuttle_B1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="@dimen/dp_20"
android:paddingBottom="@dimen/dp_20"
android:gravity="center"
android:text="接驳模式"
android:text="接驳模式B1"
android:textColor="@color/white"
app:layout_constraintBottom_toTopOf="@+id/actv_business_taxi"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/actv_business_charter" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/actv_business_shuttle_B2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="@dimen/dp_20"
android:paddingBottom="@dimen/dp_20"
android:gravity="center"
android:text="接驳模式B2"
android:textColor="@color/white"
app:layout_constraintBottom_toTopOf="@+id/actv_business_taxi"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/actv_business_charter" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/actv_business_taxi"
android:layout_width="match_parent"
@@ -57,10 +87,25 @@
android:gravity="center"
android:text="出租车模式"
android:textColor="@color/white"
app:layout_constraintBottom_toBottomOf="@+id/actv_debugview"
app:layout_constraintBottom_toBottomOf="@+id/actv_business_sweeper"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/actv_business_shuttle" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/actv_business_sweeper"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="@dimen/dp_20"
android:paddingBottom="@dimen/dp_20"
android:gravity="center"
android:text="清扫车模式"
android:textColor="@color/white"
app:layout_constraintBottom_toTopOf="@+id/actv_debugview"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/actv_business_taxi" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/actv_debugview"
android:layout_width="match_parent"
@@ -73,7 +118,7 @@
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/actv_business_taxi" />
app:layout_constraintTop_toBottomOf="@+id/actv_business_sweeper" />
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>

View File

@@ -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"

View File

@@ -1,73 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/biz_cl_passenger_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/biz_login_passenger_1080x1920"
app:isUseSkin="true">
<androidx.appcompat.widget.AppCompatTextView
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:layout_marginStart="@dimen/dp_160"
android:layout_marginEnd="@dimen/dp_160"
android:textSize="@dimen/dp_30"
app:layout_constraintBottom_toTopOf="@+id/actv_app_version"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/actv_app_version"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/dp_41"
android:layout_marginStart="@dimen/dp_160"
android:layout_marginEnd="@dimen/dp_160"
android:gravity="center"
android:text="版本号:6.4.0"
android:textColor="@color/white"
android:textSize="@dimen/dp_30"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
<com.mogo.och.biz.login.ui.errorview.ErrorInfoView
android:id="@+id/eiv_Info"
android:layout_width="@dimen/dp_751"
android:layout_height="wrap_content"
android:visibility="gone"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<com.mogo.och.biz.login.ui.debugview.BusinessView
android:id="@+id/bv_switch_business"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/biz_actv_login_show_sn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/dp_50"
android:layout_marginBottom="@dimen/dp_40"
android:textColor="@android:color/white"
android:textSize="@dimen/dp_30"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -1,76 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/biz_cl_passenger_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/biz_login_passenger_1920x1080"
app:isUseSkin="true">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/actv_connect_status"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintBottom_toTopOf="@+id/actv_app_version"
android:text="当前状态:连接司机屏中"
android:textColor="@color/white"
android:layout_marginStart="@dimen/dp_160"
android:layout_marginEnd="@dimen/dp_160"
android:textSize="@dimen/dp_28"
android:gravity="center"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toStartOf="parent" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/actv_app_version"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/dp_41"
android:layout_marginStart="@dimen/dp_160"
android:layout_marginEnd="@dimen/dp_160"
android:text="版本号:6.4.0"
android:gravity="center"
android:textColor="@color/white"
android:textSize="@dimen/dp_28"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
/>
<com.mogo.och.biz.login.ui.errorview.ErrorInfoView
android:id="@+id/eiv_Info"
android:layout_width="@dimen/dp_939"
android:layout_height="wrap_content"
android:visibility="gone"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<com.mogo.och.biz.login.ui.debugview.BusinessView
android:id="@+id/bv_switch_business"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/biz_actv_login_show_sn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/dp_50"
android:layout_marginBottom="@dimen/dp_40"
android:textColor="@android:color/white"
android:textSize="@dimen/dp_30"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -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)
}
}

View File

@@ -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

View File

@@ -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<BridgeListener>() {
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<MogoLocation>){
M_LISTENERS.forEach {
it.value.onTrajectoryPointsListener(trajectoryList)
}
}
fun invokeTrajectoryDistance(distance:Double){
M_LISTENERS.forEach {
it.value.onTrajectoryDistanceListener(distance)
}
}
fun invokeTrajectoryPointAndDistance(trajectoryList: MutableList<MogoLocation>,distance:Double){
M_LISTENERS.forEach {
it.value.onTrajectoryPointsAndDistanceListener(trajectoryList, distance)
}
}
}

View File

@@ -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,"超时设置为falsehaveTrajectoryInfo ${haveTrajectoryInfo}")
}
if(System.currentTimeMillis() - predictionTime>2_000){
havePredictionInfo = false
CallerLogger.d(TAG,"超时设置为falsehavePredictionInfo ${havePredictionInfo}")
}
}
fun invokePlanningListener(haveTrajectoryInfos:Boolean){
this.haveTrajectoryInfo = haveTrajectoryInfos
}
fun invokePredictionHaveData(havePredictionInfos:Boolean){
this.havePredictionInfo = havePredictionInfos
}
fun invokeTrajectoryPoints(trajectoryList: MutableList<MogoLocation>){
this.bridgeService?.invokeTrajectoryPoints(trajectoryList)
}
fun invokeTrajectoryDistance(distance:Double){
this.bridgeService?.invokeTrajectoryDistance(distance)
}
fun invokeTrajectoryPointsAndDistance(trajectoryList: MutableList<MogoLocation>,distance:Double){
this.bridgeService?.invokeTrajectoryPointAndDistance(trajectoryList, distance)
}
}

View File

@@ -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<IOchAutopilotStatusListene
reason: String?
) {
super.onAutopilotIpcConnectStatusChanged(status, reason)
if (!CallerAutoPilotStatusListenerManager.isConnect()) {// 工控机断开了
OchAutopilotAnalytics.cancleStartAutopilot()
}
M_LISTENERS.forEach {
val listener = it.value
listener.onAutopilotIpcConnectStatusChanged(status,reason)

View File

@@ -265,6 +265,13 @@ object OchAutopilotAnalytics {
MogoAnalyticUtils.track(getEventKeyClickStartAutopilot(), params)
}
/**
* 取消自驾15s等待
*/
fun cancleStartAutopilot(){
RxUtils.disposeSubscribe(timeOutDisposable)
}
// 无人化taxi event_key_unmanned_taxi_start_service *
// bus event_key_och_bus_start_service *
// shuttle event_key_och_bus_start_service *

View File

@@ -391,7 +391,11 @@ object LineManager : CallerBase<ILineCallback>() {
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

View File

@@ -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>(),
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<MessagePad.TrajectoryPoint>) {
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)
}
}
}

View File

@@ -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)
}
}

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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<ITrajectoryListListener>(),IMoGoPlanningRottingListener {
object TrajectoryManager : CallerBase<ITrajectoryListListener>(), IMoGoPlanningRottingListener {
const val TAG = "TrajectoryManager"
private val downLoadSuccessLineIds = mutableListOf<Long>()
@@ -41,7 +42,7 @@ object TrajectoryManager : CallerBase<ITrajectoryListListener>(),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<ITrajectoryListListener>(),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<ITrajectoryListListener>(),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() {
}
}

View File

@@ -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

View File

@@ -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()

View File

@@ -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<MogoLocation>){}
fun onTrajectoryDistanceListener(distance: Double){}
fun onTrajectoryPointsAndDistanceListener(trajectoryList: MutableList<MogoLocation>,distance: Double){}
}

View File

@@ -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)
}
}

View File

@@ -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)
}

View File

@@ -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<DevicesInfo>()
// 接受到客户端注册信息后立即返回业务模式
private val registerListener = object : ILanMessageListener<BaseDPMsg> {
@@ -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!!,

View File

@@ -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<IOchLanPassengerStatusListener>() {
@@ -35,7 +25,7 @@ object LoginLanPassengerSocket : IReceivedMsgListener, CallerBase<IOchLanPasseng
// 司机屏发生变化
val msg = BaseDPMsg(type = DPMsgType.TYPE_CLIENT_REGISTER.type)
LanSocketManager.sendMsgToServer(msg)
LoginStatusManager.changeStatus("sn 变化 连接成功 司机SN:${newV}")
LoginStatusManager.changeStatus("sn 变化 连接成功 司机SN:${oldV}---->${newV}")
if(newV.isNotEmpty()){
OchChainLogManager.writeChainLogNetLanSocketConnect("局域网socket链接状态","sn 变化 已连接 sn${newV}")
}
@@ -83,73 +73,12 @@ object LoginLanPassengerSocket : IReceivedMsgListener, CallerBase<IOchLanPasseng
override fun onLanMsgReceived(first: EnvCheck?) {
first?.let {
val checkEnv = checkEnv(first.projectType, first.envType, first.vehicleType, first.businessType)
if (first.sourceScreenType== ScreenType.Driver) {
driverSn = first.sourceSn
}
if(checkEnv){
}else{
CallerLogger.d(TAG, "乘客屏 收到消息 检测环境不支持:${LoginStatusEnum.Logout}")
LoginStatusManager.setLoginStatus(LoginStatusEnum.Logout)
}
}
}
}
private fun checkEnv(
projectType: ProjectType,
envType: EnvType,
vehicleType: VehicleType,
businessType: BusinessType
): Boolean {
return LoginStatusManager.checkAllEnv(projectType, envType, vehicleType, businessType)
}
// 环境监测+业务展示和跳转
private val changeBusinessType = object : ILanMessageListener<ChangeBusinessType> {
override fun targetLan(): Class<ChangeBusinessType> {
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<IOchLanPasseng
DPMsgType.TYPE_ENV_CHECK.type,
checkListener
)
// 乘客屏监听司机端发送的业务修改通知(
LanSocketManager.registerSocketMessageListener(
DPMsgType.TYPE_CHANGE_BUSINESS_TYPE.type,
changeBusinessType
)
}
override fun onReceivedMsg(type: Int, byteArray: ByteArray) {}

View File

@@ -0,0 +1,29 @@
package com.mogo.och.common.module.biz.lansocket.bean
import com.mogo.och.common.module.manager.socket.lan.bean.ScreenType
import com.mogo.och.common.module.utils.DateTimeUtil
data class DevicesInfo(
val screenType: ScreenType,// 屏幕类型
val sn: String,// 屏幕sn
val msgVersion:Int,
var registerTime: Long = DateTimeUtil.getCurrentTimeStamp(),//注册时间
){
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false
other as DevicesInfo
if (sn != other.sn) return false
if (msgVersion != other.msgVersion) return false
return true
}
override fun hashCode(): Int {
var result = sn.hashCode()
result = 31 * result + msgVersion
return result
}
}

View File

@@ -8,14 +8,14 @@ package com.mogo.och.common.module.biz.login
* 10 已登录,
* 20 已登出,
*/
enum class LoginStatusEnum(val code: Int) {
enum class EnumLoginStatus(val code: Int) {
None( -1 ),
Login( 1),
Logout( 0),;
companion object {
@JvmStatic
fun valueOf(code: Int): LoginStatusEnum? {
fun valueOf(code: Int): EnumLoginStatus {
for (value in values()) {
if (value.code == code) {
return value

View File

@@ -8,14 +8,14 @@ package com.mogo.och.common.module.biz.login
* 10 接单状态 可接单,
* 20 暂停接到哪 不可接单,
*/
enum class OpenOrderStatusEnum(val code: Int) {
enum class EnumOpenOrderStatus(val code: Int) {
UnOrdering( 0 ),
Ordering( 1),
None( -1),;
companion object {
@JvmStatic
fun valueOf(code: Int): OpenOrderStatusEnum {
fun valueOf(code: Int): EnumOpenOrderStatus {
for (value in values()) {
if (value.code == code) {
return value

View File

@@ -4,7 +4,7 @@ package com.mogo.och.common.module.biz.login
* Created on 2021/12/7
* 1 运营, 2 测试, 3演示
*/
enum class RoleEnum(val code: Int) {
enum class EnumRole(val code: Int) {
None( 0),
OPERATION( 1),
TEST( 2),
@@ -13,13 +13,13 @@ enum class RoleEnum(val code: Int) {
companion object {
@JvmStatic
fun valueOf(code: Int?): RoleEnum {
for (value in RoleEnum.values()) {
fun valueOf(code: Int?): EnumRole {
for (value in EnumRole.values()) {
if (value.code == code) {
return value
}
}
return RoleEnum.None
return EnumRole.None
}
}
}

View File

@@ -2,18 +2,21 @@ package com.mogo.och.common.module.biz.login;
import com.mogo.eagle.core.data.enums.Carmodel;
import com.mogo.eagle.core.utilcode.mogo.Product;
import com.mogo.eagle.core.utilcode.mogo.Vehicle;
public interface ILoginCallback {
default void onStatusChange(LoginStatusEnum currentStatus){}
default void onLoginStatusChange(EnumLoginStatus currentStatus){}
default void onCarModelChange(Carmodel currentStatus){}
default void onBusinessChange(Product businessEnum){}
default void onProductChange(Product businessEnum){}
default void onOpenOrderStatusEnumChange(OpenOrderStatusEnum businessEnum){}
default void onVehicleChage(Vehicle vehicle){}
default void onBusinessChangeDebug(Product businessEnum){}
default void onOpenOrderStatusEnumChange(EnumOpenOrderStatus businessEnum){}
default void onTenantIdChange(Long tenantId){}
default void onLoginErrorInfo(int code,String msg){}

View File

@@ -1,278 +0,0 @@
package com.mogo.och.common.module.biz.login;
import java.util.Objects;
public class LoginInfo {
private int driverStatus; //1登录0登出
private int servingStatus;//1接单中0暂停接单
private int businessType; //9: taxi. 10: bus公交 11:接驳 13:包车
private String orderNo;
private int purpose; // 1 运营, 2 测试, 3演示
private String sn;
private String plateNumber;//车牌号
private String phone;//手机号
private Long lineId;//线路id
private Long taskId;//任务id
private Long siteId;//站点id 包车使用
private Long currentSite;//当前站点 接驳、公交、班车使用
private Boolean leaving;// 当前站点是否出发
private Long shiftsId;//模板id
private Long taskDate;// 任务或模板的日期
private String vin;//车辆唯一识别码
private String cityCode;//城市编码
private String brand;//东风
//
// E70 东风 H9 红旗
// B2 B1 M1
private String carModel;
private String photos;//车身照片:
private long tenantId;//租户id:
private long driverId;
private long businessStatus;//?????
public int getDriverStatus() {
return driverStatus;
}
public void setDriverStatus(int driverStatus) {
this.driverStatus = driverStatus;
}
public String getOrderNo() {
return orderNo;
}
public void setOrderNo(String orderNo) {
this.orderNo = orderNo;
}
public int getPurpose() {
return purpose;
}
public void setPurpose(int purpose) {
this.purpose = purpose;
}
public String getSn() {
return sn;
}
public void setSn(String sn) {
this.sn = sn;
}
public String getPlateNumber() {
return plateNumber;
}
public void setPlateNumber(String plateNumber) {
this.plateNumber = plateNumber;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public int getServingStatus() {
return servingStatus;
}
public void setServingStatus(int servingStatus) {
this.servingStatus = servingStatus;
}
public int getBusinessType() {
return businessType;
}
public void setBusinessType(int businessType) {
this.businessType = businessType;
}
public String getVin() {
return vin;
}
public void setVin(String vin) {
this.vin = vin;
}
public String getCityCode() {
return cityCode;
}
public void setCityCode(String cityCode) {
this.cityCode = cityCode;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getCarModel() {
return carModel;
}
public void setCarModel(String carModel) {
this.carModel = carModel;
}
public String getPhotos() {
return photos;
}
public void setPhotos(String photos) {
this.photos = photos;
}
public long getTenantId() {
return tenantId;
}
public void setTenantId(long tenantId) {
this.tenantId = tenantId;
}
public long getDriverId() {
return driverId;
}
public void setDriverId(long driverId) {
this.driverId = driverId;
}
public long getBusinessStatus() {
return businessStatus;
}
public void setBusinessStatus(long businessStatus) {
this.businessStatus = businessStatus;
}
public Long getCurrentSite() {
return currentSite;
}
public void setCurrentSite(Long currentSite) {
this.currentSite = currentSite;
}
public Boolean getLeaving() {
return leaving;
}
public void setLeaving(Boolean leaving) {
this.leaving = leaving;
}
public Long getTaskDate() {
return taskDate;
}
public void setTaskDate(Long taskDate) {
this.taskDate = taskDate;
}
public Long getLineId() {
return lineId;
}
public void setLineId(Long lineId) {
this.lineId = lineId;
}
public Long getTaskId() {
return taskId;
}
public void setTaskId(Long taskId) {
this.taskId = taskId;
}
public Long getSiteId() {
return siteId;
}
public void setSiteId(Long siteId) {
this.siteId = siteId;
}
public Long getShiftsId() {
return shiftsId;
}
public void setShiftsId(Long shiftsId) {
this.shiftsId = shiftsId;
}
@Override
public String toString() {
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
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
LoginInfo loginInfo = (LoginInfo) o;
return driverStatus == loginInfo.driverStatus && servingStatus == loginInfo.servingStatus && businessType == loginInfo.businessType && purpose == loginInfo.purpose && tenantId == loginInfo.tenantId && driverId == loginInfo.driverId && businessStatus == loginInfo.businessStatus && Objects.equals(orderNo, loginInfo.orderNo) && Objects.equals(sn, loginInfo.sn) && Objects.equals(plateNumber, loginInfo.plateNumber) && Objects.equals(phone, loginInfo.phone) && Objects.equals(lineId, loginInfo.lineId) && Objects.equals(taskId, loginInfo.taskId) && Objects.equals(siteId, loginInfo.siteId) && Objects.equals(vin, loginInfo.vin) && Objects.equals(cityCode, loginInfo.cityCode) && Objects.equals(brand, loginInfo.brand) && Objects.equals(carModel, loginInfo.carModel) && Objects.equals(photos, loginInfo.photos);
}
@Override
public int hashCode() {
int 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 + Long.hashCode(tenantId);
result = 31 * result + Long.hashCode(driverId);
result = 31 * result + Long.hashCode(businessStatus);
return result;
}
}

View File

@@ -2,49 +2,76 @@ package com.mogo.och.common.module.biz.login
import com.mogo.eagle.core.data.enums.Carmodel
import com.mogo.eagle.core.utilcode.mogo.Product
import com.mogo.eagle.core.utilcode.mogo.Vehicle
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.biz.provider.CommonService
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
import com.mogo.och.common.module.manager.socket.lan.bean.VehicleType
interface LoginService :CommonService {
fun setLoginInfo(loginInfo: LoginInfo)
fun getLoginInfo():LoginInfo?
fun getPurpose():RoleEnum
/**
* 获取登录新形象
*/
fun getOchLoginInfo():OchLoginInfo?
/**
* 获取业务信息
*/
fun getOchBizInfo():OchBizInfo?
/**
* 获取车辆信息
*/
fun getOchCarInfo():OchCarInfo?
/**
* 设置角色
*/
fun getPurpose():EnumRole
/**
* 判断是否登录
*/
fun isLogin():Boolean
fun getLoginStatus(): LoginStatusEnum
fun getCarModel(): Carmodel
fun setLoginStatus(loginStatus: LoginStatusEnum)
fun setLoginStatus(status: Int)
fun setBusinessType(type: Int)
fun getBusinessType(): Product
/**
* 获取登录状态
*/
fun getLoginStatus(): EnumLoginStatus
/**
* 获取车辆模型
*/
fun getCarModelType(): Carmodel
/**
* 获取业务模式
*/
fun getProductType(): Product
/**
* 通过网络获取登录状态
* @param readCatche true:先使用缓存同时网络请求也存在 false:只是用缓存
*/
fun queryLoginStatusByNet(readCatche:Boolean=false)
/**
* 登出
*/
fun loginOut()
fun checkBusiness(businessType: Int): Boolean
fun checkAllEnv(
projectType: ProjectType,
envType: EnvType,
vehicleType: VehicleType,
businessType: BusinessType
): Boolean
fun changeStatus(currentStatus: String)
fun setOpenOrderStatusType(type: Int)
fun getOpenOrderStatusType(): OpenOrderStatusEnum
fun getOpenOrderStatusType(): EnumOpenOrderStatus
fun isOpenOrderType(): Boolean
fun removeLoginInfo()
fun getVehicleType(): Vehicle
fun sendLogin2Client()
}

View File

@@ -1,22 +1,18 @@
package com.mogo.och.common.module.biz.login
import android.util.Log
import androidx.fragment.app.Fragment
import com.alibaba.android.arouter.launcher.ARouter
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.enums.Carmodel
import com.mogo.eagle.core.utilcode.mogo.Product
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.Vehicle
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.constant.OchCommonConst
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.bean.BusinessType
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.VehicleType
import com.mogo.och.common.module.utils.CallerBase
import io.reactivex.schedulers.Schedulers
object LoginStatusManager : CallerBase<ILoginCallback>() {
@@ -24,7 +20,6 @@ object LoginStatusManager : CallerBase<ILoginCallback>() {
ARouter.getInstance().build(OchCommonConst.BIZ_LOGIN).navigation() as LoginService
private var TAG = "LoginStatusManager"
private var TAGLoopStatus = "LoginStatusManagerLoop"
@JvmStatic
fun getFragment():Fragment {
@@ -33,6 +28,7 @@ object LoginStatusManager : CallerBase<ILoginCallback>() {
}
throw ClassNotFoundException("没有找到登录Fragment");
}
@JvmStatic
fun resetFragment(){
loginService?.let {
@@ -49,51 +45,57 @@ object LoginStatusManager : CallerBase<ILoginCallback>() {
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<ILoginCallback>() {
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<ILoginCallback>() {
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<ILoginCallback>() {
}
}
/**
* 车辆模型变化通知
*/
fun invokeCarModelChange(carModel: Carmodel) {
M_LISTENERS.forEach {
val listener = it.value
@@ -222,5 +214,12 @@ object LoginStatusManager : CallerBase<ILoginCallback>() {
}
}
fun invokeTenantIdChange(tenantId: Long) {
M_LISTENERS.forEach {
val listener = it.value
listener.onTenantIdChange(tenantId)
}
}
}

View File

@@ -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,
)

View File

@@ -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?,
)

View File

@@ -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?,
)

View File

@@ -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()
// 删除正在运行的数据

View File

@@ -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业务使用 开始站点名称
)

View File

@@ -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
}

View File

@@ -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)
}
}

View File

@@ -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(){}
}

View File

@@ -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

View File

@@ -0,0 +1,6 @@
package com.mogo.och.common.module.biz.scanner
interface StateChangeListener {
fun stateChange(newBindValue: BindStatus, newOpentValue: OpenStatus){}
fun parseData(qrBean: QrBean){}
}

View File

@@ -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"

View File

@@ -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}")
}

View File

@@ -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<MusicData>()
try {
val datas: MusicDataList = GsonUtils.fromJson(
FunctionBuildConfig.musicUrlConfig, object : TypeToken<MusicDataList>() {}.type
)
localAdDataList.addAll(datas.musics)
localAdDataList.addAll(MediaBeanManager.getMusicList())
} catch (e: Exception) {
e.printStackTrace()
}

View File

@@ -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]

View File

@@ -1,8 +1,5 @@
package com.mogo.och.common.module.manager.audition
data class MusicDataList(val musics: MutableList<MusicData>)
/**
* 音乐文件
*/
@@ -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()
}
}
/**

View File

@@ -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)
}

View File

@@ -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<WriteOffDevicesMsg> {
override fun targetLan(): Class<WriteOffDevicesMsg> = 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)
}
}

View File

@@ -1,6 +0,0 @@
package com.mogo.och.common.module.manager.scnner
interface StateChangeListener {
fun stateChange(newBindValue: BindStatus, newOpentValue: OpenStatus){}
fun parseData(params: MutableMap<String, String>, payload: String?){}
}

View File

@@ -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<ScreenType> =
if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) {
mutableListOf(ScreenType.Passenger, ScreenType.Guide)

View File

@@ -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); //客户端注册 服务端需要
}

View File

@@ -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 {

View File

@@ -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<T : BaseData> : Function<T, ObservableSource<T>> {
override fun apply(baseData: T): ObservableSource<T> {
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)

View File

@@ -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<Observable<Throwable?>, ObservableSource<Any?>> {
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<Throwable?>): ObservableSource<Any?>? {
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)

View File

@@ -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
}
}

View File

@@ -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);
}
}

View File

@@ -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)
}

View File

@@ -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 设置外边框颜色和宽度
*
* <p>
*/
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()
}
}

View File

@@ -37,6 +37,8 @@ class CommonFeedbackDialog : BaseFloatDialog, LifecycleObserver {
Status.fail -> {
ivFeedbackStatus.setImageResource(R.drawable.common_feedback_fail)
}
else -> {}
}
RxUtils.createSubscribe(1_000) {
hide()

View File

@@ -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()) {

View File

@@ -175,6 +175,8 @@ class SeekBarView : ConstraintLayout, VisualViewModel.IVisualCallback {
duration = 100
}.start()
}
else -> {}
}
}

View File

@@ -88,6 +88,8 @@ class VisualViewModel : ViewModel(),
Visualangle.UnChange -> {
viewCallback?.setUnableChange()
}
else -> {}
}
}

View File

@@ -1,14 +1,106 @@
package com.mogo.och.common.module.wigets.media
data class MediaDataList(val medias: MutableList<MediaItem>)
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<MusicData> {
if (datasGlobal == null) {
datasGlobal = GsonUtils.fromJson(
FunctionBuildConfig.mediaUrlConfig,
object : TypeToken<MediaDataWithVehicle?>() {}.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<MediaItem> {
if (datasGlobal == null) {
datasGlobal = GsonUtils.fromJson(
FunctionBuildConfig.mediaUrlConfig,
object : TypeToken<MediaDataWithVehicle?>() {}.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<MediaDataWithVehicle>) {
}
data class MediaDataWithVehicle(
val B1: B1,
val B2: B2,
val T1T2: T1T2,
val M1: M1,
)
data class B1(val medias: MutableList<MediaItem>, val musics: MutableList<MusicData>)
data class B2(val medias: MutableList<MediaItem>, val musics: MutableList<MusicData>)
data class T1T2(val medias: MutableList<MediaItem>, val musics: MutableList<MusicData>)
data class M1(val medias: MutableList<MediaItem>, val musics: MutableList<MusicData>)
data class MediaBean(
val medias: MutableList<MediaItem>,
val musics: MutableList<MusicData>,
)
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

Some files were not shown because too many files have changed in this diff Show More