Merge branch 'dev_robotaxi-d_231205_6.2.6' into dev_robotaxi-d_231218_6.2.6

# Conflicts:
#	OCH/bus/passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/MogoOCHBusPassenger.java
This commit is contained in:
yangyakun
2023-12-18 11:28:25 +08:00
1189 changed files with 7194 additions and 1825 deletions

View File

@@ -68,7 +68,7 @@ dependencies {
implementation rootProject.ext.dependencies.androidxrecyclerview
compileOnly rootProject.ext.dependencies.recyclerviewadapterhelper
implementation project(":OCH:mogo-och-common-module")
implementation project(":OCH:common:common")
compileOnly project(":libraries:mogo-map")
}

View File

@@ -44,6 +44,21 @@ android {
}
}
sourceSets {
main {
res.srcDirs = [
'src/main/res',
'src/main/res/m2',
'src/main/res/jinlv',
]
java.srcDirs = [
'src/main/java',
'src/main/java/m2',
'src/main/java/jinlv',
]
}
}
flavorDimensions "vehicle"
productFlavors {
// 车型:金旅星辰、开沃 小巴业务
@@ -51,6 +66,11 @@ android {
dimension "vehicle"
buildConfigField 'int', 'NEW_TEST', '0'
}
// 车型金旅m1 小巴业务
m2 {
dimension "vehicle"
buildConfigField 'int', 'NEW_TEST', '1'
}
}
}
@@ -65,7 +85,7 @@ dependencies {
implementation rootProject.ext.dependencies.rxandroid
implementation rootProject.ext.dependencies.androidxconstraintlayout
implementation rootProject.ext.dependencies.amapnavi3dmap
implementation project(":OCH:mogo-och-common-module")
implementation project(":OCH:common:common")
compileOnly project(":libraries:mogo-map")
implementation project(':core:mogo-core-res')

View File

@@ -1,108 +0,0 @@
package com.mogo.och.bus.passenger;
import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS_P;
import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI_P;
import android.content.Context;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
import com.alibaba.android.arouter.facade.annotation.Route;
import com.mogo.eagle.core.data.config.FunctionBuildConfig;
import com.mogo.eagle.core.function.call.setting.CallerMoGoUiSettingManager;
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils;
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
import com.mogo.eagle.core.utilcode.util.MultiDisplayUtils;
import com.mogo.och.bus.passenger.constant.BusPassengerConst;
import com.mogo.och.bus.passenger.ui.BusPassengerRouteFragment;
import com.mogo.och.common.module.wigets.video.VideoPlayerActivity;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* 网约车-Bus-乘客端
*
* Created on 2022/3/29
*/
@Route(path = BusPassengerConst.PATH)
public class MogoOCHBusPassenger implements IMogoOCH {
private static final String TAG = MogoOCHBusPassenger.class.getSimpleName();
private FragmentActivity mActivity;
private int mContainerId;
private BusPassengerRouteFragment mPassengerFragment;
@Override
public void createCoverage(FragmentActivity activity, int containerId) {
}
@Nullable
@Override
public Fragment createCoverage(@Nullable FragmentActivity activity, @Nullable Integer containerId) {
this.mActivity = activity;
this.mContainerId = containerId;
showFragment();
if (AppIdentityModeUtils.isJL(FunctionBuildConfig.appIdentityMode) && activity != null) {
MultiDisplayUtils.INSTANCE.startActWithSecond(activity, VideoPlayerActivity.class);
}
return null;
}
@NotNull
@Override
public String getFunctionName() {
return TAG;
}
@Override
public void onDestroy() {
// 若不调用finish, 设置中打开关闭UITouch,会造成och fragment 重叠
if (mActivity == null) return;
mActivity.finish();
}
@Override
public void init(Context context) {
}
/**
* 进入鹰眼模式,设置手势缩放地图失效
*/
private void stepIntoVrMode() {
CallerLogger.d( M_BUS_P + TAG, "进入vr模式" );
CallerMoGoUiSettingManager.INSTANCE.stepInDayMode();//白天模式 状态栏字体颜色变黑
}
private void showFragment() {
FragmentManager supportFragmentManager = mActivity.getSupportFragmentManager();
if(mPassengerFragment == null){
CallerLogger.d(M_BUS_P + TAG, "准备add fragment======");
Fragment fragmentByTag = supportFragmentManager.findFragmentByTag(BusPassengerRouteFragment.TAG);
if (fragmentByTag instanceof BusPassengerRouteFragment){
mPassengerFragment = (BusPassengerRouteFragment)fragmentByTag;
}else {
mPassengerFragment = new BusPassengerRouteFragment();
}
if (!mPassengerFragment.isAdded()){
supportFragmentManager.beginTransaction().add(mContainerId, mPassengerFragment,BusPassengerRouteFragment.TAG).commitAllowingStateLoss();
}
return;
}
CallerLogger.d(M_BUS_P + TAG, "准备show fragment");
supportFragmentManager.beginTransaction().show(mPassengerFragment).commitAllowingStateLoss();
}
private void hideFragment(){
if (mPassengerFragment != null){
mActivity.getSupportFragmentManager().beginTransaction().hide(mPassengerFragment).commitAllowingStateLoss();
}
}
}

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.mogo.och.bus.passenger">
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application>
<activity android:name="com.mogo.eagle.core.function.main.MainLauncherActivity"
android:screenOrientation="portrait"
tools:replace="android:screenOrientation"/>
</application>
</manifest>

View File

@@ -5,15 +5,17 @@ import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import androidx.fragment.app.FragmentManager
import com.alibaba.android.arouter.facade.annotation.Route
import com.mogo.commons.module.status.IMogoStatusChangedListener
import com.mogo.commons.module.status.MogoStatusManager
import com.mogo.commons.module.status.StatusDescriptor
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager.getMapUIController
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.function.api.base.IMoGoFunctionProvider
import com.mogo.eagle.core.function.call.setting.CallerMoGoUiSettingManager.stepInDayMode
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.MultiDisplayUtils
import com.mogo.och.bus.passenger.constant.BusPassengerConst
import com.mogo.och.bus.passenger.ui.PM2BaseFragment
import com.mogo.och.bus.passenger.passenger.ui.PM2BaseFragment
import com.mogo.och.bus.passenger.ui.BusPassengerRouteFragment
import com.mogo.och.common.module.wigets.video.VideoPlayerActivity
/**
* 网约车-Bus-乘客端
@@ -21,20 +23,20 @@ import com.mogo.och.bus.passenger.ui.PM2BaseFragment
* Created on 2022/3/29
*/
@Route(path = BusPassengerConst.PATH)
class MogoOCHBusPassenger : IMogoOCH, IMogoStatusChangedListener {
class MogoOCHShuttlePassenger : IMoGoFunctionProvider {
private var mActivity: FragmentActivity? = null
private var mContainerId = 0
private var mPM2Fragment: PM2BaseFragment? = null
override fun createCoverage(activity: FragmentActivity, containerId: Int) {}
private var mPM2Fragment: Fragment? = null
override fun createCoverage(activity: FragmentActivity?, containerId: Int?): Fragment? {
mActivity = activity
mContainerId = containerId!!
// if (MogoStatusManager.getInstance().isScreenCoverDismiss){
showFragment()
// }else{
// MogoStatusManager.getInstance()
// .registerStatusChangedListener("ochM2Passenger", StatusDescriptor.SCREEN_COVER, this)
// }
showFragment()
if (AppIdentityModeUtils.isJL(FunctionBuildConfig.appIdentityMode)) {
mActivity?.let {
MultiDisplayUtils.startActWithSecond(it, VideoPlayerActivity::class.java)
}
}
return null
}
@@ -63,12 +65,19 @@ class MogoOCHBusPassenger : IMogoOCH, IMogoStatusChangedListener {
d(SceneConstant.M_TAXI_P + TAG, "准备add fragment======")
var fragmentByTag: Fragment? = supportFragmentManager?.findFragmentByTag(PM2BaseFragment.TAG)
val fragmentByTag: Fragment? = supportFragmentManager?.findFragmentByTag(PM2BaseFragment.TAG)
mPM2Fragment = if (fragmentByTag is PM2BaseFragment){
mPM2Fragment = if (fragmentByTag is Fragment){
fragmentByTag
}else{
PM2BaseFragment()
if (AppIdentityModeUtils.isM2(FunctionBuildConfig.appIdentityMode)) {
PM2BaseFragment()
}else if (AppIdentityModeUtils.isJL(FunctionBuildConfig.appIdentityMode)) {
BusPassengerRouteFragment()
}else{
BusPassengerRouteFragment()
}
}
if (!mPM2Fragment?.isAdded!!){
@@ -90,16 +99,7 @@ class MogoOCHBusPassenger : IMogoOCH, IMogoStatusChangedListener {
}
companion object {
private val TAG = MogoOCHBusPassenger::class.java.simpleName
private val TAG = MogoOCHShuttlePassenger::class.java.simpleName
}
override fun onStatusChanged(descriptor: StatusDescriptor?, isTrue: Boolean) {
if (descriptor == StatusDescriptor.SCREEN_COVER){
if (isTrue){
showFragment()
}else{
hideFragment()
}
}
}
}

View File

@@ -7,7 +7,7 @@ import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsListener
import com.mogo.eagle.core.function.hmi.ui.widget.BlueToothView
import com.mogo.eagle.core.utilcode.util.ThreadUtils
import com.mogo.och.bus.passenger.R
import kotlinx.android.synthetic.jinlvvan.p_bus_view_blue_tooth.view.*
import kotlinx.android.synthetic.main.p_bus_view_blue_tooth.view.blueView
/**
* 魔戒蓝牙控件

View File

@@ -10,7 +10,9 @@ import com.mogo.eagle.core.function.api.datacenter.union.IMoGoTrafficLightListen
import com.mogo.eagle.core.function.call.v2x.CallerTrafficLightListenerManager
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import com.mogo.och.bus.passenger.R
import kotlinx.android.synthetic.jinlvvan.bus_p_traffic_light_view.view.*
import kotlinx.android.synthetic.main.bus_p_traffic_light_view.view.bus_p_traffic_light_bg
import kotlinx.android.synthetic.main.bus_p_traffic_light_view.view.bus_p_traffic_light_iv
import kotlinx.android.synthetic.main.bus_p_traffic_light_view.view.bus_p_traffic_light_time_tv
/**
* bus乘客端红绿灯view

View File

@@ -0,0 +1,21 @@
package com.mogo.och.bus.passenger.passenger.bean;
import com.mogo.eagle.core.data.BaseData;
/**
* @author congtaowang
* @since 2021/3/22
*
* 小巴车运营状态返回参数
*/
public class PM2OperationStatusResponse extends BaseData {
public Result data;
public static class Result {
private String sn; //司机屏sn
private String phone; //司机手机号
public String plateNumber; //车牌号
public int driverStatus;//0:已收车1:已出车
}
}

View File

@@ -0,0 +1,16 @@
package com.mogo.och.bus.passenger.passenger.bean;
public
/**
* @author congtaowang
* @since 2021/3/22
*
* 根据车机行驶线路站点信息
*/
class PM2QueryLineRequest {
private String sn;
public PM2QueryLineRequest(String sn) {
this.sn = sn;
}
}

View File

@@ -0,0 +1,29 @@
package com.mogo.och.bus.passenger.passenger.bean;
import com.mogo.eagle.core.data.BaseData;
import com.mogo.och.data.bean.BusRoutesResult;
/**
* 网约车小巴路线接口请求响应结果 返回的是对应司机屏的线路信息
*
* @author tongchenfei
*/
public class PM2RoutesResponse extends BaseData {
private BusRoutesResult data;
public BusRoutesResult getResult() {
return data;
}
public void setResult(BusRoutesResult data) {
this.data = data;
}
@Override
public String toString() {
return "OchBusRoutesResponse{" +
"data=" + data +
'}';
}
}

View File

@@ -0,0 +1,79 @@
package com.mogo.och.bus.passenger.passenger.bean;
import java.util.List;
import java.util.Objects;
/**
* 网约车小巴路线接口返回接口数据封装
*
* @author tongchenfei
*/
public class PM2RoutesResult {
private List<PM2Station> sites;
private int lineId;
private String name; //线路名称
private int lineType; //线路类型0:环形
private String description;
private int status;
private String runningDur; //运营时间
private long taskTime; //线路时间班次
public List<PM2Station> getSites() {
return sites;
}
public int getLineId() {
return lineId;
}
public String getName() {
return name;
}
public int getLineType() {
return lineType;
}
public String getDescription() {
return description;
}
public int getStatus() {
return status;
}
public String getRunningDur() {
return runningDur;
}
@Override
public String toString() {
return "BusPassengerRoutesResult{" +
"sites=" + sites +
", lineId=" + lineId +
", name='" + name + '\'' +
", lineType=" + lineType +
", description='" + description + '\'' +
", status=" + status +
", runningDur='" + runningDur + '\'' +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
PM2RoutesResult that = (PM2RoutesResult) o;
return lineId == that.lineId
&& lineType == that.lineType
&& status == that.status
&& sites.equals(that.sites)
&& name.equals(that.name)
&& runningDur.equals(that.runningDur);
}
@Override
public int hashCode() {
return Objects.hash(sites, lineId, name, lineType, description, status, runningDur);
}
}

View File

@@ -0,0 +1,173 @@
package com.mogo.och.bus.passenger.passenger.bean;
import java.util.Objects;
/**
* 单个网约车小巴车站信息
*
* @author wangmingjun
*/
public class PM2Station {
private String name;
private String description;
private String cityCode;
private double lon; //高精坐标
private double lat; //高精坐标
private double gcjLon; //高德坐标
private double gcjLat; //高德坐标
private int businessType; //站点类型9:taxi10:bus
private int status;
private int siteId;
private int seq;
private int drivingStatus;//行驶信息0初始值1已经过2当前站3未到站
private int ifStop = 1; // 是否需要停靠、1需要、0不需要 // TODO: 2021/10/19 原来站点里有设计是否需要停靠字段,现设计暂无,默认都需要停靠
private boolean leaving;
public void setName(String name) {
this.name = name;
}
public void setDescription(String description) {
this.description = description;
}
public void setCityCode(String cityCode) {
this.cityCode = cityCode;
}
public void setLon(double lon) {
this.lon = lon;
}
public void setLat(double lat) {
this.lat = lat;
}
public void setBusinessType(int businessType) {
this.businessType = businessType;
}
public void setStatus(int status) {
this.status = status;
}
public void setSiteId(int siteId) {
this.siteId = siteId;
}
public void setSeq(int seq) {
this.seq = seq;
}
public void setDrivingStatus(int drivingStatus) {
this.drivingStatus = drivingStatus;
}
public String getName() {
return name;
}
public String getDescription() {
return description;
}
public String getCityCode() {
return cityCode;
}
public double getGcjLon() {
return gcjLon;
}
public double getGcjLat() {
return gcjLat;
}
public int getBusinessType() {
return businessType;
}
public int getStatus() {
return status;
}
public int getSiteId() {
return siteId;
}
public int getSeq() {
return seq;
}
public int getDrivingStatus() {
return drivingStatus;
}
public double getLon() {
return lon;
}
public double getLat() {
return lat;
}
public void setIfStop(int ifStop) {
this.ifStop = ifStop;
}
public int getIfStop() {
return ifStop;
}
public void setLeaving(boolean leaving) {
this.leaving = leaving;
}
public boolean isLeaving() {
return leaving;
}
@Override
public String toString() {
return "OchBusStation{" +
"name='" + name + '\'' +
", description='" + description + '\'' +
", cityCode='" + cityCode + '\'' +
", lon=" + lon +
", lat=" + lat +
", businessType=" + businessType +
", status=" + status +
", siteId=" + siteId +
", seq=" + seq +
", drivingStatus=" + drivingStatus +
", ifStop=" + ifStop +
", leaving=" + leaving +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
PM2Station that = (PM2Station) o;
return Double.compare(that.lon, lon) == 0
&& Double.compare(that.lat, lat) == 0
&& Double.compare(that.gcjLon, gcjLon) == 0
&& Double.compare(that.gcjLat, gcjLat) == 0
&& businessType == that.businessType
&& status == that.status
&& siteId == that.siteId
&& seq == that.seq
&& drivingStatus == that.drivingStatus
&& ifStop == that.ifStop
&& leaving == that.leaving
&& Objects.equals(name, that.name)
&& Objects.equals(cityCode, that.cityCode);
}
@Override
public int hashCode() {
return Objects.hash(name, description, cityCode, lon, lat, gcjLon, gcjLat, businessType, status, siteId, seq, drivingStatus, ifStop, leaving);
}
}

View File

@@ -0,0 +1,10 @@
package com.mogo.och.bus.passenger.passenger.callback
/**
* @author: wangmingjun
* @date: 2023/2/15
*/
interface ADASCallback {
fun updateHDMapStations(stations: MutableList<MutableList<Double>>)
fun removeHDMapStations()
}

View File

@@ -0,0 +1,14 @@
package com.mogo.och.bus.passenger.passenger.callback
/**
* @author: wangmingjun
* @date: 2023/2/13
*/
interface AutoPilotStatusCallback {
/**
* false: 未开启自驾, true 开启自驾
*/
fun updateAutoStatus(isOpen: Boolean)
fun updateAutoStatus(status: Int)
}

View File

@@ -0,0 +1,19 @@
package com.mogo.och.bus.passenger.passenger.callback
import com.mogo.och.data.bean.BusStationBean
/**
* @author: wangmingjun
* @date: 2023/2/2
*/
interface DrivingInfoCallback {
fun updateSpeed(speed: Int)
fun updatePlateNumber(carNum: String)
fun updateLine(lineName: String, lineDuring: String)
fun updateRemainMT(meters : Long, timeInSecond : Long) // 米,秒
fun changeOperationStatus(loginStatus : Boolean)
fun showNoTaskView(isTrue : Boolean)
fun updateLineStations(stations: MutableList<BusStationBean>)
fun updateStationsInfo(stations: MutableList<BusStationBean>, i: Int, isArrived: Boolean)
fun clearCustomPolyline()
}

View File

@@ -0,0 +1,16 @@
package com.mogo.och.bus.passenger.passenger.constant
/**
* Created on 2021/12/6
*/
class M2Const {
companion object {
//站点UUID
const val M2_MAP_STATION_MAKER = "m2_map_station_maker"
/**
* Marker类型
*/
const val TYPE_MARKER_M2_LINE = "TYPE_MARKER_M2_LINE"
}
}

View File

@@ -0,0 +1,45 @@
package com.mogo.och.bus.passenger.passenger.model
import android.content.Context
import com.mogo.och.bus.passenger.passenger.callback.ADASCallback
import com.mogo.och.data.bean.BusStationBean
/**
* @author: wangmingjun
* @date: 2023/2/2
*/
class PM2ADASModel private constructor() {
private var mContext: Context? = null
private var mAdasCallback: ADASCallback? = null
companion object {
val TAG = PM2ADASModel::class.java.simpleName
val INSTANCE: PM2ADASModel by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
PM2ADASModel()
}
}
fun init(context : Context){
this.mContext = context
}
fun setAdasCallback(adasCallback: ADASCallback?){
this.mAdasCallback = adasCallback
}
fun updateHDMapStations(stations: MutableList<BusStationBean>){
var stationsList = mutableListOf<MutableList<Double>>()
for (i in stations.indices){
var listLatLng = mutableListOf<Double>() // 0: long 1:lat
listLatLng.add(stations[i].lon)
listLatLng.add(stations[i].lat)
stationsList.add(listLatLng)
}
mAdasCallback?.updateHDMapStations(stationsList)
}
fun removeHDMapStations(){
mAdasCallback?.removeHDMapStations()
}
}

View File

@@ -0,0 +1,638 @@
package com.mogo.och.bus.passenger.passenger.model
import android.content.Context
import android.media.AudioAttributes
import android.media.AudioFocusRequest
import android.media.AudioManager
import android.net.ConnectivityManager
import android.os.Build
import android.os.Handler
import androidx.annotation.RequiresApi
import com.mogo.commons.module.intent.IMogoIntentListener
import com.mogo.commons.module.intent.IntentManager
import com.mogo.commons.voice.AIAssist
import com.mogo.commons.voice.IMogoVoiceCmdCallBack
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.map.MogoLocation
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Listener
import com.mogo.eagle.core.function.api.autopilot.IMoGoPlanningRottingListener
import com.mogo.eagle.core.function.api.telematic.IReceivedMsgListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager
import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager
import com.mogo.eagle.core.function.call.autopilot.CallerPlanningRottingListenerManager
import com.mogo.eagle.core.function.call.telematic.CallerTelematicListenerManager
import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager.sendMsgToServer
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
import com.mogo.eagle.core.utilcode.mogo.logger.Logger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.eagle.core.utilcode.util.CoordinateUtils
import com.mogo.eagle.core.utilcode.util.GsonUtils
import com.mogo.eagle.core.utilcode.util.NetworkUtils
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.och.bus.passenger.R
import com.mogo.och.bus.passenger.constant.BusPassengerConst
import com.mogo.och.bus.passenger.passenger.callback.AutoPilotStatusCallback
import com.mogo.och.bus.passenger.passenger.callback.DrivingInfoCallback
import com.mogo.och.bus.passenger.passenger.model.PM2ServiceManager.driverAppSn
import com.mogo.och.bus.passenger.passenger.network.PM2ModelLoopManager
import com.mogo.och.common.module.bean.dpmsg.*
import com.mogo.och.common.module.biz.common.socketmessage.OCHSocketMessageManager.pushAppOperationalMsgBox
import com.mogo.och.common.module.biz.constant.OchCommonConst
import com.mogo.och.common.module.biz.network.OchCommonServiceCallback
import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil
import com.mogo.och.common.module.utils.DateTimeUtil
import com.mogo.och.common.module.utils.RxUtils
import com.mogo.och.data.bean.BusRoutesResult
import com.mogo.och.data.bean.BusStationBean
import com.mogo.och.data.bean.BusTransferData
import io.reactivex.disposables.Disposable
import mogo.telematics.pad.MessagePad
import com.mogo.och.bus.passenger.passenger.bean.PM2OperationStatusResponse
import com.mogo.och.bus.passenger.passenger.bean.PM2RoutesResponse
import kotlin.math.abs
/**
* @author: wangmingjun
* @date: 2023/1/31
*/
class PM2DrivingModel private constructor() {
private var mContext: Context? = null
private var mLocation: MogoLocation? = null
private var mRoutePoints = mutableListOf<MogoLocation>()
private var routesResult: BusRoutesResult? = null
private var mCurrentAutoStatus = -1
var mStations = mutableListOf<BusStationBean>()
private var mNextStationIndex = 0 // A-B要到达站的index
private var isGoingToNextStation = false //是否前往下一站过程中
private var mTwoStationsRouts = mutableListOf<MogoLocation>()
private var mPreRouteIndex = 0
private var mWipePreIndex = 0
private var mDrivingInfoCallback: DrivingInfoCallback? = null //行程信息
private var mAutoStatusCallback: AutoPilotStatusCallback? = null //自动驾驶状态
private var operationStatus: PM2OperationStatusResponse.Result? = null
@Volatile
private var globalPathTruncation: Disposable? = null
private val handler = Handler(Handler.Callback { msg ->
if (msg.what == MSG_QUERY_BUS_P_STATION) {
queryDriverOperationStatus()
return@Callback true
}
false
})
companion object {
val TAG = PM2DrivingModel::class.java.simpleName
const val MSG_QUERY_BUS_P_STATION = 1001
val INSTANCE: PM2DrivingModel by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
PM2DrivingModel()
}
}
fun init(context : Context){
mContext = context
initListener()
queryDriverByLocalDriver()
queryDriverOperationStatus()
startOrStopOrderLoop(true)
}
private fun queryDriverByLocalDriver() {
//本地去请求司机端
val msg = TaskDetailsMsg("task")
sendMsgToServer(GsonUtils.toJson(msg))
}
private fun initListener() {
//自动驾驶状态监听
CallerAutoPilotStatusListenerManager.addListener(TAG, mAutoPilotStatusListener)
// 定位监听
CallerChassisLocationGCJ02ListenerManager.addListener(TAG, 10,mMapLocationListener)
//司乘屏通信监听
CallerTelematicListenerManager.addListener(TAG,mReceivedMsgListener)
//自动驾驶轨迹监听
CallerPlanningRottingListenerManager.addListener(TAG, moGoAutopilotPlanningListener)
//网络监听
IntentManager.getInstance().registerIntentListener(ConnectivityManager.CONNECTIVITY_ACTION, mNetWorkIntentListener)
}
private fun sendMsgToServer(msg: String) {
sendMsgToServer(
OchCommonConst.BUSINESS_STRING,
GsonUtils.toJson(msg).toByteArray()
)
}
fun releaseListener(){
//自动驾驶状态监听
CallerAutoPilotStatusListenerManager.removeListener(TAG)
// 定位监听
CallerChassisLocationGCJ02ListenerManager.removeListener(TAG)
CallerTelematicListenerManager.removeListener(TAG)
//自动驾驶轨迹监听
CallerPlanningRottingListenerManager.removeListener(TAG)
}
fun setDrivingInfoCallback(drivingInfoCallback : DrivingInfoCallback?){
mDrivingInfoCallback = drivingInfoCallback
}
fun setAutoStatusCallback(autoPilotStatusCallback: AutoPilotStatusCallback?){
mAutoStatusCallback = autoPilotStatusCallback
}
private val mNetWorkIntentListener = IMogoIntentListener { intentStr, _ ->
if (ConnectivityManager.CONNECTIVITY_ACTION == intentStr) {
if (NetworkUtils.isConnected(mContext)) {
queryDriverOperationStatus()
}
}
}
private val mReceivedMsgListener: IReceivedMsgListener =
object : IReceivedMsgListener{
@RequiresApi(Build.VERSION_CODES.O)
override fun onReceivedMsg(type: Int, byteArray: ByteArray) {//接收司机端发来的信息
if (OchCommonConst.BUSINESS_STRING == type){
val baseMsg = GsonUtils.fromJson(String(byteArray), BaseDPMsg::class.java)
Logger.d(
SceneConstant.M_BUS_P + TAG, "onReceivedMsg = " + GsonUtils.toJson(baseMsg)
)
if (baseMsg != null && baseMsg.type == DPMsgType.TYPE_COMMON.type) {
val msg = GsonUtils.fromJson(String(byteArray), AppConnectMsg::class.java)
if (msg != null && msg.isPlay){ //播报
speakTTS(msg.msg)
}
if (msg != null && msg.isViewShow) { //消息盒子显示内容
pushAppOperationalMsgBox(
DateTimeUtil.getCurrentTimeStamp(),msg.msg)
}
}else if (baseMsg != null && baseMsg.type == DPMsgType.TYPE_TASK_DETAILS.type) {
val msg = GsonUtils.fromJson(String(byteArray), TaskDetailsMsg::class.java)
Logger.d(
SceneConstant.M_BUS_P + TAG, "onReceivedMsg = " + GsonUtils.toJson(msg)
)
if (msg == null || msg.msg?.isEmpty() == true) {
updateLocalOrder()
return
}
val result = GsonUtils.fromJson(msg.msg, BusTransferData::class.java)
mDrivingInfoCallback?.changeOperationStatus(result.loginStatus == 1)
if (result != null && result.routesResult == null){
updateLocalOrder()
}
if (routesResult == null ||
(result != null && result.routesResult?.writeVersion!! > routesResult!!.writeVersion)) {
routesResult = result.routesResult
updatePassengerRouteInfo(routesResult!!)
}
}
}
}
}
@RequiresApi(Build.VERSION_CODES.O)
private fun speakTTS(msg: String) {
var mAudioManager = mContext?.getSystemService(Context.AUDIO_SERVICE) as AudioManager
var mAudioAttributes = AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA) //设置声音的用途
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) //设置声音的类型
.build()
var mAudioFocusRequest = AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK) //设置焦点类型
.setAudioAttributes(mAudioAttributes) //设置声音属性
.setAcceptsDelayedFocusGain(false) //设置接受延迟获取焦点需要设置OnAudioFocusChangeListener来监听焦点的获取
.build()
mAudioManager.requestAudioFocus(mAudioFocusRequest) //抢占焦点
AIAssist.getInstance(mContext).speakTTSVoiceWithLevel(msg,AIAssist.LEVEL0,object : IMogoVoiceCmdCallBack{
override fun onSpeakEnd(speakText: String?) {
mAudioManager.abandonAudioFocusRequest(mAudioFocusRequest)
}
override fun onSpeakError(speakText: String?, errorMsg: String?) {
mAudioManager.abandonAudioFocusRequest(mAudioFocusRequest)
}
override fun onSpeakSelectTimeOut(speakText: String?) {
mAudioManager.abandonAudioFocusRequest(mAudioFocusRequest)
}
})
}
private val mMapLocationListener: IMoGoChassisLocationGCJ02Listener =
object : IMoGoChassisLocationGCJ02Listener{
override fun onChassisLocationGCJ02(mogoLocation: MogoLocation?) {
if (null == mogoLocation) return
mLocation = mogoLocation
updateSpeed(mogoLocation)
}
}
private val moGoAutopilotPlanningListener = object : IMoGoPlanningRottingListener{
@Synchronized
override fun onAutopilotRotting(globalPathResp: MessagePad.GlobalPathResp?) {
d(SceneConstant.M_BUS_P + TAG, "och-rotting==globalPathResp = " + GsonUtils.toJson(globalPathResp))
globalPathResp?.let {
d(SceneConstant.M_BUS_P + TAG, "och-rotting==wayPointsSize = " + it.wayPointsList.size)
if (globalPathTruncation != null && !globalPathTruncation!!.isDisposed) {
d(SceneConstant.M_BUS_P + TAG, "1s内不可以接受轨迹")
return@let
}
globalPathTruncation = RxUtils.createSubscribe(1_000) {
d(SceneConstant.M_BUS_P + TAG, "可以接受轨迹")
}
d(SceneConstant.M_BUS_P + TAG, "接受轨迹中")
it.wayPointsList?.let {list->
updateRoutePoints(list)
}
}
}
}
@Synchronized
fun updateRoutePoints(routePoints: List<MessagePad.Location>) {
mRoutePoints.clear()
val latLngModels = CoordinateCalculateRouteUtil
.coordinateConverterWgsToGcjLocations(mContext, routePoints)
d(SceneConstant.M_BUS_P + TAG, "och-rotting==latLngModels = " + latLngModels.size)
mRoutePoints.addAll(latLngModels)
if (isGoingToNextStation){
mTwoStationsRouts.clear()
startRemainRouteInfo()
}
}
private fun updateSpeed(mogoLocation: MogoLocation) {
// km/h
val speedKM = (abs(mogoLocation.gnssSpeed) * 3.6f).toInt()
mDrivingInfoCallback?.updateSpeed(speedKM)
}
private val mAutoPilotStatusListener: IMoGoAutopilotStatusListener =
object : IMoGoAutopilotStatusListener {
override fun onAutopilotStatusResponse(state: Int) {
super.onAutopilotStatusResponse(state)
d(SceneConstant.M_BUS_P+ TAG, "onAutopilotStatusResponse ===== $state")
if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING != state){
//美化模式下且行程中
if (FunctionBuildConfig.isDemoMode &&
mNextStationIndex>= 0 && mNextStationIndex <= mStations.size - 1
&& isGoingToNextStation){
mAutoStatusCallback?.updateAutoStatus(true)
}else{//非美化模式下
mAutoStatusCallback?.updateAutoStatus(false)
}
}else{//自驾状态 2
mAutoStatusCallback?.updateAutoStatus(true)
}
}
}
private fun queryDriverOperationDelay() {
handler.sendEmptyMessageDelayed(
MSG_QUERY_BUS_P_STATION,
BusPassengerConst.QUERY_BUS_P_STATION_DELAY
)
}
private fun queryDriverOperationStatus() {
mContext?.let {
PM2ServiceManager.queryDriverOperationStatus(
it,
object : OchCommonServiceCallback<PM2OperationStatusResponse> {
override fun onSuccess(data: PM2OperationStatusResponse?) {
if (data?.data == null) return
if (data.data.driverStatus != operationStatus?.driverStatus
|| data.data.plateNumber != operationStatus?.plateNumber
) {
d(
SceneConstant.M_BUS_P + TAG,
"queryDriverOperationStatus ===== 车牌或者登陆状态有变更"
)
mDrivingInfoCallback?.changeOperationStatus(data.data.driverStatus == 1)
}
operationStatus = data.data as PM2OperationStatusResponse.Result
// mDrivingInfoCallback?.updatePlateNumber(data.data.plateNumber)
}
override fun onError() {
if (!NetworkUtils.isConnected(mContext)) {
ToastUtils.showShort(mContext!!.getString(R.string.network_error_tip))
} else {
ToastUtils.showShort(mContext!!.getString(R.string.request_error_tip))
}
// queryDriverOperationDelay()
queryDriverByLocalDriver()
}
override fun onFail(code: Int, msg: String) {
//延迟3s再次查询
queryDriverOperationDelay()
}
})
}
}
fun queryDriverSiteByCoordinate(){
mContext?.let {
PM2ServiceManager.queryDriverSiteByCoordinate(it,
object : OchCommonServiceCallback<PM2RoutesResponse> {
override fun onSuccess(data: PM2RoutesResponse?) {
if (data == null || data.result == null) {
if (routesResult != null) {
routesResult = null
updateLocalOrder()
d(
SceneConstant.M_BUS_P + TAG,
"queryDriverSiteByCoordinate= result is null"
)
return
}
return
}
if (data.result != null && data.result.equals(routesResult)) {
d(
SceneConstant.M_BUS_P + TAG,
"queryDriverSiteByCoordinate= not update"
)
return
}
if (routesResult != null &&
routesResult!!.writeVersion < data.result.writeVersion
) {
routesResult = data.result
}
if (routesResult == null) {
routesResult = data.result
}
updatePassengerRouteInfo(data.result)
}
override fun onError() {
d(
SceneConstant.M_BUS_P + TAG,
"queryDriverSiteByCoordinate = onError ="
+ ", sn = " + driverAppSn
)
queryDriverByLocalDriver()
}
override fun onFail(code: Int, msg: String?) {
d(SceneConstant.M_BUS_P + TAG, "queryDriverSiteByCoordinate = %s", msg)
if (code == 1003) {
queryDriverOperationDelay()
}
if (driverAppSn.isEmpty()) {
return
}
if (code == 1003) {
routesResult = null
isGoingToNextStation = false
startOrStopCalculateRouteInfo(false)
return
}
}
})
}
}
private fun updateLocalOrder(){
mRoutePoints.clear()
routesResult = null
mNextStationIndex = 0
isGoingToNextStation = false
startOrStopCalculateRouteInfo(false)
mDrivingInfoCallback?.showNoTaskView(true)
}
private fun updatePassengerRouteInfo(result: BusRoutesResult) {
if (result == null) {
updateLocalOrder()
return
}
if (routesResult != null && routesResult!!.lineId != result.lineId){
d(SceneConstant.M_BUS_P+ TAG, "lineId change= clearCustomPolyline")
mDrivingInfoCallback?.clearCustomPolyline()
}
d(SceneConstant.M_BUS_P+ TAG, "queryDriverSiteByCoordinate= update")
routesResult = result
mDrivingInfoCallback?.updateLine(result.name, result.runningDur)
if (result.sites != null) {
mDrivingInfoCallback?.showNoTaskView(false)
val stations: List<BusStationBean> = result.sites
mStations.clear()
mStations.addAll(stations)
mDrivingInfoCallback?.updateLineStations(mStations)
for (i in stations.indices) {
val station: BusStationBean = stations[i]
if (station.drivingStatus == BusPassengerConst.STATION_STATUS_STOPPED
&& station.isLeaving && i + 1 < stations.size) {
mDrivingInfoCallback?.updateStationsInfo(stations as MutableList<BusStationBean>, i + 1, false)
d(SceneConstant.M_BUS_P+ TAG,"och-rotting--mNextStationIndex = $mNextStationIndex , i = $i")
// if (mNextStationIndex != i + 1) {
d(SceneConstant.M_BUS_P+ TAG,"och-rotting--start ")
mTwoStationsRouts.clear()
startRemainRouteInfo()
// }
isGoingToNextStation = true
mNextStationIndex = i + 1
return
} else if (station.drivingStatus == BusPassengerConst.STATION_STATUS_STOPPED && !station.isLeaving) {
d(SceneConstant.M_BUS_P+ TAG,"och-rotting--mNextStationIndex = $mNextStationIndex , i = $i")
d(SceneConstant.M_BUS_P+ TAG,"och-rotting--arrived ")
mPreRouteIndex = 0
isGoingToNextStation = false
startOrStopCalculateRouteInfo(false)
mDrivingInfoCallback?.updateStationsInfo(stations as MutableList<BusStationBean>, i, true)
return
}else{
// d(SceneConstant.M_BUS_P+TAG,"och-rotting--BusStationBean = " + GsonUtils.toJson(station))
}
}
}
}
fun loopRouteAndWipe(){
if (mRoutePoints != null && mRoutePoints.size > 0 && mLocation != null) {
val haveArrivedIndex = CoordinateCalculateRouteUtil
.getArrivedPointIndexNew(
mWipePreIndex,
mRoutePoints,
mLocation!!
)
mWipePreIndex = haveArrivedIndex
d(SceneConstant.M_BUS_P + TAG,
"thread = " + Thread.currentThread().name + " haveArrivedIndex== " + haveArrivedIndex
)
// if (mAutopilotPlanningCallback != null) {
// val routePoints = CoordinateCalculateRouteUtil
// .coordinateConverterLocationToLatLng(mContext, mRoutePoints)
// mAutopilotPlanningCallback.routeResult(routePoints, haveArrivedIndex)
// }
}
}
private fun startRemainRouteInfo() {
//开启实时计算剩余距离,剩余时间,预计时间
startOrStopCalculateRouteInfo(true)
}
fun dynamicCalculateRouteInfo(){
//计算当前位置和下一站的剩余点集合
//计算剩余点总里程和时间
d(SceneConstant.M_BUS_P + TAG, "och-rotting==mTwoStationsRouts.size() = " + mTwoStationsRouts.size)
//计算当前位置和下一站的剩余点集合
//计算剩余点总里程和时间
if (mTwoStationsRouts.size == 0) {
calculateTwoStationsRoute()
}
if (mTwoStationsRouts.size > 0 && mLocation != null) {
val lastPointsMap = CoordinateCalculateRouteUtil
.getRemainPointListByCompareNew(mPreRouteIndex, mTwoStationsRouts, mLocation!!)
for (index in lastPointsMap.keys) {
mPreRouteIndex = index
break
}
for (lastPoints in lastPointsMap.values) {
d(SceneConstant.M_BUS_P + TAG, "och-rotting==lastPoints.size() = " + lastPoints.size)
var lastSumLength = 0f
lastSumLength = if (lastPoints.size == 1) { //只是最后一个点,计算当前位置和最后一个点的距离
if (mNextStationIndex <= mStations.size - 1 && mNextStationIndex >= 0) {
val stationNext: BusStationBean = mStations[mNextStationIndex]
CoordinateUtils.calculateLineDistance(
stationNext.gcjLon, stationNext.gcjLat,
mLocation!!.longitude, mLocation!!.latitude
)
} else {
CoordinateUtils.calculateLineDistance(
lastPoints[0].longitude, lastPoints[0].latitude,
mLocation!!.longitude, mLocation!!.latitude
)
}
} else {
CoordinateCalculateRouteUtil.calculateRouteSumLength(lastPoints)
}
val lastTime = lastSumLength / BusPassengerConst.SHUTTLE_AVERAGE_SPEED * 3.6 //秒
d(SceneConstant.M_BUS_P + TAG, "och-rotting==lastSumLength = $lastSumLength")
mDrivingInfoCallback?.updateRemainMT(
lastSumLength.toLong(),
lastTime.toLong()
)
}
}
}
private fun calculateTwoStationsRoute() {
//找出前往站对应的轨迹点,拿出两站点的集合
d(SceneConstant.M_BUS_P + TAG, "mRoutePoints.size() = " + mRoutePoints.size)
if (mRoutePoints.size > 0) {
if (mStations.size > 1) { //两个站点及以上要计算两个站点间的轨迹路线
if (mNextStationIndex <= mStations.size - 1 && mNextStationIndex - 1 >= 0) {
mTwoStationsRouts.clear()
val stationNext: BusStationBean = mStations[mNextStationIndex]
val stationCur: BusStationBean = mStations[mNextStationIndex - 1]
//当前站在轨迹中对应的点
val currentRouteIndex = CoordinateCalculateRouteUtil.getArrivedPointIndexNew(
0, mRoutePoints, stationCur.gcjLon, stationCur.gcjLat
)
//要前往的站在轨迹中对应的点
val nextRouteIndex = CoordinateCalculateRouteUtil.getArrivedPointIndexNew(
currentRouteIndex,
mRoutePoints,
stationNext.gcjLon,
stationNext.gcjLat
)
d(SceneConstant.M_BUS_P + TAG, "och-rotting==currentRouteIndex = " + currentRouteIndex
+ " nextRouteIndex = " + nextRouteIndex)
if (currentRouteIndex < nextRouteIndex) { //如果找到的next在起点的轨迹前面直接舍弃这个轨迹不显示
mTwoStationsRouts.addAll(
mRoutePoints.subList(
currentRouteIndex,
nextRouteIndex + 1
)
)
}
}
}
}
}
/**
* 开始轮询计算剩余里程和时间
* @param isStart
*/
fun startOrStopCalculateRouteInfo(isStart: Boolean) {
d(SceneConstant.M_BUS_P+ TAG, "startOrStopCalculateRouteInfo() $isStart")
if (isStart) {
PM2ModelLoopManager.startCalculateRouteInfoLoop()
} else {
mTwoStationsRouts.clear()
PM2ModelLoopManager.stopCalculateRouteInfLoop()
}
}
/**
* 实时轨迹擦除
* @param isStart
*/
private fun startOrStopRouteAndWipe(isStart: Boolean) {
if (isStart) {
PM2ModelLoopManager.startOrStopRouteAndWipe()
} else {
mWipePreIndex = 0
PM2ModelLoopManager.stopOrStopRouteAndWipe()
}
}
private fun startOrStopOrderLoop(start: Boolean) {
d(SceneConstant.M_BUS_P + TAG, "startOrStopOrderLoop() $start")
if (start) {
PM2ModelLoopManager.startQueryDriverLineLoop()
} else {
PM2ModelLoopManager.stopQueryDriverLineLoop()
}
}
}

