diff --git a/OCH/mogo-och-bus-passenger/src/main/assets/map_style.data b/OCH/mogo-och-bus-passenger/src/main/assets/map_style.data old mode 100644 new mode 100755 index 2be43925c7..4deed98e6a Binary files a/OCH/mogo-och-bus-passenger/src/main/assets/map_style.data and b/OCH/mogo-och-bus-passenger/src/main/assets/map_style.data differ diff --git a/OCH/mogo-och-bus-passenger/src/main/assets/map_style_extra.data b/OCH/mogo-och-bus-passenger/src/main/assets/map_style_extra.data old mode 100644 new mode 100755 index 6a172a62e5..a3c0811e86 Binary files a/OCH/mogo-och-bus-passenger/src/main/assets/map_style_extra.data and b/OCH/mogo-och-bus-passenger/src/main/assets/map_style_extra.data differ diff --git a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/callback/IBusPassengerAutopilotPlanningCallback.java b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/callback/IBusPassengerAutopilotPlanningCallback.java index 04cb54dea1..8d93dacbf1 100644 --- a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/callback/IBusPassengerAutopilotPlanningCallback.java +++ b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/callback/IBusPassengerAutopilotPlanningCallback.java @@ -11,7 +11,8 @@ import mogo.telematics.pad.MessagePad; * Created on 2022/3/31 */ public interface IBusPassengerAutopilotPlanningCallback { - void routeResult(List models); + void routeResult(List models,int haveArrivedIndex); void routePlanningToNextStationChanged(long meters, long timeInSecond); void setLineMarker(List models); + void updateTotalDistance(); } diff --git a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/constant/BusPassengerConst.kt b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/constant/BusPassengerConst.kt index 7f23e2f925..38f614a10b 100644 --- a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/constant/BusPassengerConst.kt +++ b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/constant/BusPassengerConst.kt @@ -41,5 +41,8 @@ class BusPassengerConst { //bus平均速度 const val BUS_AVERAGE_SPEED = 25 + + // 订单总里程 + const val BUS_SP_KEY_ORDER_SUM_DIS = "BUS_SP_KEY_ORDER_SUM_DIS" } } \ No newline at end of file diff --git a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/model/BusPassengerModel.java b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/model/BusPassengerModel.java index 99d75f300c..c43f715dbe 100644 --- a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/model/BusPassengerModel.java +++ b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/model/BusPassengerModel.java @@ -22,6 +22,7 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotPlanningListen import com.mogo.eagle.core.network.utils.GsonUtil; import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; +import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr; import com.mogo.eagle.core.utilcode.util.NetworkUtils; import com.mogo.map.navi.IMogoCarLocationChangedListener2; import com.mogo.module.common.MogoApisHandler; @@ -304,16 +305,12 @@ public class BusPassengerModel { int state = autopilotStatusInfo.getState(); CallerLogger.INSTANCE.d( M_BUS_P + TAG, "state = %s", state ); if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) { - if (mADASStatusCallback != null) mADASStatusCallback.onAutopilotRunning(); - // TODO: 2022/3/31 + //2022.7.20 自动驾驶更换成带档位的 +// if (mADASStatusCallback != null) mADASStatusCallback.onAutopilotRunning(); } else if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE) { - // TODO: 2022/3/31 - - if (mADASStatusCallback != null) mADASStatusCallback.onAutopilotEnable(); +// if (mADASStatusCallback != null) mADASStatusCallback.onAutopilotEnable(); } else if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE) { - // TODO: 2022/3/31 - - if (mADASStatusCallback != null) mADASStatusCallback.onAutopilotDisable(); +// if (mADASStatusCallback != null) mADASStatusCallback.onAutopilotDisable(); } } @@ -369,6 +366,13 @@ public class BusPassengerModel { List latLngModels = CoordinateCalculateRouteUtil .coordinateConverterWgsToGcjListCommon(mContext,routePoints); mRoutePoints.addAll(latLngModels); + + float sumLength = CoordinateCalculateRouteUtil.calculateRouteSumLength(mRoutePoints); + SharedPrefsMgr.getInstance(mContext).putInt(BusPassengerConst.BUS_SP_KEY_ORDER_SUM_DIS,(int) sumLength); + + if (mAutopilotPlanningCallback != null){ + mAutopilotPlanningCallback.updateTotalDistance(); + } } public void dynamicCalculateRouteInfo() { @@ -388,7 +392,6 @@ public class BusPassengerModel { if (mAutopilotPlanningCallback != null){ mAutopilotPlanningCallback.routePlanningToNextStationChanged((long)lastSumLength,(long) lastTime); } - } public void startRemainRouteInfo() { @@ -414,10 +417,12 @@ public class BusPassengerModel { public void loopRouteAndWipe() { if (mRoutePoints != null && mRoutePoints.size() > 0){ - List lastPoints = CoordinateCalculateRouteUtil - .getRemainPointListByCompare(mRoutePoints,mLongitude,mLatitude); + int haveArrivedIndex = CoordinateCalculateRouteUtil + .getArrivedPointIndex(mRoutePoints,mLongitude,mLatitude); + + CallerLogger.INSTANCE.d(M_BUS_P + TAG, "thread = "+ Thread.currentThread().getName()+" haveArrivedIndex== " + haveArrivedIndex); if (mAutopilotPlanningCallback != null){ - mAutopilotPlanningCallback.routeResult(lastPoints); + mAutopilotPlanningCallback.routeResult(mRoutePoints,haveArrivedIndex); } } } @@ -440,7 +445,6 @@ public class BusPassengerModel { if (isStart) { BusPassengerModelLoopManager.getInstance().startCalculateRouteInfoLoop(); } else { - mRoutePoints.clear(); BusPassengerModelLoopManager.getInstance().stopCalculateRouteInfLoop(); } } diff --git a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/network/BusPassengerModelLoopManager.java b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/network/BusPassengerModelLoopManager.java index d0d419c996..044f2e3f72 100644 --- a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/network/BusPassengerModelLoopManager.java +++ b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/network/BusPassengerModelLoopManager.java @@ -6,8 +6,12 @@ import com.mogo.och.bus.passenger.model.BusPassengerModel; import java.util.concurrent.TimeUnit; import io.reactivex.Observable; +import io.reactivex.ObservableEmitter; +import io.reactivex.ObservableOnSubscribe; import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.CompositeDisposable; import io.reactivex.disposables.Disposable; +import io.reactivex.functions.Consumer; import io.reactivex.schedulers.Schedulers; import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS_P; @@ -24,8 +28,6 @@ public class BusPassengerModelLoopManager { private static final String TAG = BusPassengerModelLoopManager.class.getSimpleName(); - private Disposable mCalculateRouteDisposable; //每隔2s计算一次剩余里程和时间 - private static final class SingletonHolder { private static final BusPassengerModelLoopManager INSTANCE = new BusPassengerModelLoopManager(); } @@ -35,27 +37,40 @@ public class BusPassengerModelLoopManager { } private Disposable mHeartbeatDisposable; //心跳轮询 - private Disposable mRouteWipeDisposable; //轨迹擦除 + private CompositeDisposable mRouteWipeDisposable = new CompositeDisposable(); + private CompositeDisposable mCalculateRouteDisposable = new CompositeDisposable(); //每隔2s计算一次剩余里程和时间 public void startOrStopRouteAndWipe() { - if (mRouteWipeDisposable != null && !mRouteWipeDisposable.isDisposed()) { - return; - } CallerLogger.INSTANCE.i(M_BUS_P + TAG, "startOrStopRouteWipe()"); - mRouteWipeDisposable = Observable.interval(LOOP_DELAY, - LOOP_LINE_1S, TimeUnit.MILLISECONDS) - .map((aLong -> aLong + 1)) + if (mRouteWipeDisposable == null){ + mRouteWipeDisposable = new CompositeDisposable(); + } + Disposable disposable = startLoopRouteAndWipe() + .doOnSubscribe(new Consumer() { + @Override + public void accept(Disposable disposable) throws Exception { + } + }) + .doOnError(new Consumer() { + @Override + public void accept(Throwable throwable) throws Exception { + } + }) + .delay(LOOP_LINE_1S, TimeUnit.MILLISECONDS, true) // 设置delayError为true,表示出现错误的时候也需要延迟5s进行通知,达到无论是请求正常还是请求失败,都是5s后重新订阅,即重新请求。 .subscribeOn(Schedulers.io()) + .repeat() // repeat保证请求成功后能够重新订阅。 + .retry() // retry保证请求失败后能重新订阅 .observeOn(AndroidSchedulers.mainThread()) - .subscribe(aLong -> BusPassengerModel.getInstance().loopRouteAndWipe()); + .subscribe(new Consumer() { + @Override + public void accept(Integer integer) throws Exception { + } + }); + mRouteWipeDisposable.add(disposable); } public void stopOrStopRouteAndWipe() { - if (mRouteWipeDisposable != null) { - CallerLogger.INSTANCE.i(M_BUS_P + TAG, "stopOrStopRouteWipe()"); - mRouteWipeDisposable.dispose(); - mRouteWipeDisposable = null; - } + if (mRouteWipeDisposable != null) mRouteWipeDisposable.dispose(); } public void startQueryDriverLineLoop() { @@ -80,23 +95,60 @@ public class BusPassengerModelLoopManager { } public void startCalculateRouteInfoLoop() { - if (mCalculateRouteDisposable != null && !mCalculateRouteDisposable.isDisposed()) { - return; - } CallerLogger.INSTANCE.i(M_BUS_P + TAG, "startCalculateRouteInfoLoop()"); - mCalculateRouteDisposable = Observable.interval(LOOP_DELAY, - LOOP_LINE_2S, TimeUnit.MILLISECONDS) - .map((aLong -> aLong + 1)) + if (mCalculateRouteDisposable == null){ + mCalculateRouteDisposable = new CompositeDisposable(); + } + Disposable disposable = startLoopCalculateRouteInfo() + .doOnSubscribe(new Consumer() { + @Override + public void accept(Disposable disposable) throws Exception { + } + }) + .doOnError(new Consumer() { + @Override + public void accept(Throwable throwable) throws Exception { + } + }) + .delay(LOOP_LINE_2S, TimeUnit.MILLISECONDS, true) // 设置delayError为true,表示出现错误的时候也需要延迟5s进行通知,达到无论是请求正常还是请求失败,都是5s后重新订阅,即重新请求。 .subscribeOn(Schedulers.io()) + .repeat() // repeat保证请求成功后能够重新订阅。 + .retry() // retry保证请求失败后能重新订阅 .observeOn(AndroidSchedulers.mainThread()) - .subscribe(aLong -> BusPassengerModel.getInstance().dynamicCalculateRouteInfo()); + .subscribe(new Consumer() { + @Override + public void accept(Integer integer) throws Exception { + } + }); + mCalculateRouteDisposable.add(disposable); } public void stopCalculateRouteInfLoop() { if (mCalculateRouteDisposable != null) { CallerLogger.INSTANCE.i(M_BUS_P + TAG, "stopCalculateRouteInfLoop()"); mCalculateRouteDisposable.dispose(); - mCalculateRouteDisposable = null; } } + + private Observable startLoopRouteAndWipe(){ + return Observable.create(new ObservableOnSubscribe() { + @Override + public void subscribe(ObservableEmitter emitter) throws Exception { + if (emitter.isDisposed()) return; + BusPassengerModel.getInstance().loopRouteAndWipe(); + emitter.onComplete(); + } + }); + } + + private Observable startLoopCalculateRouteInfo(){ + return Observable.create(new ObservableOnSubscribe() { + @Override + public void subscribe(ObservableEmitter emitter) throws Exception { + if (emitter.isDisposed()) return; + BusPassengerModel.getInstance().dynamicCalculateRouteInfo(); + emitter.onComplete(); + } + }); + } } diff --git a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/presenter/BaseBusPassengerPresenter.java b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/presenter/BaseBusPassengerPresenter.java index 51799eb526..17adaf85d7 100644 --- a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/presenter/BaseBusPassengerPresenter.java +++ b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/presenter/BaseBusPassengerPresenter.java @@ -82,7 +82,7 @@ public class BaseBusPassengerPresenter extends Presenter models) { - runOnUIThread(() -> mView.routeResult(models)); + public void routeResult(List models, int haveArrivedIndex) { + runOnUIThread(() -> mView.routeResult(models,haveArrivedIndex)); } @Override @@ -149,4 +149,9 @@ public class BaseBusPassengerPresenter extends Presenter models) { runOnUIThread(() -> mView.setLineMarker(models)); } + + @Override + public void updateTotalDistance() { + runOnUIThread(() -> mView.setProgressBarMax()); + } } diff --git a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/ui/BusPassengerBaseFragment.java b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/ui/BusPassengerBaseFragment.java index b7fee75b5c..076e55c281 100644 --- a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/ui/BusPassengerBaseFragment.java +++ b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/ui/BusPassengerBaseFragment.java @@ -3,17 +3,24 @@ package com.mogo.och.bus.passenger.ui; import android.os.Bundle; import android.text.Html; import android.view.LayoutInflater; +import android.view.View; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.TextView; +import androidx.core.widget.ContentLoadingProgressBar; + import com.mogo.commons.mvp.IView; import com.mogo.commons.mvp.MvpFragment; import com.mogo.commons.mvp.Presenter; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener; +import com.mogo.eagle.core.function.call.hmi.CallerHmiManager; import com.mogo.eagle.core.function.call.map.CallerSmpManager; +import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr; +import com.mogo.eagle.core.utilcode.util.UiThreadHandler; import com.mogo.och.bus.passenger.R; +import com.mogo.och.bus.passenger.constant.BusPassengerConst; import com.mogo.och.common.module.utils.NumberFormatUtil; /** @@ -29,7 +36,7 @@ public abstract class BusPassengerBaseFragment 0){ @@ -119,6 +139,19 @@ public abstract class BusPassengerBaseFragment { // 3. 其他过程直接更新 @@ -139,4 +172,14 @@ public abstract class BusPassengerBaseFragment colorList = new ArrayList<>(); + List textureList = new ArrayList<>(); + List texIndexList = new ArrayList<>(); + private int mHaveArrivedIndex = 0; + private List mLineMarkers = new ArrayList<>(); private IBusPassengerMapViewCallback mIBusPassengerMapViewCallback; @@ -217,17 +221,18 @@ public class BusPassengerMapDirectionView } if (mAMap != null) { - addRouteColorList(); - if (mCoordinatesLatLng.size() > 2) { //设置线段纹理 PolylineOptions polylineOptions = new PolylineOptions(); polylineOptions.addAll(mCoordinatesLatLng); - polylineOptions.colorValues(colorList); polylineOptions.useGradient(true); polylineOptions.width(10); //线段宽度 polylineOptions.lineCapType(PolylineOptions.LineCapType.LineCapRound); + polylineOptions.setCustomTextureList(textureList); + polylineOptions.setCustomTextureIndex(texIndexList); +// polylineOptions.colorValues(colorList); +// polylineOptions.setCustomTexture(BitmapDescriptorFactory.fromResource(R.drawable.taxi_p_map_arrow)); // 绘制线 mPolyline = mAMap.addPolyline(polylineOptions); @@ -240,8 +245,15 @@ public class BusPassengerMapDirectionView * 添加画线颜色值 */ private void addRouteColorList() { - for (int i = 0; i < mCoordinatesLatLng.size(); i++) { - colorList.add(Color.argb(255, 70, 147, 253));//路线颜色 + textureList.clear(); + texIndexList.clear(); + for (int i = 0; i < mCoordinatesLatLng.size(); i++){ + if (i <= mHaveArrivedIndex){ + textureList.add(BitmapDescriptorFactory.fromResource(R.drawable.bus_p_map_arrow_arrived)); + }else { + textureList.add(BitmapDescriptorFactory.fromResource(R.drawable.bus_p_map_arrow_un_arrive)); + } + texIndexList.add(i); } } @@ -314,6 +326,13 @@ public class BusPassengerMapDirectionView mCoordinatesLatLng.addAll(latLngs); } + public void setCoordinatesLatLng(List latLngs,int haveArrivedIndex) { + mCoordinatesLatLng.clear(); + mCoordinatesLatLng.addAll(latLngs); + mHaveArrivedIndex = haveArrivedIndex; + addRouteColorList(); + } + public void clearLineMarkers(){ for (int i =0; i< mLineMarkers.size();i++){ mLineMarkers.get(i).setVisible(false); diff --git a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/ui/BusPassengerRouteFragment.java b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/ui/BusPassengerRouteFragment.java index e1b865de85..74357b47fd 100644 --- a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/ui/BusPassengerRouteFragment.java +++ b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/ui/BusPassengerRouteFragment.java @@ -17,10 +17,12 @@ import com.amap.api.maps.model.LatLng; import com.elegant.utils.UiThreadHandler; import com.mogo.eagle.core.function.call.hmi.CallerHmiManager; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; +import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr; import com.mogo.och.bus.passenger.R; import com.mogo.och.bus.passenger.adapter.BusPassengerLineStationsAdapter; import com.mogo.och.bus.passenger.bean.BusPassengerStation; import com.mogo.och.bus.passenger.callback.IBusPassengerMapViewCallback; +import com.mogo.och.bus.passenger.constant.BusPassengerConst; import com.mogo.och.bus.passenger.presenter.BaseBusPassengerPresenter; import com.mogo.och.bus.passenger.utils.BPRouteDataTestUtils; import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil; @@ -139,10 +141,10 @@ public class BusPassengerRouteFragment extends } } - public void routeResult(List latLngList) { + public void routeResult(List latLngList,int haveArrivedIndex) { CallerLogger.INSTANCE.d(M_BUS_P + TAG, "routeResult:" + latLngList.size()); if (latLngList.size() > 0) { - drawablePolyline(latLngList); + drawablePolyline(latLngList,haveArrivedIndex); } else { clearPolyline(); } @@ -169,9 +171,9 @@ public class BusPassengerRouteFragment extends * * @param coordinates */ - private void drawablePolyline(List coordinates) { + private void drawablePolyline(List coordinates,int haveArrivedIndex) { if (mMapDirectionView != null) { - mMapDirectionView.setCoordinatesLatLng(coordinates); + mMapDirectionView.setCoordinatesLatLng(coordinates,haveArrivedIndex); UiThreadHandler.post(new Runnable() { @Override public void run() { @@ -245,6 +247,8 @@ public class BusPassengerRouteFragment extends } if (currentStationIndex == 0 && isArrived){ //到达始发站且并未出发, 恢复站点marker 清楚路径 清空路径点 + SharedPrefsMgr.getInstance(getContext()) + .remove(BusPassengerConst.BUS_SP_KEY_ORDER_SUM_DIS); clearPolyline(); if (mMapDirectionView != null) mMapDirectionView.clearCoordinatesLatLng(); } diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_map_arrow_arrived.png b/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_map_arrow_arrived.png new file mode 100644 index 0000000000..cbf83bccff Binary files /dev/null and b/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_map_arrow_arrived.png differ diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_map_arrow_un_arrive.png b/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_map_arrow_un_arrive.png new file mode 100644 index 0000000000..99d8bd7b56 Binary files /dev/null and b/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_map_arrow_un_arrive.png differ diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/station_arrow.png b/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/station_arrow.png new file mode 100644 index 0000000000..114c7a2ba7 Binary files /dev/null and b/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/station_arrow.png differ diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_map_arrow_arrived.png b/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_map_arrow_arrived.png new file mode 100644 index 0000000000..cbf83bccff Binary files /dev/null and b/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_map_arrow_arrived.png differ diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_map_arrow_un_arrive.png b/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_map_arrow_un_arrive.png new file mode 100644 index 0000000000..99d8bd7b56 Binary files /dev/null and b/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_map_arrow_un_arrive.png differ diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/station_arrow.png b/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/station_arrow.png new file mode 100644 index 0000000000..114c7a2ba7 Binary files /dev/null and b/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/station_arrow.png differ diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable/bus_p_panel_cur_station_panel.xml b/OCH/mogo-och-bus-passenger/src/main/res/drawable/bus_p_panel_cur_station_panel.xml new file mode 100644 index 0000000000..9cc2472376 --- /dev/null +++ b/OCH/mogo-och-bus-passenger/src/main/res/drawable/bus_p_panel_cur_station_panel.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable/bus_progress_bar_bg.xml b/OCH/mogo-och-bus-passenger/src/main/res/drawable/bus_progress_bar_bg.xml new file mode 100644 index 0000000000..aa1eeaecd0 --- /dev/null +++ b/OCH/mogo-och-bus-passenger/src/main/res/drawable/bus_progress_bar_bg.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable/progress_item_round.xml b/OCH/mogo-och-bus-passenger/src/main/res/drawable/progress_item_round.xml new file mode 100644 index 0000000000..2d74f8fd54 --- /dev/null +++ b/OCH/mogo-och-bus-passenger/src/main/res/drawable/progress_item_round.xml @@ -0,0 +1,14 @@ + + + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_base_fragment.xml b/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_base_fragment.xml index 7a3b8aff27..177cea6b79 100644 --- a/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_base_fragment.xml +++ b/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_base_fragment.xml @@ -28,69 +28,100 @@ + + + + + + + + + + + + + + - - - - - - + app:layout_constraintTop_toTopOf="parent" /> + + app:layout_constraintRight_toLeftOf="@+id/bus_p_route_panel" /> \ No newline at end of file diff --git a/OCH/mogo-och-bus-passenger/src/main/res/values-sw320dp/dimens.xml b/OCH/mogo-och-bus-passenger/src/main/res/values-sw320dp/dimens.xml index e1eebd7bcb..8fac096ef4 100644 --- a/OCH/mogo-och-bus-passenger/src/main/res/values-sw320dp/dimens.xml +++ b/OCH/mogo-och-bus-passenger/src/main/res/values-sw320dp/dimens.xml @@ -47,10 +47,10 @@ 60px 6px - 638px - 316px + 685px + 309px 50px - 38px + 10px 44px 55px 40px diff --git a/OCH/mogo-och-bus-passenger/src/main/res/values/dimens.xml b/OCH/mogo-och-bus-passenger/src/main/res/values/dimens.xml index c32aec9eff..d4bfe96b27 100644 --- a/OCH/mogo-och-bus-passenger/src/main/res/values/dimens.xml +++ b/OCH/mogo-och-bus-passenger/src/main/res/values/dimens.xml @@ -51,7 +51,7 @@ 638px 316px 38px - 38px + 10px 44px 55px 40px diff --git a/OCH/mogo-och-bus/build.gradle b/OCH/mogo-och-bus/build.gradle index 91a03380a4..eea68114f8 100644 --- a/OCH/mogo-och-bus/build.gradle +++ b/OCH/mogo-och-bus/build.gradle @@ -61,12 +61,14 @@ dependencies { implementation rootProject.ext.dependencies.modulecommon implementation rootProject.ext.dependencies.mogo_core_data implementation rootProject.ext.dependencies.mogo_core_function_call + implementation rootProject.ext.dependencies.mogo_core_function_hmi }else { implementation project(":core:mogo-core-utils") implementation project(":foudations:mogo-commons") implementation project(':modules:mogo-module-common') implementation project(':core:mogo-core-data') implementation project(':core:mogo-core-function-call') + implementation project(':core:function-impl:mogo-core-function-hmi') } } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusRoutesResult.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusRoutesResult.java index 9d2f0e6657..ba188d3bee 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusRoutesResult.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusRoutesResult.java @@ -22,6 +22,11 @@ public class BusRoutesResult { public String txtFileMd5 = ""; //轨迹文件md5,默认“” public long contrailSaveTime; //上传轨迹完成时间戳ms:用于MEC本地手动导入轨迹验证时不会被云端轨迹覆盖 public String carModel = ""; //[optional] 车型号(如红旗H9),默认“”,暂不加入校验逻辑、用于人工排查问题 + public String csvFileUrlDPQP = ""; //轨迹文件下载的cos url,默认“” + public String csvFileMd5DPQP = ""; //轨迹文件md5,默认“” + public String txtFileUrlDPQP = ""; //打点文件下载的cos url,默认“” + public String txtFileMd5DPQP = ""; //轨迹文件md5,默认“” + public long contrailSaveTimeDPQP; //上传轨迹完成时间戳ms:用于MEC本地手动导入轨迹验证时不会被云端轨迹覆盖 public int getLineId() { return lineId; @@ -54,6 +59,11 @@ public class BusRoutesResult { ", txtFileMd5='" + txtFileMd5 + '\'' + ", contrailSaveTime=" + contrailSaveTime + ", carModel='" + carModel + '\'' + + ", csvFileUrlDPQP='" + csvFileUrlDPQP + '\'' + + ", csvFileMd5DPQP='" + csvFileMd5DPQP + '\'' + + ", txtFileUrlDPQP='" + txtFileUrlDPQP + '\'' + + ", txtFileMd5DPQP='" + txtFileMd5DPQP + '\'' + + ", contrailSaveTimeDPQP=" + contrailSaveTimeDPQP + '}'; } } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IRefreshBusStationsCallback.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IRefreshBusStationsCallback.java index 854a2699d5..ae4a8b9713 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IRefreshBusStationsCallback.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IRefreshBusStationsCallback.java @@ -9,5 +9,5 @@ import java.util.List; * @date: 2021/10/22 */ public interface IRefreshBusStationsCallback { - void refreshBusStations(List stationList, int currentStation, int nextStation, boolean isArrived); + void refreshBusStations(String lineName,List stationList, int currentStation, int nextStation, boolean isArrived); } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseBusTabFragment.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseBusTabFragment.java index c3ee127ba2..5162de652c 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseBusTabFragment.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseBusTabFragment.java @@ -32,6 +32,7 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListener import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotRecordListenerManager; import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager; import com.mogo.eagle.core.function.call.hmi.CallerHmiManager; +import com.mogo.eagle.core.function.hmi.ui.widget.TrafficDataView; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.util.ToastUtils; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; @@ -76,7 +77,8 @@ public abstract class BaseBusTabFragment private FrameLayout flStationPanelContainer; private Group groupTestPanel; private FrameLayout flSpeed; - private BusArcView mouduleArc; +// private BusArcView mouduleArc; + private TrafficDataView mTrafficDataView; private ImageView mUpgradeTipIv; // private BusTrafficLightView mTrafficLightView; @@ -122,7 +124,7 @@ public abstract class BaseBusTabFragment tvOperationStatus = findViewById(R.id.module_mogo_och_operation_status); flSpeed = (FrameLayout) findViewById(R.id.fl_speed); - mouduleArc = (BusArcView) findViewById(R.id.bus_arc); + mTrafficDataView = (TrafficDataView) findViewById(R.id.bus_arc); panelView = LayoutInflater.from(getContext()).inflate(getStationPanelViewId(), flStationPanelContainer); slidePanelView.setOnSlidePanelMoveToEndListener(onSlideToEndListener); @@ -150,8 +152,8 @@ public abstract class BaseBusTabFragment }); if (DebugConfig.isDebug()) { - mouduleArc.setLongClickable(true); - mouduleArc.setOnLongClickListener(v -> { + mTrafficDataView.setLongClickable(true); + mTrafficDataView.setOnLongClickListener(v -> { CallerLogger.INSTANCE.d(M_BUS + TAG, "长按显示状态工具栏"); Intent intent = new Intent(); intent.putExtra("oper", 52); @@ -207,17 +209,18 @@ public abstract class BaseBusTabFragment // mBadcaseBtn的visible显示逻辑在showBadcaseEntrance内处理 mBadcaseBtn = findViewById(R.id.module_mogo_och_badcase_iv); +// CallerHmiManager.INSTANCE.registerBadCaseCallback( +// () -> { // onShow() +// return mBadcaseBtn; }, +// () -> { // onHide() +// return null; }); + if (mBadcaseBtn != null) { CallerDevaToolsManager.INSTANCE.initBadCase(mBadcaseBtn); if (!HmiBuildConfig.isShowBadCaseView) { CallerAutopilotRecordListenerManager.INSTANCE.addListener(TAG, this); } } - - mAISelectBtn = findViewById(R.id.module_mogo_och_ai_collet_iv); - if (mAISelectBtn != null){ - CallerDevaToolsManager.INSTANCE.initAiCollect(mAISelectBtn); - } } private void updateSwitchMapIcon(){ @@ -254,6 +257,7 @@ public abstract class BaseBusTabFragment public void onAutopilotRecordConfig(@NonNull MessagePad.RecordDataConfig config) { } + /** * 测试到站 */ @@ -481,9 +485,9 @@ public abstract class BaseBusTabFragment */ public void updateSpeedView(float newSpeed) { int speed = (int) (Math.abs(newSpeed) * 3.6F); // 倒车时工控机反馈定位信息中speed为负值 - mouduleArc.setArcColor(Color.parseColor(speed > 60 ? "#DB3137" : "#3E77F6")); - mouduleArc.setValues(speed); - flSpeed.setBackgroundResource(speed > 60 ? R.drawable.bus_yi_biao_pan_bg_speeding : R.drawable.bus_yi_biao_pan_bg_nor); + if (mTrafficDataView != null){ + mTrafficDataView.updateSpeedWithValue(speed); + } } @Override @@ -523,6 +527,8 @@ public abstract class BaseBusTabFragment private TextView lineIdTV; private TextView trajMd5TV; private TextView stopMd5TV; + private TextView trajMd5DPQPTV; + private TextView stopMd5DPQPTV; public void showHideTestBar() { if (busTestBar == null) { @@ -530,6 +536,8 @@ public abstract class BaseBusTabFragment lineIdTV = findViewById(R.id.bus_test_bar_current_line_id); trajMd5TV = findViewById(R.id.bus_test_bar_current_traj_md5); stopMd5TV = findViewById(R.id.bus_test_bar_current_stop_md5); + trajMd5DPQPTV = findViewById(R.id.bus_test_bar_current_traj_md5_dpqp); + stopMd5DPQPTV = findViewById(R.id.bus_test_bar_current_stop_md5_dpqp); } if (busTestBar.getVisibility() == View.VISIBLE) { @@ -539,6 +547,8 @@ public abstract class BaseBusTabFragment lineIdTV.setText("lineId:" + (routesResult == null ? "" : String.valueOf(routesResult.getLineId()))); trajMd5TV.setText("TMd5:" + (routesResult == null ? "" : routesResult.csvFileMd5)); stopMd5TV.setText("SMd5:" + (routesResult == null ? "" : routesResult.txtFileMd5)); + trajMd5DPQPTV.setText("TMd5DPQP:" + (routesResult == null ? "" : routesResult.csvFileMd5DPQP)); + stopMd5DPQPTV.setText("SMd5DPQP:" + (routesResult == null ? "" : routesResult.txtFileMd5DPQP)); busTestBar.setVisibility(View.VISIBLE); } } @@ -549,6 +559,8 @@ public abstract class BaseBusTabFragment lineIdTV.setText("lineId:" + (routesResult == null ? "" : String.valueOf(routesResult.getLineId()))); trajMd5TV.setText("TMd5:" + (routesResult == null ? "" : routesResult.csvFileMd5)); stopMd5TV.setText("SMd5:" + (routesResult == null ? "" : routesResult.txtFileMd5)); + trajMd5DPQPTV.setText("TMd5DPQP:" + (routesResult == null ? "" : routesResult.csvFileMd5DPQP)); + stopMd5DPQPTV.setText("SMd5DPQP:" + (routesResult == null ? "" : routesResult.txtFileMd5DPQP)); } } /** diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java index 8b753cb167..ff6d6b5d2c 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java @@ -26,6 +26,7 @@ import com.mogo.och.bus.constant.BusConst; import com.mogo.och.bus.presenter.BusPresenter; import com.mogo.och.bus.ui.BusSwitchLineActivity; import com.mogo.och.bus.view.SlidePanelView; +import com.mogo.och.common.module.utils.OCHThreadPoolManager; import java.util.List; @@ -42,11 +43,11 @@ public class BusFragment extends BaseBusTabFragment private static final String TAG = "BusFragment"; private TextView mCurrentStationName; - private TextView mStartStationFlag; private TextView mNextStationName; - private TextView mEndStationFlag; - // private TextView mDebugArrive; + private TextView mCurrentTag; + private TextView mNextTag; private TextView mSwitchLine; //切换路线 + private TextView mLineName; private int mCurrentStation = 0; private View mBus; @@ -64,11 +65,11 @@ public class BusFragment extends BaseBusTabFragment super.initViews(); mBus = findViewById(R.id.module_och_bus_tag); mCurrentStationName = findViewById(R.id.module_och_bus_current_station); - mStartStationFlag = findViewById(R.id.module_och_bus_start_station_tag); + mCurrentTag = findViewById(R.id.module_och_bus_current_station_anchor); mNextStationName = findViewById(R.id.module_och_bus_order_end_station); - mEndStationFlag = findViewById(R.id.module_och_bus_end_station_tag); + mNextTag = findViewById(R.id.module_och_bus_next_station_anchor); mSwitchLine = findViewById(R.id.switch_line_btn); -// mDebugArrive = findViewById(R.id.module_och_bus_arrive_station); + mLineName = findViewById(R.id.module_och_bus_line_name); if (DebugConfig.isDebug()) { mBus.setOnClickListener(view -> { @@ -76,10 +77,6 @@ public class BusFragment extends BaseBusTabFragment mPresenter.queryBusRoutes(); }); -// mBus.setOnLongClickListener(view -> { -// getActivity().finish(); -// return true; -// }); //debug下调用测试面板 mCurrentStationName.setOnLongClickListener(v -> { debugTestBar(); @@ -132,7 +129,8 @@ public class BusFragment extends BaseBusTabFragment * @param nextStation 下个站点 * @param isArrived 是否都站 */ - public void refreshBusStations(List stationList, int currentStation, int nextStation, boolean isArrived) { + public void refreshBusStations(String lineName,List stationList + , int currentStation, int nextStation, boolean isArrived) { mCurrentStation = currentStation; if (getActivity() == null) { return; @@ -144,25 +142,25 @@ public class BusFragment extends BaseBusTabFragment } // 渲染小巴路线数据 - renderCurrentStationStatus(stationList, currentStation, nextStation, isArrived); + renderCurrentStationStatus(lineName,stationList, currentStation, nextStation, isArrived); }); } /** * 重新刷新站点信息 isArrived 是否到站 */ - private void renderCurrentStationStatus(List stationList, int currentStation + private void renderCurrentStationStatus(String lineName,List stationList, int currentStation , int nextStation, boolean isArrived) { CallerLogger.INSTANCE.d(M_BUS + "MapMaker ", "currentStation=" + currentStation + ",nextStation=" + nextStation + "isArrived=" + isArrived); String currentStationName = null; String nextStationName = null; - int startStationFlagVisibility = View.INVISIBLE; - int endStationFlagVisibility = View.INVISIBLE; boolean isArriveEndStation = false; boolean isArriveAtStation = false; boolean isArriveAtStartStation = false; + mLineName.setText(lineName); + // 获取当前站点的名称 currentStationName = stationList.get(currentStation).getName(); @@ -171,9 +169,8 @@ public class BusFragment extends BaseBusTabFragment // 是否到达起点 if (currentStation == 0) { - startStationFlagVisibility = View.VISIBLE; isArriveAtStartStation = true; - mStartStationFlag.setText(getResources().getString(R.string.bus_arrive_to_end_start)); + mCurrentTag.setText(getResources().getString(R.string.bus_arrive_to_end_start)); setOrRemoveMapMaker(true, BusConst.BUS_START_MAP_MAKER, startStation.getLat() , startStation.getLon(),R.raw.star_marker); @@ -181,6 +178,8 @@ public class BusFragment extends BaseBusTabFragment , endStation.getLon(),R.raw.end_marker); } else if (currentStation > 0 && currentStation < stationList.size() - 1) {// 是否到达站点 isArriveAtStation = true; + mCurrentTag.setText(getResources().getString(R.string.bus_arrive_to_current_tag)); + mNextTag.setText(getResources().getString(R.string.bus_arrive_to_next_tag)); setOrRemoveMapMaker(false, BusConst.BUS_START_MAP_MAKER, startStation.getLat() , startStation.getLon(),R.raw.star_marker); @@ -189,9 +188,7 @@ public class BusFragment extends BaseBusTabFragment } else if (currentStation == stationList.size() - 1) {// 是否到达终点 isArriveEndStation = true; nextStationName = "--"; - mStartStationFlag.setText(getResources().getString(R.string.bus_arrive_to_end_end)); - startStationFlagVisibility = View.VISIBLE; - endStationFlagVisibility = View.INVISIBLE; + mNextTag.setText(getResources().getString(R.string.bus_arrive_to_end_end)); setOrRemoveMapMaker(false, BusConst.BUS_START_MAP_MAKER, startStation.getLat() , startStation.getLon(),R.raw.star_marker); @@ -211,8 +208,16 @@ public class BusFragment extends BaseBusTabFragment } // 是否到达终点 - if (nextStation == stationList.size() - 1) { - endStationFlagVisibility = View.VISIBLE; + if ( nextStation == stationList.size() - 1 || nextStation == -1) { + mNextTag.setText(getResources().getString(R.string.bus_arrive_to_end_end)); + }else { + mNextTag.setText(getResources().getString(R.string.bus_arrive_to_next_tag)); + } + + if (currentStation == 0 && isArrived){ + showOrHideSwitchLineBtn(true); + }else { + showOrHideSwitchLineBtn(false); } // 重置滑动按钮文字 @@ -226,12 +231,17 @@ public class BusFragment extends BaseBusTabFragment mCurrentStationName.setText(currentStationName); mNextStationName.setText(nextStationName); - mStartStationFlag.setVisibility(startStationFlagVisibility); - mEndStationFlag.setVisibility(endStationFlagVisibility); - updateBusTestBarInfo(); } + private void showOrHideSwitchLineBtn(boolean isShow) { + if (isShow){ + mSwitchLine.setVisibility(View.VISIBLE); + }else { + mSwitchLine.setVisibility(View.GONE); + } + } + public void hideOchBus() { // tvNotice.setVisibility(View.GONE); } @@ -328,27 +338,43 @@ public class BusFragment extends BaseBusTabFragment */ private void setOrRemoveMapMaker(boolean isAdd, String uuid, double lat, double longi,int resourceId) { if (isAdd) { - CallerLogger.INSTANCE.d(M_BUS + "setMapMaker= ", uuid + "=latitude=" + lat + ",longitude=" + longi); + Runnable setMapMarkerRunnable = new Runnable() { + @Override + public void run() { + CallerLogger.INSTANCE.d(M_BUS + "setMapMaker= "+Thread.currentThread().getName(), + uuid + "=latitude=" + lat + ",longitude=" + longi); - MogoMarkerOptions options = new MogoMarkerOptions() - .owner(BusConst.TYPE_MARKER_BUS_ORDER) - .anchor(0.5f, 0.5f) - .set3DMode(true) - .gps(true) - .controlAngle(true) - .icon3DRes(resourceId) - .latitude(lat) - .longitude(longi); - IMogoMarker marker = MogoMarkerManager.getInstance(AbsMogoApplication.getApp()) .addMarker(uuid, options); - CenterLine centerLine = CallerHDMapManager.INSTANCE.getCenterLineInfo( - longi,lat,-1); - if (null != centerLine){ // 有可能鹰眼map为空没有角度。判空使用后可能造成maker角度跟道路角度不一致 - marker.setRotateAngle(centerLine.getAngle().floatValue()); - } + MogoMarkerOptions options = new MogoMarkerOptions() + .owner(BusConst.TYPE_MARKER_BUS_ORDER) + .anchor(0.5f, 0.5f) + .set3DMode(true) + .gps(true) + .controlAngle(true) + .icon3DRes(resourceId) + .latitude(lat) + .longitude(longi); + IMogoMarker marker = MogoMarkerManager.getInstance(AbsMogoApplication.getApp()) .addMarker(uuid, options); + CenterLine centerLine = CallerHDMapManager.INSTANCE.getCenterLineInfo( + longi,lat,-1); + if (null != centerLine){ // 有可能鹰眼map为空没有角度。判空使用后可能造成maker角度跟道路角度不一致 + marker.setRotateAngle(centerLine.getAngle().floatValue()); + } + } + }; + + OCHThreadPoolManager.getsInstance().execute(setMapMarkerRunnable); }else { - CallerLogger.INSTANCE.d(M_BUS + "RemoveMapMaker=",uuid+"=latitude="+lat+",longitude="+longi); - MogoMarkerManager.getInstance(AbsMogoApplication.getApp()).removeMarkers(uuid); + Runnable removeMapMarkerRunnable = new Runnable() { + @Override + public void run() { + CallerLogger.INSTANCE.d(M_BUS + "RemoveMapMaker="+Thread.currentThread().getName(), + uuid+"=latitude="+lat+",longitude="+longi); + MogoMarkerManager.getInstance(AbsMogoApplication.getApp()).removeMarkers(uuid); + } + }; + + OCHThreadPoolManager.getsInstance().execute(removeMapMarkerRunnable); } } @@ -374,5 +400,4 @@ public class BusFragment extends BaseBusTabFragment startActivity(intent); } } - } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/model/BusOrderModel.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/model/BusOrderModel.java index dffee2123e..e1b8f695b2 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/model/BusOrderModel.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/model/BusOrderModel.java @@ -11,6 +11,7 @@ import android.location.Location; import android.os.Handler; import android.os.Message; import android.text.TextUtils; +import android.util.Log; import androidx.annotation.NonNull; @@ -79,7 +80,6 @@ import mogo.telematics.pad.MessagePad; public class BusOrderModel { private final String TAG = BusOrderModel.class.getSimpleName(); private int currentLineId = -1; - private int currentStationIndex = 0; //因为服务端和前台对于当前站不一致,所以设置两个current index, 一个用于前台展示, 一个用于服务端接口请求 private int backgroundCurrentStationIndex = 0;//A->B 此处值是A站点索引 /** * 运营状态、后端更具运营状态来判断车辆是否派单 @@ -246,12 +246,12 @@ public class BusOrderModel { * 上报订单全路径规划数据 */ public void updateOrderRoute() { - if (!isGoingToNextStation || currentStationIndex >= stationList.size() || currentStationIndex-1 < 0 || points.size() == 0){ + if (!isGoingToNextStation || backgroundCurrentStationIndex+1 >= stationList.size() || points.size() == 0){ return; } - BusStationBean currentStation = stationList.get( currentStationIndex -1); - BusStationBean nextStation = stationList.get( currentStationIndex); + BusStationBean currentStation = stationList.get( backgroundCurrentStationIndex); + BusStationBean nextStation = stationList.get( backgroundCurrentStationIndex +1); BusServiceManager.getInstance().updateOrderRoute(mContext, currentLineId, currentStation.getSiteId() , nextStation.getSiteId(), points, new IBusServiceCallback() { @@ -446,11 +446,10 @@ public class BusOrderModel { if (!isOneWayOver){ CallerLogger.INSTANCE.d( M_BUS + TAG, "自动驾驶开启开往下一站====" ); //需要更改当前站和下一站的状态 然后渲染 - RenderLeaveStationSuccess(o.getResult(),isRestart); + leaveStationSuccess(o.getResult(),isRestart); }else { CallerLogger.INSTANCE.d( M_BUS + TAG, "单程真的结束了====" ); isGoingToNextStation = false; - currentStationIndex = 0; backgroundCurrentStationIndex = 0; CallerAutoPilotManager.INSTANCE.cancelAutoPilot(); queryBusRoutes(); @@ -480,7 +479,7 @@ public class BusOrderModel { paramIndexes = {0}, clientPkFileName = "sn" ) - private void RenderLeaveStationSuccess(BusRoutesResult result, boolean isRestart) { + private void leaveStationSuccess(BusRoutesResult result, boolean isRestart) { renderBusStationsStatus(result); if (slidePannelHideCallback != null) { slidePannelHideCallback.hideSlidePanel(); @@ -500,8 +499,8 @@ public class BusOrderModel { * @param isRestart */ private void startAutopilot(boolean isRestart) { - BusStationBean currentStation = stationList.get( currentStationIndex -1); - BusStationBean nextStation = stationList.get( currentStationIndex); + BusStationBean currentStation = stationList.get( backgroundCurrentStationIndex); + BusStationBean nextStation = stationList.get( backgroundCurrentStationIndex + 1); // if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE // == CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState()) { @@ -523,7 +522,10 @@ public class BusOrderModel { busRoutesResult.getLineId(), busRoutesResult.csvFileUrl, busRoutesResult.csvFileMd5, busRoutesResult.txtFileUrl, busRoutesResult.txtFileMd5, - busRoutesResult.contrailSaveTime, busRoutesResult.carModel); + busRoutesResult.contrailSaveTime, busRoutesResult.carModel, + busRoutesResult.csvFileUrlDPQP, busRoutesResult.csvFileMd5DPQP, + busRoutesResult.txtFileUrlDPQP, busRoutesResult.txtFileMd5DPQP, + busRoutesResult.contrailSaveTimeDPQP); } CallerLogger.INSTANCE.d( M_BUS + TAG, "开启自动驾驶====" + GsonUtil.jsonFromObject(parameters) +" startLatLon="+currentStation.getName()+",endLatLon="+nextStation.getName()); @@ -540,9 +542,14 @@ public class BusOrderModel { * 到站后重置站点状态 */ private void arriveSiteStation(boolean isRestart) { - CallerLogger.INSTANCE.d(M_BUS + TAG,"arriveSiteStation-currentStationIndex = "+currentStationIndex); + int arrivedStationIndex = 0; + if (!isRestart){ + arrivedStationIndex = backgroundCurrentStationIndex + 1; + } + CallerLogger.INSTANCE.d(M_BUS + TAG,"arriveSiteStation-currentStationIndex = "+ arrivedStationIndex); + BusServiceManager.getInstance().arriveSiteStation(mContext - , stationList.get(currentStationIndex).getSeq(), stationList.get(currentStationIndex).getSiteId() + , stationList.get(arrivedStationIndex).getSeq(), stationList.get(arrivedStationIndex).getSiteId() , new IBusServiceCallback() { @Override public void onSuccess(BaseData o) { @@ -567,9 +574,9 @@ public class BusOrderModel { private void renderArriveBusStation() { List site = busRoutesResult.getSites(); if (site != null && site.size() > 0){ - backgroundCurrentStationIndex = currentStationIndex; + backgroundCurrentStationIndex ++; if (refreshBusStationsCallback != null){ - refreshBusStationsCallback.refreshBusStations(stationList, currentStationIndex + refreshBusStationsCallback.refreshBusStations(busRoutesResult.getName(),stationList, backgroundCurrentStationIndex , getNextStopStation(),true); } } @@ -582,7 +589,7 @@ public class BusOrderModel { CallerLogger.INSTANCE.d( M_BUS + TAG, "查询到站下车乘客"); BusServiceManager.getInstance().queryStationLeaveAwayPassengers(mContext - , stationList.get(currentStationIndex).getSeq(), stationList.get(currentStationIndex).getSiteId() + , stationList.get(backgroundCurrentStationIndex +1).getSeq(), stationList.get(backgroundCurrentStationIndex+1).getSiteId() , new IBusServiceCallback() { @Override public void onSuccess(QueryLeaveAwayPassengersResponse o) { @@ -646,7 +653,7 @@ public class BusOrderModel { startOrStopOrderLoop(mIsWorking); if ( stationList != null && stationList.size() > 0 ) { AIAssist.getInstance( mContext ).speakTTSVoice( "车辆已整备完毕,请前往" - + stationList.get( currentStationIndex ).getName() + "站点" ); + + stationList.get( backgroundCurrentStationIndex ).getName() + "站点" ); } carOperationStatusCallback.changeOperationStatus(isWorking()); queryBusRoutes(); @@ -705,7 +712,7 @@ public class BusOrderModel { /** * 渲染站点信息 * 服务端返回的OchBusRoutesResult逻辑, 离开站为当前站, 到达下一站后才会将下一站置为当前站, - * 车机端展示是离开当前站,下一站设置为当前站, 所以服务端数据回来要做处理current index,不能直接渲染 + * 车机端展示 离开站为当前站点,前往站为下一站, 下一站到站后在置为当前站 * @param result */ private void renderBusStationsStatus(BusRoutesResult result) { @@ -717,43 +724,47 @@ public class BusOrderModel { stationList.addAll( site ); for ( int i = 0; i < stationList.size(); i++ ) { BusStationBean s = stationList.get( i ); + + CallerLogger.INSTANCE.d( M_BUS + "renderBusStationsStatus--", + "Index="+ i+" ,name = "+s.getName()+" ,"+s.isLeaving()+","+s.getDrivingStatus()); + // 是否正在开往下一站 if ( s.isLeaving()) { isGoingToNextStation = true; } // 当前站点信息 if (s.getDrivingStatus() == STATION_STATUS_STOPPED ) { - currentStationIndex = i; + backgroundCurrentStationIndex = i; break; } } - backgroundCurrentStationIndex = currentStationIndex; - BusStationBean currentStation = stationList.get(currentStationIndex); - CallerLogger.INSTANCE.d( M_BUS + TAG, "渲染站点信息服务端currentStationIndex="+currentStationIndex + + BusStationBean currentStation = stationList.get(backgroundCurrentStationIndex); + + CallerLogger.INSTANCE.d( M_BUS + TAG, + "渲染站点信息服务端currentStationIndex="+backgroundCurrentStationIndex +" isLeaving()="+currentStation.isLeaving()); + //当前站点是始发站,告诉服务端到达始发站。 如果没有这个节点, 服务器不知道始发站到达状态 // ,订单开始站下在始发站的状态流转有问题 - if (currentStationIndex == 0 && !currentStation.isLeaving()){ + if (backgroundCurrentStationIndex == 0 && !currentStation.isLeaving()){ arriveSiteStation(true); } + // 美化是否开始 - if (FunctionBuildConfig.isDemoMode && (currentStationIndex >= 0 - && currentStationIndex <= stationList.size()-1) - && stationList.get(currentStationIndex).isLeaving()){//行驶过程中设置美化 + if (FunctionBuildConfig.isDemoMode && (backgroundCurrentStationIndex >= 0 + && backgroundCurrentStationIndex <= stationList.size()-1) + && stationList.get(backgroundCurrentStationIndex).isLeaving()){//行驶过程中设置美化 FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = true; CallerAutoPilotManager.INSTANCE.setDemoMode(true); CallerLogger.INSTANCE.d(M_BUS + TAG, "美化模式-ignore:置为true(每次滑动出发)"); } + if (refreshBusStationsCallback != null){ - if (currentStation.isLeaving()){//如果服务端的当前站是leaving状态,展示当前站需要+1 - currentStationIndex ++; - refreshBusStationsCallback.refreshBusStations(stationList - , currentStationIndex, getNextStopStation(),false); - }else{ - refreshBusStationsCallback.refreshBusStations(stationList - , currentStationIndex, getNextStopStation(),true); - } + refreshBusStationsCallback.refreshBusStations(result.getName(),stationList + , backgroundCurrentStationIndex, getNextStopStation(),!currentStation.isLeaving()); } + if ( currentStation.isLeaving() && slidePannelHideCallback != null) { slidePannelHideCallback.hideSlidePanel(); } @@ -768,10 +779,10 @@ public class BusOrderModel { * @return -1 当前已是最后一个站点 */ private int getNextStopStation() { - if ( currentStationIndex >= stationList.size() - 1 ) { + if ( backgroundCurrentStationIndex >= stationList.size() - 1 ) { return -1; } - int nextStationIndex = currentStationIndex + 1; + int nextStationIndex = backgroundCurrentStationIndex + 1; for ( ; nextStationIndex < stationList.size() - 1; nextStationIndex++ ) { if ( stationList.get( nextStationIndex ).getIfStop() == 1 ) { break; @@ -802,12 +813,13 @@ public class BusOrderModel { * @param awayPassengersResponse */ private void playLeavePassengersMsg( QueryLeaveAwayPassengersResponse awayPassengersResponse ) { - CallerLogger.INSTANCE.d( M_BUS + TAG, "播报下车乘客信息currentStationIndex="+currentStationIndex); + CallerLogger.INSTANCE.d( M_BUS + TAG, "播报下车乘客信息currentStationIndex=" + + String.valueOf(backgroundCurrentStationIndex + 1)); - if ( currentStationIndex > stationList.size() - 1 ) { + if ( backgroundCurrentStationIndex +1 > stationList.size() - 1 ) { return; } - String station = stationList.get( currentStationIndex ).getName(); + String station = stationList.get( backgroundCurrentStationIndex+1 ).getName(); StringBuilder builder = new StringBuilder( "已到达" ); builder.append( station ); if ( !station.endsWith( "站" ) ) { @@ -854,9 +866,8 @@ public class BusOrderModel { * 行程结束 */ private void travelOver() { -// CallerLogger.INSTANCE.d( M_BUS + TAG, "行程结束"); - if ( currentStationIndex >= stationList.size() ) { + if ( backgroundCurrentStationIndex >= stationList.size() ) { CallerLogger.INSTANCE.e( M_BUS + TAG, "travel over index out of station list" ); return; } @@ -875,19 +886,18 @@ public class BusOrderModel { * @param data */ public void onArriveAt( MessagePad.ArrivalNotification data){ - if ( currentStationIndex > stationList.size() - 1 ) { + if ( backgroundCurrentStationIndex +1 > stationList.size() - 1 ) { CallerLogger.INSTANCE.e( M_BUS + TAG, "到站异常,取消后续操作结束" ); return; } - if (FunctionBuildConfig.isDemoMode && currentStationIndex <= stationList.size() - 1) {//到达一站结束美化 + if (FunctionBuildConfig.isDemoMode && backgroundCurrentStationIndex <= stationList.size() - 1) {//到达一站结束美化 FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = false; CallerAutoPilotManager.INSTANCE.setDemoMode(false); CallerLogger.INSTANCE.d(M_BUS + TAG, "美化模式-ignore:置为false(到最后一站)"); } - CallerLogger.INSTANCE.d( M_BUS + TAG, "到站====currentStationIndex=" + currentStationIndex); + CallerLogger.INSTANCE.d( M_BUS + TAG, "到站====currentStationIndex=" + backgroundCurrentStationIndex); isGoingToNextStation = false; - // 到达站点后,更新站点状态 -// currentStationIndex = getNextStopStation(); + queryStationLeaveAwayPassengers(); UiThreadHandler.postDelayed(new Runnable() {// 先查询下车乘客,再上报到站,便于后台筛查下车订单 @Override @@ -930,11 +940,11 @@ public class BusOrderModel { } public void triggerStartServiceEvent(boolean isRestart, boolean send) { - if (stationList == null || currentStationIndex >= stationList.size() || currentStationIndex == 0) { + if (stationList == null || backgroundCurrentStationIndex >= stationList.size() || backgroundCurrentStationIndex == 0) { return; } - BusStationBean currentStation = stationList.get( currentStationIndex -1); - BusStationBean nextStation = stationList.get( currentStationIndex); + BusStationBean currentStation = stationList.get( backgroundCurrentStationIndex); + BusStationBean nextStation = stationList.get( backgroundCurrentStationIndex +1); BusAnalyticsManager.getInstance().triggerStartAutopilotEvent(isRestart, send, currentStation.getName(), nextStation.getName(), currentLineId); } @@ -944,6 +954,6 @@ public class BusOrderModel { } public int getCurrentStationIndex() { - return currentStationIndex; + return backgroundCurrentStationIndex; } } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusPresenter.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusPresenter.java index c5e16e1060..d5cb01601e 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusPresenter.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusPresenter.java @@ -120,14 +120,15 @@ public class BusPresenter extends Presenter } @Override - public void refreshBusStations(List stationList, int currentStation, int nextStation, boolean isArrived) { + public void refreshBusStations(String lineName,List stationList + , int currentStation, int nextStation, boolean isArrived) { mStationList.clear(); mStationList.addAll(stationList); mCurrentStation = currentStation; // functionDemoModeChange(); CallerLogger.INSTANCE.d(M_BUS + "BusOrderModel =", " mCurrentStation =" + mCurrentStation); if (mView != null) { - runOnUIThread(() -> mView.refreshBusStations( + runOnUIThread(() -> mView.refreshBusStations(lineName, stationList, currentStation, nextStation, isArrived)); } } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/util/BusTrajectoryManager.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/util/BusTrajectoryManager.java index 430909a7b4..85654e2853 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/util/BusTrajectoryManager.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/util/BusTrajectoryManager.java @@ -40,9 +40,9 @@ public class BusTrajectoryManager { private Disposable mSendReqDisposable = null; public BusTrajectoryManager() { - mAutoPilotLine = new AutopilotControlParameters.AutoPilotLine( - -1, "", "", "", "", - 0, ""); + mAutoPilotLine = new AutopilotControlParameters.AutoPilotLine(-1, + "", "", "", "", 0, "", + "", "", "", "", 0); } /** @@ -106,7 +106,10 @@ public class BusTrajectoryManager { mAutoPilotLine = new AutopilotControlParameters.AutoPilotLine(routesResult.getLineId(), routesResult.csvFileUrl, routesResult.csvFileMd5, routesResult.txtFileUrl, routesResult.txtFileMd5, - routesResult.contrailSaveTime, routesResult.carModel); + routesResult.contrailSaveTime, routesResult.carModel, + routesResult.csvFileUrlDPQP, routesResult.csvFileMd5DPQP, + routesResult.txtFileUrlDPQP, routesResult.txtFileMd5DPQP, + routesResult.contrailSaveTimeDPQP); } else { mAutoPilotLine.setLineId(routesResult.getLineId()); mAutoPilotLine.setTrajUrl(routesResult.csvFileUrl); @@ -115,6 +118,11 @@ public class BusTrajectoryManager { mAutoPilotLine.setStopMd5(routesResult.txtFileMd5); mAutoPilotLine.setTimestamp(routesResult.contrailSaveTime); mAutoPilotLine.setVehicleModel(routesResult.carModel); + mAutoPilotLine.setTrajUrl_dpqp(routesResult.csvFileUrlDPQP); + mAutoPilotLine.setTrajMd5_dpqp(routesResult.csvFileMd5DPQP); + mAutoPilotLine.setStopUrl_dpqp(routesResult.txtFileUrlDPQP); + mAutoPilotLine.setStopMd5_dpqp(routesResult.txtFileMd5DPQP); + mAutoPilotLine.setTimestamp_dpqp(routesResult.contrailSaveTimeDPQP); } } } @@ -128,6 +136,11 @@ public class BusTrajectoryManager { mAutoPilotLine.setStopMd5(""); mAutoPilotLine.setTimestamp(0); mAutoPilotLine.setVehicleModel(""); + mAutoPilotLine.setTrajUrl_dpqp(""); + mAutoPilotLine.setTrajMd5_dpqp(""); + mAutoPilotLine.setStopUrl_dpqp(""); + mAutoPilotLine.setStopMd5_dpqp(""); + mAutoPilotLine.setTimestamp_dpqp(0); } private void startTrajReqLoop() { diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_line_panel_bg.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_line_panel_bg.png new file mode 100755 index 0000000000..3166d20e37 Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_line_panel_bg.png differ diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_line_panel_bg_1.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_line_panel_bg_1.png new file mode 100755 index 0000000000..09a9c252da Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_line_panel_bg_1.png differ diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/press_start_status.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/press_start_status.png new file mode 100755 index 0000000000..af32c20cb5 Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/press_start_status.png differ diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/start_failure.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/start_failure.png new file mode 100755 index 0000000000..5737f93ad8 Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/start_failure.png differ diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/start_success.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/start_success.png new file mode 100755 index 0000000000..84246fd323 Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/start_success.png differ diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_line_panel_bg.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_line_panel_bg.png new file mode 100755 index 0000000000..3166d20e37 Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_line_panel_bg.png differ diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_line_panel_bg_1.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_line_panel_bg_1.png new file mode 100755 index 0000000000..09a9c252da Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_line_panel_bg_1.png differ diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/press_start_status.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/press_start_status.png new file mode 100755 index 0000000000..af32c20cb5 Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/press_start_status.png differ diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/start_failure.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/start_failure.png new file mode 100755 index 0000000000..5737f93ad8 Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/start_failure.png differ diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/start_success.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/start_success.png new file mode 100755 index 0000000000..84246fd323 Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/start_success.png differ diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_line_panel_bg.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_line_panel_bg.png new file mode 100755 index 0000000000..3166d20e37 Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_line_panel_bg.png differ diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_line_panel_bg_1.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_line_panel_bg_1.png new file mode 100755 index 0000000000..09a9c252da Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_line_panel_bg_1.png differ diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/press_start_status.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/press_start_status.png new file mode 100755 index 0000000000..af32c20cb5 Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/press_start_status.png differ diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/start_failure.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/start_failure.png new file mode 100755 index 0000000000..5737f93ad8 Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/start_failure.png differ diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/start_success.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/start_success.png new file mode 100755 index 0000000000..84246fd323 Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/start_success.png differ diff --git a/OCH/mogo-och-bus/src/main/res/drawable/bus_autopilot_status_bg.xml b/OCH/mogo-och-bus/src/main/res/drawable/bus_autopilot_status_bg.xml index 9a276b035d..ad57da1c3a 100644 --- a/OCH/mogo-och-bus/src/main/res/drawable/bus_autopilot_status_bg.xml +++ b/OCH/mogo-och-bus/src/main/res/drawable/bus_autopilot_status_bg.xml @@ -1,46 +1,17 @@ - - - - - + - - - - - - - - - - - + + - - - - - + - - - - - + - - - - - + - - - - - + diff --git a/OCH/mogo-och-bus/src/main/res/drawable/bus_line_dividing_line1_selector.xml b/OCH/mogo-och-bus/src/main/res/drawable/bus_line_dividing_line1_selector.xml new file mode 100644 index 0000000000..b00fbd8bd6 --- /dev/null +++ b/OCH/mogo-och-bus/src/main/res/drawable/bus_line_dividing_line1_selector.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/drawable/bus_line_dividing_line2_selector.xml b/OCH/mogo-och-bus/src/main/res/drawable/bus_line_dividing_line2_selector.xml new file mode 100644 index 0000000000..ee555aae15 --- /dev/null +++ b/OCH/mogo-och-bus/src/main/res/drawable/bus_line_dividing_line2_selector.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/drawable/bus_switch_line_btn.xml b/OCH/mogo-och-bus/src/main/res/drawable/bus_switch_line_btn.xml index 8062bcf093..be0bd24850 100644 --- a/OCH/mogo-och-bus/src/main/res/drawable/bus_switch_line_btn.xml +++ b/OCH/mogo-och-bus/src/main/res/drawable/bus_switch_line_btn.xml @@ -3,10 +3,9 @@ - - - + + \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/layout/bus_base_fragment.xml b/OCH/mogo-och-bus/src/main/res/layout/bus_base_fragment.xml index 0551f1dd74..e4dabdb000 100644 --- a/OCH/mogo-och-bus/src/main/res/layout/bus_base_fragment.xml +++ b/OCH/mogo-och-bus/src/main/res/layout/bus_base_fragment.xml @@ -5,23 +5,22 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="@dimen/dp_72"> - + - @@ -29,9 +28,7 @@ android:id="@+id/module_mogo_och_autopilot_status" android:layout_width="@dimen/module_mogo_och_autopilot_status_bg_width" android:layout_height="@dimen/module_mogo_och_autopilot_status_bg_height" - android:layout_marginLeft="@dimen/module_mogo_och_margin_left" app:layout_constraintTop_toBottomOf="@+id/fl_speed" - android:layout_marginTop="@dimen/bus_ext_arcView_top" android:background="@drawable/bus_autopilot_status_bg" app:layout_constraintLeft_toLeftOf="parent" android:gravity="center" @@ -39,33 +36,30 @@ + + android:textStyle="bold" /> @@ -126,7 +120,6 @@ android:elevation="@dimen/dp_10" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toRightOf="@id/bus_switch_model_layout"> - + + + + \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/layout/fragment_och_bus.xml b/OCH/mogo-och-bus/src/main/res/layout/fragment_och_bus.xml index 0c307b9d24..c9e7d8a07b 100644 --- a/OCH/mogo-och-bus/src/main/res/layout/fragment_och_bus.xml +++ b/OCH/mogo-och-bus/src/main/res/layout/fragment_och_bus.xml @@ -2,188 +2,175 @@ + android:layout_height="wrap_content" + android:paddingBottom="@dimen/dp_28" + android:background="@drawable/bus_line_panel_bg" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintTop_toTopOf="parent"> - - - - - - - - - - - - - - - - - - - - - - - + + app:layout_constraintBottom_toBottomOf="@+id/module_och_bus_line_name" + app:layout_constraintRight_toRightOf="parent" + app:layout_constraintTop_toTopOf="@id/module_och_bus_line_name" /> - - + + + + + android:layout_marginLeft="14px" + android:layout_marginTop="@dimen/dp_24" + android:text="当前站点:" + android:textColor="#CAD6FF" + android:textSize="@dimen/module_och_bus_order_start_station_anchor_textSize" + android:textStyle="bold" + app:layout_constraintLeft_toRightOf="@+id/greenDot" + app:layout_constraintTop_toBottomOf="@+id/line2" /> - + - + - + - + - + - + - - - - - - + app:layout_constraintLeft_toLeftOf="parent" /> + \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/values-xhdpi-2560x1440/dimens.xml b/OCH/mogo-och-bus/src/main/res/values-xhdpi-2560x1440/dimens.xml index a27b69ae1d..c1a04c1abc 100644 --- a/OCH/mogo-och-bus/src/main/res/values-xhdpi-2560x1440/dimens.xml +++ b/OCH/mogo-och-bus/src/main/res/values-xhdpi-2560x1440/dimens.xml @@ -13,8 +13,8 @@ 32px 20px - 42px - 32px + 40px + 42px 15px @@ -44,20 +44,20 @@ 30px 23px 26px - 32px + 34px 20px 80px 3px - 44.5px + 34px 20px 28px 27px - 25.6px + 28px 20px 20px - 16px + 64px 16px 40px @@ -77,8 +77,8 @@ 70px 24px - 460px - 140px + 616px + 180px 112px 112px @@ -86,11 +86,11 @@ 92px 30px - 466px - 446px + 616px + 754px - 36px + 40px 13px 12px 350px @@ -104,9 +104,9 @@ 20px 40px 320px - 460px + 320px 70px - 460px + 616px 130px 30px 279px @@ -120,7 +120,8 @@ 46px 700px 120px - 86px + 560px + 116px 20px diff --git a/OCH/mogo-och-bus/src/main/res/values-xhdpi-2560x1600/dimens.xml b/OCH/mogo-och-bus/src/main/res/values-xhdpi-2560x1600/dimens.xml index 9c23585e71..db56121992 100644 --- a/OCH/mogo-och-bus/src/main/res/values-xhdpi-2560x1600/dimens.xml +++ b/OCH/mogo-och-bus/src/main/res/values-xhdpi-2560x1600/dimens.xml @@ -13,8 +13,8 @@ 32px 20px - 42px - 32px + 40px + 42px 15px @@ -44,11 +44,11 @@ 30px 23px 26px - 32px + 34px 20px 80px 3px - 44.5px + 34px 20px 28px 27px @@ -57,7 +57,7 @@ 25.6px 20px 20px - 16px + 64px 16px 40px @@ -77,8 +77,8 @@ 70px 24px - 460px - 140px + 616px + 180px 112px 112px @@ -86,11 +86,11 @@ 92px 30px - 466px - 446px + 616px + 754px - 36px + 40px 13px 12px 350px @@ -119,7 +119,8 @@ 46px 700px 120px - 86px + 560px + 116px 50px 225px diff --git a/OCH/mogo-och-bus/src/main/res/values/dimens.xml b/OCH/mogo-och-bus/src/main/res/values/dimens.xml index 51d39b3e5c..85e4768fcc 100644 --- a/OCH/mogo-och-bus/src/main/res/values/dimens.xml +++ b/OCH/mogo-och-bus/src/main/res/values/dimens.xml @@ -135,7 +135,8 @@ 30px 450px 72px - 52px + 280px + 58px 20px 225px diff --git a/OCH/mogo-och-bus/src/main/res/values/strings.xml b/OCH/mogo-och-bus/src/main/res/values/strings.xml index 0e7050b014..fdbca6ea6b 100644 --- a/OCH/mogo-och-bus/src/main/res/values/strings.xml +++ b/OCH/mogo-och-bus/src/main/res/values/strings.xml @@ -19,9 +19,9 @@ 更换路线成功 更换路线失败 - - - - + 起点: + 终点: + 当前站点: + 下一站: 自动驾驶状态为0不可用 diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/CoordinateCalculateRouteUtil.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/CoordinateCalculateRouteUtil.java index fdaa18be0b..01ec888715 100644 --- a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/CoordinateCalculateRouteUtil.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/CoordinateCalculateRouteUtil.java @@ -167,4 +167,34 @@ public class CoordinateCalculateRouteUtil { } return latePoints; } + + /** + * 简单粗暴 直接比较 todo 需要优化 + * @param mRoutePoints + * @param realLon + * @param realLat + * @return 返回已经到达点的index + */ + public static int getArrivedPointIndex(List mRoutePoints,double realLon,double realLat) { + int currentIndex = 0; //记录疑似点 + if (mRoutePoints.size() > 0){ + //基础点 + LatLng baseLatLng = mRoutePoints.get(0); + float baseDiffDis = CoordinateUtils.calculateLineDistance(realLon,realLat + ,baseLatLng.longitude,baseLatLng.latitude);// lon,lat, prelon, prelat + + for (int i= 1; i < mRoutePoints.size(); i++){ + LatLng latLng = mRoutePoints.get(i); + float diff = CoordinateUtils.calculateLineDistance(realLon,realLat + ,latLng.longitude,latLng.latitude); + if (baseDiffDis > diff){ +// Logger.d(M_TAXI + "calculateRouteSumLength", "点:"+i+"-------先记录点----- "); + baseDiffDis = diff; + currentIndex = i; + } + } + return currentIndex; + } + return currentIndex; + } } diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/NumberFormatUtil.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/NumberFormatUtil.java index 984d132feb..4c626a4659 100644 --- a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/NumberFormatUtil.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/NumberFormatUtil.java @@ -9,7 +9,7 @@ import java.math.RoundingMode; */ public class NumberFormatUtil { /** - * 有小数两位, 没有小数保留整数 + * 有小数1位, 没有小数保留整数 * @param d * @return */ diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/OCHThreadPoolManager.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/OCHThreadPoolManager.java new file mode 100644 index 0000000000..02a08f49b2 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/OCHThreadPoolManager.java @@ -0,0 +1,152 @@ +package com.mogo.och.common.module.utils; + +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.Callable; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * @author: wangmingjun + * @date: 2022/7/19 + */ + +public class OCHThreadPoolManager { + + /** + * 根据cpu的数量动态的配置核心线程数和最大线程数 + */ + private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors(); + /** + * 核心线程数 = CPU核心数 + 1 + */ + private static final int CORE_POOL_SIZE = CPU_COUNT + 1; + /** + * 线程池最大线程数 = CPU核心数 * 2 + 1 + */ + private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1; + /** + * 非核心线程闲置时超时1s + */ + private static final int KEEP_ALIVE = 1; + /** + * 线程池的对象 + */ + private ThreadPoolExecutor executor; + + /** + * 要确保该类只有一个实例对象,避免产生过多对象消费资源,所以采用单例模式 + */ + private OCHThreadPoolManager() { + } + + private volatile static OCHThreadPoolManager INSTANCE; + + public static OCHThreadPoolManager getsInstance() { + if (INSTANCE == null) { + synchronized (OCHThreadPoolManager.class) { + if (INSTANCE == null) { + INSTANCE = new OCHThreadPoolManager(); + } + } + + } + return INSTANCE; + } + + /** + * 开启一个无返回结果的线程 + * + * @param r + */ + public void execute(Runnable r) { + if (executor == null) { + /** + * corePoolSize:核心线程数 + * maximumPoolSize:线程池所容纳最大线程数(workQueue队列满了之后才开启) + * keepAliveTime:非核心线程闲置时间超时时长 + * unit:keepAliveTime的单位 + * workQueue:等待队列,存储还未执行的任务 + * threadFactory:线程创建的工厂 + * handler:异常处理机制 + * + */ + executor = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, + KEEP_ALIVE, TimeUnit.SECONDS, new ArrayBlockingQueue(200), + Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy()); + } + // 把一个任务丢到了线程池中 + try { + executor.execute(r); + } catch (Exception e) { + e.printStackTrace(); + } + + } + + /** + * 开启一个有返回结果的线程 + * + * @param r + * @return + */ + public Future submit(Callable r) { + if (executor == null) { + /** + * corePoolSize:核心线程数 + * maximumPoolSize:线程池所容纳最大线程数(workQueue队列满了之后才开启) + * keepAliveTime:非核心线程闲置时间超时时长 + * unit:keepAliveTime的单位 + * workQueue:等待队列,存储还未执行的任务 + * threadFactory:线程创建的工厂 + * handler:异常处理机制 + * + */ + executor = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, + KEEP_ALIVE, TimeUnit.SECONDS, new ArrayBlockingQueue(20), + Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy()); + } + // 把一个任务丢到了线程池中 + return executor.submit(r); + } + + /** + * 开启一个无返回结果的线程 + * + * @param r + */ + public Future submit(Runnable r) { + if (executor == null) { + /** + * corePoolSize:核心线程数 + * maximumPoolSize:线程池所容纳最大线程数(workQueue队列满了之后才开启) + * keepAliveTime:非核心线程闲置时间超时时长 + * unit:keepAliveTime的单位 + * workQueue:等待队列,存储还未执行的任务 + * threadFactory:线程创建的工厂 + * handler:异常处理机制 + * + */ + executor = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, + KEEP_ALIVE, TimeUnit.SECONDS, new ArrayBlockingQueue(200), + Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy()); + } + return executor.submit(r); + + } + + /** + * 把任务移除等待队列 + * + * @param r + */ + public void cancel(Runnable r) { + if (r != null) { + executor.getQueue().remove(r); + } + } + +} + + diff --git a/OCH/mogo-och-taxi-passenger/src/main/AndroidManifest.xml b/OCH/mogo-och-taxi-passenger/src/main/AndroidManifest.xml index 8b529701ba..84947cad22 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/AndroidManifest.xml +++ b/OCH/mogo-och-taxi-passenger/src/main/AndroidManifest.xml @@ -1,5 +1,21 @@ + - / + + + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/aidl/com/mogo/och/taxi/passenger/mulprocess/ICallback.aidl b/OCH/mogo-och-taxi-passenger/src/main/aidl/com/mogo/och/taxi/passenger/mulprocess/ICallback.aidl new file mode 100644 index 0000000000..a3a46acde7 --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/aidl/com/mogo/och/taxi/passenger/mulprocess/ICallback.aidl @@ -0,0 +1,12 @@ +// ICallback.aidl +package com.mogo.och.taxi.passenger.mulprocess; + +// Declare any non-default types here with import statements + +interface ICallback { + + void onResult(long meters, long timeInSecond,float speed); + + void postEvent(int type); + +} \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/aidl/com/mogo/och/taxi/passenger/mulprocess/ILeftMenuService.aidl b/OCH/mogo-och-taxi-passenger/src/main/aidl/com/mogo/och/taxi/passenger/mulprocess/ILeftMenuService.aidl new file mode 100644 index 0000000000..0e0aa676e9 --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/aidl/com/mogo/och/taxi/passenger/mulprocess/ILeftMenuService.aidl @@ -0,0 +1,19 @@ +// ILeftMenuService.aidl +package com.mogo.och.taxi.passenger.mulprocess; + +import com.mogo.och.taxi.passenger.mulprocess.ICallback; + +// Declare any non-default types here with import statements + +interface ILeftMenuService { + + /** + * 向主进程传选中的item + */ + void transmissionIndex(int index); + + void registerCallback(in ICallback cb); + + void unRegisterCallback(in ICallback cb); + +} \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/TaxiPassengerOrderQueryRespBean.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/TaxiPassengerOrderQueryRespBean.java index 0ea164e3bf..27fef64839 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/TaxiPassengerOrderQueryRespBean.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/TaxiPassengerOrderQueryRespBean.java @@ -57,6 +57,11 @@ public class TaxiPassengerOrderQueryRespBean extends BaseData { public String txtFileMd5 = ""; //轨迹文件md5,默认“” public long contrailSaveTime; //上传轨迹完成时间戳ms:用于MEC本地手动导入轨迹验证时不会被云端轨迹覆盖 public String carModel = ""; //[optional] 车型号(如红旗H9),默认“”,暂不加入校验逻辑、用于人工排查问题 + public String csvFileUrlDPQP = ""; //轨迹文件下载的cos url,默认“” + public String csvFileMd5DPQP = ""; //轨迹文件md5,默认“” + public String txtFileUrlDPQP = ""; //打点文件下载的cos url,默认“” + public String txtFileMd5DPQP = ""; //轨迹文件md5,默认“” + public long contrailSaveTimeDPQP; //上传轨迹完成时间戳ms:用于MEC本地手动导入轨迹验证时不会被云端轨迹覆盖 // !!!接口中暂无此字段,仅用于本地实现逻辑使用:起始站目的站距离km public double travelDistance; diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerAutopilotPlanningCallback.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerAutopilotPlanningCallback.java index c2c8fb1d6a..52ac14ed3f 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerAutopilotPlanningCallback.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerAutopilotPlanningCallback.java @@ -12,5 +12,5 @@ import mogo.telematics.pad.MessagePad; */ public interface IOCHTaxiPassengerAutopilotPlanningCallback { void setLineMarker(List models); - void routeResultByServer(List models); + void routeResultByServer(List models,int haveArrivedIndex); } \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/event/FinishActivity.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/event/FinishActivity.java new file mode 100644 index 0000000000..0e9120e02a --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/event/FinishActivity.java @@ -0,0 +1,4 @@ +package com.mogo.och.taxi.passenger.event; + +public class FinishActivity { +} diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/event/UIStatus.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/event/UIStatus.java new file mode 100644 index 0000000000..83c06dfa6e --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/event/UIStatus.java @@ -0,0 +1,16 @@ +package com.mogo.och.taxi.passenger.event; + +public class UIStatus { + + public static final int LIVE = 0; + public static final int OVERVIEW = 1; + public static final int CONSULT = 2; + public static final int MOVIE = 3; + + public int status = LIVE; + + public UIStatus(int status) { + this.status = status; + } + +} diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.java index 56286e88ff..0a5042f633 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.java @@ -617,10 +617,10 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback public void loopRouteAndWipe() { if (mLocationsModels != null && mLocationsModels.size() > 0){ - List lastPoints = CoordinateCalculateRouteUtil - .getRemainPointListByCompare(mLocationsModels,mLongitude,mLatitude); + int haveArrivedIndex = CoordinateCalculateRouteUtil + .getArrivedPointIndex(mLocationsModels,mLongitude,mLatitude); if (mAutopilotPlanningCallback != null){ - mAutopilotPlanningCallback.routeResultByServer(lastPoints); + mAutopilotPlanningCallback.routeResultByServer(mLocationsModels,haveArrivedIndex); } } } @@ -893,7 +893,10 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback mCurrentOCHOrder.lineId, mCurrentOCHOrder.csvFileUrl, mCurrentOCHOrder.csvFileMd5, mCurrentOCHOrder.txtFileUrl, mCurrentOCHOrder.txtFileMd5, - mCurrentOCHOrder.contrailSaveTime, mCurrentOCHOrder.carModel); + mCurrentOCHOrder.contrailSaveTime, mCurrentOCHOrder.carModel, + mCurrentOCHOrder.csvFileUrlDPQP, mCurrentOCHOrder.csvFileMd5DPQP, + mCurrentOCHOrder.txtFileUrlDPQP, mCurrentOCHOrder.txtFileMd5DPQP, + mCurrentOCHOrder.contrailSaveTimeDPQP); } CallerAutoPilotManager.INSTANCE.startAutoPilot(parameters); diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModelLoopManager.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModelLoopManager.java index 30be0829b1..ee85371b35 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModelLoopManager.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModelLoopManager.java @@ -8,8 +8,12 @@ import com.mogo.och.taxi.passenger.constant.TaxiPassengerConst; import java.util.concurrent.TimeUnit; import io.reactivex.Observable; +import io.reactivex.ObservableEmitter; +import io.reactivex.ObservableOnSubscribe; import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.CompositeDisposable; import io.reactivex.disposables.Disposable; +import io.reactivex.functions.Consumer; import io.reactivex.schedulers.Schedulers; /** @@ -31,8 +35,8 @@ public class TaxiPassengerModelLoopManager { private Disposable mInAndWaitServiceDisposable; //进行中、待服务订单列表轮询 private Disposable mQueryOrderRemainingDisposable; //心跳轮询 - private Disposable mRouteWipeDisposable; //轨迹擦除 - private Disposable mReadyToAutopilotDisposable; //轨迹擦除 + private CompositeDisposable mRouteWipeDisposable = new CompositeDisposable(); //轨迹擦除 + private Disposable mReadyToAutopilotDisposable; //轮询是否可开启自动驾驶 public void startReadyToAutopilot() { if (mReadyToAutopilotDisposable != null && !mReadyToAutopilotDisposable.isDisposed()) { @@ -56,23 +60,48 @@ public class TaxiPassengerModelLoopManager { } public void startRouteAndWipe() { - if (mRouteWipeDisposable != null && !mRouteWipeDisposable.isDisposed()) { - return; + if (mRouteWipeDisposable == null){ + mRouteWipeDisposable = new CompositeDisposable(); } CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "startRouteAndWipe()"); - mRouteWipeDisposable = Observable.interval(TaxiPassengerConst.LOOP_DELAY, - TaxiPassengerConst.LOOP_PERIOD_1S, TimeUnit.MILLISECONDS) - .map((aLong -> aLong + 1)) + Disposable disposable = startLoopRouteAndWipe() + .doOnSubscribe(new Consumer() { + @Override + public void accept(Disposable disposable) throws Exception { + + } + }).doOnError(new Consumer() { + @Override + public void accept(Throwable throwable) throws Exception { + } + }) + .delay(TaxiPassengerConst.LOOP_PERIOD_1S, TimeUnit.MILLISECONDS, true) // 设置delayError为true,表示出现错误的时候也需要延迟5s进行通知,达到无论是请求正常还是请求失败,都是5s后重新订阅,即重新请求。 .subscribeOn(Schedulers.io()) + .repeat() // repeat保证请求成功后能够重新订阅。 + .retry() // retry保证请求失败后能重新订阅 .observeOn(AndroidSchedulers.mainThread()) - .subscribe(aLong -> TaxiPassengerModel.getInstance().loopRouteAndWipe()); + .subscribe(new Consumer() { + @Override + public void accept(Integer integer) throws Exception { + } + }); + mRouteWipeDisposable.add(disposable); + } + + public Observable startLoopRouteAndWipe(){ + return Observable.create(new ObservableOnSubscribe() { + @Override + public void subscribe(ObservableEmitter emitter) throws Exception { + TaxiPassengerModel.getInstance().loopRouteAndWipe(); + emitter.onComplete(); + } + }); } public void stopRouteAndWipe() { if (mRouteWipeDisposable != null) { CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "stopRouteAndWipe()"); mRouteWipeDisposable.dispose(); - mRouteWipeDisposable = null; } } diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/mulprocess/BinderCursor.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/mulprocess/BinderCursor.java new file mode 100644 index 0000000000..c1d1c3c5bd --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/mulprocess/BinderCursor.java @@ -0,0 +1,64 @@ +package com.mogo.och.taxi.passenger.mulprocess; + +import android.database.MatrixCursor; +import android.os.Bundle; +import android.os.IBinder; +import android.os.Parcel; +import android.os.Parcelable; + +public class BinderCursor extends MatrixCursor { + + static final String KEY_BINDER = "binder"; + + Bundle mBinderExtra = new Bundle(); + + public static class BinderParcelable implements Parcelable { + + public IBinder mBinder; + + public static final Creator CREATOR = new Creator() { + @Override + public BinderParcelable createFromParcel(Parcel source) { + return new BinderParcelable(source); + } + + @Override + public BinderParcelable[] newArray(int size) { + return new BinderParcelable[size]; + } + }; + + BinderParcelable(IBinder binder) { + mBinder = binder; + } + + BinderParcelable(Parcel source) { + mBinder = source.readStrongBinder(); + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeStrongBinder(mBinder); + } + } + + public BinderCursor(String[] columnNames, IBinder binder) { + super(columnNames); + + if (binder != null) { + Parcelable value = new BinderParcelable(binder); + mBinderExtra.putParcelable(KEY_BINDER, value); + } + } + + @Override + public Bundle getExtras() { + return mBinderExtra; + } + +} \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/mulprocess/BinderProvider.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/mulprocess/BinderProvider.java new file mode 100644 index 0000000000..a5aedc83b1 --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/mulprocess/BinderProvider.java @@ -0,0 +1,55 @@ +package com.mogo.och.taxi.passenger.mulprocess; + +import static android.os.Binder.getCallingUid; + +import android.content.ContentProvider; +import android.content.ContentValues; +import android.database.Cursor; +import android.net.Uri; +import android.os.IBinder; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + + +public class BinderProvider extends ContentProvider { + + public static final String TAG = BinderProvider.class.getSimpleName(); + + public static final String AUTHORITY = "com.mogo.och.taxi.passenger.leftmenu"; + public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/binder"); + public static final String SERVICE_LEFTMENU = "lefmenu"; + + @Override + public boolean onCreate() { + return true; + } + + + @Override + public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { + getCallingUid(); + IBinder binder; + if (selectionArgs[0].equals(BinderProvider.SERVICE_LEFTMENU)) { + binder = new OrderServiceImpl(); + } else { + return null; + } + BinderCursor cursor = new BinderCursor(new String[]{"service"}, binder); + return cursor; + } + + + @Override + public String getType(Uri uri) {return null;} + + + @Override + public Uri insert(Uri uri, ContentValues values) {return null;} + + @Override + public int delete(Uri uri, String selection, String[] selectionArgs) {return 0;} + + @Override + public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {return 0;} +} diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/mulprocess/EmptyService.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/mulprocess/EmptyService.kt new file mode 100644 index 0000000000..5d3a6ff53c --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/mulprocess/EmptyService.kt @@ -0,0 +1,22 @@ +package com.mogo.och.taxi.passenger.mulprocess + +import android.app.Service +import android.content.Context +import android.content.Intent +import android.os.IBinder + +class EmptyService: Service() { + + companion object{ + fun startService(context: Context){ + //预加载视频进程 + val intent = Intent(context, EmptyService::class.java) + context.startService(intent) + } + } + + override fun onBind(intent: Intent?): IBinder? { + // 加载进程的空Service + return null + } +} \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/mulprocess/OrderServiceImpl.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/mulprocess/OrderServiceImpl.java new file mode 100644 index 0000000000..73eb617d82 --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/mulprocess/OrderServiceImpl.java @@ -0,0 +1,29 @@ +package com.mogo.och.taxi.passenger.mulprocess; + +import android.os.RemoteException; + +import com.mogo.eagle.core.utilcode.util.UiThreadHandler; +import com.mogo.och.taxi.passenger.ui.leftmenu.LeftMenuOpen; +import com.mogo.och.taxi.passenger.ui.leftmenu.OverlayLeftViewUtils; + +public class OrderServiceImpl extends ILeftMenuService.Stub { + + @Override + public void transmissionIndex(int index) throws RemoteException { + + UiThreadHandler.getsUiHandler().post(() -> { + OverlayLeftViewUtils.INSTANCE.transmissionIndexGet(index); + }); + } + + @Override + public void registerCallback(ICallback cb) throws RemoteException { + LeftMenuOpen.INSTANCE.registerCallbackHost(cb); + } + + @Override + public void unRegisterCallback(ICallback cb) throws RemoteException { + LeftMenuOpen.INSTANCE.unregisterCallbackHost(cb); + } + +} \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/BaseTaxiPassengerPresenter.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/BaseTaxiPassengerPresenter.java index 7522010791..fe32a0c5ca 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/BaseTaxiPassengerPresenter.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/BaseTaxiPassengerPresenter.java @@ -23,6 +23,7 @@ import com.mogo.och.taxi.passenger.constant.TaxiPassengerOrderStatusEnum; import com.mogo.och.taxi.passenger.model.TaxiPassengerGeocodeSearchModel; import com.mogo.och.taxi.passenger.model.TaxiPassengerModel; import com.mogo.och.taxi.passenger.ui.TaxiPassengerBaseFragment; +import com.mogo.och.taxi.passenger.ui.leftmenu.LeftMenuOpen; /** * @author: wangmingjun @@ -118,6 +119,7 @@ public class BaseTaxiPassengerPresenter extends Presenter { - mView.showOrHideServingOrderFragment(false); + mView.showOrHideServingOrderFragment(false,true); mView.showOrHideStartAutopilotView(false,false); mView.showOrHidePressengerCheckPager(false, "", "", "", "", ""); @@ -189,7 +191,7 @@ public class BaseTaxiPassengerPresenter extends Presenter{ mView.showOrHideStartAutopilotView(false,false); - mView.showOrHideServingOrderFragment(true); + mView.showOrHideServingOrderFragment(true,true); }); TaxiPassengerModel.getInstance().startOrStopReadyToAutopilotoop(false); } @@ -210,7 +212,7 @@ public class BaseTaxiPassengerPresenter extends Presenter { - mView.showOrHideServingOrderFragment(false); + mView.showOrHideServingOrderFragment(false,true); mView.showOrHideArrivedEndLayout(true, order.endSiteAddr,order.orderNo); }); return; diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/TaxiPassengerServingOrderPresenter.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/TaxiPassengerServingOrderPresenter.java index 28bc751b01..4105a50e3c 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/TaxiPassengerServingOrderPresenter.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/TaxiPassengerServingOrderPresenter.java @@ -74,13 +74,13 @@ public class TaxiPassengerServingOrderPresenter extends Presenter mView.setLineMarker(models)); } - @Override - public void routeResultByServer(List models) { + public void routeResultByServer(List models, int haveArrivedIndex) { if (models == null) return; - runOnUIThread(() -> mView.routeResultByServer(models)); + runOnUIThread(() -> mView.routeResultByServer(models,haveArrivedIndex)); } + @Override public void onCurrentOrderStatusChanged(TaxiPassengerOrderQueryRespBean.Result order) { CallerLogger.INSTANCE.d(M_TAXI_P + TAG, GsonUtil.jsonFromObject(order)); diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerBaseFragment.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerBaseFragment.java index 07c9eaad40..b98ff00c16 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerBaseFragment.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerBaseFragment.java @@ -1,12 +1,15 @@ package com.mogo.och.taxi.passenger.ui; +import android.os.Bundle; import android.os.Handler; import android.os.Looper; +import android.view.LayoutInflater; import android.view.View; -import android.widget.FrameLayout; +import android.view.ViewGroup; import android.widget.ImageView; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.fragment.app.FragmentTransaction; import com.mogo.commons.AbsMogoApplication; @@ -27,9 +30,15 @@ import com.mogo.module.common.MogoApisHandler; import com.mogo.module.common.constants.DataTypes; import com.mogo.och.taxi.passenger.R; import com.mogo.och.taxi.passenger.callback.ITPClickStartAutopilotCallback; +import com.mogo.och.taxi.passenger.event.UIStatus; import com.mogo.och.taxi.passenger.presenter.BaseTaxiPassengerPresenter; import com.mogo.och.taxi.passenger.ui.comment.TaxiPassengerArrivedView; import com.mogo.och.taxi.passenger.ui.leftmenu.OverlayLeftViewUtils; +import com.mogo.och.taxi.passenger.mulprocess.EmptyService; + +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; import java.lang.ref.WeakReference; @@ -46,7 +55,6 @@ public class TaxiPassengerBaseFragment extends MvpFragment mArrivedEndView; private WeakReference mArrivedCheckView; private WeakReference mStartAutopilotView; - - private View vOpenLeft; - protected TaxiPassengerServingOrderFragment ochServingOrderFragment = null; private Handler mHandler = new Handler(Looper.getMainLooper()); + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + EventBus.getDefault().register(this); + return super.onCreateView(inflater, container, savedInstanceState); + } + @Override protected int getLayoutId() { return R.layout.taxi_p_base_fragment; @@ -77,7 +89,6 @@ public class TaxiPassengerBaseFragment extends MvpFragment { -// OverlayLeftViewUtils.INSTANCE.showOverlayView(getActivity()); -// OverlayLeftViewUtils.INSTANCE.dragTarget(vOpenLeft); + OverlayLeftViewUtils.INSTANCE.showOverlayView(getActivity(),0,true,-1,true); //showOrHideArrivedEndLayout(true, "北京北京北京", "1527481606997577728"); //showOrHidePressengerCheckPager(true, "开始站点开", "开始站点开始站点开始", "2", "京A888888", "18811539480"); //OCHFloatWindowManager.getInstance().ShowFloatWindow(getContext()); - //OverlayViewUtils.showOverlayView(getActivity(),new TaxiPassengerMogoConsultView(getContext())); }); - - vOpenLeft.setOnClickListener(v -> OverlayLeftViewUtils.INSTANCE.open()); } private void initArrivedView(){ @@ -166,7 +174,7 @@ public class TaxiPassengerBaseFragment extends MvpFragment colorList = new ArrayList<>(); + List textureList = new ArrayList<>(); + List texIndexList = new ArrayList<>(); private ITaxiPassengerMapViewCallback mITaxiPassengerMapViewCallback; @@ -232,7 +234,7 @@ public class TaxiPassengerMapDirectionView } if (mAMap != null) { - addRouteColorList(); +// addRouteColorList(); if (mCoordinatesLatLng.size() > 2) { //设置线段纹理 @@ -243,7 +245,9 @@ public class TaxiPassengerMapDirectionView //polylineOptions.useGradient(true); polylineOptions.width(15); polylineOptions.lineCapType(PolylineOptions.LineCapType.LineCapRound); - polylineOptions.setCustomTexture(BitmapDescriptorFactory.fromResource(R.drawable.taxi_p_map_arrow)); + polylineOptions.setCustomTextureList(textureList); + polylineOptions.setCustomTextureIndex(texIndexList); +// polylineOptions.setCustomTexture(BitmapDescriptorFactory.fromResource(R.drawable.taxi_p_map_arrow_un_arrive)); // 绘制线 mPolyline = mAMap.addPolyline(polylineOptions); @@ -256,12 +260,20 @@ public class TaxiPassengerMapDirectionView * 添加画线颜色值 */ private void addRouteColorList() { + textureList.clear(); + texIndexList.clear(); for (int i = 0; i < mCoordinatesLatLng.size(); i++){ - if (i <= mCoordinatesLatLng.size()/2){ - colorList.add(Color.argb(255, 31, 195, 255));//start +// if (i <= mCoordinatesLatLng.size()/2){ +// colorList.add(Color.argb(255, 31, 195, 255));//start +// }else { +// colorList.add(Color.argb(255, 87, 171, 255));//end +// } + if (i <= mHaveArrivedIndex){ + textureList.add(BitmapDescriptorFactory.fromResource(R.drawable.taxi_p_map_arrow_arrived)); }else { - colorList.add(Color.argb(255, 87, 171, 255));//end + textureList.add(BitmapDescriptorFactory.fromResource(R.drawable.taxi_p_map_arrow_un_arrive)); } + texIndexList.add(i); } } @@ -344,6 +356,13 @@ public class TaxiPassengerMapDirectionView mCoordinatesLatLng.addAll(latLngs); } + public void setCoordinatesLatLng(List latLngs, int haveArrivedIndex){ + mCoordinatesLatLng.clear(); + mCoordinatesLatLng.addAll(latLngs); + mHaveArrivedIndex = haveArrivedIndex; + addRouteColorList(); + } + @Override public void onCameraChange(CameraPosition cameraPosition) { mITaxiPassengerMapViewCallback.onCameraChange(cameraPosition.bearing); diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerServingOrderFragment.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerServingOrderFragment.java index bb03a1055a..1232fbaf33 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerServingOrderFragment.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerServingOrderFragment.java @@ -2,6 +2,8 @@ package com.mogo.och.taxi.passenger.ui; import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI_P; +import android.animation.Animator; +import android.animation.AnimatorInflater; import android.location.Location; import android.os.Build; import android.os.Bundle; @@ -13,8 +15,10 @@ import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import androidx.appcompat.widget.AppCompatSeekBar; +import androidx.fragment.app.FragmentTransaction; import com.amap.api.maps.model.LatLng; import com.mogo.commons.mvp.MvpFragment; @@ -224,18 +228,18 @@ public class TaxiPassengerServingOrderFragment extends } } - public void routeResultByServer(List latLngList) { + public void routeResultByServer(List latLngList,int haveArrivedIndex) { CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "routeResultByServer:" + latLngList.size()); if (latLngList.size() > 0) { - drawablePolylineByServerRoute(latLngList); + drawablePolylineByServerRoute(latLngList,haveArrivedIndex); } else { clearPolyline(); } } - public void drawablePolylineByServerRoute(List mCoordinatesLatLng){ + public void drawablePolylineByServerRoute(List mCoordinatesLatLng,int haveArrivedIndex){ if (mMapDirectionView != null){ - mMapDirectionView.setCoordinatesLatLng(mCoordinatesLatLng); + mMapDirectionView.setCoordinatesLatLng(mCoordinatesLatLng,haveArrivedIndex); UiThreadHandler.post(new Runnable() { @Override public void run() { @@ -379,4 +383,22 @@ public class TaxiPassengerServingOrderFragment extends lastBearing = bearing; } + @Nullable + @Override + public Animator onCreateAnimator(int transit, boolean enter, int nextAnim) { + if (transit == FragmentTransaction.TRANSIT_FRAGMENT_OPEN) { + if (enter) {//普通的进入的动作 + return AnimatorInflater.loadAnimator(getContext(),R.animator.alpha_hide_show_f); + } else {//比如一个已经Fragmen被另一个replace,是一个进入动作,被replace的那个就是false + return AnimatorInflater.loadAnimator(getContext(),R.animator.alpha_hide_hide_f); + } + } else if (FragmentTransaction.TRANSIT_FRAGMENT_CLOSE == transit) { + if (enter) {//之前被replace的重新进入到界面或者Fragment回到栈顶 + return AnimatorInflater.loadAnimator(getContext(),R.animator.alpha_hide_show_f); + } else {//Fragment退出,出栈 + return AnimatorInflater.loadAnimator(getContext(),R.animator.alpha_hide_hide_f); + } + } + return super.onCreateAnimator(transit,enter,nextAnim); + } } diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/comment/TaxiPassengerArrivedView.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/comment/TaxiPassengerArrivedView.kt index 94f061f359..b3335b40ee 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/comment/TaxiPassengerArrivedView.kt +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/comment/TaxiPassengerArrivedView.kt @@ -217,6 +217,9 @@ class TaxiPassengerArrivedView :RelativeLayout, View.OnClickListener { private fun commitAndStartAnimation(fraction: Int,title:String) { resetStar() + allStartOrdered.forEach { + it.isEnabled = false + } currentFraction = fraction tvFeel.text = title if(allStarWithWorld!=null&&allStarWithWorld!!.data!=null&&allStarWithWorld!!.data!!.size>0){ @@ -232,10 +235,6 @@ class TaxiPassengerArrivedView :RelativeLayout, View.OnClickListener { // 总量请求失败 单独去取 requestStarWordByStar(fraction) } - -// allStartOrdered.forEach { -// it.isEnabled = false -// } } private var currentAnimarion = 0 private var maxIndex = 0 @@ -315,7 +314,9 @@ class TaxiPassengerArrivedView :RelativeLayout, View.OnClickListener { } override fun onAnimationEnd(animation: Animation?) { - + allStartOrdered.forEach { + it.isEnabled = true + } } override fun onAnimationRepeat(animation: Animation?) { diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/leftmenu/ItemViewTouchListener.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/leftmenu/ItemViewTouchListener.kt index a45e01036c..1aa1e9afa3 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/leftmenu/ItemViewTouchListener.kt +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/leftmenu/ItemViewTouchListener.kt @@ -1,74 +1,33 @@ package com.mogo.och.taxi.passenger.ui.leftmenu +import android.annotation.SuppressLint import android.view.MotionEvent import android.view.View -import android.view.WindowManager -class ItemViewTouchListener( - private val windowView: View, - private val wl: WindowManager.LayoutParams, - private val windowManager: WindowManager?, - private val close: (view:View,windowManager: WindowManager?) -> Unit, - private val open : (view:View,windowManager: WindowManager?) -> Unit -) : +class ItemViewTouchListener : View.OnTouchListener { - private var x = 0 // 判断并放跑点击事件 private var dragTime = 0L - private val DEVIATION = 10 - private val NEGATIVEDEVIATION = -10 + @SuppressLint("ClickableViewAccessibility") override fun onTouch(view: View, motionEvent: MotionEvent): Boolean { when (motionEvent.action) { MotionEvent.ACTION_DOWN -> { - x = motionEvent.rawX.toInt() + LeftMenuOpen.dragAndOpen(motionEvent.rawX.toInt(),motionEvent.action) dragTime = System.currentTimeMillis() } MotionEvent.ACTION_MOVE -> { - val nowX = motionEvent.rawX.toInt() - val movedX = nowX - x - x = nowX - wl.apply { - x += movedX - } - if (wl.x > 0 || wl.x < OverlayLeftViewUtils.DEVIATION_WIDTH) { - wl.apply { - x -= movedX - } + if (LeftMenuOpen.dragAndOpen(motionEvent.rawX.toInt(),motionEvent.action)) { return false } - - if (wl.x > NEGATIVEDEVIATION && movedX > 0) { - open(windowView,windowManager) - }else{ - //更新悬浮球控件位置 - windowManager?.updateViewLayout(windowView, wl) - } - if (wl.x < OverlayLeftViewUtils.DEVIATION_WIDTH +DEVIATION && movedX < 0) { - close(windowView,windowManager) - }else{ - //更新悬浮球控件位置 - windowManager?.updateViewLayout(windowView, wl) - } - - } MotionEvent.ACTION_UP -> { - val startX = wl.x - if (startX > OverlayLeftViewUtils.DEVIATION_WIDTH /2 && startX < 0) { - //拖动距离大于一半 自动打开 - open(windowView,windowManager) - } else if (startX < OverlayLeftViewUtils.DEVIATION_WIDTH /2 && startX >= OverlayLeftViewUtils.DEVIATION_WIDTH) { - // 拖动距离小于一半自动关闭 - close(windowView,windowManager) - } + LeftMenuOpen.dragAndOpen(motionEvent.rawX.toInt(),motionEvent.action) if (System.currentTimeMillis() - dragTime > 500) { dragTime = 0 return true } } - else -> { - - } + else -> {} } return false } diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/leftmenu/LeftMenuOpen.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/leftmenu/LeftMenuOpen.kt new file mode 100644 index 0000000000..42f4bfdf75 --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/leftmenu/LeftMenuOpen.kt @@ -0,0 +1,278 @@ +package com.mogo.och.taxi.passenger.ui.leftmenu + +import android.annotation.SuppressLint +import android.content.ContentResolver +import android.database.Cursor +import android.os.IBinder +import android.os.RemoteCallbackList +import android.os.RemoteException +import android.view.MotionEvent +import android.view.View +import android.view.ViewGroup +import android.view.WindowManager +import com.mogo.eagle.core.utilcode.util.UiThreadHandler +import com.mogo.eagle.core.utilcode.util.Utils +import com.mogo.och.taxi.passenger.R +import com.mogo.och.taxi.passenger.mulprocess.BinderCursor +import com.mogo.och.taxi.passenger.mulprocess.BinderProvider +import com.mogo.och.taxi.passenger.mulprocess.ICallback +import com.mogo.och.taxi.passenger.mulprocess.ILeftMenuService + + +@SuppressLint("StaticFieldLeak") +object LeftMenuOpen { + + private var windowView: View? = null + private var wl: WindowManager.LayoutParams? = null + private var windowManager: WindowManager? = null + private var close: ((view: View, windowManager: WindowManager?) -> Unit)? = null + private var open: ((view: View, windowManager: WindowManager?) -> Unit)? = null + + + private var cu: Cursor? = null + + // 两部分主进程和子进程 + private var dragList = mutableSetOf() + + private var orderService: ILeftMenuService? = null + + private var icallbacks: RemoteCallbackList = RemoteCallbackList() + + fun setValue( + windowView: View, + wl: WindowManager.LayoutParams?, + windowManager: WindowManager?, + close: (view: View, windowManager: WindowManager?) -> Unit, + open: (view: View, windowManager: WindowManager?) -> Unit + ) { + this.open = open + this.close = close + this.windowView = windowView + this.windowManager = windowManager + this.wl = wl + dragList.forEach { + registerDragView(it) + } + registerC() + } + + fun clearValue() { + this.open = null + this.close = null + this.windowView = null + this.windowManager = null + this.wl = null + + cu?.let { + it.close() + orderService = null + } + val iterator = dragList.iterator() + while (iterator.hasNext()) { + val next = iterator.next() + unRegisterDragView(next) + } + } + + + private var x = 0 + + // 判断并放跑点击事件 + private const val DEVIATION = 10 + private const val NEGATIVEDEVIATION = -10 + + fun dragAndOpen(newX: Int, action: Int): Boolean { + when (action) { + MotionEvent.ACTION_DOWN -> { + x = newX + } + MotionEvent.ACTION_MOVE -> { + val nowX = newX + val movedX = nowX - x + x = nowX + wl?.let { it -> + it.x += movedX + if (it.x > 0 || it.x < OverlayLeftViewUtils.DEVIATION_WIDTH) { + it.apply { + x -= movedX + } + return true + } + windowView?.let { windowView -> + windowManager?.let { windowManager -> + if (it.x > NEGATIVEDEVIATION && movedX > 0) { + open?.let { it1 -> + UiThreadHandler.getsUiHandler().post { + it1(windowView, windowManager) + } + } + } else { + //更新悬浮球控件位置 + UiThreadHandler.getsUiHandler().post { + windowManager.updateViewLayout(windowView, it) + } + } + if (it.x < OverlayLeftViewUtils.DEVIATION_WIDTH + DEVIATION && movedX < 0) { + close?.let { it1 -> + UiThreadHandler.getsUiHandler().post { + it1(windowView, windowManager) + } + } + } else { + //更新悬浮球控件位置 + UiThreadHandler.getsUiHandler().post { + windowManager.updateViewLayout(windowView, it) + } + } + } + + } + + } + } + MotionEvent.ACTION_UP -> { + wl?.let { wl -> + val startX = wl.x + if (startX > OverlayLeftViewUtils.DEVIATION_WIDTH / 2 && startX < 0) { + //拖动距离大于一半 自动打开 + open?.let { + UiThreadHandler.getsUiHandler().post { + it(windowView!!, windowManager) + } + } + } else if (startX < OverlayLeftViewUtils.DEVIATION_WIDTH / 2 && startX >= OverlayLeftViewUtils.DEVIATION_WIDTH) { + // 拖动距离小于一半自动关闭 + close?.let { + UiThreadHandler.getsUiHandler().post { + it(windowView!!, windowManager) + } + } + } else { + + } + } + } + } + return false + } + + fun registerDragView(view: View?) { + if (view != null) { + dragList.add(view) + if (orderService == null) { + registerC() + } + view.setOnTouchListener(ItemViewTouchListener()) + view.setOnClickListener { + open?.let { it1 -> it1(windowView!!, windowManager) } + } + } + } + + fun unRegisterDragView(view: View?) { + dragList.remove(view) + view?.let { + it.setOnTouchListener(null) + it.setOnClickListener(null) + if(it.id==R.id.ids_video_anchor){ + val parent = it.parent as ViewGroup + parent.removeView(it) + } + } + } + + fun transmissionIndex(index:Int){ + if (orderService == null) { + registerC() + } + orderService?.transmissionIndex(index) + } + + fun registerCallbackHost(cb:ICallback?){ + if (orderService == null) { + registerC() + } + cb?.let { + icallbacks?.register(it) + } + } + + fun unregisterCallbackHost(cb:ICallback?){ + cb?.let { + icallbacks?.unregister(it) + } + } + + + fun registerCallback(cb:ICallback?){ + if (orderService == null) { + registerC() + } + cb?.let { + orderService?.registerCallback(it) + } + } + + fun unregisterCallback(cb:ICallback?){ + cb?.let { + orderService?.unRegisterCallback(it) + } + } + + fun callCallBack(meters: Long,timeInSecond: Long,speed:Float){ + val len = icallbacks.beginBroadcast() + for (i in 0 until len) { + try { + icallbacks.getBroadcastItem(i).onResult(meters,timeInSecond,speed) + } catch (e: RemoteException) { + e.printStackTrace() + } + } + icallbacks.finishBroadcast() + } + + fun invoKeyByEventType(typeID:Int){ + val len = icallbacks.beginBroadcast() + for (i in 0 until len) { + try { + icallbacks.getBroadcastItem(i).postEvent(typeID) + } catch (e: RemoteException) { + e.printStackTrace() + } + } + icallbacks.finishBroadcast() + } + + /** + * 主进程、video进程都得调用 + * 主进程在显示是主动调用 + * video进程在天津View是判断是否调用了 + */ + private fun registerC() { + val resolver: ContentResolver = Utils.getApp().contentResolver + + cu = resolver.query( + BinderProvider.CONTENT_URI, + null, + null, + arrayOf(BinderProvider.SERVICE_LEFTMENU), + null + ) ?: return + + val binder: IBinder = getBinder(cu!!) + try { + orderService = ILeftMenuService.Stub.asInterface(binder) + } catch (e: RemoteException) { + e.printStackTrace() + cu?.close() + cu = null + } + } + + private fun getBinder(cursor: Cursor): IBinder { + val extras = cursor.extras + extras.classLoader = BinderCursor.BinderParcelable::class.java.classLoader + val w = extras.getParcelable("binder") + return w!!.mBinder + } +} \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/leftmenu/ListAdapter.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/leftmenu/ListAdapter.kt index d27143ba02..93b2aa0ed1 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/leftmenu/ListAdapter.kt +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/leftmenu/ListAdapter.kt @@ -30,26 +30,29 @@ class ListAdapter(private val context: Context,val list: MutableList() /** * 添加覆盖View在Activity上面 */ @JvmOverloads - fun showOverlayView(context: Activity, ani: Int = -1) { + fun showOverlayView(context: Activity,checkIndex:Int = LIVE,isOpen: Boolean=true, ani: Int = -1,isMainProcess: Boolean = false) { if (isShowing) { return } - if (applicationContext == null) { - applicationContext = context.applicationContext - } if (windowManager == null) { - windowManager = context.windowManager + windowManager = context.getSystemService(WINDOW_SERVICE) as WindowManager } overlayView = LayoutInflater.from(context) @@ -77,20 +83,14 @@ object OverlayLeftViewUtils { or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION) - layoutParams(ani,view) + layoutParams(ani,view, isOpen) // 如果正在展示中,并且lastOverlayView不为null,先做移除操作,保证覆盖在最上面的View只有一个,防止叠加导致无法移除 - dismissOverlayView() + dismissOverlayView(false) val vDragField = view.findViewById(R.id.v_drag_field) acivOpenClose = view.findViewById(R.id.aciv_open_close) - dragList.forEach { - it.setOnTouchListener(ItemViewTouchListener( - overlayView!!,params!!, windowManager, ::close, - ::open)) - } - vDragField.setOnTouchListener(ItemViewTouchListener(overlayView!!,params!!, windowManager, ::close, - ::open)) + vDragField.setOnTouchListener(ItemViewTouchListener()) vDragField.setOnClickListener { val start: Int = params!!.x if (start > DEVIATION_WIDTH /2 && start < 10) { @@ -104,40 +104,79 @@ object OverlayLeftViewUtils { val integers = mutableListOf() val liveSelected = object :ListAdapter.OnTabSelectListener{ - override fun onSelect(v: View?) { - close(view, windowManager) - FullVideoUtils.dismissOverlayView(true) - closeConsult() - closeMovice() + override fun onSelect(isCurrentProcess:Boolean) { + if(isCurrentProcess) { + close(view, windowManager) + }else { + LeftMenuOpen.invoKeyByEventType(VideoActivity.EVENT_FINISH) + } + if(isMainProcess){ + //主进程 建议Eventbus实现 + subscribeLive = Observable.timer(300, TimeUnit.MILLISECONDS) + .subscribe { + EventBus.getDefault().post(UIStatus(UIStatus.LIVE)) + } + }else{ + EventBus.getDefault().post(FinishActivity()) + } + } + } + + val overViewSelected = object :ListAdapter.OnTabSelectListener{ + override fun onSelect(isCurrentProcess:Boolean) { + if(isCurrentProcess) { + close(view, windowManager) + }else { + LeftMenuOpen.invoKeyByEventType(VideoActivity.EVENT_FINISH) + } + if(isMainProcess){ + //主进程 建议Eventbus实现 + subscribeOVERVIEW = Observable.timer(300, TimeUnit.MILLISECONDS) + .subscribe { + EventBus.getDefault().post(UIStatus(UIStatus.OVERVIEW)) + } + }else{ + EventBus.getDefault().post(FinishActivity()) + } } } val consultSelect = object :ListAdapter.OnTabSelectListener{ - override fun onSelect(v: View?) { - close(view, windowManager) - FullVideoUtils.dismissOverlayView(true) - closeMovice() - taxiPassengerMogoConsultView = TaxiPassengerMogoConsultView(context) - OverlayViewUtils.showOverlayView(context,taxiPassengerMogoConsultView) + override fun onSelect(isCurrentProcess:Boolean) { + if(isCurrentProcess) { + close(view, windowManager) + //计算订单起点和终点距离 + val sumDis = SharedPrefsMgr.getInstance(context).getInt(TaxiPassengerConst.SP_KEY_ORDER_SUM_DIS, 0) + VideoActivity.startActivity(context, VideoActivity.VIDEOTYPE_CONSULT,sumDis) + } } } val entertainmentSelect = object :ListAdapter.OnTabSelectListener{ - override fun onSelect(v: View?) { - close(view, windowManager) - FullVideoUtils.dismissOverlayView(true) - closeConsult() - taxiPassengerMogoMoviesView = TaxiPassengerMogoMoviesView(context) - OverlayViewUtils.showOverlayView(context,taxiPassengerMogoMoviesView) + override fun onSelect(isCurrentProcess:Boolean) { + if(isCurrentProcess) { + close(view, windowManager) + val sumDis = SharedPrefsMgr.getInstance(context).getInt(TaxiPassengerConst.SP_KEY_ORDER_SUM_DIS, 0) + VideoActivity.startActivity(context, VideoActivity.VIDEOTYPE_MOIES,sumDis) + } } } - integers.add(LeftMenuModel(R.drawable.taxi_p_mogo_live_select,R.drawable.taxi_p_mogo_live_selected,true,liveSelected)) + integers.add(LeftMenuModel(R.drawable.taxi_p_mogo_live_select,R.drawable.taxi_p_mogo_live_selected,false,liveSelected)) + integers.add(LeftMenuModel(R.drawable.taxi_p_mogo_overview_select,R.drawable.taxi_p_mogo_overview_selected,false,overViewSelected)) integers.add(LeftMenuModel(R.drawable.taxi_p_mogo_consult_select,R.drawable.taxi_p_mogo_consult_selected,false,consultSelect)) integers.add(LeftMenuModel(R.drawable.taxi_p_mogo_entertainment_select,R.drawable.taxi_p_mogo_entertainment_selected,false,entertainmentSelect)) + integers.forEachIndexed { index, leftMenuModel -> + leftMenuModel.isChecked = index == checkIndex + } lvSelectItem.adapter = ListAdapter(context, integers) + + addTarget(context) + + LeftMenuOpen.setValue(view, params, windowManager,::close,::open) try { windowManager!!.addView(overlayView, params) + checkProcess() isShowing = true } catch (e: Exception) { e.printStackTrace() @@ -145,10 +184,30 @@ object OverlayLeftViewUtils { } } + private fun addTarget(context: Activity) { + try { + val content = + context.window.decorView.findViewById(android.R.id.content) + val textView = View(context) + textView.id = R.id.ids_video_anchor + addDragTarget(textView) + val param: FrameLayout.LayoutParams = + FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT,FrameLayout.LayoutParams.WRAP_CONTENT) + param.gravity = Gravity.CENTER_VERTICAL + param.width = 143 + param.height = 308 + textView.layoutParams = param + content.addView(textView) + } catch (e: java.lang.Exception) { + e.printStackTrace() + } + } + /** * 打开状态栏 */ private fun open(overlayView: View,windowManager: WindowManager?) { + checkProcess() val valueAnimator = ValueAnimator.ofInt(params!!.x, 0) valueAnimator.duration = 100 valueAnimator.interpolator = LinearInterpolator() @@ -176,28 +235,50 @@ object OverlayLeftViewUtils { valueAnimator.start() } - fun open(){ - if(isShowing) { - overlayView?.let { open(it, windowManager) } - } - } - - fun dragTarget(view :View){ - if(view!=null) { - dragList.add(view) - params?.let { - view.setOnTouchListener( - ItemViewTouchListener( - overlayView!!, params!!, windowManager, ::close, - ::open - ) - ) + private fun checkProcess() { + ThreadPoolService.execute { + val currentProcessName = ProcessUtils.getCurrentProcessName() + if (currentProcessName.contains(":video")) { + return@execute + } + val allBackgroundProcesses = ProcessUtils.getAllBackgroundProcesses() + var haveProcess = false + allBackgroundProcesses.forEach { + if (it.contains(":video")) { + haveProcess = true + return@forEach + } + } + if (!haveProcess) { + EmptyService.startService(Utils.getApp()) } } } - fun removeDragTarget(view: View){ - dragList.remove(view) + fun addDragTarget(view :View?){ + LeftMenuOpen.registerDragView(view) + } + + fun removeDragTarget(view: View?){ + LeftMenuOpen.unRegisterDragView(view) + } + + /** + * + */ + fun transmissionIndex(index:Int){ + if(!ProcessUtils.isMainProcess(Utils.getApp())) { + LeftMenuOpen.transmissionIndex(index) + } + } + + fun transmissionIndexGet(index: Int){ + overlayView?.let { + val lvSelectItem = it.findViewById(R.id.lv_select_item) + val listAdapter = lvSelectItem.adapter as ListAdapter + listAdapter.setSelectIndex(index,false) + } + } private fun closeByTime( @@ -226,8 +307,10 @@ object OverlayLeftViewUtils { valueAnimator.duration = 100 valueAnimator.interpolator = LinearInterpolator() valueAnimator.addUpdateListener { - params?.x = it.animatedValue as Int - windowManager?.updateViewLayout(overlayView, params) + params?.let { paramsIn-> + paramsIn.x = it.animatedValue as Int + windowManager?.updateViewLayout(overlayView, paramsIn) + } } valueAnimator.addListener(object : Animator.AnimatorListener { override fun onAnimationStart(animation: Animator?) {} @@ -237,11 +320,14 @@ object OverlayLeftViewUtils { pivotY = (height /2).toFloat() rotation = 180f } - params?.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or - WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS or - WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE or - WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL - windowManager?.updateViewLayout(overlayView, params) + params?.let { + it.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or + WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS or + WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE or + WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL + windowManager?.updateViewLayout(overlayView, it) + } + } override fun onAnimationCancel(animation: Animator?) {} override fun onAnimationRepeat(animation: Animator?) {} @@ -249,16 +335,21 @@ object OverlayLeftViewUtils { valueAnimator.start() } - private fun layoutParams(ani: Int,view :View) { + private fun layoutParams(ani: Int,view :View,isOpen: Boolean) { if(params ==null) { params = WindowManager.LayoutParams() } + params = WindowManager.LayoutParams() params?.let { it.width = WIDTH it.height = WindowManager.LayoutParams.MATCH_PARENT it.alpha = 1.0f it.gravity = Gravity.START or Gravity.CENTER_HORIZONTAL - it.x = 0 + if(isOpen) { + it.x = 0 + }else{ + it.x = DEVIATION_WIDTH + } it.y = 0 it.format = PixelFormat.RGBA_8888 // 设置窗口类型为应用子窗口,和PopupWindow同类型 @@ -277,27 +368,27 @@ object OverlayLeftViewUtils { /** * 移除覆盖View在Activity上面 */ - fun dismissOverlayView() { + fun dismissOverlayView(isMain:Boolean) { if (!isShowing) { return } - subscribe?.let { - if (!it.isDisposed) { - it.dispose() - } - } - FullVideoUtils.dismissOverlayView(true) - // 管理的要关闭都得关闭 - dragList.forEach { - it.setOnTouchListener(null) - } - dragList.clear() - closeConsult() - closeMovice() + releaseDelay(subscribe) + releaseDelay(subscribeLive) + releaseDelay(subscribeOVERVIEW) subscribe = null + subscribeLive = null + subscribeOVERVIEW = null + // 管理的要关闭都得关闭 + if(isMain) { + LeftMenuOpen.invoKeyByEventType(VideoActivity.EVENT_FINISH) + } + + LeftMenuOpen.clearValue() try { if (windowManager != null && overlayView != null) { - windowManager!!.removeView(overlayView) + windowManager!!.removeViewImmediate(overlayView) + windowManager = null + params = null } if (overlayView!=null) { overlayView = null @@ -311,19 +402,11 @@ object OverlayLeftViewUtils { } } - private fun closeMovice() { - OverlayViewUtils.dismissOverlayView(taxiPassengerMogoMoviesView) - taxiPassengerMogoMoviesView= null - System.gc() - } - - private fun closeConsult() { - OverlayViewUtils.dismissOverlayView(taxiPassengerMogoConsultView) - taxiPassengerMogoConsultView = null - System.gc() - } - - private fun getViewBounds(view: View): Rect { - return Rect(view.left, view.top, view.right, view.bottom) + private fun releaseDelay(subscribe: Disposable?) { + subscribe?.let { + if (!it.isDisposed) { + it.dispose() + } + } } } \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/FloatingDistanceInfoUtils.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/FloatingDistanceInfoUtils.kt new file mode 100644 index 0000000000..c5f8d6ad39 --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/FloatingDistanceInfoUtils.kt @@ -0,0 +1,235 @@ +package com.mogo.och.taxi.passenger.ui.video + +import android.annotation.SuppressLint +import android.app.Activity +import android.content.Context +import android.graphics.PixelFormat +import android.os.Build +import android.view.Gravity +import android.view.LayoutInflater +import android.view.View +import android.view.WindowManager +import android.widget.SeekBar +import androidx.appcompat.widget.AppCompatTextView +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.content.ContextCompat +import com.mogo.eagle.core.utilcode.util.UiThreadHandler +import com.mogo.och.common.module.wigets.OCHGradientTextView +import com.mogo.och.taxi.passenger.R + +/** + * 视频全屏播放 + * + * @author yangyakun + */ +@SuppressLint("StaticFieldLeak") +object FloatingDistanceInfoUtils { + private const val TAG = "OverlayViewUtils" + private var windowManager: WindowManager? = null + + @Volatile + private var isShowing = false + + private var params:WindowManager.LayoutParams?=null + private var paramsBottom:WindowManager.LayoutParams?=null + + + private var orderInfoView: View?=null + private var processView: SeekBar?=null + + // 距离 + private var actvDistancew: OCHGradientTextView?=null + // 距离单位 + private var actvDistancewUnit: AppCompatTextView?=null + // 剩余时间 + private var actvSurplusTime: OCHGradientTextView?=null + // 到达时间 + private var actvArrivedTime: OCHGradientTextView?=null + + private var actvSpeed: OCHGradientTextView?=null + + + /** + * 添加覆盖View在Activity上面 + */ + @JvmOverloads + fun showOverlayView(context: Activity,ani: Int = -1,sumDis:Int) { + if (isShowing) { + return + } + if (windowManager == null) { + windowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager + } + + orderInfoView = LayoutInflater.from(context) + .inflate(R.layout.taxi_p_window_float_distance_info, null) as ConstraintLayout + orderInfoView?.let { view -> + // 设置View显示模式,沉浸式的侵入到状态栏,导航栏 + view.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY + or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION + or View.SYSTEM_UI_FLAG_LAYOUT_STABLE + or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION) + layoutParams(ani) + actvSpeed = view.findViewById(R.id.actv_speed) + actvDistancew = view.findViewById(R.id.actv_distancew) + actvDistancewUnit = view.findViewById(R.id.actv_distancew_unit) + actvSurplusTime = view.findViewById(R.id.actv_surplus_time) + actvArrivedTime = view.findViewById(R.id.actv_arrived_time) + + val intArrayOf = intArrayOf( + context.resources.getColor(R.color.taxi_p_video_gradient_end), + context.resources.getColor(R.color.taxi_p_video_gradient_start) + ) + + actvSpeed?.setVertrial(true) + actvSpeed?.setmColorList(intArrayOf) + + actvDistancew?.setVertrial(true) + actvDistancew?.setmColorList(intArrayOf) + + actvSurplusTime?.setVertrial(true) + actvSurplusTime?.setmColorList(intArrayOf) + + actvArrivedTime?.setVertrial(true) + actvArrivedTime?.setmColorList(intArrayOf) + + processView = SeekBar(context) + processView?.let { + it.max = sumDis + layoutParamsBottom(-1) + it.setPadding(0,0,0,0) + it.progressDrawable = ContextCompat.getDrawable(context,R.drawable.taxi_video_order_process) + it.thumb = null + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + it.maxHeight = 14 + it.minHeight = 14 + } + } + + + // 如果正在展示中,并且lastOverlayView不为null,先做移除操作,保证覆盖在最上面的View只有一个,防止叠加导致无法移除 + dismissOverlayView() + + try { + windowManager!!.addView(orderInfoView, params) + windowManager!!.addView(processView, paramsBottom) + isShowing = true + } catch (e: Exception) { + e.printStackTrace() + } + } + } + + + private fun layoutParams(ani: Int) { + if(params ==null) { + params = WindowManager.LayoutParams() + } + params = WindowManager.LayoutParams() + params?.let { + it.width = WindowManager.LayoutParams.WRAP_CONTENT + it.height = WindowManager.LayoutParams.WRAP_CONTENT + it.alpha = 1.0f + it.gravity = Gravity.END or Gravity.TOP + it.x = 0 + it.y = 199 + it.format = PixelFormat.RGBA_8888 + // 设置窗口类型为应用子窗口,和PopupWindow同类型 + it.type = WindowManager.LayoutParams.TYPE_APPLICATION_SUB_PANEL + // 没有边界限制,允许窗口扩展到屏幕外 + it.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or + WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS or + WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE or + WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL + if (ani != -1) { + it.windowAnimations = ani + } + } + } + + private fun layoutParamsBottom(ani: Int) { + if(paramsBottom ==null) { + paramsBottom = WindowManager.LayoutParams() + } + paramsBottom = WindowManager.LayoutParams() + paramsBottom?.let { + it.width = WindowManager.LayoutParams.MATCH_PARENT + it.height = WindowManager.LayoutParams.WRAP_CONTENT + it.alpha = 1.0f + it.gravity = Gravity.START or Gravity.BOTTOM + it.x = 0 + it.y = 0 + it.format = PixelFormat.RGBA_8888 + // 设置窗口类型为应用子窗口,和PopupWindow同类型 + it.type = WindowManager.LayoutParams.TYPE_APPLICATION_SUB_PANEL + // 没有边界限制,允许窗口扩展到屏幕外 + it.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or + WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS or + WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE or + WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL + if (ani != -1) { + it.windowAnimations = ani + } + } + } + + fun setSpeed(speed: Float) { + val newSpeed: Int = (Math.abs(speed) * 3.6f).toInt() // 倒车时工控机反馈定位信息中speed为负值 + + UiThreadHandler.getsUiHandler().post { + actvSpeed?.text = "$newSpeed" + } + } + + fun setDistance(meters:Long,remainDis: String?, disUnit: String, time: Int, arriveTime: String) { + UiThreadHandler.getsUiHandler().post { + actvDistancew?.text = "$remainDis" + actvDistancewUnit?.text = "距离($disUnit)" + actvSurplusTime?.text = "$time" + actvArrivedTime?.text = arriveTime + + processView?.let { + val process = it.max - meters + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + it.setProgress(process.toInt(), true) + }else{ + it.progress = process.toInt() + } + it.jumpDrawablesToCurrentState() + } + + } + } + + /** + * 移除覆盖View在Activity上面 + */ + fun dismissOverlayView() { + if (!isShowing) { + return + } + try { + if (windowManager != null && orderInfoView != null) { + windowManager!!.removeViewImmediate(orderInfoView) + params = null + } + if (windowManager != null && processView != null) { + windowManager!!.removeViewImmediate(processView) + paramsBottom = null + } + if(windowManager!=null){ + windowManager = null + } + if (orderInfoView!=null) { + orderInfoView = null + } + if(processView!=null){ + processView = null + } + isShowing = false + } catch (e: Exception) { + e.printStackTrace() + } + } +} \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/FullVideoUtils.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/FullVideoUtils.kt index 262849a027..8691df08b1 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/FullVideoUtils.kt +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/FullVideoUtils.kt @@ -10,15 +10,14 @@ import com.shuyu.gsyvideoplayer.GSYVideoManager import java.lang.Exception /** - * 遮罩层工具类 + * 视频全屏播放 * - * @author mogoauto + * @author yangyakun */ @SuppressLint("StaticFieldLeak") object FullVideoUtils { private const val TAG = "OverlayViewUtils" private var windowManager: WindowManager? = null - private var applicationContext: Context? = null @Volatile private var isShowing = false @@ -33,9 +32,6 @@ object FullVideoUtils { */ @JvmOverloads fun showOverlayView(context: Activity, overlayView: View, ani: Int = -1) { - if (applicationContext == null) { - applicationContext = context.applicationContext - } if (windowManager == null) { windowManager = context.windowManager } @@ -86,7 +82,8 @@ object FullVideoUtils { } try { if (windowManager != null) { - windowManager!!.removeView(lastOverlayView) + windowManager!!.removeViewImmediate(lastOverlayView) + windowManager = null } if (lastOverlayView != null) { lastOverlayView = null diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/RecyclerVideoAdapter.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/RecyclerVideoAdapter.java index 0798eaf0a6..4e01541cd3 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/RecyclerVideoAdapter.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/RecyclerVideoAdapter.java @@ -14,6 +14,7 @@ import com.bumptech.glide.request.RequestOptions; import com.mogo.eagle.core.utilcode.util.ToastUtils; import com.mogo.och.taxi.passenger.R; import com.mogo.och.taxi.passenger.bean.TaxiPassengerVideoPlay; +import com.shuyu.gsyvideoplayer.listener.GSYSampleCallBack; import java.util.List; @@ -23,6 +24,7 @@ public class RecyclerVideoAdapter extends RecyclerView.Adapter itemDataList = null; private Context context = null; private OnThumbImageClilckListener onThumbImageClilckListener; + private RecyclerView recyclerView; public OnThumbImageClilckListener getOnThumbImageClilckListener() { return onThumbImageClilckListener; @@ -32,9 +34,10 @@ public class RecyclerVideoAdapter extends RecyclerView.Adapter itemDataList) { + public RecyclerVideoAdapter(Context context, List itemDataList,RecyclerView recyclerView) { this.itemDataList = itemDataList; this.context = context; + this.recyclerView = recyclerView; } public TaxiPassengerVideoPlay getItemByPosition(int position){ @@ -53,6 +56,8 @@ public class RecyclerVideoAdapter extends RecyclerView.Adapter() - arrayListOf.add(TaxiPassengerVideoPlay("https://img.zhidaohulian.com/fileServer/online_car_hailing/1655708596763/全车型混剪增加红旗车队.m4v","https://img.zhidaohulian.com/fileServer/online_car_hailing/1655969511280/车队.png","蘑菇车联覆盖生活的方方面面")) - arrayListOf.add(TaxiPassengerVideoPlay("https://img.zhidaohulian.com/fileServer/online_car_hailing/1655708554279/红旗车队.m4v","https://img.zhidaohulian.com/fileServer/online_car_hailing/1655969553174/红旗重新排版.png","蘑菇车联之红旗车队")) - arrayListOf.add(TaxiPassengerVideoPlay("https://img.zhidaohulian.com/fileServer/online_car_hailing/1655708499497/大运会合作解说版.m4v","https://img.zhidaohulian.com/fileServer/online_car_hailing/1655969536177/大运会.png","蘑菇车联牵手成都大运会")) - arrayListOf.add(TaxiPassengerVideoPlay("https://img.zhidaohulian.com/fileServer/online_car_hailing/1655708409810/20210610重新排版3屏.m4v","https://img.zhidaohulian.com/fileServer/online_car_hailing/1655969579713/三屏.png","多视角体验蘑菇车联自动驾驶")) - val recyclerVideoAdapter = RecyclerVideoAdapter(context, arrayListOf) - val carouselLayoutManager = CarouselLayoutManager(CarouselLayoutManager.HORIZONTAL, true) - carouselLayoutManager.setPostLayoutListener(CarouselZoomPostLayoutListener ()) - carouselLayoutManager.maxVisibleItems = 1 - indicatorView.notifyDataChanged(arrayListOf.size) - indicatorView.setSlideMode(IndicatorSlideMode.SCALE) - indicatorView.setOrientation(IndicatorOrientation.INDICATOR_HORIZONTAL) - indicatorView.setIndicatorStyle(IndicatorStyle.ROUND_RECT) - indicatorView.setSliderColor(Color.parseColor("#80FFFFFF"), Color.parseColor("#2972FF"),Color.parseColor("#27C8FF")) - indicatorView.setSliderWidth(16f, 101f) - indicatorView.setSliderHeight(16f) - indicatorView.setSliderGap(30f) - rvVideoPlaylist.addOnScrollListener(object: CenterScrollListener() { - var prePlayerPosition = 0 - override fun pageSelect(recyclerView: RecyclerView?, newState: Int) { - //播放视频 - val (centerItemPosition: Int, player) = getPlayer(carouselLayoutManager) - indicatorView.onPageSelected(centerItemPosition) - if(player is ConsultVideoPlayer){ - if(prePlayerPosition!=centerItemPosition) { - if(player.currentState==GSYVideoView.CURRENT_STATE_PAUSE){ - player.onVideoReset() - }else{ - } - val playerHolder = carouselLayoutManager.findViewByPosition(prePlayerPosition) - val prePlayer = playerHolder?.findViewById(R.id.video_item_player) - prePlayer?.let { - if(it is ConsultVideoPlayer){ - it.onVideoReset() - } - } - val taxiPassengerVideoPlay = arrayListOf[centerItemPosition] - setBackageAndPlayNext(taxiPassengerVideoPlay, player, centerItemPosition) - }else{ - player.onVideoResume(false) - } - } - prePlayerPosition = centerItemPosition - } - - override fun pageStop() { - val (centerItemPosition: Int, player) = getPlayer(carouselLayoutManager) - if(player is ConsultVideoPlayer){ - player.onVideoPause() - } - } - - }) - carouselLayoutManager.addOnDargAutoDiffListener { adapterPosition, currentPosition -> - val fl = adapterPosition - floor(adapterPosition) - var currentIndex = currentPosition - if(fl>0.5){ - if(currentPosition==0){ - currentIndex = rvVideoPlaylist.adapter!!.itemCount-1 - }else { - currentIndex -= 1 - } - } - indicatorView.onPageScrolled(currentIndex, fl, 0) - } - recyclerVideoAdapter.setOnThumbImageClilckListener { - val (centerItemPosition: Int, player) = getPlayer(carouselLayoutManager) - if(player is ConsultVideoPlayer) { - player.onVideoReset() - player.thumbImageViewLayout.visibility = View.VISIBLE - } - rvVideoPlaylist.smoothScrollToPosition(it) - } - rvVideoPlaylist.layoutManager = carouselLayoutManager - rvVideoPlaylist.setHasFixedSize(true) - rvVideoPlaylist.adapter = recyclerVideoAdapter - } - - private fun setBackageAndPlayNext( - taxiPassengerVideoPlay: TaxiPassengerVideoPlay, - player: ConsultVideoPlayer, - centerItemPosition: Int, - ) { - // 设置背景图片 - Glide.with(context).asBitmap() - .load(taxiPassengerVideoPlay.imageUrl) - .apply( - RequestOptions().transform( - GlideBlurTransform(context, taxiPassengerVideoPlay.imageUrl, 100) - ) - ) - .into(object : SimpleTarget() { - override fun onResourceReady( - resource: Bitmap, - transition: Transition? - ) { - clContain.background = BitmapDrawable(context.resources, resource) - } - }) - if(player.getVideoAllCallBack()==null) { - player.setVideoAllCallBack(object : GSYSampleCallBack() { - override fun onAutoComplete(url: String?, vararg objects: Any?) { - player.onVideoReset() - val itemCount = rvVideoPlaylist.adapter?.itemCount - itemCount?.let { - if (centerItemPosition == itemCount - 1) { - rvVideoPlaylist.smoothScrollToPosition(0) - } else { - rvVideoPlaylist.smoothScrollToPosition(centerItemPosition + 1) - } - } - } - - override fun onClickBlank(url: String?, vararg objects: Any?) { - super.onClickBlank(url, *objects) - rvVideoPlaylist.smoothScrollToPosition(centerItemPosition) - } - - override fun onPlayError(url: String?, vararg objects: Any?) { - super.onPlayError(url, *objects) - ToastUtils.showLong("哎呀,出错了,看看其他视频吧") - } - - override fun onClickStartError(url: String?, vararg objects: Any?) { - super.onClickStartError(url, *objects) - ToastUtils.showLong("哎呀,出错了,看看其他视频吧") - } - }) - } - } - - - override fun onWindowFocusChanged(hasWindowFocus: Boolean) { - super.onWindowFocusChanged(hasWindowFocus) - val carouselLayoutManager = rvVideoPlaylist.layoutManager as CarouselLayoutManager - val (centerItemPosition: Int, player) = getPlayer(carouselLayoutManager) - player?.let { - if (player is ConsultVideoPlayer) { - if(hasWindowFocus){// 获取焦点两种情况 - // 恢复播放和开始播放 - if(player.isIfCurrentIsFullscreen){// 全屏了 - - }else { - when (player.currentState) { - GSYVideoView.CURRENT_STATE_PAUSE -> { - player.onVideoResume(false) - } - GSYVideoView.CURRENT_STATE_PLAYING -> { - } - else -> { - val recyclerVideoAdapter = - rvVideoPlaylist.adapter as RecyclerVideoAdapter - setBackageAndPlayNext( - recyclerVideoAdapter.getItemByPosition(centerItemPosition), - player, centerItemPosition - ) - //player.startPlayLogic() - } - } - } - }else { - // 离开应用 暂停视频 - // 关闭 onDetachedFromWindow 会reset - if(player.isIfCurrentIsFullscreen){// 全屏了 - - }else { - player.onVideoPause() - } - } - } - - } - - } - - private fun getPlayer(carouselLayoutManager: CarouselLayoutManager): Pair { - val centerItemPosition: Int = carouselLayoutManager.centerItemPosition - val playerHolder = carouselLayoutManager.findViewByPosition(centerItemPosition) - val player = playerHolder?.findViewById(R.id.video_item_player) - return Pair(centerItemPosition, player) - } - - - override fun onDetachedFromWindow() { - val carouselLayoutManager = rvVideoPlaylist.layoutManager as CarouselLayoutManager - val (_: Int, player) = getPlayer(carouselLayoutManager) - player?.let { - if(player is ConsultVideoPlayer){ - player.currentPlayer.release() - player.onVideoReset() - } - } - OverlayLeftViewUtils.removeDragTarget(vOpenLeft) - super.onDetachedFromWindow() - } - - init { - try { - initView(context) - } catch (e: Exception) { - e.printStackTrace() - } - } - -} \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/TaxiPassengerMogoMoviesView.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/TaxiPassengerMogoMoviesView.kt deleted file mode 100644 index 2693764339..0000000000 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/TaxiPassengerMogoMoviesView.kt +++ /dev/null @@ -1,272 +0,0 @@ -package com.mogo.och.taxi.passenger.ui.video - -import android.content.Context -import android.graphics.Bitmap -import android.graphics.Color -import android.graphics.drawable.BitmapDrawable -import android.util.AttributeSet -import android.view.LayoutInflater -import android.view.View -import android.widget.RelativeLayout -import androidx.constraintlayout.widget.ConstraintLayout -import androidx.recyclerview.widget.RecyclerView -import com.bumptech.glide.Glide -import com.bumptech.glide.request.RequestOptions -import com.bumptech.glide.request.target.SimpleTarget -import com.bumptech.glide.request.transition.Transition -import com.mogo.eagle.core.utilcode.util.ToastUtils -import com.mogo.och.taxi.passenger.R -import com.mogo.och.taxi.passenger.bean.TaxiPassengerVideoPlay -import com.mogo.och.taxi.passenger.ui.leftmenu.OverlayLeftViewUtils -import com.mogo.och.taxi.passenger.ui.video.layoutmanage.CarouselLayoutManager -import com.mogo.och.taxi.passenger.ui.video.layoutmanage.CarouselZoomPostLayoutListener -import com.mogo.och.taxi.passenger.ui.video.layoutmanage.CenterScrollListener -import com.mogo.och.taxi.passenger.utils.blur.GlideBlurTransform -import com.mogo.och.taxi.passenger.widget.ConsultVideoPlayer -import com.mogo.och.taxi.passenger.widget.indicator.IndicatorView -import com.mogo.och.taxi.passenger.widget.indicator.enums.IndicatorOrientation -import com.mogo.och.taxi.passenger.widget.indicator.enums.IndicatorSlideMode -import com.mogo.och.taxi.passenger.widget.indicator.enums.IndicatorStyle -import com.shuyu.gsyvideoplayer.listener.GSYSampleCallBack -import com.shuyu.gsyvideoplayer.video.base.GSYVideoView -import java.util.* -import kotlin.math.floor - - -/** - * - * 蘑菇咨询 - * Created on 2022/5/16 - */ -class TaxiPassengerMogoMoviesView :RelativeLayout { - - constructor(context: Context?) : super(context) - - constructor(context: Context?, attributeSet: AttributeSet) : super(context, attributeSet) - - constructor(context: Context?, attributeSet: AttributeSet, defStyleAttr: Int) : super(context, attributeSet, defStyleAttr) - - constructor(context: Context?, attributeSet: AttributeSet, defStyleAttr: Int, defStyleRes: Int) : super(context, attributeSet, defStyleAttr, defStyleRes) - - private lateinit var rvVideoPlaylist: RecyclerView - private lateinit var indicatorView: IndicatorView - private lateinit var clContain: ConstraintLayout - private lateinit var vOpenLeft: View - - private fun initView(context: Context) { - LayoutInflater.from(context).inflate(R.layout.taxi_p_mogo_movies, this, true) - rvVideoPlaylist = findViewById(R.id.rv_video_playlist) - indicatorView = findViewById(R.id.indicatorView) - clContain = findViewById(R.id.cl_contain) - - vOpenLeft = findViewById(R.id.v_open_left) - vOpenLeft.setOnClickListener { - OverlayLeftViewUtils.open() - } - OverlayLeftViewUtils.dragTarget(vOpenLeft) - - val arrayListOf = ArrayList() - arrayListOf.add(TaxiPassengerVideoPlay("https://img.zhidaohulian.com/fileServer/online_car_hailing/1656558672856/小宝宝.mp4","https://img.zhidaohulian.com/fileServer/online_car_hailing/1656559345882/1.png","小宝宝")) - arrayListOf.add(TaxiPassengerVideoPlay("https://img.zhidaohulian.com/fileServer/online_car_hailing/1656558697055/小猫.mp4","https://img.zhidaohulian.com/fileServer/online_car_hailing/1656559367261/2.png","小猫")) - arrayListOf.add(TaxiPassengerVideoPlay("https://img.zhidaohulian.com/fileServer/online_car_hailing/1656558730074/星空.mp4","https://img.zhidaohulian.com/fileServer/online_car_hailing/1656559406169/4.png","星空")) - arrayListOf.add(TaxiPassengerVideoPlay("https://img.zhidaohulian.com/fileServer/online_car_hailing/1656558644708/海浪.mp4","https://img.zhidaohulian.com/fileServer/online_car_hailing/1656559384635/3.png","星空")) - val recyclerVideoAdapter = RecyclerVideoAdapter(context, arrayListOf) - val carouselLayoutManager = CarouselLayoutManager(CarouselLayoutManager.HORIZONTAL, true) - carouselLayoutManager.setPostLayoutListener(CarouselZoomPostLayoutListener ()) - carouselLayoutManager.maxVisibleItems = 1 - indicatorView.notifyDataChanged(arrayListOf.size) - indicatorView.setSlideMode(IndicatorSlideMode.SCALE) - indicatorView.setOrientation(IndicatorOrientation.INDICATOR_HORIZONTAL) - indicatorView.setIndicatorStyle(IndicatorStyle.ROUND_RECT) - indicatorView.setSliderColor(Color.parseColor("#80FFFFFF"), Color.parseColor("#2972FF"),Color.parseColor("#27C8FF")) - indicatorView.setSliderWidth(16f, 101f) - indicatorView.setSliderHeight(16f) - indicatorView.setSliderGap(30f) - rvVideoPlaylist.addOnScrollListener(object: CenterScrollListener() { - var prePlayerPosition = 0 - override fun pageSelect(recyclerView: RecyclerView?, newState: Int) { - //播放视频 - val (centerItemPosition: Int, player) = getPlayer(carouselLayoutManager) - indicatorView.onPageSelected(centerItemPosition) - if(player is ConsultVideoPlayer){ - if(prePlayerPosition!=centerItemPosition) { - if(player.currentState==GSYVideoView.CURRENT_STATE_PAUSE){ - player.onVideoReset() - }else{ - } - val playerHolder = carouselLayoutManager.findViewByPosition(prePlayerPosition) - val prePlayer = playerHolder?.findViewById(R.id.video_item_player) - prePlayer?.let { - if(it is ConsultVideoPlayer){ - it.onVideoReset() - } - } - val taxiPassengerVideoPlay = arrayListOf[centerItemPosition] - setBackageAndPlayNext(taxiPassengerVideoPlay, player, centerItemPosition) - }else{ - player.onVideoResume(false) - } - } - prePlayerPosition = centerItemPosition - } - - override fun pageStop() { - val (centerItemPosition: Int, player) = getPlayer(carouselLayoutManager) - if(player is ConsultVideoPlayer){ - player.onVideoPause() - } - } - - }) - carouselLayoutManager.addOnDargAutoDiffListener { adapterPosition, currentPosition -> - val fl = adapterPosition - floor(adapterPosition) - var currentIndex = currentPosition - if(fl>0.5){ - if(currentPosition==0){ - currentIndex = rvVideoPlaylist.adapter!!.itemCount-1 - }else { - currentIndex -= 1 - } - } - indicatorView.onPageScrolled(currentIndex, fl, 0) - } - recyclerVideoAdapter.setOnThumbImageClilckListener { - val (centerItemPosition: Int, player) = getPlayer(carouselLayoutManager) - if(player is ConsultVideoPlayer) { - player.onVideoReset() - player.thumbImageViewLayout.visibility = View.VISIBLE - } - rvVideoPlaylist.smoothScrollToPosition(it) - } - rvVideoPlaylist.layoutManager = carouselLayoutManager - rvVideoPlaylist.setHasFixedSize(true) - rvVideoPlaylist.adapter = recyclerVideoAdapter - } - - private fun setBackageAndPlayNext( - taxiPassengerVideoPlay: TaxiPassengerVideoPlay, - player: ConsultVideoPlayer, - centerItemPosition: Int, - ) { - // 设置背景图片 - Glide.with(context).asBitmap() - .load(taxiPassengerVideoPlay.imageUrl) - .apply( - RequestOptions().transform( - GlideBlurTransform(context, taxiPassengerVideoPlay.imageUrl, 85) - ) - ) - .into(object : SimpleTarget() { - override fun onResourceReady( - resource: Bitmap, - transition: Transition? - ) { - clContain.background = BitmapDrawable(context.resources, resource) - } - }) - if(player.getVideoAllCallBack()==null) { - player.setVideoAllCallBack(object : GSYSampleCallBack() { - override fun onAutoComplete(url: String?, vararg objects: Any?) { - player.onVideoReset() - val itemCount = rvVideoPlaylist.adapter?.itemCount - itemCount?.let { - if (centerItemPosition == itemCount - 1) { - rvVideoPlaylist.smoothScrollToPosition(0) - } else { - rvVideoPlaylist.smoothScrollToPosition(centerItemPosition + 1) - } - } - } - - override fun onClickBlank(url: String?, vararg objects: Any?) { - super.onClickBlank(url, *objects) - rvVideoPlaylist.smoothScrollToPosition(centerItemPosition) - } - - override fun onPlayError(url: String?, vararg objects: Any?) { - super.onPlayError(url, *objects) - ToastUtils.showLong("哎呀,出错了,看看其他视频吧") - } - - override fun onClickStartError(url: String?, vararg objects: Any?) { - super.onClickStartError(url, *objects) - ToastUtils.showLong("哎呀,出错了,看看其他视频吧") - } - }) - } - } - - - override fun onWindowFocusChanged(hasWindowFocus: Boolean) { - super.onWindowFocusChanged(hasWindowFocus) - val carouselLayoutManager = rvVideoPlaylist.layoutManager as CarouselLayoutManager - val (centerItemPosition: Int, player) = getPlayer(carouselLayoutManager) - player?.let { - if (player is ConsultVideoPlayer) { - if(hasWindowFocus){// 获取焦点两种情况 - // 恢复播放和开始播放 - if(player.isIfCurrentIsFullscreen){// 全屏了 - - }else { - when (player.currentState) { - GSYVideoView.CURRENT_STATE_PAUSE -> { - player.onVideoResume(false) - } - GSYVideoView.CURRENT_STATE_PLAYING -> { - } - else -> { - val recyclerVideoAdapter = - rvVideoPlaylist.adapter as RecyclerVideoAdapter - setBackageAndPlayNext( - recyclerVideoAdapter.getItemByPosition(centerItemPosition), - player, centerItemPosition - ) - //player.startPlayLogic() - } - } - } - }else { - // 离开应用 暂停视频 - // 关闭 onDetachedFromWindow 会reset - if(player.isIfCurrentIsFullscreen){// 全屏了 - - }else { - player.onVideoPause() - } - } - } - - } - - } - - private fun getPlayer(carouselLayoutManager: CarouselLayoutManager): Pair { - val centerItemPosition: Int = carouselLayoutManager.centerItemPosition - val playerHolder = carouselLayoutManager.findViewByPosition(centerItemPosition) - val player = playerHolder?.findViewById(R.id.video_item_player) - return Pair(centerItemPosition, player) - } - - - override fun onDetachedFromWindow() { - val carouselLayoutManager = rvVideoPlaylist.layoutManager as CarouselLayoutManager - val (_: Int, player) = getPlayer(carouselLayoutManager) - player?.let { - if(player is ConsultVideoPlayer){ - player.currentPlayer.release() - player.onVideoReset() - } - } - OverlayLeftViewUtils.removeDragTarget(vOpenLeft) - super.onDetachedFromWindow() - } - - init { - try { - initView(context) - } catch (e: Exception) { - e.printStackTrace() - } - } - -} \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/VideoActivity.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/VideoActivity.kt new file mode 100644 index 0000000000..2863f1e589 --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/VideoActivity.kt @@ -0,0 +1,400 @@ +package com.mogo.och.taxi.passenger.ui.video + +import android.content.Context +import android.content.Intent +import android.graphics.Color +import android.net.Uri +import android.os.Bundle +import android.view.View +import android.widget.TextView +import androidx.appcompat.app.AppCompatActivity +import androidx.appcompat.widget.AppCompatImageView +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.recyclerview.widget.RecyclerView +import com.mogo.och.common.module.utils.DateTimeUtil +import com.mogo.och.common.module.utils.NumberFormatUtil +import com.mogo.och.taxi.passenger.R +import com.mogo.och.taxi.passenger.bean.TaxiPassengerVideoPlay +import com.mogo.och.taxi.passenger.constant.TaxiPassengerConst +import com.mogo.och.taxi.passenger.mulprocess.ICallback +import com.mogo.och.taxi.passenger.ui.leftmenu.LeftMenuOpen +import com.mogo.och.taxi.passenger.ui.leftmenu.OverlayLeftViewUtils +import com.mogo.och.taxi.passenger.event.FinishActivity +import com.mogo.och.taxi.passenger.ui.video.layoutmanage.CarouselLayoutManager +import com.mogo.och.taxi.passenger.ui.video.layoutmanage.CarouselZoomPostLayoutListener +import com.mogo.och.taxi.passenger.ui.video.layoutmanage.CenterScrollListener +import com.mogo.och.taxi.passenger.utils.FixMemoryLeak +import com.mogo.och.taxi.passenger.widget.ConsultVideoPlayer +import com.mogo.och.taxi.passenger.widget.indicator.IndicatorView +import com.mogo.och.taxi.passenger.widget.indicator.enums.IndicatorOrientation +import com.mogo.och.taxi.passenger.widget.indicator.enums.IndicatorSlideMode +import com.mogo.och.taxi.passenger.widget.indicator.enums.IndicatorStyle +import com.shuyu.gsyvideoplayer.video.base.GSYVideoView +import org.greenrobot.eventbus.EventBus +import org.greenrobot.eventbus.Subscribe +import org.greenrobot.eventbus.ThreadMode +import java.util.* +import kotlin.math.floor + + +class VideoActivity : AppCompatActivity() { + + private var rvVideoPlaylist: RecyclerView?=null + private lateinit var indicatorView: IndicatorView + private lateinit var clContain: ConstraintLayout + private lateinit var acivTitleIcon: AppCompatImageView + private lateinit var tvTitle: TextView + + private val arrayListOf = ArrayList() + + + companion object{ + const val VIDEOTYPE = "VIDEOTYPE" + const val VIDEOTYPE_CONSULT = 0 + const val VIDEOTYPE_MOIES = 1 + const val VIDEOTYPE_CLOSE = 2 + + const val EVENT_FINISH = 0 + + fun startActivity(context:Context,videoType:Int,sumDis:Int){ + val intent = Intent(context, VideoActivity::class.java) + intent.putExtra(VIDEOTYPE, videoType) + intent.putExtra(TaxiPassengerConst.SP_KEY_ORDER_SUM_DIS,sumDis) + context.startActivity(intent) + } + } + + private var videotype = VIDEOTYPE_CONSULT + + val callBack = object : ICallback.Stub() { + override fun onResult(meters :Long, timeInSecond:Long,speed:Float) { + if(speed<0){ + // 距离单位 + var disUnit = "公里" + // 距离 + var remainDis: String? = "0" + + if (meters > 0) { + if (meters / 1000 < 1) { + disUnit = "米" + remainDis = Math.round(meters.toFloat()).toString() + } else { + disUnit = "公里" + remainDis = NumberFormatUtil.formatLong(meters.toDouble() / 1000) + } + } + // 剩余时间 + val time = Math.ceil(timeInSecond.toDouble() / 60f).toInt() + + val beforeTime = Calendar.getInstance() + beforeTime.add(Calendar.MINUTE, time) + //到达时间 + val arriveTime = DateTimeUtil.formatCalendarToString(beforeTime, DateTimeUtil.TAXI_HH_mm) + FloatingDistanceInfoUtils.setDistance(meters,remainDis,disUnit,time,arriveTime) + }else{ + FloatingDistanceInfoUtils.setSpeed(speed) + } + } + + override fun postEvent(type: Int) { + when (type) { + EVENT_FINISH -> { + finish() + } + else -> {} + } + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + EventBus.getDefault().register(this) + setContentView(R.layout.taxi_p_arrived_mogo_consult) + initView() + configPage() + } + + override fun onNewIntent(intent: Intent?) { + super.onNewIntent(intent) + setIntent(intent) + configPage() + } + + private fun configPage() { + FullVideoUtils.dismissOverlayView(true) + releaseOnNewInstance() + when (intent.getIntExtra(VIDEOTYPE, VIDEOTYPE_CONSULT)) { + VIDEOTYPE_CONSULT -> { + videotype = VIDEOTYPE_CONSULT + acivTitleIcon.setImageResource(R.drawable.taxi_p_mogo_consult_title_icon) + tvTitle.text = "蘑菇资讯" + initConsultData() + } + VIDEOTYPE_MOIES -> { + videotype = VIDEOTYPE_MOIES + acivTitleIcon.setImageResource(R.drawable.taxi_p_mogo_movies_title_icon) + tvTitle.text = "影视娱乐" + initMoviesData() + } + } + initListener() + initData() + LeftMenuOpen.registerCallback(callBack) + } + + private fun initConsultData(){ + arrayListOf.clear() + arrayListOf.add( + TaxiPassengerVideoPlay( + "https://img.zhidaohulian.com/fileServer/online_car_hailing/1655708596763/全车型混剪增加红旗车队.m4v", + "https://img.zhidaohulian.com/fileServer/online_car_hailing/1655969511280/车队.png", + "蘑菇车联覆盖生活的方方面面" + ) + ) + arrayListOf.add( + TaxiPassengerVideoPlay( + "https://img.zhidaohulian.com/fileServer/online_car_hailing/1655708554279/红旗车队.m4v", + "https://img.zhidaohulian.com/fileServer/online_car_hailing/1655969553174/红旗重新排版.png", + "蘑菇车联之红旗车队" + ) + ) + arrayListOf.add( + TaxiPassengerVideoPlay( + "https://img.zhidaohulian.com/fileServer/online_car_hailing/1655708499497/大运会合作解说版.m4v", + "https://img.zhidaohulian.com/fileServer/online_car_hailing/1655969536177/大运会.png", + "蘑菇车联牵手成都大运会" + ) + ) + arrayListOf.add( + TaxiPassengerVideoPlay( + "https://img.zhidaohulian.com/fileServer/online_car_hailing/1655708409810/20210610重新排版3屏.m4v", + "https://img.zhidaohulian.com/fileServer/online_car_hailing/1655969579713/三屏.png", + "多视角体验蘑菇车联自动驾驶" + ) + ) + } + + private fun initMoviesData() { + arrayListOf.clear() + arrayListOf.add( + TaxiPassengerVideoPlay( + "https://img.zhidaohulian.com/fileServer/online_car_hailing/1656558672856/小宝宝.mp4", + "https://img.zhidaohulian.com/fileServer/online_car_hailing/1656559345882/1.png", + "小宝宝" + ) + ) + arrayListOf.add( + TaxiPassengerVideoPlay( + "https://img.zhidaohulian.com/fileServer/online_car_hailing/1656558697055/小猫.mp4", + "https://img.zhidaohulian.com/fileServer/online_car_hailing/1656559367261/2.png", + "小猫" + ) + ) + arrayListOf.add( + TaxiPassengerVideoPlay( + "https://img.zhidaohulian.com/fileServer/online_car_hailing/1656558730074/星空.mp4", + "https://img.zhidaohulian.com/fileServer/online_car_hailing/1656559406169/4.png", + "星空" + ) + ) + arrayListOf.add( + TaxiPassengerVideoPlay( + "https://img.zhidaohulian.com/fileServer/online_car_hailing/1656558644708/海浪.mp4", + "https://img.zhidaohulian.com/fileServer/online_car_hailing/1656559384635/3.png", + "星空" + ) + ) + } + + private fun initData() { + val carouselLayoutManager = CarouselLayoutManager(CarouselLayoutManager.HORIZONTAL, true) + carouselLayoutManager.setPostLayoutListener(CarouselZoomPostLayoutListener()) + carouselLayoutManager.maxVisibleItems = 1 + indicatorView.notifyDataChanged(arrayListOf.size) + indicatorView.setSlideMode(IndicatorSlideMode.SCALE) + indicatorView.setOrientation(IndicatorOrientation.INDICATOR_HORIZONTAL) + indicatorView.setIndicatorStyle(IndicatorStyle.ROUND_RECT) + indicatorView.setSliderColor( + Color.parseColor("#FFFFFF"), Color.parseColor("#26C5FD"), + Color.parseColor("#26C5FD") + ) + indicatorView.setSliderWidth(9f, 54f) + indicatorView.setSliderHeight(9f) + indicatorView.setSliderGap(36f) + rvVideoPlaylist?.addOnScrollListener(object : CenterScrollListener() { + var prePlayerPosition = 0 + override fun pageSelect(recyclerView: RecyclerView?, newState: Int) { + //播放视频 + val (centerItemPosition: Int, player) = getPlayer(carouselLayoutManager) + indicatorView.onPageSelected(centerItemPosition) + if (player is ConsultVideoPlayer) { + if (prePlayerPosition != centerItemPosition) { + if (player.currentState == GSYVideoView.CURRENT_STATE_PAUSE) { + player.onVideoReset() + } + val playerHolder = + carouselLayoutManager.findViewByPosition(prePlayerPosition) + val prePlayer = + playerHolder?.findViewById(R.id.video_item_player) + prePlayer?.onVideoReset() + val taxiPassengerVideoPlay = arrayListOf[centerItemPosition] + setBackageAndPlayNext(taxiPassengerVideoPlay) + } else { + player.onVideoResume(false) + } + } + prePlayerPosition = centerItemPosition + } + + override fun pageStop() { + val (_: Int, player) = getPlayer(carouselLayoutManager) + if (player is ConsultVideoPlayer) { + player.onVideoPause() + } + } + + }) + carouselLayoutManager.addOnDargAutoDiffListener { adapterPosition, currentPosition -> + val fl = adapterPosition - floor(adapterPosition) + var currentIndex = currentPosition + if (fl > 0.5) { + if (currentPosition == 0) { + currentIndex = rvVideoPlaylist?.adapter!!.itemCount - 1 + } else { + currentIndex -= 1 + } + } + indicatorView.onPageScrolled(currentIndex, fl, 0) + } + val recyclerVideoAdapter = RecyclerVideoAdapter(this, arrayListOf,rvVideoPlaylist) + recyclerVideoAdapter.setOnThumbImageClilckListener { + val (_: Int, player) = getPlayer(carouselLayoutManager) + if (player is ConsultVideoPlayer) { + player.onVideoReset() + player.thumbImageViewLayout.visibility = View.VISIBLE + } + rvVideoPlaylist?.smoothScrollToPosition(it) + } + rvVideoPlaylist?.layoutManager = carouselLayoutManager + rvVideoPlaylist?.setHasFixedSize(true) + rvVideoPlaylist?.adapter = recyclerVideoAdapter + } + + private fun getPlayer(carouselLayoutManager: CarouselLayoutManager): Pair { + val centerItemPosition: Int = carouselLayoutManager.centerItemPosition + val playerHolder = carouselLayoutManager.findViewByPosition(centerItemPosition) + val player = playerHolder?.findViewById(R.id.video_item_player) + return Pair(centerItemPosition, player) + } + + private fun initListener() { + } + + private fun initView() { + rvVideoPlaylist = findViewById(R.id.rv_video_playlist) + indicatorView = findViewById(R.id.indicatorView) + clContain = findViewById(R.id.cl_contain) + acivTitleIcon = findViewById(R.id.aciv_title_icon) + tvTitle = findViewById(R.id.tv_mogo_consult) + acivTitleIcon.setOnClickListener { + finish() + } + } + + + private fun setBackageAndPlayNext(taxiPassengerVideoPlay: TaxiPassengerVideoPlay) { + // 设置背景图片 + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + when (videotype){ + VIDEOTYPE_CONSULT -> { + OverlayLeftViewUtils.showOverlayView(this,isOpen = false, checkIndex = OverlayLeftViewUtils.CONSULT) + } + VIDEOTYPE_MOIES -> { + OverlayLeftViewUtils.showOverlayView(this,isOpen = false, checkIndex = OverlayLeftViewUtils.MOVIE) + } + } + val sumDis = intent.getIntExtra(TaxiPassengerConst.SP_KEY_ORDER_SUM_DIS, 0) + FloatingDistanceInfoUtils.showOverlayView(this,sumDis=sumDis) + } + + override fun onResume() { + super.onResume() + val carouselLayoutManager = rvVideoPlaylist?.layoutManager as CarouselLayoutManager + val (centerItemPosition: Int, player) = getPlayer(carouselLayoutManager) + if(centerItemPosition<0){ + setBackageAndPlayNext(arrayListOf[0]) + } + player?.let { + if (player.isIfCurrentIsFullscreen) {// 全屏了 + + } else { + when (player.currentState) { + GSYVideoView.CURRENT_STATE_PAUSE -> { + player.onVideoResume(false) + } + GSYVideoView.CURRENT_STATE_PLAYING -> { + } + else -> { + + } + } + } + + } + + } + + override fun onPause() { + super.onPause() + val carouselLayoutManager = rvVideoPlaylist?.layoutManager as CarouselLayoutManager + val (centerItemPosition: Int, player) = getPlayer(carouselLayoutManager) + player?.let { + if (player is ConsultVideoPlayer) { + // 离开应用 暂停视频 + // 关闭 onDetachedFromWindow 会reset + if (player.isIfCurrentIsFullscreen) {// 全屏了 + } else { + player.onVideoPause() + } + } + } + } + + @Subscribe(threadMode = ThreadMode.MAIN) + fun finishActivity(event: FinishActivity){ + val intent = Intent() + val parse = Uri.parse("mogo://launcher/main/switch2?type=launch") + intent.data = parse + intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP + startActivity(intent) + finish() + } + + override fun onDestroy() { + super.onDestroy() + EventBus.getDefault().unregister(this) + LeftMenuOpen.unregisterCallback(callBack) + releaseOnNewInstance() + OverlayLeftViewUtils.dismissOverlayView(false) + FloatingDistanceInfoUtils.dismissOverlayView() + FixMemoryLeak.fixLeak(this) + } + + private fun releaseOnNewInstance() { + if (rvVideoPlaylist!=null&&rvVideoPlaylist?.layoutManager != null) { + val carouselLayoutManager = rvVideoPlaylist?.layoutManager as CarouselLayoutManager + val (_: Int, player) = getPlayer(carouselLayoutManager) + player?.let { + player.currentPlayer.release() + player.onVideoReset() + } + } + FullVideoUtils.dismissOverlayView(true) + } + + override fun onBackPressed() {} + +} \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/layoutmanage/CarouselZoomPostLayoutListener.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/layoutmanage/CarouselZoomPostLayoutListener.java index c07919ed5e..1cc637c37e 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/layoutmanage/CarouselZoomPostLayoutListener.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/layoutmanage/CarouselZoomPostLayoutListener.java @@ -33,10 +33,10 @@ public class CarouselZoomPostLayoutListener extends CarouselLayoutManager.PostLa translateY = Math.signum(itemPositionToCenterDiff) * translateYGeneral; translateX = 0; } else { - final float translateXGeneral = (child.getMeasuredWidth()*0.9f) * (1 - scale) / 2f; + final float translateXGeneral = child.getMeasuredWidth() * (1 - scale)/8; translateX = Math.signum(itemPositionToCenterDiff) * translateXGeneral; translateY = 0; } - return new ItemTransformation(scale,scale, scale, translateX, translateY); + return new ItemTransformation(scale,scale, scale, 0, translateY); } } \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/FixMemoryLeak.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/FixMemoryLeak.java new file mode 100644 index 0000000000..f6e57ae403 --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/FixMemoryLeak.java @@ -0,0 +1,42 @@ +package com.mogo.och.taxi.passenger.utils; + +import android.content.Context; +import android.view.inputmethod.InputMethodManager; + +import java.lang.reflect.Field; + +/** + * memory leak fix: + *

+ * InputMethodManager#mLastSrvView reference Last Page Activity. + */ +public class FixMemoryLeak { + + private static Field field; + private static boolean hasField = true; + + public static void fixLeak(Context context) { + if (!hasField) { + return; + } + InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); + if (imm == null) { + return; + } + + try { + if (field == null) { + field = imm.getClass().getDeclaredField("mCurRootView"); + } + if (field == null) { + hasField = false; + } + if (field != null) { + field.setAccessible(true); + field.set(imm, null); + } + } catch (Throwable t) { + hasField = false; + } + } +} \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/PermissionUtil.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/PermissionUtil.java index f813fe3f7f..7c6c8c22ae 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/PermissionUtil.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/PermissionUtil.java @@ -1,5 +1,6 @@ package com.mogo.och.taxi.passenger.utils; +import android.app.ActivityManager; import android.app.AppOpsManager; import android.content.Context; import android.content.pm.PackageManager; @@ -8,6 +9,9 @@ import android.os.Build; import androidx.core.content.ContextCompat; +import com.mogo.eagle.core.network.utils.Util; +import com.mogo.eagle.core.utilcode.util.Utils; + /** * @author: wangmingjun * @date: 2021/12/7 @@ -34,4 +38,25 @@ public class PermissionUtil { } return false; } + + private static String processName = ""; + public static String getCurProcessName() { + if(!processName.isEmpty()){ + return processName; + } + // 获取此进程的标识符 + int pid = android.os.Process.myPid(); + // 获取活动管理器 + ActivityManager activityManager = (ActivityManager) + Utils.getApp().getSystemService(Context.ACTIVITY_SERVICE); + // 从应用程序进程列表找到当前进程,是:返回当前进程名 + for (ActivityManager.RunningAppProcessInfo appProcess : + activityManager.getRunningAppProcesses()) { + if (appProcess.pid == pid) { + + return appProcess.processName; + } + } + return null; + } } diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/ZoomDrawable.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/ZoomDrawable.kt new file mode 100644 index 0000000000..12776a6d7f --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/ZoomDrawable.kt @@ -0,0 +1,21 @@ +package com.mogo.och.taxi.passenger.utils + +import android.content.Context +import android.graphics.* +import android.graphics.drawable.BitmapDrawable +import android.graphics.drawable.Drawable +import androidx.annotation.DrawableRes + +object ZoomDrawable { + fun zoomDrawableImage(context: Context,@DrawableRes id:Int,scaleX:Float,scaleY:Float):Drawable{ + + val bitmap: Bitmap = BitmapFactory.decodeResource(context.resources, id) + val bitmapWidth = bitmap.width + val bitmapHeight = bitmap.height + val matrix = Matrix() + matrix.postScale(scaleX, scaleY) + // 产生缩放后的Bitmap对象 + val resizeBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmapWidth, bitmapHeight, matrix, true) + return BitmapDrawable(context.resources,resizeBitmap) + } +} \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/blur/GlideBlurTransform.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/blur/GlideBlurTransform.java index 8338546d19..de5dd4d9e8 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/blur/GlideBlurTransform.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/blur/GlideBlurTransform.java @@ -4,38 +4,45 @@ import android.content.Context; import android.graphics.Bitmap; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool; import com.bumptech.glide.load.resource.bitmap.BitmapTransformation; +import java.nio.charset.StandardCharsets; import java.security.MessageDigest; public class GlideBlurTransform extends BitmapTransformation { private String key; - private Context context; private int blurRadius; - public GlideBlurTransform(Context context, String key, int blurRadius ) { - this.context = context; + public GlideBlurTransform(String key, int blurRadius) { this.key = key; this.blurRadius = blurRadius; } @Override protected Bitmap transform( @NonNull BitmapPool pool, @NonNull Bitmap toTransform, int outWidth, int outHeight ) { - Bitmap lruBitmap = DiskLruCacheManager.getInstance(context).get(key); - if(lruBitmap!=null){ - return lruBitmap; - } Bitmap bitmap = FastBlurUtil.doBlur( toTransform, 1, blurRadius ); - // 缓存高斯模糊图片 - DiskLruCacheManager.getInstance( context ).put( key, bitmap ); return bitmap; } @Override - public void updateDiskCacheKey( MessageDigest messageDigest ) { + public boolean equals(@Nullable Object obj) { + if (obj instanceof GlideBlurTransform) { + return ((GlideBlurTransform) obj).key.equals(key); + } + return false; + } + @Override + public int hashCode() { + return key.hashCode(); + } + + @Override + public void updateDiskCacheKey( MessageDigest messageDigest ) { + messageDigest.update(key.getBytes(StandardCharsets.UTF_8)); } } \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/windowdispatch/OnComputeInternalInsetsListener.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/windowdispatch/OnComputeInternalInsetsListener.java new file mode 100644 index 0000000000..6fd67ae232 --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/windowdispatch/OnComputeInternalInsetsListener.java @@ -0,0 +1,55 @@ +package com.mogo.och.taxi.passenger.utils.windowdispatch; + +import android.graphics.Region; +import android.inputmethodservice.InputMethodService; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; + +public class OnComputeInternalInsetsListener implements InvocationHandler { + + private Region touchRegion = null; + public Object getListener() { + Object target = null; + try { + Class class1 = Class.forName("android.view.ViewTreeObserver$OnComputeInternalInsetsListener"); + target = Proxy.newProxyInstance(OnComputeInternalInsetsListener.class.getClassLoader(), + new Class[]{class1}, this); + } catch (Exception e) { + e.printStackTrace(); + } + return target; + } + + public Region getTouchRegion() { + return touchRegion; + } + + public void setTouchRegion(Region touchRegion) { + this.touchRegion = touchRegion; + } + + @Override + public Object invoke(Object proxy, Method method, Object[] args) { + try { + Field regionField = args[0].getClass() + .getDeclaredField("touchableRegion"); + regionField.setAccessible(true); + Field insetField = args[0].getClass() + .getDeclaredField("mTouchableInsets"); + insetField.setAccessible(true); + if (touchRegion != null) { + Region region = (Region) regionField.get(args[0]); + region.set(touchRegion); + insetField.set(args[0], InputMethodService.Insets.TOUCHABLE_INSETS_REGION); + } else { + insetField.set(args[0], InputMethodService.Insets.TOUCHABLE_INSETS_FRAME); + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } +} diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/windowdispatch/ReflectionUtils.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/windowdispatch/ReflectionUtils.java new file mode 100644 index 0000000000..1ade41a62d --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/windowdispatch/ReflectionUtils.java @@ -0,0 +1,51 @@ +package com.mogo.och.taxi.passenger.utils.windowdispatch; + +import android.view.ViewTreeObserver; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.ArrayList; + +public class ReflectionUtils { + + private ReflectionUtils() { + + } + + public static void removeOnComputeInternalInsetsListener(ViewTreeObserver viewTree) { + if (viewTree == null) { + return; + } + try { + Class clazz = Class.forName("android.view.ViewTreeObserver"); + Field field = viewTree.getClass().getDeclaredField("mOnComputeInternalInsetsListeners"); + field.setAccessible(true); + Object listenerList = field.get(viewTree); + Method method = listenerList.getClass().getDeclaredMethod("getArray"); + method.setAccessible(true); + ArrayList list = (ArrayList) method.invoke(listenerList); + Class classes[] = {Class.forName("android.view.ViewTreeObserver$OnComputeInternalInsetsListener")}; + if (list != null && list.size() > 0) { + clazz.getDeclaredMethod("removeOnComputeInternalInsetsListener", classes).invoke(viewTree, + list.get(0)); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static void addOnComputeInternalInsetsListener(ViewTreeObserver viewTree, Object object) { + if (viewTree == null) { + return; + } + try { + Class classes[] = {Class.forName("android.view.ViewTreeObserver$OnComputeInternalInsetsListener")}; + Class clazz = Class.forName("android.view.ViewTreeObserver"); + clazz.getDeclaredMethod("addOnComputeInternalInsetsListener", classes).invoke(viewTree, + object); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/widget/ConsultVideoPlayer.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/widget/ConsultVideoPlayer.kt index 797e69c1a1..4b46f036bf 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/widget/ConsultVideoPlayer.kt +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/widget/ConsultVideoPlayer.kt @@ -3,6 +3,7 @@ package com.mogo.och.taxi.passenger.widget import android.app.Activity import android.content.Context import android.graphics.Color +import android.graphics.drawable.GradientDrawable import android.os.Build import android.util.AttributeSet import android.util.TypedValue @@ -15,13 +16,14 @@ import android.widget.ImageView import android.widget.TextView import androidx.appcompat.widget.AppCompatImageView import androidx.constraintlayout.widget.ConstraintLayout -import androidx.core.view.marginTop +import androidx.core.app.ActivityCompat import com.mogo.eagle.core.utilcode.util.TimeTransformUtils import com.mogo.eagle.core.utilcode.util.ToastUtils import com.mogo.eagle.core.widget.media.video.TextureVideoViewOutlineProvider import com.mogo.och.taxi.passenger.R import com.mogo.och.taxi.passenger.ui.leftmenu.OverlayLeftViewUtils import com.mogo.och.taxi.passenger.ui.video.FullVideoUtils +import com.mogo.och.taxi.passenger.utils.ZoomDrawable import com.shuyu.gsyvideoplayer.listener.VideoAllCallBack import com.shuyu.gsyvideoplayer.utils.GSYVideoType import com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer @@ -44,7 +46,7 @@ class ConsultVideoPlayer : StandardGSYVideoPlayer { private lateinit var totalTimeTextView: TextView private lateinit var aivStartPlay: AppCompatImageView private lateinit var layoutBottom: ConstraintLayout - lateinit var vPpenLeft: View + private lateinit var vPpenLeft: View private var fullVideoPlayer:ConsultVideoPlayer?=null var smalllPlayer:ConsultVideoPlayer?=null @@ -64,6 +66,7 @@ class ConsultVideoPlayer : StandardGSYVideoPlayer { totalTimeTextView = findViewById(R.id.total) aivStartPlay = findViewById(R.id.aiv_start_play) layoutBottom = findViewById(R.id.layout_bottom) + vPpenLeft = findViewById(R.id.v_open_left) fullscreenButton.setOnClickListener(this) aivStartPlay.setOnClickListener(this) if (mThumbImageViewLayout != null @@ -74,12 +77,44 @@ class ConsultVideoPlayer : StandardGSYVideoPlayer { GSYVideoType.setShowType(GSYVideoType.SCREEN_TYPE_FULL) aivStartPlay.scaleX = 0.8f aivStartPlay.scaleY = 0.8f - vPpenLeft = findViewById(R.id.v_open_left) - vPpenLeft.setOnClickListener { - OverlayLeftViewUtils.open() + mProgressBar.thumb = ZoomDrawable.zoomDrawableImage(context,R.drawable.bg_taxi_p_video_index,0.66f,0.66f) + } + + private fun addDrageAnchor(){ + vPpenLeft.visibility = VISIBLE + OverlayLeftViewUtils.addDragTarget(vPpenLeft) + layoutBottom.post { + val layoutParams = layoutBottom.layoutParams as ConstraintLayout.LayoutParams + layoutParams.setMargins(333,0,333,90) + layoutParams.height = 148 + layoutBottom.layoutParams = layoutParams } - OverlayLeftViewUtils.dragTarget(vPpenLeft) + + mTopContainer.post { + val layoutParams = mTopContainer.layoutParams as ConstraintLayout.LayoutParams + layoutParams.height = 320 + mTopContainer.layoutParams = layoutParams + val background = layoutBottom.background as GradientDrawable + val x = arrayOf(12f, 12f,12f, 12f,12f, 12f,12f, 12f) + background.cornerRadii = x.toFloatArray() + layoutBottom.background = background + + fullscreenButton.setPadding(92,0,92,0) + titleTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, 50f) + val layoutParams1 = titleTextView.layoutParams as ConstraintLayout.LayoutParams + layoutParams1.marginStart = 80 + titleTextView.layoutParams = layoutParams1 + aivStartPlay.scaleX = 1f + aivStartPlay.scaleY = 1f + val drawable = ActivityCompat.getDrawable(context, R.drawable.bg_taxi_p_video_index) + mProgressBar.thumb = drawable + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + mProgressBar.maxHeight = 6 + mProgressBar.minHeight = 6 + } + } + } override fun getLayoutId(): Int { @@ -181,6 +216,7 @@ class ConsultVideoPlayer : StandardGSYVideoPlayer { when (v?.id) { R.id.fullscreen -> { startWindowFullscreenOwn(context) +// startWindowFullscreen(context) } R.id.aiv_start_play -> { if(currentState==GSYVideoView.CURRENT_STATE_PAUSE){ @@ -235,21 +271,6 @@ class ConsultVideoPlayer : StandardGSYVideoPlayer { } } - fun fullMarainTop(){ - if(mIfCurrentIsFullscreen&&smalllPlayer!=null) { - if(mTopContainer.marginTop==0) { - val layoutParams = mTopContainer.layoutParams as ConstraintLayout.LayoutParams - layoutParams.height = 336 - mTopContainer.layoutParams = layoutParams - fullscreenButton.setPadding(80,0,80,0) - titleTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, 50f) - titleTextView.setPadding(30,0,0,0) - aivStartPlay.scaleX = 1f - aivStartPlay.scaleY = 1f - } - } - } - override fun setViewShowState(view: View?, visibility: Int) { if (view === mThumbImageViewLayout && visibility != View.VISIBLE) { return @@ -259,7 +280,6 @@ class ConsultVideoPlayer : StandardGSYVideoPlayer { override fun onSurfaceAvailable(surface: Surface) { super.onSurfaceAvailable(surface) - fullMarainTop() if (GSYVideoType.getRenderType() != GSYVideoType.TEXTURE) { if (mThumbImageViewLayout != null && mThumbImageViewLayout.visibility == View.VISIBLE) { mThumbImageViewLayout.visibility = View.INVISIBLE @@ -354,6 +374,7 @@ class ConsultVideoPlayer : StandardGSYVideoPlayer { gsyVideoPlayer.id = fullId gsyVideoPlayer.isIfCurrentIsFullscreen = true gsyVideoPlayer.setVideoAllCallBack(mVideoAllCallBack) + gsyVideoPlayer.addDrageAnchor() cloneParams(this, gsyVideoPlayer) val frameLayout = FrameLayout(context) if (gsyVideoPlayer.fullscreenButton != null) { diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/animator/alpha_hide_hide_f.xml b/OCH/mogo-och-taxi-passenger/src/main/res/animator/alpha_hide_hide_f.xml new file mode 100644 index 0000000000..599149e9a7 --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/res/animator/alpha_hide_hide_f.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/animator/alpha_hide_show_f.xml b/OCH/mogo-och-taxi-passenger/src/main/res/animator/alpha_hide_show_f.xml new file mode 100644 index 0000000000..8c6acc7439 --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/res/animator/alpha_hide_show_f.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/bg_taxi_p_arrived_info_floating.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/bg_taxi_p_arrived_info_floating.png new file mode 100644 index 0000000000..ebe94ecd52 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/bg_taxi_p_arrived_info_floating.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/bg_taxi_p_video_index.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/bg_taxi_p_video_index.png new file mode 100644 index 0000000000..61f22d3bf0 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/bg_taxi_p_video_index.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_change_full.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_change_full.png index 0762a845e9..a70be0cdd8 100644 Binary files a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_change_full.png and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_change_full.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_change_normal.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_change_normal.png index 24fee28781..b3ceb81fb6 100644 Binary files a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_change_normal.png and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_change_normal.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_left_flow_bg.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_left_flow_bg.png index 064763057f..232b525cc9 100755 Binary files a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_left_flow_bg.png and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_left_flow_bg.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_map_arrow_arrived.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_map_arrow_arrived.png new file mode 100644 index 0000000000..746212d8a3 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_map_arrow_arrived.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_map_arrow.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_map_arrow_un_arrive.png similarity index 100% rename from OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_map_arrow.png rename to OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_map_arrow_un_arrive.png diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_mogo_consult_title_icon.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_mogo_consult_title_icon.png index b188a5c0d6..1efa8c1b03 100644 Binary files a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_mogo_consult_title_icon.png and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_mogo_consult_title_icon.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_video_bg.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_video_bg.png new file mode 100755 index 0000000000..dbfb370906 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_video_bg.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_video_bg_bottom.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_video_bg_bottom.png new file mode 100644 index 0000000000..4192d9cbd7 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_video_bg_bottom.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_video_bg_top.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_video_bg_top.png new file mode 100644 index 0000000000..f9b70e6888 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_video_bg_top.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/bg_taxi_p_arrived_info_floating.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/bg_taxi_p_arrived_info_floating.png new file mode 100644 index 0000000000..ebe94ecd52 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/bg_taxi_p_arrived_info_floating.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/bg_taxi_p_video_index.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/bg_taxi_p_video_index.png new file mode 100644 index 0000000000..61f22d3bf0 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/bg_taxi_p_video_index.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_change_full.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_change_full.png index 0762a845e9..a70be0cdd8 100644 Binary files a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_change_full.png and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_change_full.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_change_normal.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_change_normal.png index 24fee28781..b3ceb81fb6 100644 Binary files a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_change_normal.png and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_change_normal.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_left_flow_bg.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_left_flow_bg.png index 064763057f..232b525cc9 100755 Binary files a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_left_flow_bg.png and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_left_flow_bg.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_map_arrow_arrived.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_map_arrow_arrived.png new file mode 100644 index 0000000000..746212d8a3 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_map_arrow_arrived.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_map_arrow.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_map_arrow_un_arrive.png similarity index 100% rename from OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_map_arrow.png rename to OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_map_arrow_un_arrive.png diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_mogo_consult_title_icon.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_mogo_consult_title_icon.png index b188a5c0d6..1efa8c1b03 100644 Binary files a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_mogo_consult_title_icon.png and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_mogo_consult_title_icon.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_video_bg.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_video_bg.png new file mode 100755 index 0000000000..dbfb370906 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_video_bg.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_video_bg_bottom.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_video_bg_bottom.png new file mode 100644 index 0000000000..4192d9cbd7 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_video_bg_bottom.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_video_bg_top.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_video_bg_top.png new file mode 100644 index 0000000000..f9b70e6888 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_video_bg_top.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/bg_taxi_p_video_bg.xml b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/bg_taxi_p_video_bg.xml index 4bed9867fd..e97ad25151 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/bg_taxi_p_video_bg.xml +++ b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/bg_taxi_p_video_bg.xml @@ -1,5 +1,6 @@ - + + \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/bg_taxi_p_video_bg_shape.xml b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/bg_taxi_p_video_bg_shape.xml new file mode 100644 index 0000000000..d4125c5071 --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/bg_taxi_p_video_bg_shape.xml @@ -0,0 +1,10 @@ + + + + + diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/bg_taxi_p_video_bg_top.xml b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/bg_taxi_p_video_bg_top.xml index 225e6361dd..843c2658d2 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/bg_taxi_p_video_bg_top.xml +++ b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/bg_taxi_p_video_bg_top.xml @@ -1,5 +1,5 @@ - + \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/bg_taxi_p_video_index.xml b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/bg_taxi_p_video_index.xml deleted file mode 100644 index 98435cd0f6..0000000000 --- a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/bg_taxi_p_video_index.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/taxi_video_order_process.xml b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/taxi_video_order_process.xml new file mode 100644 index 0000000000..b3c6d5d088 --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/taxi_video_order_process.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/taxi_video_seekbar_style.xml b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/taxi_video_seekbar_style.xml index 8aba3ae55c..597931f974 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/taxi_video_seekbar_style.xml +++ b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/taxi_video_seekbar_style.xml @@ -19,7 +19,7 @@ - + diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/layout/list_video_item_normal.xml b/OCH/mogo-och-taxi-passenger/src/main/res/layout/list_video_item_normal.xml index 111239bbfe..c69b23bfc8 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/res/layout/list_video_item_normal.xml +++ b/OCH/mogo-och-taxi-passenger/src/main/res/layout/list_video_item_normal.xml @@ -1,14 +1,25 @@ + android:background="@drawable/bg_taxi_p_video_bg_shape" + android:layout_width="1620px" + android:layout_height="940px"> + + + + + android:layout_gravity="center" + android:layout_width="1560px" + android:layout_height="876px" /> diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_arrived_mogo_consult.xml b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_arrived_mogo_consult.xml index 6d7db62b32..2e59db6a7f 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_arrived_mogo_consult.xml +++ b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_arrived_mogo_consult.xml @@ -5,21 +5,16 @@ android:id="@+id/cl_contain" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@color/cardview_dark_background" + android:background="@drawable/taxi_p_video_bg" tools:ignore="MissingDefaultResource"> - - @@ -29,8 +24,8 @@ app:layout_constraintBottom_toBottomOf="@+id/aciv_title_icon" app:layout_constraintStart_toEndOf="@+id/aciv_title_icon" android:text="蘑菇资讯" - android:textStyle="bold" - android:textSize="60px" + android:textSize="48px" + android:layout_marginStart="34px" android:includeFontPadding="false" android:textColor="@color/taxi_order_status_textColor" android:layout_width="wrap_content" @@ -39,9 +34,10 @@ @@ -52,8 +48,8 @@ android:layout_height="wrap_content" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintBottom_toBottomOf="parent" - android:layout_marginBottom="172px" + app:layout_constraintTop_toBottomOf="@+id/rv_video_playlist" + android:layout_marginTop="67px" app:vpi_orientation="horizontal" app:vpi_slide_mode="scale" app:vpi_slider_checked_color="@color/taxi_p_traffic_light_red_color_up" @@ -61,14 +57,6 @@ app:vpi_slider_radius="@dimen/dp_20" app:vpi_style="round_rect" /> - - \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_base_fragment.xml b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_base_fragment.xml index 7603c18a21..0cfb6db266 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_base_fragment.xml +++ b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_base_fragment.xml @@ -28,15 +28,6 @@ app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toTopOf="parent" /> - - @@ -55,21 +55,26 @@ android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" - app:layout_constraintTop_toTopOf="@+id/fullscreen" - app:layout_constraintBottom_toBottomOf="@+id/fullscreen" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" - android:layout_marginStart="50px" + android:layout_marginStart="40px" android:textColor="@android:color/white" - android:textSize="46px" /> + android:textSize="38px" /> @@ -129,6 +135,7 @@ app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" + android:visibility="gone" android:layout_width="143px" android:layout_height="308px"/> diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_window_float_distance_info.xml b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_window_float_distance_info.xml new file mode 100644 index 0000000000..30067d11e4 --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_window_float_distance_info.xml @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/values/colors.xml b/OCH/mogo-och-taxi-passenger/src/main/res/values/colors.xml index 0627d9585c..f69881eed0 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/res/values/colors.xml +++ b/OCH/mogo-och-taxi-passenger/src/main/res/values/colors.xml @@ -53,5 +53,7 @@ #4DFFFFFF #FFFFFF - + #8FB3EF + #E1F3FE + #FFFFFF \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/values/ids.xml b/OCH/mogo-och-taxi-passenger/src/main/res/values/ids.xml new file mode 100644 index 0000000000..b8fc90429e --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/res/values/ids.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/values/styles.xml b/OCH/mogo-och-taxi-passenger/src/main/res/values/styles.xml index 732e7c8a20..e50749e0fd 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/res/values/styles.xml +++ b/OCH/mogo-och-taxi-passenger/src/main/res/values/styles.xml @@ -40,4 +40,22 @@ @anim/alpha_hide_show + + \ No newline at end of file diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/OrderQueryRespBean.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/OrderQueryRespBean.java index 0c164b143a..3a0a60ccd0 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/OrderQueryRespBean.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/OrderQueryRespBean.java @@ -58,6 +58,11 @@ public class OrderQueryRespBean extends BaseData { public String txtFileMd5 = ""; //轨迹文件md5,默认“” public long contrailSaveTime; //上传轨迹完成时间戳ms:用于MEC本地手动导入轨迹验证时不会被云端轨迹覆盖 public String carModel = ""; //[optional] 车型号(如红旗H9),默认“”,暂不加入校验逻辑、用于人工排查问题 + public String csvFileUrlDPQP = ""; //轨迹文件下载的cos url,默认“” + public String csvFileMd5DPQP = ""; //轨迹文件md5,默认“” + public String txtFileUrlDPQP = ""; //打点文件下载的cos url,默认“” + public String txtFileMd5DPQP = ""; //轨迹文件md5,默认“” + public long contrailSaveTimeDPQP; //上传轨迹完成时间戳ms:用于MEC本地手动导入轨迹验证时不会被云端轨迹覆盖 // !!!接口中暂无此字段,仅用于本地实现逻辑使用:起始站目的站距离km public double travelDistance; diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/ITaxiADASStatusCallback.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/ITaxiADASStatusCallback.java index 278b1ac9dc..7d89fd4718 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/ITaxiADASStatusCallback.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/ITaxiADASStatusCallback.java @@ -17,4 +17,7 @@ public interface ITaxiADASStatusCallback { // 自动驾驶运行中 void onAutopilotRunning(); + + //人机共驾 + void onManMachineCoDriving(); } diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiModel.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiModel.java index 8b03f98c22..c9aff5714a 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiModel.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiModel.java @@ -909,7 +909,10 @@ public class TaxiModel { mCurrentOCHOrder.lineId, mCurrentOCHOrder.csvFileUrl, mCurrentOCHOrder.csvFileMd5, mCurrentOCHOrder.txtFileUrl, mCurrentOCHOrder.txtFileMd5, - mCurrentOCHOrder.contrailSaveTime, mCurrentOCHOrder.carModel); + mCurrentOCHOrder.contrailSaveTime, mCurrentOCHOrder.carModel, + mCurrentOCHOrder.csvFileUrlDPQP, mCurrentOCHOrder.csvFileMd5DPQP, + mCurrentOCHOrder.txtFileUrlDPQP, mCurrentOCHOrder.txtFileMd5DPQP, + mCurrentOCHOrder.contrailSaveTimeDPQP); } CallerAutoPilotManager.INSTANCE.startAutoPilot(parameters); CallerLogger.INSTANCE.d(M_TAXI + TAG, "start autopilot with parameter: %s", GsonUtil.jsonFromObject(parameters) @@ -1118,7 +1121,9 @@ public class TaxiModel { int state = autopilotStatusInfo.getState(); CallerLogger.INSTANCE.d(M_TAXI + TAG, "state = %s", state); if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) { - if (mADASStatusCallback != null) mADASStatusCallback.onAutopilotRunning(); + if (state != mPrevAPStatus && mADASStatusCallback != null){ + mADASStatusCallback.onAutopilotRunning(); + } if (mCurrentOCHOrder != null && TaxiOrderStatusEnum.OnTheWayToEnd.getCode() == mCurrentOCHOrder.orderStatus){ if (state != mPrevAPStatus) { @@ -1137,6 +1142,9 @@ public class TaxiModel { } } } else if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE) { + if (state != mPrevAPStatus && mADASStatusCallback != null){ + mADASStatusCallback.onAutopilotEnable(); + } mPrevAPStatus = state; if (FunctionBuildConfig.isDemoMode && checkCurrentOCHOrder() @@ -1144,8 +1152,11 @@ public class TaxiModel { // 当美化模式(演示模式)开启时:且有订单、且为去往目的地状态,维持自动驾驶icon开启状态 return; } - if (mADASStatusCallback != null) mADASStatusCallback.onAutopilotEnable(); } else if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE) { + if (state != mPrevAPStatus && mADASStatusCallback != null){ + mADASStatusCallback.onAutopilotDisable(); + } + mPrevAPStatus = state; if (FunctionBuildConfig.isDemoMode && checkCurrentOCHOrder() @@ -1153,7 +1164,12 @@ public class TaxiModel { // 当美化模式(演示模式)开启时:且有订单、且为去往目的地状态,维持自动驾驶icon开启状态 return; } - if (mADASStatusCallback != null) mADASStatusCallback.onAutopilotDisable(); + + }else if (state == IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING){ + if (state != mPrevAPStatus && mADASStatusCallback != null){ + mADASStatusCallback.onManMachineCoDriving(); + } + mPrevAPStatus = state; } } diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiModelLoopManager.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiModelLoopManager.java index 32b07a27bc..16d7ff5cb4 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiModelLoopManager.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiModelLoopManager.java @@ -9,8 +9,12 @@ import com.mogo.och.taxi.constant.TaxiConst; import java.util.concurrent.TimeUnit; import io.reactivex.Observable; +import io.reactivex.ObservableEmitter; +import io.reactivex.ObservableOnSubscribe; import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.CompositeDisposable; import io.reactivex.disposables.Disposable; +import io.reactivex.functions.Consumer; import io.reactivex.schedulers.Schedulers; /** @@ -34,7 +38,7 @@ public class TaxiModelLoopManager { private Disposable mNewBookingOrderDisposable; //新到待抢预约单轮询 private Disposable mGrabResultDisposable; //抢单结果轮询 private Disposable mHeartbeatDisposable; //心跳轮询 - private Disposable mCalculateRouteDisposable; //每隔2s计算一次剩余里程和时间 + private CompositeDisposable mCalculateRouteDisposable = new CompositeDisposable(); //每隔2s计算一次剩余里程和时间 public void startInAndWaitOrdersLoop() { if (mInAndWaitServiceDisposable != null && !mInAndWaitServiceDisposable.isDisposed()) { @@ -121,23 +125,48 @@ public class TaxiModelLoopManager { } public void startCalculateRouteInfoLoop() { - if (mCalculateRouteDisposable != null && !mCalculateRouteDisposable.isDisposed()) { - return; - } + CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "startCalculateRouteInfoLoop()"); - mCalculateRouteDisposable = Observable.interval(TaxiConst.LOOP_DELAY, - TaxiConst.LOOP_CALCULATEROUTE_2S, TimeUnit.MILLISECONDS) - .map((aLong -> aLong + 1)) + + Disposable disposable = loopDynamicCalculateRouteInfo() + .doOnSubscribe(new Consumer() { + @Override + public void accept(Disposable disposable) throws Exception { + + } + }).doOnError(new Consumer() { + @Override + public void accept(Throwable throwable) throws Exception { + } + }) + .delay(TaxiConst.LOOP_CALCULATEROUTE_2S, TimeUnit.MILLISECONDS, true) // 设置delayError为true,表示出现错误的时候也需要延迟5s进行通知,达到无论是请求正常还是请求失败,都是5s后重新订阅,即重新请求。 .subscribeOn(Schedulers.io()) + .repeat() // repeat保证请求成功后能够重新订阅。 + .retry() // retry保证请求失败后能重新订阅 .observeOn(AndroidSchedulers.mainThread()) - .subscribe(aLong -> TaxiModel.getInstance().dynamicCalculateRouteInfo()); + .subscribe(new Consumer() { + @Override + public void accept(Integer integer) throws Exception { + } + }); + mCalculateRouteDisposable.add(disposable); + } + + private Observable loopDynamicCalculateRouteInfo(){ + return Observable.create(new ObservableOnSubscribe() { + @Override + public void subscribe(ObservableEmitter emitter) throws Exception { + if (emitter.isDisposed()) return; + TaxiModel.getInstance().dynamicCalculateRouteInfo(); + emitter.onComplete(); + } + }); } public void stopCalculateRouteInfLoop() { if (mCalculateRouteDisposable != null) { CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "stopCalculateRouteInfLoop()"); mCalculateRouteDisposable.dispose(); - mCalculateRouteDisposable = null; } } } diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/TaxiPresenter.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/TaxiPresenter.java index 3f2cdbd2ca..add02f86c8 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/TaxiPresenter.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/TaxiPresenter.java @@ -15,6 +15,7 @@ import com.mogo.commons.mvp.Presenter; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; +import com.mogo.och.taxi.constant.TaxiConst; import com.mogo.och.taxi.constant.TaxiOrderStatusEnum; import com.mogo.och.taxi.bean.OrderQueryRespBean; import com.mogo.och.taxi.bean.OrderQueryRouteInfoRespBean; @@ -180,6 +181,12 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING)); } + + @Override + public void onManMachineCoDriving() { + runOnUIThread(() -> mView.onManMachineCoDriving(IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING)); + } + @Override public void onCarStatusChanged(boolean inOperation, String role) { runOnUIThread(() -> mView.updateOperationStatus(inOperation,role)); diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/BaseTaxiTabFragment.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/BaseTaxiTabFragment.java index b27834d575..20fa78670a 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/BaseTaxiTabFragment.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/BaseTaxiTabFragment.java @@ -3,7 +3,6 @@ package com.mogo.och.taxi.ui; import static com.mogo.och.taxi.constant.TaxiConst.TIMER_START_AUTOPILOT_INTERVAL; import android.animation.ObjectAnimator; -import android.graphics.drawable.AnimationDrawable; import android.os.Handler; import android.os.Looper; import android.view.LayoutInflater; @@ -42,9 +41,12 @@ import com.mogo.map.listener.IMogoMapListener; import com.mogo.map.uicontroller.VisualAngleMode; import com.mogo.module.common.constants.DataTypes; import com.mogo.module.common.view.OnPreventFastClickListener; +import com.mogo.och.common.module.utils.AnimatorDrawableUtil; import com.mogo.och.taxi.R; import com.mogo.och.taxi.constant.TaxiConst; +import java.util.Arrays; + import mogo.telematics.pad.MessagePad; import record_cache.RecordPanelOuterClass; @@ -59,7 +61,8 @@ import record_cache.RecordPanelOuterClass; public abstract class BaseTaxiTabFragment> extends MvpFragment implements IMogoMapListener, IMoGoAutopilotRecordListener { private static final String TAG = "BaseOchFragment"; - private LinearLayout ctvAutopilotStatus; + private RelativeLayout ctvAutopilotStatusRL; + private ImageView mAnimFlowIv; protected TextView tvOperationStatus; protected TextView mDriverRole; public boolean isOperationStatus;//false-收车,true-出车 @@ -76,12 +79,67 @@ public abstract class BaseTaxiTabFragment + onAutopilotStatusChanged(IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING)); + tvOperationStatus.setOnClickListener(view -> { onChangeOperationStatus(); }); @@ -290,7 +355,7 @@ public abstract class BaseTaxiTabFragment1 @@ -304,8 +369,15 @@ public abstract class BaseTaxiTabFragment station,int resourceId){ if (isAdd){ - CallerLogger.INSTANCE.d(M_TAXI + "setMapMaker= ",uuid+"=latitude=" - +station.get(1)+",longitude="+station.get(0)); - - MogoMarkerOptions options = new MogoMarkerOptions() - .owner(TaxiConst.TYPE_MARKER_TAXI_ORDER) - .anchor(0.5f, 0.5f) - .set3DMode(true) - .gps(true) - .controlAngle(true) - .icon3DRes(resourceId) - .latitude(station.get(1)) - .longitude(station.get(0)); - IMogoMarker marker = MogoMarkerManager.getInstance(AbsMogoApplication.getApp()).addMarker(uuid, options); - CenterLine centerLine = CallerHDMapManager.INSTANCE.getCenterLineInfo(station.get(0) - ,station.get(1),-1); - if (null != centerLine){// 有可能鹰眼map为空没有角度。判空使用后可能造成maker角度跟道路角度不一致 - marker.setRotateAngle(centerLine.getAngle().floatValue()); - } + //开启线程执行起终点marker设置 + Runnable setMapMarkerRunnable = new Runnable() { + @Override + public void run() { + CallerLogger.INSTANCE.d(M_TAXI + "setMapMaker= " + Thread.currentThread().getName(), + uuid + "=latitude=" + station.get(1) + ",longitude=" + station.get(0)); + MogoMarkerOptions options = new MogoMarkerOptions() + .owner(TaxiConst.TYPE_MARKER_TAXI_ORDER) + .anchor(0.5f, 0.5f) + .set3DMode(true) + .gps(true) + .controlAngle(true) + .icon3DRes(resourceId) + .latitude(station.get(1)) + .longitude(station.get(0)); + IMogoMarker marker = MogoMarkerManager.getInstance(AbsMogoApplication.getApp()).addMarker(uuid, options); + CenterLine centerLine = CallerHDMapManager.INSTANCE.getCenterLineInfo(station.get(0) + , station.get(1), -1); + if (null != centerLine) {// 有可能鹰眼map为空没有角度。判空使用后可能造成maker角度跟道路角度不一致 + marker.setRotateAngle(centerLine.getAngle().floatValue()); + } + } + }; + OCHThreadPoolManager.getsInstance().execute(setMapMarkerRunnable); }else { - CallerLogger.INSTANCE.d(M_TAXI + "RemoveMapMaker=",uuid+"=latitude="+station.get(1)+",longitude="+station.get(0)); - MogoMarkerManager.getInstance(AbsMogoApplication.getApp()) .removeMarkers(uuid); + //开启线程移除起终点marker设置 + Runnable removeMapMarkerRunnable = new Runnable() { + @Override + public void run() { + CallerLogger.INSTANCE.d(M_TAXI + "RemoveMapMaker=" + Thread.currentThread().getName(), + uuid + "=latitude=" + station.get(1) + ",longitude=" + station.get(0)); + MogoMarkerManager.getInstance(AbsMogoApplication.getApp()).removeMarkers(uuid); + } + }; + OCHThreadPoolManager.getsInstance().execute(removeMapMarkerRunnable); } } diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiFragment.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiFragment.java index 43db7243a5..631db5510b 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiFragment.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiFragment.java @@ -383,6 +383,8 @@ public class TaxiFragment extends BaseTaxiTabFragment - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/OCH/mogo-och-taxi/src/main/res/layout/taxi_base_fragment.xml b/OCH/mogo-och-taxi/src/main/res/layout/taxi_base_fragment.xml index 9410f9d8bc..8eb1ddd358 100644 --- a/OCH/mogo-och-taxi/src/main/res/layout/taxi_base_fragment.xml +++ b/OCH/mogo-och-taxi/src/main/res/layout/taxi_base_fragment.xml @@ -22,7 +22,7 @@ - + app:layout_constraintTop_toTopOf="parent"> + + + - + +