View File

@@ -0,0 +1,107 @@
package com.mogo.och.bus.passenger.passenger.model
import android.content.Context
import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager.getServerToken
import com.mogo.cloud.passport.MoGoAiCloudClientConfig
import com.mogo.commons.debug.DebugConfig
import com.mogo.eagle.core.network.MoGoRetrofitFactory
import com.mogo.och.bus.passenger.bean.BusPassengerQueryLineRequest
import com.mogo.och.bus.passenger.passenger.bean.PM2OperationStatusResponse
import com.mogo.och.bus.passenger.passenger.bean.PM2RoutesResponse
import com.mogo.och.bus.passenger.passenger.network.PassengerSAASServiceApi
import com.mogo.och.bus.passenger.passenger.network.PassengerServiceApi
import com.mogo.och.common.module.biz.constant.OchCommonConst
import com.mogo.och.common.module.biz.network.OchCommonServiceCallback
import com.mogo.och.common.module.biz.network.OchCommonSubscribeImpl
import com.mogo.och.common.module.biz.network.interceptor.transformTry
/**
* Created on 2022/3/31
*/
object PM2ServiceManager {
private var mBusPassengerSaasServiceApi =
MoGoRetrofitFactory.getInstance(OchCommonConst.getBaseUrl()).create(PassengerSAASServiceApi::class.java)
private var mBusPassengerServiceApi =
MoGoRetrofitFactory.getInstance(OchCommonConst.getBaseUrl()).create(PassengerServiceApi::class.java)
private var driverSnCache = ""
/**
* 获取Bus司机端的sn
* @return
*/
public val driverAppSn: String
get(){
val serverToken = getServerToken()
if (serverToken != driverSnCache && serverToken.isNotEmpty()) {
driverSnCache = serverToken
}
return driverSnCache
}
/**
* 查询绑定行驶的小巴车路线
* @param context
* @param callback
*/
@JvmStatic
fun queryDriverSiteByCoordinate(
context: Context, callback: OchCommonServiceCallback<PM2RoutesResponse>?
) {
if (DebugConfig.getProjectFlavor().contains("saas")){
mBusPassengerSaasServiceApi.queryDriverSiteByCoordinate(
MoGoAiCloudClientConfig.getInstance().serviceAppId,
MoGoAiCloudClientConfig.getInstance().token,
driverAppSn
).transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "queryDriverSiteByCoordinate"))
}else{
mBusPassengerServiceApi.queryDriverSiteByCoordinate(
MoGoAiCloudClientConfig.getInstance().serviceAppId,
MoGoAiCloudClientConfig.getInstance().token,
BusPassengerQueryLineRequest(
driverAppSn
)
).transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "queryDriverSiteByCoordinate"))
}
}//2023-12-07 10:13:32
/**
* 查询司机端出车收车状态,以及车牌号
* @param context
* @param callback
*/
@JvmStatic
fun queryDriverOperationStatus(
context: Context,
callback: OchCommonServiceCallback<PM2OperationStatusResponse>?
) {
mBusPassengerServiceApi.queryDriverOperationStatus(
MoGoAiCloudClientConfig.getInstance().serviceAppId,
MoGoAiCloudClientConfig.getInstance().token,
driverAppSn
)
.transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "queryDriverOperationStatus=sn =$driverAppSn"))
if (DebugConfig.getProjectFlavor().contains("saas")){
mBusPassengerSaasServiceApi.queryDriverOperationStatus(
MoGoAiCloudClientConfig.getInstance().serviceAppId,
MoGoAiCloudClientConfig.getInstance().token,
driverAppSn
)
.transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "queryDriverOperationStatus"))
}else{
mBusPassengerServiceApi.queryDriverOperationStatus(
MoGoAiCloudClientConfig.getInstance().serviceAppId,
MoGoAiCloudClientConfig.getInstance().token,
driverAppSn
)
.transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "queryDriverOperationStatus"))
}
}
}

View File

@@ -1,9 +1,9 @@
package com.mogo.och.bus.passenger.network
package com.mogo.och.bus.passenger.passenger.network
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.i
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.och.bus.passenger.constant.BusPassengerConst
import com.mogo.och.bus.passenger.model.PM2DrivingModel
import com.mogo.och.bus.passenger.passenger.model.PM2DrivingModel
import io.reactivex.Observable
import io.reactivex.ObservableOnSubscribe
import io.reactivex.android.schedulers.AndroidSchedulers

View File

@@ -0,0 +1,40 @@
package com.mogo.och.bus.passenger.passenger.network;
import com.mogo.och.bus.passenger.passenger.bean.PM2OperationStatusResponse;
import com.mogo.och.bus.passenger.passenger.bean.PM2QueryLineRequest;
import com.mogo.och.bus.passenger.passenger.bean.PM2RoutesResponse;
import io.reactivex.Observable;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.Header;
import retrofit2.http.Headers;
import retrofit2.http.POST;
import retrofit2.http.Query;
/**
* Created on 2022/3/31
*
* Bus乘客端接口定义
*/
public interface PM2ServiceApi {
/**
* 查询bus司机端绑定路线
* @return 接口返回数据
*/
@Headers( {"Content-Type:application/json;charset=UTF-8"} )
@POST( "/och-shuttle-cabin/api/business/v1/passenger/lineDataWithDriver/query" )
Observable<PM2RoutesResponse> queryDriverSiteByCoordinate(@Header("appId") String appId, @Header("ticket") String ticket, @Body PM2QueryLineRequest request);
/**
* 查询司机端的登陆状态
* @param sn
* @return
*/
@Headers({"Content-type:application/json;charset=UTF-8"})
// @GET("/autopilot-car-hailing/car/v2/driver/bus/passenger/takeOrderStatus/query")
@GET("/och-shuttle-cabin/api/business/v1/passenger/loginStatus")
Observable<PM2OperationStatusResponse> queryDriverOperationStatus(@Header ("appId") String appId, @Header("ticket") String ticket, @Query("sn") String sn);
}

View File

@@ -0,0 +1,38 @@
package com.mogo.och.bus.passenger.passenger.network;
import com.mogo.och.bus.passenger.passenger.bean.PM2OperationStatusResponse;
import com.mogo.och.bus.passenger.passenger.bean.PM2RoutesResponse;
import io.reactivex.Observable;
import retrofit2.http.GET;
import retrofit2.http.Header;
import retrofit2.http.Headers;
import retrofit2.http.Query;
/**
* Created on 2022/3/31
*
* Bus乘客端接口定义
*/
public interface PassengerSAASServiceApi {
/**
* 查询bus司机端绑定路线
* @return 接口返回数据
*/
@Headers( {"Content-Type:application/json;charset=UTF-8"} )
// @POST( "/autopilot-car-hailing/line/v2/driver/bus/passenger/lineDataWithDriver/query" )
@GET( "/och-bus-cabin/api/business/v1/driver/bus/lineDataWithDriver/query" )
Observable<PM2RoutesResponse> queryDriverSiteByCoordinate(@Header("appId") String appId, @Header("ticket") String ticket, @Query("sn") String sn);
/**
* 查询司机端的登陆状态
* @param sn
* @return
*/
@Headers({"Content-type:application/json;charset=UTF-8"})
// @GET("/autopilot-car-hailing/operation/v1/driver/bus/passenger/loginStatus")
@GET("/och-bus-cabin/api/business/v1/loginStatus")
Observable<PM2OperationStatusResponse> queryDriverOperationStatus(@Header ("appId") String appId, @Header("ticket") String ticket, @Query("sn") String sn);
}

View File

@@ -0,0 +1,40 @@
package com.mogo.och.bus.passenger.passenger.network;
import com.mogo.och.bus.passenger.bean.BusPassengerQueryLineRequest;
import com.mogo.och.bus.passenger.passenger.bean.PM2OperationStatusResponse;
import com.mogo.och.bus.passenger.passenger.bean.PM2RoutesResponse;
import io.reactivex.Observable;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.Header;
import retrofit2.http.Headers;
import retrofit2.http.POST;
import retrofit2.http.Query;
/**
* Created on 2022/3/31
*
* Bus乘客端接口定义
*/
public interface PassengerServiceApi {
/**
* 查询bus司机端绑定路线
* @return 接口返回数据
*/
@Headers( {"Content-Type:application/json;charset=UTF-8"} )
@POST( "/autopilot-car-hailing/line/v2/driver/bus/passenger/lineDataWithDriver/query" )
Observable<PM2RoutesResponse> queryDriverSiteByCoordinate(@Header("appId") String appId, @Header("ticket") String ticket, @Body BusPassengerQueryLineRequest request);
/**
* 查询司机端的登陆状态
* @param sn
* @return
*/
@Headers({"Content-type:application/json;charset=UTF-8"})
// @GET("/autopilot-car-hailing/car/v2/driver/bus/passenger/takeOrderStatus/query")
@GET("/autopilot-car-hailing/operation/v1/driver/bus/passenger/loginStatus")
Observable<PM2OperationStatusResponse> queryDriverOperationStatus(@Header ("appId") String appId, @Header("ticket") String ticket, @Query("sn") String sn);
}

View File

@@ -0,0 +1,41 @@
package com.mogo.och.bus.passenger.passenger.presenter
import androidx.lifecycle.LifecycleOwner
import com.mogo.commons.mvp.Presenter
import com.mogo.och.bus.passenger.passenger.callback.ADASCallback
import com.mogo.och.bus.passenger.passenger.constant.M2Const.Companion.M2_MAP_STATION_MAKER
import com.mogo.och.bus.passenger.passenger.model.PM2ADASModel
import com.mogo.och.bus.passenger.passenger.ui.PM2HPMapFragment
class PM2ADASPresenter(view: PM2HPMapFragment?) :
Presenter<PM2HPMapFragment?>(view), ADASCallback {
init {
PM2ADASModel.INSTANCE.init(context)
initListener()
}
private fun initListener() {
PM2ADASModel.INSTANCE.setAdasCallback(this)
}
private fun removeListener() {
PM2ADASModel.INSTANCE.setAdasCallback(null)
}
override fun onDestroy(owner: LifecycleOwner) {
super.onDestroy(owner)
removeListener()
}
override fun updateHDMapStations(stations: MutableList<MutableList<Double>>) {
for (i in stations.indices){
mView?.setMapMaker(M2_MAP_STATION_MAKER+i,stations[i])
}
}
override fun removeHDMapStations() {
mView?.removeMapMaker(M2_MAP_STATION_MAKER)
}
}

View File

@@ -0,0 +1,143 @@
package com.mogo.och.bus.passenger.passenger.presenter
import androidx.lifecycle.LifecycleOwner
import com.amap.api.maps.model.LatLng
import com.mogo.commons.mvp.Presenter
import com.mogo.eagle.core.utilcode.util.ThreadUtils
import com.mogo.och.bus.passenger.passenger.callback.AutoPilotStatusCallback
import com.mogo.och.bus.passenger.passenger.callback.DrivingInfoCallback
import com.mogo.och.bus.passenger.passenger.model.PM2ADASModel
import com.mogo.och.bus.passenger.passenger.model.PM2DrivingModel
import com.mogo.och.bus.passenger.passenger.ui.PM2DrivingInfoFragment
import com.mogo.och.data.bean.BusStationBean
class PM2DrivingPresenter(view: PM2DrivingInfoFragment?) :
Presenter<PM2DrivingInfoFragment?>(view), DrivingInfoCallback, AutoPilotStatusCallback {
init {
PM2DrivingModel.INSTANCE.init(context)
PM2ADASModel.INSTANCE.init(context)
initListener()
}
override fun onDestroy(owner: LifecycleOwner) {
super.onDestroy(owner)
destroyListener()
PM2DrivingModel.INSTANCE.releaseListener()
}
private fun initListener(){
PM2DrivingModel.INSTANCE.setDrivingInfoCallback(this)
PM2DrivingModel.INSTANCE.setAutoStatusCallback(this)
}
private fun destroyListener(){
PM2DrivingModel.INSTANCE.setDrivingInfoCallback(null)
PM2DrivingModel.INSTANCE.setAutoStatusCallback(null)
}
override fun updateSpeed(speed: Int) {
// CallerLogger.d(
// SceneConstant.M_BUS_P + "speed = ",speed.toString()
// )
ThreadUtils.runOnUiThread {
mView?.updateSpeed(speed)
}
}
override fun updatePlateNumber(carNum: String) {
ThreadUtils.runOnUiThread {
mView?.updateCarPlateNum(carNum)
}
}
override fun updateLine(lineName: String, lineDuring: String) {
ThreadUtils.runOnUiThread {
mView?.updateTaskName(lineName)
mView?.updateTaskDuringTime(lineDuring)
}
}
override fun updateRemainMT(meters: Long, timeInSecond: Long) {
ThreadUtils.runOnUiThread {
mView?.updateRemainMT(meters, timeInSecond) //米,秒
}
}
override fun changeOperationStatus(loginStatus: Boolean) {
ThreadUtils.runOnUiThread {
mView?.changeOperationStatus(loginStatus)
}
}
override fun showNoTaskView(isTrue: Boolean) {
ThreadUtils.runOnUiThread {
mView?.showNoTaskView(!isTrue)
}
if (isTrue){
PM2ADASModel.INSTANCE.removeHDMapStations()
}
}
override fun updateLineStations(stations: MutableList<BusStationBean>) {
val stationsList = mutableListOf<LatLng>()
val stationsListPass = mutableListOf<LatLng>()
var startStation: LatLng? = null
var endStation: LatLng? = null
for (i in stations.indices){
val station = stations[i]
val latLng = LatLng(station.gcjLat,station.gcjLon)
if(i==0){
startStation = latLng
continue
}
if(i==stations.size-1){
endStation = latLng
continue
}
if(station.drivingStatus==1){//行驶信息0初始值1已经过2当前站3未到站
stationsListPass.add(latLng)
}else if(station.drivingStatus==2){
if(station.isLeaving){
stationsListPass.add(latLng)
}else{
stationsList.add(latLng)
}
}else{
stationsList.add(latLng)
}
}
ThreadUtils.runOnUiThread {
mView?.updateLineStations(stationsList,stationsListPass,startStation,endStation)
}
PM2ADASModel.INSTANCE.updateHDMapStations(stations)
}
override fun updateStationsInfo(stations: MutableList<BusStationBean>, i: Int, isArrived: Boolean) {
ThreadUtils.runOnUiThread {
mView?.updateStationsInfo(stations,i,isArrived)
}
}
override fun clearCustomPolyline() {
ThreadUtils.runOnUiThread {
mView?.clearCustomPolyline()
}
}
override fun updateAutoStatus(isOpen: Boolean) {
ThreadUtils.runOnUiThread {
mView?.updateAutoStatus(isOpen)
}
}
override fun updateAutoStatus(status: Int) {
}
}

View File

@@ -0,0 +1,7 @@
package com.mogo.och.bus.passenger.passenger.presenter
import com.mogo.commons.mvp.Presenter
import com.mogo.och.bus.passenger.passenger.ui.PM2BaseFragment
class PM2Presenter(view: PM2BaseFragment?) :
Presenter<PM2BaseFragment?>(view)

View File

@@ -0,0 +1,7 @@
package com.mogo.och.bus.passenger.passenger.presenter
import com.mogo.commons.mvp.Presenter
import com.mogo.och.bus.passenger.passenger.ui.video.PM2VideoFragment
class PM2VideoPresenter(view: PM2VideoFragment?) :
Presenter<PM2VideoFragment?>(view)

View File

@@ -0,0 +1,33 @@
package com.mogo.och.bus.passenger.passenger.provider;
import android.content.Context;
import android.view.View;
import com.mogo.och.bus.passenger.passenger.ui.widget.M2StatusBarView;
import androidx.annotation.NonNull;
import com.alibaba.android.arouter.facade.annotation.Route;
import com.mogo.eagle.core.data.constants.MogoServicePaths;
import com.mogo.eagle.core.function.api.hmi.view.IStatusViewLayout;
/**
* @author congtaowang
* @since 2020-01-06
* <p>
* 根据优先级控制显示 window view.
*/
@Route( path = MogoServicePaths.PATH_STATUS_VIEW_MANAGER )
public class M2StatusViewManager implements IStatusViewLayout {
@NonNull
@Override
public View getStatusView(Context context) {
return new M2StatusBarView(context);
}
@Override
public void init(Context context) {
}
}

View File

@@ -1,11 +1,9 @@
package com.mogo.och.bus.passenger.ui
package com.mogo.och.bus.passenger.passenger.ui
import android.provider.Settings
import android.view.Surface
import com.mogo.commons.mvp.MvpFragment
import com.mogo.och.bus.passenger.R
import com.mogo.och.bus.passenger.presenter.PM2Presenter
import com.mogo.och.bus.passenger.ui.video.PM2VideoFragment
import com.mogo.och.bus.passenger.passenger.presenter.PM2Presenter
import com.mogo.och.bus.passenger.passenger.ui.video.PM2VideoFragment
/**
* @author: wangmingjun
@@ -19,7 +17,7 @@ class PM2BaseFragment :
private var videoFragment : PM2VideoFragment? = null
override fun getLayoutId(): Int {
return R.layout.p_m2_fragment
return R.layout.bus_p_m2_fragment
}
override fun getTagName(): String {

View File

@@ -1,4 +1,4 @@
package com.mogo.och.bus.passenger.ui
package com.mogo.och.bus.passenger.passenger.ui
import android.graphics.BitmapFactory
import android.graphics.drawable.AnimationDrawable
@@ -12,11 +12,25 @@ import com.mogo.eagle.core.function.hmi.ui.setting.ToggleDebugView
import com.mogo.eagle.core.function.view.SiteMarkerBean
import com.mogo.eagle.core.widget.media.video.TextureVideoViewOutlineProvider
import com.mogo.och.bus.passenger.R
import com.mogo.och.bus.passenger.presenter.PM2DrivingPresenter
import com.mogo.och.bus.passenger.passenger.presenter.PM2DrivingPresenter
import com.mogo.och.common.module.utils.DateTimeUtil.*
import com.mogo.och.common.module.utils.NumberFormatUtil
import com.mogo.och.data.bean.BusStationBean
import kotlinx.android.synthetic.m2.p_m2_driving_info_fragment.*
import kotlinx.android.synthetic.main.bus_p_m2_driving_info_fragment.auto_tv
import kotlinx.android.synthetic.main.bus_p_m2_driving_info_fragment.clg_distance_left_time
import kotlinx.android.synthetic.main.bus_p_m2_driving_info_fragment.group_not_select_line
import kotlinx.android.synthetic.main.bus_p_m2_driving_info_fragment.group_stationinfo
import kotlinx.android.synthetic.main.bus_p_m2_driving_info_fragment.iv_animal_list
import kotlinx.android.synthetic.main.bus_p_m2_driving_info_fragment.line_during_tv
import kotlinx.android.synthetic.main.bus_p_m2_driving_info_fragment.line_name_tv
import kotlinx.android.synthetic.main.bus_p_m2_driving_info_fragment.overMapView
import kotlinx.android.synthetic.main.bus_p_m2_driving_info_fragment.speed_tv
import kotlinx.android.synthetic.main.bus_p_m2_driving_info_fragment.station_name_tv
import kotlinx.android.synthetic.main.bus_p_m2_driving_info_fragment.tv_arrived_notice
import kotlinx.android.synthetic.main.bus_p_m2_driving_info_fragment.tv_distance
import kotlinx.android.synthetic.main.bus_p_m2_driving_info_fragment.tv_left_time
import kotlinx.android.synthetic.main.bus_p_m2_driving_info_fragment.tv_next_station_title
import me.jessyan.autosize.utils.AutoSizeUtils
import kotlin.math.ceil
import kotlin.math.roundToInt
@@ -28,10 +42,10 @@ import kotlin.math.roundToInt
class PM2DrivingInfoFragment :
MvpFragment<PM2DrivingInfoFragment?, PM2DrivingPresenter?>() {
val stationIcon = BitmapFactory.decodeResource(AbsMogoApplication.getApp().resources, R.drawable.m2_map_staton_icon)
val stationPassIcon = BitmapFactory.decodeResource(AbsMogoApplication.getApp().resources, R.drawable.m2_map_staton_arrived_icon)
val startStationIcon = BitmapFactory.decodeResource(AbsMogoApplication.getApp().resources, R.drawable.m2_map_start_icon)
val endStationIcon = BitmapFactory.decodeResource(AbsMogoApplication.getApp().resources, R.drawable.m2_map_end_icon)
val stationIcon = BitmapFactory.decodeResource(AbsMogoApplication.getApp().resources, R.drawable.bus_p_m2_map_staton_icon)
val stationPassIcon = BitmapFactory.decodeResource(AbsMogoApplication.getApp().resources, R.drawable.bus_p_m2_map_staton_arrived_icon)
val startStationIcon = BitmapFactory.decodeResource(AbsMogoApplication.getApp().resources, R.drawable.bus_p_m2_map_start_icon)
val endStationIcon = BitmapFactory.decodeResource(AbsMogoApplication.getApp().resources, R.drawable.bus_p_m2_map_end_icon)
/**
* 改变自动驾驶状态
@@ -39,7 +53,7 @@ class PM2DrivingInfoFragment :
* @param status 2 - running 1 - enable 2 - disable
*/
override fun getLayoutId(): Int {
return R.layout.p_m2_driving_info_fragment
return R.layout.bus_p_m2_driving_info_fragment
}
override fun getTagName(): String {
@@ -52,12 +66,12 @@ class PM2DrivingInfoFragment :
true
}
line_name_tv.setTextColor(resources.getColor(R.color.m2_line_name_tv_color))
station_name_tv.setTextColor(resources.getColor(R.color.m2_line_name_tv_color))
line_name_tv.setTextColor(resources.getColor(R.color.bus_p_m2_line_name_tv_color))
station_name_tv.setTextColor(resources.getColor(R.color.bus_p_m2_line_name_tv_color))
speed_tv.setVertrial(true)
val intArrayOf = intArrayOf(
requireContext().resources.getColor(R.color.shuttle_color_43cefe),
requireContext().resources.getColor(R.color.shuttle_color_1466fb)
requireContext().resources.getColor(R.color.bus_p_m2_color_43cefe),
requireContext().resources.getColor(R.color.bus_p_m2_color_1466fb)
)
speed_tv.setmColorList(intArrayOf)
@@ -150,7 +164,7 @@ class PM2DrivingInfoFragment :
}
private fun updateNoOrderUI() {
line_name_tv.text = resources.getString(R.string.m2_p_not_select_line_content)
line_name_tv.text = resources.getString(R.string.bus_p_m2_not_select_line_content)
updateNoStationView()
overMapView?.let {
it.clearSiteMarkers()
@@ -164,10 +178,10 @@ class PM2DrivingInfoFragment :
}
}
private fun updateNoStationView(){
station_name_tv.setTextColor(resources.getColor(R.color.m2_next_tv_color))
station_name_tv.text = resources.getString(R.string.m2_p_empty_tv)
tv_distance.text = resources.getString(R.string.m2_p_empty_remain_km)
tv_left_time.text = resources.getString(R.string.m2_p_empty_remain_minute)
station_name_tv.setTextColor(resources.getColor(R.color.bus_p_m2_next_tv_color))
station_name_tv.text = resources.getString(R.string.bus_p_m2_empty_tv)
tv_distance.text = resources.getString(R.string.bus_p_m2_empty_remain_km)
tv_left_time.text = resources.getString(R.string.bus_p_m2_empty_remain_minute)
noLineShow()
}
@@ -177,11 +191,11 @@ class PM2DrivingInfoFragment :
fun updateAutoStatus(isAutoPilot: Boolean) {
if (isAutoPilot){
context?.let { auto_tv.setTextColor(ContextCompat.getColor(it,R.color.m2_p_white_color)) }
context?.let { auto_tv.background = ContextCompat.getDrawable(it,R.drawable.auto_button_bg) }
context?.let { auto_tv.setTextColor(ContextCompat.getColor(it,R.color.bus_p_m2_white_color)) }
context?.let { auto_tv.background = ContextCompat.getDrawable(it,R.drawable.bus_p_m2_auto_button_bg) }
}else{
context?.let { auto_tv.setTextColor(ContextCompat.getColor(it,R.color.shuttle_color_7094ad)) }
context?.let { auto_tv.background = ContextCompat.getDrawable(it,R.drawable.bg_p_m2_auto) }
context?.let { auto_tv.setTextColor(ContextCompat.getColor(it,R.color.bus_p_m2_color_7094ad)) }
context?.let { auto_tv.background = ContextCompat.getDrawable(it,R.drawable.bus_p_m2_bg_p_m2_auto) }
}
}
@@ -212,16 +226,16 @@ class PM2DrivingInfoFragment :
fun updateStationsInfo(stations: MutableList<BusStationBean>, i: Int, isArrived: Boolean){
if (stations.size == 0) return
if (0<= i && i<stations.size){
station_name_tv.setTextColor(resources.getColor(R.color.m2_next_tv_color))
station_name_tv.setTextColor(resources.getColor(R.color.bus_p_m2_next_tv_color))
station_name_tv.text = stations[i].name
}
if (isArrived){//到站
tv_distance.text = resources.getString(R.string.m2_p_empty_remain_km)
tv_left_time.text = resources.getString(R.string.m2_p_empty_remain_minute)
tv_next_station_title.text = resources.getString(R.string.m2_p_station_title_arrived_tv)
tv_distance.text = resources.getString(R.string.bus_p_m2_empty_remain_km)
tv_left_time.text = resources.getString(R.string.bus_p_m2_empty_remain_minute)
tv_next_station_title.text = resources.getString(R.string.bus_p_m2_station_title_arrived_tv)
haveLineAndArrivedStation()
}else{ //前往目的地中
tv_next_station_title.text = resources.getString(R.string.shuttle_p_next_station_title)
tv_next_station_title.text = resources.getString(R.string.bus_p_m2_next_station_title)
haveLineAndArriveingStation()
}
}

View File

@@ -1,18 +1,18 @@
package com.mogo.och.bus.passenger.ui
package com.mogo.och.bus.passenger.passenger.ui
import android.os.Bundle
import com.mogo.commons.mvp.MvpFragment
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager.getMapUIController
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager.getOverlayManager
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
import com.mogo.map.overlay.core.Level
import com.mogo.map.overlay.point.Point
import com.mogo.map.MapDataWrapper
import com.mogo.och.bus.passenger.R
import com.mogo.och.bus.passenger.constant.M2Const.Companion.TYPE_MARKER_M2_LINE
import com.mogo.och.bus.passenger.presenter.PM2ADASPresenter
import com.mogo.och.bus.passenger.passenger.constant.M2Const.Companion.TYPE_MARKER_M2_LINE
import com.mogo.och.bus.passenger.passenger.presenter.PM2ADASPresenter
import com.mogo.och.common.module.utils.OCHThreadPoolManager
import kotlinx.android.synthetic.m2.p_m2_hpmap_fragment.*
import kotlinx.android.synthetic.main.bus_p_m2_hpmap_fragment.mapBizView
import java.util.*
/**
@@ -27,7 +27,7 @@ class PM2HPMapFragment :
* @param status 2 - running 1 - enable 2 - disable
*/
override fun getLayoutId(): Int {
return R.layout.p_m2_hpmap_fragment
return R.layout.bus_p_m2_hpmap_fragment
}
override fun getTagName(): String {

View File

@@ -1,14 +1,14 @@
package com.mogo.och.bus.passenger.ui.video
package com.mogo.och.bus.passenger.passenger.ui.video
import com.google.gson.reflect.TypeToken
import com.mogo.commons.mvp.MvpFragment
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.utilcode.util.GsonUtils
import com.mogo.och.bus.passenger.R
import com.mogo.och.bus.passenger.presenter.PM2VideoPresenter
import com.mogo.och.bus.passenger.passenger.presenter.PM2VideoPresenter
import com.mogo.och.common.module.wigets.video.AdsDatas
import com.mogo.och.common.module.wigets.video.RotationItem
import kotlinx.android.synthetic.m2.p_m2_video_fragment.*
import kotlinx.android.synthetic.main.bus_p_m2_video_fragment.imageVideoRotationView
/**
* @author: wangmingjun
@@ -20,7 +20,7 @@ class PM2VideoFragment :
private var arrayListOf = mutableListOf<RotationItem>()
override fun getLayoutId(): Int {
return R.layout.p_m2_video_fragment
return R.layout.bus_p_m2_video_fragment
}

View File

@@ -1,4 +1,4 @@
package com.mogo.och.bus.passenger.ui.widget
package com.mogo.och.bus.passenger.passenger.ui.widget
import android.content.Context
import android.util.AttributeSet
@@ -7,7 +7,7 @@ import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsListener
import com.mogo.eagle.core.function.hmi.ui.widget.BlueToothView
import com.mogo.eagle.core.utilcode.util.ThreadUtils
import com.mogo.och.bus.passenger.R
import kotlinx.android.synthetic.m2.p_m2_view_blue_tooth.view.*
import kotlinx.android.synthetic.main.bus_p_m2_view_blue_tooth.view.blueView
/**
* 魔戒蓝牙控件
@@ -20,15 +20,15 @@ class M2BlueToothView @JvmOverloads constructor(
) : BlueToothView(context, attrs, defStyleAttr),IMoGoDevaToolsListener {
init {
LayoutInflater.from(context).inflate(R.layout.p_m2_view_blue_tooth, this, true)
LayoutInflater.from(context).inflate(R.layout.bus_p_m2_view_blue_tooth, this, true)
}
override fun mofangStatus(status: Boolean) {
ThreadUtils.runOnUiThread {
if (status) {
blueView.setImageResource(R.drawable.m2_blue_tooth_close)
blueView.setImageResource(R.drawable.bus_p_m2_blue_tooth_close)
} else {
blueView.setImageResource(R.drawable.m2_blue_tooth_open)
blueView.setImageResource(R.drawable.bus_p_m2_blue_tooth_open)
}
}
}

View File

@@ -1,4 +1,4 @@
package com.mogo.och.bus.passenger.ui.widget
package com.mogo.och.bus.passenger.passenger.ui.widget
import android.content.Context
import android.util.AttributeSet
@@ -10,7 +10,9 @@ import com.mogo.eagle.core.function.api.datacenter.union.IMoGoTrafficLightListen
import com.mogo.eagle.core.function.call.v2x.CallerTrafficLightListenerManager
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import com.mogo.och.bus.passenger.R
import kotlinx.android.synthetic.m2.m2_p_traffic_light_view.view.*
import kotlinx.android.synthetic.main.bus_p_m2_traffic_light_view.view.m2_p_traffic_light_bg
import kotlinx.android.synthetic.main.bus_p_m2_traffic_light_view.view.m2_p_traffic_light_iv
import kotlinx.android.synthetic.main.bus_p_m2_traffic_light_view.view.m2_p_traffic_light_time_tv
/**
* bus乘客端红绿灯view
@@ -34,7 +36,7 @@ class M2PTrafficLightView @JvmOverloads constructor(
}
private fun init(context: Context?) {
LayoutInflater.from(context).inflate(R.layout.m2_p_traffic_light_view, this, true)
LayoutInflater.from(context).inflate(R.layout.bus_p_m2_traffic_light_view, this, true)
}
override fun onAttachedToWindow() {
@@ -134,15 +136,15 @@ class M2PTrafficLightView @JvmOverloads constructor(
UiThreadHandler.post {
when (lightId) {
TrafficLightEnum.RED -> {
m2_p_traffic_light_iv.setBackgroundResource(R.drawable.m2_light_red_nor)
m2_p_traffic_light_iv.setBackgroundResource(R.drawable.bus_p_m2_light_red_nor)
this@M2PTrafficLightView.visibility = VISIBLE
}
TrafficLightEnum.YELLOW -> {
m2_p_traffic_light_iv.setBackgroundResource(R.drawable.m2_light_yellow_nor)
m2_p_traffic_light_iv.setBackgroundResource(R.drawable.bus_p_m2_light_yellow_nor)
this@M2PTrafficLightView.visibility = VISIBLE
}
TrafficLightEnum.GREEN -> {
m2_p_traffic_light_iv.setBackgroundResource(R.drawable.m2_light_green_nor)
m2_p_traffic_light_iv.setBackgroundResource(R.drawable.bus_p_m2_light_green_nor)
this@M2PTrafficLightView.visibility = VISIBLE
}
else -> this@M2PTrafficLightView.visibility = GONE
@@ -169,11 +171,11 @@ class M2PTrafficLightView @JvmOverloads constructor(
val layoutParams = layoutParams
if (layoutParams is MarginLayoutParams) {
val lp = layoutParams
lp.width = resources.getDimension(R.dimen.m2_p_light_width).toInt()
lp.width = resources.getDimension(R.dimen.dp_60).toInt()
setLayoutParams(lp)
m2_p_traffic_light_time_tv.visibility = VISIBLE
m2_p_traffic_light_bg.layoutParams.width =
resources.getDimension(R.dimen.m2_p_light_width).toInt()
resources.getDimension(R.dimen.dp_60).toInt()
}
}
}

View File

@@ -1,4 +1,4 @@
package com.mogo.och.bus.passenger.ui.widget
package com.mogo.och.bus.passenger.passenger.ui.widget
import android.annotation.*
import android.content.Context
@@ -18,7 +18,8 @@ import com.mogo.eagle.core.function.call.setting.CallerSkinModeListenerManager
import com.mogo.eagle.core.utilcode.kotlin.*
import com.mogo.eagle.core.utilcode.util.ClickUtils
import com.mogo.och.bus.passenger.R
import kotlinx.android.synthetic.m2.p_m2_view_status_bar.view.*
import kotlinx.android.synthetic.main.bus_p_m2_view_status_bar.view.progress
import kotlinx.android.synthetic.main.bus_p_m2_view_status_bar.view.tv_power_cos
import kotlinx.coroutines.*
import me.jessyan.autosize.utils.AutoSizeUtils
@@ -39,7 +40,7 @@ class M2StatusBarView @JvmOverloads constructor(
private var oldBmsSoc: Float = -1.0f
init {
LayoutInflater.from(context).inflate(R.layout.p_m2_view_status_bar, this, true)
LayoutInflater.from(context).inflate(R.layout.bus_p_m2_view_status_bar, this, true)
setBackgroundColor(Color.parseColor("#80FFFFFF"))
isClickable = true
isFocusable = true

View File

@@ -0,0 +1,199 @@
package com.mogo.och.bus.passenger.passenger.ui.widget
import android.animation.AnimatorSet
import android.animation.ObjectAnimator
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import android.view.animation.AlphaAnimation
import android.view.animation.Animation
import android.widget.ImageView
import androidx.constraintlayout.widget.ConstraintLayout
import com.mogo.eagle.core.function.api.datacenter.union.IMoGoTurnLightListener
import com.mogo.eagle.core.function.call.autopilot.CallerChassisLamplightListenerManager
import com.mogo.eagle.core.function.call.v2x.CallerTurnLightListenerManager
import com.mogo.eagle.core.utilcode.util.ThreadUtils
import com.mogo.och.bus.passenger.R
import com.mogo.och.common.module.manager.lightmanager.TurnLightManager
import kotlinx.android.synthetic.main.bus_p_m2_turn_light_status.view.left_nor_image
import kotlinx.android.synthetic.main.bus_p_m2_turn_light_status.view.left_select_image
import kotlinx.android.synthetic.main.bus_p_m2_turn_light_status.view.right_nor_image
import kotlinx.android.synthetic.main.bus_p_m2_turn_light_status.view.right_select_image
import kotlinx.android.synthetic.main.bus_p_m2_turn_light_status.view.turn_light_layout
/**
* @author: wangmingjun
* @date: 2023/2/13
*/
class M2TurnLightView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr),
IMoGoTurnLightListener, TurnLightManager.TurnLightListener {
companion object {
private const val TAG = "TurnLightViewStatus"
}
private var isLeftLight: Boolean = false
private var isRightLight: Boolean = false
private var isDisappear: Boolean = false
init {
LayoutInflater.from(context)
.inflate(R.layout.bus_p_m2_turn_light_status, this, true)
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
CallerTurnLightListenerManager.addListener(TAG,this)
TurnLightManager.addTurnLightStatusChangeListener(TAG,this)
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
CallerChassisLamplightListenerManager.removeListener(TAG)
CallerTurnLightListenerManager.removeListener(TAG)
}
override fun hideTurnLightView() {
ThreadUtils.runOnUiThread{
if (!isDisappear) {
isDisappear = true
isLeftLight = false
isRightLight = false
animationDisappear()
}
}
}
override fun statusChange(newStatus: TurnLightManager.TurnLightStatus) {
ThreadUtils.runOnUiThread {
setTurnLight(newStatus)
}
}
/**
* 转向灯动画
*/
private fun setTurnLight(directionLight: TurnLightManager.TurnLightStatus) {
if (!isAttachedToWindow) {
return
}
//根据左右进行显示和隐藏,实际要判断每个来的时间和频度
when (directionLight) {
TurnLightManager.TurnLightStatus.TURN_LIGHT_LEFT -> { //左转向
if (!isLeftLight) {
isLeftLight = true
isRightLight = false
isDisappear = false
showNormalAnimation()
left_select_image.visibility = View.VISIBLE
right_select_image.visibility = View.GONE
right_select_image.clearAnimation()
setAnimation(left_select_image)
}
}
TurnLightManager.TurnLightStatus.TURN_LIGHT_RIGHT -> { //右转向
if (!isRightLight) {
isRightLight = true
isLeftLight = false
isDisappear = false
showNormalAnimation()
left_select_image.visibility = View.GONE
right_select_image.visibility = View.VISIBLE
left_select_image.clearAnimation()
setAnimation(right_select_image)
}
}
TurnLightManager.TurnLightStatus.TURN_LIGHT_NONE -> { //消失
if (!isDisappear) {
isDisappear = true
isLeftLight = false
isRightLight = false
animationDisappear()
}
}
}
}
//显示背景
private fun showNormalAnimation() {
val appearAnimation = AlphaAnimation(0f, 1.0f)
appearAnimation.duration = 300
val appearAnimationImage = AlphaAnimation(0f, 1.0f)
appearAnimation.duration = 500
turn_light_layout.startAnimation(appearAnimation)
left_nor_image.startAnimation(appearAnimationImage)
right_nor_image.startAnimation(appearAnimationImage)
turn_light_layout.visibility = View.VISIBLE
left_nor_image.visibility = View.VISIBLE
right_nor_image.visibility = View.VISIBLE
}
//消失动画,当转向等数据为空时候
private fun animationDisappear() {
left_select_image.visibility = View.GONE
right_select_image.visibility = View.GONE
left_select_image.clearAnimation()
right_select_image.clearAnimation()
left_nor_image.clearAnimation()
right_nor_image.clearAnimation()
turn_light_layout.clearAnimation()
val disappearAnimationLeft = AlphaAnimation(1.0f, 0f)
disappearAnimationLeft.duration = 300
val disappearAnimationBg = AlphaAnimation(1.0f, 0f)
disappearAnimationBg.duration = 500
left_nor_image.startAnimation(disappearAnimationLeft)
right_nor_image.startAnimation(disappearAnimationLeft)
turn_light_layout.startAnimation(disappearAnimationBg)
disappearAnimationLeft.setAnimationListener(object : Animation.AnimationListener {
override fun onAnimationRepeat(p0: Animation?) {
}
override fun onAnimationStart(p0: Animation?) {
}
override fun onAnimationEnd(p0: Animation?) {
left_nor_image.visibility = View.GONE
right_nor_image.visibility = View.GONE
}
})
disappearAnimationBg.setAnimationListener(object : Animation.AnimationListener {
override fun onAnimationRepeat(p0: Animation?) {
}
override fun onAnimationStart(p0: Animation?) {
}
override fun onAnimationEnd(p0: Animation?) {
turn_light_layout.visibility = View.GONE
}
})
}
//实现图片闪烁效果
private fun setAnimation(imageView: ImageView) {
val animationSet = AnimatorSet()
val valueAnimator = ObjectAnimator.ofFloat(imageView, "alpha", 0f, 1.0f)
val valueAnimatorDisappear = ObjectAnimator.ofFloat(imageView, "alpha", 1.0f, 0f)
valueAnimator.duration = 1000
valueAnimatorDisappear.duration = 800
valueAnimator.repeatCount = -1
valueAnimatorDisappear.repeatCount = -1
animationSet.playTogether(valueAnimatorDisappear, valueAnimator)
animationSet.start()
}
}

View File

@@ -0,0 +1,137 @@
package com.mogo.och.bus.passenger.passenger.ui.widget.video
import android.content.Context
import android.media.AudioManager
import android.util.AttributeSet
import com.mogo.eagle.core.utilcode.mogo.logger.Logger
import com.mogo.eagle.core.widget.media.video.TextureVideoViewOutlineProvider
import com.shuyu.gsyvideoplayer.utils.GSYVideoType
import com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer
import me.jessyan.autosize.utils.AutoSizeUtils
/**
* @author: wangmingjun
* @date: 2023/2/17
* 隐藏所有控件的player
*/
class AdvanceGSYVideoPlayer: StandardGSYVideoPlayer {
constructor(context: Context?) : super(context)
constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)
init {
hideWidget()
GSYVideoType.setShowType(GSYVideoType.SCREEN_TYPE_16_9)
GSYVideoType.setRenderType(GSYVideoType.GLSURFACE)
}
override fun hideAllWidget() {
Logger.d(ImageAndVideoRotation.TAG, "hideAllWidget")
// hideWidget()
}
override fun changeUiToNormal() {
Logger.d(ImageAndVideoRotation.TAG, "changeUiToNormal-hide")
hideWidget()
}
override fun changeUiToPreparingShow() {
Logger.d(ImageAndVideoRotation.TAG, "changeUiToPreparingShow-hide")
hideWidget()
}
override fun changeUiToPlayingShow() {
Logger.d(ImageAndVideoRotation.TAG, "changeUiToPlayingShow")
setCacheImageViewGone()
}
override fun changeUiToPauseShow() {
Logger.d(ImageAndVideoRotation.TAG, "changeUiToPauseShow-hide")
startPlayLogic()
// hideWidget()
}
override fun changeUiToCompleteShow() {
Logger.d(ImageAndVideoRotation.TAG, "changeUiToCompleteShow")
setCacheImageViewGone()
}
override fun changeUiToPlayingBufferingShow() {
Logger.d(ImageAndVideoRotation.TAG, "changeUiToPlayingBufferingShow -hide")
hideWidget()
}
override fun changeUiToError() {
Logger.d(ImageAndVideoRotation.TAG, "changeUiToError-hide")
hideWidget()
}
private fun hideWidget(){
setViewShowState(mBottomContainer, INVISIBLE)
setViewShowState(mProgressBar, INVISIBLE)
setViewShowState(mCurrentTimeTextView, INVISIBLE)
setViewShowState(mTotalTimeTextView, INVISIBLE)
setViewShowState(mBottomProgressBar, INVISIBLE)
setViewShowState(mBackButton, INVISIBLE)
setViewShowState(mStartButton, INVISIBLE)
setViewShowState(mThumbImageViewLayout, VISIBLE)
setViewShowState(mThumbImageView, VISIBLE)
setViewShowState(mTopContainer, INVISIBLE)
setViewShowState(mLoadingProgressBar, INVISIBLE)
setViewShowState(
mLockScreen, INVISIBLE
)
setIsTouchWiget(false)
isFocusableInTouchMode = false
}
fun setCacheImageViewVisible() {
Logger.d(ImageAndVideoRotation.TAG, "CacheImageViewVISIBLE")
setViewShowState(mThumbImageViewLayout, VISIBLE)
// setViewShowState(mThumbImageView, VISIBLE)
}
fun setCacheImageViewGone() {
Logger.d(ImageAndVideoRotation.TAG, "CacheImageViewGONE")
setViewShowState(mThumbImageViewLayout, INVISIBLE)
// setViewShowState(mThumbImageView, INVISIBLE)
}
//失去焦点声音压低
override fun onLossTransientCanDuck() {
// setStreamVolume(0.2f)
setNeedMute(true)
}
//获取焦点声音恢复
override fun onGankAudio() {
// setStreamVolume(5.0f)
setNeedMute(false)
}
private fun setStreamVolume(percent: Float){
var mAudioManager = mContext?.getSystemService(Context.AUDIO_SERVICE) as AudioManager
var maxVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC)
var volume = (percent * maxVolume).toInt()
if (volume < 0 ){
volume = 0
}
mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC,volume,0)
}
private fun setNeedMute(isMute: Boolean){
gsyVideoManager?.player?.setNeedMute(isMute)
}
override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
super.onSizeChanged(w, h, oldw, oldh)
if (!mIfCurrentIsFullscreen) {
val dp2px = AutoSizeUtils.dp2px(context, 16f)
this.outlineProvider = TextureVideoViewOutlineProvider(dp2px.toFloat())
this.clipToOutline = true
}
}
}

View File

@@ -1,4 +1,4 @@
package com.mogo.och.bus.passenger.ui.widget.video
package com.mogo.och.bus.passenger.passenger.ui.widget.video
import android.annotation.SuppressLint
import android.content.Context
@@ -31,13 +31,13 @@ class AdvanceImageView @JvmOverloads constructor(
@SuppressLint("CheckResult")
fun setImagePath(path: String){
imageView?.setImageResource(R.drawable.m2_p_video_holder)
imageView?.setImageResource(R.drawable.bus_p_m2_p_video_holder)
imageView?.let { Glide.with(context).asBitmap().load(path)
.apply(
RequestOptions().useUnlimitedSourceGeneratorsPool(true)
.placeholder(R.drawable.m2_p_video_holder)
.error(R.drawable.m2_p_video_holder)
.fallback(R.drawable.m2_p_video_holder)
.placeholder(R.drawable.bus_p_m2_p_video_holder)
.error(R.drawable.bus_p_m2_p_video_holder)
.fallback(R.drawable.bus_p_m2_p_video_holder)
.centerCrop()
)
.into(it) }

View File

@@ -0,0 +1,212 @@
package com.mogo.och.bus.passenger.passenger.ui.widget.video
import android.content.Context
import android.view.View
import android.view.ViewGroup
import androidx.viewpager.widget.PagerAdapter
import androidx.viewpager.widget.ViewPager
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
import com.mogo.eagle.core.utilcode.mogo.logger.Logger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.eagle.core.utilcode.util.CountDownTimer
import com.mogo.och.common.module.wigets.video.RotationItem
import com.shuyu.gsyvideoplayer.listener.GSYSampleCallBack
/**
* @author: wangmingjun
* @date: 2023/2/6
*/
class AdvancePagerAdapter(context: Context, viewPager: ViewPager) : PagerAdapter(),
ViewPager.OnPageChangeListener {
private val mContext: Context = context
private val mViewPager: ViewPager = viewPager
private var dataList = mutableListOf<RotationItem>()
private var viewList = mutableListOf<View>()
private var lastPosition = -1
private var current = 0
private val time = 5000
private var pause = false
private var countDownTimer: CountDownTimer? = null
fun setData(list: MutableList<RotationItem>) {
if (list.isEmpty()) return
dataList.addAll(list)
viewList.clear()
list.forEach {
addView(it)
}
mViewPager.addOnPageChangeListener(this)
notifyDataSetChanged()
mViewPager.currentItem = 0
if (viewList.size > 0) {
if (viewList[mViewPager.currentItem] is AdvanceVideoView) {//有人反应第一个是视频不播放这边优化了一下
Logger.d(ImageAndVideoRotation.TAG, "第一个是视频")
val video = viewList[mViewPager.currentItem] as AdvanceVideoView
video.setVideo(gsySampleCallBack)
} else if (viewList[mViewPager.currentItem] is AdvanceImageView) {
Logger.d(ImageAndVideoRotation.TAG, "startTimer()_1")
current = 0//换页重新计算时间
startTimer()
}
}
}
override fun getCount(): Int {
return dataList.size
}
override fun isViewFromObject(view: View, `object`: Any): Boolean {
return view === `object`
}
override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) {
container.removeView(viewList[position])
}
override fun instantiateItem(container: ViewGroup, position: Int): Any {
val view: View = viewList[position]
container.addView(view)
return view
}
override fun getItemPosition(`object`: Any): Int {
return POSITION_NONE
}
private fun addView(item: RotationItem) {
if (item.type == 1) { // 表示视频
val videoView = AdvanceVideoView(mContext)
videoView.setVideoPath(item.path,item.cacheImgPath)
viewList.add(videoView)
} else { // 表示图片
val imageView = AdvanceImageView(mContext)
imageView.setImagePath(item.path)
viewList.add(imageView)
}
}
fun setPause() {
pause = true
if (viewList.size > 0 && viewList[mViewPager.currentItem] is AdvanceVideoView) {
val videoView = viewList[mViewPager.currentItem] as AdvanceVideoView
videoView.setPause()
}
}
fun setResume() {
pause = false
if (viewList.size > 0 && viewList[mViewPager.currentItem] is AdvanceVideoView) {
val videoView = viewList[mViewPager.currentItem] as AdvanceVideoView
videoView.setResume()
}
}
override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
}
override fun onPageSelected(position: Int) {
}
override fun onPageScrollStateChanged(state: Int) {
// 由于viewpager的预加载机制onPageSelected这里面加载videoview 放的跟玩一样 等操作完成后再播放videoview就香了 很丝滑
if (state == 0) { //静止,什么都没做
val currentItem = mViewPager.currentItem
Logger.d(
ImageAndVideoRotation.TAG,
"state = $state currentItem = $currentItem lastPosition = $lastPosition")
if (viewList.size > 1) { //多于1才会循环跳转
if (viewList[mViewPager.currentItem] is AdvanceVideoView) {
val videoView = (viewList[mViewPager.currentItem] as AdvanceVideoView)
videoView.setCacheImageViewVisible()
videoView.setVideo(gsySampleCallBack)
} else if (viewList[mViewPager.currentItem] is AdvanceImageView) {
Logger.d(ImageAndVideoRotation.TAG, "startTimer()")
current = 0//换页重新计算时间
startTimer()
}
lastPosition = mViewPager.currentItem
}
}
}
private var gsySampleCallBack = object : GSYSampleCallBack() {
override fun onPrepared(url: String?, vararg objects: Any?) {
Logger.d(ImageAndVideoRotation.TAG, "onPrepared--$url")
}
override fun onAutoComplete(url: String?, vararg objects: Any?) {
Logger.d(ImageAndVideoRotation.TAG, "onAutoComplete()-$url")
if (viewList[mViewPager.currentItem] is AdvanceVideoView){
val videoView = (viewList[mViewPager.currentItem] as AdvanceVideoView)
if (viewList.size == 1){
videoView.startPlay(url)
}else{
videoView.onVideoReset()
goNextItemView()
}
}
}
override fun onPlayError(url: String?, vararg objects: Any?) {
super.onPlayError(url, *objects)
Logger.d(ImageAndVideoRotation.TAG, "onPlayError()-$url")
if (viewList[mViewPager.currentItem] is AdvanceVideoView){
val videoView = (viewList[mViewPager.currentItem] as AdvanceVideoView)
videoView.onVideoReset()
// videoView.setCacheImageViewVisible()
videoView.clearLocalErrorVideo()
goNextItemView()
}
}
}
private fun startTimer() {
if (countDownTimer != null){
countDownTimer?.cancel()
countDownTimer = null
}
countDownTimer = object : CountDownTimer(5000,1000){
override fun onTick(millisUntilFinished: Long) {
d(SceneConstant.M_BUS_P + "startTimer", "倒计时秒 = ${millisUntilFinished/1000}" )
}
override fun onFinish() {
d(ImageAndVideoRotation.TAG + "startTimer", "5s到跳转")
goNextItemView()
}
}.start()
}
/**
* view 跳转
*/
private fun goNextItemView() {
if (mViewPager.currentItem == viewList.size - 1) {//已经到最后一个
mViewPager.post {
mViewPager.setCurrentItem(0, true)
}
} else {
mViewPager.post {
mViewPager.setCurrentItem(mViewPager.currentItem + 1, true)
}
}
}
}

View File

@@ -1,4 +1,4 @@
package com.mogo.och.bus.passenger.ui.widget.video
package com.mogo.och.bus.passenger.passenger.ui.widget.video
import android.annotation.SuppressLint
import android.content.Context
@@ -91,7 +91,7 @@ class AdvanceVideoView @JvmOverloads constructor(
Logger.d(ImageAndVideoRotation.TAG, "setVideoPath")
// ThreadUtils.runOnUiThread {
// Logger.d(ImageAndVideoRotation.TAG, "bitmap加载")
cacheImage?.setImageResource(R.drawable.m2_p_video_holder)
cacheImage?.setImageResource(R.drawable.bus_p_m2_p_video_holder)
// cacheImage?.let { //暂时去掉加载首帧图,加载视频时,用本地默认图
// Glide.with(context).asBitmap().load(cacheImageUrl)
// .apply(

View File

@@ -0,0 +1,24 @@
package com.mogo.och.bus.passenger.passenger.ui.widget.video
import android.content.Context
import android.util.AttributeSet
import android.view.MotionEvent
import androidx.viewpager.widget.ViewPager
/**
* @author: wangmingjun
* @date: 2023/2/21
*/
class AdvanceViewPager: ViewPager{
constructor(context: Context) : super(context)
constructor(context: Context,attrs: AttributeSet?) : super(context,attrs)
override fun onTouchEvent(ev: MotionEvent?): Boolean {
return false
}
override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {
return false
}
}

View File

@@ -0,0 +1,50 @@
package com.mogo.och.bus.passenger.passenger.ui.widget.video
import android.annotation.SuppressLint
import android.content.Context
import android.util.AttributeSet
import android.widget.RelativeLayout
import com.mogo.och.bus.passenger.passenger.ui.widget.video.AdvancePagerAdapter
import com.mogo.och.bus.passenger.passenger.ui.widget.video.AdvanceViewPager
import com.mogo.och.common.module.wigets.video.RotationItem
/**
* @author: wangmingjun
* @date: 2023/2/6
*/
class ImageAndVideoRotation @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null
) : RelativeLayout(context, attrs) {
private var viewPager: AdvanceViewPager? = null
private var pagerAdapter: AdvancePagerAdapter? = null
companion object {
const val TAG = "ImageAndVideoRotation"
}
init {
initView()
}
@SuppressLint("ClickableViewAccessibility")
private fun initView() {
viewPager = AdvanceViewPager(context)
pagerAdapter = AdvancePagerAdapter(context, viewPager!!)
viewPager?.adapter = pagerAdapter
addView(viewPager, LayoutParams(-1, -1))
}
fun setData(list: MutableList<RotationItem>){
pagerAdapter?.setData(list)
}
fun setPause(){
pagerAdapter?.setPause()
}
fun setResume(){
pagerAdapter?.setResume()
}
}

View File

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 5.7 KiB

View File

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

Before

Width:  |  Height:  |  Size: 6.6 KiB

After

Width:  |  Height:  |  Size: 6.6 KiB

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