diff --git a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/adapter/BusPassengerLineStationsAdapter.java b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/adapter/BusPassengerLineStationsAdapter.java index 93e66bad7e..565372b4a9 100644 --- a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/adapter/BusPassengerLineStationsAdapter.java +++ b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/adapter/BusPassengerLineStationsAdapter.java @@ -1,6 +1,7 @@ package com.mogo.och.bus.passenger.adapter; import android.content.Context; +import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -8,13 +9,18 @@ import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.constraintlayout.widget.Group; import androidx.recyclerview.widget.RecyclerView; import com.mogo.och.bus.passenger.R; import com.mogo.och.bus.passenger.bean.BusPassengerStation; +import com.mogo.och.common.module.utils.BlinkAnimationUtil; +import com.mogo.och.common.module.wigets.MarqueeTextView; import java.util.List; +import static com.mogo.och.bus.passenger.constant.BusPassengerConst.STATION_STATUS_ARRIVING; +import static com.mogo.och.bus.passenger.constant.BusPassengerConst.STATION_STATUS_LEAVING; import static com.mogo.och.bus.passenger.constant.BusPassengerConst.STATION_STATUS_STOPPED; /** @@ -25,10 +31,6 @@ public class BusPassengerLineStationsAdapter extends RecyclerView.Adapter mStations; - private static final int LINE_START_STATION_ITEM = 0; - private static final int LINE_END_STATION_ITEM = 1; - private static final int LINE_MIDDLE_STATION_ITEM = 2; -// private String preArrivingStation = ""; public BusPassengerLineStationsAdapter(Context context, List stations){ this.mContext = context; @@ -38,78 +40,67 @@ public class BusPassengerLineStationsAdapter extends RecyclerView.Adapter mStations = new ArrayList<>(); private int mNextStationIndex = 0;// 要到达站的index private List mTwoStationsRouts = new ArrayList<>(); + private static final int MSG_QUERY_BUS_P_STATION = 1001; + private final Handler handler = new Handler(new Handler.Callback() { + @Override + public boolean handleMessage(Message msg) { + if ( msg.what == MSG_QUERY_BUS_P_STATION ) { + queryDriverOperationStatus(); + return true; + } + return false; + } + }); + private BusPassengerModel() { } @@ -96,6 +113,7 @@ public class BusPassengerModel { initListeners(); // TODO: 2022/3/31 queryDriverOperationStatus(); + startOrStopOrderLoop(true); } public void setDriverStatusCallback(IBusPassegerDriverStatusCallback callback){ @@ -106,42 +124,60 @@ public class BusPassengerModel { this.mRouteLineInfoCallback = callback; } + private void queryDriverOperationDelay() { + handler.sendEmptyMessageDelayed( MSG_QUERY_BUS_P_STATION, QUERY_BUS_P_STATION_DELAY ); + } + private void queryDriverOperationStatus() { - BusPassengerServiceManager.getInstance().queryDriverOperationStatus(mContext - , new BusPassengerServiceCallback() { + BusPassengerServiceManager.queryDriverOperationStatus(mContext + , new OchCommonServiceCallback() { @Override public void onSuccess(BusPassengerOperationStatusResponse data) { if (data == null || data.data == null) return; - startOrStopOrderLoop(data.data.serviceStatus == 1); if(mDriverStatusCallback != null){ - mDriverStatusCallback.changeOperationStatus(data.data.serviceStatus == 1); + mDriverStatusCallback.changeOperationStatus(data.data.driverStatus == 1); mDriverStatusCallback.updatePlateNumber(data.data.plateNumber); } } @Override public void onFail(int code, String msg) { - queryDriverOperationStatus(); + //延迟3s再次查询 + queryDriverOperationDelay(); } }); } public void queryDriverSiteByCoordinate(){ - BusPassengerServiceManager.getInstance().queryDriverSiteByCoordinate(mContext - , new BusPassengerServiceCallback() { + BusPassengerServiceManager.queryDriverSiteByCoordinate(mContext + , new OchCommonServiceCallback() { @Override public void onSuccess(BusPassengerRoutesResponse data) { if ( data == null || data.getResult() == null || data.getResult().getSites() == null) { + routesResult = null; + startOrStopCalculateRouteInfo(false); + if (mRouteLineInfoCallback != null){ + mRouteLineInfoCallback.showNoTaskView(); + } return; } + if (routesResult != null && routesResult.equals(data.getResult())){ + return; + } + routesResult = data.getResult(); updatePassengerRouteInfo(data.getResult()); } @Override public void onFail(int code, String msg) { - + //code = 1003; message = bus车辆已收车或未出车;bus driver shadow,not exists + if (code == 1003){ + routesResult = null; + startOrStopCalculateRouteInfo(false); + queryDriverOperationDelay(); + } } }); } @@ -149,6 +185,7 @@ public class BusPassengerModel { private void updatePassengerRouteInfo(BusPassengerRoutesResult result) { if (mRouteLineInfoCallback != null){ mRouteLineInfoCallback.updateLineInfo(result.getName(),result.getRunningDur()); + mRouteLineInfoCallback.hideNoTaskView(); if (result.getSites() != null){ List stations = result.getSites(); mStations.clear(); @@ -409,7 +446,9 @@ public class BusPassengerModel { //要前往的站在轨迹中对应的点 int nextRouteIndex = CoordinateCalculateRouteUtil.getArrivedPointIndex(mRoutePoints ,stationNext.getGcjLon(),stationNext.getGcjLat()); - mTwoStationsRouts.addAll(mRoutePoints.subList(currentRouteIndex,nextRouteIndex)); + if (currentRouteIndex < nextRouteIndex){ //如果找到的next在起点的轨迹前面,直接舍弃这个轨迹,不显示 + mTwoStationsRouts.addAll(mRoutePoints.subList(currentRouteIndex,nextRouteIndex)); + } } }else { //只有两个站点的时候整个路线就是两个站点之间的轨迹 mTwoStationsRouts.clear(); 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 c37b463947..c0d1db411d 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 @@ -36,7 +36,7 @@ public class BusPassengerModelLoopManager { return SingletonHolder.INSTANCE; } - private Disposable mHeartbeatDisposable; //心跳轮询 + private Disposable mQueryLineDisposable; //心跳轮询 private CompositeDisposable mRouteWipeDisposable; private CompositeDisposable mCalculateRouteDisposable; //每隔2s计算一次剩余里程和时间 @@ -78,11 +78,11 @@ public class BusPassengerModelLoopManager { } public void startQueryDriverLineLoop() { - if (mHeartbeatDisposable != null && !mHeartbeatDisposable.isDisposed()) { + if (mQueryLineDisposable != null && !mQueryLineDisposable.isDisposed()) { return; } CallerLogger.INSTANCE.i(M_BUS_P + TAG, "startQueryDriverLineLoop()"); - mHeartbeatDisposable = Observable.interval(LOOP_DELAY, + mQueryLineDisposable = Observable.interval(LOOP_DELAY, LOOP_LINE_2S, TimeUnit.MILLISECONDS) .map((aLong -> aLong + 1)) .subscribeOn(Schedulers.io()) @@ -91,10 +91,10 @@ public class BusPassengerModelLoopManager { } public void stopQueryDriverLineLoop() { - if (mHeartbeatDisposable != null) { + if (mQueryLineDisposable != null) { CallerLogger.INSTANCE.i(M_BUS_P + TAG, "stopQueryDriverLineLoop()"); - mHeartbeatDisposable.dispose(); - mHeartbeatDisposable = null; + mQueryLineDisposable.dispose(); + mQueryLineDisposable = null; } } diff --git a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/network/BusPassengerServiceApi.java b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/network/BusPassengerServiceApi.java index c9ddbd8b26..a7512971dc 100644 --- a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/network/BusPassengerServiceApi.java +++ b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/network/BusPassengerServiceApi.java @@ -27,12 +27,14 @@ interface BusPassengerServiceApi { Observable queryDriverSiteByCoordinate(@Header("appId") String appId, @Header("ticket") String ticket, @Body BusPassengerQueryLineRequest request); /** - * 查询司机端出车/收车状态 + * 查询司机端的登陆状态 * @param sn * @return */ @Headers({"Content-type:application/json;charset=UTF-8"}) - @GET("/autopilot-car-hailing/car/v2/driver/bus/passenger/takeOrderStatus/query") +// @GET("/autopilot-car-hailing/car/v2/driver/bus/passenger/takeOrderStatus/query") + @GET("/autopilot-car-hailing/operation/v1/driver/bus/passenger/loginStatus") Observable queryDriverOperationStatus(@Header ("appId") String appId, @Header("ticket") String ticket, @Query("sn") String sn); + } diff --git a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/network/BusPassengerServiceCallback.java b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/network/BusPassengerServiceCallback.java deleted file mode 100644 index fb53106dcd..0000000000 --- a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/network/BusPassengerServiceCallback.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.mogo.och.bus.passenger.network; - -/** - * Created on 2022/3/31 - */ -public interface BusPassengerServiceCallback { - - void onSuccess(T data); - - void onFail(int code, String msg); - - default void onError() { - - } -} diff --git a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/network/BusPassengerServiceManager.java b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/network/BusPassengerServiceManager.java deleted file mode 100644 index b155cb084c..0000000000 --- a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/network/BusPassengerServiceManager.java +++ /dev/null @@ -1,118 +0,0 @@ -package com.mogo.och.bus.passenger.network; - -import android.content.Context; - -import com.mogo.cloud.passport.MoGoAiCloudClientConfig; -import com.mogo.eagle.core.data.BaseData; -import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager; -import com.mogo.eagle.core.network.MoGoRetrofitFactory; -import com.mogo.eagle.core.network.RequestOptions; -import com.mogo.eagle.core.network.SubscribeImpl; -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; -import com.mogo.och.bus.passenger.bean.BusPassengerOperationStatusResponse; -import com.mogo.och.bus.passenger.bean.BusPassengerQueryLineRequest; -import com.mogo.och.bus.passenger.bean.BusPassengerRoutesResponse; -import com.mogo.och.bus.passenger.constant.BusPassengerConst; - -import io.reactivex.android.schedulers.AndroidSchedulers; -import io.reactivex.schedulers.Schedulers; - -import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS_P; - -/** - * Created on 2022/3/31 - */ -public class BusPassengerServiceManager { - private static final String TAG = BusPassengerServiceManager.class.getSimpleName(); - - private static final class SingletonHolder { - private static final BusPassengerServiceManager INSTANCE = new BusPassengerServiceManager(); - } - - public static BusPassengerServiceManager getInstance() { - return SingletonHolder.INSTANCE; - } - - private BusPassengerServiceApi mBusPassengerServiceApi; - - private BusPassengerServiceManager() { - if (mBusPassengerServiceApi == null){ - mBusPassengerServiceApi = MoGoRetrofitFactory.getInstance( - BusPassengerConst.getBaseUrl()).create(BusPassengerServiceApi.class); - } - } - - /** - * 获取Bus司机端的sn - * @return - */ - private String getDriverAppSn(){ - return CallerTelematicManager.INSTANCE.getServerToken(); -// return "X2020211111NG0XNFK"; - } - - /** - * 查询绑定行驶的小巴车路线 - * @param context - * @param callback - */ - public void queryDriverSiteByCoordinate(Context context - ,BusPassengerServiceCallback callback){ - mBusPassengerServiceApi.queryDriverSiteByCoordinate(MoGoAiCloudClientConfig.getInstance().getServiceAppId() - ,MoGoAiCloudClientConfig.getInstance().getToken() - ,new BusPassengerQueryLineRequest(getDriverAppSn())) - .subscribeOn( Schedulers.io() ) - .observeOn( AndroidSchedulers.mainThread() ) - .subscribe(getSubscribeImpl(context,callback,"queryDriverSiteByCoordinate")); - } - - /** - * 查询司机端出车收车状态,以及车牌号 - * @param context - * @param callback - */ - public void queryDriverOperationStatus(Context context, BusPassengerServiceCallback callback){ - mBusPassengerServiceApi.queryDriverOperationStatus(MoGoAiCloudClientConfig.getInstance().getServiceAppId() - ,MoGoAiCloudClientConfig.getInstance().getToken() - ,getDriverAppSn()) - .subscribeOn( Schedulers.io() ) - .observeOn( AndroidSchedulers.mainThread() ) - .subscribe(getSubscribeImpl(context,callback,"queryDriverOperationStatus")); - } - - - private SubscribeImpl getSubscribeImpl( - Context context, BusPassengerServiceCallback callback, String apiName) { - return new SubscribeImpl(RequestOptions.create(context)) { - @Override - public void onSuccess(T o) { - super.onSuccess(o); - CallerLogger.INSTANCE.e(M_BUS_P + TAG,apiName + - ": onSuccess() " + o.msg); - if (callback != null) { - callback.onSuccess(o); - } - } - - @Override - public void onError(Throwable e) { - super.onError(e); - CallerLogger.INSTANCE.e(M_BUS_P + TAG,apiName + - ": onError() " + e.getMessage()); - if (callback != null) { - callback.onError(); - } - } - - @Override - public void onError(String message, int code) { - super.onError(message, code); - CallerLogger.INSTANCE.e(M_BUS_P + TAG,String.format(apiName + - ": onError() code = %d; message = %s;", code, message)); - if (callback != null) { - callback.onFail(code, message); - } - } - }; - } -} diff --git a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/network/BusPassengerServiceManager.kt b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/network/BusPassengerServiceManager.kt new file mode 100644 index 0000000000..0e70161643 --- /dev/null +++ b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/network/BusPassengerServiceManager.kt @@ -0,0 +1,62 @@ +package com.mogo.och.bus.passenger.network + +import android.content.Context +import com.mogo.och.bus.passenger.constant.BusPassengerConst.Companion.getBaseUrl +import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager.getServerToken +import com.mogo.och.bus.passenger.bean.BusPassengerRoutesResponse +import com.mogo.cloud.passport.MoGoAiCloudClientConfig +import com.mogo.och.bus.passenger.bean.BusPassengerQueryLineRequest +import com.mogo.och.bus.passenger.bean.BusPassengerOperationStatusResponse +import com.mogo.eagle.core.network.MoGoRetrofitFactory +import com.mogo.och.common.module.biz.network.OchCommonServiceCallback +import com.mogo.och.common.module.biz.network.OchCommonSubscribeImpl +import com.mogo.och.common.module.biz.network.interceptor.transformTry + +/** + * Created on 2022/3/31 + */ +object BusPassengerServiceManager { + + private var mBusPassengerServiceApi = MoGoRetrofitFactory.getInstance(getBaseUrl()) + .create(BusPassengerServiceApi::class.java) + + /** + * 获取Bus司机端的sn + * @return + */ + private val driverAppSn: String + get() = getServerToken() + /** + * 查询绑定行驶的小巴车路线 + * @param context + * @param callback + */ + @JvmStatic + fun queryDriverSiteByCoordinate( + context: Context, callback: OchCommonServiceCallback? + ) { + mBusPassengerServiceApi.queryDriverSiteByCoordinate( + MoGoAiCloudClientConfig.getInstance().serviceAppId, + MoGoAiCloudClientConfig.getInstance().token, + BusPassengerQueryLineRequest(driverAppSn)) + .transformTry() + .subscribe(OchCommonSubscribeImpl(context, callback, "queryDriverSiteByCoordinate")) + } + + /** + * 查询司机端出车收车状态,以及车牌号 + * @param context + * @param callback + */ + @JvmStatic + fun queryDriverOperationStatus( + context: Context, + callback: OchCommonServiceCallback?) { + mBusPassengerServiceApi.queryDriverOperationStatus( + MoGoAiCloudClientConfig.getInstance().serviceAppId, + MoGoAiCloudClientConfig.getInstance().token, + driverAppSn) + .transformTry() + .subscribe(OchCommonSubscribeImpl(context, callback, "queryDriverOperationStatus")) + } +} \ No newline at end of file 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 b855057746..505a26d7a5 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 @@ -135,6 +135,16 @@ public class BaseBusPassengerPresenter extends Presenter mView.updateStationsInfo(stations,currentStationIndex, isArrived)); } + @Override + public void showNoTaskView() { + runOnUIThread(() -> mView.showNoTaskView()); + } + + @Override + public void hideNoTaskView() { + runOnUIThread(() -> mView.hideNoTaskView()); + } + @Override public void routeResult(List models, int haveArrivedIndex) { CallerLogger.INSTANCE.d(M_BUS_P + TAG, "routeResult:" + models.size() 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 e2b0ac575c..c9abd42c76 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 @@ -22,6 +22,7 @@ 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; +import com.mogo.och.common.module.wigets.OCHBorderShadowLayout; /** * Created on 2022/3/31 @@ -102,6 +103,9 @@ public abstract class BusPassengerBaseFragment mCoordinatesLatLng = new ArrayList<>(); - private List mLinePointsLatLng = new ArrayList<>(); + private List mCoordinatesLatLng = new ArrayList<>(); //站点坐标数据 + private List mLinePointsLatLng = new ArrayList<>(); //轨迹坐标数据 private Polyline mPolyline; private CameraUpdate mCameraUpdate; private Context mContext; @@ -106,14 +106,14 @@ public class BusPassengerMapDirectionView initAMapView(); // 注册定位监听 - CallerMapLocationListenerManager.INSTANCE.addListener(TAG, this); + CallerMapLocationListenerManager.INSTANCE.addListener(TAG, this, false); } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); // 注册定位监听 - CallerMapLocationListenerManager.INSTANCE.removeListener(TAG); + CallerMapLocationListenerManager.INSTANCE.removeListener(TAG, false); } private void initAMapView() { @@ -182,7 +182,7 @@ public class BusPassengerMapDirectionView @Override - public void onLocationChanged(@Nullable MogoLocation location, int from) { + public void onLocationChanged(@org.jetbrains.annotations.Nullable MogoLocation location, int from, boolean isGps) { if (location == null) { return; } @@ -197,7 +197,7 @@ public class BusPassengerMapDirectionView mCarMarker.setToTop(); } - if (mLinePointsLatLng.size() > 1){ + if (mLinePointsLatLng.size() > 0){ //圈定地图显示范围 //存放经纬度 LatLngBounds.Builder boundsBuilder = new LatLngBounds.Builder(); @@ -208,12 +208,13 @@ public class BusPassengerMapDirectionView //第二个参数为四周留空宽度 mAMap.moveCamera(CameraUpdateFactory.newLatLngBoundsRect(boundsBuilder.build(),100,100,100,100)); - }else { - //设置希望展示的地图缩放级别 - CameraPosition cameraPosition = new CameraPosition.Builder() - .target(mCarMarker.getPosition()).tilt(0).bearing(location.getBearing()).zoom(zoomLevel).build(); - mAMap.moveCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)); } +// else { +// //设置希望展示的地图缩放级别 +// CameraPosition cameraPosition = new CameraPosition.Builder() +// .target(mCarMarker.getPosition()).tilt(0).bearing(location.getBearing()).zoom(zoomLevel).build(); +// mAMap.moveCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)); +// } } @@ -226,8 +227,8 @@ public class BusPassengerMapDirectionView if (mAMap != null) { addRouteColorList(); - - if (mCoordinatesLatLng.size() > 2) { + CallerLogger.INSTANCE.d(M_BUS_P + TAG, "mLinePointsLatLng.size() = " +mLinePointsLatLng.size()); + if (mLinePointsLatLng.size() >= 2 && mCoordinatesLatLng.size() > 2) { //设置线段纹理 PolylineOptions polylineOptions = new PolylineOptions(); @@ -302,6 +303,7 @@ public class BusPassengerMapDirectionView texIndexList.clear(); mCoordinatesLatLng.clear(); mLinePointsLatLng.clear(); + CallerLogger.INSTANCE.d(M_BUS_P + TAG, " mCoordinatesLatLng.clear " ); } public void onCreateView(Bundle savedInstanceState) { @@ -368,7 +370,7 @@ public class BusPassengerMapDirectionView mLinePointsLatLng.clear(); mLinePointsLatLng.addAll(routeLineLatLngs); - if (mCoordinatesLatLng.size() > 0 && mCurrentIndex != currentIndex) { + if (mLinePointsLatLng.size() > 0 && mCurrentIndex != currentIndex) { if (mAMap != null && mLineMarkers.size() > 0) { mCurrentIndex = currentIndex; for (int i = 0; i < mLineMarkers.size(); i++) { 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 29ccf56f35..e56557e570 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 @@ -10,11 +10,11 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.constraintlayout.widget.ConstraintLayout; -import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.amap.api.maps.model.LatLng; import com.elegant.utils.UiThreadHandler; +import com.mogo.commons.debug.DebugConfig; 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; @@ -24,8 +24,10 @@ 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.ui.layoutmanager.CenterLayoutManager; import com.mogo.och.bus.passenger.utils.BPRouteDataTestUtils; import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil; +import com.mogo.och.common.module.wigets.MarqueeTextView; import java.util.ArrayList; import java.util.List; @@ -49,7 +51,7 @@ public class BusPassengerRouteFragment extends private TextView mSpeedTv; private ConstraintLayout mNoLineInfoView; private TextView mCarPlateNum; - private TextView mLineName; + private MarqueeTextView mLineName; private TextView mOperationTime; private ConstraintLayout mRouteInfoView; private RecyclerView mStationsListRv; @@ -58,6 +60,7 @@ public class BusPassengerRouteFragment extends private RotateAnimation rotateAnimation; private float lastBearing = 0; private BusPassengerLineStationsAdapter mAdapter; + private TextView emptyTv; @Override public int getStationPanelViewId() { @@ -79,6 +82,7 @@ public class BusPassengerRouteFragment extends mSpeedTv = findViewById(R.id.bus_p_speed_tv); mNoLineInfoView =findViewById(R.id.bus_p_no_order_data_view); + emptyTv = findViewById(R.id.no_order_data_tv); mCarPlateNum = findViewById(R.id.bus_p_driver_num_plate_tv); mLineName = findViewById(R.id.bus_p_line_name_tv); @@ -86,7 +90,8 @@ public class BusPassengerRouteFragment extends mRouteInfoView = findViewById(R.id.bus_p_line_cl); mStationsListRv = findViewById(R.id.bus_p_line_stations_rl); - LinearLayoutManager manager = new LinearLayoutManager(getContext()); + + CenterLayoutManager manager = new CenterLayoutManager(getContext()); mStationsListRv.setLayoutManager(manager); mAdapter = new BusPassengerLineStationsAdapter(getContext(), mStationsList); mStationsListRv.setAdapter(mAdapter); @@ -94,19 +99,21 @@ public class BusPassengerRouteFragment extends mMapArrowIcon = findViewById(R.id.bus_p_arrow_nor); //测试 - mSpeedTv.setOnLongClickListener(new View.OnLongClickListener() { - @Override - public boolean onLongClick(View v) { - BPRouteDataTestUtils.converToRouteData(); - UiThreadHandler.postDelayed(new Runnable() { - @Override - public void run() { - updateWayPointList(mStationsList,1); - } - },1000); - return false; - } - }); + if (DebugConfig.isDebug()){ + mSpeedTv.setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + BPRouteDataTestUtils.converToRouteData(); + UiThreadHandler.postDelayed(new Runnable() { + @Override + public void run() { + updateWayPointList(mStationsList,1); + } + },1000); + return false; + } + }); + } } @Override @@ -145,7 +152,7 @@ public class BusPassengerRouteFragment extends if (latLngList.size() > 0) { drawablePolyline(latLngList,haveArrivedIndex); } else { - clearPolyline(); + clearMapView(); } } @@ -161,7 +168,7 @@ public class BusPassengerRouteFragment extends }); } } else { - clearPolyline(); + clearMapView(); } } @@ -182,12 +189,24 @@ public class BusPassengerRouteFragment extends } } - public void clearPolyline() { + public void clearMapView() { if (mMapDirectionView != null) { UiThreadHandler.post(new Runnable() { @Override public void run() { mMapDirectionView.clearPolyline(); + mMapDirectionView.clearCoordinatesLatLng(); + } + }); + } + } + + public void clearMapMarkers() { + if (mMapDirectionView != null) { + UiThreadHandler.post(new Runnable() { + @Override + public void run() { + mMapDirectionView.clearLineMarkers(); } }); @@ -211,8 +230,30 @@ public class BusPassengerRouteFragment extends mNoLineInfoView.setVisibility(View.GONE); mRouteInfoView.setVisibility(View.VISIBLE); } else { + emptyTv.setText(getString(R.string.bus_p_no_out)); mNoLineInfoView.setVisibility(View.VISIBLE); mRouteInfoView.setVisibility(View.GONE); + updateArrivedStation(null,0,true); + clearMapView(); + clearMapMarkers(); + } + } + + public void showNoTaskView(){ + if (mNoLineInfoView.getVisibility() == View.GONE){ + mNoLineInfoView.setVisibility(View.VISIBLE); + mRouteInfoView.setVisibility(View.GONE); + updateArrivedStation(null,0,true); + clearMapView(); + clearMapMarkers(); + } + emptyTv.setText(getString(R.string.bus_p_no_task)); + } + + public void hideNoTaskView(){ + if (mNoLineInfoView.getVisibility() == View.VISIBLE){ + mNoLineInfoView.setVisibility(View.GONE); + mRouteInfoView.setVisibility(View.VISIBLE); } } @@ -248,8 +289,7 @@ public class BusPassengerRouteFragment extends if (currentStationIndex == 0 && isArrived){ //到达始发站且并未出发, 恢复站点marker 清楚路径 清空路径点 SharedPrefsMgr.getInstance(getContext()) .remove(BusPassengerConst.BUS_SP_KEY_ORDER_SUM_DIS); - if (mMapDirectionView != null) mMapDirectionView.clearCoordinatesLatLng(); - clearPolyline(); + clearMapView(); } if (stations.size() > 0){ diff --git a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/ui/layoutmanager/CenterLayoutManager.java b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/ui/layoutmanager/CenterLayoutManager.java new file mode 100644 index 0000000000..42210cbcaf --- /dev/null +++ b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/ui/layoutmanager/CenterLayoutManager.java @@ -0,0 +1,42 @@ +package com.mogo.och.bus.passenger.ui.layoutmanager; + +import android.content.Context; +import android.util.AttributeSet; + +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.LinearSmoothScroller; +import androidx.recyclerview.widget.RecyclerView; + +public class CenterLayoutManager extends LinearLayoutManager { + public CenterLayoutManager(Context context) { + super(context); + } + + public CenterLayoutManager(Context context, int orientation, boolean reverseLayout) { + super(context, orientation, reverseLayout); + } + + public CenterLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + } + + @Override + public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) { + RecyclerView.SmoothScroller smoothScroller = new CenterSmoothScroller(recyclerView.getContext()); + smoothScroller.setTargetPosition(position); + startSmoothScroll(smoothScroller); + } + + private static class CenterSmoothScroller extends LinearSmoothScroller { + + CenterSmoothScroller(Context context) { + super(context); + } + + @Override + public int calculateDtToFit(int viewStart, int viewEnd, int boxStart, int boxEnd, int snapPreference) { + return (boxStart + (boxEnd - boxStart) / 2) - (viewStart + (viewEnd - viewStart) / 2); + } + } + +} \ No newline at end of file diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_line_blue.png b/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_line_blue.png new file mode 100644 index 0000000000..5614459c69 Binary files /dev/null and b/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_line_blue.png differ diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_line_green.png b/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_line_green.png new file mode 100644 index 0000000000..dab0bedbfa Binary files /dev/null and b/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_line_green.png differ diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_line_grey.png b/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_line_grey.png new file mode 100644 index 0000000000..22a4227c74 Binary files /dev/null and b/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_line_grey.png differ diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_point_blue.png b/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_point_blue.png new file mode 100644 index 0000000000..6947f4538d Binary files /dev/null and b/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_point_blue.png differ diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_point_gray.png b/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_point_gray.png new file mode 100644 index 0000000000..5b9da6fb76 Binary files /dev/null and b/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_point_gray.png differ diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_point_green.png b/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_point_green.png new file mode 100644 index 0000000000..194bcbf434 Binary files /dev/null and b/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_point_green.png differ diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_line_blue.png b/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_line_blue.png new file mode 100644 index 0000000000..5614459c69 Binary files /dev/null and b/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_line_blue.png differ diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_line_green.png b/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_line_green.png new file mode 100644 index 0000000000..dab0bedbfa Binary files /dev/null and b/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_line_green.png differ diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_line_grey.png b/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_line_grey.png new file mode 100644 index 0000000000..22a4227c74 Binary files /dev/null and b/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_line_grey.png differ diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_point_blue.png b/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_point_blue.png new file mode 100644 index 0000000000..6947f4538d Binary files /dev/null and b/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_point_blue.png differ diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_point_gray.png b/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_point_gray.png new file mode 100644 index 0000000000..5b9da6fb76 Binary files /dev/null and b/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_point_gray.png differ diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_point_green.png b/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_point_green.png new file mode 100644 index 0000000000..194bcbf434 Binary files /dev/null and b/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_point_green.png differ 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 03e16a4146..69625e4573 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 @@ -27,7 +27,7 @@ app:layout_constraintTop_toTopOf="parent"/> + android:text="@string/bus_p_no_out"/> \ No newline at end of file diff --git a/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_route_fragment.xml b/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_route_fragment.xml index 58ae13004c..7a7792bdc1 100644 --- a/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_route_fragment.xml +++ b/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_route_fragment.xml @@ -105,21 +105,25 @@ app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toTopOf="parent" /> - + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_stations_end_item.xml b/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_stations_end_item.xml deleted file mode 100644 index 9d2edfd07f..0000000000 --- a/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_stations_end_item.xml +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_stations_middle_item.xml b/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_stations_middle_item.xml deleted file mode 100644 index 9acb37947a..0000000000 --- a/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_stations_middle_item.xml +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_stations_start_item.xml b/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_stations_start_item.xml deleted file mode 100644 index 50ed06a589..0000000000 --- a/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_stations_start_item.xml +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/OCH/mogo-och-bus-passenger/src/main/res/values/strings.xml b/OCH/mogo-och-bus-passenger/src/main/res/values/strings.xml index d142ef29fc..0f4dc17854 100644 --- a/OCH/mogo-och-bus-passenger/src/main/res/values/strings.xml +++ b/OCH/mogo-och-bus-passenger/src/main/res/values/strings.xml @@ -1,7 +1,8 @@ KM/H - 您已收车 + 您已收车 + 暂无班次 到达站: diff --git a/OCH/mogo-och-bus/build.gradle b/OCH/mogo-och-bus/build.gradle index eea68114f8..4de0719cb7 100644 --- a/OCH/mogo-och-bus/build.gradle +++ b/OCH/mogo-och-bus/build.gradle @@ -51,6 +51,7 @@ dependencies { implementation rootProject.ext.dependencies.rxjava implementation rootProject.ext.dependencies.rxandroid + compileOnly rootProject.ext.dependencies.recyclerviewadapterhelper implementation project(":OCH:mogo-och-common-module") diff --git a/OCH/mogo-och-bus/src/main/AndroidManifest.xml b/OCH/mogo-och-bus/src/main/AndroidManifest.xml index 0e09e1a997..76856fd226 100644 --- a/OCH/mogo-och-bus/src/main/AndroidManifest.xml +++ b/OCH/mogo-och-bus/src/main/AndroidManifest.xml @@ -13,7 +13,7 @@ /> + android:screenOrientation="landscape" /> \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/BusProvider.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/BusProvider.java index 02a9fc3d55..e60a54e1a6 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/BusProvider.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/BusProvider.java @@ -1,3 +1,4 @@ + package com.mogo.och.bus; import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS; @@ -6,10 +7,10 @@ import android.content.Context; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentActivity; +import androidx.fragment.app.FragmentManager; import com.alibaba.android.arouter.facade.annotation.Route; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; -import com.mogo.eagle.core.utilcode.util.UiThreadHandler; import com.mogo.map.MogoMapUIController; import com.mogo.module.common.MogoApisHandler; import com.mogo.och.bus.constant.BusConst; @@ -50,14 +51,20 @@ public class BusProvider implements IMogoOCH { } private void showFragment() { + FragmentManager supportFragmentManager = activity.getSupportFragmentManager(); if (busFragment == null) { CallerLogger.INSTANCE.d(TAG, "准备add fragment======"); - busFragment = new BusFragment(); - activity.getSupportFragmentManager().beginTransaction().add(containerId, busFragment).commitAllowingStateLoss(); + Fragment fragmentByTag = supportFragmentManager.findFragmentByTag(BusFragment.TAG); + if(fragmentByTag instanceof BusFragment){ + busFragment = (BusFragment)fragmentByTag; + }else { + busFragment = new BusFragment(); + } + supportFragmentManager.beginTransaction().add(containerId, busFragment,BusFragment.TAG).commitAllowingStateLoss(); return; } CallerLogger.INSTANCE.d(TAG, "准备show fragment"); - activity.getSupportFragmentManager().beginTransaction().show(busFragment).commitAllowingStateLoss(); + supportFragmentManager.beginTransaction().show(busFragment).commitAllowingStateLoss(); } private void hideFragment() { diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusCloseTaskRequest.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusCloseTaskRequest.java new file mode 100644 index 0000000000..d8a11924af --- /dev/null +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusCloseTaskRequest.java @@ -0,0 +1,20 @@ +package com.mogo.och.bus.bean; + +import com.mogo.cloud.passport.MoGoAiCloudClientConfig; + +/** + * 中止/结束任务请求 + */ +public class BusCloseTaskRequest { + + private String sn; + private int taskId; + public BusCloseTaskRequest(int taskId) { + this.sn = MoGoAiCloudClientConfig.getInstance().getSn(); + this.taskId = taskId; + } + + public String getSn() { + return sn; + } +} diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusOperationStatusResponse.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusOperationStatusResponse.java deleted file mode 100644 index 744fbac9c5..0000000000 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusOperationStatusResponse.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.mogo.och.bus.bean; - -import com.mogo.eagle.core.data.BaseData; - -/** - * @author congtaowang - * @since 2021/3/22 - * - * 小巴车运营状态返回参数 - */ -public class BusOperationStatusResponse extends BaseData { - - public Result data; - - public static class Result { - - public int serviceStatus;//0:已收车,1:已出车 - - } -} diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryLineStationsRequest.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryLineStationsRequest.java index 6485027084..6c90d9f7e2 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryLineStationsRequest.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryLineStationsRequest.java @@ -2,55 +2,57 @@ package com.mogo.och.bus.bean; import com.mogo.cloud.passport.MoGoAiCloudClientConfig; -public /** * @author congtaowang * @since 2021/3/22 * * 根据车机行驶线路站点信息 */ -class BusQueryLineStationsRequest { +public class BusQueryLineStationsRequest { private String sn; - private double lat; - private double lon; - private boolean markDrivingStatus; // 默认false;true:是否需要返回站点的行驶状态,对应返回的drivingStatus +// private double lat; +// private double lon; +// private boolean markDrivingStatus; // 默认false;true:是否需要返回站点的行驶状态,对应返回的drivingStatus // 0 - 关闭、1 - 启动 // public String status; - public BusQueryLineStationsRequest(double lon, double lat, boolean markDrivingStatus) { +// public BusQueryLineStationsRequest(double lon, double lat, boolean markDrivingStatus) { +// this.sn = MoGoAiCloudClientConfig.getInstance().getSn(); +// this.lat = lat; +// this.lon = lon; +// this.markDrivingStatus = markDrivingStatus; +// } + public BusQueryLineStationsRequest() { this.sn = MoGoAiCloudClientConfig.getInstance().getSn(); - this.lat = lat; - this.lon = lon; - this.markDrivingStatus = markDrivingStatus; } - public boolean isMarkDrivingStatus() { - return markDrivingStatus; - } - - public void setMarkDrivingStatus(boolean markDrivingStatus) { - this.markDrivingStatus = markDrivingStatus; - } - - public void setLat(double lat) { - this.lat = lat; - } - - public void setLon(double lon) { - this.lon = lon; - } - - public String getSn() { - return sn; - } - - public double getLat() { - return lat; - } - - public double getLon() { - return lon; - } +// public boolean isMarkDrivingStatus() { +// return markDrivingStatus; +// } +// +// public void setMarkDrivingStatus(boolean markDrivingStatus) { +// this.markDrivingStatus = markDrivingStatus; +// } +// +// public void setLat(double lat) { +// this.lat = lat; +// } +// +// public void setLon(double lon) { +// this.lon = lon; +// } +// +// public String getSn() { +// return sn; +// } +// +// public double getLat() { +// return lat; +// } +// +// public double getLon() { +// return lon; +// } // public BusOperationStatusRequest shutdown() { // status = "0"; // return this; diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryLineTaskResponse.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryLineTaskResponse.java new file mode 100644 index 0000000000..4911c3cf99 --- /dev/null +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryLineTaskResponse.java @@ -0,0 +1,19 @@ +package com.mogo.och.bus.bean; + +import com.mogo.eagle.core.data.BaseData; + +import java.util.List; + +/** + * @author: wangmingjun + * @date: 2022/2/9 + */ +public class BusQueryLineTaskResponse extends BaseData { + + public List data; + + public static class Result { + public int id; + public long taskStartTime; + } +} diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryLinesResponse.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryLinesResponse.java index 99ead6ee0e..17540e3eed 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryLinesResponse.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryLinesResponse.java @@ -19,5 +19,9 @@ public class BusQueryLinesResponse extends BaseData { public String startSiteName;//始发站名称 public String endSiteName;//终点名称 + public boolean open;//true 打开状态 false + public boolean haveTask; + + public List taskList; } } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryWriteOffPassengersResponse.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryWriteOffPassengersResponse.java new file mode 100644 index 0000000000..36a5e3b409 --- /dev/null +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryWriteOffPassengersResponse.java @@ -0,0 +1,13 @@ +package com.mogo.och.bus.bean; + +import com.mogo.eagle.core.data.BaseData; + +import java.util.List; + +/** + * @author: wangmingjun + * @date: 2021/10/19 + */ +public class BusQueryWriteOffPassengersResponse extends BaseData { + public List data; +} diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusResetDrivingLineRequest.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusResetDrivingLineRequest.java index c27264694f..6ab70768f9 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusResetDrivingLineRequest.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusResetDrivingLineRequest.java @@ -9,10 +9,10 @@ import com.mogo.commons.network.Utils; */ public class BusResetDrivingLineRequest { public String sn; - public int lineId; //切换到的线路id + public int taskId; //切换到的线路id - public BusResetDrivingLineRequest(int lineId) { - sn = MoGoAiCloudClientConfig.getInstance().getSn(); - this.lineId = lineId; + public BusResetDrivingLineRequest(int taskId) { + this.sn = MoGoAiCloudClientConfig.getInstance().getSn(); + this.taskId = taskId; } } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusResetLineStatusRequest.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusResetLineStatusRequest.java new file mode 100644 index 0000000000..595ceafce3 --- /dev/null +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusResetLineStatusRequest.java @@ -0,0 +1,24 @@ +package com.mogo.och.bus.bean; + +import com.mogo.cloud.passport.MoGoAiCloudClientConfig; + +public +/** + * @author congtaowang + * @since 2021/3/22 + * + * 小巴车重置路线状态请求参数 + */ +class BusResetLineStatusRequest { + + private String sn; + public BusResetLineStatusRequest() { + this.sn = MoGoAiCloudClientConfig.getInstance().getSn(); + } + + public String getSn() { + return sn; + } + + +} 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 ba188d3bee..4b652d30df 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 @@ -14,6 +14,8 @@ public class BusRoutesResult { private int lineType; //线路类型,0:环形 private String description; private int status; + private long taskTime; //线路时间班次 + private int taskId;// 线路班次id //线路轨迹相关字段 public String csvFileUrl = ""; //轨迹文件下载的cos url,默认“” @@ -32,6 +34,10 @@ public class BusRoutesResult { return lineId; } + public int getTaskId() { + return taskId; + } + public String getName() { return name; } @@ -44,12 +50,17 @@ public class BusRoutesResult { this.sites = sites; } + public long getTaskTime() { + return taskTime; + } + @Override public String toString() { return "BusRoutesResult{" + "sites=" + sites + ", lineId=" + lineId + ", name='" + name + '\'' + + ", taskTime='" + taskTime + '\'' + ", lineType=" + lineType + ", description='" + description + '\'' + ", status=" + status + diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusUpdateSiteStatusRequest.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusUpdateSiteStatusRequest.java index a9552157ff..c25bccb128 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusUpdateSiteStatusRequest.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusUpdateSiteStatusRequest.java @@ -12,16 +12,14 @@ import com.mogo.commons.network.Utils; public class BusUpdateSiteStatusRequest { public String sn; + public int taskId; public int seq;//站点序号 public int siteId;//站点id - public double lon; - public double lat; - public BusUpdateSiteStatusRequest(int seq, int siteId, double lon, double lat) { + public BusUpdateSiteStatusRequest(int taskId,int siteId,int seq) { this.sn = MoGoAiCloudClientConfig.getInstance().getSn(); this.seq = seq; this.siteId = siteId; - this.lon = lon; - this.lat = lat; + this.taskId = taskId; } } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusWriteOffPassengersQueryRequest.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusWriteOffPassengersQueryRequest.java new file mode 100644 index 0000000000..6f07456c78 --- /dev/null +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusWriteOffPassengersQueryRequest.java @@ -0,0 +1,24 @@ +package com.mogo.och.bus.bean; + +import com.mogo.cloud.passport.MoGoAiCloudClientConfig; + +/** + * 查询核销乘客 + */ +public class BusWriteOffPassengersQueryRequest { + + private String sn; + private int taskId; + private int siteId; + private long verificationTime; + public BusWriteOffPassengersQueryRequest(int taskId, int siteId,long prePassengerTime) { + this.sn = MoGoAiCloudClientConfig.getInstance().getSn(); + this.taskId = taskId; + this.siteId = siteId; + this.verificationTime = prePassengerTime; + } + + public String getSn() { + return sn; + } +} diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/WriteOffPassenger.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/WriteOffPassenger.java new file mode 100644 index 0000000000..0e2bebe17d --- /dev/null +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/WriteOffPassenger.java @@ -0,0 +1,12 @@ +package com.mogo.och.bus.bean; + +/** + * @author: wangmingjun + * @date: 2022/9/23 + */ +public class WriteOffPassenger { + public String phone; + public String orderNo; + public int passengerSize; + public long writeOffTime; +} diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IBusADASStatusCallback.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IBusADASStatusCallback.java new file mode 100644 index 0000000000..186fc0b5f4 --- /dev/null +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IBusADASStatusCallback.java @@ -0,0 +1,11 @@ +package com.mogo.och.bus.callback; + +/** + * Created on 2021/9/8 + * + * Model->Presenter回调:ADAS相关(自动驾驶状态回调,到达终点等等) + */ +public interface IBusADASStatusCallback { + //自驾返回失败 + void onStartAdasFailure(); +} diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IBusLinesCallback.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IBusLinesCallback.java index b181736278..8250b337c5 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IBusLinesCallback.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IBusLinesCallback.java @@ -1,5 +1,6 @@ package com.mogo.och.bus.callback; +import com.mogo.och.bus.bean.BusQueryLineTaskResponse; import com.mogo.och.bus.bean.BusQueryLinesResponse; /** @@ -9,4 +10,5 @@ import com.mogo.och.bus.bean.BusQueryLinesResponse; public interface IBusLinesCallback { void onBusLinesChange(BusQueryLinesResponse lines); void onChangeLineIdSuccess(); + void onBusLineTasks(BusQueryLineTaskResponse o, int position,boolean autoRefresh); } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/ICarOperationStatusCallback.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/ICarOperationStatusCallback.java deleted file mode 100644 index d414f71e2c..0000000000 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/ICarOperationStatusCallback.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.mogo.och.bus.callback; - -/** - * @author: wangmingjun - * @date: 2021/10/22 - */ -public interface ICarOperationStatusCallback { - void changeOperationStatus(boolean changeStatus); -} diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IPassengerCallback.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IPassengerCallback.java new file mode 100644 index 0000000000..98f4498282 --- /dev/null +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IPassengerCallback.java @@ -0,0 +1,11 @@ +package com.mogo.och.bus.callback; + +import com.mogo.och.bus.bean.WriteOffPassenger; + +/** + * @author: wangmingjun + * @date: 2022/9/26 + */ +public interface IPassengerCallback { + void playPassenger(WriteOffPassenger passenger); +} 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 ae4a8b9713..95292ef6a6 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,15 @@ import java.util.List; * @date: 2021/10/22 */ public interface IRefreshBusStationsCallback { - void refreshBusStations(String lineName,List stationList, int currentStation, int nextStation, boolean isArrived); + void updateBusTaskStatus(String lineName,String lintTime, + List stationList, + int arrivingOrArrivedIndex, + boolean isArrived); + + /** + * 结束清理一遍、选择任务后清理一遍 + */ + void clearBusStationsMarkers(); + + void updateEmptyUi(); } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/constant/BusConst.kt b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/constant/BusConst.kt index bd1c823a13..686e08b4e4 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/constant/BusConst.kt +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/constant/BusConst.kt @@ -63,8 +63,12 @@ class BusConst { const val EVENT_PARAM_END_NAME = "end_name" const val EVENT_PARAM_LINE_ID = "line_id" const val EVENT_PARAM_START_RESULT = "start_autopilot" // true/false + const val EVENT_PARAM_START_FAILURE_MSG = "start_autopilot_failure_msg" // 启动自驾失败原因 const val EVENT_PARAM_PLATE_NUM = "plate_number" // 车牌号 const val EVENT_PARAM_ENV_ONLINE = "env_online" // 是否线上环境:true/false + // 埋点key:开启自动驾驶前已识别的异常,会导致无法开启自驾 + const val EVENT_KEY_AP_UNABLE_START_REASON = "event_key_och_bus_ap_unable_start_reason" + const val EVENT_PARAM_UNABLE_START_REASON = "unable_start_reason"; /** * 订单起终点Marker类型 @@ -75,5 +79,13 @@ class BusConst { //围栏到站 暂定10米 const val ARRIVE_AT_END_STATION_DISTANCE = 10 + + // 轮询 + const val LOOP_PASSENGER_5S = 5 * 1000L + const val LOOP_PASSENGER_2S = 2 * 1000L + const val LOOP_PASSENGER_1S = 1 * 1000L + const val LOOP_DELAY_500 = 500L + + const val DELAY_10S = 10 * 1000L } } \ No newline at end of file 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 c83715f9f1..a780ffb698 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 @@ -5,8 +5,10 @@ import static com.mogo.och.bus.constant.BusConst.TIMER_START_AUTOPILOT_INTERVAL; import android.animation.ObjectAnimator; import android.content.Intent; +import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; +import android.view.ViewGroup; import android.view.animation.LinearInterpolator; import android.widget.FrameLayout; import android.widget.ImageView; @@ -32,6 +34,7 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotRecordListener 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.function.v2x.events.scenario.scene.airoad.AiRoadMarker; 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; @@ -48,6 +51,10 @@ import com.mogo.och.bus.constant.BusConst; import com.mogo.och.bus.model.BusOrderModel; import com.mogo.och.bus.util.BDRouteDataTestUtils; import com.mogo.och.bus.view.SlidePanelView; +import com.mogo.och.common.module.utils.SoundPoolHelper; + +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.ThreadMode; import mogo.telematics.pad.MessagePad; import record_cache.RecordPanelOuterClass; @@ -67,17 +74,13 @@ public abstract class BaseBusTabFragment private RelativeLayout ctvAutopilotStatus; private ImageView ctvAutopilotStatusIv; private TextView ctvAutopilotStatusTv; - protected TextView tvOperationStatus; + protected TextView tvArrived; protected RelativeLayout mSettingBtn; protected RelativeLayout mBadcaseBtn; protected RelativeLayout mAICollectBtn; - public boolean isOperationStatus;//false-收车,true-出车 private FrameLayout flStationPanelContainer; private Group groupTestPanel; - private FrameLayout flSpeed; -// private BusArcView mouduleArc; private TrafficDataView mTrafficDataView; - private ImageView mUpgradeTipIv; // private BusTrafficLightView mTrafficLightView; public static final String TYPE_ENTRANCE = "entrance"; @@ -105,8 +108,6 @@ public abstract class BaseBusTabFragment return R.layout.bus_base_fragment; } - private View panelView; - @Override protected void initViews() { groupTestPanel = findViewById(R.id.groupTestPanel); @@ -119,12 +120,12 @@ public abstract class BaseBusTabFragment // mTrafficLightView = findViewById(R.id.bus_traffic_light_view); // CallerHmiManager.INSTANCE.setProxyTrafficLightView(mTrafficLightView); - tvOperationStatus = findViewById(R.id.module_mogo_och_operation_status); +// tvOperationStatus = findViewById(R.id.module_mogo_och_operation_status); + tvArrived = findViewById(R.id.module_mogo_och_arrived_tv); - flSpeed = (FrameLayout) findViewById(R.id.fl_speed); mTrafficDataView = (TrafficDataView) findViewById(R.id.bus_arc); - panelView = LayoutInflater.from(getContext()).inflate(getStationPanelViewId(), flStationPanelContainer); + LayoutInflater.from(getContext()).inflate(getStationPanelViewId(), flStationPanelContainer); slidePanelView.setOnSlidePanelMoveToEndListener(onSlideToEndListener); mSwitchMapModeLayout = findViewById(R.id.bus_switch_model_layout); @@ -137,14 +138,21 @@ public abstract class BaseBusTabFragment public void onClickImpl(View v) { //切换地图的远近视图 if (MogoMapUIController.getInstance().getCurrentMapVisualAngle().isLongSight()) { - MogoMarkerManager.getInstance(AbsMogoApplication.getApp()).visibleAllMarkers(); + // 2.11.0去掉 +// MogoMarkerManager.getInstance(AbsMogoApplication.getApp()).visibleAllMarkers(); MogoMapUIController.getInstance().changeMapVisualAngle(VisualAngleMode.MODE_MEDIUM_SIGHT, null); mSwitchMapModeImage.setImageResource(R.drawable.bus_switch_map_medium); } else if (MogoMapUIController.getInstance().getCurrentMapVisualAngle().isMediumSight()) { - MogoMarkerManager.getInstance(AbsMogoApplication.getApp()) - .inVisibleWithoutMarkers(DataTypes.TYPE_MARKER_ADAS, BusConst.TYPE_MARKER_BUS_ORDER); + // 2.11.0去掉 +// MogoMarkerManager.getInstance(AbsMogoApplication.getApp()) +// .inVisibleWithoutMarkers(DataTypes.TYPE_MARKER_ADAS, BusConst.TYPE_MARKER_BUS_ORDER); MogoMapUIController.getInstance().changeMapVisualAngle(VisualAngleMode.MODE_LONG_SIGHT, null); mSwitchMapModeImage.setImageResource(R.drawable.bus_switch_map_long); + } else { + // 2.11.0去掉 +// MogoMarkerManager.getInstance(AbsMogoApplication.getApp()).visibleAllMarkers(); + MogoMapUIController.getInstance().changeMapVisualAngle(VisualAngleMode.MODE_MEDIUM_SIGHT, null); + mSwitchMapModeImage.setImageResource(R.drawable.bus_switch_map_medium); } } }); @@ -160,19 +168,15 @@ public abstract class BaseBusTabFragment }); } initListener(); + setAutopilotBtnStatus(CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState()); ctvAutopilotStatus.setOnClickListener(new OnPreventFastClickListener(){ @Override public void onClickImpl(View v) { - if (CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState() != IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE){ - restartAutopilot(); - }else { - ToastUtils.showShort(getResources().getString(R.string.bus_auto_disable_tip)); - } + restartAutopilot(); } }); - setAutopilotBtnStatus(CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState()); // 模拟 不可自动驾驶,目前场景是刚开机,adas还未和工控机连接 findViewById(R.id.btnAutopilotDisable).setOnClickListener(view -> debugAutoPilotStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE) @@ -194,9 +198,9 @@ public abstract class BaseBusTabFragment ); findViewById(R.id.btnAutopilotRoute).setOnClickListener(view -> debugArrivedRoute()); - - tvOperationStatus.setOnClickListener(view -> { - onChangeOperationStatus(); + + tvArrived.setOnClickListener(view -> { + onArriveStation(); }); mSettingBtn = findViewById(R.id.module_mogo_och_setting_layout); @@ -207,11 +211,6 @@ public abstract class BaseBusTabFragment // mBadcaseBtn的visible显示逻辑在showBadcaseEntrance内处理 mBadcaseBtn = findViewById(R.id.module_mogo_och_badcase_rl); -// CallerHmiManager.INSTANCE.registerBadCaseCallback( -// () -> { // onShow() -// return mBadcaseBtn; }, -// () -> { // onHide() -// return null; }); if (mBadcaseBtn != null) { CallerDevaToolsManager.INSTANCE.initBadCase(mBadcaseBtn); @@ -226,6 +225,16 @@ public abstract class BaseBusTabFragment } } + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container + , @Nullable Bundle savedInstanceState) { + EventBus.getDefault().register(this); + return super.onCreateView(inflater, container, savedInstanceState); + } + + protected abstract void onArriveStation(); + private void updateSwitchMapIcon(){ if (MogoMapUIController.getInstance().getCurrentMapVisualAngle().isLongSight()) { mSwitchMapModeImage.setImageResource(R.drawable.bus_switch_map_long); @@ -246,6 +255,7 @@ public abstract class BaseBusTabFragment if (!HmiBuildConfig.isShowBadCaseView) { CallerAutopilotRecordListenerManager.INSTANCE.removeListener(TAG); } + EventBus.getDefault().unregister(this); } @@ -270,22 +280,32 @@ public abstract class BaseBusTabFragment MogoApisHandler.getInstance().getApis().getRegisterCenterApi().registerMogoMapListener(TYPE_ENTRANCE, this); } - protected void onChangeOperationStatus() { - - } - /** * 展示滑动按钮 * * @param text 指定的文字 */ - public void showSlidePanle(String text) { - if (isOperationStatus) { - getActivity().runOnUiThread(() -> { - slidePanelView.setText(text); - slidePanelView.setVisibility(View.VISIBLE); - }); - } + public void showSlidePanel(String text) { + getActivity().runOnUiThread(() -> { + slidePanelView.setText(text); + slidePanelView.setVisibility(View.VISIBLE); + }); + setArrivedClikable(false); + } + + /** + * 设置进站按钮状态 + * @param isClickable + */ + public void setArrivedClikable(boolean isClickable){ + getActivity().runOnUiThread(() -> { + tvArrived.setEnabled(isClickable); + if (isClickable){ + tvArrived.setTextColor(getResources().getColor(R.color.bus_white)); + }else { + tvArrived.setTextColor(getResources().getColor(R.color.bus_arrived_btn_un_clickable_color)); + } + }); } /** @@ -297,12 +317,9 @@ public abstract class BaseBusTabFragment }); } - public void showNotice(String notice) { - getActivity().runOnUiThread(() -> { - AIAssist.getInstance(getContext()).speakTTSVoice(notice); - }); + public void playDI(){ + SoundPoolHelper.getSoundPoolHelper().playSoundWithRedId(getContext(), R.raw.bus_di); } - /** * 改变自动驾驶状态 * @@ -321,13 +338,13 @@ public abstract class BaseBusTabFragment ctvAutopilotStatusTv.setText(getResources().getString(R.string.bus_loading_autopilot_runnig_tv)); ctvAutopilotStatusIv.setImageResource(R.drawable.bus_disable_autopilot_icon); ctvAutopilotStatus.setSelected(false); - ctvAutopilotStatus.setFocusableInTouchMode(true); + ctvAutopilotStatus.setClickable(true); } else { ctvAutopilotStatusTv.setTextColor(getResources().getColor(R.color.bus_autopilot_text_color_normal)); ctvAutopilotStatusTv.setText(getResources().getString(R.string.bus_loading_autopilot_runnig_tv)); ctvAutopilotStatusIv.setImageResource(R.drawable.bus_ic_autopilot); - ctvAutopilotStatus.setFocusableInTouchMode(true); + ctvAutopilotStatus.setClickable(true); if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE == autopilotStatus) {//1可用 ctvAutopilotStatus.setSelected(false); }else if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING == autopilotStatus){ @@ -343,12 +360,12 @@ public abstract class BaseBusTabFragment ctvAutopilotStatusTv.setTextColor(getResources().getColor(R.color.bus_autopilot_text_color_normal)); ctvAutopilotStatusTv.setText(getResources().getString(R.string.bus_loading_autopilot_success_tv)); ctvAutopilotStatus.setSelected(false); - ctvAutopilotStatus.setFocusableInTouchMode(false); + ctvAutopilotStatus.setClickable(false); }else { ctvAutopilotStatusIv.setImageResource(R.drawable.bus_wrong_autopilot_icon); ctvAutopilotStatusTv.setTextColor(getResources().getColor(R.color.bus_autopilot_text_color_normal)); ctvAutopilotStatusTv.setText(getResources().getString(R.string.bus_loading_autopilot_failure_tv)); - ctvAutopilotStatus.setFocusableInTouchMode(false); + ctvAutopilotStatus.setClickable(false); ctvAutopilotStatus.setSelected(false); } UiThreadHandler.postDelayed(new Runnable() { @@ -368,14 +385,18 @@ public abstract class BaseBusTabFragment return; } if (isAnimateRunning){ - stopAutopilotAnimation(); - updateAutopilotStatus(autopilotStatus); + stopAnimAndUpdateBtnStatus(); }else { setAutopilotBtnStatus(autopilotStatus); } } + public void stopAnimAndUpdateBtnStatus(){ + stopAutopilotAnimation(); + updateAutopilotStatus(CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState()); + } + /** * 隐藏【自动驾驶】按钮 */ @@ -395,22 +416,6 @@ public abstract class BaseBusTabFragment }); } - public void hidPanel() { - getActivity().runOnUiThread(() -> { - flStationPanelContainer.setVisibility(View.GONE); - }); - } - - public void showPanel() { - getActivity().runOnUiThread(() -> { - flStationPanelContainer.setVisibility(View.VISIBLE); - }); - } - - public View getPanelView() { - return panelView; - } - public SlidePanelView.OnSlidePanelMoveToEndListener getSlidePanelOnEndListener() { return null; } @@ -442,7 +447,7 @@ public abstract class BaseBusTabFragment ctvAutopilotStatusTv.setText(getResources().getString(R.string.bus_loading_autopilot_tv)); ctvAutopilotStatusTv.setTextColor(getResources().getColor(R.color.bus_autopilot_text_color_normal)); ctvAutopilotStatus.setSelected(false); - ctvAutopilotStatus.setFocusableInTouchMode(true); + ctvAutopilotStatus.setClickable(true); ctvAutopilotStatusIv.setImageResource(R.drawable.bus_loading_autopilot_icon); if (autopilotLoadingAnimator == null) { autopilotLoadingAnimator = ObjectAnimator.ofFloat(ctvAutopilotStatusIv, "rotation", 0f, 360f); 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 ff6d6b5d2c..4ca1a90fa8 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 @@ -3,18 +3,23 @@ package com.mogo.och.bus.fragment; import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS; import android.content.Intent; +import android.os.Bundle; import android.view.View; import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.constraintlayout.widget.Group; +import androidx.annotation.Nullable; +import com.alibaba.android.arouter.launcher.ARouter; import com.mogo.commons.AbsMogoApplication; -import com.mogo.commons.debug.DebugConfig; -import com.mogo.commons.voice.AIAssist; import com.mogo.eagle.core.data.map.CenterLine; +import com.mogo.eagle.core.data.temp.EventLogout; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener; import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager; import com.mogo.eagle.core.function.call.map.CallerHDMapManager; +import com.mogo.eagle.core.function.call.map.CallerSmpManager; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.util.ToastUtils; import com.mogo.map.MogoMarkerManager; @@ -24,14 +29,21 @@ import com.mogo.och.bus.R; import com.mogo.och.bus.bean.BusStationBean; import com.mogo.och.bus.constant.BusConst; import com.mogo.och.bus.presenter.BusPresenter; +import com.mogo.och.bus.ui.BusStationCommonItem; import com.mogo.och.bus.ui.BusSwitchLineActivity; import com.mogo.och.bus.view.SlidePanelView; +import com.mogo.och.common.module.biz.constant.OchCommonConst; +import com.mogo.och.common.module.biz.provider.LoginService; +import com.mogo.och.common.module.utils.BlinkAnimationUtil; import com.mogo.och.common.module.utils.OCHThreadPoolManager; +import com.mogo.och.common.module.wigets.MarqueeTextView; +import com.mogo.och.common.module.wigets.OCHCommitDialog; + +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; import java.util.List; -import mogo.telematics.pad.MessagePad; - /** * 网约车小巴界面 @@ -40,69 +52,81 @@ import mogo.telematics.pad.MessagePad; */ public class BusFragment extends BaseBusTabFragment implements SlidePanelView.OnSlidePanelMoveToEndListener, View.OnClickListener { - private static final String TAG = "BusFragment"; + public static final String TAG = "BusFragment"; - private TextView mCurrentStationName; - private TextView mNextStationName; - private TextView mCurrentTag; - private TextView mNextTag; private TextView mSwitchLine; //切换路线 - private TextView mLineName; - private int mCurrentStation = 0; - - private View mBus; + private MarqueeTextView mLineName; + private TextView mTaskTime; + private Group groupStationsPanel; + private ConstraintLayout noDataView; private BusStationBean startStation = null; private BusStationBean endStation = null; + private BusStationCommonItem firstStationItem; + private BusStationCommonItem secondStationItem; + private BusStationCommonItem thirdStationItem; + + private LoginService loginService; @Override public String getTagName() { return "BusFragment"; } + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + loginService = (LoginService) ARouter.getInstance().build(OchCommonConst.LOGINSERVICE).navigation(); + if(loginService!=null){ + loginService.registerFragment(this, getPresenter()); + } + } + @Override + public void onDestroyView() { + super.onDestroyView(); + loginService.unRegisterFragment(); + loginService = null; + } + @Override protected void initViews() { super.initViews(); - mBus = findViewById(R.id.module_och_bus_tag); - mCurrentStationName = findViewById(R.id.module_och_bus_current_station); - mCurrentTag = findViewById(R.id.module_och_bus_current_station_anchor); - mNextStationName = findViewById(R.id.module_och_bus_order_end_station); - mNextTag = findViewById(R.id.module_och_bus_next_station_anchor); + mSwitchLine = findViewById(R.id.switch_line_btn); + mSwitchLine.setTag(0); mLineName = findViewById(R.id.module_och_bus_line_name); - if (DebugConfig.isDebug()) { - mBus.setOnClickListener(view -> { - ToastUtils.showShort("重置了车站状态"); - mPresenter.queryBusRoutes(); - }); - - //debug下调用测试面板 - mCurrentStationName.setOnLongClickListener(v -> { - debugTestBar(); - showHideTestBar(); - return true; - }); - } + firstStationItem = findViewById(R.id.bus_panel_first_station); + secondStationItem = findViewById(R.id.bus_panel_second_station); + thirdStationItem = findViewById(R.id.bus_panel_third_station); + mTaskTime = findViewById(R.id.bus_task_time_tv); + groupStationsPanel = findViewById(R.id.group_stations_panel); + noDataView = findViewById(R.id.no_line_data_view); CallerLogger.INSTANCE.d(M_BUS + TAG, "initView: " + CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState()); // 初始化的时候设置 UI 按钮状态 - switch (CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState()) { - case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE: - hideAutopilotBiz(); - break; - case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE: - showAutopilotBiz(); - onAutopilotStatusChanged(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE); - break; - case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING: - showAutopilotBiz(); - onAutopilotStatusChanged(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING); - break; - default: - break; - } + showAutopilotBiz(); + mSwitchLine.setOnClickListener(this); + + mLineName.setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + showHideTestBar(); + return false; + } + }); + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void changeOverview(EventLogout eventLogout){ + CallerLogger.INSTANCE.d(M_BUS + TAG,"changeOverview Event消息去登出"); + mPresenter.logout(); + } + + @Override + protected void onArriveStation() { + mPresenter.onAutopilotArriveAtStation(null); } @Override @@ -121,124 +145,237 @@ public class BusFragment extends BaseBusTabFragment super.onResume(); } - /** - * 根据站点列表信息刷新车站面板,滑块面板 - * - * @param stationList 车站列表信息 - * @param currentStation 当前站点 - * @param nextStation 下个站点 - * @param isArrived 是否都站 - */ - public void refreshBusStations(String lineName,List stationList - , int currentStation, int nextStation, boolean isArrived) { - mCurrentStation = currentStation; + public void hideStationsPanel(){ + groupStationsPanel.setVisibility(View.GONE); + noDataView.setVisibility(View.VISIBLE); + } + + public void showStationsPanel(){ + groupStationsPanel.setVisibility(View.VISIBLE); + noDataView.setVisibility(View.GONE); + } + + public void updateLineEmptyUI(){ + setArrivedClikable(false); + showOrHideSwitchLineBtn(true); + hideStationsPanel(); + hideSlidePanel(); + resetStationBlinkAnim(); + } + + private void resetStationBlinkAnim() { + BlinkAnimationUtil.clearAnimation(firstStationItem.getCircleImageView()); + BlinkAnimationUtil.clearAnimation(secondStationItem.getCircleImageView()); + BlinkAnimationUtil.clearAnimation(thirdStationItem.getCircleImageView()); + } + + public void updateBusTaskStatus(String lineName, String lineTime, + List stationList, + int arrivingOrArrivedIndex, + boolean isArrived){ + if (getActivity() == null) { return; } + getActivity().runOnUiThread(() -> { if (stationList == null) { // 获取小巴数据失败 return; } + showStationsPanel(); + showOrHideSwitchLineBtn(false); + + mLineName.setText(lineName); + mTaskTime.setText(getString(R.string.bus_line_time_tag)+ lineTime); // 渲染小巴路线数据 - renderCurrentStationStatus(lineName,stationList, currentStation, nextStation, isArrived); + updateBusStationStatus(stationList,arrivingOrArrivedIndex,isArrived); }); } - /** - * 重新刷新站点信息 isArrived 是否到站 - */ - 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; - - boolean isArriveEndStation = false; - boolean isArriveAtStation = false; - boolean isArriveAtStartStation = false; - - mLineName.setText(lineName); - - // 获取当前站点的名称 - currentStationName = stationList.get(currentStation).getName(); + private void updateBusStationStatus(List stationList, + int arrivingOrArrivedIndex, + boolean isArrived) { startStation = stationList.get(0); endStation = stationList.get(stationList.size() - 1); - // 是否到达起点 - if (currentStation == 0) { - isArriveAtStartStation = true; - mCurrentTag.setText(getResources().getString(R.string.bus_arrive_to_end_start)); + if (arrivingOrArrivedIndex == stationList.size() - 1 && isArrived){ + //切换路线和结束路线按钮切换 + showSlidePanel("单程结束"); - setOrRemoveMapMaker(true, BusConst.BUS_START_MAP_MAKER, startStation.getLat() - , startStation.getLon(),R.raw.star_marker); - setOrRemoveMapMaker(true, BusConst.BUS_END_MAP_MAKER, endStation.getLat() + setOrRemoveMapMaker(false, BusConst.BUS_END_MAP_MAKER, endStation.getLat() , 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)); + }else if (arrivingOrArrivedIndex == 0 && isArrived){ - setOrRemoveMapMaker(false, BusConst.BUS_START_MAP_MAKER, startStation.getLat() - , startStation.getLon(),R.raw.star_marker); - setOrRemoveMapMaker(true, BusConst.BUS_END_MAP_MAKER, endStation.getLat() - , endStation.getLon(),R.raw.end_marker); - } else if (currentStation == stationList.size() - 1) {// 是否到达终点 - isArriveEndStation = true; - nextStationName = "--"; - mNextTag.setText(getResources().getString(R.string.bus_arrive_to_end_end)); + showSlidePanel("滑动出发"); - setOrRemoveMapMaker(false, BusConst.BUS_START_MAP_MAKER, startStation.getLat() - , startStation.getLon(),R.raw.star_marker); - - if (isArrived) { - setOrRemoveMapMaker(false, BusConst.BUS_END_MAP_MAKER, endStation.getLat() - , endStation.getLon(),R.raw.end_marker); - } else { - setOrRemoveMapMaker(true, BusConst.BUS_END_MAP_MAKER, endStation.getLat() - , endStation.getLon(),R.raw.end_marker); + setOrRemoveMapMaker(true, BusConst.BUS_START_MAP_MAKER, + startStation.getLat(), startStation.getLon(),R.raw.star_marker); + setOrRemoveMapMaker(true, BusConst.BUS_END_MAP_MAKER, + endStation.getLat(), endStation.getLon(),R.raw.end_marker); + }else{ + if (isArrived){ + // 重置滑动按钮文字 + showSlidePanel("滑动出发"); } + + setOrRemoveMapMaker(false, BusConst.BUS_START_MAP_MAKER, startStation.getLat() + , startStation.getLon(),R.raw.star_marker); + setOrRemoveMapMaker(true, BusConst.BUS_END_MAP_MAKER, endStation.getLat() + , endStation.getLon(),R.raw.end_marker); } - // 获取下一站点名称 - if (nextStation > currentStation && nextStation <= stationList.size() - 1) { - nextStationName = stationList.get(nextStation).getName(); - } - - // 是否到达终点 - if ( nextStation == stationList.size() - 1 || nextStation == -1) { - mNextTag.setText(getResources().getString(R.string.bus_arrive_to_end_end)); + if (stationList.size() > 2){ //只有两个站点 + updateMoreThanTwoStationsUI(stationList,arrivingOrArrivedIndex,isArrived); }else { - mNextTag.setText(getResources().getString(R.string.bus_arrive_to_next_tag)); + updateTwoStationsUI(stationList,arrivingOrArrivedIndex,isArrived); } - if (currentStation == 0 && isArrived){ - showOrHideSwitchLineBtn(true); - }else { - showOrHideSwitchLineBtn(false); - } - - // 重置滑动按钮文字 - if (isArriveEndStation) { - showSlidePanle("单程结束"); - } else if (isArriveAtStartStation) { - showSlidePanle("滑动出发"); - } else if (isArriveAtStation) { - showSlidePanle("滑动出发"); - } - - mCurrentStationName.setText(currentStationName); - mNextStationName.setText(nextStationName); updateBusTestBarInfo(); } - private void showOrHideSwitchLineBtn(boolean isShow) { - if (isShow){ - mSwitchLine.setVisibility(View.VISIBLE); + /** + * 有两个以上站点的路线 + * @param stationList + * @param arrivingOrArrivedIndex + * @param isArrived + */ + private void updateMoreThanTwoStationsUI(List stationList, + int arrivingOrArrivedIndex, + boolean isArrived) { + secondStationItem.setStationTag(""); + secondStationItem.showOrHideStationArrowBg(true); + thirdStationItem.setStationTag(""); + secondStationItem.setVisibility(View.VISIBLE); + thirdStationItem.showOrHideStationArrowBg(false); + + if (arrivingOrArrivedIndex == 0 || arrivingOrArrivedIndex -1 == 0 + || (arrivingOrArrivedIndex -2 == 0 && stationList.size() == 3)){ + firstStationItem.setStationTag(getResources().getString(R.string.bus_station_txt_tag_start)); }else { - mSwitchLine.setVisibility(View.GONE); + firstStationItem.setStationTag(""); + } + + if (arrivingOrArrivedIndex + 1 == stationList.size() - 1 || arrivingOrArrivedIndex == stationList.size() - 1 + || (arrivingOrArrivedIndex == 0 && arrivingOrArrivedIndex + 2 == stationList.size() - 1)){ //确认是否显示 "终" + thirdStationItem.setStationTag(getResources().getString(R.string.bus_station_txt_tag_end)); + }else { + thirdStationItem.setStationTag(""); + } + + //圆点: 0:灰色 过站 1:绿色 到站或者即将到站 2:蓝色:未到站 + if (arrivingOrArrivedIndex == 0 && isArrived){ + firstStationItem.setStationNameColor(getResources().getColor(R.color.bus_line_station_color_selected)); + secondStationItem.setStationNameColor(getResources().getColor(R.color.bus_arrived_station_name_text_color)); + thirdStationItem.setStationNameColor(getResources().getColor(R.color.bus_arrived_station_name_text_color)); + + firstStationItem.setStationName(stationList.get(0).getName()); + secondStationItem.setStationName(stationList.get(1).getName()); + thirdStationItem.setStationName(stationList.get(2).getName()); + + firstStationItem.setStationPointBg(1); + secondStationItem.setStationPointBg(2); + thirdStationItem.setStationPointBg(2); + + firstStationItem.setStationArrowBg(2); + secondStationItem.setStationArrowBg(2); + + }else if (arrivingOrArrivedIndex == stationList.size() - 1){ + firstStationItem.setStationNameColor(getResources().getColor(R.color.bus_station_tag_txt_un_color)); + secondStationItem.setStationNameColor(getResources().getColor(R.color.bus_station_tag_txt_un_color)); + thirdStationItem.setStationNameColor(getResources().getColor(R.color.bus_line_station_color_selected)); + + firstStationItem.setStationName(stationList.get(arrivingOrArrivedIndex -2).getName()); + secondStationItem.setStationName(stationList.get(arrivingOrArrivedIndex -1).getName()); + thirdStationItem.setStationName(stationList.get(arrivingOrArrivedIndex).getName()); + + firstStationItem.setStationPointBg(0); + secondStationItem.setStationPointBg(0); + thirdStationItem.setStationPointBg(1); + + firstStationItem.setStationArrowBg(0); + if (isArrived){ + secondStationItem.setStationArrowBg(0); + }else { + secondStationItem.setStationArrowBg(1); + } + + }else { + firstStationItem.setStationNameColor(getResources().getColor(R.color.bus_station_tag_txt_un_color)); + secondStationItem.setStationNameColor(getResources().getColor(R.color.bus_line_station_color_selected)); + thirdStationItem.setStationNameColor(getResources().getColor(R.color.bus_arrived_station_name_text_color)); + + firstStationItem.setStationName(stationList.get(arrivingOrArrivedIndex -1).getName()); + secondStationItem.setStationName(stationList.get(arrivingOrArrivedIndex).getName()); + thirdStationItem.setStationName(stationList.get(arrivingOrArrivedIndex + 1).getName()); + + firstStationItem.setStationPointBg(0); + secondStationItem.setStationPointBg(1); + thirdStationItem.setStationPointBg(2); + + secondStationItem.setStationArrowBg(2); + if (isArrived){ + firstStationItem.setStationArrowBg(0); + }else { + firstStationItem.setStationArrowBg(1); + } + } + + } + + /** + * 只有两个站点的路线 + * @param stationList + * @param arrivingOrArrivedIndex + * @param isArrived + */ + private void updateTwoStationsUI(List stationList, + int arrivingOrArrivedIndex, + boolean isArrived) { + + secondStationItem.setVisibility(View.GONE); + secondStationItem.showOrHideStationArrowBg(false); + thirdStationItem.showOrHideStationArrowBg(false); + + firstStationItem.setStationTag(getResources().getString(R.string.bus_station_txt_tag_start)); + thirdStationItem.setStationTag(getResources().getString(R.string.bus_station_txt_tag_end)); + + firstStationItem.setStationName(stationList.get(0).getName()); + thirdStationItem.setStationName(stationList.get(1).getName()); + + //圆点: 0:灰色 过站 1:绿色 到站或者即将到站 2:蓝色:未到站 + if (arrivingOrArrivedIndex == 0 && isArrived){//到站 + firstStationItem.setStationNameColor(getResources().getColor(R.color.bus_line_station_color_selected)); + thirdStationItem.setStationNameColor(getResources().getColor(R.color.bus_arrived_station_name_text_color)); + firstStationItem.setStationPointBg(1); + firstStationItem.setStationArrowBg(2); + thirdStationItem.setStationPointBg(0); + + }else { + firstStationItem.setStationNameColor(getResources().getColor(R.color.bus_station_tag_txt_un_color)); + thirdStationItem.setStationNameColor(getResources().getColor(R.color.bus_line_station_color_selected)); + if (isArrived){ //到终点 + firstStationItem.setStationPointBg(0); + firstStationItem.setStationArrowBg(0); + thirdStationItem.setStationPointBg(1); + + }else { //到终点途中 + firstStationItem.setStationPointBg(0); + firstStationItem.setStationArrowBg(1); + thirdStationItem.setStationPointBg(1); + } + } + } + + private void showOrHideSwitchLineBtn(boolean isShow) { + if (isShow){//显示切换路线 + mSwitchLine.setTag(0); + mSwitchLine.setText(getResources().getString(R.string.bus_switch_line_btn)); + }else {//显示结束路线 + mSwitchLine.setTag(1); + mSwitchLine.setText(getResources().getString(R.string.bus_close_line_btn)); } } @@ -269,7 +406,7 @@ public class BusFragment extends BaseBusTabFragment if (isAnimateRunning){ stopAutopilotAnimation(); } - mPresenter.autoDriveToNextStation(false); + mPresenter.autoDriveToNextStation(); } /** @@ -283,40 +420,19 @@ public class BusFragment extends BaseBusTabFragment } } - @Override - protected void onChangeOperationStatus() { - super.onChangeOperationStatus(); - mPresenter.onChangeOperationStatus(); - } - - /** - * 修改经营状态 - * - * @param launch true-收车,false-出车 - */ - public void changeOperationStatus(boolean launch) { - isOperationStatus = launch; - if (launch) { - // 出车的时候重制站点状态 - mPresenter.queryBusRoutes(); - tvOperationStatus.setText("收车"); - showPanel(); - } else { - AIAssist.getInstance(getContext()).speakTTSVoice("已收车"); - tvOperationStatus.setText("出车"); - hideSlidePanel(); - hidPanel(); - - //移除起点终点 - if (null != startStation) { - setOrRemoveMapMaker(false, BusConst.BUS_START_MAP_MAKER, startStation.getLat() - , startStation.getLon(),R.raw.star_marker); - } - if (null != endStation) { - setOrRemoveMapMaker(false, BusConst.BUS_END_MAP_MAKER, endStation.getLat() - , endStation.getLon(),R.raw.end_marker); - } + public void clearBusStationsMarkers(){ + CallerLogger.INSTANCE.d(M_BUS + TAG,"clearBusStationsMarkers()"); + if (null != startStation) { + setOrRemoveMapMaker(false, BusConst.BUS_START_MAP_MAKER, startStation.getLat() + , startStation.getLon(),R.raw.star_marker); } + if (null != endStation) { + setOrRemoveMapMaker(false, BusConst.BUS_END_MAP_MAKER, endStation.getLat() + , endStation.getLon(),R.raw.end_marker); + } + + //清除鹰眼右下角小地图轨迹 + CallerSmpManager.clearPolyline(); } /** @@ -356,7 +472,7 @@ public class BusFragment extends BaseBusTabFragment IMogoMarker marker = MogoMarkerManager.getInstance(AbsMogoApplication.getApp()) .addMarker(uuid, options); CenterLine centerLine = CallerHDMapManager.INSTANCE.getCenterLineInfo( longi,lat,-1); - if (null != centerLine){ // 有可能鹰眼map为空没有角度。判空使用后可能造成maker角度跟道路角度不一致 + if (null != centerLine && marker != null) { // 有可能鹰眼map为空没有角度。判空使用后可能造成maker角度跟道路角度不一致 地图未初始化会返回空 marker.setRotateAngle(centerLine.getAngle().floatValue()); } } @@ -392,12 +508,30 @@ public class BusFragment extends BaseBusTabFragment ToastUtils.showLong(getResources().getString(R.string.bus_switch_line_btn_warning1)); return; } - if (mCurrentStation > 0) { - ToastUtils.showLong(getResources().getString(R.string.bus_switch_line_btn_warning2)); - return; + if ((int)mSwitchLine.getTag() == 0){//切换路线 + Intent intent = new Intent(getContext(), BusSwitchLineActivity.class); + startActivity(intent); + }else {//结束任务 + OCHCommitDialog.Builder builder = new OCHCommitDialog.Builder(); + OCHCommitDialog closeLineConfirmDialog = builder + .title(getString(R.string.bus_dialog_title)) + .tips(getString(R.string.bus_dialog_tips)) + .confirmStr(getString(R.string.bus_dialog_confirm)) + .cancelStr(getString(R.string.bus_dialog_cancel)) + .build(getContext()); + closeLineConfirmDialog.setClickListener(new OCHCommitDialog.ClickListener() { + @Override + public void confirm() { + mPresenter.abortTask(); + } + + @Override + public void cancel() { + closeLineConfirmDialog.dismiss(); + } + }); + closeLineConfirmDialog.show(); } - Intent intent = new Intent(getContext(), BusSwitchLineActivity.class); - startActivity(intent); } } } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/model/BusLineModel.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/model/BusLineModel.java index 3fca5e55d8..c1804854c0 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/model/BusLineModel.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/model/BusLineModel.java @@ -4,12 +4,16 @@ import android.content.Context; import com.mogo.commons.AbsMogoApplication; import com.mogo.eagle.core.utilcode.util.NetworkUtils; +import com.mogo.eagle.core.utilcode.util.SharedPrefs; import com.mogo.eagle.core.utilcode.util.ToastUtils; +import com.mogo.och.bus.bean.BusQueryLineTaskResponse; import com.mogo.och.bus.bean.BusQueryLinesResponse; import com.mogo.och.bus.bean.BusRoutesResponse; import com.mogo.och.bus.callback.IBusLinesCallback; import com.mogo.och.bus.net.BusServiceManager; -import com.mogo.och.bus.net.IBusServiceCallback; +import com.mogo.och.bus.ui.BusSwitchLineActivity; +import com.mogo.och.bus.util.BusSendTripInfoManager; +import com.mogo.och.common.module.biz.network.OchCommonServiceCallback; /** * @author: wangmingjun @@ -39,7 +43,7 @@ public class BusLineModel { mBusLinesCallback = callback; } public void queryBusLines(){ - BusServiceManager.getInstance().queryBusLines(mContext, new IBusServiceCallback() { + BusServiceManager.queryBusLines(mContext, new OchCommonServiceCallback() { @Override public void onSuccess(BusQueryLinesResponse data) { if (null == data && mBusLinesCallback != null) { @@ -53,7 +57,7 @@ public class BusLineModel { } @Override - public void onFail(String failMsg) { + public void onFail(int code, String failMsg) { if (!NetworkUtils.isConnected(mContext)) { ToastUtils.showShort("网络异常,请稍后重试"); }else { @@ -63,21 +67,52 @@ public class BusLineModel { }); } - public void commitSwitchLineId(int lineId){ - BusServiceManager.getInstance().resetStationStatus(mContext,lineId, new IBusServiceCallback() { + /** + * 通过线路id 查询线路排班表 + * @param lineId + * @param position 位置 + */ + public void queryBusLineTasksById(int lineId, int position,boolean autoRefresh){ + BusServiceManager.queryBusTaskByLineId(mContext, String.valueOf(lineId),new OchCommonServiceCallback() { + @Override + public void onSuccess(BusQueryLineTaskResponse data) { + if (null == data && mBusLinesCallback != null) { + mBusLinesCallback.onBusLineTasks(null,position,autoRefresh); + return; + } + + if (mBusLinesCallback != null){ + mBusLinesCallback.onBusLineTasks(data,position,autoRefresh); + } + } + + @Override + public void onFail(int code, String failMsg) { + if (!NetworkUtils.isConnected(mContext)) { + ToastUtils.showShort("网络异常,请稍后重试"); + }else { + ToastUtils.showShort("查询所有绑定路线失败:"+failMsg); + } + } + }); + } + + public void commitSwitchLineId(int taskId,int lineId){ + BusServiceManager.switchLine(mContext,taskId, new OchCommonServiceCallback() { @Override public void onSuccess(BusRoutesResponse o) { + SharedPrefs.getInstance(mContext).putInt(BusSwitchLineActivity.LASTCOMMITLINEID,lineId); if (mBusLinesCallback != null){ mBusLinesCallback.onChangeLineIdSuccess(); } } @Override - public void onFail(String failMsg) { + public void onFail(int code, String failMsg) { if (!NetworkUtils.isConnected(mContext)) { ToastUtils.showShort("网络异常,请稍后重试"); }else { - ToastUtils.showShort("切换路线失败:"+failMsg); + ToastUtils.showShort("选择任务失败:"+failMsg); } } }); 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 d875ea8929..cc1a76cebf 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 @@ -1,20 +1,18 @@ package com.mogo.och.bus.model; -import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_ALIAS_CODE_OCH_BUS_START_AUTOPILOT; -import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_LINK_ADAS; -import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT; import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS; +import static com.mogo.och.bus.constant.BusConst.DELAY_10S; +import static com.mogo.och.bus.constant.BusConst.STATION_STATUS_ARRIVING; import static com.mogo.och.bus.constant.BusConst.STATION_STATUS_STOPPED; import android.content.Context; import android.location.Location; import android.os.Handler; import android.os.Message; -import android.text.TextUtils; -import android.util.Log; import androidx.annotation.NonNull; +import com.alibaba.android.arouter.launcher.ARouter; import com.amap.api.maps.model.LatLng; import com.elegant.network.utils.GsonUtil; import com.mogo.cloud.commons.utils.CoordinateUtils; @@ -25,53 +23,56 @@ import com.mogo.eagle.core.data.BaseData; import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters; import com.mogo.eagle.core.data.config.FunctionBuildConfig; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotPlanningListener; +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener; import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager; import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager; import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotPlanningListenerManager; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; -import com.mogo.eagle.core.utilcode.mogo.logger.Logger; import com.mogo.eagle.core.utilcode.util.NetworkUtils; import com.mogo.eagle.core.utilcode.util.ToastUtils; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; import com.mogo.map.navi.IMogoCarLocationChangedListener2; import com.mogo.module.common.MogoApisHandler; -import com.mogo.och.bus.bean.BusOperationStatusResponse; -import com.mogo.och.bus.bean.BusOrderBean; -import com.mogo.och.bus.bean.BusOrdersResponse; +import com.mogo.och.bus.R; +import com.mogo.och.bus.bean.BusQueryWriteOffPassengersResponse; import com.mogo.och.bus.bean.BusRoutePlanningUpdateReqBean; import com.mogo.och.bus.bean.BusRoutesResponse; import com.mogo.och.bus.bean.BusRoutesResult; import com.mogo.och.bus.bean.BusStationBean; -import com.mogo.och.bus.bean.QueryLeaveAwayPassengersResponse; -import com.mogo.och.bus.callback.ICarOperationStatusCallback; +import com.mogo.och.bus.bean.WriteOffPassenger; +import com.mogo.och.bus.callback.IBusADASStatusCallback; import com.mogo.och.bus.callback.IBusControllerStatusCallback; +import com.mogo.och.bus.callback.IPassengerCallback; import com.mogo.och.bus.callback.IRefreshBusStationsCallback; import com.mogo.och.bus.callback.ISlidePannelHideCallback; import com.mogo.och.bus.constant.BusConst; import com.mogo.och.bus.net.BusServiceManager; -import com.mogo.och.bus.net.IBusServiceCallback; import com.mogo.och.bus.presenter.BusModelLoopManager; import com.mogo.och.bus.util.BusAnalyticsManager; +import com.mogo.och.bus.util.BusSendTripInfoManager; import com.mogo.och.bus.util.BusTrajectoryManager; +import com.mogo.och.common.module.biz.constant.OchCommonConst; +import com.mogo.och.common.module.biz.network.OchCommonServiceCallback; +import com.mogo.och.common.module.biz.provider.LoginService; +import com.mogo.och.common.module.callback.OchAdasStartFailureCallback; +import com.mogo.och.common.module.manager.OCHAdasAbilityManager; import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil; +import com.mogo.och.common.module.utils.DateTimeUtil; +import com.mogo.och.common.module.utils.NumberFormatUtil; import com.mogo.och.common.module.utils.PinYinUtil; +import com.mogo.och.common.module.utils.SoundPoolHelper; +import com.mogo.och.common.module.utils.ToastUtilsOch; +import com.mogo.och.common.module.voice.VoiceNotice; import com.mogo.service.statusmanager.IMogoStatusChangedListener; import com.mogo.service.statusmanager.StatusDescriptor; -import com.zhjt.service.chain.ChainLog; -import com.zhjt.service.chain.TracingConstants; import java.io.IOException; import java.util.ArrayList; import java.util.List; -import java.util.concurrent.TimeUnit; -import io.reactivex.Observable; -import io.reactivex.android.schedulers.AndroidSchedulers; -import io.reactivex.disposables.Disposable; import io.reactivex.exceptions.UndeliverableException; import io.reactivex.functions.Consumer; import io.reactivex.plugins.RxJavaPlugins; -import io.reactivex.schedulers.Schedulers; import mogo.telematics.pad.MessagePad; /** @@ -83,17 +84,13 @@ import mogo.telematics.pad.MessagePad; public class BusOrderModel { private final String TAG = BusOrderModel.class.getSimpleName(); private int currentLineId = -1; + private int currentTaskId = -1; private int backgroundCurrentStationIndex = 0;//A->B 此处值是A站点索引 - /** - * 运营状态、后端更具运营状态来判断车辆是否派单 - */ - private boolean mIsWorking = false; + private static volatile BusOrderModel sInstance; public double mLongitude = 0; public double mLatitude = 0; private Context mContext; - private Disposable mBusOrdersDisposable; //定时轮询小巴车订单 - private List prevBusOrderNos = new ArrayList<>(); private final List stationList = new ArrayList<>(); private BusRoutesResult busRoutesResult = null; /** @@ -105,22 +102,28 @@ public class BusOrderModel { private static final int MSG_QUERY_BUS_STATION = 1001; private static final long QUERY_BUS_STATION_DELAY = 5000; - private ICarOperationStatusCallback carOperationStatusCallback; private IRefreshBusStationsCallback refreshBusStationsCallback; - private ISlidePannelHideCallback slidePannelHideCallback; + private ISlidePannelHideCallback slidePanelHideCallback; private IBusControllerStatusCallback mControllerStatusCallback; //Model->Presenter:VR mode等 + private IPassengerCallback mPassengerCallback; //乘客核销回调 + private IBusADASStatusCallback mADASStatusCallback; List points = new ArrayList<>();//全路径信息 - private boolean hadQueryLeaveAwayPassager = false; - private volatile boolean isArrivedStation = false; + //0: 代表没有启动过 1代表是启动第一次,当>=1 代表是重试 每次到站/路线结束清空置为0 + private volatile int firstStartAutopilot = 0; + + private LoginService loginService; + + private long prePassengerWriteOffTime = 0; //记录最后查询到乘客核销的时间 + private final Handler handler = new Handler(new Handler.Callback() { @Override public boolean handleMessage(Message msg) { if ( msg.what == MSG_QUERY_BUS_STATION ) { - BusOrderModel.getInstance().queryBusRoutes(); + queryBusRoutes(); return true; } return false; @@ -144,6 +147,7 @@ public class BusOrderModel { public void init() { mContext = AbsMogoApplication.getApp(); + loginService = (LoginService) ARouter.getInstance().build(OchCommonConst.LOGINSERVICE).navigation(); // 2021/10/20 衡阳小巴业务,使用LenovoPad时需要此app自己获取坐标并上传 String productFlavor = DebugConfig.getProductFlavor(); if (productFlavor != null && productFlavor.contains("fPadLenovoOchBus")) { @@ -158,6 +162,9 @@ public class BusOrderModel { //自动驾驶路线规划接口 CallerAutopilotPlanningListenerManager.INSTANCE.addListener(TAG, moGoAutopilotPlanningListener); + + //开启自驾后 异常信息返回 + OCHAdasAbilityManager.getInstance().setAdasStartFailureCallback(mAdasStartFailureListener); } //2022.1.28 @@ -196,21 +203,22 @@ public class BusOrderModel { CallerLogger.INSTANCE.d(M_BUS + TAG,"Undeliverable exception"); } }); - - //2021/10/20 轮询小巴车订单,暂时用来播报 - startLoopBusOrders(); } - public void setCarOperationStatusCallback(ICarOperationStatusCallback callback){ - this.carOperationStatusCallback = callback; + public void setAdasStatusCallback(IBusADASStatusCallback callback){ + this.mADASStatusCallback = callback; } public void setRefreshBusStationsCallback(IRefreshBusStationsCallback callback){ this.refreshBusStationsCallback = callback; } - public void setSlidePannelHideCallback(ISlidePannelHideCallback callback){ - this.slidePannelHideCallback = callback; + public void setPassengerCallback(IPassengerCallback callback){ + this.mPassengerCallback = callback; + } + + public void setSlidePanelHideCallback(ISlidePannelHideCallback callback){ + this.slidePanelHideCallback = callback; } public void setControllerStatusCallback(IBusControllerStatusCallback callback) { @@ -258,15 +266,15 @@ public class BusOrderModel { BusStationBean currentStation = stationList.get( backgroundCurrentStationIndex); BusStationBean nextStation = stationList.get( backgroundCurrentStationIndex +1); - BusServiceManager.getInstance().updateOrderRoute(mContext, currentLineId, currentStation.getSiteId() - , nextStation.getSiteId(), points, new IBusServiceCallback() { + BusServiceManager.updateOrderRoute(mContext, currentLineId, currentStation.getSiteId() + , nextStation.getSiteId(), points, new OchCommonServiceCallback() { @Override public void onSuccess(BaseData o) { } @Override - public void onFail(String failMsg) { + public void onFail(int code, String failMsg) { if (isGoingToNextStation){//重试 updateOrderRoute(); } @@ -280,64 +288,10 @@ public class BusOrderModel { updateOrderRoute(); } - /** - * 轮询bus待服务订单 - */ - private void startLoopBusOrders() { - if (mBusOrdersDisposable != null && !mBusOrdersDisposable.isDisposed()) { - return; - } - mBusOrdersDisposable = Observable.interval(BusConst.LOOP_DELAY, - BusConst.LOOP_PERIOD_1S, TimeUnit.MILLISECONDS) - .map((aLong -> aLong + 1)) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(aLong -> queryBusOrders()); - } - - private void queryBusOrders() { - BusServiceManager.getInstance().queryBusOrders(mContext, new IBusServiceCallback() { - @Override - public void onSuccess(BusOrdersResponse o) { - if (o.data != null && o.data.orders != null && o.data.orders.size() > 0) { - CallerLogger.INSTANCE.d( M_BUS + TAG, "获取到bus订单数据: " + o.data.orders.toString() ); - List busOrders = o.data.orders; - for (int i = 0; i < busOrders.size(); i++) { - BusOrderBean order = busOrders.get(i); - if (order == null) return; - if (TextUtils.isEmpty(order.getPassengerPhone())) return; - if (prevBusOrderNos.contains(order.getOrderNo())) continue; - try { - String tailNum = null; - try { - tailNum = order.getPassengerPhone().substring(order.getPassengerPhone().length() - 4); - } catch (Exception e) { - e.printStackTrace(); - tailNum = order.getPassengerPhone(); - } - CallerLogger.INSTANCE.d(M_BUS + TAG, "TTS:" + tailNum); - AIAssist.getInstance(mContext).speakTTSVoice("接到新订单,尾号 " + tailNum - + " 上车站点为 " + order.getStartStationName()); - prevBusOrderNos.add(order.getOrderNo()); - } catch (Exception e) { - e.printStackTrace(); - } - } - } - } - - @Override - public void onFail(String failMsg) { - - } - }); - } - public void release(){ - if (mBusOrdersDisposable != null) { - mBusOrdersDisposable.dispose(); - } + startOrStopOrderLoop(false); + startOrStopQueryPassengerWriteOff(false); MogoApisHandler.getInstance() .getApis() .getStatusManagerApi() @@ -351,6 +305,9 @@ public class BusOrderModel { //自动驾驶路线规划接口 CallerAutopilotPlanningListenerManager.INSTANCE.removeListener(moGoAutopilotPlanningListener); + loginService = null; + + OCHAdasAbilityManager.getInstance().setAdasStartFailureCallback(null); } private Object readResolve() { @@ -370,6 +327,17 @@ public class BusOrderModel { } }; + private final OchAdasStartFailureCallback mAdasStartFailureListener = new OchAdasStartFailureCallback() { + @Override + public void onStartAutopilotFailure(@NonNull String startFailedMessage) { + BusAnalyticsManager.getInstance().triggerStartAutopilotFailureEventByAdas(startFailedMessage); + if (mADASStatusCallback != null && !FunctionBuildConfig.isDemoMode){ + CallerLogger.INSTANCE.e( M_BUS + TAG, "mAdasStartFailureListener = "+startFailedMessage ); + mADASStatusCallback.onStartAdasFailure(); + } + } + }; + // 自车定位 private final IMogoCarLocationChangedListener2 mCarLocationChangedListener2 = new IMogoCarLocationChangedListener2() { @@ -384,15 +352,16 @@ public class BusOrderModel { //是否到站的围栏判断 离站状态并且自动驾驶还未触发到站 if (isGoingToNextStation && !isArrivedStation){ - judgeStartStation(location); + judgeArrivedStation(location); } } }; - //根据围栏判断,是否到达起点 - private void judgeStartStation(Location location) { + //根据围栏判断,是否到达站点 + private void judgeArrivedStation(Location location) { if (backgroundCurrentStationIndex +1 > stationList.size() - 1 ){ + CallerLogger.INSTANCE.e( M_BUS + TAG, "到站数组越界" ); return; } BusStationBean upcomingStation = stationList.get( backgroundCurrentStationIndex +1); @@ -403,15 +372,9 @@ public class BusOrderModel { startLon, startLat, location.getLongitude(), location.getLatitude() ); - Logger.i(TAG, "judgeStartStation() distance = " + distance); - - if ( distance > BusConst.ARRIVE_AT_END_STATION_DISTANCE ) { - distance = CoordinateUtils.calculateLineDistance(startLon, startLat, - CallerAutoPilotStatusListenerManager.INSTANCE.getCurWgs84Lon(), - CallerAutoPilotStatusListenerManager.INSTANCE.getCurWgs84Lat()); - } - if ( distance <= BusConst.ARRIVE_AT_END_STATION_DISTANCE ) { + CallerLogger.INSTANCE.d(M_BUS + TAG,"行程日志-judgeArrivedStation() distance = " + distance + +" to " + upcomingStation.getName()); onArriveAt(null); //无自动驾驶到站信息传null return; } @@ -422,87 +385,129 @@ public class BusOrderModel { */ public void queryBusRoutes() { CallerLogger.INSTANCE.d(M_BUS + TAG, "查询小巴路线"); - BusServiceManager.getInstance().queryBusRoutes(mContext, new IBusServiceCallback() { + BusServiceManager.queryBusRoutes(mContext, new OchCommonServiceCallback() { @Override public void onSuccess(BusRoutesResponse data) { if ( data == null || data.getResult() == null || data.getResult().getSites() == null || data.getResult().getSites().isEmpty() ) { + //当为空时,显示无绑定路线图 + CallerLogger.INSTANCE.d(M_BUS + TAG, "获取到小巴路线数据:空 " ); + if (refreshBusStationsCallback != null){ + refreshBusStationsCallback.updateEmptyUi(); + } + clearAutopilotControlParameters(); + closeBeautificationMode(); + clearStartAutopilotTag(); return; } CallerLogger.INSTANCE.d(M_BUS + TAG, "获取到小巴路线数据: " + data ); - renderBusStationsStatus( data.getResult()); + updateBusStatus( data.getResult()); } @Override - public void onFail(String failMsg) { + public void onFail(int code, String failMsg) { // 重复请求小巴路线,直至成功 - queryBusStationDelay(); + //改为任务,为空不再去一直取 +// queryBusStationDelay(); } }); } /** - * 测试、重置站点状态 + * 更新正在运行的任务UI + * @param stations */ - public void debugResetStationStatus() { - CallerLogger.INSTANCE.d( M_BUS + TAG, "测试、重置站点状态"); - BusServiceManager.getInstance().resetStationStatus(mContext, currentLineId - , new IBusServiceCallback() { - @Override - public void onSuccess(BusRoutesResponse o) { - CallerLogger.INSTANCE.d(M_BUS + TAG, "获取到小巴路线数据: " + o); - isGoingToNextStation = false; - if (o.getResult() == null || o.getResult().getSites() == null || o.getResult().getSites().isEmpty()) { - return; + private void updateBusTaskStatus(List stations) { + + int arrivingOrArrivedStationIndex = 0;//已经到站或者即将到站的索引呢 + + for (int i =0 ; i< stations.size(); i++){ + BusStationBean station = stations.get(i); + + if (i == 0){ // 首发站 显示在最上面 + if (station.getDrivingStatus() == STATION_STATUS_STOPPED + && !station.isLeaving()){ //到达第一站 + arrivingOrArrivedStationIndex = i; + break; + } + }else { + BusStationBean preStation = stations.get(i-1); + if ((station.getDrivingStatus() == STATION_STATUS_STOPPED && !station.isLeaving()) + || (station.getDrivingStatus() == STATION_STATUS_ARRIVING + && preStation.isLeaving())){ + //到站未离开 | 即将到站 显示在最中间 + arrivingOrArrivedStationIndex = i; + break; } - renderBusStationsStatus(o.getResult()); } + } - @Override - public void onFail(String failMsg) { - // 重复请求小巴路线,直至成功 - queryBusStationDelay(); + BusStationBean arrivingOrArrivedStation = stations.get(arrivingOrArrivedStationIndex); + + String lineTime = DateTimeUtil.formatLongToString( + busRoutesResult.getTaskTime(), + DateTimeUtil.TAXI_HH_mm); + + if (arrivingOrArrivedStationIndex == 0 || + arrivingOrArrivedStation.getDrivingStatus() == STATION_STATUS_STOPPED + && !arrivingOrArrivedStation.isLeaving()){ + if (refreshBusStationsCallback != null){ + refreshBusStationsCallback.updateBusTaskStatus(busRoutesResult.getName(),lineTime, + stationList,arrivingOrArrivedStationIndex,true); } - }); - + clearAutopilotControlParameters(); + }else { + if (refreshBusStationsCallback != null){ + refreshBusStationsCallback.updateBusTaskStatus(busRoutesResult.getName(),lineTime, + stationList,arrivingOrArrivedStationIndex,false); + } + updateAutopilotControlParameters(); + } } /** - * 离站上报 + * 重置路线站点状态--结束路线,当前路线恢复到始发站 */ - public void leaveStation(boolean isOneWayOver,boolean isRestart){ - CallerLogger.INSTANCE.d(M_BUS + TAG,"leaveStation-backgroundCurrentStationIndex = "+backgroundCurrentStationIndex); - BusServiceManager.getInstance().leaveStation(mContext, stationList.get(backgroundCurrentStationIndex).getSeq() - , stationList.get(backgroundCurrentStationIndex).getSiteId(), new IBusServiceCallback() { + public void abortTask() { + CallerLogger.INSTANCE.d( M_BUS + TAG, "结束当前路线abortTask"); + BusServiceManager.abortTask(mContext, currentTaskId + , new OchCommonServiceCallback() { @Override - public void onSuccess(BusRoutesResponse o) { - if ( o.getResult() == null || o.getResult().getSites() == null || o.getResult().getSites().isEmpty() ) { - return; - } - isArrivedStation = false; - if (!isOneWayOver){ - CallerLogger.INSTANCE.d( M_BUS + TAG, "自动驾驶开启开往下一站====" ); - //需要更改当前站和下一站的状态 然后渲染 - leaveStationSuccess(o.getResult(),isRestart); - }else { - CallerLogger.INSTANCE.d( M_BUS + TAG, "单程真的结束了====" ); - isGoingToNextStation = false; - backgroundCurrentStationIndex = 0; - CallerAutoPilotManager.INSTANCE.cancelAutoPilot(); + public void onSuccess(BaseData o) { + CallerLogger.INSTANCE.d(M_BUS + TAG, "abortTask success: " + o); + if (o.code == 0){ // 重置成功 + endOrAbortTaskSuccess(); + clearBusStationDatas(); queryBusRoutes(); + startOrStopQueryPassengerWriteOff(false); } } + @Override - public void onFail(String failMsg) { - if (!NetworkUtils.isConnected(mContext)) { - ToastUtils.showShort("网络异常,请稍后重试"); - }else{ - ToastUtils.showShort("离站上报失败:"+failMsg); - } + public void onFail(int code, String failMsg) { + ToastUtils.showShort(failMsg); } }); + + } + + /** + * 中断或者正常结束任务后的处理 + */ + private void endOrAbortTaskSuccess() { + + isGoingToNextStation = false; + backgroundCurrentStationIndex = 0; + + if (busRoutesResult != null){ + BusSendTripInfoManager.INSTANCE.sendBusTripInfo(BusSendTripInfoManager.END_TRIP + , busRoutesResult.getName() + ,"" + ,"" + ,false); + } } /** @@ -510,47 +515,550 @@ public class BusOrderModel { * 服务端返回的OchBusRoutesResult逻辑, 离开站为当前站, 到达下一站后才会将下一站置为当前站, * 车机端展示是离开当前站,下一站设置为当前站, 所以服务端数据回来要做处理,不能直接渲染 */ - @ChainLog( - linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT, - linkCode = CHAIN_LINK_ADAS, - endpoint = TracingConstants.Endpoint.PAD, - nodeAliasCode = CHAIN_ALIAS_CODE_OCH_BUS_START_AUTOPILOT, - paramIndexes = {0}, - clientPkFileName = "sn" - ) - private void leaveStationSuccess(BusRoutesResult result, boolean isRestart) { - renderBusStationsStatus(result); - if (slidePannelHideCallback != null) { - slidePannelHideCallback.hideSlidePanel(); - } - //开启自动驾驶 - startAutopilot(isRestart); - if (isGoingToNextStation) { - // 为了避免恢复自动驾驶时重复的接口请求 - return; + private void leaveStationSuccess(int leaveIndex,String leaveStation,String nextStation) { + + onStartAutopilot(leaveIndex); + + leaveTTSTips(nextStation); + + if (busRoutesResult != null){ + boolean isLastStop = false; + if (leaveIndex + 1 == stationList.size() -1){ + isLastStop = true; + } + //给bus外屏发送 + BusSendTripInfoManager.INSTANCE.sendBusTripInfo(BusSendTripInfoManager.LEAVE_STATION + , busRoutesResult.getName() + ,leaveStation + ,nextStation + ,isLastStop); } + } + + private void onStartAutopilot(int leaveIndex) { + //开启自动驾驶 2.10.0: 如果自动驾驶状态下开启, 非自动驾驶状态下不开启,需手动点击自动驾驶按钮开启 isGoingToNextStation = true; - AIAssist.getInstance( mContext ).speakTTSVoice( "欢迎乘坐’蘑菇车联‘无人驾驶小巴车,请您坐好,注意乘车安全,行程即将开始" ); + if (CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState() + == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING){ + startAutopilot(false,leaveIndex); + }else { + firstStartAutopilot = 0; + } } /** * 开启自动驾驶 * @param isRestart */ - private void startAutopilot(boolean isRestart) { + private void startAutopilot(boolean isRestart,int leaveIndex) { + + if (!FunctionBuildConfig.isDemoMode && !OCHAdasAbilityManager.getInstance().getAutopilotAbilityStatus()){ + ToastUtils.showLong(OCHAdasAbilityManager.getInstance().getAutopilotUnAbilityReason() + + ", 请稍候重试"); + triggerUnableStartAPReasonEvent(); + return; + } + + firstStartAutopilot ++; triggerStartServiceEvent(isRestart, false); - isArrivedStation = false; - BusStationBean currentStation = stationList.get( backgroundCurrentStationIndex); - BusStationBean nextStation = stationList.get( backgroundCurrentStationIndex + 1); + AutopilotControlParameters parameters = initAutopilotControlParameters(leaveIndex); + if (null == parameters) { + CallerLogger.INSTANCE.e(M_BUS + TAG, "行程日志-AutopilotControlParameters is empty."); + return; + } + + CallerAutoPilotManager.INSTANCE.startAutoPilot(parameters); + + CallerLogger.INSTANCE.d( M_BUS + TAG, "行程日志-开启自动驾驶====" + GsonUtil.jsonFromObject(parameters) + +" startLatLon="+parameters.startName+",endLatLon="+parameters.endName + + "isRestart = " + isRestart); + + if (mControllerStatusCallback != null) { + mControllerStatusCallback.startOpenAutopilot(); + } + } + + /** + * 到站查询核销乘客 + */ + public void queryPassengerWriteOff(){ + if ( backgroundCurrentStationIndex > stationList.size() - 1 ) { //到站短时间内调用多次 + CallerLogger.INSTANCE.e( M_BUS + TAG, "数组越界" ); + return; + } + BusServiceManager.queryStationWriteOffPassengers(mContext, + currentTaskId, + stationList.get(backgroundCurrentStationIndex).getSiteId(), + prePassengerWriteOffTime, + new OchCommonServiceCallback(){ + + @Override + public void onSuccess(BusQueryWriteOffPassengersResponse o) { + if (o.code !=0 || o.data == null || o.data.isEmpty()){ + return; + } + List passengers = o.data; + playWriteOffPassengersMsg(passengers); + } + + @Override + public void onFail(int code, String failMsg) { + + } + }); + } + + private void playWriteOffPassengersMsg(List passengers) { + for (int i=0; i< passengers.size();i++){ + WriteOffPassenger passenger = passengers.get(i); + CallerLogger.INSTANCE.e( M_BUS + TAG, "size = " + passenger.passengerSize+ + " time = "+passenger.writeOffTime); + prePassengerWriteOffTime = passenger.writeOffTime; + if (mPassengerCallback != null){ + mPassengerCallback.playPassenger(passenger); + } + } + } + + private void startOrStopQueryPassengerWriteOff(boolean isStart){ + if (isStart){ + BusModelLoopManager.getInstance().startQueryPassengerWriteOffLoop(); + }else { + prePassengerWriteOffTime = 0; + SoundPoolHelper.getSoundPoolHelper().releaseSoundPool(); + BusModelLoopManager.getInstance().stopQueryPassengerWriteOffLoop(); + } + } + + /** + * 到站后重置站点状态 + */ + private void arriveSiteStation() { + if ( backgroundCurrentStationIndex +1 > stationList.size() - 1 ) { //到站短时间内调用多次 + CallerLogger.INSTANCE.e( M_BUS + TAG, "数组越界" ); + return; + } + int arrivedStationIndex = backgroundCurrentStationIndex + 1; + String arriveStation = stationList.get(arrivedStationIndex).getName(); + String departureStopName = stationList.get(backgroundCurrentStationIndex).getName(); + CallerLogger.INSTANCE.d(M_BUS + TAG,"arriveSiteStation-currentStationIndex = "+ arrivedStationIndex); + + BusServiceManager.arriveSiteStation(mContext , + stationList.get(arrivedStationIndex).getSeq(), + stationList.get(arrivedStationIndex).getSiteId(), + currentTaskId , + new OchCommonServiceCallback() { + @Override + public void onSuccess(BaseData o) { + CallerLogger.INSTANCE.d(M_BUS + TAG,"行程日志-arriveSiteStation success"); + queryBusRoutes(); + + arriveStationSuccess(arrivedStationIndex,departureStopName,arriveStation); + + //5s轮询核销乘客 + startOrStopQueryPassengerWriteOff(true); + } + + @Override + public void onFail(int code, String failMsg) { + isArrivedStation = false; + isGoingToNextStation = true; + if (ToastUtilsOch.isCustomFastClick(5000)){ + if (!NetworkUtils.isConnected(mContext)) { + ToastUtils.showShort("网络异常,请稍后重试"); + }else { + ToastUtils.showShort(failMsg); + } + } + } + }); + } + + private void arriveStationSuccess(int arrivedStationIndex,String departureStopName,String arriveStation) { + if (busRoutesResult != null){ + boolean isLastStop = false; + if (arrivedStationIndex == busRoutesResult.getSites().size() - 1 ){ + isLastStop = true; + } + //给bus外屏发送 + BusSendTripInfoManager.INSTANCE.sendBusTripInfo(BusSendTripInfoManager.ARRIVE_STATION + , busRoutesResult.getName() + ,departureStopName + ,arriveStation + ,isLastStop); + } + + VoiceNotice.showNotice(String.format(mContext + .getString(R.string.bus_arrived_station_tip), + arriveStation)); + } + + /** + * 离站上报 + */ + public void leaveStation(){ + CallerLogger.INSTANCE.d(M_BUS + TAG,"leaveStation-backgroundCurrentStationIndex = "+backgroundCurrentStationIndex); + String nextStationName = ""; + if (backgroundCurrentStationIndex < stationList.size() - 1){ + nextStationName = stationList.get(backgroundCurrentStationIndex + 1).getName(); + } + final String currentStationName = stationList.get(backgroundCurrentStationIndex).getName(); + String finalNextStationName = nextStationName; + BusServiceManager.leaveStation(mContext, + stationList.get(backgroundCurrentStationIndex).getSeq(), + stationList.get(backgroundCurrentStationIndex).getSiteId(), + currentTaskId, + new OchCommonServiceCallback() { + @Override + public void onSuccess(BaseData o) { + isArrivedStation = false; + CallerLogger.INSTANCE.d( M_BUS + TAG, "行程日志-离站成功开往下一站====" ); + //需要更改当前站和下一站的状态 然后渲染 + startOrStopQueryPassengerWriteOff(false); + queryBusRoutes(); + leaveStationSuccess(backgroundCurrentStationIndex,currentStationName,finalNextStationName); + } + @Override + public void onFail(int code, String failMsg) { + if (!NetworkUtils.isConnected(mContext)) { + ToastUtils.showShort("网络异常,请稍后重试"); + }else{ + ToastUtils.showShort("离站上报失败:"+failMsg); + } + } + }); + } + + //车站10s后播报 + private void leaveTTSTips(String nextStation) { + VoiceNotice.showNotice(String.format(mContext + .getString(R.string.bus_leave_station_tip), + nextStation),DELAY_10S); + } + + /** + * 关闭美化模式 + */ + public void closeBeautificationMode() { + if (FunctionBuildConfig.isDemoMode) {//收车结束美化 + FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = false; //是否强制绘制引导线 + CallerAutoPilotManager.INSTANCE.setIgnoreConditionDraw(false);// 同步给乘客屏 + CallerAutoPilotManager.INSTANCE.setIPCDemoMode(false);//是否自动启动自驾 + CallerLogger.INSTANCE.d(M_BUS + TAG, "美化模式-ignore:置为false"); + } + } + + /** + * 开启自动驾驶到下一站 + */ + public void autoDriveToNextStation() { + if ( backgroundCurrentStationIndex >= stationList.size() - 1 ) { + // 当前站是最后一站,结束当前行程 + travelOver(); + return; + } + leaveStation(); + } + + /** + * 渲染站点信息 + * 服务端返回的OchBusRoutesResult逻辑, 离开站为当前站, 到达下一站后才会将下一站置为当前站, + * 车机端展示 三站: 中间为即将到到达或者刚到达的站 + * @param result + */ + private void updateBusStatus(BusRoutesResult result) { + if (result == null) return; + busRoutesResult = result; + List site = result.getSites(); + currentTaskId = result.getTaskId(); + currentLineId = result.getLineId(); + stationList.clear(); + stationList.addAll( site ); + + for ( int i = 0; i < stationList.size(); i++ ) { + BusStationBean s = stationList.get( i ); + + CallerLogger.INSTANCE.d( M_BUS + "updateBusStationsStatus--", + "Index="+ i+" ,name = "+s.getName()+" ,"+s.isLeaving()+","+s.getDrivingStatus()); + + // 是否正在开往下一站 + if ( s.isLeaving()) { + isGoingToNextStation = true; + } + // 当前站点信息 + if (s.getDrivingStatus() == STATION_STATUS_STOPPED ) { + backgroundCurrentStationIndex = i; + break; + } + } + + if (backgroundCurrentStationIndex == 0 && + stationList.get(0).getDrivingStatus() == STATION_STATUS_STOPPED + && !stationList.get(0).isLeaving()){ //默认是第一站到站查询 + if (busRoutesResult != null){ // 第一站到站也是行程开始的时候 + BusSendTripInfoManager.INSTANCE.sendBusTripInfo(BusSendTripInfoManager.START_TRIP + ,busRoutesResult.getName(),"","",false); + } + startOrStopQueryPassengerWriteOff(true); + } + + BusStationBean currentStation = stationList.get(backgroundCurrentStationIndex); + + CallerLogger.INSTANCE.d( M_BUS + TAG, + "行程日志-STATION_STATUS_STOPPED-backgroundCurrentStationIndex=" + +backgroundCurrentStationIndex + +" isLeaving()="+currentStation.isLeaving()); + + // 美化是否开始 + if (FunctionBuildConfig.isDemoMode && (backgroundCurrentStationIndex >= 0 + && backgroundCurrentStationIndex <= stationList.size()-1)){//行驶过程中设置美化 + if (stationList.get(backgroundCurrentStationIndex).isLeaving()){ + startBeautificationMode(); + CallerLogger.INSTANCE.d(M_BUS + TAG, "美化模式-ignore:置为true(每次滑动出发)"); + }else if (backgroundCurrentStationIndex >0 && backgroundCurrentStationIndex < stationList.size()-1){ + //美化模式下 中间站点到站 引导线要一直绘制,所以此处不出强制绘制不传false + CallerAutoPilotManager.INSTANCE.setIPCDemoMode(false); + CallerLogger.INSTANCE.d(M_BUS + TAG, "美化模式-ignore:false(到达中间站)"); + clearStartAutopilotTag(); + }else{ + closeBeautificationMode(); + clearStartAutopilotTag(); + } + } + + + if ( currentStation.isLeaving() && slidePanelHideCallback != null) { + slidePanelHideCallback.hideSlidePanel(); + } + + //更新bus路线面板 + updateBusTaskStatus(stationList); + + //需放在currentStationIndex赋值之后 + BusTrajectoryManager.getInstance().syncTrajectoryInfo(); + } + + private void clearStartAutopilotTag() { + firstStartAutopilot = 0; + } + + private void startBeautificationMode() { + FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = true; + CallerAutoPilotManager.INSTANCE.setIgnoreConditionDraw(true); + CallerAutoPilotManager.INSTANCE.setIPCDemoMode(true); + } + + public void clearBusStationDatas(){ + if (refreshBusStationsCallback != null){ + refreshBusStationsCallback.clearBusStationsMarkers(); + } + } + + /** + * 延时查询站点信心 + */ + private void queryBusStationDelay() { + handler.sendEmptyMessageDelayed( MSG_QUERY_BUS_STATION, QUERY_BUS_STATION_DELAY ); + } + + /** + * 在踩刹车、控制方向盘等操作后,会停止自动驾驶,重启自动驾驶的话相当于重新设置自动驾驶目的地 + */ + public void restartAutopilot() { + CallerLogger.INSTANCE.d( M_BUS + TAG, "行程日志-重启自动驾驶===" + isGoingToNextStation ); + //只去启动自动驾驶,不再去上报离站 + startAutopilot(firstStartAutopilot >= 1,-1); + } + + public boolean isRestartAutopilot(){ + return firstStartAutopilot > 1; + } + + /** + * 行程结束 + */ + private void travelOver() { + + if ( backgroundCurrentStationIndex >= stationList.size() ) { + CallerLogger.INSTANCE.e( M_BUS + TAG, "travel over index out of station list" ); + return; + } + CallerLogger.INSTANCE.d( M_BUS + TAG, "单程结束====" ); + CallerAutoPilotManager.INSTANCE.cancelAutoPilot(); + + endTask(); + } + + /** + * task正常结束 + */ + private void endTask() { + CallerLogger.INSTANCE.d( M_BUS + TAG, "任务正常走完endTask()"); + BusServiceManager.endTask(mContext, currentTaskId + , new OchCommonServiceCallback() { + @Override + public void onSuccess(BaseData o) { + CallerLogger.INSTANCE.d(M_BUS + TAG, "endTask success: " + o); + if (o.code == 0){ + endOrAbortTaskSuccess(); + clearBusStationDatas(); + queryBusRoutes();// 重新获取任务 + startOrStopQueryPassengerWriteOff(false); + VoiceNotice.showNotice(mContext.getString(R.string.bus_end_task_tip)); + } + } + + @Override + public void onFail(int code, String failMsg) { + ToastUtils.showShort(failMsg); + } + }); + } + + /** + * 到站 + * @param data + */ + public void onArriveAt( MessagePad.ArrivalNotification data){ + if ( backgroundCurrentStationIndex +1 > stationList.size() - 1 ) { + CallerLogger.INSTANCE.e( M_BUS + TAG, "行程日志-到站异常,取消后续操作结束" ); + return; + } + + //MAP 280 每隔100ms左右返回一次到站, 导致在到达中间站后再次滑动出发后会有时间差,收到一次到站,出现问题 + //此处比对 自驾告诉的到站站点坐标和本地应到站站点坐标, 一致时才能到站 + if (data != null && data.getEndLocation() != null){ + + String latitude = NumberFormatUtil.cutOutNumber(data.getEndLocation().getLatitude(),5); //wgs + String longitude = NumberFormatUtil.cutOutNumber(data.getEndLocation().getLongitude(),5); + + int arrivedStationIndex = backgroundCurrentStationIndex + 1; + BusStationBean arriveStation = stationList.get(arrivedStationIndex); + String arriveLat = NumberFormatUtil.cutOutNumber(arriveStation.getLat(),5); + String arriveLon = NumberFormatUtil.cutOutNumber(arriveStation.getLon(),5); + + if (!latitude.equals(arriveLat) || !longitude.equals(arriveLon)){ + CallerLogger.INSTANCE.e( M_BUS + TAG, "行程日志-到站拦截,到站坐标不一致" ); + return; + } + } + + if (isArrivedStation) return; + isArrivedStation = true; + + CallerLogger.INSTANCE.d( M_BUS + TAG, "行程日志-当前==backgroundCurrentStationIndex=" + + backgroundCurrentStationIndex); + + isGoingToNextStation = false; + + arriveSiteStation(); + } + + public boolean isGoingToNextStation() { + return isGoingToNextStation; + } + + // 车机端上传心跳数据(只在出车状态时上传) + public void runCarHeartbeat() { + BusServiceManager.runCarHeartbeat(mContext, mLongitude, mLatitude, + new OchCommonServiceCallback() { + @Override + public void onSuccess(BaseData data) { + + } + + @Override + public void onFail(int code, String failMsg) { + + } + }); + } + + public void startOrStopOrderLoop(boolean start) { + CallerLogger.INSTANCE.d(M_BUS + TAG, "startOrStopOrderLoop() " + start); + if (start) { + BusModelLoopManager.getInstance().startHeartbeatLoop(); + } else { + BusModelLoopManager.getInstance().stopHeartbeatLoop(); + } + } + + // 登出 + public void logout() { + loginService.loginOut(mLatitude,mLongitude); + } + + public void triggerStartServiceEvent(boolean isRestart, boolean send) { + if (stationList == null || backgroundCurrentStationIndex >= stationList.size()-1) { + return; + } + BusStationBean currentStation = stationList.get( backgroundCurrentStationIndex); + BusStationBean nextStation = stationList.get( backgroundCurrentStationIndex +1); + BusAnalyticsManager.getInstance().triggerStartAutopilotEvent(isRestart, send, + currentStation.getName(), nextStation.getName(), currentLineId); + } + + public void triggerUnableStartAPReasonEvent() { + if (stationList == null || backgroundCurrentStationIndex >= stationList.size()-1) { + return; + } + BusStationBean currentStation = stationList.get( backgroundCurrentStationIndex); + BusStationBean nextStation = stationList.get( backgroundCurrentStationIndex +1); + BusAnalyticsManager.getInstance().triggerUnableStartAPReasonEvent( + currentStation.getName(), nextStation.getName(), currentLineId, + OCHAdasAbilityManager.getInstance().getAutopilotUnAbilityReason()); + } + + public BusRoutesResult getBusRoutesResult() { + return busRoutesResult; + } + + public int getCurrentStationIndex() { + return backgroundCurrentStationIndex; + } + + /** + * 将业务订单信息保存,鹰眼可取用 + */ + private void updateAutopilotControlParameters() { + + AutopilotControlParameters parameters = initAutopilotControlParameters(-1); + if (null == parameters){ + CallerLogger.INSTANCE.e(M_BUS + TAG, "AutopilotControlParameters is empty."); + return; + } + CallerLogger.INSTANCE.d(M_BUS + TAG, "AutopilotControlParameters is update."); + CallerAutoPilotStatusListenerManager.INSTANCE.updateAutopilotControlParameters(parameters); + } + + private void clearAutopilotControlParameters(){ + CallerLogger.INSTANCE.d(M_BUS + TAG, "AutopilotControlParameters is clear."); + CallerAutoPilotStatusListenerManager.INSTANCE.updateAutopilotControlParameters(null); + } + + private AutopilotControlParameters initAutopilotControlParameters(int leaveIndex) { + BusStationBean currentStation = null; + BusStationBean nextStation = null; + + if (leaveIndex < 0){ + if (backgroundCurrentStationIndex +1 > stationList.size() - 1 || !isGoingToNextStation){ + CallerLogger.INSTANCE.e(M_BUS + TAG, "行程日志-mismatch condition1."); + return null; + } + currentStation = stationList.get( backgroundCurrentStationIndex); + nextStation = stationList.get( backgroundCurrentStationIndex + 1); + }else { + if (leaveIndex +1 > stationList.size() - 1 || !isGoingToNextStation){ + CallerLogger.INSTANCE.e(M_BUS + TAG, "行程日志-mismatch condition2."); + return null; + } + currentStation = stationList.get( leaveIndex); + nextStation = stationList.get( leaveIndex + 1); + } -// if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE -// == CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState()) { -// ToastUtils.showShort("自动驾驶状态为不可用!"); -// } AutopilotControlParameters parameters = new AutopilotControlParameters(); - parameters.isSpeakVoice = !isRestart; parameters.routeID = busRoutesResult.getLineId(); parameters.routeName = busRoutesResult.getName(); parameters.startName = PinYinUtil.getPinYinHeadChar(currentStation.getName()); @@ -570,439 +1078,7 @@ public class BusOrderModel { busRoutesResult.txtFileUrlDPQP, busRoutesResult.txtFileMd5DPQP, busRoutesResult.contrailSaveTimeDPQP); } - CallerLogger.INSTANCE.d( M_BUS + TAG, "开启自动驾驶====" + GsonUtil.jsonFromObject(parameters) - +" startLatLon="+currentStation.getName()+",endLatLon="+nextStation.getName()); - CallerAutoPilotManager.INSTANCE.startAutoPilot(parameters); - if (mControllerStatusCallback != null) { - mControllerStatusCallback.startOpenAutopilot(); - } - } - - /** - * 到站后重置站点状态 - */ - private void arriveSiteStation(boolean isRestart) { - if ( backgroundCurrentStationIndex +1 > stationList.size() - 1 ) { //到站短时间内调用多次 - CallerLogger.INSTANCE.e( M_BUS + TAG, "数组越界" ); - return; - } - int arrivedStationIndex = 0; - if (!isRestart){ - arrivedStationIndex = backgroundCurrentStationIndex + 1; - } - CallerLogger.INSTANCE.d(M_BUS + TAG,"arriveSiteStation-currentStationIndex = "+ arrivedStationIndex); - - BusServiceManager.getInstance().arriveSiteStation(mContext - , stationList.get(arrivedStationIndex).getSeq(), stationList.get(arrivedStationIndex).getSiteId() - , new IBusServiceCallback() { - @Override - public void onSuccess(BaseData o) { - CallerLogger.INSTANCE.d(M_BUS + TAG,"arriveSiteStation success"); - if (!isRestart){ - renderArriveBusStation(); - } - } - - @Override - public void onFail(String failMsg) { -// if (!NetworkUtils.isConnected(mContext)) { -// ToastUtils.showShort("网络异常,请稍后重试"); -// }else { -// ToastUtils.showShort("离站上报失败:"+failMsg); -// } - - } - }); - } - - private void renderArriveBusStation() { - List site = busRoutesResult.getSites(); - if (site != null && site.size() > 0){ - backgroundCurrentStationIndex ++; - if (refreshBusStationsCallback != null){ - refreshBusStationsCallback.refreshBusStations(busRoutesResult.getName(),stationList, backgroundCurrentStationIndex - , getNextStopStation(),true); - } - } - } - - /** - * 查询到站下车乘客 - */ - private void queryStationLeaveAwayPassengers() { - CallerLogger.INSTANCE.d( M_BUS + TAG, "查询到站下车乘客"); - - BusServiceManager.getInstance().queryStationLeaveAwayPassengers(mContext - , stationList.get(backgroundCurrentStationIndex +1).getSeq(), stationList.get(backgroundCurrentStationIndex+1).getSiteId() - , new IBusServiceCallback() { - @Override - public void onSuccess(QueryLeaveAwayPassengersResponse o) { - hadQueryLeaveAwayPassager = true; - arriveSiteStation(false); - playLeavePassengersMsg( o ); - queryBusOrders(); - } - - @Override - public void onFail(String failMsg) { - hadQueryLeaveAwayPassager = true; - arriveSiteStation(false); - } - }); - } - - /** - * 收车 - */ - public void stopTakeOrder(){ - BusServiceManager.getInstance().stopTakeOrder(mContext, new IBusServiceCallback() { - @Override - public void onSuccess(BaseData o) { - mIsWorking = !mIsWorking; - closeBeautificationMode(); - carOperationStatusCallback.changeOperationStatus(isWorking()); - startOrStopOrderLoop(mIsWorking); - BusTrajectoryManager.getInstance().stopTrajReqLoop(); - } - @Override - public void onFail(String failMsg) { - if (!NetworkUtils.isConnected(mContext)) { - ToastUtils.showShort("网络异常,请稍后重试"); - }else { - ToastUtils.showShort("收车失败:"+failMsg); - } - } - }); - } - - /** - * 关闭美化模式 - */ - private void closeBeautificationMode() { - if (FunctionBuildConfig.isDemoMode) {//收车结束美化 - FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = false; - CallerAutoPilotManager.INSTANCE.setIPCDemoMode(false); - CallerLogger.INSTANCE.d(M_BUS + TAG, "美化模式-ignore:置为false(收车)"); - } - } - - /** - * 出车 - */ - public void startTakeOrder(){ - BusServiceManager.getInstance().startTakeOrder(mContext, new IBusServiceCallback() { - @Override - public void onSuccess(BaseData o) { - mIsWorking = !mIsWorking; - startOrStopOrderLoop(mIsWorking); - if ( stationList != null && stationList.size() > 0 ) { - AIAssist.getInstance( mContext ).speakTTSVoice( "车辆已整备完毕,请前往" - + stationList.get( backgroundCurrentStationIndex ).getName() + "站点" ); - } - carOperationStatusCallback.changeOperationStatus(isWorking()); - queryBusRoutes(); - } - @Override - public void onFail(String failMsg) { - if (!NetworkUtils.isConnected(mContext)) { - ToastUtils.showShort("网络异常,请稍后重试"); - }else { - ToastUtils.showShort("出车失败:"+failMsg); - } - } - }); - } - - /** - * 查询运营状态 - */ - public void queryOperationStatus() { - CallerLogger.INSTANCE.d( M_BUS + TAG, "查询运营状态"); - BusServiceManager.getInstance().queryOperationStatus(mContext - , new IBusServiceCallback() { - @Override - public void onSuccess(BusOperationStatusResponse o) { - if ( o.data != null ) { - mIsWorking = o.data.serviceStatus == 1; - CallerLogger.INSTANCE.d( M_BUS + TAG, "查询运营状态 result.status: " + o.data.serviceStatus); - startOrStopOrderLoop(mIsWorking); - } - carOperationStatusCallback.changeOperationStatus(isWorking()); - } - @Override - public void onFail(String failMsg) { - if (!NetworkUtils.isConnected(mContext)) { - ToastUtils.showShort("网络异常,请稍后重试"); - }else { - ToastUtils.showShort("出车收车状态查询:"+failMsg); - } -// queryOperationStatus(); - } - }); - } - - /** - * 开启自动驾驶到下一站 - */ - public void autoDriveToNextStation( boolean isRestart ) { - if ( backgroundCurrentStationIndex >= stationList.size() - 1 ) { - // 当前站是最后一站,结束当前行程 - travelOver(); - return; - } - leaveStation(false,isRestart); - } - - /** - * 渲染站点信息 - * 服务端返回的OchBusRoutesResult逻辑, 离开站为当前站, 到达下一站后才会将下一站置为当前站, - * 车机端展示 离开站为当前站点,前往站为下一站, 下一站到站后在置为当前站 - * @param result - */ - private void renderBusStationsStatus(BusRoutesResult result) { - if (result == null) return; - busRoutesResult = result; - List site = result.getSites(); - currentLineId = result.getLineId(); - stationList.clear(); - 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 ) { - backgroundCurrentStationIndex = i; - break; - } - } - - BusStationBean currentStation = stationList.get(backgroundCurrentStationIndex); - - CallerLogger.INSTANCE.d( M_BUS + TAG, - "渲染站点信息服务端currentStationIndex="+backgroundCurrentStationIndex - +" isLeaving()="+currentStation.isLeaving()); - - //当前站点是始发站,告诉服务端到达始发站。 如果没有这个节点, 服务器不知道始发站到达状态 - // ,订单开始站下在始发站的状态流转有问题 - if (backgroundCurrentStationIndex == 0 && !currentStation.isLeaving()){ - arriveSiteStation(true); - } - - // 美化是否开始 - if (FunctionBuildConfig.isDemoMode && (backgroundCurrentStationIndex >= 0 - && backgroundCurrentStationIndex <= stationList.size()-1) - && stationList.get(backgroundCurrentStationIndex).isLeaving()){//行驶过程中设置美化 - FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = true; - CallerAutoPilotManager.INSTANCE.setIPCDemoMode(true); - CallerLogger.INSTANCE.d(M_BUS + TAG, "美化模式-ignore:置为true(每次滑动出发)"); - } - - if (refreshBusStationsCallback != null){ - refreshBusStationsCallback.refreshBusStations(result.getName(),stationList - , backgroundCurrentStationIndex, getNextStopStation(),!currentStation.isLeaving()); - } - - if ( currentStation.isLeaving() && slidePannelHideCallback != null) { - slidePannelHideCallback.hideSlidePanel(); - } - - //需放在currentStationIndex赋值之后 - BusTrajectoryManager.getInstance().syncTrajectoryInfo(); - } - - /** - * 根据订单状态、获取下一站靠站的的站点 - * - * @return -1 当前已是最后一个站点 - */ - private int getNextStopStation() { - if ( backgroundCurrentStationIndex >= stationList.size() - 1 ) { - return -1; - } - int nextStationIndex = backgroundCurrentStationIndex + 1; - for ( ; nextStationIndex < stationList.size() - 1; nextStationIndex++ ) { - if ( stationList.get( nextStationIndex ).getIfStop() == 1 ) { - break; - } - break; - } - return nextStationIndex; - } - - /** - * 延时查询站点信心 - */ - private void queryBusStationDelay() { - handler.sendEmptyMessageDelayed( MSG_QUERY_BUS_STATION, QUERY_BUS_STATION_DELAY ); - } - - /** - * 在踩刹车、控制方向盘等操作后,会停止自动驾驶,重启自动驾驶的话相当于重新设置自动驾驶目的地 - */ - public void restartAutopilot() { - CallerLogger.INSTANCE.d( M_BUS + TAG, "重启自动驾驶===" + isGoingToNextStation ); - autoDriveToNextStation( true ); - } - - /** - * 播报下车乘客信息 - * - * @param awayPassengersResponse - */ - private void playLeavePassengersMsg( QueryLeaveAwayPassengersResponse awayPassengersResponse ) { - CallerLogger.INSTANCE.d( M_BUS + TAG, "播报下车乘客信息currentStationIndex=" - + String.valueOf(backgroundCurrentStationIndex + 1)); - - if ( backgroundCurrentStationIndex +1 > stationList.size() - 1 ) { - return; - } - String station = stationList.get( backgroundCurrentStationIndex+1 ).getName(); - StringBuilder builder = new StringBuilder( "已到达" ); - builder.append( station ); - if ( !station.endsWith( "站" ) ) { - builder.append( "站" ); - } - if ( awayPassengersResponse == null || awayPassengersResponse.data == null - || awayPassengersResponse.data.orders == null || awayPassengersResponse.data.orders.isEmpty() ) { - CallerLogger.INSTANCE.d( M_BUS + TAG, "播报下车乘客信息为null"); - } else { - builder.append( ",请尾号为 " ); - for ( QueryLeaveAwayPassengersResponse.LeaveAwayPassenger leaveAwayPassenger : awayPassengersResponse.data.orders ) { - if ( leaveAwayPassenger == null ) { - continue; - } - String tailNum = null; - try { - tailNum = leaveAwayPassenger.passengerPhone.substring(leaveAwayPassenger.passengerPhone.length() - 4); - } catch (Exception e) { - e.printStackTrace(); - tailNum = leaveAwayPassenger.passengerPhone; - } - builder.append( tailNum ).append( "。" ); - } - builder.append( "的乘客下车" ); - } - builder.append(",带好随身物品,下车请注意安全"); - CallerLogger.INSTANCE.d(M_BUS + TAG, "TTS:" + builder.toString()); - AIAssist.getInstance( mContext ).speakTTSVoice( builder.toString() ); - } - - /** - * 修改小巴运营状态 - */ - public void onChangeOperationStatus() { - CallerLogger.INSTANCE.d( M_BUS + TAG, "修改小巴运营状态"); - if (isWorking()){//收车 - stopTakeOrder(); - }else {//出车 - startTakeOrder(); - } - } - - /** - * 行程结束 - */ - private void travelOver() { - - if ( backgroundCurrentStationIndex >= stationList.size() ) { - CallerLogger.INSTANCE.e( M_BUS + TAG, "travel over index out of station list" ); - return; - } - CallerLogger.INSTANCE.d( M_BUS + TAG, "单程结束====" ); - CallerAutoPilotManager.INSTANCE.cancelAutoPilot(); - AIAssist.getInstance( mContext ).speakTTSVoice( "感谢您体验'蘑菇车联'无人驾驶小巴车,请您携带好随身物品,我们下次再见" ); - leaveStation(true,true); - } - - public boolean isWorking() { - return mIsWorking; - } - - /** - * 到站 - * @param data - */ - public void onArriveAt( MessagePad.ArrivalNotification data){ - if ( backgroundCurrentStationIndex +1 > stationList.size() - 1 ) { - CallerLogger.INSTANCE.e( M_BUS + TAG, "到站异常,取消后续操作结束" ); - return; - } - - if (isArrivedStation) return; - isArrivedStation = true; - - if (FunctionBuildConfig.isDemoMode && backgroundCurrentStationIndex <= stationList.size() - 1) {//到达一站结束美化 - FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = false; - CallerAutoPilotManager.INSTANCE.setIPCDemoMode(false); - CallerLogger.INSTANCE.d(M_BUS + TAG, "美化模式-ignore:置为false(到最后一站)"); - } - CallerLogger.INSTANCE.d( M_BUS + TAG, "到站====currentStationIndex=" + backgroundCurrentStationIndex); - isGoingToNextStation = false; - - queryStationLeaveAwayPassengers(); - UiThreadHandler.postDelayed(new Runnable() {// 先查询下车乘客,再上报到站,便于后台筛查下车订单 - @Override - public void run() { - if (!hadQueryLeaveAwayPassager){ - arriveSiteStation(false); - } - hadQueryLeaveAwayPassager = false; - } - },1500); - } - - public boolean isGoingToNextStation() { - return isGoingToNextStation; - } - - // 车机端上传心跳数据(只在出车状态时上传) - public void runCarHeartbeat() { - BusServiceManager.getInstance().runCarHeartbeat(mContext, mLongitude, mLatitude, - new IBusServiceCallback() { - @Override - public void onSuccess(BaseData data) { - - } - - @Override - public void onFail(String failMsg) { - - } - }); - } - - private void startOrStopOrderLoop(boolean start) { - CallerLogger.INSTANCE.d(M_BUS + TAG, "startOrStopOrderLoop() " + start); - if (start) { - BusModelLoopManager.getInstance().startHeartbeatLoop(); - } else { - BusModelLoopManager.getInstance().stopHeartbeatLoop(); - } - } - - public void triggerStartServiceEvent(boolean isRestart, boolean send) { - if (stationList == null || backgroundCurrentStationIndex >= stationList.size()-1) { - return; - } - BusStationBean currentStation = stationList.get( backgroundCurrentStationIndex); - BusStationBean nextStation = stationList.get( backgroundCurrentStationIndex +1); - BusAnalyticsManager.getInstance().triggerStartAutopilotEvent(isRestart, send, - currentStation.getName(), nextStation.getName(), currentLineId); - } - - public BusRoutesResult getBusRoutesResult() { - return busRoutesResult; - } - - public int getCurrentStationIndex() { - return backgroundCurrentStationIndex; + return parameters; } } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/BusServiceManager.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/BusServiceManager.java deleted file mode 100644 index 5ce01cf7c4..0000000000 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/BusServiceManager.java +++ /dev/null @@ -1,257 +0,0 @@ -package com.mogo.och.bus.net; - -import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS; - -import android.content.Context; - -import com.mogo.cloud.passport.MoGoAiCloudClientConfig; -import com.mogo.eagle.core.data.BaseData; -import com.mogo.eagle.core.network.MoGoRetrofitFactory; -import com.mogo.eagle.core.network.RequestOptions; -import com.mogo.eagle.core.network.SubscribeImpl; -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; -import com.mogo.och.bus.bean.BusQueryLinesResponse; -import com.mogo.och.bus.bean.BusRoutePlanningUpdateReqBean; -import com.mogo.och.bus.bean.BusRoutesResponse; -import com.mogo.och.bus.bean.CarHeartbeatReqBean; -import com.mogo.och.bus.bean.BusOperationStatusRequest; -import com.mogo.och.bus.bean.BusOperationStatusResponse; -import com.mogo.och.bus.bean.BusOrdersResponse; -import com.mogo.och.bus.bean.BusQueryLineStationsRequest; -import com.mogo.och.bus.bean.BusResetDrivingLineRequest; -import com.mogo.och.bus.bean.BusUpdateSiteStatusRequest; -import com.mogo.och.bus.bean.QueryLeaveAwayPassengersRequest; -import com.mogo.och.bus.bean.QueryLeaveAwayPassengersResponse; -import com.mogo.och.bus.constant.BusConst; -import com.mogo.och.bus.model.BusOrderModel; - -import java.util.List; - -import io.reactivex.android.schedulers.AndroidSchedulers; -import io.reactivex.schedulers.Schedulers; - -/** - * @author: wangmingjun - * @date: 2021/10/20 - */ -public class BusServiceManager { - - private static final String TAG = BusServiceManager.class.getSimpleName(); - - private final IBusApiService mService; - - private static final class SingletonHolder { - private static final BusServiceManager INSTANCE = new BusServiceManager(); - } - - public static BusServiceManager getInstance(){ - return SingletonHolder.INSTANCE; - } - - private BusServiceManager(){ - mService = MoGoRetrofitFactory.getInstance(BusConst.getBaseUrl()).create(IBusApiService.class); - } - - /** - * 查询小巴车线路 - * @param context - * @param callback - */ - public void queryBusRoutes(Context context, IBusServiceCallback callback) { - //获取当前高德坐标 - - mService.querySiteByCoordinate(MoGoAiCloudClientConfig.getInstance().getServiceAppId() - ,MoGoAiCloudClientConfig.getInstance().getToken() - , new BusQueryLineStationsRequest(BusOrderModel.getInstance().mLongitude - , BusOrderModel.getInstance().mLatitude,true)) - .subscribeOn( Schedulers.io() ).observeOn( AndroidSchedulers.mainThread() ) - .subscribe( getSubscribeImpl(context,callback,"querySiteByCoordinate")); - } - - /** - * 重置线路站点 - * @param context - * @param lineId - * @param callback - */ - public void resetStationStatus(Context context, int lineId, IBusServiceCallback callback){ - mService.resetStationStatus(MoGoAiCloudClientConfig.getInstance().getServiceAppId() - ,MoGoAiCloudClientConfig.getInstance().getToken(),new BusResetDrivingLineRequest(lineId)) - .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) - .subscribe(getSubscribeImpl(context,callback,"debugResetStationStatus")); - } - - /** - * 离站上报 - * @param context - * @param seq - * @param siteId - * @param callback - */ - public void leaveStation(Context context, int seq, int siteId, IBusServiceCallback callback){ - mService.leaveStation(MoGoAiCloudClientConfig.getInstance().getServiceAppId() - ,MoGoAiCloudClientConfig.getInstance().getToken() - ,new BusUpdateSiteStatusRequest(seq,siteId, BusOrderModel.getInstance().mLongitude - , BusOrderModel.getInstance().mLatitude)) - .subscribeOn( Schedulers.io() ) - .observeOn( AndroidSchedulers.mainThread() ) - .subscribe(getSubscribeImpl(context,callback,"leaveStation")); - } - - /** - * 到站更新站点状态 - * @param context - * @param seq - * @param siteId - * @param callback - */ - public void arriveSiteStation(Context context, int seq, int siteId, IBusServiceCallback callback){ - mService.arriveSiteStation(MoGoAiCloudClientConfig.getInstance().getServiceAppId() - ,MoGoAiCloudClientConfig.getInstance().getToken() - ,new BusUpdateSiteStatusRequest(seq,siteId - , BusOrderModel.getInstance().mLongitude, BusOrderModel.getInstance().mLatitude)) - .subscribeOn( Schedulers.io() ) - .observeOn( AndroidSchedulers.mainThread() ) - .subscribe(getSubscribeImpl(context,callback,"leaveStation")); - } - - /** - * 查询下车乘客 - * @param context - * @param seq - * @param siteId - * @param callback - */ - public void queryStationLeaveAwayPassengers(Context context, int seq, int siteId - , IBusServiceCallback callback){ - mService.queryStationLeaveAwayPassengers( MoGoAiCloudClientConfig.getInstance().getServiceAppId() - ,MoGoAiCloudClientConfig.getInstance().getToken(),new QueryLeaveAwayPassengersRequest(seq,siteId)) - .subscribeOn( Schedulers.io() ) - .observeOn( AndroidSchedulers.mainThread() ) - .subscribe(getSubscribeImpl(context,callback,"queryStationLeaveAwayPassengers")); - } - - /** - * 收车 - * @param context - * @param callback - */ - public void stopTakeOrder(Context context, IBusServiceCallback callback){ - mService.stopTakeOrder(MoGoAiCloudClientConfig.getInstance().getServiceAppId() - ,MoGoAiCloudClientConfig.getInstance().getToken() - ,new BusOperationStatusRequest(BusOrderModel.getInstance().mLongitude - , BusOrderModel.getInstance().mLatitude)) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(getSubscribeImpl(context,callback,"stopTakeOrder")); - } - - /** - * 出车 - * @param context - * @param callback - */ - public void startTakeOrder(Context context, IBusServiceCallback callback){ - mService.startTakeOrder(MoGoAiCloudClientConfig.getInstance().getServiceAppId() - ,MoGoAiCloudClientConfig.getInstance().getToken() - ,new BusOperationStatusRequest(BusOrderModel.getInstance().mLongitude - , BusOrderModel.getInstance().mLatitude)) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(getSubscribeImpl(context,callback,"startTakeOrder")); - } - - /** - * 查询出车/收车状态 - * @param context - * @param callback - */ - public void queryOperationStatus(Context context, IBusServiceCallback callback){ - mService.queryOperationStatus(MoGoAiCloudClientConfig.getInstance().getServiceAppId() - ,MoGoAiCloudClientConfig.getInstance().getToken(),MoGoAiCloudClientConfig.getInstance().getSn()) - .subscribeOn( Schedulers.io() ) - .observeOn( AndroidSchedulers.mainThread() ) - .subscribe(getSubscribeImpl(context,callback,"queryOperationStatus")); - } - - /** - * 查询小巴车订单 - * @param context - * @param callback - */ - public void queryBusOrders(Context context, IBusServiceCallback callback){ - mService.queryBusOrders(MoGoAiCloudClientConfig.getInstance().getServiceAppId() - ,MoGoAiCloudClientConfig.getInstance().getToken(),MoGoAiCloudClientConfig.getInstance().getSn()) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(getSubscribeImpl(context,callback,"queryBusOrders")); - } - - public void queryBusLines(Context context, IBusServiceCallback callback){ - mService.queryBusLines(MoGoAiCloudClientConfig.getInstance().getServiceAppId() - ,MoGoAiCloudClientConfig.getInstance().getToken(),MoGoAiCloudClientConfig.getInstance().getSn()) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(getSubscribeImpl(context,callback,"queryBusLines")); - } - - public void updateOrderRoute(Context context,int lineId, int startSiteId, int endSiteId - , List< BusRoutePlanningUpdateReqBean.Result > points - , IBusServiceCallback callback){ - mService.updateOrderRoute(MoGoAiCloudClientConfig.getInstance().getServiceAppId() - ,MoGoAiCloudClientConfig.getInstance().getToken() - ,new BusRoutePlanningUpdateReqBean(MoGoAiCloudClientConfig.getInstance().getSn() - ,lineId,startSiteId,endSiteId, points)) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(getSubscribeImpl(context,callback,"updateOrderRoute")); - } - - /** - * 车机端上传心跳数据(只在出车状态时上传):包含高德坐标系经纬度 - * @param context - * @param lon - * @param lat - * @param callback - */ - public void runCarHeartbeat(Context context, double lon, double lat, - IBusServiceCallback callback) { - mService.runCarHeartbeat(MoGoAiCloudClientConfig.getInstance().getServiceAppId() - ,MoGoAiCloudClientConfig.getInstance().getToken(),new CarHeartbeatReqBean( - MoGoAiCloudClientConfig.getInstance().getSn(), lon, lat)) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(getSubscribeImpl(context, callback, "runCarHeartbeat")); - } - - private SubscribeImpl getSubscribeImpl(Context context, IBusServiceCallback callback, String apiName){ - return new SubscribeImpl(RequestOptions.create(context)){ - @Override - public void onSuccess(T o) { - super.onSuccess(o); - CallerLogger.INSTANCE.e(M_BUS + TAG,apiName + ": onSuccess() " + o.msg); - if (callback != null) { - callback.onSuccess(o); - } - } - - @Override - public void onError(String message, int code) { - super.onError(message, code); - CallerLogger.INSTANCE.e(M_BUS + TAG,apiName + ": onError() " +"msg="+ message+" code="+code); - if (callback != null) { - callback.onFail("msg="+ message+" code="+code); - } - } - - @Override - public void onError(Throwable e) { - super.onError(e); - CallerLogger.INSTANCE.e(M_BUS + TAG,apiName + ": onError() " +" e="+e.getMessage()); - if (callback != null) { - callback.onFail(e.getMessage()); - } - } - }; - } -} diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/BusServiceManager.kt b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/BusServiceManager.kt new file mode 100644 index 0000000000..126932adbc --- /dev/null +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/BusServiceManager.kt @@ -0,0 +1,268 @@ +package com.mogo.och.bus.net + +import android.content.Context +import com.mogo.och.bus.constant.BusConst.Companion.getBaseUrl +import com.mogo.cloud.passport.MoGoAiCloudClientConfig +import com.mogo.eagle.core.data.BaseData +import com.mogo.eagle.core.network.MoGoRetrofitFactory +import com.mogo.och.bus.bean.* +import com.mogo.och.common.module.biz.network.OchCommonServiceCallback +import com.mogo.och.common.module.biz.network.OchCommonSubscribeImpl +import com.mogo.och.common.module.biz.network.interceptor.transformTry + +/** + * @author: wangmingjun + * @date: 2021/10/20 + */ +object BusServiceManager { + + private val mService: IBusApiService = MoGoRetrofitFactory.getInstance(getBaseUrl()).create( + IBusApiService::class.java + ) + + /** + * 查询小巴车当前任务 + * @param context + * @param callback + */ + @JvmStatic + fun queryBusRoutes(context: Context, callback: OchCommonServiceCallback?) { + //获取当前高德坐标 + mService.queryBusRoutes( + MoGoAiCloudClientConfig.getInstance().serviceAppId, + MoGoAiCloudClientConfig.getInstance().token, + BusQueryLineStationsRequest() + ) + .transformTry() + .subscribe(OchCommonSubscribeImpl(context, callback, "queryBusRoutes")) + } + + /** + * 重置线路站点 + * @param context + * @param taskId + * @param callback + */ + @JvmStatic + fun switchLine( + context: Context, + taskId: Int, + callback: OchCommonServiceCallback? + ) { + mService.switchLine( + MoGoAiCloudClientConfig.getInstance().serviceAppId, + MoGoAiCloudClientConfig.getInstance().token, + BusResetDrivingLineRequest(taskId) + ) + .transformTry() + .subscribe(OchCommonSubscribeImpl(context, callback, "switchLine")) + } + + /** + * 中断当前任务 + * @param context + * @param taskId + * @param callback + */ + @JvmStatic + fun abortTask(context: Context, taskId: Int, callback: OchCommonServiceCallback?) { + mService.abortTask( + MoGoAiCloudClientConfig.getInstance().serviceAppId, + MoGoAiCloudClientConfig.getInstance().token, + BusCloseTaskRequest(taskId) + ) + .transformTry() + .subscribe(OchCommonSubscribeImpl(context, callback, "abortTask")) + } + + /** + * 正常结束任务 + * @param context + * @param taskId + * @param callback + */ + @JvmStatic + fun endTask(context: Context, taskId: Int, callback: OchCommonServiceCallback?) { + mService.endTask( + MoGoAiCloudClientConfig.getInstance().serviceAppId, + MoGoAiCloudClientConfig.getInstance().token, + BusCloseTaskRequest(taskId) + ) + .transformTry() + .subscribe(OchCommonSubscribeImpl(context, callback, "endTask")) + } + + /** + * 离站上报 + * @param context + * @param seq + * @param siteId + * @param callback + */ + @JvmStatic + fun leaveStation( + context: Context, + seq: Int, + siteId: Int, + taskId: Int, + callback: OchCommonServiceCallback? + ) { + mService.leaveStation( + MoGoAiCloudClientConfig.getInstance().serviceAppId, + MoGoAiCloudClientConfig.getInstance().token, + BusUpdateSiteStatusRequest(taskId, siteId, seq) + ) + .transformTry() + .subscribe(OchCommonSubscribeImpl(context, callback, "leaveStation")) + } + + /** + * 到站更新站点状态 + * @param context + * @param seq + * @param siteId + * @param callback + */ + @JvmStatic + fun arriveSiteStation( + context: Context, seq: Int, siteId: Int, taskId: Int, + callback: OchCommonServiceCallback? + ) { + mService.arriveSiteStation( + MoGoAiCloudClientConfig.getInstance().serviceAppId, + MoGoAiCloudClientConfig.getInstance().token, + BusUpdateSiteStatusRequest(taskId, siteId, seq) + ) + .transformTry() + .subscribe(OchCommonSubscribeImpl(context, callback, "arriveSiteStation")) + } + + /** + * 查询下车乘客 + * @param context + * @param seq + * @param siteId + * @param callback + */ + @JvmStatic + fun queryStationLeaveAwayPassengers( + context: Context, + seq: Int, + siteId: Int, + callback: OchCommonServiceCallback? + ) { + mService.queryStationLeaveAwayPassengers( + MoGoAiCloudClientConfig.getInstance().serviceAppId, + MoGoAiCloudClientConfig.getInstance().token, + QueryLeaveAwayPassengersRequest(seq, siteId) + ) + .transformTry() + .subscribe(OchCommonSubscribeImpl(context, callback, "queryStationLeaveAwayPassengers")) + } + + /** + * 查询当前到站点核销乘客 + * @param context + * @param siteId + * @param callback + */ + @JvmStatic + fun queryStationWriteOffPassengers( + context: Context, + taskId: Int, + siteId: Int, + prePassengerTime: Long, + callback: OchCommonServiceCallback? + ) { + mService.queryWriteOffPassengers( + MoGoAiCloudClientConfig.getInstance().serviceAppId, + MoGoAiCloudClientConfig.getInstance().token, + BusWriteOffPassengersQueryRequest(taskId, siteId, prePassengerTime) + ) + .transformTry() + .subscribe(OchCommonSubscribeImpl(context, callback, "queryStationWriteOffPassengers")) + } + + /** + * 查询小巴车订单 + * @param context + * @param callback + */ + @JvmStatic + fun queryBusOrders(context: Context, callback: OchCommonServiceCallback?) { + mService.queryBusOrders( + MoGoAiCloudClientConfig.getInstance().serviceAppId, + MoGoAiCloudClientConfig.getInstance().token, + MoGoAiCloudClientConfig.getInstance().sn + ) + .transformTry() + .subscribe(OchCommonSubscribeImpl(context, callback, "queryBusOrders")) + } + @JvmStatic + fun queryBusLines(context: Context, callback: OchCommonServiceCallback?) { + mService.queryBusLines( + MoGoAiCloudClientConfig.getInstance().serviceAppId, + MoGoAiCloudClientConfig.getInstance().token, + MoGoAiCloudClientConfig.getInstance().sn + ) + .transformTry() + .subscribe(OchCommonSubscribeImpl(context, callback, "queryBusLines")) + } + @JvmStatic + fun queryBusTaskByLineId( + context: Context, + lineId: String?, + callback: OchCommonServiceCallback? + ) { + mService.queryBusTaskByLineId( + MoGoAiCloudClientConfig.getInstance().serviceAppId, + MoGoAiCloudClientConfig.getInstance().token, + lineId + ) + .transformTry() + .subscribe(OchCommonSubscribeImpl(context, callback, "queryBusLines")) + } + @JvmStatic + fun updateOrderRoute( + context: Context, + lineId: Int, + startSiteId: Int, + endSiteId: Int, + points: List?, + callback: OchCommonServiceCallback? + ) { + mService.updateOrderRoute( + MoGoAiCloudClientConfig.getInstance().serviceAppId, + MoGoAiCloudClientConfig.getInstance().token, + BusRoutePlanningUpdateReqBean( + MoGoAiCloudClientConfig.getInstance().sn, lineId, startSiteId, endSiteId, points + ) + ) + .transformTry() + .subscribe(OchCommonSubscribeImpl(context, callback, "updateOrderRoute")) + } + + /** + * 车机端上传心跳数据(只在出车状态时上传):包含高德坐标系经纬度 + * @param context + * @param lon + * @param lat + * @param callback + */ + @JvmStatic + fun runCarHeartbeat( + context: Context, lon: Double, lat: Double, + callback: OchCommonServiceCallback? + ) { + mService.runCarHeartbeat( + MoGoAiCloudClientConfig.getInstance().serviceAppId, + MoGoAiCloudClientConfig.getInstance().token, + CarHeartbeatReqBean( + MoGoAiCloudClientConfig.getInstance().sn, lon, lat + ) + ) + .transformTry() + .subscribe(OchCommonSubscribeImpl(context, callback, "runCarHeartbeat")) + } + +} \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IBusApiService.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IBusApiService.java index f4c50754fb..7eced02c3a 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IBusApiService.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IBusApiService.java @@ -1,13 +1,15 @@ package com.mogo.och.bus.net; import com.mogo.eagle.core.data.BaseData; -import com.mogo.och.bus.bean.BusOperationStatusRequest; +import com.mogo.och.bus.bean.BusCloseTaskRequest; import com.mogo.och.bus.bean.BusOrdersResponse; +import com.mogo.och.bus.bean.BusQueryWriteOffPassengersResponse; +import com.mogo.och.bus.bean.BusWriteOffPassengersQueryRequest; +import com.mogo.och.bus.bean.BusQueryLineTaskResponse; import com.mogo.och.bus.bean.BusQueryLinesResponse; import com.mogo.och.bus.bean.BusRoutePlanningUpdateReqBean; import com.mogo.och.bus.bean.BusRoutesResponse; import com.mogo.och.bus.bean.CarHeartbeatReqBean; import com.mogo.och.bus.bean.BusQueryLineStationsRequest; -import com.mogo.och.bus.bean.BusOperationStatusResponse; import com.mogo.och.bus.bean.QueryLeaveAwayPassengersRequest; import com.mogo.och.bus.bean.QueryLeaveAwayPassengersResponse; import com.mogo.och.bus.bean.BusResetDrivingLineRequest; @@ -39,19 +41,16 @@ public interface IBusApiService { // @POST( "/autopilot-car-hailing/line/v2/lineDataWithDriver/query" ) @POST( "/autopilot-car-hailing/line/v2/driver/bus/lineDataWithDriver/query" ) // @POST( "/mock/268/autopilot-car-hailing/bus/api/lineDataWithDriver/query" ) - Observable querySiteByCoordinate(@Header ("appId") String appId, @Header("ticket") String ticket, @Body BusQueryLineStationsRequest request); + Observable queryBusRoutes(@Header ("appId") String appId, @Header("ticket") String ticket, @Body BusQueryLineStationsRequest request); /** - * 重置巴士路线: 点击小巴车tab 或者出车后会使用 - * * @param request 请求参数{"destLine":1,"sn":"F803EB2046PZD00229"} 这个接口是重置bus线路的, 不是重置线路中站点的 * @return 返回值是重置后的车站列表 + * 开始路线 */ @Headers( {"Content-Type:application/json;charset=UTF-8"} ) -// @POST( "/autopilot-car-hailing/car/v2/bus/drivingLine/reset" ) - @POST( "/autopilot-car-hailing/car/v2/driver/bus/drivingLine/reset" ) -// @POST( "/mock/268/autopilot-car-hailing/bus/api/drivingLine/reset" ) - Observable resetStationStatus(@Header ("appId") String appId, @Header("ticket") String ticket, @Body BusResetDrivingLineRequest request); + @POST( "/autopilot-car-hailing/cab/flow/v1/bus/driver/bus/startTask" ) + Observable switchLine(@Header ("appId") String appId, @Header("ticket") String ticket, @Body BusResetDrivingLineRequest request); /** * 离站,通知服务器 @@ -60,9 +59,10 @@ public interface IBusApiService { */ @Headers({"Content-Type:application/json;charset=UTF-8"}) // @POST("/autopilot-car-hailing/car/v2/bus/driving/away") - @POST("/autopilot-car-hailing/car/v2/driver/bus/driving/away") +// @POST("/autopilot-car-hailing/car/v2/driver/bus/driving/away") + @POST("/autopilot-car-hailing/cab/flow/v1/bus/driver/bus/leave") // @POST("/mock/268/autopilot-car-hailing/bus/api/driving/away") - Observable leaveStation(@Header ("appId") String appId, @Header("ticket") String ticket, @Body BusUpdateSiteStatusRequest request); + Observable leaveStation(@Header ("appId") String appId, @Header("ticket") String ticket, @Body BusUpdateSiteStatusRequest request); /** * 到站 更新到站信息 @@ -71,7 +71,8 @@ public interface IBusApiService { */ @Headers({"Content-type:application/json;charset=UTF-8"}) // @POST("/autopilot-car-hailing/order/v2/bus/driving/attachSite") - @POST("/autopilot-car-hailing/order/v2/driver/bus/driving/attachSite") +// @POST("/autopilot-car-hailing/order/v2/driver/bus/driving/attachSite") + @POST("/autopilot-car-hailing/cab/flow/v1/bus/driver/bus/arrive") // @POST("/mock/268/autopilot-car-hailing/bus/api/driving/attachSite") Observable< BaseData > arriveSiteStation(@Header ("appId") String appId,@Header("ticket") String ticket,@Body BusUpdateSiteStatusRequest request); @@ -87,39 +88,6 @@ public interface IBusApiService { // @POST("/mock/268/autopilot-car-hailing/bus/api/driving/siteArrivedOrders") Observable< QueryLeaveAwayPassengersResponse > queryStationLeaveAwayPassengers(@Header ("appId") String appId,@Header("ticket") String ticket,@Body QueryLeaveAwayPassengersRequest request); - /** - * 出车 - * @param request - * @return - */ - @Headers( {"Content-type:application/json;charset=UTF-8"} ) -// @POST("/autopilot-car-hailing/car/v2/bus/startTakeOrder") - @POST("/autopilot-car-hailing/car/v2/driver/bus/startTakeOrder") -// @POST("/mock/268/autopilot-car-hailing/bus/api/startTakeOrder") - Observable startTakeOrder(@Header ("appId") String appId,@Header("ticket") String ticket,@Body BusOperationStatusRequest request); - - /** - * 收车 - * @param request - * @return - */ - @Headers({"Content-type:application/json;charset=UTF-8"}) -// @POST("/autopilot-car-hailing/car/v2/bus/stopTakeOrder") - @POST("/autopilot-car-hailing/car/v2/driver/bus/stopTakeOrder") -// @POST("/mock/268/autopilot-car-hailing/bus/api/stopTakeOrder") - Observable stopTakeOrder(@Header ("appId") String appId,@Header("ticket") String ticket,@Body BusOperationStatusRequest request); - - /** - * 查询小巴出车/收车状态 - * @param sn - * @return - */ - @Headers({"Content-type:application/json;charset=UTF-8"}) -// @GET("/autopilot-car-hailing/car/v2/bus/takeOrderStatus/query") - @GET("/autopilot-car-hailing/car/v2/driver/bus/takeOrderStatus/query") -// @GET("/mock/268/autopilot-car-hailing/bus/api/takeOrderStatus/query") - Observable queryOperationStatus(@Header ("appId") String appId, @Header("ticket") String ticket, @Query("sn") String sn); - @Headers({"Content-type:application/json;charset=UTF-8"}) // @GET("/autopilot-car-hailing/order/v2/bus/servicingOrders/query") @GET("/autopilot-car-hailing/order/v2/driver/bus/servicingOrders/query") @@ -143,12 +111,54 @@ public interface IBusApiService { * @param sn * @return */ -// @GET("/autopilot-car-hailing/line/v2/driver/bindLine/query") @GET("/autopilot-car-hailing/line/v2/driver/bus/bindLine/query") Observable queryBusLines(@Header ("appId") String appId, @Header("ticket") String ticket, @Query("sn") String sn); + /** + * 查询路线当天的任务 + * @param appId + * @param ticket + * @param lineId 线路id + * @return + */ + @GET("/autopilot-car-hailing/line/v2/driver/bus/task/query") + Observable queryBusTaskByLineId(@Header ("appId") String appId, @Header("ticket") String ticket, @Query("lineId") String lineId); + + @Headers( {"Content-type:application/json;charset=UTF-8"} ) @POST( "/autopilot-car-hailing/location/v2/driver/bus/saveLineCoordinate" ) Observable updateOrderRoute(@Header ("appId") String appId, @Header("ticket") String ticket, @Body BusRoutePlanningUpdateReqBean data); + + /** + * 中止任务 + * @param appId + * @param ticket + * @param data + * @return + */ + @POST("/autopilot-car-hailing/cab/flow/v1/bus/driver/bus/abortTask") + Observable abortTask(@Header ("appId") String appId, @Header("ticket") String ticket, @Body BusCloseTaskRequest data); + + /** + * 任务正常跑完结束 + * @param appId + * @param ticket + * @param data + * @return + */ + @Headers( {"Content-type:application/json;charset=UTF-8"} ) + @POST("/autopilot-car-hailing/cab/flow/v1/bus/driver/bus/endTask") + Observable endTask(@Header ("appId") String appId, @Header("ticket") String ticket, @Body BusCloseTaskRequest data); + + /** + * 任务正常跑完结束 + * @param appId + * @param ticket + * @param data + * @return + */ + @Headers( {"Content-type:application/json;charset=UTF-8"} ) + @POST("/autopilot-car-hailing/operation/v1/driver/order/verificationResult") + Observable queryWriteOffPassengers(@Header ("appId") String appId, @Header("ticket") String ticket, @Body BusWriteOffPassengersQueryRequest data); } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IBusServiceCallback.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IBusServiceCallback.java deleted file mode 100644 index 966a86d980..0000000000 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IBusServiceCallback.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.mogo.och.bus.net; - -/** - * @author: wangmingjun - * @date: 2021/10/20 - */ -public interface IBusServiceCallback< T >{ - void onSuccess(T o); - - void onFail(String failMsg); - - default void onError() { - - } -} diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusLinePresenter.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusLinePresenter.java index c2f6fb57da..512346c064 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusLinePresenter.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusLinePresenter.java @@ -7,18 +7,26 @@ import androidx.lifecycle.LifecycleOwner; import com.mogo.commons.mvp.Presenter; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; +import com.mogo.och.bus.bean.BusQueryLineTaskResponse; import com.mogo.och.bus.bean.BusQueryLinesResponse; import com.mogo.och.bus.callback.IBusLinesCallback; import com.mogo.och.bus.model.BusLineModel; import com.mogo.och.bus.model.BusOrderModel; import com.mogo.och.bus.ui.BusSwitchLineView; +import java.util.concurrent.TimeUnit; + +import io.reactivex.Observable; +import io.reactivex.disposables.Disposable; + /** * @author: wangmingjun * @date: 2022/2/9 */ public class BusLinePresenter extends Presenter implements IBusLinesCallback { + private Disposable subscribe; + public BusLinePresenter(BusSwitchLineView view) { super(view); BusLineModel.getInstance().init(); @@ -53,6 +61,7 @@ public class BusLinePresenter extends Presenter implements IB @Override public void onChangeLineIdSuccess() { + BusOrderModel.getInstance().clearBusStationDatas(); runOnUIThread(() -> mView.onChangeLineIdSuccess()); } @@ -60,8 +69,21 @@ public class BusLinePresenter extends Presenter implements IB BusLineModel.getInstance().queryBusLines(); } - public void commitSwitchLineId(int lineId){ - BusLineModel.getInstance().commitSwitchLineId(lineId); + public void queryBusLineTasks(int lineId, int position,boolean close){ + if(subscribe!=null&&!subscribe.isDisposed()){ + subscribe.dispose(); + } + if(close){ + return; + } + BusLineModel.getInstance().queryBusLineTasksById(lineId,position,false); + subscribe = Observable.interval(3, TimeUnit.MINUTES).subscribe(aLong -> { + BusLineModel.getInstance().queryBusLineTasksById(lineId,position,true); + }); + } + + public void commitSwitchLineId(int taskId,int lineId){ + BusLineModel.getInstance().commitSwitchLineId(taskId,lineId); } public void removeListener(){ @@ -75,5 +97,14 @@ public class BusLinePresenter extends Presenter implements IB @Override public void onDestroy(@NonNull LifecycleOwner owner) { super.onDestroy(owner); + if(subscribe!=null&&!subscribe.isDisposed()){ + subscribe.dispose(); + } + } + + + @Override + public void onBusLineTasks(BusQueryLineTaskResponse o, int position,boolean autoRefresh) { + mView.onBusLineTasks(o,position,autoRefresh); } } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusModelLoopManager.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusModelLoopManager.java index b431946ae0..ad76324a64 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusModelLoopManager.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusModelLoopManager.java @@ -1,6 +1,8 @@ package com.mogo.och.bus.presenter; import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS; +import static com.mogo.och.bus.constant.BusConst.LOOP_DELAY_500; +import static com.mogo.och.bus.constant.BusConst.LOOP_PASSENGER_5S; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.och.bus.constant.BusConst; @@ -31,6 +33,28 @@ public class BusModelLoopManager { } private Disposable mHeartbeatDisposable; //心跳轮询 + private Disposable mQueryPassengerDisposable; //查询核销乘客 + + public void startQueryPassengerWriteOffLoop() { + if (mQueryPassengerDisposable != null && !mQueryPassengerDisposable.isDisposed()) { + return; + } + CallerLogger.INSTANCE.i(M_BUS + TAG, "startQueryPassengerWriteOffLoop()"); + mQueryPassengerDisposable = Observable.interval(LOOP_DELAY_500, + LOOP_PASSENGER_5S, TimeUnit.MILLISECONDS) + .map((aLong -> aLong + 1)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(aLong -> BusOrderModel.getInstance().queryPassengerWriteOff()); + } + + public void stopQueryPassengerWriteOffLoop() { + if (mQueryPassengerDisposable != null) { + CallerLogger.INSTANCE.i(M_BUS + TAG, "stopQueryPassengerWriteOffLoop()"); + mQueryPassengerDisposable.dispose(); + mQueryPassengerDisposable = null; + } + } public void startHeartbeatLoop() { if (mHeartbeatDisposable != null && !mHeartbeatDisposable.isDisposed()) { 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 fadc4ad8d1..c4d1be3b85 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 @@ -9,21 +9,32 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.lifecycle.LifecycleOwner; +import com.mogo.commons.AbsMogoApplication; import com.mogo.commons.mvp.Presenter; +import com.mogo.commons.voice.AIAssist; import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo; import com.mogo.eagle.core.data.config.FunctionBuildConfig; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener; import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; +import com.mogo.och.bus.R; import com.mogo.och.bus.bean.BusStationBean; -import com.mogo.och.bus.callback.ICarOperationStatusCallback; +import com.mogo.och.bus.bean.WriteOffPassenger; +import com.mogo.och.bus.callback.IBusADASStatusCallback; import com.mogo.och.bus.callback.IBusControllerStatusCallback; +import com.mogo.och.bus.callback.IPassengerCallback; import com.mogo.och.bus.callback.IRefreshBusStationsCallback; import com.mogo.och.bus.callback.ISlidePannelHideCallback; import com.mogo.och.bus.fragment.BusFragment; import com.mogo.och.bus.model.BusOrderModel; import com.mogo.och.bus.util.BusTrajectoryManager; +import com.mogo.och.common.module.biz.bean.DriverStatusQueryRespBean; +import com.mogo.och.common.module.biz.callback.ILoginCallback; +import com.mogo.och.common.module.manager.OCHAdasAbilityManager; +import com.mogo.och.common.module.utils.SoundPoolHelper; +import com.mogo.och.common.module.voice.VoiceNotice; +import com.zhidao.socket.utils.LoginStatusUtil; import org.jetbrains.annotations.NotNull; @@ -40,27 +51,26 @@ import system_master.SystemStatusInfo; * @author tongchenfei */ public class BusPresenter extends Presenter - implements ICarOperationStatusCallback, IRefreshBusStationsCallback, ISlidePannelHideCallback - , IMoGoAutopilotStatusListener, IBusControllerStatusCallback { + implements IRefreshBusStationsCallback, ISlidePannelHideCallback + , IMoGoAutopilotStatusListener, IBusControllerStatusCallback, ILoginCallback, IPassengerCallback, IBusADASStatusCallback { private static final String TAG = "BusPresenter"; private int currentAutopilotStatus = -1; private List mStationList = new ArrayList<>(); private int mCurrentStation = 0; - private boolean isRestartAutopilot = false; public BusPresenter(BusFragment view) { super(view); //2021.11.1 鹰眼架构整合,由IMoGoAutopilotStatusListener逐步替代IMogoAdasOCHCallback接口 CallerAutoPilotStatusListenerManager.INSTANCE.addListener(TAG, this); BusOrderModel.getInstance().init(); + OCHAdasAbilityManager.getInstance().init(AbsMogoApplication.getApp()); } @Override public void onCreate(@NonNull LifecycleOwner owner) { super.onCreate(owner); - BusOrderModel.getInstance().queryOperationStatus(); BusOrderModel.getInstance().queryBusRoutes(); initModelListener(); } @@ -73,86 +83,85 @@ public class BusPresenter extends Presenter } public void initModelListener() { - BusOrderModel.getInstance().setCarOperationStatusCallback(this); BusOrderModel.getInstance().setRefreshBusStationsCallback(this); - BusOrderModel.getInstance().setSlidePannelHideCallback(this); + BusOrderModel.getInstance().setSlidePanelHideCallback(this); BusOrderModel.getInstance().setControllerStatusCallback(this); + BusOrderModel.getInstance().setPassengerCallback(this); + BusOrderModel.getInstance().setAdasStatusCallback(this); } public void releaseListener() { - BusOrderModel.getInstance().setCarOperationStatusCallback(null); BusOrderModel.getInstance().setRefreshBusStationsCallback(null); - BusOrderModel.getInstance().setSlidePannelHideCallback(null); + BusOrderModel.getInstance().setSlidePanelHideCallback(null); BusOrderModel.getInstance().setControllerStatusCallback(null); + BusOrderModel.getInstance().setPassengerCallback(null); + BusOrderModel.getInstance().setAdasStatusCallback(null); + OCHAdasAbilityManager.getInstance().release(); } - public void queryBusRoutes() { - BusOrderModel.getInstance().queryBusRoutes(); + public void abortTask() { + BusOrderModel.getInstance().abortTask(); } - public void debugResetStationStatus() { - BusOrderModel.getInstance().debugResetStationStatus(); - } - - public void autoDriveToNextStation(boolean isRestart) { + public void autoDriveToNextStation() { currentAutopilotStatus = -1; - BusOrderModel.getInstance().autoDriveToNextStation(isRestart); - isRestartAutopilot = false; + BusOrderModel.getInstance().autoDriveToNextStation(); +// isRestartAutopilot = false; } public void restartAutopilot() { if (BusOrderModel.getInstance().isGoingToNextStation()){ currentAutopilotStatus = -1; BusOrderModel.getInstance().restartAutopilot(); - isRestartAutopilot = true; +// isRestartAutopilot = true; } } - public void onChangeOperationStatus() { - BusOrderModel.getInstance().onChangeOperationStatus(); + // 登出 + public void logout() { + BusOrderModel.getInstance().logout(); } @Override - public void changeOperationStatus(boolean changeStatus) { - if (mView != null) { - runOnUIThread(() -> mView.changeOperationStatus(changeStatus)); - } - } - - @Override - public void refreshBusStations(String lineName,List stationList - , int currentStation, int nextStation, boolean isArrived) { + public void updateBusTaskStatus(String lineName,String lineTime, + List stationList, + int arrivingOrArrivedIndex, + boolean isArrived) { mStationList.clear(); mStationList.addAll(stationList); - mCurrentStation = currentStation; -// functionDemoModeChange(); + if (arrivingOrArrivedIndex == 0 || isArrived){ + mCurrentStation = arrivingOrArrivedIndex; + }else { + mCurrentStation = arrivingOrArrivedIndex -1; + } CallerLogger.INSTANCE.d(M_BUS + "BusOrderModel =", " mCurrentStation =" + mCurrentStation); if (mView != null) { - runOnUIThread(() -> mView.refreshBusStations(lineName, - stationList, currentStation, nextStation, isArrived)); + runOnUIThread(() -> mView.updateBusTaskStatus(lineName,lineTime, + stationList, arrivingOrArrivedIndex, isArrived)); } } - private void functionDemoModeChange() { -// CallerLogger.INSTANCE.d(M_BUS + "BusOrderModel ="," functionDemoModeChange ="+mCurrentStation); - if (FunctionBuildConfig.isDemoMode - && ((mCurrentStation > 0 && mCurrentStation < mStationList.size() - 1) - || ((mCurrentStation == 0 || mCurrentStation == mStationList.size() - 1) - && BusOrderModel.getInstance().isGoingToNextStation()))) { - runOnUIThread(() -> mView.onAutopilotStatusChanged( - IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING)); - } + @Override + public void updateEmptyUi() { + runOnUIThread(() -> mView.updateLineEmptyUI()); + } + + @Override + public void clearBusStationsMarkers() { + runOnUIThread(() -> mView.clearBusStationsMarkers()); } @Override public void hideSlidePanel() { if (mView != null) { runOnUIThread(() -> mView.hideSlidePanel()); + runOnUIThread(()-> mView.setArrivedClikable(true)); } } @Override public void onAutopilotArriveAtStation(MessagePad.ArrivalNotification arrivalNotification) { + CallerLogger.INSTANCE.e( M_BUS + TAG, "行程日志-onAutopilotArriveAtStation arrive"); BusOrderModel.getInstance().onArriveAt(arrivalNotification); } @@ -169,62 +178,51 @@ public class BusPresenter extends Presenter switch (state) { case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE: if (currentAutopilotStatus != IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE) { - if (currentAutopilotStatus == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) {//2-->1语音提示 -// AIAssist.getInstance( getContext() ).speakTTSVoice( "已进入人工驾驶模式" ); - } - currentAutopilotStatus = IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE; // 设置UI【自动驾驶】按钮是否展示 runOnUIThread(() -> mView.onAutopilotEnableChange(true)); - if (BusOrderModel.getInstance().isGoingToNextStation()) { - runOnUIThread(() -> mView.hideSlidePanel()); - } - if (FunctionBuildConfig.isDemoMode - && ( - (mCurrentStation > 0 && mCurrentStation < mStationList.size() - 1) - || ( - (mCurrentStation == 0 || mCurrentStation == mStationList.size() - 1) - && BusOrderModel.getInstance().isGoingToNextStation() - ) - ) - ) { - CallerLogger.INSTANCE.d(M_BUS + "BusOrderModel=", "有美化功能"); - return; - } - // 改变UI自动驾驶状态 - runOnUIThread(() -> mView.onAutopilotStatusChanged(currentAutopilotStatus)); } + if (FunctionBuildConfig.isDemoMode + && ( + (mCurrentStation >= 0 && mCurrentStation <= mStationList.size() - 1) + && BusOrderModel.getInstance().isGoingToNextStation() + ) + ) { + CallerLogger.INSTANCE.d(M_BUS + "BusOrderModel=", "有美化功能"); + return; + } + if (currentAutopilotStatus != IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE) { + currentAutopilotStatus = IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE; + } + // 改变UI自动驾驶状态 + runOnUIThread(() -> mView.onAutopilotStatusChanged(currentAutopilotStatus)); break; case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING: if (currentAutopilotStatus != IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) { currentAutopilotStatus = IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING; - // 改变UI自动驾驶状态 - runOnUIThread(() -> mView.onAutopilotStatusChanged(currentAutopilotStatus)); BusOrderModel.getInstance().triggerStartServiceEvent( - isRestartAutopilot, true); + BusOrderModel.getInstance().isRestartAutopilot(), true); } + // 改变UI自动驾驶状态 + runOnUIThread(() -> mView.onAutopilotStatusChanged(currentAutopilotStatus)); break; case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE: - if (currentAutopilotStatus != IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE) { - if (currentAutopilotStatus == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) {//2-->0语音提示 -// AIAssist.getInstance( getContext() ).speakTTSVoice( "自动驾驶已停止,请人工接管" ); - } - currentAutopilotStatus = IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE; - if (FunctionBuildConfig.isDemoMode - && ( - (mCurrentStation > 0 && mCurrentStation < mStationList.size() - 1) - || ( - (mCurrentStation == 0 || mCurrentStation == mStationList.size() - 1) - && BusOrderModel.getInstance().isGoingToNextStation() - ) - ) - ) { - CallerLogger.INSTANCE.d(M_BUS + "BusOrderModel=", "有美化功能"); - return; - } - runOnUIThread(() -> { - mView.onAutopilotStatusChanged(currentAutopilotStatus); - }); + if (FunctionBuildConfig.isDemoMode + && ( + (mCurrentStation >= 0 && mCurrentStation <= mStationList.size() - 1) + && BusOrderModel.getInstance().isGoingToNextStation() + + ) + ) { + CallerLogger.INSTANCE.d(M_BUS + "BusOrderModel=", "有美化功能"); + return; } + + if (currentAutopilotStatus != IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE) { + currentAutopilotStatus = IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE; + } + runOnUIThread(() -> { + mView.onAutopilotStatusChanged(currentAutopilotStatus); + }); break; default: runOnUIThread(() -> mView.onAutopilotEnableChange(false)); @@ -285,4 +283,40 @@ public class BusPresenter extends Presenter public void onAutopilotStatusRespByQuery(@NonNull SystemStatusInfo.StatusInfo status) { } + @Override + public void loginSuccess(DriverStatusQueryRespBean data) { + if(LoginStatusUtil.isLogin()){ + BusOrderModel.getInstance().startOrStopOrderLoop(true); + }else { + BusTrajectoryManager.getInstance().stopTrajReqLoop(); + BusOrderModel.getInstance().startOrStopOrderLoop(false); + BusTrajectoryManager.getInstance().stopTrajReqLoop(); + clearBusStationsMarkers(); + mView.hideSlidePanel(); + BusOrderModel.getInstance().closeBeautificationMode(); + } + BusOrderModel.getInstance().queryBusRoutes(); + + } + + @Override + public void loginFail(boolean isLogin) { + + } + + @Override + public void playPassenger(WriteOffPassenger passenger) { + int passengerNum = passenger.passengerSize; + if (passengerNum > 1){ //多人播报 "x人" ---》x人核验通过 + VoiceNotice.showNotice(passengerNum+"人核验通过", AIAssist.LEVEL3); + }else { //是 1 播放 "滴" 2022.11.09 改为: "核验通过" +// mView.playDI(); + VoiceNotice.showNotice("核验通过", AIAssist.LEVEL3); + } + } + + @Override + public void onStartAdasFailure() { + runOnUIThread(() -> mView.stopAnimAndUpdateBtnStatus()); + } } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusStationCommonItem.kt b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusStationCommonItem.kt new file mode 100644 index 0000000000..ed9f463413 --- /dev/null +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusStationCommonItem.kt @@ -0,0 +1,99 @@ +package com.mogo.och.bus.ui + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.widget.ImageView +import android.widget.LinearLayout +import androidx.core.content.ContextCompat +import com.mogo.och.bus.R +import com.mogo.och.common.module.utils.BlinkAnimationUtil +import kotlinx.android.synthetic.main.bus_stations_common_item.view.* + +/** + * @author: wangmingjun + * @date: 2022/9/15 + */ +class BusStationCommonItem @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : LinearLayout(context, attrs, defStyleAttr){ + + init { + LayoutInflater.from(context).inflate(R.layout.bus_stations_common_item,this,true) + } + + fun setStationName(name: String){ + busStationNameTv.text = name + } + + fun setStationNameColor(color: Int){ + busStationNameTv.setTextColor(color) + } + + fun setStationPointBg(type: Int) { // 0:灰色 过站 1:绿色 到站或者即将到站 2:蓝色:未到站 + BlinkAnimationUtil.clearAnimation(busCircleIv) + when (type) { + 0 -> { + busCircleIvBg.visibility = GONE + busCircleIv.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_point_grey_bus + ) + ) + } + 1 -> { + busCircleIvBg.visibility = VISIBLE + busCircleIv.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_point_green_bus + ) + ) + BlinkAnimationUtil.setAnimation(busCircleIv) + } + 2 -> { + busCircleIvBg.visibility = GONE + busCircleIv.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_point_blue_bus + ) + ) + } + + } + } + + fun getCircleImageView() : ImageView{ + return busCircleIv + } + + fun setStationArrowBg(type: Int){// 0:灰色 过站 1:绿色 前往下一站 2:蓝色 未到站 + when(type){ + 0 -> busArrowBg.setImageResource(R.drawable.icon_arrow_grey_bus) + 1 -> busArrowBg.setImageResource(R.drawable.icon_arrow_green_bus) + 2 -> busArrowBg.setImageResource(R.drawable.icon_arrow_blue_bus) + } + + } + + fun setStationTag(tag: String){ // 0:起 1:终 + if (tag.isNullOrEmpty()){ + busTagTxt.visibility = GONE + }else{ + busTagTxt.text = tag + busTagTxt.visibility = VISIBLE + } + } + + fun showOrHideStationArrowBg(isShow:Boolean){ + if (isShow){ + busArrowBg.visibility = VISIBLE + }else{ + busArrowBg.visibility = GONE + } + } +} \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.java deleted file mode 100644 index 847071ba49..0000000000 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.java +++ /dev/null @@ -1,299 +0,0 @@ -package com.mogo.och.bus.ui; - -import android.content.Context; -import android.graphics.Point; -import android.os.Bundle; -import android.text.TextUtils; -import android.view.Gravity; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.view.Window; -import android.view.WindowManager; -import android.widget.ImageView; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.constraintlayout.widget.ConstraintLayout; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - -import com.mogo.commons.mvp.MvpActivity; -import com.mogo.eagle.core.utilcode.util.ToastUtils; -import com.mogo.och.bus.R; -import com.mogo.och.bus.bean.BusQueryLinesResponse; -import com.mogo.och.bus.presenter.BusLinePresenter; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author: wangmingjun - * @date: 2022/2/8 - */ -public class BusSwitchLineActivity extends MvpActivity - implements View.OnClickListener, BusSwitchLineView { - - private ImageView mClose; - private ConstraintLayout mNoDatasView; - private RecyclerView mLinesListView; - private TextView mLineCommitBtn; - private SwitchLineAdapter mAdapter; - private List mData = new ArrayList<>(); - private int mSelectLineId = -1; - - @Override - protected int getLayoutId() { - return R.layout.activity_bus_switch_line; - } - - @NonNull - @Override - protected BusLinePresenter createPresenter() { - return new BusLinePresenter(this); - } - - @Override - protected void initViews() { - initWH(); - initView(); - } - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - initDatas(); - } - - /** - * 初始化view - */ - private void initView() { - mClose = findViewById(R.id.switch_line_close); - mClose.setOnClickListener(this); - mNoDatasView = findViewById(R.id.no_order_data_view); - - mLineCommitBtn = findViewById(R.id.switch_line_btn_commit); - mLineCommitBtn.setOnClickListener(this); - - mLinesListView = findViewById(R.id.switch_line_rv); - mLinesListView.setLayoutManager(new LinearLayoutManager(this)); - mAdapter = new SwitchLineAdapter(getApplicationContext(),mData); - mLinesListView.setAdapter(mAdapter); - //设置item 点击事件 - mAdapter.setOnLineItemClickListener(new LineItemClickListener() { - @Override - public void onItemClick(int position) { - if (mData.size() > position && !TextUtils.isEmpty(mData.get(position).startSiteName ) - && !TextUtils.isEmpty(mData.get(position).endSiteName)){ - mSelectLineId = mData.get(position).lineId; - }else { - mSelectLineId = -1; - } - } - }); - } - - /** - * 设置布局宽高 - */ - private void initWH() { - - Window window = getWindow(); - - WindowManager.LayoutParams params = window.getAttributes(); - WindowManager windowManager = (WindowManager)getSystemService(Context.WINDOW_SERVICE); - Point point = new Point(); - windowManager.getDefaultDisplay().getSize(point);//用于获取屏幕高度 - - params.width = (int)(point.x * 0.375); - params.height = ViewGroup.LayoutParams.MATCH_PARENT; - window.setAttributes(params); - window.setGravity(Gravity.LEFT|Gravity.BOTTOM); - } - - /** - * 初始化数据 - */ - private void initDatas() { - mPresenter.queryBusLines(); - } - - /** - * 查询返回绑定路线集合 - * @param data - */ - @Override - public void onBusLinesChange(BusQueryLinesResponse data){ - if (null == data){ - showNoData(true); - return; - } - if (data.data != null && data.data.size() > 0){ - showNoData(false); - mData.clear(); - mData.addAll(data.data); - mAdapter.notifyDataSetChanged(); - changeCommitBtnBg(); - }else { - showNoData(true); - } - } - - /** - * 根据路线选中情况设置提交按钮样式 - */ - private void changeCommitBtnBg() { - for (int i=0; i -1){ - mPresenter.commitSwitchLineId(mSelectLineId); - }else { - finish(); - } - return; - } - } - - @Override - protected void onDestroy() { - super.onDestroy(); - } - - /** - * 路线列表adapter - */ - static class SwitchLineAdapter extends RecyclerView.Adapter{ - - private Context mContext; - private List mData; - // RecyclerView设置点击事件 - private LineItemClickListener mItemClickListener ; - private int clickPos = -1; - - public SwitchLineAdapter(Context context, List data){ - mContext = context; - mData = data; - } - - @NonNull - @Override - public SwitchLineViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - View view = LayoutInflater.from(mContext).inflate(R.layout.bus_switch_line_list_item - ,parent,false); - SwitchLineViewHolder viewHolder = new SwitchLineViewHolder(view); - return viewHolder; - } - - @Override - public void onBindViewHolder(@NonNull SwitchLineViewHolder holder, int position) { - BusQueryLinesResponse.Result line = mData.get(position); - holder.lineName.setText(mContext.getString(R.string.bus_switch_line_name)+" "+line.name); - holder.lineStartName.setText(mContext.getString(R.string.bus_line_start)+" "+line.startSiteName); - holder.lineEndName.setText(mContext.getString(R.string.bus_line_end)+" "+line.endSiteName); - - //设置item点击事件 - holder.itemView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (mItemClickListener != null){ - mItemClickListener.onItemClick(position); - clickPos = position; - notifyDataSetChanged(); - } - } - }); - //选中绑定 - if (clickPos > -1){ - if (clickPos == position){ - holder.selectIv.setImageResource(R.drawable.bus_selected_btn); - }else { - holder.selectIv.setImageResource(R.drawable.bus_unselect_btn); - } - }else { - if (line.choose == 1){//1:绑定 2:未绑定 默认绑定 - if (mItemClickListener != null) { - mItemClickListener.onItemClick(position); - } - holder.selectIv.setImageResource(R.drawable.bus_selected_btn); - }else { - holder.selectIv.setImageResource(R.drawable.bus_unselect_btn); - } - } - - } - - @Override - public int getItemCount() { - return mData.size(); - } - public void setOnLineItemClickListener(LineItemClickListener itemClickListener){ - this.mItemClickListener = itemClickListener ; - - } - } - - static class SwitchLineViewHolder extends RecyclerView.ViewHolder{ - - private ImageView selectIv; - private TextView lineName; //线路名称 - private TextView lineStartName; //起点 - private TextView lineEndName; //终点 - - public SwitchLineViewHolder(@NonNull View itemView) { - super(itemView); - selectIv = itemView.findViewById(R.id.switch_line_item_select_iv); - lineName = itemView.findViewById(R.id.switch_line_name); - lineStartName = itemView.findViewById(R.id.switch_line_start_station); - lineEndName = itemView.findViewById(R.id.switch_line_end_station); - } - } - - public interface LineItemClickListener { - void onItemClick(int position) ; - } -} diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.kt b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.kt new file mode 100644 index 0000000000..bc2ebdf0c3 --- /dev/null +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.kt @@ -0,0 +1,219 @@ +package com.mogo.och.bus.ui + +import android.graphics.Point +import android.os.Bundle +import android.view.Gravity +import android.view.View +import android.view.ViewGroup +import android.view.WindowManager +import android.widget.ImageView +import android.widget.TextView +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.PagerSnapHelper +import androidx.recyclerview.widget.RecyclerView +import com.mogo.commons.mvp.MvpActivity +import com.mogo.eagle.core.utilcode.util.SharedPrefs +import com.mogo.och.bus.presenter.BusLinePresenter +import com.mogo.och.bus.ui.adapter.SwitchLineAdapter +import com.mogo.och.bus.bean.BusQueryLinesResponse +import com.mogo.och.bus.ui.adapter.OpenItemAnimator +import com.mogo.module.common.view.SpacesItemDecoration +import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.mogo.och.bus.R +import com.mogo.och.bus.bean.BusQueryLineTaskResponse +import java.util.ArrayList + +/** + * @author: wangmingjun + * @date: 2022/2/8 + */ +class BusSwitchLineActivity : MvpActivity(), + View.OnClickListener, BusSwitchLineView { + + companion object{ + const val LASTCOMMITLINEID = "lastcommitlineid" + } + + private lateinit var mClose: ImageView + private lateinit var mNoDatasView: ConstraintLayout + private lateinit var mLinesListView: RecyclerView + private lateinit var mLineCommitBtn: TextView + private lateinit var mAdapter: SwitchLineAdapter + private lateinit var linearLayoutManager:LinearLayoutManager + private val mData: MutableList = ArrayList() + override fun getLayoutId(): Int { + return R.layout.activity_bus_switch_line + } + + override fun createPresenter(): BusLinePresenter { + return BusLinePresenter(this) + } + + override fun initViews() { + initWH() + initView() + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + initDatas() + } + + /** + * 初始化view + */ + private fun initView() { + mClose = findViewById(R.id.switch_line_close) + mClose.setOnClickListener(this) + mNoDatasView = findViewById(R.id.no_order_data_view) + mLineCommitBtn = findViewById(R.id.switch_line_btn_commit) + mLineCommitBtn.setOnClickListener(this) + mLinesListView = findViewById(R.id.switch_line_rv) + linearLayoutManager = LinearLayoutManager(this) + mLinesListView.setLayoutManager(linearLayoutManager) + mLinesListView.setItemAnimator(OpenItemAnimator()) + mAdapter = SwitchLineAdapter(applicationContext, mData) + mLinesListView.addItemDecoration(SpacesItemDecoration(4)) + mLinesListView.setAdapter(mAdapter) + //设置item 点击事件 + mAdapter.setOnLineItemClickListener(object :SwitchLineAdapter.LineItemClickListener{ + override fun onItemClick(position: Int, close: Boolean) { + mPresenter?.queryBusLineTasks(mData[position].lineId, position, close) + } + }) + } + + /** + * 设置布局宽高 + */ + private fun initWH() { + val window = window + val params = window.attributes + val windowManager = getSystemService(WINDOW_SERVICE) as WindowManager + val point = Point() + windowManager.defaultDisplay.getSize(point) //用于获取屏幕高度 + params.width = (point.x * 0.375).toInt() + params.height = ViewGroup.LayoutParams.MATCH_PARENT + window.attributes = params + window.setGravity(Gravity.START or Gravity.BOTTOM) + } + + /** + * 初始化数据 + */ + private fun initDatas() { + mPresenter?.queryBusLines() + } + + /** + * 查询返回绑定路线集合 + * @param data + */ + override fun onBusLinesChange(data: BusQueryLinesResponse?) { + if (null == data) { + showNoData(true) + return + } + var lastCommitLineid = SharedPrefs.getInstance(this).getInt(LASTCOMMITLINEID, -1) + if (data.data != null && data.data.size > 0) { + showNoData(false) + mData.clear() + mData.addAll(data.data) + mAdapter.notifyDataSetChanged() + if(lastCommitLineid>0){ + mData.forEachIndexed { index, line -> + if(line.lineId==lastCommitLineid){ + line.open = true + mPresenter?.queryBusLineTasks(line.lineId,index,false) + return + } + } + } + } else { + showNoData(true) + } + } + + override fun onChangeLineIdSuccess() { + ToastUtils.showLong(resources.getString(R.string.bus_change_line_commit_tip_s)) + mPresenter?.queryBusRoutes() + mAdapter.setOnLineItemClickListener(null) + mPresenter?.removeListener() + finish() + } + + override fun onBusLineTasks(lineTaskInfo: BusQueryLineTaskResponse?, position: Int,autoRefresh:Boolean) { + val result = mData[position] + if (result.taskList == null) { + result.taskList = ArrayList() + } + if (lineTaskInfo == null) { + result.haveTask = true + // 打开操作 + mAdapter.notifyItemChanged(position) + } else { + if (lineTaskInfo.data == null || lineTaskInfo.data.isEmpty()) { + result.haveTask = true + lineTaskInfo.data = ArrayList() + } + if (lineTaskInfo.data.size != result.taskList.size) { // 不相等有变动 重新赋值 + result.taskList.clear() + result.taskList.addAll(lineTaskInfo.data) + if(autoRefresh) { + mAdapter.checkTaskId = -1 + mAdapter.checkLineId = -1 + lineTaskInfo.data.forEach { + if (it.id == mAdapter.checkTaskId) { + mAdapter.checkTaskId = it.id + mAdapter.checkLineId = result.lineId + } + } + } + // 打开操作 + mAdapter.notifyItemChanged(position) + linearLayoutManager.stackFromEnd = (position==mData.size-1||position==mData.size-2)&&mData.size>6 + mLinesListView.smoothScrollToPosition(position) + }else if(lineTaskInfo.data.isEmpty()){ + mAdapter.notifyItemChanged(position) + } + } + } + + /** + * 有无数据UI显示 + * @param b + */ + private fun showNoData(b: Boolean) { + if (b) { + mLinesListView.visibility = View.GONE + mLineCommitBtn.visibility = View.GONE + mNoDatasView.visibility = View.VISIBLE + } else { + mLinesListView.visibility = View.VISIBLE + mLineCommitBtn.visibility = View.VISIBLE + mNoDatasView.visibility = View.GONE + } + } + + override fun onClick(v: View) { + //关闭dialog + if (v.id == R.id.switch_line_close) { + finish() + return + } + //切换路线提交 + if (v.id == R.id.switch_line_btn_commit) { + if(mAdapter.checkLineId!=-1&&mAdapter.checkTaskId!=-1){ + mPresenter?.commitSwitchLineId(mAdapter.checkTaskId,mAdapter.checkLineId) + }else{ + ToastUtils.showLong("请选择任务") + } + } + } + + override fun onDestroy() { + mPresenter!!.removeListener() + super.onDestroy() + } +} \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineView.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineView.java index febd6429b1..6646068909 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineView.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineView.java @@ -1,6 +1,7 @@ package com.mogo.och.bus.ui; import com.mogo.commons.mvp.IView; +import com.mogo.och.bus.bean.BusQueryLineTaskResponse; import com.mogo.och.bus.bean.BusQueryLinesResponse; /** @@ -11,5 +12,7 @@ public interface BusSwitchLineView extends IView { void onBusLinesChange(BusQueryLinesResponse data); void onChangeLineIdSuccess(); + + void onBusLineTasks(BusQueryLineTaskResponse o, int position,boolean autoRefresh); } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/OpenItemAnimator.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/OpenItemAnimator.java new file mode 100644 index 0000000000..1571739e3b --- /dev/null +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/OpenItemAnimator.java @@ -0,0 +1,655 @@ +package com.mogo.och.bus.ui.adapter; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.TimeInterpolator; +import android.animation.ValueAnimator; +import android.view.View; +import android.view.ViewPropertyAnimator; + +import androidx.annotation.NonNull; +import androidx.core.view.ViewCompat; +import androidx.recyclerview.widget.DefaultItemAnimator; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.SimpleItemAnimator; + +import java.util.ArrayList; +import java.util.List; + +/** + * This implementation of {@link RecyclerView.ItemAnimator} provides basic + * animations on remove, add, and move events that happen to the items in + * a RecyclerView. RecyclerView uses a DefaultItemAnimator by default. + * + * @see RecyclerView#setItemAnimator(RecyclerView.ItemAnimator) + */ +public class OpenItemAnimator extends DefaultItemAnimator { + private static final boolean DEBUG = false; + + private static TimeInterpolator sDefaultInterpolator; + + private ArrayList mPendingRemovals = new ArrayList<>(); + private ArrayList mPendingAdditions = new ArrayList<>(); + private ArrayList mPendingMoves = new ArrayList<>(); + private ArrayList mPendingChanges = new ArrayList<>(); + + ArrayList> mAdditionsList = new ArrayList<>(); + ArrayList> mMovesList = new ArrayList<>(); + ArrayList> mChangesList = new ArrayList<>(); + + ArrayList mAddAnimations = new ArrayList<>(); + ArrayList mMoveAnimations = new ArrayList<>(); + ArrayList mRemoveAnimations = new ArrayList<>(); + ArrayList mChangeAnimations = new ArrayList<>(); + + private static class MoveInfo { + public RecyclerView.ViewHolder holder; + public int fromX, fromY, toX, toY; + + MoveInfo(RecyclerView.ViewHolder holder, int fromX, int fromY, int toX, int toY) { + this.holder = holder; + this.fromX = fromX; + this.fromY = fromY; + this.toX = toX; + this.toY = toY; + } + } + + private static class ChangeInfo { + public RecyclerView.ViewHolder oldHolder, newHolder; + public int fromX, fromY, toX, toY; + private ChangeInfo(RecyclerView.ViewHolder oldHolder, RecyclerView.ViewHolder newHolder) { + this.oldHolder = oldHolder; + this.newHolder = newHolder; + } + + ChangeInfo(RecyclerView.ViewHolder oldHolder, RecyclerView.ViewHolder newHolder, + int fromX, int fromY, int toX, int toY) { + this(oldHolder, newHolder); + this.fromX = fromX; + this.fromY = fromY; + this.toX = toX; + this.toY = toY; + } + + @Override + public String toString() { + return "ChangeInfo{" + + "oldHolder=" + oldHolder + + ", newHolder=" + newHolder + + ", fromX=" + fromX + + ", fromY=" + fromY + + ", toX=" + toX + + ", toY=" + toY + + '}'; + } + } + + @Override + public void runPendingAnimations() { + boolean removalsPending = !mPendingRemovals.isEmpty(); + boolean movesPending = !mPendingMoves.isEmpty(); + boolean changesPending = !mPendingChanges.isEmpty(); + boolean additionsPending = !mPendingAdditions.isEmpty(); + if (!removalsPending && !movesPending && !additionsPending && !changesPending) { + // nothing to animate + return; + } + // First, remove stuff + for (RecyclerView.ViewHolder holder : mPendingRemovals) { + animateRemoveImpl(holder); + } + mPendingRemovals.clear(); + // Next, move stuff + if (movesPending) { + final ArrayList moves = new ArrayList<>(); + moves.addAll(mPendingMoves); + mMovesList.add(moves); + mPendingMoves.clear(); + Runnable mover = new Runnable() { + @Override + public void run() { + for (MoveInfo moveInfo : moves) { + animateMoveImpl(moveInfo.holder, moveInfo.fromX, moveInfo.fromY, + moveInfo.toX, moveInfo.toY); + } + moves.clear(); + mMovesList.remove(moves); + } + }; + if (removalsPending) { + View view = moves.get(0).holder.itemView; + ViewCompat.postOnAnimationDelayed(view, mover, getRemoveDuration()); + } else { + mover.run(); + } + } + // Next, change stuff, to run in parallel with move animations + if (changesPending) { + final ArrayList changes = new ArrayList<>(); + changes.addAll(mPendingChanges); + mChangesList.add(changes); + mPendingChanges.clear(); + Runnable changer = new Runnable() { + @Override + public void run() { + for (ChangeInfo change : changes) { + animateChangeImpl(change); + } + changes.clear(); + mChangesList.remove(changes); + } + }; + if (removalsPending) { + RecyclerView.ViewHolder holder = changes.get(0).oldHolder; + ViewCompat.postOnAnimationDelayed(holder.itemView, changer, getRemoveDuration()); + } else { + changer.run(); + } + } + // Next, add stuff + if (additionsPending) { + final ArrayList additions = new ArrayList<>(); + additions.addAll(mPendingAdditions); + mAdditionsList.add(additions); + mPendingAdditions.clear(); + Runnable adder = new Runnable() { + @Override + public void run() { + for (RecyclerView.ViewHolder holder : additions) { + animateAddImpl(holder); + } + additions.clear(); + mAdditionsList.remove(additions); + } + }; + if (removalsPending || movesPending || changesPending) { + long removeDuration = removalsPending ? getRemoveDuration() : 0; + long moveDuration = movesPending ? getMoveDuration() : 0; + long changeDuration = changesPending ? getChangeDuration() : 0; + long totalDelay = removeDuration + Math.max(moveDuration, changeDuration); + View view = additions.get(0).itemView; + ViewCompat.postOnAnimationDelayed(view, adder, totalDelay); + } else { + adder.run(); + } + } + } + + @Override + public boolean animateRemove(final RecyclerView.ViewHolder holder) { + resetAnimation(holder); + mPendingRemovals.add(holder); + return true; + } + + private void animateRemoveImpl(final RecyclerView.ViewHolder holder) { + final View view = holder.itemView; + final ViewPropertyAnimator animation = view.animate(); + mRemoveAnimations.add(holder); + animation.setDuration(getRemoveDuration()).alpha(0).setListener( + new AnimatorListenerAdapter() { + @Override + public void onAnimationStart(Animator animator) { + dispatchRemoveStarting(holder); + } + + @Override + public void onAnimationEnd(Animator animator) { + animation.setListener(null); + view.setAlpha(1); + dispatchRemoveFinished(holder); + mRemoveAnimations.remove(holder); + dispatchFinishedWhenDone(); + } + }).start(); + } + + @Override + public boolean animateAdd(final RecyclerView.ViewHolder holder) { + resetAnimation(holder); + holder.itemView.setAlpha(0); + mPendingAdditions.add(holder); + return true; + } + + void animateAddImpl(final RecyclerView.ViewHolder holder) { + final View view = holder.itemView; + final ViewPropertyAnimator animation = view.animate(); + mAddAnimations.add(holder); + animation.alpha(1).setDuration(getAddDuration()) + .setListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationStart(Animator animator) { + dispatchAddStarting(holder); + } + + @Override + public void onAnimationCancel(Animator animator) { + view.setAlpha(1); + } + + @Override + public void onAnimationEnd(Animator animator) { + animation.setListener(null); + dispatchAddFinished(holder); + mAddAnimations.remove(holder); + dispatchFinishedWhenDone(); + } + }).start(); + } + + @Override + public boolean animateMove(final RecyclerView.ViewHolder holder, int fromX, int fromY, + int toX, int toY) { + final View view = holder.itemView; + fromX += (int) holder.itemView.getTranslationX(); + fromY += (int) holder.itemView.getTranslationY(); + resetAnimation(holder); + int deltaX = toX - fromX; + int deltaY = toY - fromY; + if (deltaX == 0 && deltaY == 0) { + dispatchMoveFinished(holder); + return false; + } + if (deltaX != 0) { + view.setTranslationX(-deltaX); + } + if (deltaY != 0) { + view.setTranslationY(-deltaY); + } + mPendingMoves.add(new MoveInfo(holder, fromX, fromY, toX, toY)); + return true; + } + + void animateMoveImpl(final RecyclerView.ViewHolder holder, int fromX, int fromY, int toX, int toY) { + final View view = holder.itemView; + final int deltaX = toX - fromX; + final int deltaY = toY - fromY; + if (deltaX != 0) { + view.animate().translationX(0); + } + if (deltaY != 0) { + view.animate().translationY(0); + } + // TODO: make EndActions end listeners instead, since end actions aren't called when + // vpas are canceled (and can't end them. why?) + // need listener functionality in VPACompat for this. Ick. + final ViewPropertyAnimator animation = view.animate(); + mMoveAnimations.add(holder); + animation.setDuration(getMoveDuration()).setListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationStart(Animator animator) { + dispatchMoveStarting(holder); + } + + @Override + public void onAnimationCancel(Animator animator) { + if (deltaX != 0) { + view.setTranslationX(0); + } + if (deltaY != 0) { + view.setTranslationY(0); + } + } + + @Override + public void onAnimationEnd(Animator animator) { + animation.setListener(null); + dispatchMoveFinished(holder); + mMoveAnimations.remove(holder); + dispatchFinishedWhenDone(); + } + }).start(); + } + + @Override + public boolean animateChange(RecyclerView.ViewHolder oldHolder, RecyclerView.ViewHolder newHolder, + int fromX, int fromY, int toX, int toY) { + if (oldHolder == newHolder) { + // Don't know how to run change animations when the same view holder is re-used. + // run a move animation to handle position changes. + return animateMove(oldHolder, fromX, fromY, toX, toY); + } + final float prevTranslationX = oldHolder.itemView.getTranslationX(); + final float prevTranslationY = oldHolder.itemView.getTranslationY(); + final float prevAlpha = oldHolder.itemView.getAlpha(); + resetAnimation(oldHolder); + int deltaX = (int) (toX - fromX - prevTranslationX); + int deltaY = (int) (toY - fromY - prevTranslationY); + // recover prev translation state after ending animation + oldHolder.itemView.setTranslationX(prevTranslationX); + oldHolder.itemView.setTranslationY(prevTranslationY); + oldHolder.itemView.setAlpha(prevAlpha); + if (newHolder != null) { + // carry over translation values + resetAnimation(newHolder); + newHolder.itemView.setTranslationX(-deltaX); + newHolder.itemView.setTranslationY(-deltaY); + newHolder.itemView.setAlpha(0); + } + mPendingChanges.add(new ChangeInfo(oldHolder, newHolder, fromX, fromY, toX, toY)); + return true; + } + + void animateChangeImpl(final ChangeInfo changeInfo) { + final RecyclerView.ViewHolder holder = changeInfo.oldHolder; + final View view = holder == null ? null : holder.itemView; + final RecyclerView.ViewHolder newHolder = changeInfo.newHolder; + final View newView = newHolder != null ? newHolder.itemView : null; + if (view != null) { + final ViewPropertyAnimator oldViewAnim = view.animate().setDuration( + getChangeDuration()); + mChangeAnimations.add(changeInfo.oldHolder); + oldViewAnim.translationX(changeInfo.toX - changeInfo.fromX); + oldViewAnim.translationY(changeInfo.toY - changeInfo.fromY); + oldViewAnim.alpha(0).setListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationStart(Animator animator) { + dispatchChangeStarting(changeInfo.oldHolder, true); + } + + @Override + public void onAnimationEnd(Animator animator) { + oldViewAnim.setListener(null); + view.setAlpha(1); + view.setTranslationX(0); + view.setTranslationY(0); + dispatchChangeFinished(changeInfo.oldHolder, true); + mChangeAnimations.remove(changeInfo.oldHolder); + dispatchFinishedWhenDone(); + } + }).start(); + } + if (newView != null) { + final ViewPropertyAnimator newViewAnimation = newView.animate(); + mChangeAnimations.add(changeInfo.newHolder); + newViewAnimation.translationX(0).translationY(0).setDuration(getChangeDuration()) + .alpha(1).setListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationStart(Animator animator) { + dispatchChangeStarting(changeInfo.newHolder, false); + } + @Override + public void onAnimationEnd(Animator animator) { + newViewAnimation.setListener(null); + newView.setAlpha(1); + newView.setTranslationX(0); + newView.setTranslationY(0); + dispatchChangeFinished(changeInfo.newHolder, false); + mChangeAnimations.remove(changeInfo.newHolder); + dispatchFinishedWhenDone(); + } + }).start(); + } + } + + private void endChangeAnimation(List infoList, RecyclerView.ViewHolder item) { + for (int i = infoList.size() - 1; i >= 0; i--) { + ChangeInfo changeInfo = infoList.get(i); + if (endChangeAnimationIfNecessary(changeInfo, item)) { + if (changeInfo.oldHolder == null && changeInfo.newHolder == null) { + infoList.remove(changeInfo); + } + } + } + } + + private void endChangeAnimationIfNecessary(ChangeInfo changeInfo) { + if (changeInfo.oldHolder != null) { + endChangeAnimationIfNecessary(changeInfo, changeInfo.oldHolder); + } + if (changeInfo.newHolder != null) { + endChangeAnimationIfNecessary(changeInfo, changeInfo.newHolder); + } + } + private boolean endChangeAnimationIfNecessary(ChangeInfo changeInfo, RecyclerView.ViewHolder item) { + boolean oldItem = false; + if (changeInfo.newHolder == item) { + changeInfo.newHolder = null; + } else if (changeInfo.oldHolder == item) { + changeInfo.oldHolder = null; + oldItem = true; + } else { + return false; + } + item.itemView.setAlpha(1); + item.itemView.setTranslationX(0); + item.itemView.setTranslationY(0); + dispatchChangeFinished(item, oldItem); + return true; + } + + @Override + public void endAnimation(RecyclerView.ViewHolder item) { + final View view = item.itemView; + // this will trigger end callback which should set properties to their target values. + view.animate().cancel(); + // TODO if some other animations are chained to end, how do we cancel them as well? + for (int i = mPendingMoves.size() - 1; i >= 0; i--) { + MoveInfo moveInfo = mPendingMoves.get(i); + if (moveInfo.holder == item) { + view.setTranslationY(0); + view.setTranslationX(0); + dispatchMoveFinished(item); + mPendingMoves.remove(i); + } + } + endChangeAnimation(mPendingChanges, item); + if (mPendingRemovals.remove(item)) { + view.setAlpha(1); + dispatchRemoveFinished(item); + } + if (mPendingAdditions.remove(item)) { + view.setAlpha(1); + dispatchAddFinished(item); + } + + for (int i = mChangesList.size() - 1; i >= 0; i--) { + ArrayList changes = mChangesList.get(i); + endChangeAnimation(changes, item); + if (changes.isEmpty()) { + mChangesList.remove(i); + } + } + for (int i = mMovesList.size() - 1; i >= 0; i--) { + ArrayList moves = mMovesList.get(i); + for (int j = moves.size() - 1; j >= 0; j--) { + MoveInfo moveInfo = moves.get(j); + if (moveInfo.holder == item) { + view.setTranslationY(0); + view.setTranslationX(0); + dispatchMoveFinished(item); + moves.remove(j); + if (moves.isEmpty()) { + mMovesList.remove(i); + } + break; + } + } + } + for (int i = mAdditionsList.size() - 1; i >= 0; i--) { + ArrayList additions = mAdditionsList.get(i); + if (additions.remove(item)) { + view.setAlpha(1); + dispatchAddFinished(item); + if (additions.isEmpty()) { + mAdditionsList.remove(i); + } + } + } + + // animations should be ended by the cancel above. + //noinspection PointlessBooleanExpression,ConstantConditions + if (mRemoveAnimations.remove(item) && DEBUG) { + throw new IllegalStateException("after animation is cancelled, item should not be in " + + "mRemoveAnimations list"); + } + + //noinspection PointlessBooleanExpression,ConstantConditions + if (mAddAnimations.remove(item) && DEBUG) { + throw new IllegalStateException("after animation is cancelled, item should not be in " + + "mAddAnimations list"); + } + + //noinspection PointlessBooleanExpression,ConstantConditions + if (mChangeAnimations.remove(item) && DEBUG) { + throw new IllegalStateException("after animation is cancelled, item should not be in " + + "mChangeAnimations list"); + } + + //noinspection PointlessBooleanExpression,ConstantConditions + if (mMoveAnimations.remove(item) && DEBUG) { + throw new IllegalStateException("after animation is cancelled, item should not be in " + + "mMoveAnimations list"); + } + dispatchFinishedWhenDone(); + } + + private void resetAnimation(RecyclerView.ViewHolder holder) { + if (sDefaultInterpolator == null) { + sDefaultInterpolator = new ValueAnimator().getInterpolator(); + } + holder.itemView.animate().setInterpolator(sDefaultInterpolator); + endAnimation(holder); + } + + @Override + public boolean isRunning() { + return (!mPendingAdditions.isEmpty() + || !mPendingChanges.isEmpty() + || !mPendingMoves.isEmpty() + || !mPendingRemovals.isEmpty() + || !mMoveAnimations.isEmpty() + || !mRemoveAnimations.isEmpty() + || !mAddAnimations.isEmpty() + || !mChangeAnimations.isEmpty() + || !mMovesList.isEmpty() + || !mAdditionsList.isEmpty() + || !mChangesList.isEmpty()); + } + + /** + * Check the state of currently pending and running animations. If there are none + * pending/running, call {@link #dispatchAnimationsFinished()} to notify any + * listeners. + */ + void dispatchFinishedWhenDone() { + if (!isRunning()) { + dispatchAnimationsFinished(); + } + } + + @Override + public void endAnimations() { + int count = mPendingMoves.size(); + for (int i = count - 1; i >= 0; i--) { + MoveInfo item = mPendingMoves.get(i); + View view = item.holder.itemView; + view.setTranslationY(0); + view.setTranslationX(0); + dispatchMoveFinished(item.holder); + mPendingMoves.remove(i); + } + count = mPendingRemovals.size(); + for (int i = count - 1; i >= 0; i--) { + RecyclerView.ViewHolder item = mPendingRemovals.get(i); + dispatchRemoveFinished(item); + mPendingRemovals.remove(i); + } + count = mPendingAdditions.size(); + for (int i = count - 1; i >= 0; i--) { + RecyclerView.ViewHolder item = mPendingAdditions.get(i); + item.itemView.setAlpha(1); + dispatchAddFinished(item); + mPendingAdditions.remove(i); + } + count = mPendingChanges.size(); + for (int i = count - 1; i >= 0; i--) { + endChangeAnimationIfNecessary(mPendingChanges.get(i)); + } + mPendingChanges.clear(); + if (!isRunning()) { + return; + } + + int listCount = mMovesList.size(); + for (int i = listCount - 1; i >= 0; i--) { + ArrayList moves = mMovesList.get(i); + count = moves.size(); + for (int j = count - 1; j >= 0; j--) { + MoveInfo moveInfo = moves.get(j); + RecyclerView.ViewHolder item = moveInfo.holder; + View view = item.itemView; + view.setTranslationY(0); + view.setTranslationX(0); + dispatchMoveFinished(moveInfo.holder); + moves.remove(j); + if (moves.isEmpty()) { + mMovesList.remove(moves); + } + } + } + listCount = mAdditionsList.size(); + for (int i = listCount - 1; i >= 0; i--) { + ArrayList additions = mAdditionsList.get(i); + count = additions.size(); + for (int j = count - 1; j >= 0; j--) { + RecyclerView.ViewHolder item = additions.get(j); + View view = item.itemView; + view.setAlpha(1); + dispatchAddFinished(item); + additions.remove(j); + if (additions.isEmpty()) { + mAdditionsList.remove(additions); + } + } + } + listCount = mChangesList.size(); + for (int i = listCount - 1; i >= 0; i--) { + ArrayList changes = mChangesList.get(i); + count = changes.size(); + for (int j = count - 1; j >= 0; j--) { + endChangeAnimationIfNecessary(changes.get(j)); + if (changes.isEmpty()) { + mChangesList.remove(changes); + } + } + } + + cancelAll(mRemoveAnimations); + cancelAll(mMoveAnimations); + cancelAll(mAddAnimations); + cancelAll(mChangeAnimations); + + dispatchAnimationsFinished(); + } + + void cancelAll(List viewHolders) { + for (int i = viewHolders.size() - 1; i >= 0; i--) { + viewHolders.get(i).itemView.animate().cancel(); + } + } + + /** + * {@inheritDoc} + *

+ * If the payload list is not empty, DefaultItemAnimator returns true. + * When this is the case: + *

    + *
  • If you override {@link #animateChange(RecyclerView.ViewHolder, RecyclerView.ViewHolder, int, int, int, int)}, both + * ViewHolder arguments will be the same instance. + *
  • + *
  • + * If you are not overriding {@link #animateChange(RecyclerView.ViewHolder, RecyclerView.ViewHolder, int, int, int, int)}, + * then DefaultItemAnimator will call {@link #animateMove(RecyclerView.ViewHolder, int, int, int, int)} and + * run a move animation instead. + *
  • + *
+ */ + @Override + public boolean canReuseUpdatedViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, + @NonNull List payloads) { + return !payloads.isEmpty() || super.canReuseUpdatedViewHolder(viewHolder, payloads); + } +} \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineAdapter.kt b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineAdapter.kt new file mode 100644 index 0000000000..741fd6480e --- /dev/null +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineAdapter.kt @@ -0,0 +1,175 @@ +package com.mogo.och.bus.ui.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.appcompat.widget.AppCompatTextView +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.mogo.och.bus.R +import com.mogo.och.bus.bean.BusQueryLinesResponse +import com.mogo.och.bus.ui.adapter.SwitchLineAdapter.SwitchLineViewHolder +import kotlin.text.StringBuilder + +/** + * 路线列表adapter + */ +class SwitchLineAdapter( + private val mContext: Context, + private val mData: List +) : RecyclerView.Adapter() { + companion object{ + const val TAG = "SwitchLineAdapter" + } + // RecyclerView设置点击事件 + private var mItemClickListener: LineItemClickListener? = null + var checkLineId:Int = -1 + var checkTaskId:Int = -1 + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): SwitchLineViewHolder { + val view = LayoutInflater.from(mContext).inflate( + R.layout.bus_switch_line_list_item, parent, false + ) + return SwitchLineViewHolder(view) + } + + override fun onBindViewHolder(holder: SwitchLineViewHolder, position: Int) { + val currentPosition = holder.bindingAdapterPosition + val line = mData[currentPosition] + if(line.name!=null&&line.name.length>10){ + line.name = line.name.substring(0,10)+"…" + } + holder.lineName.text = line.name + val sb = StringBuilder() + if (line.endSiteName!=null&&line.endSiteName.length>10) { + sb.append(line.endSiteName.substring(0,5)) + sb.append("…") + sb.append(line.endSiteName.substring(line.endSiteName.length-5,line.endSiteName.length)) + }else{ + sb.append(line.endSiteName) + } + val string = mContext.getString(R.string.bus_line_goto_end, sb.toString()) + holder.lineEndName.text = string + holder.rvLineTask.layoutManager = GridLayoutManager(mContext, 3) + val switchLineTaskAdapter = SwitchLineTaskAdapter( + mContext, + checkTaskId, + line.taskList, + object : SwitchLineTaskAdapter.TaskItemClickListener { + override fun onItemClick(position: Int,isCheck:Boolean) { + if(isCheck) { + checkLineId = line.lineId + checkTaskId = line.taskList[position].id + }else{ + checkLineId=-1 + checkTaskId=-1 + } + } + }) + holder.rvLineTask.adapter = switchLineTaskAdapter + holder.rvLineTask.isFocusableInTouchMode = false + holder.actvShowMore.visibility = View.VISIBLE + + if(line.open){ + if(line.taskList==null||line.taskList.isEmpty()){ + holder.actvShowMore.text = mContext.getString(R.string.bus_switch_line_no_task) + holder.actvShowMore.setTextColor(ContextCompat.getColor(mContext,R.color.bus_color_4dffffff)) + holder.vLineTask.visibility = View.GONE + holder.rvLineTask.visibility = View.GONE + holder.selectIv.visibility = View.INVISIBLE + holder.itemView.setBackgroundResource(R.drawable.bus_shape_select_line_item_bg_normal) + }else { + holder.actvShowMore.text = mContext.getString(R.string.bus_switch_line_select_task) + holder.actvShowMore.setTextColor(ContextCompat.getColor(mContext,android.R.color.white)) + holder.vLineTask.visibility = View.VISIBLE + holder.rvLineTask.visibility = View.VISIBLE + holder.selectIv.visibility = View.VISIBLE + holder.itemView.setBackgroundResource(R.drawable.bus_shape_select_line_item_bg_selected) + holder.selectIv.apply { + pivotX = 9.5f + pivotY = 17f + rotation = 90f + } + } + }else{ + if(line.haveTask){ + holder.actvShowMore.text = mContext.getString(R.string.bus_switch_line_no_task) + holder.actvShowMore.setTextColor(ContextCompat.getColor(mContext,R.color.bus_color_4dffffff)) + holder.vLineTask.visibility = View.GONE + holder.rvLineTask.visibility = View.GONE + holder.selectIv.visibility = View.INVISIBLE + holder.itemView.setBackgroundResource(R.drawable.bus_shape_select_line_item_bg_normal) + }else { + holder.actvShowMore.text = mContext.getString(R.string.bus_switch_line_select_task) + holder.actvShowMore.setTextColor(ContextCompat.getColor(mContext,android.R.color.white)) + holder.vLineTask.visibility = View.GONE + holder.rvLineTask.visibility = View.GONE + holder.selectIv.visibility = View.VISIBLE + holder.itemView.setBackgroundResource(R.drawable.bus_shape_select_line_item_bg_normal) + holder.selectIv.apply { + pivotX = 9.5f + pivotY = 17f + rotation = 0f + } + } + } + + + //设置item点击事件 + holder.itemView.setOnClickListener { + if(holder.actvShowMore.text==mContext.getString(R.string.bus_switch_line_no_task)){ + return@setOnClickListener + } + mData.forEachIndexed { index, result -> + if(result.open){ + result.open = false; + notifyItemChanged(index) + if(result.taskList!=null) { + result.taskList.clear() + } + if(index==currentPosition){// 点击当前已经打开的item 去关闭定时网络请求 + mItemClickListener?.onItemClick(currentPosition,true) + return@setOnClickListener + } + } + } + mItemClickListener?.onItemClick(currentPosition,false) + line.open = holder.rvLineTask.visibility == View.GONE + } + } + + override fun getItemCount(): Int { + return mData.size + } + + fun setOnLineItemClickListener(itemClickListener: LineItemClickListener?) { + mItemClickListener = itemClickListener + } + + class SwitchLineViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val selectIv: ImageView + val lineName: AppCompatTextView//线路名称 + val lineEndName: AppCompatTextView //终点 + val actvShowMore: AppCompatTextView //选择时间 + val rvLineTask: RecyclerView// 排班时间 + val vLineTask: View// 白色分割线 + + init { + selectIv = itemView.findViewById(R.id.switch_line_item_select_iv) + lineName = itemView.findViewById(R.id.switch_line_name) + lineEndName = itemView.findViewById(R.id.switch_line_end_station) + rvLineTask = itemView.findViewById(R.id.rv_line_task_list) + vLineTask = itemView.findViewById(R.id.v_line_task) + actvShowMore = itemView.findViewById(R.id.actv_show_more) + } + } + + interface LineItemClickListener { + fun onItemClick(position: Int,close:Boolean) + } +} \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineTaskAdapter.kt b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineTaskAdapter.kt new file mode 100644 index 0000000000..8183e0efd4 --- /dev/null +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineTaskAdapter.kt @@ -0,0 +1,76 @@ +package com.mogo.och.bus.ui.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.mogo.eagle.core.utilcode.util.TimeUtils +import com.mogo.och.bus.R +import com.mogo.och.bus.bean.BusQueryLineTaskResponse +import com.mogo.och.bus.ui.adapter.SwitchLineTaskAdapter.SwitchLineTaskViewHolder + +/** + * 路线列表adapter + */ +class SwitchLineTaskAdapter( + private val mContext: Context, + private var checkTaskId:Int, + private val mData: List?, + private val mTaskItemClickListener: TaskItemClickListener? +) : RecyclerView.Adapter() { + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SwitchLineTaskViewHolder { + val view = LayoutInflater.from(mContext).inflate( + R.layout.bus_switch_line_list_task_item, parent, false + ) + return SwitchLineTaskViewHolder(view) + } + + override fun onBindViewHolder(holder: SwitchLineTaskViewHolder, position: Int) { + val currentPosition = holder.bindingAdapterPosition + val task = mData!![currentPosition] + val taskStartTime = TimeUtils.millis2String(task.taskStartTime, "HH:mm") + holder.lineTask.text = taskStartTime + if(checkTaskId==task.id){ + holder.lineTask.setBackgroundResource(R.drawable.bus_shape_select_line_item_time_bg_selected) + }else{ + holder.lineTask.setBackgroundResource(R.drawable.bus_shape_select_line_item_time_bg) + } + holder.lineTask.setOnClickListener { + if(checkTaskId==task.id){ + checkTaskId = -1 + mTaskItemClickListener?.onItemClick(currentPosition,false) + }else { + resetOther() + checkTaskId = task.id + mTaskItemClickListener?.onItemClick(currentPosition,true) + } + notifyItemChanged(currentPosition) + } + } + + private fun resetOther() { + mData?.forEachIndexed { index, result -> + if(result.id==checkTaskId){ + checkTaskId = -1 + notifyItemChanged(index) + } + } + } + + override fun getItemCount(): Int { + return mData?.size ?: 0 + } + + class SwitchLineTaskViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val lineTask: TextView // 时间 + init { + lineTask = itemView.findViewById(R.id.actv_line_task) + } + } + + interface TaskItemClickListener { + fun onItemClick(position: Int,isCheck:Boolean) + } +} \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/util/BusAnalyticsManager.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/util/BusAnalyticsManager.java index 915070fad4..f06c6bbd72 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/util/BusAnalyticsManager.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/util/BusAnalyticsManager.java @@ -1,5 +1,6 @@ package com.mogo.och.bus.util; +import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS; import android.text.TextUtils; import com.mogo.cloud.passport.MoGoAiCloudClientConfig; @@ -8,12 +9,12 @@ import com.mogo.eagle.core.data.app.AppConfigInfo; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener; import com.mogo.eagle.core.function.call.analytics.AnalyticsManager; import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager; +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.util.DateTimeUtils; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; import com.mogo.och.bus.constant.BusConst; import java.util.HashMap; -import java.util.Map; /** * OCH Bus埋点工具 @@ -30,18 +31,35 @@ public class BusAnalyticsManager { return BusAnalyticsManager.SingletonHolder.INSTANCE; } - - private String mStartAutopilotKey; private HashMap mStartAutopilotParams = new HashMap<>(); private Runnable startAutopilotRunnable = () -> { // 15s内未开启,上报失败埋点 + triggerStartAutopilotFailureEvent("15s后app等待超时"); + }; + + public void triggerStartAutopilotFailureEventByAdas(String failMsg){ + removeWaitingCallback(); + triggerStartAutopilotFailureEvent(failMsg); + } + + private void triggerStartAutopilotFailureEvent(String failMsg){ + CallerLogger.INSTANCE.e( M_BUS + "triggerStartAutopilotFailureEvent", failMsg ); mStartAutopilotParams.put(BusConst.EVENT_PARAM_START_RESULT , CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState() == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING); + mStartAutopilotParams.put(BusConst.EVENT_PARAM_START_FAILURE_MSG, + failMsg); AnalyticsManager.INSTANCE.track(mStartAutopilotKey, mStartAutopilotParams); - }; + } + + private void removeWaitingCallback() { + if (startAutopilotRunnable != null && + UiThreadHandler.getsUiHandler().hasCallbacks(startAutopilotRunnable)) { + UiThreadHandler.removeCallbacks(startAutopilotRunnable); + } + } /** * 触发'开启自动驾驶'埋点流程 @@ -69,14 +87,38 @@ public class BusAnalyticsManager { if (send) { // 开启成功,上报埋点 - if (startAutopilotRunnable != null && - UiThreadHandler.getsUiHandler().hasCallbacks(startAutopilotRunnable)) { - UiThreadHandler.removeCallbacks(startAutopilotRunnable); - } + removeWaitingCallback(); mStartAutopilotParams.put(BusConst.EVENT_PARAM_START_RESULT, true); AnalyticsManager.INSTANCE.track(mStartAutopilotKey, mStartAutopilotParams); } else { UiThreadHandler.postDelayed(startAutopilotRunnable, BusConst.LOOP_PERIOD_15S); } } + + /** + * 触发"无法开启自驾已知异常"埋点 + * @param startName + * @param endName + * @param lineId + */ + public void triggerUnableStartAPReasonEvent(String startName, String endName, int lineId, + String reason) { + String sn = MoGoAiCloudClientConfig.getInstance().getSn(); + String plateNum = AppConfigInfo.INSTANCE.getPlateNumber(); + String dateTime = DateTimeUtils.getTimeText( + System.currentTimeMillis(), DateTimeUtils.yyyy_MM_dd_HH_mm_ss); + + HashMap params = new HashMap<>(); + + params.put(BusConst.EVENT_PARAM_SN, sn); + params.put(BusConst.EVENT_PARAM_PLATE_NUM, TextUtils.isEmpty(plateNum) ? "" : plateNum); + params.put(BusConst.EVENT_PARAM_ENV_ONLINE, + DebugConfig.getNetMode() == DebugConfig.NET_MODE_RELEASE ? true : false); + params.put(BusConst.EVENT_PARAM_TIME, dateTime); + params.put(BusConst.EVENT_PARAM_START_NAME, startName); + params.put(BusConst.EVENT_PARAM_END_NAME, endName); + params.put(BusConst.EVENT_PARAM_LINE_ID, lineId); + params.put(BusConst.EVENT_PARAM_UNABLE_START_REASON, reason); + AnalyticsManager.INSTANCE.track(BusConst.EVENT_KEY_AP_UNABLE_START_REASON, params); + } } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/util/BusSendTripInfoManager.kt b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/util/BusSendTripInfoManager.kt new file mode 100644 index 0000000000..9d0073363a --- /dev/null +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/util/BusSendTripInfoManager.kt @@ -0,0 +1,36 @@ +package com.mogo.och.bus.util + +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant + +/** + * @author: wangmingjun + * @date: 2022/10/24 + */ +object BusSendTripInfoManager{ + + const val START_TRIP = 1 + const val END_TRIP = 2 + const val LEAVE_STATION = 3 + const val ARRIVE_STATION = 4 + + /** + * 行程信息 + * @param type 事件类型, 1:行程开始, 2:行程结束, 3:出站, 4:进站, 5:城市占道施工预警 + * @param lineName 路线名, for type 1, 2 + * @param departureStopName 出站站点名, for type 3, 4 + * @param arrivalStopName 下一站到达站点名, for type 3, 4 + * @param isLastStop 是否终点站(下一站或者要到达站) + * @return + */ + fun sendBusTripInfo(type: Int, lineName: String, + departureStopName: String, + arrivalStopName: String, + isLastStop: Boolean) { + d(SceneConstant.M_BUS + "BusSendTripInfoManager", "type: "+ type + +", lineName: "+ lineName +", departureStopName: "+ departureStopName + + ", arrivalStopName: "+arrivalStopName+", isLastStop: "+isLastStop) + CallerAutoPilotManager.sendTripInfo(type,lineName,departureStopName, arrivalStopName, isLastStop) + } +} 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 85654e2853..94ad2be2d1 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 @@ -6,10 +6,10 @@ import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters; import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.util.GsonUtils; -import com.mogo.eagle.core.utilcode.util.ToastUtils; import com.mogo.och.bus.bean.BusRoutesResult; import com.mogo.och.bus.constant.BusConst; import com.mogo.och.bus.model.BusOrderModel; +import com.zhidao.socket.utils.LoginStatusUtil; import java.util.concurrent.TimeUnit; @@ -50,7 +50,7 @@ public class BusTrajectoryManager { */ public void syncTrajectoryInfo() { BusRoutesResult routesResult = BusOrderModel.getInstance().getBusRoutesResult(); - if (BusOrderModel.getInstance().isWorking() && routesResult != null + if (LoginStatusUtil.isLogin() && routesResult != null && BusOrderModel.getInstance().getCurrentStationIndex() == 0 && !BusOrderModel.getInstance().isGoingToNextStation()) { CallerLogger.INSTANCE.d(M_BUS + TAG, "syncTrajectoryInfo() start."); diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_no_line_icon.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_no_line_icon.png new file mode 100755 index 0000000000..fc20dca73c Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_no_line_icon.png differ diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/icon_arrow_blue_bus.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/icon_arrow_blue_bus.png new file mode 100755 index 0000000000..026c36086f Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/icon_arrow_blue_bus.png differ diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/icon_arrow_green_bus.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/icon_arrow_green_bus.png new file mode 100755 index 0000000000..06bebc7013 Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/icon_arrow_green_bus.png differ diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/icon_arrow_grey_bus.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/icon_arrow_grey_bus.png new file mode 100755 index 0000000000..f4f9b2bca2 Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/icon_arrow_grey_bus.png differ diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/icon_no_bus_line.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/icon_no_bus_line.png new file mode 100755 index 0000000000..fc20dca73c Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/icon_no_bus_line.png differ diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/icon_point_blue_bus.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/icon_point_blue_bus.png new file mode 100755 index 0000000000..dc4c4f6f0d Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/icon_point_blue_bus.png differ diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/icon_point_green_bus.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/icon_point_green_bus.png new file mode 100755 index 0000000000..ed3b871338 Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/icon_point_green_bus.png differ diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/icon_point_grey_bus.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/icon_point_grey_bus.png new file mode 100755 index 0000000000..d43e34bb26 Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/icon_point_grey_bus.png differ diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_no_line_icon.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_no_line_icon.png new file mode 100755 index 0000000000..fc20dca73c Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_no_line_icon.png differ diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/icon_arrow_blue_bus.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/icon_arrow_blue_bus.png new file mode 100755 index 0000000000..026c36086f Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/icon_arrow_blue_bus.png differ diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/icon_arrow_green_bus.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/icon_arrow_green_bus.png new file mode 100755 index 0000000000..06bebc7013 Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/icon_arrow_green_bus.png differ diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/icon_arrow_grey_bus.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/icon_arrow_grey_bus.png new file mode 100755 index 0000000000..f4f9b2bca2 Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/icon_arrow_grey_bus.png differ diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/icon_no_bus_line.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/icon_no_bus_line.png new file mode 100755 index 0000000000..fc20dca73c Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/icon_no_bus_line.png differ diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/icon_point_blue_bus.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/icon_point_blue_bus.png new file mode 100755 index 0000000000..dc4c4f6f0d Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/icon_point_blue_bus.png differ diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/icon_point_green_bus.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/icon_point_green_bus.png new file mode 100755 index 0000000000..ed3b871338 Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/icon_point_green_bus.png differ diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/icon_point_grey_bus.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/icon_point_grey_bus.png new file mode 100755 index 0000000000..d43e34bb26 Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/icon_point_grey_bus.png differ diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_line_task_arrow.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_line_task_arrow.png new file mode 100644 index 0000000000..b32f0693a6 Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_line_task_arrow.png differ diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_no_line_icon.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_no_line_icon.png new file mode 100755 index 0000000000..fc20dca73c Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_no_line_icon.png differ diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/icon_arrow_blue_bus.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/icon_arrow_blue_bus.png new file mode 100755 index 0000000000..026c36086f Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/icon_arrow_blue_bus.png differ diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/icon_arrow_green_bus.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/icon_arrow_green_bus.png new file mode 100755 index 0000000000..06bebc7013 Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/icon_arrow_green_bus.png differ diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/icon_arrow_grey_bus.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/icon_arrow_grey_bus.png new file mode 100755 index 0000000000..f4f9b2bca2 Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/icon_arrow_grey_bus.png differ diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/icon_no_bus_line.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/icon_no_bus_line.png new file mode 100755 index 0000000000..fc20dca73c Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/icon_no_bus_line.png differ diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/icon_point_blue_bus.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/icon_point_blue_bus.png new file mode 100755 index 0000000000..dc4c4f6f0d Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/icon_point_blue_bus.png differ diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/icon_point_green_bus.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/icon_point_green_bus.png new file mode 100755 index 0000000000..ed3b871338 Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/icon_point_green_bus.png differ diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/icon_point_grey_bus.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/icon_point_grey_bus.png new file mode 100755 index 0000000000..d43e34bb26 Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/icon_point_grey_bus.png differ diff --git a/OCH/mogo-och-bus/src/main/res/drawable/bus_shape_select_line_item_bg_normal.xml b/OCH/mogo-och-bus/src/main/res/drawable/bus_shape_select_line_item_bg_normal.xml new file mode 100644 index 0000000000..272e718cce --- /dev/null +++ b/OCH/mogo-och-bus/src/main/res/drawable/bus_shape_select_line_item_bg_normal.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/drawable/bus_shape_select_line_item_bg_selected.xml b/OCH/mogo-och-bus/src/main/res/drawable/bus_shape_select_line_item_bg_selected.xml new file mode 100644 index 0000000000..e5faafb27b --- /dev/null +++ b/OCH/mogo-och-bus/src/main/res/drawable/bus_shape_select_line_item_bg_selected.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/drawable/bus_shape_select_line_item_time_bg.xml b/OCH/mogo-och-bus/src/main/res/drawable/bus_shape_select_line_item_time_bg.xml new file mode 100644 index 0000000000..ee8088637c --- /dev/null +++ b/OCH/mogo-och-bus/src/main/res/drawable/bus_shape_select_line_item_time_bg.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/drawable/bus_shape_select_line_item_time_bg_selected.xml b/OCH/mogo-och-bus/src/main/res/drawable/bus_shape_select_line_item_time_bg_selected.xml new file mode 100644 index 0000000000..e2b482ee5f --- /dev/null +++ b/OCH/mogo-och-bus/src/main/res/drawable/bus_shape_select_line_item_time_bg_selected.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/drawable/bus_switch_line_btn_commit.xml b/OCH/mogo-och-bus/src/main/res/drawable/bus_switch_line_btn_commit.xml index 324b9ece10..43f6d7af60 100644 --- a/OCH/mogo-och-bus/src/main/res/drawable/bus_switch_line_btn_commit.xml +++ b/OCH/mogo-och-bus/src/main/res/drawable/bus_switch_line_btn_commit.xml @@ -1,16 +1,10 @@ - - - - - - - - - - - \ No newline at end of file + + + + \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/drawable/bus_switch_line_btn_un_commit.xml b/OCH/mogo-och-bus/src/main/res/drawable/bus_switch_line_btn_un_commit.xml deleted file mode 100644 index d0ea7fa041..0000000000 --- a/OCH/mogo-och-bus/src/main/res/drawable/bus_switch_line_btn_un_commit.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/drawable/bus_task_time_bg.xml b/OCH/mogo-och-bus/src/main/res/drawable/bus_task_time_bg.xml new file mode 100644 index 0000000000..917f3932fe --- /dev/null +++ b/OCH/mogo-och-bus/src/main/res/drawable/bus_task_time_bg.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/layout/activity_bus_switch_line.xml b/OCH/mogo-och-bus/src/main/res/layout/activity_bus_switch_line.xml index 91d2b5134d..e5d7b2d7f5 100644 --- a/OCH/mogo-och-bus/src/main/res/layout/activity_bus_switch_line.xml +++ b/OCH/mogo-och-bus/src/main/res/layout/activity_bus_switch_line.xml @@ -3,6 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" + xmlns:tools="http://schemas.android.com/tools" android:background="@color/bus_switch_line_bg"> + android:background="@drawable/bus_switch_line_btn_commit"/> + app:layout_goneMarginTop="@dimen/module_mogo_och_station_panel_container_margin_top_no_call" /> @@ -92,17 +93,33 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" /> - + + + + + + + + + + + + + + + + + + + android:src="@drawable/bad_case_selector" /> + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/layout/bus_stations_common_item.xml b/OCH/mogo-och-bus/src/main/res/layout/bus_stations_common_item.xml new file mode 100644 index 0000000000..c7fe3c3432 --- /dev/null +++ b/OCH/mogo-och-bus/src/main/res/layout/bus_stations_common_item.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/layout/bus_switch_line_list_item.xml b/OCH/mogo-och-bus/src/main/res/layout/bus_switch_line_list_item.xml index 3119ef90c8..e3afdcd016 100644 --- a/OCH/mogo-och-bus/src/main/res/layout/bus_switch_line_list_item.xml +++ b/OCH/mogo-och-bus/src/main/res/layout/bus_switch_line_list_item.xml @@ -1,89 +1,88 @@ + android:background="@drawable/bus_shape_select_line_item_bg_normal"> + + + android:layout_marginEnd="@dimen/dp_80" + android:background="@drawable/bus_line_task_arrow" + app:layout_constraintBottom_toTopOf="@+id/v_line_task" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent" /> - + android:textSize="@dimen/dp_46" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + tools:text="@string/bus_switch_line_name" /> - - - - - - - - - + app:layout_constraintBottom_toTopOf="@+id/v_line_task" + app:layout_constraintStart_toStartOf="@+id/switch_line_name" + app:layout_constraintTop_toBottomOf="@+id/switch_line_name" + app:layout_constraintEnd_toStartOf="@+id/actv_show_more" + tools:text="@string/bus_switch_line_end" /> + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/layout/bus_switch_line_list_task_item.xml b/OCH/mogo-och-bus/src/main/res/layout/bus_switch_line_list_task_item.xml new file mode 100644 index 0000000000..07cb6d0eec --- /dev/null +++ b/OCH/mogo-och-bus/src/main/res/layout/bus_switch_line_list_task_item.xml @@ -0,0 +1,18 @@ + + + + \ 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 c9e7d8a07b..1b9bbeec01 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 @@ -10,40 +10,38 @@ app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toTopOf="parent"> - - + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintRight_toLeftOf="@+id/bus_task_time_tv"/> + app:layout_constraintTop_toTopOf="@+id/module_och_bus_line_name" + app:layout_constraintBottom_toBottomOf="@+id/module_och_bus_line_name"> + + app:layout_constraintTop_toBottomOf="@+id/module_och_bus_line_name" /> - - - - - - - + - - + - - - - - + android:layout_marginTop="@dimen/dp_18" + android:layout_marginLeft="@dimen/dp_68" + app:layout_constraintRight_toRightOf="@+id/bus_task_time_tv" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintTop_toBottomOf="@+id/bus_panel_second_station"/> + + + + \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/raw/bus_di.mp3 b/OCH/mogo-och-bus/src/main/res/raw/bus_di.mp3 new file mode 100644 index 0000000000..15b31ed247 Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/raw/bus_di.mp3 differ 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 c1a04c1abc..dc56f53ed7 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 @@ -86,11 +86,12 @@ 92px 30px - 616px + 618px 754px 40px + 32px 13px 12px 350px @@ -137,4 +138,5 @@ 154px 130px 60px + 27px \ No newline at end of file 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 db56121992..50b5675277 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 @@ -86,11 +86,12 @@ 92px 30px - 616px + 618px 754px 40px + 32px 13px 12px 350px @@ -135,4 +136,5 @@ 154px 130px 60px + 27px \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/values/colors.xml b/OCH/mogo-och-bus/src/main/res/values/colors.xml index 600e6c2c33..38419e0daa 100644 --- a/OCH/mogo-och-bus/src/main/res/values/colors.xml +++ b/OCH/mogo-och-bus/src/main/res/values/colors.xml @@ -33,7 +33,7 @@ #323C6F #2966EC - #F0151D41 + #F7151D41 #19FFFFFF #FFFFFF @@ -44,4 +44,12 @@ #FF006D43 #FFFFE198 #FFFF9B00 + #59FFFFFF + + #CCB9C3E9 + #4Dffffff + + #8E9DD4 + #2B6EFF + #00FFF8 \ No newline at end of file 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 85e4768fcc..83e1b61a23 100644 --- a/OCH/mogo-och-bus/src/main/res/values/dimens.xml +++ b/OCH/mogo-och-bus/src/main/res/values/dimens.xml @@ -89,6 +89,7 @@ 270px 30px + 30px 13px 12px 288px @@ -151,4 +152,6 @@ 154px 130px 60px + + 27px \ No newline at end of file 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 fdbca6ea6b..afe287c645 100644 --- a/OCH/mogo-och-bus/src/main/res/values/strings.xml +++ b/OCH/mogo-och-bus/src/main/res/values/strings.xml @@ -5,23 +5,46 @@ 启动成功 启动失败 自动驾驶 - 路线列表 + 任务列表 + 暂无任务 + 选择时间 路线: 起点: 终点: 确认 - 切换路线 - 自动驾驶中,不可切换路线 + 选择任务 + 结束任务 + 自动驾驶状态中,不可切换或结束路线 当前行程未完成,不可切换路线 当前车辆无路线\n请联系运营人员绑定 起点: 终点: - 更换路线成功 - 更换路线失败 + 往%1$s方向 + 更换任务成功 + 更换任务失败 起点: 终点: 当前站点: 下一站: 自动驾驶状态为0不可用 + 进站 + + + 班次: + + 提示 + 您确认要结束任务吗? + 确认 + 取消 + + 暂无任务 + + + + 已到达%1$s,带好随身物品,下车请注意。 + 车辆起步,请扶稳坐好,前方到站是%1$s,请下车的乘客做好准备。 + 感谢您体验\'蘑菇车联\'自动驾驶小巴车,我们下次再见。 + + diff --git a/OCH/mogo-och-bus/src/main/res/xml/bus_switch_line_list_item_scene.xml b/OCH/mogo-och-bus/src/main/res/xml/bus_switch_line_list_item_scene.xml new file mode 100644 index 0000000000..76ec386d95 --- /dev/null +++ b/OCH/mogo-och-bus/src/main/res/xml/bus_switch_line_list_item_scene.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-common-module/build.gradle b/OCH/mogo-och-common-module/build.gradle index 1f74335527..25fe5914f5 100644 --- a/OCH/mogo-och-common-module/build.gradle +++ b/OCH/mogo-och-common-module/build.gradle @@ -1,9 +1,11 @@ apply plugin: 'com.android.library' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' +apply plugin: 'kotlin-kapt' +apply plugin: 'com.alibaba.arouter' android { - compileSdkVersion 31 + compileSdkVersion rootProject.ext.android.compileSdkVersion buildToolsVersion "30.0.2" defaultConfig { @@ -14,6 +16,22 @@ android { testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles "consumer-rules.pro" + //ARouter apt 参数 + kapt { + useBuildCache = false + arguments { + arg("AROUTER_MODULE_NAME", project.getName()) + } + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = "1.8" } buildTypes { @@ -34,6 +52,10 @@ dependencies { androidTestImplementation 'androidx.test.ext:junit:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' implementation rootProject.ext.dependencies.amapnavi3dmap + implementation rootProject.ext.dependencies.rxandroid + + implementation rootProject.ext.dependencies.arouter + kapt rootProject.ext.dependencies.aroutercompiler if (Boolean.valueOf(USE_MAVEN_PACKAGE)) { implementation rootProject.ext.dependencies.mogoutils @@ -51,4 +73,6 @@ dependencies { implementation project(':core:function-impl:mogo-core-function-v2x') } + implementation project(':libraries:mogo-adas') + } \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/debug/java/com/mogo/och/common/module/utils/CollectionUtils.java b/OCH/mogo-och-common-module/src/debug/java/com/mogo/och/common/module/utils/CollectionUtils.java new file mode 100644 index 0000000000..a8ae762168 --- /dev/null +++ b/OCH/mogo-och-common-module/src/debug/java/com/mogo/och/common/module/utils/CollectionUtils.java @@ -0,0 +1,48 @@ +package com.mogo.och.common.module.utils; + +import com.mogo.cloud.network.OkHttpFactory; + +import java.lang.reflect.Field; +import java.util.List; + +import okhttp3.Interceptor; +import okhttp3.OkHttpClient; + +public class CollectionUtils { + public static void setInterceptor(){ + OkHttpClient okHttpClient = OkHttpFactory.Companion.getOkHttpClient(); + List interceptors = okHttpClient.interceptors(); + Field pro = getDeclaredField(interceptors, "list"); + pro.setAccessible(true); + List modifyerList = null; + try { + modifyerList = (List) pro.get(interceptors); + modifyerList.add(new SimpleInterceptor()); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + /** + * 获得名为field的字段 + * @Description:如果本身找不到去父类寻找 + * @param object + * @param fieldName + * @return Field + * @author luhao + * @since:2019年2月26日 下午4:06:16 + */ + public static Field getDeclaredField(Object object, String fieldName){ + Field field = null ; + Class clazz = object.getClass() ; + for(; clazz != Object.class ; clazz = clazz.getSuperclass()) { + try { + field = clazz.getDeclaredField(fieldName) ; + return field ; + } catch (Exception e) { + //这里甚么都不要做!并且这里的异常必须这样写,不能抛出去。 + //如果这里的异常打印或者往外抛,则就不会执行clazz = clazz.getSuperclass(),最后就不会进入到父类中了 + } + } + return null; + } +} diff --git a/OCH/mogo-och-common-module/src/debug/java/com/mogo/och/common/module/utils/SimpleInterceptor.kt b/OCH/mogo-och-common-module/src/debug/java/com/mogo/och/common/module/utils/SimpleInterceptor.kt new file mode 100644 index 0000000000..9dc0b0093e --- /dev/null +++ b/OCH/mogo-och-common-module/src/debug/java/com/mogo/och/common/module/utils/SimpleInterceptor.kt @@ -0,0 +1,26 @@ +package com.mogo.och.common.module.utils + +import android.util.Log +import okhttp3.* + +class SimpleInterceptor: Interceptor { + var first = true; + override fun intercept(chain: Interceptor.Chain): Response { + val original = chain.request() + val encodedPath = original.url().encodedPath() + Log.e("SimpleInterceptor",original.method()+ encodedPath+original.url().encodedQuery()) + when (encodedPath) { + "/autopilot-car-hailing/cab/flow/v1/bus/driver/bus/startOperation" -> { + val builder = Response.Builder() + val create = ResponseBody.create(MediaType.parse("application/json"), "{\"code\":100006,\"msg\":\"\",\"data\":null}") + builder.code(200) + builder.request(original) + builder.protocol(Protocol.HTTP_1_1) + builder.message("") + return builder.body(create).build() + } + else -> {} + } + return chain.proceed(original) + } +} \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/DriverStatusQueryRespBean.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/DriverStatusQueryRespBean.java new file mode 100644 index 0000000000..0b8692ae59 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/DriverStatusQueryRespBean.java @@ -0,0 +1,25 @@ +package com.mogo.och.common.module.biz.bean; + +import com.mogo.eagle.core.data.BaseData; + +/** + * Created by pangfan on 2021/8/19 + * + * 状态查询返回数据结构 + */ +public class DriverStatusQueryRespBean extends BaseData { + public Result data; + + public static class Result { + public int servingStatus; //1接单,1暂停接单 + public int driverStatus; //1登录,0登出 + public String orderNo; + public int purpose; // 1 运营, 2 测试, 3演示 + + public String sn; + public String plateNumber;//车牌号 + public String phone;//手机号 + public Integer lineId;//线路id + public Integer taskId;//任务id + } +} diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLoginReqBean.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLoginReqBean.java new file mode 100644 index 0000000000..ebe1fa2731 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLoginReqBean.java @@ -0,0 +1,30 @@ +package com.mogo.och.common.module.biz.bean; + +/** + * Created by yangyakun on 2021/8/19 + * 通过手机号验证码登录 + */ +public class TaxiLoginReqBean { + + public String phone; + public String captcha; + public String sn; + public Location4Login loc; + + public TaxiLoginReqBean(String phone, String code, String sn,Location4Login location4Login) { + this.phone = phone; + this.captcha = code; + this.sn = sn; + this.loc = location4Login; + } + + public static class Location4Login{ + double lat; + double lon; + + public Location4Login(double lat, double lon) { + this.lat = lat; + this.lon = lon; + } + } +} diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLoginRespBean.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLoginRespBean.java new file mode 100644 index 0000000000..9cda2a96c6 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLoginRespBean.java @@ -0,0 +1,18 @@ +package com.mogo.och.common.module.biz.bean; + +import com.mogo.eagle.core.data.BaseData; + +/** + * Created by yangyakun on 2021/8/19 + * 通过验证码登录 + */ +public class TaxiLoginRespBean extends BaseData { + + public Result data; + + public static class Result { + public Double lat; + public Double lon; + } + +} diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLoginSmsReqBean.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLoginSmsReqBean.java new file mode 100644 index 0000000000..3c246bc153 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLoginSmsReqBean.java @@ -0,0 +1,14 @@ +package com.mogo.och.common.module.biz.bean; + +/** + * Created by yyk on 2021/8/19 + * 获取验证码 + */ +public class TaxiLoginSmsReqBean { + + public String phone; + + public TaxiLoginSmsReqBean(String phone) { + this.phone = phone; + } +} diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLogoutReqBean.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLogoutReqBean.java new file mode 100644 index 0000000000..22e63dd838 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLogoutReqBean.java @@ -0,0 +1,25 @@ +package com.mogo.och.common.module.biz.bean; + +/** + * Created by yyk on 2021/8/19 + * 登出请求参数 + */ +public class TaxiLogoutReqBean { + public String sn; + public Location4Login loc; + + public TaxiLogoutReqBean(String sn, Location4Login location4Login) { + this.sn = sn; + this.loc = location4Login; + } + + public static class Location4Login{ + double lat; + double lon; + + public Location4Login(double lat, double lon) { + this.lat = lat; + this.lon = lon; + } + } +} diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/callback/ILoginCallback.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/callback/ILoginCallback.java new file mode 100644 index 0000000000..481a2cd75b --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/callback/ILoginCallback.java @@ -0,0 +1,9 @@ +package com.mogo.och.common.module.biz.callback; + +import com.mogo.och.common.module.biz.bean.DriverStatusQueryRespBean; + +public interface ILoginCallback { + void loginSuccess(DriverStatusQueryRespBean data); + + void loginFail(boolean isLogin); +} diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/callback/ILoginViewCallback.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/callback/ILoginViewCallback.kt new file mode 100644 index 0000000000..033e900e77 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/callback/ILoginViewCallback.kt @@ -0,0 +1,13 @@ +package com.mogo.och.common.module.biz.callback + +interface ILoginViewCallback { + /** + * 展示登录页面 + */ + fun showLoginDialogFragment() + + /** + * 隐藏登录页面 + */ + fun hideLoginDialogFragment() +} \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/callback/ITaxiLoginCallback.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/callback/ITaxiLoginCallback.java new file mode 100644 index 0000000000..5cbca0d853 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/callback/ITaxiLoginCallback.java @@ -0,0 +1,11 @@ +package com.mogo.och.common.module.biz.callback; + +/** + * Created on 2021/9/8 + * + * Model->Presenter回调:订单相关(进行中/待服务单变更,当前进行单状态变更,新到预约单,抢单,抢单结果状态等等) + */ +public interface ITaxiLoginCallback { + void getPhoneCodeSuccess(); + void loginSuccess(); +} diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/LoginStatusManager.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/LoginStatusManager.kt new file mode 100644 index 0000000000..8f290529b7 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/LoginStatusManager.kt @@ -0,0 +1,38 @@ +package com.mogo.och.common.module.biz.constant + +object LoginStatusManager { + /** + * 登录状态 + */ + private var loginStatus: TaxiLoginStatusEnum = TaxiLoginStatusEnum.None + + @JvmStatic + fun setLoginStatus(status: Int) { + when (status) { + 0 -> { + this.loginStatus = TaxiLoginStatusEnum.Logout + } + 1 -> { + this.loginStatus = TaxiLoginStatusEnum.Login + } + else -> { + this.loginStatus = TaxiLoginStatusEnum.None + } + } + } + @JvmStatic + fun setLoginStatus(loginStatus: TaxiLoginStatusEnum) { + this.loginStatus = loginStatus + } + @JvmStatic + fun getLoginStatus(): TaxiLoginStatusEnum { + return loginStatus + } + @JvmStatic + fun isLogin():Boolean { + if(loginStatus== TaxiLoginStatusEnum.Login){ + return true + } + return false + } +} \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/OchCommonConst.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/OchCommonConst.kt new file mode 100644 index 0000000000..6e1891710e --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/OchCommonConst.kt @@ -0,0 +1,30 @@ +package com.mogo.och.common.module.biz.constant + +import com.mogo.commons.debug.DebugConfig + +/** + * Created on 2021/12/6 + */ +class OchCommonConst { + companion object { + + private const val BASE_URL_OCH_DEV = "http://tech-dev.zhidaohulian.com" + private const val BASE_URL_OCH_QA = "https://tech-qa.zhidaohulian.com" + private const val BASE_URL_OCH_RELEASE = "https://tech.zhidaohulian.com" + + @JvmStatic + fun getBaseUrl(): String { + return when (DebugConfig.getNetMode()) { + DebugConfig.NET_MODE_DEV, DebugConfig.NET_MODE_DEMO -> BASE_URL_OCH_DEV + DebugConfig.NET_MODE_QA -> BASE_URL_OCH_QA + DebugConfig.NET_MODE_RELEASE -> BASE_URL_OCH_RELEASE + else -> BASE_URL_OCH_RELEASE + } + } + // token 失效 重新获取token + const val WAIT_TAKEN = 100046 + + const val LOGINSERVICE = "/ochbiz/common/login" + + } +} \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/TaxiLoginStatusEnum.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/TaxiLoginStatusEnum.kt new file mode 100644 index 0000000000..451196d777 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/TaxiLoginStatusEnum.kt @@ -0,0 +1,27 @@ +package com.mogo.och.common.module.biz.constant + +/** + * Created on 2022/08/19 + * + * + * 0 初始状态, + * 10 已登录, + * 20 已登出, + */ +enum class TaxiLoginStatusEnum(val code: Int) { + None( 0 ), + Login( 10), + Logout( 20),; + + companion object { + @JvmStatic + fun valueOf(code: Int): TaxiLoginStatusEnum? { + for (value in values()) { + if (value.code == code) { + return value + } + } + return None + } + } +} \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginModel.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginModel.kt new file mode 100644 index 0000000000..a5b2277c7d --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginModel.kt @@ -0,0 +1,140 @@ +package com.mogo.och.common.module.biz.model + +import android.annotation.SuppressLint +import android.content.Context +import com.mogo.eagle.core.data.BaseData +import com.mogo.eagle.core.utilcode.util.NetworkUtils +import com.mogo.eagle.core.utilcode.util.SharedPrefs +import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.mogo.map.navi.IMogoCarLocationChangedListener2 +import com.mogo.module.common.MogoApisHandler +import com.mogo.och.common.module.R +import com.mogo.och.common.module.biz.bean.TaxiLoginReqBean +import com.mogo.och.common.module.biz.bean.TaxiLoginRespBean +import com.mogo.och.common.module.biz.callback.ITaxiLoginCallback +import com.mogo.och.common.module.biz.constant.TaxiLoginStatusEnum +import com.mogo.och.common.module.biz.constant.LoginStatusManager +import com.mogo.och.common.module.biz.network.OchCommonServiceCallback +import com.mogo.och.common.module.biz.network.OchCommonServiceManager +import com.mogo.och.common.module.utils.ToastUtilsOch + +/** + * Created by pangfan on 2021/8/19 + * + * + * 网约车 - 出租车业务逻辑处理 + */ +@SuppressLint("StaticFieldLeak") +object OchCommonLoginModel{ + + private val TAG = "TaxiLoginModel" + private var mContext: Context? = null + var iTaxiLoginCallback: ITaxiLoginCallback? = null + private var mLongitude = 0.0 + private var mLatitude = 0.0 + fun init(context: Context) { + mContext = context.applicationContext + // 达到起始站围栏监听 + MogoApisHandler.getInstance().apis.registerCenterApi.registerCarLocationChangedListener(TAG, mCarLocationChangedListener2) + } + + fun hasInit():Boolean{ + if(mContext==null&& iTaxiLoginCallback==null){ + return false; + } + return true + } + + // 自车定位 + private val mCarLocationChangedListener2 = IMogoCarLocationChangedListener2 { location -> + mLongitude = location.longitude + mLatitude = location.latitude + } + + fun getiTaxiLoginCallback(): ITaxiLoginCallback? { + return iTaxiLoginCallback + } + + fun setiTaxiLoginCallback(iTaxiLoginCallback: ITaxiLoginCallback?) { + this.iTaxiLoginCallback = iTaxiLoginCallback + } + + fun release() { + mContext = null + iTaxiLoginCallback = null + // 注销到达起始站围栏监听 + MogoApisHandler.getInstance().apis.registerCenterApi + .unregisterCarLocationChangedListener(TAG, mCarLocationChangedListener2) + } + + /** + * 获取手机验证码 + */ + fun getPhoneCode(phone: String?) { + mContext?.let { + OchCommonServiceManager.getPhoneCode(it, phone, + object : OchCommonServiceCallback { + override fun onSuccess(data: BaseData?) { + if (null != data && 0 == data.code) { + // 获取验证码成功 + ToastUtils.showShort(mContext?.getString(R.string.module_och_taxi_login_get_code_success)) + iTaxiLoginCallback?.getPhoneCodeSuccess() + } else { + if (data != null) { + ToastUtils.showShort(data.code) + } + } + } + + override fun onError() { + if (!NetworkUtils.isConnected(mContext)) { + ToastUtils.showShort(mContext?.getString(R.string.network_error_tip)) + } else { + ToastUtils.showShort(mContext?.getString(R.string.request_error_tip)) + } + } + + override fun onFail(code: Int, msg: String) { + ToastUtilsOch.showWithCodeMessage(code,msg) + } + }) + } + + } + + fun gotoLogin(phone: String, code: String) { + mContext?.let { + val location4Login = TaxiLoginReqBean.Location4Login(mLatitude, mLongitude) + OchCommonServiceManager.gotoLoginBycode(it, phone, code, location4Login, + object : OchCommonServiceCallback { + override fun onSuccess(data: TaxiLoginRespBean?) { + if (null != data && 0 == data.code) { + // 获取验证码成功 + ToastUtils.showShort(mContext?.getString(R.string.module_och_taxi_login_login_success)) + LoginStatusManager.setLoginStatus(TaxiLoginStatusEnum.Login) + mContext?.let { + SharedPrefs.getInstance(it).putString("och_account",phone) + } + iTaxiLoginCallback?.loginSuccess() + } else { + if (data != null) { + ToastUtils.showShort(data.code) + } + } + } + + override fun onError() { + if (!NetworkUtils.isConnected(mContext)) { + ToastUtils.showShort(mContext?.getString(R.string.network_error_tip)) + } else { + ToastUtils.showShort(mContext?.getString(R.string.request_error_tip)) + } + } + + override fun onFail(code: Int, msg: String) { + ToastUtilsOch.showWithCodeMessage(code,msg) + } + }) + } + } +} \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginStatusDefaultModel.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginStatusDefaultModel.kt new file mode 100644 index 0000000000..10348b6b2b --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginStatusDefaultModel.kt @@ -0,0 +1,44 @@ +package com.mogo.och.common.module.biz.model + +import android.annotation.SuppressLint +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant +import com.mogo.eagle.core.utilcode.util.SharedPrefs +import com.mogo.och.common.module.biz.bean.DriverStatusQueryRespBean +import com.mogo.och.common.module.biz.callback.ILoginCallback +import com.mogo.och.common.module.biz.callback.ILoginViewCallback +import com.mogo.och.common.module.biz.constant.LoginStatusManager + +@SuppressLint("StaticFieldLeak") +object OchCommonLoginStatusDefaultModel : OchCommonLoginStatusModel() { + + + const val TAG = "OchCommonLoginStatusDefaultModel" + + + var loginCallback: ILoginCallback? = null + var loginViewCallback: ILoginViewCallback? = null + + override fun loginSuccess(data: DriverStatusQueryRespBean?) { + CallerLogger.d(SceneConstant.M_TAXI + TAG, "loginSuccess:${LoginStatusManager.isLogin()}") + if (LoginStatusManager.isLogin()) { + SharedPrefs.getInstance(mContext).putString("och_account", data?.data?.phone) + loginViewCallback?.hideLoginDialogFragment() + } else { + SharedPrefs.getInstance(mContext).putString("och_account", "") + loginViewCallback?.showLoginDialogFragment() + } + loginCallback?.loginSuccess(data) + } + + override fun loginFail(isLogin: Boolean) { + CallerLogger.d(SceneConstant.M_TAXI + TAG, "loginFail:$isLogin") + if (isLogin) { + loginViewCallback?.hideLoginDialogFragment() + } else { + loginViewCallback?.showLoginDialogFragment() + } + loginCallback?.loginFail(isLogin) + } + +} \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginStatusModel.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginStatusModel.java new file mode 100644 index 0000000000..a2951bfbde --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginStatusModel.java @@ -0,0 +1,128 @@ +package com.mogo.och.common.module.biz.model; + +import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI; + +import android.content.Context; + +import com.mogo.commons.AbsMogoApplication; +import com.mogo.eagle.core.data.BaseData; +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; +import com.mogo.eagle.core.utilcode.util.NetworkUtils; +import com.mogo.eagle.core.utilcode.util.ToastUtils; +import com.mogo.och.common.module.R; +import com.mogo.och.common.module.biz.bean.DriverStatusQueryRespBean; +import com.mogo.och.common.module.biz.bean.TaxiLogoutReqBean; +import com.mogo.och.common.module.biz.constant.LoginStatusManager; +import com.mogo.och.common.module.biz.constant.OchCommonConst; +import com.mogo.och.common.module.biz.network.OchCommonServiceCallback; +import com.mogo.och.common.module.biz.network.OchCommonServiceManager; +import com.mogo.och.common.module.utils.ToastUtilsOch; + +import java.util.concurrent.TimeUnit; + +import io.reactivex.Observable; +import io.reactivex.disposables.Disposable; + +public abstract class OchCommonLoginStatusModel { + + private static final String TAG = "OchCommonLoginStatusModel"; + + protected Context mContext; + + private Disposable subscribe; + + + public void init() { + mContext = AbsMogoApplication.getApp(); + queryCarStatus(); + } + + protected abstract void loginSuccess(DriverStatusQueryRespBean data); + + protected abstract void loginFail(boolean isLogin); + + /** + * 接单状态和登录状态查询 + * 1、初始化查询 + * 2、错误重试 + * 3、错误重试 + * 4、登出后重试 + * 5、变更出车状态查下 + * 6、变更出车状态查下 + * 7、网络状态变更后查询 + * 8、登录页面关闭后查下状态 + */ + public void queryCarStatus() { + OchCommonServiceManager.queryDriverServiceStatus(mContext, + new OchCommonServiceCallback() { + @Override + public void onSuccess(DriverStatusQueryRespBean data) { + if (null != data && 0 == data.code) { + LoginStatusManager.setLoginStatus(data.data.driverStatus); + CallerLogger.INSTANCE.d(M_TAXI + TAG, "changeCarStatus:" + LoginStatusManager.getLoginStatus()); + loginSuccess(data); + } + } + + @Override + public void onError() { + if (!NetworkUtils.isConnected(mContext)) { + ToastUtils.showShort(mContext.getString(R.string.network_error_tip)); + } else { + ToastUtils.showShort(mContext.getString(R.string.request_error_tip)); + } + subscribe = Observable.timer(5, TimeUnit.SECONDS).subscribe(aLong -> { + queryCarStatus(); + }); + } + + @Override + public void onFail(int code, String msg) { + ToastUtilsOch.showWithCodeMessage(code,msg); + if(code== OchCommonConst.WAIT_TAKEN){ + subscribe = Observable.timer(3, TimeUnit.SECONDS).subscribe(aLong -> { + queryCarStatus(); + }); + }else { + loginFail(LoginStatusManager.isLogin()); + } + } + }); + } + + // 登出 + public void logout(double mLatitude,double mLongitude) { + TaxiLogoutReqBean.Location4Login location4Login = new TaxiLogoutReqBean.Location4Login(mLatitude, mLongitude); + OchCommonServiceManager.logout(mContext,location4Login, + new OchCommonServiceCallback() { + @Override + public void onSuccess(BaseData data) { + if (null != data && 0 == data.code) { + loginFail(false); + queryCarStatus(); + } + } + + @Override + public void onError() { + if (!NetworkUtils.isConnected(mContext)) { + ToastUtils.showShort(mContext.getString(R.string.network_error_tip)); + } else { + ToastUtils.showShort(mContext.getString(R.string.request_error_tip)); + } + } + + @Override + public void onFail(int code, String msg) { + ToastUtilsOch.showWithCodeMessage(code,msg); + } + }); + } + + public void release() { + if(subscribe!=null&&!subscribe.isDisposed()){ + subscribe.dispose(); + } + } + +} diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceApiNew.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceApiNew.java new file mode 100644 index 0000000000..d31f624578 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceApiNew.java @@ -0,0 +1,81 @@ +package com.mogo.och.common.module.biz.network; +import com.mogo.eagle.core.data.BaseData; +import com.mogo.och.common.module.biz.bean.DriverStatusQueryRespBean; +import com.mogo.och.common.module.biz.bean.TaxiLoginReqBean; +import com.mogo.och.common.module.biz.bean.TaxiLoginRespBean; +import com.mogo.och.common.module.biz.bean.TaxiLoginSmsReqBean; +import com.mogo.och.common.module.biz.bean.TaxiLogoutReqBean; + +import io.reactivex.Observable; +import retrofit2.http.Body; +import retrofit2.http.GET; +import retrofit2.http.Header; +import retrofit2.http.Headers; +import retrofit2.http.POST; +import retrofit2.http.Path; +import retrofit2.http.Query; + +/** + * Created by pangfan on 2021/8/19 + * + * 网约车-出租车接口定义 + */ +interface OchCommonServiceApiNew { + /** + * 获取手机验证码 + * + * @return + */ + @Headers( {"Content-type:application/json;charset=UTF-8"} ) + @POST( "/autopilot-car-hailing/driver/v2/driver/taxi/sendSms" ) + Observable getPhoneCode(@Header("appId") String appId + , @Header("ticket") String ticket, @Body TaxiLoginSmsReqBean data); + /** + * 通过验证码登录 + * @param appId + * @param ticket + * @param data + * @return + */ + @Headers( {"Content-type:application/json;charset=UTF-8"} ) + @POST( "/autopilot-car-hailing/cab/flow/v1/driver/taxi/startOperation" ) + Observable gotoLoginBycode4Taxi(@Header("appId") String appId + , @Header("ticket") String ticket, @Body TaxiLoginReqBean data); + + /** + * 通过验证码登录 + * @param appId + * @param ticket + * @param data + * @return + */ + @Headers( {"Content-type:application/json;charset=UTF-8"} ) + @POST( "/autopilot-car-hailing/cab/flow/v1/bus/driver/bus/startOperation" ) + Observable gotoLoginBycode4Bus(@Header("appId") String appId + , @Header("ticket") String ticket, @Body TaxiLoginReqBean data); + /** + * 登出接口 + */ + @Headers({"Content-type:application/json;charset=UTF-8"}) + @POST("/autopilot-car-hailing/cab/flow/v1/driver/taxi/endOperation") + Observable logout4Taxi(@Header("appId") String appId, @Header("ticket") String ticket, + @Body TaxiLogoutReqBean data); + /** + * 登出接口 + */ + @Headers({"Content-type:application/json;charset=UTF-8"}) + @POST("/autopilot-car-hailing/cab/flow/v1/bus/driver/bus/endOperation") + Observable logout4Bus(@Header("appId") String appId, @Header("ticket") String ticket, + @Body TaxiLogoutReqBean data); + + /** + * 接单状态和登录状态查询 出租车司机端、小巴车司机端、小巴车乘客端 + * @param sn + * @return + */ + @Headers( {"Content-type:application/json;charset=UTF-8"} ) + @GET( "/autopilot-car-hailing/operation/v1/driver/{flavor}/loginStatus") + Observable queryDriverServiceStatusAndLoginStatus(@Path(value = "flavor",encoded = true) String flavor,@Header ("appId") String appId + , @Header("ticket") String ticket, @Query("sn") String sn); + +} diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/TaxiServiceCallback.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceCallback.java similarity index 67% rename from OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/TaxiServiceCallback.java rename to OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceCallback.java index 2f3e2ed507..8433def5f0 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/TaxiServiceCallback.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceCallback.java @@ -1,4 +1,4 @@ -package com.mogo.och.taxi.network; +package com.mogo.och.common.module.biz.network; /** * @author congtaowang @@ -6,7 +6,7 @@ package com.mogo.och.taxi.network; * * 修改订单状态回调接口 */ -public interface TaxiServiceCallback< T > { +public interface OchCommonServiceCallback< T > { void onSuccess(T data); diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceManager.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceManager.kt new file mode 100644 index 0000000000..6779e4a891 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceManager.kt @@ -0,0 +1,154 @@ +package com.mogo.och.common.module.biz.network + +import android.content.Context +import com.mogo.och.common.module.biz.constant.OchCommonConst.Companion.getBaseUrl +import com.mogo.cloud.passport.MoGoAiCloudClientConfig +import com.mogo.och.common.module.biz.bean.TaxiLoginSmsReqBean +import com.mogo.och.common.module.biz.bean.TaxiLoginReqBean +import com.mogo.och.common.module.biz.bean.TaxiLoginRespBean +import com.mogo.och.common.module.biz.bean.TaxiLogoutReqBean +import com.mogo.och.common.module.biz.bean.DriverStatusQueryRespBean +import com.mogo.och.common.module.biz.constant.OchCommonConst +import com.mogo.cloud.passport.MoGoAiCloudClient +import com.mogo.commons.debug.DebugConfig +import com.mogo.eagle.core.data.BaseData +import com.mogo.eagle.core.network.MoGoRetrofitFactory +import com.mogo.och.common.module.biz.network.interceptor.transformTry +import io.reactivex.Observable + +/** + * Created by pangfan on 2021/8/19 + */ +object OchCommonServiceManager { + + private const val TAG = "OchCommonServiceManager" + + private val mOCHTaxiServiceApi: OchCommonServiceApiNew = + MoGoRetrofitFactory.getInstance(getBaseUrl()).create( + OchCommonServiceApiNew::class.java + ) + + /** + * 获取手机验证码 + * @param context + * @param callback + */ + @JvmStatic + fun getPhoneCode( + context: Context, phone: String?, + callback: OchCommonServiceCallback? + ) { + mOCHTaxiServiceApi.getPhoneCode( + MoGoAiCloudClientConfig.getInstance().serviceAppId, + MoGoAiCloudClientConfig.getInstance().token, + TaxiLoginSmsReqBean(phone) + ).transformTry() + .subscribe(OchCommonSubscribeImpl(context, callback, "getPhoneCode")) + } + + /** + * 通过验证码登录 + * @param context + * @param callback + */ + @JvmStatic + fun gotoLoginBycode( + context: Context, phone: String?, code: String?, + location4Login: TaxiLoginReqBean.Location4Login?, + callback: OchCommonServiceCallback? + ) { + val sn = MoGoAiCloudClientConfig.getInstance().sn + var taxiLoginRespBeanObservable: Observable? = null + when (DebugConfig.getProductFlavor()) { + "fPadLenovoOchTaxi" -> { + //出租车司机 + taxiLoginRespBeanObservable = mOCHTaxiServiceApi.gotoLoginBycode4Taxi( + MoGoAiCloudClientConfig.getInstance().serviceAppId, + MoGoAiCloudClientConfig.getInstance().token, + TaxiLoginReqBean(phone, code, sn, location4Login) + ).transformTry() + } + "fPadLenovoOchBus" -> { + //小巴车司机 + taxiLoginRespBeanObservable = mOCHTaxiServiceApi.gotoLoginBycode4Bus( + MoGoAiCloudClientConfig.getInstance().serviceAppId, + MoGoAiCloudClientConfig.getInstance().token, + TaxiLoginReqBean(phone, code, sn, location4Login) + ).transformTry() + } + } + taxiLoginRespBeanObservable?.subscribe(OchCommonSubscribeImpl(context, callback, "gotoLoginBycode")) + } + + /** + * 登出 + */ + @JvmStatic + fun logout( + context: Context, + location4Login: TaxiLogoutReqBean.Location4Login?, + callback: OchCommonServiceCallback? + ) { + var logout: Observable? = null + when (DebugConfig.getProductFlavor()) { + "fPadLenovoOchTaxi" -> { + //出租车司机 + logout = mOCHTaxiServiceApi.logout4Taxi( + MoGoAiCloudClientConfig.getInstance().serviceAppId, + MoGoAiCloudClientConfig.getInstance().token, + TaxiLogoutReqBean(MoGoAiCloudClientConfig.getInstance().sn, location4Login) + ).transformTry() + } + "fPadLenovoOchBus" -> { + //小巴车司机 + logout = mOCHTaxiServiceApi.logout4Bus( + MoGoAiCloudClientConfig.getInstance().serviceAppId, + MoGoAiCloudClientConfig.getInstance().token, + TaxiLogoutReqBean(MoGoAiCloudClientConfig.getInstance().sn, location4Login) + ).transformTry() + } + } + logout?.subscribe(OchCommonSubscribeImpl(context, callback, "logout")) + } + + /** + * 接单状态和登录状态查询 + * + * @param context + * @param callback + */ + @JvmStatic + fun queryDriverServiceStatus( + context: Context, + callback: OchCommonServiceCallback? + ) { + if (MoGoAiCloudClientConfig.getInstance().token.isEmpty()) { + callback?.onFail(OchCommonConst.WAIT_TAKEN, "等待令牌中请稍等") + MoGoAiCloudClient.getInstance().refreshToken() + return + } + var flavor = "" + when (DebugConfig.getProductFlavor()) { + "fPadLenovoOchTaxi" -> { + //出租车司机 + flavor = "taxi" + } + "fPadLenovoOchBus" -> { + //小巴车司机 + flavor = "bus" + } + "fPadLenovoOchBusPassenger" -> { + //小巴车乘客 + flavor = "bus/passenger" + } + } + mOCHTaxiServiceApi.queryDriverServiceStatusAndLoginStatus( + flavor, + MoGoAiCloudClientConfig.getInstance().serviceAppId, + MoGoAiCloudClientConfig.getInstance().token, + MoGoAiCloudClientConfig.getInstance().sn + ).transformTry() + .subscribe(OchCommonSubscribeImpl(context, callback, "queryDriverServiceStatus")) + } + +} \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonSubscribeImpl.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonSubscribeImpl.kt new file mode 100644 index 0000000000..01f08eaaee --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonSubscribeImpl.kt @@ -0,0 +1,36 @@ +package com.mogo.och.common.module.biz.network + +import com.mogo.eagle.core.data.BaseData +import com.mogo.eagle.core.network.RequestOptions +import com.mogo.eagle.core.network.SubscribeImpl +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.och.common.module.utils.CallerLoggerUtils.flavorTag + +class OchCommonSubscribeImpl( + val context: Any, + val callback: OchCommonServiceCallback?, + val apiName: String +) : SubscribeImpl(RequestOptions.create(context)) { + + companion object { + const val TAG = "OchCommonSubscribeImpl" + } + + override fun onSuccess(o: T) { + super.onSuccess(o) + CallerLogger.d("$flavorTag$TAG", "$apiName: onSuccess() ${o.msg}") + callback?.onSuccess(o) + } + + override fun onError(e: Throwable) { + super.onError(e) + CallerLogger.e("$flavorTag$TAG", "$apiName: onError() ${e.message}") + callback?.onError() + } + + override fun onError(message: String, code: Int) { + super.onError(message, code) + CallerLogger.e("$flavorTag$TAG", "$apiName: onError() code = $code; message = $message") + callback?.onFail(code, message) + } +} \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/interceptor/FRetryWithTime.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/interceptor/FRetryWithTime.kt new file mode 100644 index 0000000000..93869d6edc --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/interceptor/FRetryWithTime.kt @@ -0,0 +1,20 @@ +package com.mogo.och.common.module.biz.network.interceptor + +import com.mogo.cloud.passport.MoGoAiCloudClient +import com.mogo.eagle.core.data.BaseData +import io.reactivex.Observable +import io.reactivex.ObservableSource +import io.reactivex.functions.Function + +class FRetryWithTime : Function> { + + override fun apply(baseData: T): ObservableSource { + baseData.let { + if (it.code == 100046 || it.code == 100045 || it.code == 100005 || it.code == 100006 || it.code == 520003) { + MoGoAiCloudClient.getInstance().refreshToken() + return Observable.error(OchCommonRetryException()) + } + } + return Observable.just(baseData) + } +} \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/interceptor/OchCommonNetInterceptor.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/interceptor/OchCommonNetInterceptor.kt new file mode 100644 index 0000000000..1fa0e4bf57 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/interceptor/OchCommonNetInterceptor.kt @@ -0,0 +1,13 @@ +package com.mogo.och.common.module.biz.network.interceptor + +import io.reactivex.Observable +import com.mogo.eagle.core.data.BaseData +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.schedulers.Schedulers + +fun Observable.transformTry():Observable { + return flatMap(FRetryWithTime()) + .retryWhen(RetryWithTime()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) +} \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/interceptor/OchCommonRetryException.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/interceptor/OchCommonRetryException.java new file mode 100644 index 0000000000..262d1806c0 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/interceptor/OchCommonRetryException.java @@ -0,0 +1,5 @@ +package com.mogo.och.common.module.biz.network.interceptor; + +public class OchCommonRetryException extends RuntimeException{ + +} diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/interceptor/RetryWithTime.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/interceptor/RetryWithTime.kt new file mode 100644 index 0000000000..83606fdea0 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/interceptor/RetryWithTime.kt @@ -0,0 +1,30 @@ +package com.mogo.och.common.module.biz.network.interceptor + +import com.mogo.eagle.core.utilcode.constant.TimeConstants +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.util.TimeUtils +import com.mogo.och.common.module.utils.CallerLoggerUtils.flavorTag +import io.reactivex.Observable +import io.reactivex.ObservableSource +import io.reactivex.functions.Function +import java.util.concurrent.TimeUnit + + +class RetryWithTime : Function, ObservableSource> { + companion object { + private const val TAG = "RetryWithTime" + } + var current = -1 + private var timeDelys = intArrayOf(3, 1, 2) + override fun apply(throwableObservable: Observable): ObservableSource? { + return throwableObservable.flatMap { + ++current + CallerLogger.e("${flavorTag}${TAG}", " 时间:${TimeUtils.getStringByNow(0, TimeConstants.SEC)}") + if (it is OchCommonRetryException && current < timeDelys.size) { + Observable.timer(timeDelys[current].toLong(), TimeUnit.SECONDS) + } else { + Observable.error(it) + } + } + } +} \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/presenter/OchCommonLoginPresenter.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/presenter/OchCommonLoginPresenter.kt new file mode 100644 index 0000000000..4f607084b2 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/presenter/OchCommonLoginPresenter.kt @@ -0,0 +1,112 @@ +package com.mogo.och.common.module.biz.presenter + +import androidx.lifecycle.LifecycleOwner +import com.mogo.commons.AbsMogoApplication +import com.mogo.commons.mvp.Presenter +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant +import com.mogo.eagle.core.utilcode.util.RegexUtils +import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.mogo.och.common.module.R +import com.mogo.och.common.module.biz.ui.TaxiLoginDialogFragment +import com.mogo.och.common.module.biz.callback.ITaxiLoginCallback +import com.mogo.och.common.module.biz.model.OchCommonLoginModel +import io.reactivex.Observable +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.disposables.Disposable +import io.reactivex.schedulers.Schedulers +import java.util.concurrent.TimeUnit + +/** + * @author congtaowang + * @since 2021/1/18 + * + * 描述 + */ +class OchCommonLoginPresenter(view: TaxiLoginDialogFragment?) : + Presenter(view), ITaxiLoginCallback { + + private var countDownDisposable: Disposable? = null + + init { + initListeners() + } + + private fun initListeners() { + OchCommonLoginModel.init(AbsMogoApplication.getApp()) + OchCommonLoginModel.setiTaxiLoginCallback(this) + } + + fun getPhoneCode(phone:String){ + if(!OchCommonLoginModel.hasInit()){ + initListeners() + } + if (!RegexUtils.isMobileExact(phone)) { + ToastUtils.showShort(R.string.module_och_taxi_login_phone_error) + mView?.inputPhoneError() + return + } + OchCommonLoginModel.getPhoneCode(phone) + } + + override fun onCreate(owner: LifecycleOwner) { + super.onCreate(owner) + CallerLogger.d(SceneConstant.M_TAXI + TAG, "网约车-出租车登陆") + } + + + + override fun onDestroy(owner: LifecycleOwner) { + super.onDestroy(owner) + OchCommonLoginModel.release() + countDownDisposable?.let { + if (!it.isDisposed) { + it.dispose() + } + } + } + + companion object { + private val TAG = OchCommonLoginPresenter::class.java.simpleName + } + + override fun getPhoneCodeSuccess() { + val countDownSeconds = 60L; + countDownDisposable = Observable.intervalRange(0, countDownSeconds, 0, 1, TimeUnit.SECONDS) + .map { aLong -> countDownSeconds - aLong } + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe({ + mView?.setCountDownText("${it}s",false) + CallerLogger.d(SceneConstant.M_TAXI_P + TAG, "倒计时:$it") + }, { + CallerLogger.d(SceneConstant.M_TAXI_P + TAG, "倒计时onError:${it}") + it.printStackTrace() + mView?.setCountDownText(AbsMogoApplication.getApp().getString(R.string.module_och_taxi_login_get_code),true) + }, { + CallerLogger.d(SceneConstant.M_TAXI_P + TAG, "倒计时onComplete") + mView?.setCountDownText(AbsMogoApplication.getApp().getString(R.string.module_och_taxi_login_get_code),true) + }) + } + + override fun loginSuccess() { + mView?.loginSuccess() + } + + fun gotoLogin(phone: String, code: String) { + if(!OchCommonLoginModel.hasInit()){ + initListeners() + } + if (!RegexUtils.isMobileExact(phone)) { + ToastUtils.showShort(R.string.module_och_taxi_login_phone_error) + mView?.inputPhoneError() + return + } + if(code.isBlank()||code.length<4){ + ToastUtils.showShort(R.string.module_och_taxi_login_code_error) + return + } + mView?.closeSoftInput() + OchCommonLoginModel.gotoLogin(phone,code) + } +} \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/presenter/OchCommonLoginStatusDefaultPresenter.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/presenter/OchCommonLoginStatusDefaultPresenter.kt new file mode 100644 index 0000000000..a4c77ec190 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/presenter/OchCommonLoginStatusDefaultPresenter.kt @@ -0,0 +1,48 @@ +package com.mogo.och.common.module.biz.presenter + +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleObserver +import androidx.lifecycle.LifecycleOwner +import androidx.lifecycle.OnLifecycleEvent +import com.mogo.och.common.module.biz.callback.ILoginCallback +import com.mogo.och.common.module.biz.callback.ILoginViewCallback +import com.mogo.och.common.module.biz.model.OchCommonLoginStatusDefaultModel + +/** + * @author yangyakun + * @since 2020-09-19 + */ +class OchCommonLoginStatusDefaultPresenter : LifecycleObserver { + private var isFirstShow = true + + @OnLifecycleEvent(Lifecycle.Event.ON_CREATE) + fun onCreate(owner: LifecycleOwner) { + OchCommonLoginStatusDefaultModel.init() + } + + @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) + fun onResume(owner: LifecycleOwner) { + if (isFirstShow) { + isFirstShow = false + } else { + queryLoginStatus() + } + } + @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) + fun onDestory(owner: LifecycleOwner) { + OchCommonLoginStatusDefaultModel.release() + } + + fun queryLoginStatus() { + OchCommonLoginStatusDefaultModel.queryCarStatus() + } + + fun logOut(mLatitude:Double,mLongitude:Double){ + OchCommonLoginStatusDefaultModel.logout(mLatitude, mLongitude) + } + + fun setLoginCallback(loginCallback: ILoginCallback?,loginViewCallback: ILoginViewCallback?){ + OchCommonLoginStatusDefaultModel.loginCallback = loginCallback + OchCommonLoginStatusDefaultModel.loginViewCallback = loginViewCallback + } +} \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/provider/LoginService.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/provider/LoginService.kt new file mode 100644 index 0000000000..8ee6064620 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/provider/LoginService.kt @@ -0,0 +1,31 @@ +package com.mogo.och.common.module.biz.provider + +import androidx.fragment.app.Fragment +import com.alibaba.android.arouter.facade.template.IProvider +import com.mogo.och.common.module.biz.callback.ILoginCallback + +interface LoginService : IProvider { + /** + * 注册页面 + * @param fragment 主页面 + * @param callback 回调 + */ + fun registerFragment(fragment: Fragment?,loginCallback: ILoginCallback?) + + fun unRegisterFragment() + + /** + * 查询登录状态 + */ + fun queryLoginStatus():Boolean + + fun queryLoginStatusByNet() + + fun showUiModel(show:Boolean) + + /** + * 登出 + */ + fun loginOut(mLatitude:Double,mLongitude:Double) + +} \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/provider/LoginServiceImpl.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/provider/LoginServiceImpl.kt new file mode 100644 index 0000000000..17e0d21e9a --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/provider/LoginServiceImpl.kt @@ -0,0 +1,122 @@ +package com.mogo.och.common.module.biz.provider + +import android.content.Context +import android.content.DialogInterface +import androidx.fragment.app.DialogFragment +import androidx.fragment.app.Fragment +import com.alibaba.android.arouter.facade.annotation.Route +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.logger.scene.SceneConstant +import com.mogo.eagle.core.utilcode.util.AppStateManager.currentActivity +import com.mogo.eagle.core.utilcode.util.ClickUtils +import com.mogo.och.common.module.biz.callback.ILoginCallback +import com.mogo.och.common.module.biz.callback.ILoginViewCallback +import com.mogo.och.common.module.biz.constant.LoginStatusManager +import com.mogo.och.common.module.biz.constant.OchCommonConst +import com.mogo.och.common.module.biz.presenter.OchCommonLoginStatusDefaultPresenter +import com.mogo.och.common.module.biz.ui.TaxiLoginDialogFragment +import com.mogo.och.common.module.biz.ui.TaxiLoginDialogFragment.Companion.newInstance +import java.lang.ref.WeakReference + +@Route(path = OchCommonConst.LOGINSERVICE) +class LoginServiceImpl : LoginService,ILoginViewCallback { + + companion object{ + const val TAG = "LoginServiceImpl" + } + + private var fragment: Fragment?=null + private var taxiLoginDialogFragment: WeakReference? = null + private var presenter: OchCommonLoginStatusDefaultPresenter?=null + private var uiModel = true + + override fun init(context: Context) { + + } + + override fun registerFragment(fragment: Fragment?,loginCallback: ILoginCallback?) { + presenter = OchCommonLoginStatusDefaultPresenter() + this.fragment = fragment + presenter?.let { + it.setLoginCallback(loginCallback, this) + this.fragment?.lifecycle?.addObserver(it) + } + + } + + override fun unRegisterFragment() { + this.presenter?.let { + it.setLoginCallback(null,null) + this.fragment?.lifecycle?.removeObserver(it) + } + this.fragment = null + } + + + override fun showLoginDialogFragment() { + if(uiModel) { + fragment?.let { + CallerHmiManager.hideToolsView() + val parentFragmentManager = it.childFragmentManager + val fragmentByTag: Fragment? = parentFragmentManager.findFragmentByTag(TAG) + if (fragmentByTag is DialogFragment) { + if (fragmentByTag.dialog != null && fragmentByTag.dialog!!.isShowing) { + return + } + if (fragmentByTag.dialog != null && fragmentByTag.isAdded) { + if (currentActivity() == null) { // 没有在当前应用内 在启动页面关闭应用 + CallerLogger.d(SceneConstant.M_TAXI + TAG, "showLoginDialogFragment 权限验证") + return + } + } + } + + if (taxiLoginDialogFragment?.get() == null) { + taxiLoginDialogFragment = WeakReference(newInstance()) + } + val taxiLoginDialog = taxiLoginDialogFragment?.get() + if (taxiLoginDialog != null) { + if (taxiLoginDialog.dialog != null && taxiLoginDialog.dialog!!.isShowing) { + return + } + if (taxiLoginDialog.isAdded) { //解决方法就是添加这行代码,如果已经添加了,就移除掉然后再show,就不会出现Fragment already added的错误了。 + parentFragmentManager.beginTransaction().remove(taxiLoginDialog) + .commitAllowingStateLoss() + } + if (ClickUtils.isFastClick()) { + taxiLoginDialog.show(parentFragmentManager, TAG) + taxiLoginDialog.setOnDismissListener(DialogInterface.OnDismissListener { dialog: DialogInterface? -> + taxiLoginDialogFragment?.clear() + presenter?.queryLoginStatus() + }) + CallerLogger.d(SceneConstant.M_TAXI + TAG, "showLoginDialogFragment 展示登录界面") + }else{ + CallerLogger.d(SceneConstant.M_TAXI + TAG, "showLoginDialogFragment 展示登录界面 1s内执行一次") + } + } + } + } + } + override fun hideLoginDialogFragment() { + CallerLogger.d(SceneConstant.M_TAXI + TAG, "hideLoginDialogFragment 隐藏登录界面") + if (taxiLoginDialogFragment?.get() != null) { + taxiLoginDialogFragment?.get()?.dismissAllowingStateLoss() + } + } + override fun queryLoginStatus():Boolean { + return LoginStatusManager.isLogin() + } + + override fun queryLoginStatusByNet() { + presenter?.queryLoginStatus() + } + + override fun showUiModel(show:Boolean) { + uiModel = show; + } + + override fun loginOut(mLatitude:Double,mLongitude:Double) { + presenter?.logOut(mLatitude,mLongitude) + } +} \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/ui/TaxiLoginDialogFragment.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/ui/TaxiLoginDialogFragment.kt new file mode 100644 index 0000000000..e40bf14a9c --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/ui/TaxiLoginDialogFragment.kt @@ -0,0 +1,277 @@ +package com.mogo.och.common.module.biz.ui + +import android.annotation.SuppressLint +import android.content.DialogInterface +import android.graphics.Rect +import android.os.Bundle +import android.os.SystemClock +import android.util.Log +import android.view.* +import androidx.appcompat.widget.AppCompatButton +import androidx.appcompat.widget.AppCompatEditText +import androidx.appcompat.widget.AppCompatImageView +import androidx.appcompat.widget.AppCompatTextView +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.content.ContextCompat +import androidx.core.widget.addTextChangedListener +import androidx.fragment.app.DialogFragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentTransaction +import com.alibaba.android.arouter.launcher.ARouter +import com.mogo.cloud.passport.MoGoAiCloudClientConfig +import com.mogo.commons.debug.DebugConfig +import com.mogo.commons.mvp.MvpDialogFragment +import com.mogo.eagle.core.function.call.hmi.CallerHmiManager +import com.mogo.eagle.core.utilcode.kotlin.onClick +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant +import com.mogo.eagle.core.utilcode.util.KeyboardUtils +import com.mogo.och.common.module.R +import com.mogo.och.common.module.biz.constant.OchCommonConst +import com.mogo.och.common.module.biz.presenter.OchCommonLoginPresenter +import com.mogo.och.common.module.biz.provider.LoginService + + +/** + * @author: yangyakun + * @date: 2022/8/15 + */ +class TaxiLoginDialogFragment : + MvpDialogFragment(), + DialogInterface.OnKeyListener { + + lateinit var clMain: ConstraintLayout + lateinit var acbtnLogin: AppCompatButton + lateinit var actvLoginGetCode: AppCompatTextView + lateinit var actvLoginShowSn: AppCompatTextView + lateinit var aceLoginPhoneValue: AppCompatEditText + lateinit var acetPhoneCodeValue: AppCompatEditText + lateinit var actvWelcomeLoginTitle: AppCompatTextView + lateinit var acivLoginBg: AppCompatImageView + private var mOnClickListener: DialogInterface.OnDismissListener? = null + + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setStyle(STYLE_NO_TITLE, R.style.DialogFullScreen) //dialog全屏 + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + dialog?.setOnKeyListener(this) + return super.onCreateView(inflater, container, savedInstanceState) + } + + override fun getLayoutId(): Int { + return R.layout.taxi_login_view + } + + override fun initViews() { + clMain = mRootView.findViewById(R.id.cl_main) + acbtnLogin = mRootView.findViewById(R.id.acbtn_login) + actvLoginGetCode = mRootView.findViewById(R.id.actv_login_get_code) + aceLoginPhoneValue = mRootView.findViewById(R.id.ace_login_phone_value) + acetPhoneCodeValue = mRootView.findViewById(R.id.acet_phone_code_value) + actvWelcomeLoginTitle = mRootView.findViewById(R.id.actv_welcome_login_title) + actvLoginShowSn = mRootView.findViewById(R.id.actv_login_show_sn) + acivLoginBg = mRootView.findViewById(R.id.aciv_login_bg) + inputPhoneNormal() + initBg() + initListener() + dialog?.window?.let { + context?.let { _ -> + CallerHmiManager.setStatusBarDarkOrLight(false) + } + } + } + + private fun initBg() { + when (DebugConfig.getProductFlavor()) { + "fPadLenovoOchTaxi" -> { + acivLoginBg.setImageResource(R.drawable.taxi_ic_login_bg) + } + "fPadLenovoOchBus" -> { + acivLoginBg.setImageResource(R.drawable.bus_ic_login_bg) + } + } + } + + @SuppressLint("ClickableViewAccessibility") + private fun initListener() { + mRootView.isFocusable = true + mRootView.isFocusableInTouchMode = true + mRootView.setOnTouchListener { _, event -> + when (event?.action) { + MotionEvent.ACTION_DOWN -> { + closeSoftInput() + } + } + false + } + acbtnLogin.onClick { + val phone = aceLoginPhoneValue.text.toString() + val code = acetPhoneCodeValue.text.toString() + mPresenter?.gotoLogin(phone, code) + } + actvWelcomeLoginTitle.setOnClickListener { + continuousClick() + } + clMain.viewTreeObserver.addOnGlobalLayoutListener { + val rect = Rect() + clMain.getWindowVisibleDisplayFrame(rect) + val mainInvisibleHeight = clMain.rootView.height - rect.bottom + if (mainInvisibleHeight > 100) { + val outLocation = IntArray(2) + acbtnLogin.getLocationInWindow(outLocation) + val srollHeight = (outLocation[1] + acbtnLogin.height) - rect.bottom + if (srollHeight > 0) { + clMain.scrollTo(0, srollHeight) + } + CallerLogger.d(SceneConstant.M_TAXI_P + TAG, "滚动的距离:$srollHeight") + } else { + clMain.scrollTo(0, 0) + } + } + actvLoginGetCode.onClick { + mPresenter?.getPhoneCode(aceLoginPhoneValue.text.toString()) + } + actvLoginShowSn.setOnLongClickListener { + val loginService = ARouter.getInstance().build(OchCommonConst.LOGINSERVICE) + .navigation() as LoginService + loginService.showUiModel(false) + dismissAllowingStateLoss() + true + } + aceLoginPhoneValue.addTextChangedListener { + it?.let { itEditable -> + if (itEditable.isNotEmpty()) { + inputPhoneNormal() + } + } + } + actvLoginShowSn.text = MoGoAiCloudClientConfig.getInstance().sn + } + + /** + * 关闭键盘 + */ + fun closeSoftInput() { + mRootView.requestFocus() + dialog?.window?.let { + KeyboardUtils.hideSoftInput(it) + } + } + + fun setCountDownText(text: String, enable: Boolean) { + if (enable) { + actvLoginGetCode.setText(R.string.module_och_taxi_login_get_code) + actvLoginGetCode.isEnabled = true + } else { + actvLoginGetCode.text = text + actvLoginGetCode.isEnabled = false + } + } + + fun inputPhoneError() { + aceLoginPhoneValue.text?.clear() + aceLoginPhoneValue.setHint(R.string.module_och_taxi_login_phone_error) + context?.let { + aceLoginPhoneValue.setHintTextColor(ContextCompat.getColor(it, R.color.taxi_EF262C)) + aceLoginPhoneValue.setBackgroundResource(R.drawable.taxi_login_phone_error) + } + } + + private fun inputPhoneNormal() { + //aceLoginPhoneValue.setHint(R.string.module_och_taxi_login_phone_hint_text) + context?.let { + aceLoginPhoneValue.setHintTextColor(ContextCompat.getColor(it, R.color.taxi_878890)) + aceLoginPhoneValue.setBackgroundResource(R.drawable.taxi_login_phone_normal) + } + } + + override fun createPresenter(): OchCommonLoginPresenter { + return OchCommonLoginPresenter(this) + } + + companion object { + private const val COUNTS = 4 // 点击次数 + private const val DURATION: Long = 1000 // 规定有效时间 + val TAG = TaxiLoginDialogFragment::class.java.simpleName + + @JvmStatic + fun newInstance(): TaxiLoginDialogFragment { + val args = Bundle() + val fragment = TaxiLoginDialogFragment() + fragment.arguments = args + return fragment + } + } + + private var mHits = LongArray(COUNTS) + + private fun continuousClick() { + //每次点击时,数组向前移动一位 + System.arraycopy(mHits, 1, mHits, 0, mHits.size - 1) + //为数组最后一位赋值 + mHits[mHits.size - 1] = SystemClock.uptimeMillis() + if (mHits[0] >= (SystemClock.uptimeMillis() - DURATION)) { + mHits = LongArray(COUNTS) //重新初始化数组 + mPresenter?.gotoLogin("13288888888", "8888") + } + } + + override fun onKey(dialog: DialogInterface, keyCode: Int, event: KeyEvent): Boolean { + return keyCode == KeyEvent.KEYCODE_BACK + } + + fun loginSuccess() { + dismissAllowingStateLoss() + } + + fun setOnDismissListener(listener: DialogInterface.OnDismissListener?) { + mOnClickListener = listener + } + + override fun onDismiss(dialog: DialogInterface) { + super.onDismiss(dialog) + mOnClickListener?.onDismiss(dialog) + CallerHmiManager.setStatusBarDarkOrLight(false) + } + + /** + * 重写父类show()方法 + * 避免出现java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState + */ + override fun show(manager: FragmentManager, tag: String?) { + try { + var cls = this.javaClass.superclass ?: return + while (cls != null) { + if (cls.name == "java.lang.Object") { + break + } + cls = cls.superclass!! + if (cls == DialogFragment::class.java) { + break + } + } + val mDismissed = cls.getDeclaredField("mDismissed") + val mShownByMe = cls.getDeclaredField("mShownByMe") + mDismissed.isAccessible = true + mShownByMe.isAccessible = true + mDismissed.setBoolean(this, false) + mShownByMe.setBoolean(this, true) + if (isAdded) { //解决方法就是添加这行代码,如果已经添加了,就移除掉然后再show,就不会出现Fragment already added的错误了。 + return + } + val ft: FragmentTransaction = manager.beginTransaction() + ft.add(this, tag) + ft.commitAllowingStateLoss() + } catch (e: Exception) { + Log.e("DialogFragment", "show", e.fillInStackTrace()) + } + } + +} \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/callback/OchAdasStartFailureCallback.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/callback/OchAdasStartFailureCallback.kt new file mode 100644 index 0000000000..b66f82d19a --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/callback/OchAdasStartFailureCallback.kt @@ -0,0 +1,9 @@ +package com.mogo.och.common.module.callback + +/** + * @author: wangmingjun + * @date: 2022/11/9 + */ +interface OchAdasStartFailureCallback { + fun onStartAutopilotFailure(startFailedMessage : String) +} \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/OCHAdasAbilityManager.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/OCHAdasAbilityManager.java new file mode 100644 index 0000000000..33d7fead37 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/OCHAdasAbilityManager.java @@ -0,0 +1,123 @@ +package com.mogo.och.common.module.manager; + +import android.content.Context; + +import androidx.annotation.Nullable; + +import com.mogo.commons.debug.DebugConfig; +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotActionsListener; +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatisticsListener; +import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotActionsListenerManager; +import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotStatisticsListenerManager; +import com.mogo.eagle.core.utilcode.mogo.logger.Logger; +import com.mogo.och.common.module.callback.OchAdasStartFailureCallback; +import com.zhidao.support.adas.high.bean.AutopilotAbility; +import com.zhidao.support.adas.high.bean.AutopilotStatistics; + +import chassis.Chassis; +import system_master.SystemStatusInfo; + +/** + * Created on 2022/10/9 + * 工控机状态信息回调(判断是否能否启动自动驾驶的回调) + * 目前定的是3秒回调一次 + */ +public class OCHAdasAbilityManager implements IMoGoAutopilotActionsListener, IMoGoAutopilotStatisticsListener { + + private static final String TAG = OCHAdasAbilityManager.class.getSimpleName(); + + private boolean isAutopilotAbility = true; + private String autopilotAbilityReason = ""; + private String startFailedMessage = ""; + + private OchAdasStartFailureCallback failureCallback = null; + + private static final class SingletonHolder { + private static final OCHAdasAbilityManager INSTANCE = new OCHAdasAbilityManager(); + } + + public static OCHAdasAbilityManager getInstance() { + return SingletonHolder.INSTANCE; + } + + public void init(Context context) { + initListeners(); + } + + public void setAdasStartFailureCallback(OchAdasStartFailureCallback callback){ + failureCallback = callback; + } + + public boolean getAutopilotAbilityStatus(){ + return isAutopilotAbility; + } + + public String getAutopilotUnAbilityReason(){ + return autopilotAbilityReason; + } + + public String getStartFailedMessage() { + return startFailedMessage; + } + + private void initListeners() { + //2022.10.9 工控机状态信息回调(判断是否能否启动自动驾驶的回调), 目前定的是3秒回调一次 + CallerAutopilotActionsListenerManager.INSTANCE.addListener(TAG, this); + CallerAutopilotStatisticsListenerManager.INSTANCE.addListener(TAG,this); + } + + private void releaseListeners() { + CallerAutopilotActionsListenerManager.INSTANCE.removeListener(this); + CallerAutopilotStatisticsListenerManager.INSTANCE.removeListener(this); + } + + @Override + public void onAutopilotAbility(@Nullable AutopilotAbility ability) { + isAutopilotAbility = true; + autopilotAbilityReason = null; + if (ability.gear == null || ability.gear == Chassis.GearPosition.GEAR_P || + ability.gear == Chassis.GearPosition.GEAR_R) { + isAutopilotAbility = false; + autopilotAbilityReason = "挡位不正常"; + } + + if (DebugConfig.getProductFlavor() == "fPadLenovoOchBus" && + ability.gear == Chassis.GearPosition.GEAR_N){ //bus档位不正常 + isAutopilotAbility = false; + autopilotAbilityReason = "挡位不正常"; + } + + if (isAutopilotAbility) + if (ability.brake > 0) { + isAutopilotAbility = false; + autopilotAbilityReason = "制动踏板被踩下"; + } + if (isAutopilotAbility) + if (ability.statusInfo.getSysState() == SystemStatusInfo.SystemState.SYS_STARTING) { + isAutopilotAbility = false; + autopilotAbilityReason = "系统正在启动"; + } + if (isAutopilotAbility) + if (ability.statusInfo.getSysState() == SystemStatusInfo.SystemState.SYS_EXITING) { + isAutopilotAbility = false; + autopilotAbilityReason = "系统正在关闭"; + } + Logger.d(TAG, "是否可以启动自动驾驶=" + isAutopilotAbility + " 原因=" + autopilotAbilityReason); + } + + + @Override + public void onAutopilotStatistics(@Nullable AutopilotStatistics statistics) { + if (statistics == null) return; + Logger.d(TAG, "AutopilotStatistics= " + statistics.status); + if (failureCallback != null && 1 == statistics.status){ + startFailedMessage = statistics.failedMessage.getMsg(); + failureCallback.onStartAutopilotFailure(startFailedMessage); + Logger.d(TAG, "statistics-startFailedMessage= " + startFailedMessage); + } + } + + public void release() { + releaseListeners(); + } +} diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/NaviToDestinationModel.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/map/AmapNaviToDestinationModel.java similarity index 73% rename from OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/NaviToDestinationModel.java rename to OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/map/AmapNaviToDestinationModel.java index 84a387ead4..048a0baa0d 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/NaviToDestinationModel.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/map/AmapNaviToDestinationModel.java @@ -1,4 +1,4 @@ -package com.mogo.och.taxi.model; +package com.mogo.och.common.module.map; import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI; @@ -25,8 +25,7 @@ import com.amap.api.navi.model.NaviLatLng; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.util.NetworkUtils; import com.mogo.eagle.core.utilcode.util.ToastUtils; -import com.mogo.och.taxi.callback.ITaxiNaviChangedCallback; -import com.mogo.och.taxi.utils.PermissionUtil; +import com.mogo.och.common.module.utils.PermissionUtil; import java.util.ArrayList; import java.util.List; @@ -36,24 +35,27 @@ import java.util.concurrent.atomic.AtomicInteger; * @author: wangmingjun * @date: 2021/12/6 */ -public class NaviToDestinationModel implements AMapNaviListener { +public class AmapNaviToDestinationModel implements AMapNaviListener { + + public static final String TAG = "NaviToDestinationModel"; + private static Context mContext; private AMapNavi mAMapNavi = null; protected final List sList = new ArrayList(); protected final List eList = new ArrayList(); protected List mWayPointList = new ArrayList(); - private ITaxiNaviChangedCallback mNaviChangedCallback; + private ICommonNaviChangedCallback mNaviChangedCallback; private AtomicInteger errorCount = new AtomicInteger(0); private boolean isPlay; - public static NaviToDestinationModel getInstance(Context context) { + public static AmapNaviToDestinationModel getInstance(Context context) { mContext = context; return SingletonHolder.INSTANCE; } private static final class SingletonHolder { - private static final NaviToDestinationModel INSTANCE = new NaviToDestinationModel(); + private static final AmapNaviToDestinationModel INSTANCE = new AmapNaviToDestinationModel(); } - private NaviToDestinationModel(){ + private AmapNaviToDestinationModel(){ } public void initAMapNavi(NaviLatLng startLatLng,NaviLatLng endLatLng) { try { @@ -90,7 +92,7 @@ public class NaviToDestinationModel implements AMapNaviListener { } } - public void setOCHTaciNaviChangedCallback(ITaxiNaviChangedCallback callback){ + public void setOCHTaciNaviChangedCallback(ICommonNaviChangedCallback callback){ this.mNaviChangedCallback = callback; } @Override @@ -132,6 +134,7 @@ public class NaviToDestinationModel implements AMapNaviListener { public void onNaviInfoUpdate(NaviInfo naviinfo) { //导航过程中的信息更新,请看NaviInfo的具体说明 if (null != mNaviChangedCallback){ + CallerLogger.INSTANCE.i(M_TAXI + TAG, "距离=" + naviinfo.getPathRetainDistance() + ", 剩余时间 " + naviinfo.getPathRetainTime()); mNaviChangedCallback.onCurrentNaviDistAndTimeChanged(naviinfo.getPathRetainDistance(),naviinfo.getPathRetainTime());// 米、秒 } } @@ -165,13 +168,9 @@ public class NaviToDestinationModel implements AMapNaviListener { } return; } -// if (result.getErrorCode() == 3){ -// ToastUtils.showShort("车辆当前坐标错误"); -// }else if (result.getErrorCode() == 6){ -// ToastUtils.showShort("终点坐标错误"); -// } - CallerLogger.INSTANCE.i(M_TAXI + "dm", "路线计算失败:错误码=" + result.getErrorCode() + ",Error Message= " + result.getErrorDetail()); - CallerLogger.INSTANCE.i(M_TAXI + "dm", "错误码详细链接见:http://lbs.amap.com/api/android-navi-sdk/guide/tools/errorcode/"); + + CallerLogger.INSTANCE.i(M_TAXI + TAG, "路线计算失败:错误码=" + result.getErrorCode() + ",Error Message= " + result.getErrorDetail()); + CallerLogger.INSTANCE.i(M_TAXI + TAG, "错误码详细链接见:http://lbs.amap.com/api/android-navi-sdk/guide/tools/errorcode/"); } @Override public void onStartNavi(int type) { @@ -341,88 +340,4 @@ public class NaviToDestinationModel implements AMapNaviListener { public void onPlayRing(int i) { } - - /** - * 车道信息说明: - *

- * 0xFF, 无对应车道 - * 0, 直行 - * 1, 左转 - * 2, 直行+左转 - * 3, 右转 - * 4, 直行+右转 - * 5, 左掉头 - * 6, 左转+右转 - * 7, 直行+左转+右转 - * 8, 右掉头 - * 9, 直行+左掉头 - * 10, 直行+右掉头 - * 11, 左转+左掉头 - * 12, 右转+右掉头 - * 13, 直行+扩展 - * 14, 左转+左掉头+扩展 - * 15, 保留 - * 16, 直行+左转+左掉头 - * 17, 右转+左掉头 - * 18, 左转+右转+左掉头 - * 19, 直行+右转+左掉头 - * 20, 左转+右掉头 - * 21, 公交车道 - * 22, 空车道 - * 23 可变车道 - */ - - String[] array = { - "直行车道" - , "左转车道" - , "左转或直行车道" - , "右转车道" - , "右转或直行车道" - , "左掉头车道" - , "左转或者右转车道" - , " 左转或右转或直行车道" - , "右转掉头车道" - , "直行或左转掉头车道" - , "直行或右转掉头车道" - , "左转或左掉头车道" - , "右转或右掉头车道" - , "直行并且车道扩展" - , "左转+左掉头+扩展" - , "不可以选择该车道" - , "直行+左转+左掉头车道" - , "右转+左掉头" - , "左转+右转+左掉头" - , "直行+右转+左掉头" - , "左转+右掉头" - , "公交车道" - , "空车道" - , "可变车道" - }; - - String[] actions = { - "直行" - , "左转" - , "左转或直行" - , "右转" - , "右转或这行" - , "左掉头" - , "左转或者右转" - , " 左转或右转或直行" - , "右转掉头" - , "直行或左转掉头" - , "直行或右转掉头" - , "左转或左掉头" - , "右转或右掉头" - , "直行并且车道扩展" - , "左转+左掉头+扩展" - , "不可以选择" - , "直行+左转+左掉头" - , "右转+左掉头" - , "左转+右转+左掉头" - , "直行+右转+左掉头" - , "左转+右掉头" - , "公交车道" - , "空车道" - , "可变车道" - }; } diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/map/CommonAmapNaviVIew.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/map/CommonAmapNaviVIew.kt new file mode 100644 index 0000000000..887729704f --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/map/CommonAmapNaviVIew.kt @@ -0,0 +1,249 @@ +package com.mogo.och.common.module.map + +import android.content.Context +import android.graphics.BitmapFactory +import android.os.Bundle +import android.util.AttributeSet +import android.view.LayoutInflater +import android.widget.RelativeLayout +import com.amap.api.maps.AMap +import com.amap.api.maps.model.CustomMapStyleOptions +import com.amap.api.navi.AMapNaviView +import com.amap.api.navi.AMapNaviViewListener +import com.amap.api.navi.AMapNaviViewOptions +import com.amap.api.navi.model.RouteOverlayOptions +import com.mogo.eagle.core.utilcode.mogo.MapAssetStyleUtils +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant +import com.mogo.och.common.module.R +import kotlinx.android.synthetic.main.taxi_common_amap_navi_view.view.* +import kotlin.concurrent.thread + +/** + * @author: wangmingjun + * @date: 2022/10/23 + */ +class CommonAmapNaviVIew @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0) + : RelativeLayout(context,attrs,defStyleAttr), AMapNaviViewListener { + + private val TAG : String = "TaxiAmapNaviVIew" + + var aMap : AMap? = null + + init { + LayoutInflater.from(context).inflate(R.layout.taxi_common_amap_navi_view,this,true) + initMapView() + } + + private fun initMapView(){ + + amapNaviView.setAMapNaviViewListener(this) + //车头向上模式 + amapNaviView.naviMode = AMapNaviView.CAR_UP_MODE + aMap = amapNaviView.map + //关闭地图文字显示 + aMap!!.showMapText(false) + // 设置导航地图模式,aMap是地图控制器对象。 + aMap!!.mapType = AMap.MAP_TYPE_NIGHT + // 关闭显示实时路况图层,aMap是地图控制器对象。 + aMap!!.isTrafficEnabled = false + setMapViewOptions() + + thread(start = true){ + try { + Thread.sleep(1000L) + } catch (e : InterruptedException) { + e.printStackTrace() + } + + if (null == context){ + return@thread + } + + aMap!!.setCustomMapStyle( + CustomMapStyleOptions() + .setEnable(true) + .setStyleData(MapAssetStyleUtils.getAssetsStyle(context, "over_view_style.data")) + .setStyleExtraData(MapAssetStyleUtils.getAssetsExtraStyle(context, "over_view_style_extra.data")) + ) + } + } + + private fun setMapViewOptions() { + + val options = AMapNaviViewOptions() + options.tilt = 0 //设置 2D 模式 + + options.isLayoutVisible = false //设置导航界面UI是否显示。 + + options.isTrafficBarEnabled = false //设置路况光柱条是否显示(只适用于驾车导航,需要联网)。 + + options.isAutoLockCar = true //设置6秒后是否自动锁车 + + options.isAutoDisplayOverview = true //设置是否自动全览模式,即在算路成功后自动进入全览模式 + + options.isTrafficLine = false + options.setModeCrossDisplayShow(true) //设置是否显示路口放大图(路口模型图) + + options.isAutoChangeZoom = true //自动缩放级别 + + options.carBitmap = + BitmapFactory.decodeResource(context.resources, R.drawable.taxi_navi_arrow_icon) + options.fourCornersBitmap = + BitmapFactory.decodeResource(this.resources, R.drawable.taxi_navi_direction_icon) + options.isAutoChangeZoom = true //设置是否开启动态比例尺 (锁车态下自动进行地图缩放变化) + +// options.setZoom(18);//14-18 +// options.setTrafficInfoUpdateEnabled(false); +// options.setTrafficLayerEnabled(false);//设置[实时交通图层开关按钮]是否显示(只适用于驾车导航,需要联网)。 +// options.setCameraInfoUpdateEnabled(false); +// options.setCompassEnabled(false);//设置指南针图标否在导航界面显示,默认显示。 +// options.setLaneInfoShow(false);// 设置是否显示道路信息view +// options.setNaviArrowVisible(false);//设置路线转向箭头隐藏和显示 +// options.setRealCrossDisplayShow(false);//设置是否显示路口放大图(实景图) +// options.setRouteListButtonShow(true);//设置导航界面是否显示路线全览按钮。 +// options.setSettingMenuEnabled(false);//设置菜单按钮是否在导航界面显示。 + + // options.setZoom(18);//14-18 +// options.setTrafficInfoUpdateEnabled(false); +// options.setTrafficLayerEnabled(false);//设置[实时交通图层开关按钮]是否显示(只适用于驾车导航,需要联网)。 +// options.setCameraInfoUpdateEnabled(false); +// options.setCompassEnabled(false);//设置指南针图标否在导航界面显示,默认显示。 +// options.setLaneInfoShow(false);// 设置是否显示道路信息view +// options.setNaviArrowVisible(false);//设置路线转向箭头隐藏和显示 +// options.setRealCrossDisplayShow(false);//设置是否显示路口放大图(实景图) +// options.setRouteListButtonShow(true);//设置导航界面是否显示路线全览按钮。 +// options.setSettingMenuEnabled(false);//设置菜单按钮是否在导航界面显示。 + val routeOverlayOptions = RouteOverlayOptions() + +// routeOverlayOptions.setArrowOnTrafficRoute(BitmapFactory.decodeResource(getResources(),R.drawable.custtexture_aolr)); + +// routeOverlayOptions.setArrowOnTrafficRoute(BitmapFactory.decodeResource(getResources(),R.drawable.custtexture_aolr)); + routeOverlayOptions.normalRoute = + BitmapFactory.decodeResource(resources, R.drawable.taxi_navi_line_icon) + options.routeOverlayOptions = routeOverlayOptions + + amapNaviView.viewOptions = options + } + + override fun onNaviSetting() { + //底部导航设置点击回调 + } + + override fun onNaviCancel() { + TODO("Not yet implemented") + } + + override fun onNaviBackClick(): Boolean { + return false + } + + override fun onNaviMapMode(p0: Int) { + //导航态车头模式,0:车头朝上状态;1:正北朝上模式。 + } + + override fun onNaviTurnClick() { + //转弯view的点击回调 + } + + override fun onNextRoadClick() { + //下一个道路View点击回调 + } + + override fun onScanViewButtonClick() { + //全览按钮点击回调 + } + + override fun onLockMap(p0: Boolean) { + //锁地图状态发生变化时回调 + } + + override fun onNaviViewLoaded() { + d(SceneConstant.M_TAXI + TAG, "导航页面加载成功") + d( + SceneConstant.M_TAXI + TAG, + "请不要使用AMapNaviView.getMap().setOnMapLoadedListener();会overwrite导航SDK内部画线逻辑" + ) + } + + override fun onMapTypeChanged(p0: Int) { + TODO("Not yet implemented") + } + + override fun onNaviViewShowMode(p0: Int) { + TODO("Not yet implemented") + } + + fun onCreate(savedInstanceState : Bundle?){ + amapNaviView.onCreate(savedInstanceState) + } + + fun onResume(){ + amapNaviView.onResume() + } + + fun onPause(){ + amapNaviView.onPause() + } + + fun onDestroy(){ + amapNaviView.onDestroy() + } + + var array = arrayOf( + "直行车道", + "左转车道", + "左转或直行车道", + "右转车道", + "右转或直行车道", + "左掉头车道", + "左转或者右转车道", + " 左转或右转或直行车道", + "右转掉头车道", + "直行或左转掉头车道", + "直行或右转掉头车道", + "左转或左掉头车道", + "右转或右掉头车道", + "直行并且车道扩展", + "左转+左掉头+扩展", + "不可以选择该车道", + "直行+左转+左掉头车道", + "右转+左掉头", + "左转+右转+左掉头", + "直行+右转+左掉头", + "左转+右掉头", + "公交车道", + "空车道", + "可变车道" + ) + + var actions = arrayOf( + "直行", + "左转", + "左转或直行", + "右转", + "右转或这行", + "左掉头", + "左转或者右转", + " 左转或右转或直行", + "右转掉头", + "直行或左转掉头", + "直行或右转掉头", + "左转或左掉头", + "右转或右掉头", + "直行并且车道扩展", + "左转+左掉头+扩展", + "不可以选择", + "直行+左转+左掉头", + "右转+左掉头", + "左转+右转+左掉头", + "直行+右转+左掉头", + "左转+右掉头", + "公交车道", + "空车道", + "可变车道" + ) +} \ No newline at end of file diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/ITaxiNaviChangedCallback.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/map/ICommonNaviChangedCallback.java similarity index 75% rename from OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/ITaxiNaviChangedCallback.java rename to OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/map/ICommonNaviChangedCallback.java index 138de6b9b1..12440028bb 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/ITaxiNaviChangedCallback.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/map/ICommonNaviChangedCallback.java @@ -1,11 +1,11 @@ -package com.mogo.och.taxi.callback; +package com.mogo.och.common.module.map; /** * @author: wangmingjun * @date: 2021/12/3 */ -public interface ITaxiNaviChangedCallback { +public interface ICommonNaviChangedCallback { // 当前位置距离上车点的距离(米)、预估时间(秒) void onCurrentNaviDistAndTimeChanged(int meters, long timeInSecond); void reInitNaviAmap(boolean isPlay,boolean isRestart); -} +} \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/AnimatorDrawableUtil.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/AnimatorDrawableUtil.java index bbf9d779eb..513bfa6c34 100644 --- a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/AnimatorDrawableUtil.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/AnimatorDrawableUtil.java @@ -35,7 +35,7 @@ public class AnimatorDrawableUtil { //图片资源的ID列表 private List mResourceIdList = null; //定时任务器 - private Timer mTimer = null; + private final Timer mTimer = new Timer(); //定时任务 private AnimTimerTask mTimeTask = null; //记录播放位置 @@ -44,7 +44,7 @@ public class AnimatorDrawableUtil { private boolean isLooping = false; public AnimatorDrawableUtil() { - mTimer = new Timer(); +// mTimer = new Timer(); } /** @@ -139,18 +139,25 @@ public class AnimatorDrawableUtil { */ public void start(boolean loop, int duration, AnimationLisenter lisenter) { this.lisenter = lisenter; - stop(); +// stop(); if (mResourceIdList == null || mResourceIdList.size() == 0) { return; } - if (mTimer == null) { - mTimer = new Timer(); +// if (mTimer == null) { +// mTimer = new Timer(); +// } + try { + isLooping = loop; + mFrameIndex = 0; + mState = STATE_RUNNING; + if (mTimeTask != null){ + return; + } + mTimeTask = new AnimTimerTask(); + mTimer.schedule(mTimeTask, 0, duration); + }catch (Exception e){ + e.printStackTrace(); } - isLooping = loop; - mFrameIndex = 0; - mState = STATE_RUNNING; - mTimeTask = new AnimTimerTask(); - mTimer.schedule(mTimeTask, 0, duration); if (lisenter != null){ lisenter.startAnimation(); } @@ -163,7 +170,7 @@ public class AnimatorDrawableUtil { if (mTimer != null) { mTimer.purge(); mTimer.cancel(); - mTimer = null; +// mTimer = null; } if (mTimeTask != null) { mFrameIndex = 0; diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/BlinkAnimationUtil.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/BlinkAnimationUtil.java new file mode 100644 index 0000000000..02c67cf910 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/BlinkAnimationUtil.java @@ -0,0 +1,45 @@ +package com.mogo.och.common.module.utils; + +import android.animation.AnimatorSet; +import android.animation.ObjectAnimator; +import android.widget.ImageView; + +/** + * @author: wangmingjun + * @date: 2022/9/23 + */ +public class BlinkAnimationUtil { + + //实现图片闪烁效果 + public static void setAnimation(ImageView imageView) { + Object animObject = imageView.getTag(imageView.getId()); + if (animObject instanceof AnimatorSet){ + AnimatorSet animatorSet = (AnimatorSet)animObject; + animatorSet.start(); + return; + } + + AnimatorSet animationSet = new AnimatorSet(); + imageView.setTag(imageView.getId(),animationSet); + + ObjectAnimator valueAnimator = ObjectAnimator.ofFloat(imageView, "alpha",0f, 1.0f); + ObjectAnimator valueAnimatorDisappare = ObjectAnimator.ofFloat(imageView, "alpha",1.0f, 0f); + valueAnimator.setDuration(1000); + valueAnimatorDisappare.setDuration(800); + + valueAnimator.setRepeatCount(-1); + valueAnimatorDisappare.setRepeatCount(-1); + + animationSet.playTogether(valueAnimatorDisappare, valueAnimator); + animationSet.start(); + } + + //消除动画 + public static void clearAnimation(ImageView imageView){ + Object animObject = imageView.getTag(imageView.getId()); + if (animObject instanceof AnimatorSet){ + AnimatorSet animatorSet = (AnimatorSet)animObject; + animatorSet.end(); + } + } +} diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/CallerLoggerUtils.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/CallerLoggerUtils.kt new file mode 100644 index 0000000000..6289004563 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/CallerLoggerUtils.kt @@ -0,0 +1,31 @@ +package com.mogo.och.common.module.utils + +import com.mogo.commons.debug.DebugConfig +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS_P +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_TAXI +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_TAXI_P + +object CallerLoggerUtils { + var flavorTag = when (DebugConfig.getProductFlavor()) { + "fPadLenovoOchTaxi" -> { + //出租车司机 + M_TAXI + } + "fPadLenovoOchBus" -> { + //小巴车司机 + M_BUS + } + "fPadLenovoOchTaxiPassenger" -> { + //出租车乘客 + M_TAXI_P + } + "fPadLenovoOchBusPassenger" -> { + //小巴车乘客 + M_BUS_P + } + else -> { + "" + } + } +} \ No newline at end of file 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 01ec888715..3ab7e47426 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 @@ -1,6 +1,7 @@ package com.mogo.och.common.module.utils; import android.content.Context; +import android.location.Location; import com.amap.api.maps.CoordinateConverter; import com.amap.api.maps.model.LatLng; @@ -8,7 +9,9 @@ import com.mogo.cloud.commons.utils.CoordinateUtils; import com.mogo.eagle.core.utilcode.mogo.logger.Logger; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import mogo.telematics.pad.MessagePad; @@ -144,26 +147,29 @@ public class CoordinateCalculateRouteUtil { if (mRoutePoints.size() > 0){ //基础点 LatLng baseLatLng = mRoutePoints.get(0); - float baseDiffDis = CoordinateUtils.calculateLineDistance(realLon,realLat - ,baseLatLng.longitude,baseLatLng.latitude);// lon,lat, prelon, prelat + if (baseLatLng != null){ + 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){ + 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; + baseDiffDis = diff; + currentIndex = i; + } } - } // Logger.d(M_TAXI + "calculateRouteSumLength", "点:"+currentIndex+"-------是最近的点------ "); - if (currentIndex == mRoutePoints.size()-1){ - latePoints.add(mRoutePoints.get(currentIndex)); - }else { - latePoints.addAll(mRoutePoints.subList(currentIndex,mRoutePoints.size()-1)); + if (currentIndex == mRoutePoints.size()-1){ + latePoints.add(mRoutePoints.get(currentIndex)); + }else if(currentIndex < mRoutePoints.size()-1){ + latePoints.addAll(mRoutePoints.subList(currentIndex,mRoutePoints.size()-1)); + } + return latePoints; } - return latePoints; + } return latePoints; } @@ -180,21 +186,127 @@ public class CoordinateCalculateRouteUtil { if (mRoutePoints.size() > 0){ //基础点 LatLng baseLatLng = mRoutePoints.get(0); - float baseDiffDis = CoordinateUtils.calculateLineDistance(realLon,realLat - ,baseLatLng.longitude,baseLatLng.latitude);// lon,lat, prelon, prelat + if (baseLatLng != null){ + 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){ + 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; + } + + public static float calculateRouteSumLengthByLocation(List points){ + if (null == points || points.size() == 0) return 0; + + float sumLength = 0; + + //计算全路径总距离 + for (int i = 0;i + 1< points.size();i++){ + double preLat = points.get(i).getLatitude(); + double preLon = points.get(i).getLongitude(); + double laLat = points.get(i+1).getLatitude(); + double laLon = points.get(i+1).getLongitude(); + + float length = CoordinateUtils.calculateLineDistance(laLon,laLat,preLon,preLat); + sumLength += length; + } + return sumLength; + } + + + public static List coordinateConverterWgsToGcjLocations(Context mContext, List models) { + //转成MogoLatLng集合 + List list = new ArrayList<>(); + for (MessagePad.Location m : models) { + LatLng mogoLatLng = coordinateConverterWgsToGcj(mContext, m); + Location location = new Location("gcj_provider"); + location.setBearing((float) m.getHeading()); + location.setLatitude(mogoLatLng.latitude); + location.setLongitude(mogoLatLng.longitude); + list.add(location); + } + return list; + } + + public static Map> getRemainPointListByCompareNew(int preIndex, + List mRoutePoints, + Location realLocation) { + Map> routePonits = new HashMap<>(); + List latePoints = new ArrayList<>(); // 剩余轨迹集合 + int currentIndex = 0; //记录疑似点 + if (mRoutePoints.size() > preIndex){ + //基础点 + Location baseLatLng = mRoutePoints.get(preIndex); + float baseDiffDis = CoordinateUtils.calculateLineDistance(realLocation.getLongitude(), + realLocation.getLatitude() + ,baseLatLng.getLongitude(),baseLatLng.getLongitude());// lon,lat, prelon, prelat + + for (int i= preIndex; i < mRoutePoints.size(); i++){ + Location latLng = mRoutePoints.get(i); + //todo 先看index对应点的方向和realLocation方向是否一致, 方向角度不能过90度 + if (Math.abs(realLocation.getBearing() - latLng.getBearing()) <= 90){ + float diff = CoordinateUtils.calculateLineDistance(realLocation.getLongitude(), + realLocation.getLatitude(), + latLng.getLongitude(),latLng.getLatitude()); + if (baseDiffDis > diff ){ +// Logger.d(M_TAXI + "calculateRouteSumLength", "点:"+i+"-------先记录点----- "); + baseDiffDis = diff; + currentIndex = i; + } + } + } + Logger.d( "calculateRouteSumLength", "点:"+currentIndex+"-------是最近的点------ "); + if (currentIndex == mRoutePoints.size()-1){ + Location location = mRoutePoints.get(currentIndex); + LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); + latePoints.add(latLng); + }else { + List locations = mRoutePoints.subList(currentIndex,mRoutePoints.size()-1); + for (Location location: locations) { + LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); + latePoints.add(latLng); + } + } + routePonits.put(currentIndex,latePoints); + return routePonits; + } + return routePonits; + } + + public static int getArrivedPointIndexNew(List mRoutePoints, + Location realLocation) { + int currentIndex = 0; //记录疑似点 //基础点 + Location baseLatLng = mRoutePoints.get(0); + float baseDiffDis = CoordinateUtils.calculateLineDistance(realLocation.getLongitude(), + realLocation.getLatitude() + , baseLatLng.getLongitude(), baseLatLng.getLongitude());// lon,lat, prelon, prelat + + for (int i = 0; i < mRoutePoints.size(); i++) { + Location latLng = mRoutePoints.get(i); + //todo 先看index对应点的方向和realLocation方向是否一致, 方向角度不能过90度 + if (Math.abs(realLocation.getBearing() - latLng.getBearing()) <= 90) { + float diff = CoordinateUtils.calculateLineDistance(realLocation.getLongitude(), + realLocation.getLatitude(), + latLng.getLongitude(), latLng.getLatitude()); + if (baseDiffDis > diff) { // Logger.d(M_TAXI + "calculateRouteSumLength", "点:"+i+"-------先记录点----- "); baseDiffDis = diff; currentIndex = i; } } - return currentIndex; } + Logger.d("calculateRouteSumLength", "点:" + currentIndex + "-------是最近的点------ "); return currentIndex; } } diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/FieldUtils.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/FieldUtils.java new file mode 100644 index 0000000000..9dc909d19c --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/FieldUtils.java @@ -0,0 +1,37 @@ +package com.mogo.och.common.module.utils; + +import android.text.TextUtils; + +import java.lang.reflect.Field; +import java.lang.reflect.Member; +import java.lang.reflect.Modifier; + +public class FieldUtils { + + public static Field getDeclaredField(final Class cls, final String fieldName, final + boolean forceAccess) { + if (cls == null || TextUtils.isEmpty(fieldName)) { + return null; + } + try { + // only consider the specified class by using getDeclaredField() + final Field field = cls.getDeclaredField(fieldName); + if (!isAccessible(field)) { + if (forceAccess) { + field.setAccessible(true); + } else { + return null; + } + } + return field; + } catch (final Exception e) { + e.printStackTrace(); + } + return null; + } + + + private static boolean isAccessible(final Member m) { + return m != null && Modifier.isPublic(m.getModifiers()) && !m.isSynthetic(); + } +} \ No newline at end of file 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 4c626a4659..1af162ef26 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 @@ -21,4 +21,20 @@ public class NumberFormatUtil { } return String.valueOf(num); } + + /** + * 截取小数点后cutNum位, 不进行四舍五入 + * @param num + * @param cutNum + * @return + */ + public static String cutOutNumber(double num,int cutNum){ + try{ + BigDecimal bg = new BigDecimal(num).setScale(cutNum, RoundingMode.DOWN); + return String.valueOf(bg.doubleValue()); + }catch (Exception e){ + + } + return ""; + } } diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/PermissionUtil.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/PermissionUtil.java new file mode 100644 index 0000000000..8dac5fdf56 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/PermissionUtil.java @@ -0,0 +1,35 @@ +package com.mogo.och.common.module.utils; + +import android.content.Context; +import android.content.pm.PackageManager; +import android.location.LocationManager; + +import androidx.core.content.ContextCompat; + +/** + * @author: wangmingjun + * @date: 2021/12/7 + */ +public class PermissionUtil { + + public static boolean checkPermission(Context context,String... permissons) { + + for (String permisson : permissons) { + if ((ContextCompat.checkSelfPermission(context, + permisson) != PackageManager.PERMISSION_GRANTED)) { + return false; + } + } + return true; + } + + public static boolean isLocServiceEnable(Context context) { + LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); + boolean gps = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); + boolean network = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); + if (gps || network) { + return true; + } + return false; + } +} diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/SoundPoolHelper.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/SoundPoolHelper.java new file mode 100644 index 0000000000..74c80b8abd --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/SoundPoolHelper.java @@ -0,0 +1,118 @@ +package com.mogo.och.common.module.utils; + +import android.media.*; +import android.content.*; +import android.os.*; +import android.app.*; + +/** + * @author: wangmingjun + * @date: 2022/9/23 + * + */ +public class SoundPoolHelper { + private SoundPool mSoundPool; + private AudioManager mAudioManager; + private float volume; + // Maximumn sound stream. + private static final int MAX_STREAMS = 5; + // Stream type. + private static final int streamType = AudioManager.STREAM_MUSIC; + private int mSoundId; + private int resId; + private Context mContext; + + private volatile static SoundPoolHelper INSTANCE; + + public static SoundPoolHelper getSoundPoolHelper(){ + if (INSTANCE == null){ + synchronized (SoundPoolHelper.class){ + if (INSTANCE == null){ + INSTANCE = new SoundPoolHelper(); + } + } + } + return INSTANCE; + } + + public SoundPoolHelper(){} + + //播放资源文件 + public void playSoundWithRedId(Context context,int resId){ + this.mContext = context; + this.resId=resId; + init(); + } + + //init settings + private void init(){ + // AudioManager audio settings for adjusting the volume + mAudioManager = (AudioManager)this.mContext. getSystemService(Context.AUDIO_SERVICE); + + // Current volumn Index of particular stream type. + float currentVolumeIndex = (float) mAudioManager.getStreamVolume(streamType); + + // Get the maximum volume index for a particular stream type. + float maxVolumeIndex = (float) mAudioManager.getStreamMaxVolume(streamType); + + // Volumn (0 --> 1) + this.volume = currentVolumeIndex / maxVolumeIndex; + + // Suggests an audio stream whose volume should be changed by + // the hardware volume controls. + ((Activity)this.mContext).setVolumeControlStream(streamType); + + if (mSoundPool == null){ + // For Android SDK >= 21 + if (Build.VERSION.SDK_INT >= 21 ) { + + AudioAttributes audioAttrib = new AudioAttributes.Builder() + .setUsage(AudioAttributes.USAGE_GAME) + .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) + .build(); + + SoundPool.Builder builder= new SoundPool.Builder(); + builder.setAudioAttributes(audioAttrib).setMaxStreams(MAX_STREAMS); + + this.mSoundPool = builder.build(); + } else {// for Android SDK < 21 + // SoundPool(int maxStreams, int streamType, int srcQuality) + this.mSoundPool = new SoundPool(MAX_STREAMS, AudioManager.STREAM_MUSIC, 0); + } + } + + // When Sound Pool load complete. + this.mSoundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() { + @Override + public void onLoadComplete(SoundPool soundPool, int sampleId, int status) { + playSound(); + } + }); + + //load res + this.mSoundId =this.mSoundPool.load(this.mContext,this.resId,1); + } + + /** + * 释放资源 + */ + public void releaseSoundPool() { + if (mSoundPool != null) { + mSoundPool.autoPause(); + mSoundPool.unload(mSoundId); + mSoundPool.release(); + mSoundPool = null; + } + } + + + + //play the sound res + private void playSound(){ + float leftVolumn = volume; + float rightVolumn = volume; + // Play sound of gunfire. Returns the ID of the new stream. + int streamId = this.mSoundPool.play(this.mSoundId,leftVolumn, rightVolumn, 1, 0, 1f); + } + +} diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/ToastUtilsOch.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/ToastUtilsOch.java new file mode 100644 index 0000000000..a2a02a8475 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/ToastUtilsOch.java @@ -0,0 +1,33 @@ +package com.mogo.och.common.module.utils; + +import com.mogo.commons.debug.DebugConfig; +import com.mogo.eagle.core.utilcode.util.ToastUtils; + +public class ToastUtilsOch { + + private static long lastClickTime; + // 两次点击按钮之间的点击间隔不能少于1000毫秒 + private static int MIN_CLICK_DELAY_TIME = 1000; + + public static void showWithCodeMessage(int code,String message){ + if(message==null){ + return; + } + if (DebugConfig.isDebug()) { + ToastUtils.showShort(code+","+message); + }else { + ToastUtils.showShort(message); + } + } + + public static boolean isCustomFastClick(int customCLickDelayTime) { + MIN_CLICK_DELAY_TIME = customCLickDelayTime; + boolean flag = false; + long curClickTime = System.currentTimeMillis(); + if ((curClickTime - lastClickTime) >= MIN_CLICK_DELAY_TIME) { + flag = true; + } + lastClickTime = curClickTime; + return flag; + } +} diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/voice/VoiceNotice.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/voice/VoiceNotice.kt new file mode 100644 index 0000000000..43ef0ffb30 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/voice/VoiceNotice.kt @@ -0,0 +1,49 @@ +package com.mogo.och.common.module.voice + +import com.mogo.commons.AbsMogoApplication +import com.mogo.commons.voice.AIAssist +import com.mogo.eagle.core.utilcode.util.UiThreadHandler + +object VoiceNotice { + @JvmStatic + fun showNotice(notice: String?) { + showNotice(notice, AIAssist.LEVEL0) + } + + @JvmStatic + fun showNotice(notice: String?, level: Int) { + showNotice(notice,level,0) + } + + @JvmStatic + fun showNotice(notice: String?, delayed: Long) { + showNotice(notice, AIAssist.LEVEL0, delayed) + } + + @JvmStatic + fun showNotice(notice: String?, level: Int, delayed: Long = 0) { + notice?.let { + if (delayed == 0L) { + UiThreadHandler.post { + AIAssist.getInstance(AbsMogoApplication.getApp()) + .speakTTSVoiceWithLevel(it, level) + } + } else { + UiThreadHandler.postDelayed({ + AIAssist.getInstance(AbsMogoApplication.getApp()) + .speakTTSVoiceWithLevel(it, level) + }, delayed) + } + } + } + + /** + * 中断当前在播语音 + */ + @JvmStatic + fun stopCurrentTts(){ + UiThreadHandler.post { + AIAssist.getInstance(AbsMogoApplication.getApp()).stopTts() + } + } +} \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/MarqueeTextView.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/MarqueeTextView.java new file mode 100644 index 0000000000..884d504338 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/MarqueeTextView.java @@ -0,0 +1,129 @@ +package com.mogo.och.common.module.wigets; + +import android.content.Context; +import android.content.res.TypedArray; +import android.util.AttributeSet; +import android.view.ViewDebug; +import android.widget.TextView; + +import com.mogo.och.common.module.R; +import com.mogo.och.common.module.utils.FieldUtils; + +import java.lang.reflect.Field; + + +public class MarqueeTextView extends androidx.appcompat.widget.AppCompatTextView{ + + /** + * 上一次设置的时间,用于过滤多余操作 + */ + private long mLastSetTime; + /** + * 自定义 gap + */ + private float mCustomGap = 0.3f; + /** + * 是否使用自定义 gap + */ + private boolean mUseCustomGap; + + public MarqueeTextView(Context context) { + this(context, null); + } + + public MarqueeTextView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public MarqueeTextView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + + TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.MarqueeTextView); + mCustomGap = typedArray.getFloat(R.styleable.MarqueeTextView_customGap, mCustomGap); + mUseCustomGap = typedArray.getBoolean(R.styleable.MarqueeTextView_useCustomGap, false); + typedArray.recycle(); + } + + @Override + @ViewDebug.ExportedProperty(category = "focus") + public boolean isFocused() { + return true; + } + + @Override + @ViewDebug.ExportedProperty + public boolean isSelected() { + return true; + } + + @Override + public void invalidate() { + reflectToChangeGap(); + + super.invalidate(); + } + + private void reflectToChangeGap() { + if (!mUseCustomGap) { + return; + } + if (System.currentTimeMillis() - mLastSetTime < 1000) { + // 1s 内不重新设置,过滤多余操作 + return; + } + try { + Class marqueClass = null; + Class[] innerClazz = TextView.class.getDeclaredClasses(); + for (Class clazz : innerClazz) { + if ("Marquee".equals(clazz.getSimpleName())) { + marqueClass = clazz; + } + } + + if (marqueClass == null) { + return; + } + + Field field1 = FieldUtils.getDeclaredField(marqueClass, "mGhostStart", true); + + if (field1 == null) { + return; + } + + final int textWidth = getWidth() - getCompoundPaddingLeft() - getCompoundPaddingRight(); + final float lineWidth = getLayout().getLineWidth(0); + final float gap = mCustomGap*textWidth; + float ghostStart = lineWidth - textWidth + gap; + float maxScroll = ghostStart + textWidth; + float ghostOffset = lineWidth + gap; + float maxFadeScroll = ghostStart + lineWidth + lineWidth; + + final Field field = FieldUtils.getDeclaredField(TextView.class, "mMarquee", true); + if (field != null) { + Object mMarque = field.get(this); + if (mMarque != null) { + mLastSetTime = System.currentTimeMillis(); + float mGhostStart = (float) field1.get(mMarque); + if (mGhostStart != ghostStart) { + // 需要设置的 mGhostStart 与当前 ghostStart 不相等时才去设置 + Field field2 = FieldUtils.getDeclaredField(marqueClass, "mMaxScroll", true); + Field field3 = FieldUtils.getDeclaredField(marqueClass, "mGhostOffset", true); + Field field4 = FieldUtils.getDeclaredField(marqueClass, "mMaxFadeScroll", true); + + if (field2 == null || field3 == null || field4 == null) { + return; + } + + field1.set(mMarque, ghostStart); + field2.set(mMarque, maxScroll); + field3.set(mMarque, ghostOffset); + field4.set(mMarque, maxFadeScroll); + } + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/OCHCommitDialog.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/OCHCommitDialog.kt new file mode 100644 index 0000000000..1e0fde8d5f --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/OCHCommitDialog.kt @@ -0,0 +1,95 @@ +package com.mogo.och.common.module.wigets + +import android.content.Context +import android.widget.TextView +import androidx.lifecycle.LifecycleObserver +import com.mogo.module.common.dialog.BaseFloatDialog +import com.mogo.och.common.module.R + +/** + * 带有title, tip,confirm,cancel的dialog + */ +class OCHCommitDialog: BaseFloatDialog, LifecycleObserver { + + private var commonConfirm : TextView? = null + private var commonCancel : TextView? = null + private var commonTitle : TextView? = null + private var commonTips : TextView? = null + + private var clickListener: ClickListener? = null + + constructor(builder: Builder,context: Context) : super(context) { + commonTitle?.text = builder.titleStr + commonTips?.text = builder.tipsStr + commonCancel?.text = builder.cancelStr + commonConfirm?.text = builder.confirmStr + } + + init{ + setContentView(R.layout.dialog_bus_commit) + + setCanceledOnTouchOutside(true) + + commonConfirm = findViewById(R.id.common_confirm) + commonCancel = findViewById(R.id.common_cancel) + commonTitle = findViewById(R.id.common_title) + commonTips = findViewById(R.id.common_tips) + + commonConfirm?.setOnClickListener{ + clickListener?.confirm() + dismiss() + } + commonCancel?.setOnClickListener { + clickListener?.cancel() + dismiss() + } + } + + fun setClickListener(clickListener: ClickListener) { + this.clickListener = clickListener + } + + fun showUpgradeDialog(){ + if(isShowing){ + return + } + show() + } + + interface ClickListener{ + fun confirm() + fun cancel() + } + + class Builder{ + var titleStr:String = "" + var tipsStr:String = "" + var confirmStr:String = "" + var cancelStr:String = "" + + fun title(title: String) : Builder{ + this.titleStr = title + return this + } + + fun tips(tips: String) : Builder{ + this.tipsStr = tips + return this + } + + fun confirmStr(commit: String) : Builder{ + this.confirmStr = commit + return this + } + + fun cancelStr(cancel: String) : Builder{ + this.cancelStr = cancel + return this + } + + fun build(context: Context): OCHCommitDialog? { + return OCHCommitDialog(this,context) + } + } + +} \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/OCHRoundConstraintLayout.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/OCHRoundConstraintLayout.java new file mode 100644 index 0000000000..5280174fd2 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/OCHRoundConstraintLayout.java @@ -0,0 +1,165 @@ +package com.mogo.och.common.module.wigets; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Path; +import android.graphics.RectF; +import android.util.AttributeSet; +import android.view.GestureDetector; +import android.view.MotionEvent; + +import androidx.constraintlayout.widget.ConstraintLayout; + +import com.mogo.och.common.module.R; + + +/** + * author : donghongyu + * e-mail : 1358506549@qq.com + * date : 2020/5/27 2:08 PM + * desc : + * version: 1.0 + */ +public class OCHRoundConstraintLayout extends ConstraintLayout implements GestureDetector.OnGestureListener { + + private float roundLayoutRadius = 14f; + private Path roundPath; + private RectF rectF; + + // 上次滑动的坐标 + private int mLastXIntercept; + private int mLastYIntercept; + + private IScrollListener mScrollListener; + + private GestureDetector mDetector; + + public OCHRoundConstraintLayout(Context context) { + this(context, null); + } + + public OCHRoundConstraintLayout(Context context, AttributeSet attrs) { + this(context, attrs, 0); + TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.RoundLayout); + roundLayoutRadius = typedArray.getDimensionPixelSize(R.styleable.RoundLayout_roundLayoutRadius, (int) roundLayoutRadius); + typedArray.recycle(); + + init(); + } + + public OCHRoundConstraintLayout(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + + private void init() { + setWillNotDraw(false);//如果你继承的是ViewGroup,注意此行,否则draw方法是不会回调的; + roundPath = new Path(); + rectF = new RectF(); + mDetector = new GestureDetector(getContext(), this); + } + + private void setRoundPath() { + //添加一个圆角矩形到path中, 如果要实现任意形状的View, 只需要手动添加path就行 + roundPath.reset(); + roundPath.addRoundRect(rectF, roundLayoutRadius, roundLayoutRadius, Path.Direction.CW); + } + + + public void setRoundLayoutRadius(float roundLayoutRadius) { + this.roundLayoutRadius = roundLayoutRadius; + setRoundPath(); + postInvalidate(); + } + + public void setScrollListener(IScrollListener listener) { + mScrollListener = listener; + } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + super.onLayout(changed, l, t, r, b); + rectF.set(0f, 0f, getMeasuredWidth(), getMeasuredHeight()); + setRoundPath(); + } + + @Override + public void draw(Canvas canvas) { + if (roundLayoutRadius > 0f) { + canvas.clipPath(roundPath); + } + super.draw(canvas); + } + + @Override + public boolean onInterceptTouchEvent(MotionEvent ev) { + boolean intercepted = false; + int x = (int) ev.getX(); + int y = (int) ev.getY(); + switch (ev.getAction()) { + case MotionEvent.ACTION_MOVE: + int deltaX = x - mLastXIntercept; + int deltaY = y - mLastYIntercept; + if (Math.abs(deltaX) > Math.abs(deltaY)) { + intercepted = true; + } + break; + default: + break; + } + mLastXIntercept = x; + mLastYIntercept = y; + return intercepted; + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + if (mDetector != null) { + return mDetector.onTouchEvent(event); + } else { + return super.onTouchEvent(event); + } + } + + @Override + public boolean onDown(MotionEvent e) { + return true; + } + + @Override + public void onShowPress(MotionEvent e) { + } + + @Override + public boolean onSingleTapUp(MotionEvent e) { + return true; + } + + @Override + public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { + return true; + } + + @Override + public void onLongPress(MotionEvent e) { + } + + @Override + public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { + if (e2 != null) { + float deltaX = e2.getX() - (e1 != null ? e1.getX() : 0f); + float deltaY = e2.getY() - (e1 != null ? e1.getY() : 0f); + if (Math.abs(deltaX) > Math.abs(deltaY)) { + if (mScrollListener != null) { + mScrollListener.onScroll(velocityX < 0); + } + } + } + return true; + } + + public interface IScrollListener { + void onScroll(boolean isNextPage); + } +} diff --git a/OCH/mogo-och-common-module/src/main/res/color/taxi_login_get_code_text_color.xml b/OCH/mogo-och-common-module/src/main/res/color/taxi_login_get_code_text_color.xml new file mode 100644 index 0000000000..3df3bdb613 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/res/color/taxi_login_get_code_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-xhdpi/bus_ic_login_bg.webp b/OCH/mogo-och-common-module/src/main/res/drawable-xhdpi/bus_ic_login_bg.webp new file mode 100644 index 0000000000..7d76261863 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-xhdpi/bus_ic_login_bg.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-xhdpi/taxi_ic_login_bg.webp b/OCH/mogo-och-common-module/src/main/res/drawable-xhdpi/taxi_ic_login_bg.webp new file mode 100644 index 0000000000..7af7432551 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-xhdpi/taxi_ic_login_bg.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-xhdpi/taxi_navi_arrow_icon.png b/OCH/mogo-och-common-module/src/main/res/drawable-xhdpi/taxi_navi_arrow_icon.png new file mode 100644 index 0000000000..a83b7c9e74 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-xhdpi/taxi_navi_arrow_icon.png differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-xhdpi/taxi_navi_direction_icon.png b/OCH/mogo-och-common-module/src/main/res/drawable-xhdpi/taxi_navi_direction_icon.png new file mode 100755 index 0000000000..1b96799531 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-xhdpi/taxi_navi_direction_icon.png differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-xhdpi/taxi_navi_line_icon.png b/OCH/mogo-och-common-module/src/main/res/drawable-xhdpi/taxi_navi_line_icon.png new file mode 100644 index 0000000000..7f758d5999 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-xhdpi/taxi_navi_line_icon.png differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable/taxi_login_bg_selector.xml b/OCH/mogo-och-common-module/src/main/res/drawable/taxi_login_bg_selector.xml new file mode 100644 index 0000000000..86dcf132d8 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/res/drawable/taxi_login_bg_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/res/drawable/taxi_login_enable.xml b/OCH/mogo-och-common-module/src/main/res/drawable/taxi_login_enable.xml new file mode 100644 index 0000000000..939235d7e7 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/res/drawable/taxi_login_enable.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/res/drawable/taxi_login_get_code_text_color.xml b/OCH/mogo-och-common-module/src/main/res/drawable/taxi_login_get_code_text_color.xml new file mode 100644 index 0000000000..906ae4e8f6 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/res/drawable/taxi_login_get_code_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/res/drawable/taxi_login_phone_error.xml b/OCH/mogo-och-common-module/src/main/res/drawable/taxi_login_phone_error.xml new file mode 100644 index 0000000000..58e5bb0706 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/res/drawable/taxi_login_phone_error.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/res/drawable/taxi_login_phone_normal.xml b/OCH/mogo-och-common-module/src/main/res/drawable/taxi_login_phone_normal.xml new file mode 100644 index 0000000000..ec15e081b0 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/res/drawable/taxi_login_phone_normal.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/res/drawable/taxi_login_unenable.xml b/OCH/mogo-och-common-module/src/main/res/drawable/taxi_login_unenable.xml new file mode 100644 index 0000000000..c4b8483971 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/res/drawable/taxi_login_unenable.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/res/layout/dialog_bus_commit.xml b/OCH/mogo-och-common-module/src/main/res/layout/dialog_bus_commit.xml new file mode 100644 index 0000000000..9f65ffcb79 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/res/layout/dialog_bus_commit.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/res/layout/taxi_common_amap_navi_view.xml b/OCH/mogo-och-common-module/src/main/res/layout/taxi_common_amap_navi_view.xml new file mode 100644 index 0000000000..3d5f5aa763 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/res/layout/taxi_common_amap_navi_view.xml @@ -0,0 +1,5 @@ + + diff --git a/OCH/mogo-och-common-module/src/main/res/layout/taxi_login_view.xml b/OCH/mogo-och-common-module/src/main/res/layout/taxi_login_view.xml new file mode 100644 index 0000000000..104d59e06a --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/res/layout/taxi_login_view.xml @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/res/values/attrs.xml b/OCH/mogo-och-common-module/src/main/res/values/attrs.xml index 27efdf3802..9043a1d2ad 100644 --- a/OCH/mogo-och-common-module/src/main/res/values/attrs.xml +++ b/OCH/mogo-och-common-module/src/main/res/values/attrs.xml @@ -52,4 +52,9 @@ + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/res/values/colors.xml b/OCH/mogo-och-common-module/src/main/res/values/colors.xml new file mode 100644 index 0000000000..8db55d8e50 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/res/values/colors.xml @@ -0,0 +1,14 @@ + + + #2961F2 + #14FF0000 + #FF0000 + #666666 + #86A5F7 + #111533 + #878890 + #EF262C + #4D000000 + + #3B4577 + \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/res/values/strings.xml b/OCH/mogo-och-common-module/src/main/res/values/strings.xml new file mode 100644 index 0000000000..f2d52ad1eb --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/res/values/strings.xml @@ -0,0 +1,17 @@ + + + + 欢迎您登录 + 登录 + 获取验证码 + 请输入验证码 + 获取验证码成功 + 登录成功 + 请输入正确的手机号 + 请输入正确的验证码 + 请输入手机号 + 请输入手机号 + + 网络异常,请稍后重试 + 请求出现异常,请稍后重试 + \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/res/values/styles.xml b/OCH/mogo-och-common-module/src/main/res/values/styles.xml new file mode 100644 index 0000000000..ccbb7c934e --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/res/values/styles.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/test/java/com/mogo/och/common/module/ExampleUnitTest.kt b/OCH/mogo-och-common-module/src/test/java/com/mogo/och/common/module/ExampleUnitTest.kt index 76f5f67a00..b10afe9aa9 100644 --- a/OCH/mogo-och-common-module/src/test/java/com/mogo/och/common/module/ExampleUnitTest.kt +++ b/OCH/mogo-och-common-module/src/test/java/com/mogo/och/common/module/ExampleUnitTest.kt @@ -1,8 +1,8 @@ package com.mogo.och.common.module -import org.junit.Test - +import com.zhidao.thirdlogin.utils.Aes import org.junit.Assert.* +import org.junit.Test /** * Example local unit test, which will execute on the development machine (host). @@ -13,5 +13,11 @@ class ExampleUnitTest { @Test fun addition_isCorrect() { assertEquals(4, 2 + 2) + + val json = "{\"device\":\"03cdfec225781de0\",\"time\":" + System.currentTimeMillis() + "}" + val IVS = "tqXMOa6g2w3S4sso+DqCfKAHRNA5jg3Mzp45e33zHFA=" + val KEY = "y5VajBH+sTHonJP2a5Uh6uDZcK0fxNB5ORHmbg9B3V0=" + val encrypt: String = Aes.encrypt(json, KEY, IVS, "UTF-8") + println(encrypt) } } \ No newline at end of file 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 52ac14ed3f..7b607580bd 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 @@ -13,4 +13,5 @@ import mogo.telematics.pad.MessagePad; public interface IOCHTaxiPassengerAutopilotPlanningCallback { void setLineMarker(List models); void routeResultByServer(List models,int haveArrivedIndex); + void showRottingMapView(); } \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerOrderStatusCallback.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerOrderStatusCallback.java index 9d147d1ca4..d800e68e66 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerOrderStatusCallback.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerOrderStatusCallback.java @@ -1,11 +1,7 @@ package com.mogo.och.taxi.passenger.callback; -import androidx.annotation.NonNull; - import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRespBean; -import java.util.List; - /** * Created on 2021/9/8 * diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/constant/TaxiPassengerConst.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/constant/TaxiPassengerConst.kt index d3270cb212..b303ea69e0 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/constant/TaxiPassengerConst.kt +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/constant/TaxiPassengerConst.kt @@ -56,7 +56,12 @@ class TaxiPassengerConst { const val EVENT_PARAM_END_NAME = "end_name" const val EVENT_PARAM_ORDER_NUMBER = "order_num" const val EVENT_PARAM_START_RESULT = "start_autopilot" // true/false + const val EVENT_PARAM_START_FAILURE_MSG = "start_autopilot_failure_msg" // 启动自驾失败原因 const val EVENT_PARAM_PLATE_NUM = "plate_number" // 车牌号 const val EVENT_PARAM_ENV_ONLINE = "env_online" // 是否线上环境:true/false + + // 埋点key:开启自动驾驶前已识别的异常,会导致无法开启自驾 + const val EVENT_KEY_AP_UNABLE_START_REASON = "event_key_och_taxi_ap_unable_start_reason" + const val EVENT_PARAM_UNABLE_START_REASON = "unable_start_reason"; } } \ No newline at end of file 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 06ce8ec0f4..bcbe312e33 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 @@ -10,6 +10,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.amap.api.maps.model.LatLng; +import com.amap.api.navi.model.NaviLatLng; import com.elegant.network.utils.GsonUtil; import com.mogo.aicloud.services.socket.MogoAiCloudSocketManager; import com.mogo.cloud.commons.utils.CoordinateUtils; @@ -32,6 +33,9 @@ import com.mogo.eagle.core.utilcode.util.ToastUtils; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; import com.mogo.map.navi.IMogoCarLocationChangedListener2; import com.mogo.module.common.MogoApisHandler; +import com.mogo.och.common.module.manager.OCHAdasAbilityManager; +import com.mogo.och.common.module.map.AmapNaviToDestinationModel; +import com.mogo.och.common.module.biz.network.OchCommonServiceCallback; import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil; import com.mogo.och.common.module.utils.PinYinUtil; import com.mogo.och.taxi.passenger.bean.TaxiPassengerBaseRespBean; @@ -51,7 +55,6 @@ import com.mogo.och.taxi.passenger.callback.ITaxiPassengerCommonValueCallback; import com.mogo.och.taxi.passenger.callback.ITaxiPassengerVeloctityCallback; import com.mogo.och.taxi.passenger.constant.TaxiPassengerConst; import com.mogo.och.taxi.passenger.constant.TaxiPassengerOrderStatusEnum; -import com.mogo.och.taxi.passenger.network.TaxiPassengerServiceCallback; import com.mogo.och.taxi.passenger.network.TaxiPassengerServiceManager; import com.mogo.aicloud.services.socket.IMogoLifecycleListener; import com.mogo.och.taxi.passenger.utils.TaxiPassengerAnalyticsManager; @@ -67,7 +70,10 @@ import java.util.Collections; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; +import io.reactivex.Observable; +import io.reactivex.disposables.Disposable; import io.reactivex.exceptions.UndeliverableException; import io.reactivex.functions.Consumer; import io.reactivex.plugins.RxJavaPlugins; @@ -108,6 +114,9 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback private ITaxiPassengerVeloctityCallback mVeloctityCallback;//道路限速返回 + private Disposable subscribe; + private int delayTime = 2; + private double mLongitude, mLatitude; private List mLocationsModels = new ArrayList<>(); @@ -209,6 +218,9 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback startOrStopOrderLoop(false); startOrStopQueryOrderRemaining(false); releaseListeners(); + if(subscribe!=null&&!subscribe.isDisposed()){ + subscribe.dispose(); + } } private void initListeners() { @@ -279,8 +291,8 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback * 才更新最新进行中单到本地 */ public void queryInAndWaitOrders() { - TaxiPassengerServiceManager.getInstance().queryOrdersInAndWaitService(mContext, - new TaxiPassengerServiceCallback() { + TaxiPassengerServiceManager.queryOrdersInAndWaitService(mContext, + new OchCommonServiceCallback() { @Override public void onSuccess(TaxiPassengerOrdersInServiceQueryRespBean data) { if (data == null || data.data == null) { @@ -337,8 +349,8 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback return; } final String orderNo = mCurrentOCHOrder.orderNo; - TaxiPassengerServiceManager.getInstance().queryOrderById(mContext, orderNo, - new TaxiPassengerServiceCallback() { + TaxiPassengerServiceManager.queryOrderById(mContext, orderNo, + new OchCommonServiceCallback() { @Override public void onSuccess(TaxiPassengerOrderQueryRespBean data) { if (data != null && data.data != null @@ -488,7 +500,7 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback } mLongitude = location.getLongitude(); mLatitude = location.getLatitude(); - CallerLogger.INSTANCE.e(M_TAXI_P + TAG,"mLongitude = "+mLongitude+", mLatitude = "+mLatitude); +// CallerLogger.INSTANCE.e(M_TAXI_P + TAG,"mLongitude = "+mLongitude+", mLatitude = "+mLatitude); for (IOCHTaxiPassengerControllerStatusCallback callback :mControllerStatusCallbackMap.values()){ callback.onCarLocationChanged(location); } @@ -609,6 +621,29 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback mLocationsModels.clear(); mLocationsModels.addAll(latLngModels); startOrStopRouteAndWipe(true); + showRottingMapView(); + } + + public void showRottingMapView(){ + AmapNaviToDestinationModel.getInstance(mContext).destroyAmaNavi(); + if (mAutopilotPlanningCallback != null){ + mAutopilotPlanningCallback.showRottingMapView(); + } + } + + public void startNaviByAmap() { + if (mCurrentOCHOrder != null && + mCurrentOCHOrder.orderStatus == TaxiPassengerOrderStatusEnum.OnTheWayToEnd.getCode()){ + AmapNaviToDestinationModel.getInstance(mContext).destroyAmaNavi(); + + double orderEndStationLat = mCurrentOCHOrder.endSiteGcjPoint.get(1); + double orderEndStationLng = mCurrentOCHOrder.endSiteGcjPoint.get(0); + NaviLatLng startNaviLatLng = new NaviLatLng(mLatitude, mLongitude); + NaviLatLng endNaviLatLng = new NaviLatLng(orderEndStationLat,orderEndStationLng); + AmapNaviToDestinationModel.getInstance(mContext).initAMapNavi(startNaviLatLng, endNaviLatLng); + AmapNaviToDestinationModel.getInstance(mContext).setVoiceIsMute(false); +// AmapNaviToDestinationModel.getInstance(mContext).setOCHTaciNaviChangedCallback(this); + } } /** @@ -673,7 +708,7 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback public void startOrStopQueryOrderRemaining(boolean isStart){ if (isStart){ - TaxiPassengerModelLoopManager.getInstance().startQueryOrderRemainingtLoop(); + TaxiPassengerModelLoopManager.getInstance().startQueryOrderRemainingLoop(); }else { TaxiPassengerModelLoopManager.getInstance().stopQueryOrderRemainingLoop(); } @@ -684,7 +719,7 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback */ public void queryOrderRemaining(){ if (mCurrentOCHOrder == null) return; - TaxiPassengerServiceManager.getInstance().queryOrderRemaining(mContext, mCurrentOCHOrder.orderNo, new TaxiPassengerServiceCallback() { + TaxiPassengerServiceManager.queryOrderRemaining(mContext, mCurrentOCHOrder.orderNo, new OchCommonServiceCallback() { @Override public void onSuccess(TaxiPassengerOrderQueryRemainingResp data) { if (data != null && data.data!=null){ @@ -705,7 +740,7 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback public void queryOrderRouteList() { if (mCurrentOCHOrder == null) return; CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "--route--- queryOrderRouteList"); - TaxiPassengerServiceManager.getInstance().queryOrderRouteList(mContext, mCurrentOCHOrder.orderNo, new TaxiPassengerServiceCallback() { + TaxiPassengerServiceManager.queryOrderRouteList(mContext, mCurrentOCHOrder.orderNo, new OchCommonServiceCallback() { @Override public void onSuccess(TaxiPassengerQueryOrderRouteResp data) { CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "--route---"+GsonUtil.jsonFromObject(data)); @@ -720,13 +755,17 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback startOrStopRouteAndWipe(true); } }else { - queryOrderRouteList(); + subscribe = Observable.timer(delayTime, TimeUnit.SECONDS).subscribe(aLong -> { + queryOrderRouteList(); + }); } } @Override public void onFail(int code, String msg) { - queryOrderRouteList(); + subscribe = Observable.timer(delayTime, TimeUnit.SECONDS).subscribe(aLong -> { + queryOrderRouteList(); + }); } }); } @@ -752,8 +791,8 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback public void checkPhoneAndUpdateStatus(String phoneTail,ITaxiPassengerCommonCallback commonCallback) { if (mCurrentOCHOrder == null) return; - TaxiPassengerServiceManager.getInstance().checkPhoneAndUpdateOrderStatus(mContext, mCurrentOCHOrder.orderNo, - phoneTail, new TaxiPassengerServiceCallback() { + TaxiPassengerServiceManager.checkPhoneAndUpdateOrderStatus(mContext, mCurrentOCHOrder.orderNo, + phoneTail, new OchCommonServiceCallback() { @Override public void onSuccess(TaxiPassengerBaseRespBean data) { if (data != null && data.code == 0 && mCurrentOCHOrder != null){ @@ -786,8 +825,8 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback public void arrivedAndScore(TaxiPassengerScoreUpdateOrderReqBean taxiPassengerScoreUpdateOrderReqBean , ITaxiPassengerCommonValueCallback commonCallback) { if (taxiPassengerScoreUpdateOrderReqBean.orderNo == null) return; - TaxiPassengerServiceManager.getInstance().arrivedAndScore(mContext,taxiPassengerScoreUpdateOrderReqBean, - new TaxiPassengerServiceCallback() { + TaxiPassengerServiceManager.arrivedAndScore(mContext,taxiPassengerScoreUpdateOrderReqBean, + new OchCommonServiceCallback() { @Override public void onSuccess(TaxiPassengerBaseRespBean data) { if(commonCallback!=null) { @@ -816,13 +855,13 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback public void loopQueryPilotStatus(){ if (mCurrentOCHOrder == null) return; - TaxiPassengerServiceManager.getInstance().queryPilotStatus(mContext, mCurrentOCHOrder.orderNo, - new TaxiPassengerServiceCallback() { + TaxiPassengerServiceManager.queryPilotStatus(mContext, mCurrentOCHOrder.orderNo, + new OchCommonServiceCallback() { @Override public void onSuccess(TaxiPassengerBaseRespBean data) { if (data != null && data.code == 0 && data.data.equals(true)) { updateAutopilotStatus(true); - startOrStopReadyToAutopilotoop(false); + startOrStopReadyToAutopilotLoop(false); } } @@ -843,11 +882,11 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback public void startDriverReadyToAutopilotLoop(){ if (NetworkUtils.isConnected(mContext)) { - startOrStopReadyToAutopilotoop(true); + startOrStopReadyToAutopilotLoop(true); } } - public void startOrStopReadyToAutopilotoop(boolean isStart) { + public void startOrStopReadyToAutopilotLoop(boolean isStart) { if (isStart){ TaxiPassengerModelLoopManager.getInstance().startReadyToAutopilot(); }else { @@ -860,9 +899,9 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback TaxiPassengerStartReqBean.Result result = new TaxiPassengerStartReqBean.Result(); result.lat = mLatitude; result.lon = mLongitude; - TaxiPassengerServiceManager.getInstance().startServicePilotDone(mContext, + TaxiPassengerServiceManager.startServicePilotDone(mContext, mCurrentOCHOrder.orderNo, result, - new TaxiPassengerServiceCallback(){ + new OchCommonServiceCallback(){ @Override public void onSuccess(TaxiPassengerBaseRespBean data) { @@ -887,6 +926,16 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback startServicePilotDone(); } + if (!FunctionBuildConfig.isDemoMode && !OCHAdasAbilityManager.getInstance().getAutopilotAbilityStatus()) { + ToastUtils.showLong(OCHAdasAbilityManager.getInstance().getAutopilotUnAbilityReason() + + ", 请稍候重试"); + + TaxiPassengerAnalyticsManager.getInstance().triggerUnableStartAPReasonEvent( + mCurrentOCHOrder.startSiteAddr, mCurrentOCHOrder.endSiteAddr, mCurrentOCHOrder.orderNo, + OCHAdasAbilityManager.getInstance().getAutopilotUnAbilityReason()); + return; + } + double startWgsLon = mCurrentOCHOrder.startSitePoint.get(0); double startWgsLat = mCurrentOCHOrder.startSitePoint.get(1); double endWgsLon = mCurrentOCHOrder.endSitePoint.get(0); 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 39611e8df7..9b5ed8a440 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 @@ -131,11 +131,11 @@ public class TaxiPassengerModelLoopManager { /** * 轮训查下 查询订单剩余里程和时间 */ - public void startQueryOrderRemainingtLoop() { + public void startQueryOrderRemainingLoop() { if (mQueryOrderRemainingDisposable != null && !mQueryOrderRemainingDisposable.isDisposed()) { return; } - CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "startQueryOrderRemainingtLoop()"); + CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "startQueryOrderRemainingLoop()"); mQueryOrderRemainingDisposable = Observable.interval(TaxiPassengerConst.LOOP_DELAY, TaxiPassengerConst.LOOP_CALCULATEROUTE_2S, TimeUnit.MILLISECONDS) .map((aLong -> aLong + 1)) diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/TaxiPassengerServiceCallback.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/TaxiPassengerServiceCallback.java deleted file mode 100644 index b2d02607c3..0000000000 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/TaxiPassengerServiceCallback.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.mogo.och.taxi.passenger.network; - -/** - * @author congtaowang - * @since 2021/1/15 - * - * 修改订单状态回调接口 - */ -public interface TaxiPassengerServiceCallback< T > { - - void onSuccess(T data); - - void onFail(int code, String msg); - - default void onError() { - - } -} diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/TaxiPassengerServiceManager.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/TaxiPassengerServiceManager.java deleted file mode 100644 index f052794c40..0000000000 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/TaxiPassengerServiceManager.java +++ /dev/null @@ -1,208 +0,0 @@ -package com.mogo.och.taxi.passenger.network; - -import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI_P; - -import android.content.Context; - -import com.mogo.cloud.passport.MoGoAiCloudClientConfig; -import com.mogo.eagle.core.data.BaseData; -import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager; -import com.mogo.eagle.core.network.MoGoRetrofitFactory; -import com.mogo.eagle.core.network.RequestOptions; -import com.mogo.eagle.core.network.SubscribeImpl; -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; -import com.mogo.och.taxi.passenger.bean.TaxiPassengerAllStarWorld; -import com.mogo.och.taxi.passenger.bean.TaxiPassengerBaseRespBean; -import com.mogo.och.taxi.passenger.bean.TaxiPassengerCheckPhoneUpdateOrderReqBean; -import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRemainingResp; -import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryReqBean; -import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRespBean; -import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrdersInServiceQueryRespBean; -import com.mogo.och.taxi.passenger.bean.TaxiPassengerQueryOrderRouteResp; -import com.mogo.och.taxi.passenger.bean.TaxiPassengerScoreUpdateOrderReqBean; -import com.mogo.och.taxi.passenger.bean.TaxiPassengerStartReqBean; -import com.mogo.och.taxi.passenger.constant.TaxiPassengerConst; -import com.mogo.commons.debug.DebugConfig; - -import io.reactivex.android.schedulers.AndroidSchedulers; -import io.reactivex.schedulers.Schedulers; - -/** - * Created by pangfan on 2021/8/19 - */ -public class TaxiPassengerServiceManager { - private static final String TAG = TaxiPassengerServiceManager.class.getSimpleName(); - - private static final class SingletonHolder { - private static final TaxiPassengerServiceManager INSTANCE = new TaxiPassengerServiceManager(); - } - - public static TaxiPassengerServiceManager getInstance() { - return SingletonHolder.INSTANCE; - } - - private TaxiPassengerServiceApi mOCHTaxiServiceApi; - - private TaxiPassengerServiceManager() { - if (mOCHTaxiServiceApi == null){ - mOCHTaxiServiceApi = MoGoRetrofitFactory.getInstance(TaxiPassengerConst.getBaseUrl()).create(TaxiPassengerServiceApi.class); - } - } - - /** - * 获取司机端的sn - * @return - */ - private String getDriverAppSn(){ - return CallerTelematicManager.INSTANCE.getServerToken(); - } - - /** - * 查询全部服务中/待服务订单列表 - * @param context - * @param callback - */ - public void queryOrdersInAndWaitService(Context context, - TaxiPassengerServiceCallback callback) { - mOCHTaxiServiceApi.queryOrdersInAndWaitService(MoGoAiCloudClientConfig.getInstance().getServiceAppId() - ,MoGoAiCloudClientConfig.getInstance().getToken() - ,getDriverAppSn()) //获取到司机端的sn - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(getSubscribeImpl(context, callback, "queryOrdersInAndWaitService")); - } - - /** - * 查询订单剩余里程和时间 - * @param context - * @param orderNo - * @param callback - */ - public void queryOrderRemaining(Context context, String orderNo, TaxiPassengerServiceCallback callback){ - mOCHTaxiServiceApi.queryOrderRemaining(MoGoAiCloudClientConfig.getInstance().getServiceAppId() - ,MoGoAiCloudClientConfig.getInstance().getToken() - ,orderNo) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(getSubscribeImpl(context, callback, "queryOrderRemaining")); - } - - public void queryOrderRouteList(Context context, String orderNo, TaxiPassengerServiceCallback callback){ - - mOCHTaxiServiceApi.queryOrderRoute(MoGoAiCloudClientConfig.getInstance().getServiceAppId() - ,MoGoAiCloudClientConfig.getInstance().getToken() - ,orderNo) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(getSubscribeImpl(context, callback, "queryOrderRouteList")); - } - - /** - * 通过orderId查询订单信息(用于本地已经有orderId时) - * @param context - * @param orderNo - * @param callback - * @deprecated v2.1_0930需求中暂不再使用此接口 - */ - public void queryOrderById(Context context, String orderNo, - TaxiPassengerServiceCallback callback) { - mOCHTaxiServiceApi.queryOrderById(MoGoAiCloudClientConfig.getInstance().getServiceAppId() - ,MoGoAiCloudClientConfig.getInstance().getToken() - ,new TaxiPassengerOrderQueryReqBean(getDriverAppSn(), orderNo)) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(getSubscribeImpl(context, callback, "queryOrderById")); - } - - private SubscribeImpl getSubscribeImpl( - Context context, TaxiPassengerServiceCallback callback, String apiName) { - return new SubscribeImpl(RequestOptions.create(context)) { - @Override - public void onSuccess(T o) { - super.onSuccess(o); - CallerLogger.INSTANCE.e(M_TAXI_P + TAG,apiName + ": onSuccess() " + o.msg); - if (callback != null) { - callback.onSuccess(o); - } - } - - @Override - public void onError(Throwable e) { - super.onError(e); - CallerLogger.INSTANCE.e(M_TAXI_P + TAG,apiName + ": onError() " + e.getMessage()); - if (callback != null) { - callback.onError(); - } - } - - @Override - public void onError(String message, int code) { - super.onError(message, code); - CallerLogger.INSTANCE.e(M_TAXI_P + TAG,String.format(apiName + ": onError() code = %d; message = %s;", code, message)); - if (callback != null) { - callback.onFail(code, message); - } - } - }; - } - - public void checkPhoneAndUpdateOrderStatus(Context context, String orderNo,String phone ,TaxiPassengerServiceCallback callback){ - - mOCHTaxiServiceApi.checkPhoneAndUpdateOrderStatus( - MoGoAiCloudClientConfig.getInstance().getServiceAppId() - ,MoGoAiCloudClientConfig.getInstance().getToken() - ,new TaxiPassengerCheckPhoneUpdateOrderReqBean(orderNo,phone)) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(getSubscribeImpl(context, callback, "checkPhoneAndUpdateOrderStatus")); - } - public void arrivedAndScore(Context context,TaxiPassengerScoreUpdateOrderReqBean taxiPassengerScoreUpdateOrderReqBean, TaxiPassengerServiceCallback callback){ - mOCHTaxiServiceApi.arrivedAndScore( - MoGoAiCloudClientConfig.getInstance().getServiceAppId() - ,MoGoAiCloudClientConfig.getInstance().getToken() - ,taxiPassengerScoreUpdateOrderReqBean) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(getSubscribeImpl(context, callback, "checkPhoneAndUpdateOrderStatus")); - } - - public void getAllScoreWorld(Context context,TaxiPassengerServiceCallback callback){ - mOCHTaxiServiceApi.getWorldAllStar( - MoGoAiCloudClientConfig.getInstance().getServiceAppId() - ,MoGoAiCloudClientConfig.getInstance().getToken()) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(getSubscribeImpl(context, callback, "arrivedAndScore")); - } - - public void queryPilotStatus(Context context, String orderNo - ,TaxiPassengerServiceCallback callback){ - mOCHTaxiServiceApi.queryPilotStatus( - MoGoAiCloudClientConfig.getInstance().getServiceAppId() - ,MoGoAiCloudClientConfig.getInstance().getToken() - ,orderNo) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(getSubscribeImpl(context, callback, "queryPilotStatus")); - } - - public void startServicePilotDone(Context context,String orderNo,TaxiPassengerStartReqBean.Result loc - ,TaxiPassengerServiceCallback callback){ - mOCHTaxiServiceApi.startServicePilotDone(MoGoAiCloudClientConfig.getInstance().getServiceAppId() - ,MoGoAiCloudClientConfig.getInstance().getToken() - ,new TaxiPassengerStartReqBean(getDriverAppSn() - ,orderNo,loc)) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(getSubscribeImpl(context,callback,"startServicePilotDone")); - } - public void getWorldByStar(Context context,String start,TaxiPassengerServiceCallback callback){ - mOCHTaxiServiceApi.getWorldByStar( - MoGoAiCloudClientConfig.getInstance().getServiceAppId() - ,MoGoAiCloudClientConfig.getInstance().getToken(),start) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(getSubscribeImpl(context, callback, "checkPhoneAndUpdateOrderStatus")); - } - -} diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/TaxiPassengerServiceManager.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/TaxiPassengerServiceManager.kt new file mode 100644 index 0000000000..37e0bc2b39 --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/TaxiPassengerServiceManager.kt @@ -0,0 +1,199 @@ +package com.mogo.och.taxi.passenger.network + +import android.content.Context +import com.mogo.och.taxi.passenger.constant.TaxiPassengerConst.Companion.getBaseUrl +import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager.getServerToken +import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrdersInServiceQueryRespBean +import com.mogo.cloud.passport.MoGoAiCloudClientConfig +import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRemainingResp +import com.mogo.och.taxi.passenger.bean.TaxiPassengerQueryOrderRouteResp +import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRespBean +import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryReqBean +import com.mogo.och.taxi.passenger.bean.TaxiPassengerBaseRespBean +import com.mogo.och.taxi.passenger.bean.TaxiPassengerCheckPhoneUpdateOrderReqBean +import com.mogo.och.taxi.passenger.bean.TaxiPassengerScoreUpdateOrderReqBean +import com.mogo.och.taxi.passenger.bean.TaxiPassengerAllStarWorld +import com.mogo.och.taxi.passenger.bean.TaxiPassengerStartReqBean +import com.mogo.eagle.core.network.MoGoRetrofitFactory +import com.mogo.och.common.module.biz.network.OchCommonServiceCallback +import com.mogo.och.common.module.biz.network.OchCommonSubscribeImpl +import com.mogo.och.common.module.biz.network.interceptor.transformTry + +/** + * Created by pangfan on 2021/8/19 + */ +object TaxiPassengerServiceManager { + + private val mOCHTaxiServiceApi: TaxiPassengerServiceApi = MoGoRetrofitFactory.getInstance(getBaseUrl()).create( + TaxiPassengerServiceApi::class.java + ) + + /** + * 获取司机端的sn + * @return + */ + private val driverAppSn: String + get() = getServerToken() + + /** + * 查询全部服务中/待服务订单列表 + * @param context + * @param callback + */ + @JvmStatic + fun queryOrdersInAndWaitService( + context: Context, + callback: OchCommonServiceCallback? + ) { + mOCHTaxiServiceApi.queryOrdersInAndWaitService( + MoGoAiCloudClientConfig.getInstance().serviceAppId, + MoGoAiCloudClientConfig.getInstance().token, + driverAppSn + ) //获取到司机端的sn + .transformTry() + .subscribe(OchCommonSubscribeImpl(context, callback, "queryOrdersInAndWaitService")) + } + + /** + * 查询订单剩余里程和时间 + * @param context + * @param orderNo + * @param callback + */ + @JvmStatic + fun queryOrderRemaining( + context: Context, + orderNo: String?, + callback: OchCommonServiceCallback? + ) { + mOCHTaxiServiceApi.queryOrderRemaining( + MoGoAiCloudClientConfig.getInstance().serviceAppId, + MoGoAiCloudClientConfig.getInstance().token, + orderNo + ) + .transformTry() + .subscribe(OchCommonSubscribeImpl(context, callback, "queryOrderRemaining")) + } + @JvmStatic + fun queryOrderRouteList( + context: Context, + orderNo: String?, + callback: OchCommonServiceCallback? + ) { + mOCHTaxiServiceApi.queryOrderRoute( + MoGoAiCloudClientConfig.getInstance().serviceAppId, + MoGoAiCloudClientConfig.getInstance().token, + orderNo + ) + .transformTry() + .subscribe(OchCommonSubscribeImpl(context, callback, "queryOrderRouteList")) + } + + /** + * 通过orderId查询订单信息(用于本地已经有orderId时) + * @param context + * @param orderNo + * @param callback + */ + @JvmStatic + @Deprecated("v2.1_0930需求中暂不再使用此接口") + fun queryOrderById( + context: Context, orderNo: String?, + callback: OchCommonServiceCallback? + ) { + mOCHTaxiServiceApi.queryOrderById( + MoGoAiCloudClientConfig.getInstance().serviceAppId, + MoGoAiCloudClientConfig.getInstance().token, + TaxiPassengerOrderQueryReqBean(driverAppSn, orderNo) + ) + .transformTry() + .subscribe(OchCommonSubscribeImpl(context, callback, "queryOrderById")) + } + @JvmStatic + fun checkPhoneAndUpdateOrderStatus( + context: Context, + orderNo: String?, + phone: String?, + callback: OchCommonServiceCallback? + ) { + mOCHTaxiServiceApi.checkPhoneAndUpdateOrderStatus( + MoGoAiCloudClientConfig.getInstance().serviceAppId, + MoGoAiCloudClientConfig.getInstance().token, + TaxiPassengerCheckPhoneUpdateOrderReqBean(orderNo, phone) + ) + .transformTry() + .subscribe(OchCommonSubscribeImpl(context, callback, "checkPhoneAndUpdateOrderStatus")) + } + @JvmStatic + fun arrivedAndScore( + context: Context, + taxiPassengerScoreUpdateOrderReqBean: TaxiPassengerScoreUpdateOrderReqBean?, + callback: OchCommonServiceCallback? + ) { + mOCHTaxiServiceApi.arrivedAndScore( + MoGoAiCloudClientConfig.getInstance().serviceAppId, + MoGoAiCloudClientConfig.getInstance().token, + taxiPassengerScoreUpdateOrderReqBean + ) + .transformTry() + .subscribe(OchCommonSubscribeImpl(context, callback, "checkPhoneAndUpdateOrderStatus")) + } + @JvmStatic + fun getAllScoreWorld( + context: Context, + callback: OchCommonServiceCallback? + ) { + mOCHTaxiServiceApi.getWorldAllStar( + MoGoAiCloudClientConfig.getInstance().serviceAppId, + MoGoAiCloudClientConfig.getInstance().token + ) + .transformTry() + .subscribe(OchCommonSubscribeImpl(context, callback, "arrivedAndScore")) + } + @JvmStatic + fun queryPilotStatus( + context: Context, + orderNo: String?, + callback: OchCommonServiceCallback? + ) { + mOCHTaxiServiceApi.queryPilotStatus( + MoGoAiCloudClientConfig.getInstance().serviceAppId, + MoGoAiCloudClientConfig.getInstance().token, + orderNo + ) + .transformTry() + .subscribe(OchCommonSubscribeImpl(context, callback, "queryPilotStatus")) + } + @JvmStatic + fun startServicePilotDone( + context: Context, + orderNo: String?, + loc: TaxiPassengerStartReqBean.Result?, + callback: OchCommonServiceCallback? + ) { + mOCHTaxiServiceApi.startServicePilotDone( + MoGoAiCloudClientConfig.getInstance().serviceAppId, + MoGoAiCloudClientConfig.getInstance().token, + TaxiPassengerStartReqBean( + driverAppSn, orderNo, loc + ) + ) + .transformTry() + .subscribe(OchCommonSubscribeImpl(context, callback, "startServicePilotDone")) + } + @JvmStatic + fun getWorldByStar( + context: Context, + start: String?, + callback: OchCommonServiceCallback? + ) { + mOCHTaxiServiceApi.getWorldByStar( + MoGoAiCloudClientConfig.getInstance().serviceAppId, + MoGoAiCloudClientConfig.getInstance().token, + start + ) + .transformTry() + .subscribe(OchCommonSubscribeImpl(context, callback, "checkPhoneAndUpdateOrderStatus")) + } + +} \ 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 056b46c0ff..65cdd31aa6 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 @@ -166,7 +166,7 @@ public class BaseTaxiPassengerPresenter extends PresentermView.routeResultByServer(models,haveArrivedIndex)); } + @Override + public void showRottingMapView() { + runOnUIThread(() ->mView.showRottingMapView()); + } + @Override public void onCurrentOrderStatusChanged(TaxiPassengerOrderQueryRespBean.Result order) { @@ -132,10 +136,19 @@ public class TaxiPassengerServingOrderPresenter extends Presenter mView.onCarLocationChanged(location)); + long currentTimeMillis = System.currentTimeMillis(); + if(currentTimeMillis-startTime { - OverlayLeftViewUtils.INSTANCE.showOverlayView(getActivity(),0,true,-1,true); - //showOrHideArrivedEndLayout(true, "北京北京北京", "1527481606997577728"); - //showOrHidePressengerCheckPager(true, "开始站点开", "开始站点开始站点开始", "2", "京A888888", "18811539480"); - //OCHFloatWindowManager.getInstance().ShowFloatWindow(getContext()); - }); } private void initArrivedView(){ diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerCheckView.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerCheckView.kt index da793abc1e..68fe7170da 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerCheckView.kt +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerCheckView.kt @@ -103,7 +103,7 @@ class TaxiPassengerCheckView :RelativeLayout, View.OnClickListener { R.id.tv_taxi_passenger_number_second -> {selectIndex(1)} R.id.tv_taxi_passenger_number_third -> {selectIndex(2)} R.id.tv_taxi_passenger_number_fourth -> {selectIndex(3)} - R.id.tv_taxi_passenger_number_submit -> {checkAndCommit()} + R.id.tv_taxi_passenger_number_submit -> {clearNumber()} else -> {} } } @@ -130,9 +130,27 @@ class TaxiPassengerCheckView :RelativeLayout, View.OnClickListener { index++ } changeStyle() + numSelect.forEach { + if(it==null){ + return + } + } + + checkAndCommit() } } + private fun clearNumber(){ + for(i in numSelect.indices){ + numSelect[i] = null + } + numSelectTextView.forEach { + it?.text = "" + } + index = 0 + changeStyle() + } + private fun deleteNumver() { if (index in 0..3) { if(numSelect[index]==null){ diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerMapDirectionView.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerMapDirectionView.java index 92c0bef6f0..89967334e7 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerMapDirectionView.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerMapDirectionView.java @@ -104,14 +104,14 @@ public class TaxiPassengerMapDirectionView initAMapView(); // 注册定位监听 - CallerMapLocationListenerManager.INSTANCE.addListener(TAG, this); + CallerMapLocationListenerManager.INSTANCE.addListener(TAG, this, false); } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); // 注册定位监听 - CallerMapLocationListenerManager.INSTANCE.removeListener(TAG); + CallerMapLocationListenerManager.INSTANCE.removeListener(TAG, false); } private void initAMapView() { @@ -180,7 +180,7 @@ public class TaxiPassengerMapDirectionView @Override - public void onLocationChanged(@org.jetbrains.annotations.Nullable MogoLocation location, int from) { + public void onLocationChanged(@org.jetbrains.annotations.Nullable MogoLocation location, int from, boolean isGps) { if (location == null){ return; } 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 e15ffbf4b0..aac6f552c0 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 @@ -25,6 +25,8 @@ import com.mogo.commons.mvp.MvpFragment; 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.UiThreadHandler; +import com.mogo.och.common.module.map.AmapNaviToDestinationModel; +import com.mogo.och.common.module.map.CommonAmapNaviVIew; import com.mogo.och.common.module.utils.DateTimeUtil; import com.mogo.och.common.module.utils.NumberFormatUtil; import com.mogo.och.common.module.wigets.OCHGradientTextView; @@ -63,7 +65,9 @@ public class TaxiPassengerServingOrderFragment extends private TextView mTPOrderRemainArriveTime; private ImageView mMapArrowIcon; - private TaxiPassengerMapDirectionView mMapDirectionView; + private TaxiPassengerMapDirectionView mMapRottingView; + private CommonAmapNaviVIew mAmapNaviVIew; + private float lastBearing = 0; private RotateAnimation rotateAnimation; @@ -130,9 +134,20 @@ public class TaxiPassengerServingOrderFragment extends @Override protected void initViews(Bundle savedInstanceState) { super.initViews(savedInstanceState); - mMapDirectionView = mRootView.findViewById(R.id.taxi_p_order_map_view); - mMapDirectionView.onCreateView(savedInstanceState); - mMapDirectionView.setTaxiPassengerMapViewCallback(this); + initRouteNaviView(savedInstanceState); + initAmapNaviView(savedInstanceState); + } + + private void initAmapNaviView(Bundle savedInstanceState) { + mAmapNaviVIew = mRootView.findViewById(R.id.taxi_p_order_amap_navi_view); + mAmapNaviVIew.onCreate(savedInstanceState); + TaxiPassengerModel.getInstance().startNaviByAmap(); + } + + private void initRouteNaviView(Bundle savedInstanceState) { + mMapRottingView = mRootView.findViewById(R.id.taxi_p_order_rotting_map_view); + mMapRottingView.onCreateView(savedInstanceState); + mMapRottingView.setTaxiPassengerMapViewCallback(this); } @NonNull @@ -174,8 +189,11 @@ public class TaxiPassengerServingOrderFragment extends @Override public void onResume() { super.onResume(); - if (mMapDirectionView != null) { - mMapDirectionView.onResume(); + if (mMapRottingView != null) { + mMapRottingView.onResume(); + } + if (mAmapNaviVIew != null){ + mAmapNaviVIew.onResume(); } TaxiPassengerModel.getInstance().initGeocodeSearch(); } @@ -196,29 +214,44 @@ public class TaxiPassengerServingOrderFragment extends @Override public void onPause() { super.onPause(); - if (mMapDirectionView != null) { - mMapDirectionView.onPause(); + if (mMapRottingView != null) { + mMapRottingView.onPause(); + } + if (mAmapNaviVIew != null){ + mAmapNaviVIew.onPause(); } - } @Override public void onDestroy() { super.onDestroy(); - if (mMapDirectionView != null) { - mMapDirectionView.onDestroy(); + if (mMapRottingView != null) { + mMapRottingView.onDestroy(); } + if (mAmapNaviVIew != null){ + mAmapNaviVIew.onDestroy(); + } + AmapNaviToDestinationModel.getInstance(getContext()).destroyAmaNavi(); TaxiPassengerModel.getInstance().destoryGeocodeSearch(); } + public void showRottingMapView(){ + if (mAmapNaviVIew != null && mAmapNaviVIew.getVisibility() == View.VISIBLE){ + mAmapNaviVIew.setVisibility(View.GONE); + } + if (mMapRottingView != null && mMapRottingView.getVisibility() == View.GONE){ + mMapRottingView.setVisibility(View.VISIBLE); + } + } + public void setLineMarker(List latLngList){ if (latLngList.size() > 0) { - if (mMapDirectionView != null) { - mMapDirectionView.setCoordinatesLatLng(latLngList); + if (mMapRottingView != null) { + mMapRottingView.setCoordinatesLatLng(latLngList); UiThreadHandler.post(new Runnable() { @Override public void run() { - mMapDirectionView.setLineMarker(); + mMapRottingView.setLineMarker(); } }); } @@ -236,22 +269,22 @@ public class TaxiPassengerServingOrderFragment extends } public void drawablePolylineByServerRoute(List mCoordinatesLatLng,int haveArrivedIndex){ - if (mMapDirectionView != null){ - mMapDirectionView.setCoordinatesLatLng(mCoordinatesLatLng,haveArrivedIndex); + if (mMapRottingView != null){ + mMapRottingView.setCoordinatesLatLng(mCoordinatesLatLng,haveArrivedIndex); UiThreadHandler.post(new Runnable() { @Override public void run() { - mMapDirectionView.drawablePolyline(); + mMapRottingView.drawablePolyline(); } }); } } private void clearPolyline() { - if (mMapDirectionView != null) { + if (mMapRottingView != null) { UiThreadHandler.post(new Runnable() { @Override public void run() { - mMapDirectionView.clearPolyline(); + mMapRottingView.clearPolyline(); } }); } diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerStartAutopilotView.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerStartAutopilotView.java index 5d8aba7836..29c26ae3c7 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerStartAutopilotView.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerStartAutopilotView.java @@ -11,6 +11,7 @@ import android.widget.RelativeLayout; import android.widget.TextView; import com.elegant.utils.UiThreadHandler; +import com.mogo.commons.AbsMogoApplication; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.util.OverlayViewUtils; import com.mogo.eagle.core.utilcode.util.ToastUtils; @@ -101,9 +102,9 @@ public class TaxiPassengerStartAutopilotView extends RelativeLayout implements V mAutopilotBtnBg = view.findViewById(R.id.taxi_p_autopilot_btn_bg); mCarIv = view.findViewById(R.id.taxi_p_autopilot_starting); - initBtnAnimatonDrawable(); - - initCarStartingFrame(); +// initBtnAnimatonDrawable(); +// +// initCarStartingFrame(); } private void initCarStartingFrame() { @@ -159,6 +160,7 @@ public class TaxiPassengerStartAutopilotView extends RelativeLayout implements V } public void updateStartAutopilotBtnStatus(boolean isClickable){ + if (mContext == null) return; if (isClickable){ mStartAutopilotBtn.setTextColor( mContext.getResources().getColor(R.color.taxi_p_start_autopilot_txt_color)); @@ -259,6 +261,7 @@ public class TaxiPassengerStartAutopilotView extends RelativeLayout implements V } private void updateStatusCountDownOver() { + if (mContext == null) return; isStarting = false; startingCarBgAnimatorDrawable(false); mStartAutopilotBtn.setText( @@ -273,4 +276,14 @@ public class TaxiPassengerStartAutopilotView extends RelativeLayout implements V mContext = null; super.onDetachedFromWindow(); } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + try { + mContext = AbsMogoApplication.getApp(); + }catch (Exception e){ + e.printStackTrace(); + } + } } 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 b3335b40ee..548280ca96 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 @@ -25,13 +25,13 @@ import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.eagle.core.utilcode.util.OverlayViewUtils import com.mogo.eagle.core.utilcode.util.ToastUtils import com.mogo.eagle.core.widget.media.video.SimpleVideoPlayer +import com.mogo.och.common.module.biz.network.OchCommonServiceCallback import com.mogo.och.common.module.wigets.OCHBorderShadowLayout import com.mogo.och.taxi.passenger.R import com.mogo.och.taxi.passenger.bean.TaxiPassengerAllStarWorld import com.mogo.och.taxi.passenger.bean.TaxiPassengerScoreUpdateOrderReqBean import com.mogo.och.taxi.passenger.callback.ITaxiPassengerCommonCallback import com.mogo.och.taxi.passenger.callback.ITaxiPassengerScoreCallback -import com.mogo.och.taxi.passenger.network.TaxiPassengerServiceCallback import com.mogo.och.taxi.passenger.network.TaxiPassengerServiceManager import com.mogo.och.taxi.passenger.ui.comment.adapter.CommentAdapter import com.mogo.och.taxi.passenger.widget.ResizeAnimation @@ -177,7 +177,7 @@ class TaxiPassengerArrivedView :RelativeLayout, View.OnClickListener { tvFeel.text = "" rvCommentList.visibility = View.INVISIBLE btnSubmit.visibility = View.INVISIBLE - clCommentContain.getLayoutParams().height = 657 + clCommentContain.getLayoutParams().height = 748 clCommentContain.requestLayout() super.onDetachedFromWindow() subscribe?.let { @@ -305,18 +305,24 @@ class TaxiPassengerArrivedView :RelativeLayout, View.OnClickListener { private fun startChangeHeightAnimarion() { // 815 除了 点评的高度 - val resizeAnimation = ResizeAnimation(clCommentContain,832+rvCommentList.height, clCommentContain.height) + val resizeAnimation = ResizeAnimation(clCommentContain,913+rvCommentList.height, clCommentContain.height) resizeAnimation.duration = 300 resizeAnimation.setAnimationListener(object :Animation.AnimationListener{ override fun onAnimationStart(animation: Animation?) { rvCommentList.visibility = View.VISIBLE - btnSubmit.visibility = View.VISIBLE } override fun onAnimationEnd(animation: Animation?) { allStartOrdered.forEach { it.isEnabled = true } + if(btnSubmit.visibility==View.GONE||btnSubmit.visibility==View.INVISIBLE) { + btnSubmit.visibility = View.VISIBLE + val showAnimator = ObjectAnimator.ofFloat(btnSubmit, "alpha", 0.1f, 1f) + showAnimator.duration = 600 + showAnimator.start() + } + } override fun onAnimationRepeat(animation: Animation?) { @@ -406,8 +412,8 @@ class TaxiPassengerArrivedView :RelativeLayout, View.OnClickListener { } private fun requestStarWord() { - TaxiPassengerServiceManager.getInstance().getAllScoreWorld(context, - object : TaxiPassengerServiceCallback { + TaxiPassengerServiceManager.getAllScoreWorld(context, + object : OchCommonServiceCallback { override fun onError() { CallerLogger.e( SceneConstant.M_TAXI_P + TAG, @@ -430,8 +436,8 @@ class TaxiPassengerArrivedView :RelativeLayout, View.OnClickListener { } private fun requestStarWordByStar(start:Int) { - TaxiPassengerServiceManager.getInstance().getWorldByStar(context,start.toString(), - object : TaxiPassengerServiceCallback { + TaxiPassengerServiceManager.getWorldByStar(context,start.toString(), + object : OchCommonServiceCallback { override fun onError() { CallerLogger.e( SceneConstant.M_TAXI_P + TAG, diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/comment/adapter/CommentAdapter.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/comment/adapter/CommentAdapter.kt index ccd4886280..71334c1f80 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/comment/adapter/CommentAdapter.kt +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/comment/adapter/CommentAdapter.kt @@ -19,6 +19,19 @@ class CommentAdapter(private val context: Context?,private val itemDataList: Mut fun addAll(itemDataList: MutableList){ this.itemDataList.clear() this.itemDataList.addAll(itemDataList) + // region 临时代码 + var needMove:TaxiPassengerStarWorld?=null + itemDataList.forEachIndexed { index, taxiPassengerStarWorld -> + if(taxiPassengerStarWorld.labelInfo=="频繁急停急刹"){ + needMove = taxiPassengerStarWorld + return@forEachIndexed + } + } + needMove?.let { + this.itemDataList.remove(it) + this.itemDataList.add(this.itemDataList.size-1,it) + } + // endregion this.notifyDataSetChanged() } fun getSelectComment(): List { 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 index bc5bf31413..25e67ec138 100644 --- 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 @@ -3,6 +3,7 @@ package com.mogo.och.taxi.passenger.ui.leftmenu import android.annotation.SuppressLint import android.content.ContentResolver import android.database.Cursor +import android.os.DeadObjectException import android.os.IBinder import android.os.RemoteCallbackList import android.os.RemoteException @@ -27,6 +28,7 @@ import com.mogo.och.taxi.passenger.ui.video.VideoActivity import org.greenrobot.eventbus.EventBus import rx.Observable import rx.Observer +import rx.exceptions.OnCompletedFailedException import rx.schedulers.Schedulers import java.util.* @@ -43,8 +45,6 @@ object LeftMenuOpen { private var open: ((view: View, windowManager: WindowManager?) -> Unit)? = null - private var cu: Cursor? = null - // 两部分主进程和子进程 private var dragList = mutableSetOf() @@ -85,11 +85,8 @@ object LeftMenuOpen { this.windowManager = null this.wl = null - cu?.let { - it.close() - cu = null - orderService = null - } + orderService = null + val iterator = dragList.iterator() while (iterator.hasNext()) { val next = iterator.next() @@ -208,11 +205,19 @@ object LeftMenuOpen { Observable.empty().subscribeOn(Schedulers.io()) .subscribe(object : Observer { override fun onCompleted() { - CallerLogger.d(M_TAXI_P + TAG, "tran--transmissionIndex---$index") - if (orderService == null) { - registerC() + try { + CallerLogger.d(M_TAXI_P + TAG, "tran--transmissionIndex---$index") + if (orderService == null) { + registerC() + } + orderService?.transmissionIndex(index) + }catch (ill:IllegalStateException){ + ill.printStackTrace() + }catch (onCo: OnCompletedFailedException){ + onCo.printStackTrace() + }catch (deadobjectexception: DeadObjectException){ + deadobjectexception.printStackTrace() } - orderService?.transmissionIndex(index) } override fun onError(e: Throwable?) {} override fun onNext(t: String?) {} @@ -250,13 +255,22 @@ object LeftMenuOpen { Observable.empty().subscribeOn(Schedulers.io()) .subscribe(object : Observer { override fun onCompleted() { - CallerLogger.d(M_TAXI_P + TAG, "tran--registerCallback--注册") - if (orderService == null) { - registerC() - } - cb?.let { - orderService?.registerCallback(it) - } + try { + CallerLogger.d(M_TAXI_P + TAG, "tran--registerCallback--注册") + if (orderService == null) { + registerC() + } + cb?.let { + orderService?.registerCallback(it) + } + }catch (ill:IllegalStateException){ + ill.printStackTrace() + }catch (onCo: OnCompletedFailedException){ + onCo.printStackTrace() + }catch (deadobjectexception: DeadObjectException){ + deadobjectexception.printStackTrace() + } + } override fun onError(e: Throwable?) {} override fun onNext(t: String?) {} @@ -272,7 +286,15 @@ object LeftMenuOpen { override fun onCompleted() { CallerLogger.d(M_TAXI_P + TAG, "tran--unregisterCallback--反注册") cb?.let { - orderService?.unRegisterCallback(it) + try { + orderService?.unRegisterCallback(it) + }catch (ill:IllegalStateException){ + ill.printStackTrace() + }catch (onCo: OnCompletedFailedException){ + onCo.printStackTrace() + }catch (deadobjectexception: DeadObjectException){ + deadobjectexception.printStackTrace() + } } } override fun onError(e: Throwable?) {} @@ -350,7 +372,7 @@ object LeftMenuOpen { CallerLogger.d(M_TAXI_P + TAG, "tran--registerC--获取jni") val resolver: ContentResolver = Utils.getApp().contentResolver - cu = resolver.query( + val cu = resolver.query( BinderProvider.CONTENT_URI, null, null, @@ -358,13 +380,22 @@ object LeftMenuOpen { null ) ?: return - val binder: IBinder = getBinder(cu!!) + val binder: IBinder = getBinder(cu) try { - orderService = ILeftMenuService.Stub.asInterface(binder) + try { + orderService = ILeftMenuService.Stub.asInterface(binder) + }catch (ill:IllegalStateException){ + ill.printStackTrace() + }catch (onCo: OnCompletedFailedException){ + onCo.printStackTrace() + }catch (deadobjectexception: DeadObjectException){ + deadobjectexception.printStackTrace() + } + } catch (e: RemoteException) { e.printStackTrace() - cu?.close() - cu = null + } finally { + cu.close() } } 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 index d743fd517a..6945095a4c 100644 --- 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 @@ -13,13 +13,10 @@ import androidx.constraintlayout.widget.ConstraintLayout import androidx.recyclerview.widget.RecyclerView import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant -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.event.FinishActivity -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.ui.video.layoutmanage.CarouselLayoutManager @@ -40,7 +37,6 @@ import rx.Observer import rx.Subscription import rx.android.schedulers.AndroidSchedulers import rx.schedulers.Schedulers -import java.util.Calendar import java.util.concurrent.TimeUnit import kotlin.collections.ArrayList import kotlin.math.floor @@ -48,18 +44,18 @@ import kotlin.math.floor class VideoActivity : AppCompatActivity() { - private var rvVideoPlaylist: RecyclerView?=null + 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 var subscribe: Subscription?=null + private var subscribe: Subscription? = null private val TAG = "mulprocessVideoActivity" private val arrayListOf = ArrayList() - companion object{ + companion object { const val VIDEOTYPE = "VIDEOTYPE" const val VIDEOTYPE_CONSULT = 0 const val VIDEOTYPE_MOIES = 1 @@ -67,10 +63,10 @@ class VideoActivity : AppCompatActivity() { const val EVENT_FINISH = 0 - fun startActivity(context:Context,videoType:Int,sumDis:Int){ + 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) + intent.putExtra(TaxiPassengerConst.SP_KEY_ORDER_SUM_DIS, sumDis) context.startActivity(intent) } } @@ -113,7 +109,7 @@ class VideoActivity : AppCompatActivity() { LeftMenuOpen.registerCallback(LeftMenuOpen.callBack) } - private fun initConsultData(){ + private fun initConsultData() { arrayListOf.clear() arrayListOf.add( TaxiPassengerVideoPlay( @@ -237,7 +233,7 @@ class VideoActivity : AppCompatActivity() { } indicatorView.onPageScrolled(currentIndex, fl, 0) } - val recyclerVideoAdapter = RecyclerVideoAdapter(this, arrayListOf,rvVideoPlaylist) + val recyclerVideoAdapter = RecyclerVideoAdapter(this, arrayListOf, rvVideoPlaylist) recyclerVideoAdapter.setOnThumbImageClilckListener { val (_: Int, player) = getPlayer(carouselLayoutManager) if (player is ConsultVideoPlayer) { @@ -279,23 +275,31 @@ class VideoActivity : AppCompatActivity() { override fun onAttachedToWindow() { super.onAttachedToWindow() - when (videotype){ + when (videotype) { VIDEOTYPE_CONSULT -> { - OverlayLeftViewUtils.showOverlayView(this,isOpen = false, checkIndex = OverlayLeftViewUtils.CONSULT) + OverlayLeftViewUtils.showOverlayView( + this, + isOpen = false, + checkIndex = OverlayLeftViewUtils.CONSULT + ) } VIDEOTYPE_MOIES -> { - OverlayLeftViewUtils.showOverlayView(this,isOpen = false, checkIndex = OverlayLeftViewUtils.MOVIE) + OverlayLeftViewUtils.showOverlayView( + this, + isOpen = false, + checkIndex = OverlayLeftViewUtils.MOVIE + ) } } val sumDis = intent.getIntExtra(TaxiPassengerConst.SP_KEY_ORDER_SUM_DIS, 0) - FloatingDistanceInfoUtils.showOverlayView(this,sumDis=sumDis) + 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){ + if (centerItemPosition < 0) { setBackageAndPlayNext(arrayListOf[0]) } player?.let { @@ -323,12 +327,20 @@ class VideoActivity : AppCompatActivity() { override fun onError(e: Throwable?) {} override fun onNext(t: Long?) { if (!OverlayLeftViewUtils.getStatus()) { - when (videotype){ + when (videotype) { VIDEOTYPE_CONSULT -> { - OverlayLeftViewUtils.showOverlayView(this@VideoActivity,isOpen = false, checkIndex = OverlayLeftViewUtils.CONSULT) + OverlayLeftViewUtils.showOverlayView( + this@VideoActivity, + isOpen = false, + checkIndex = OverlayLeftViewUtils.CONSULT + ) } VIDEOTYPE_MOIES -> { - OverlayLeftViewUtils.showOverlayView(this@VideoActivity,isOpen = false, checkIndex = OverlayLeftViewUtils.MOVIE) + OverlayLeftViewUtils.showOverlayView( + this@VideoActivity, + isOpen = false, + checkIndex = OverlayLeftViewUtils.MOVIE + ) } } } @@ -354,7 +366,7 @@ class VideoActivity : AppCompatActivity() { } @Subscribe(threadMode = ThreadMode.MAIN) - fun finishActivity(event: FinishActivity){ + fun finishActivity(event: FinishActivity) { CallerLogger.d(SceneConstant.M_TAXI_P + TAG, "finishActivity(event)") cancleSubscribe() val intent = Intent() @@ -377,21 +389,21 @@ class VideoActivity : AppCompatActivity() { cancleSubscribe() } - private fun cancleSubscribe(){ + private fun cancleSubscribe() { subscribe?.let { - if(!it.isUnsubscribed){ + if (!it.isUnsubscribed) { it.unsubscribe() } } } private fun releaseOnNewInstance() { - if (rvVideoPlaylist!=null&&rvVideoPlaylist?.layoutManager != null) { + if (rvVideoPlaylist != null && rvVideoPlaylist?.layoutManager != null) { val carouselLayoutManager = rvVideoPlaylist?.layoutManager as CarouselLayoutManager val (_: Int, player) = getPlayer(carouselLayoutManager) player?.let { - player.currentPlayer.release() - player.onVideoReset() + player.currentPlayer.release() + player.onVideoReset() } } FullVideoUtils.dismissOverlayView(true) diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/TaxiPassengerAnalyticsManager.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/TaxiPassengerAnalyticsManager.java index 8d2aedf521..18ba2e1e39 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/TaxiPassengerAnalyticsManager.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/TaxiPassengerAnalyticsManager.java @@ -35,6 +35,8 @@ public class TaxiPassengerAnalyticsManager { private Runnable startAutopilotRunnable = () -> { // 15s内未开启,上报失败埋点 mStartAutopilotParams.put(TaxiPassengerConst.EVENT_PARAM_START_RESULT, false); + mStartAutopilotParams.put(TaxiPassengerConst.EVENT_PARAM_START_FAILURE_MSG, + "15s后app等待超时"); AnalyticsManager.INSTANCE.track(mStartAutopilotKey, mStartAutopilotParams); }; @@ -74,4 +76,31 @@ public class TaxiPassengerAnalyticsManager { UiThreadHandler.postDelayed(startAutopilotRunnable, TaxiPassengerConst.LOOP_PERIOD_15S); } } + + /** + * 触发"无法开启自驾已知异常"埋点 + * @param startName + * @param endName + * @param orderNo + */ + public void triggerUnableStartAPReasonEvent(String startName, String endName, String orderNo, + String reason) { + String sn = MoGoAiCloudClientConfig.getInstance().getSn(); + String plateNum = AppConfigInfo.INSTANCE.getPlateNumber(); + String dateTime = DateTimeUtils.getTimeText( + System.currentTimeMillis(), DateTimeUtils.yyyy_MM_dd_HH_mm_ss); + + HashMap params = new HashMap<>(); + + params.put(TaxiPassengerConst.EVENT_PARAM_SN, sn); + params.put(TaxiPassengerConst.EVENT_PARAM_PLATE_NUM, TextUtils.isEmpty(plateNum) ? "" : plateNum); + params.put(TaxiPassengerConst.EVENT_PARAM_ENV_ONLINE, + DebugConfig.getNetMode() == DebugConfig.NET_MODE_RELEASE ? true : false); + params.put(TaxiPassengerConst.EVENT_PARAM_TIME, dateTime); + params.put(TaxiPassengerConst.EVENT_PARAM_START_NAME, startName); + params.put(TaxiPassengerConst.EVENT_PARAM_END_NAME, endName); + params.put(TaxiPassengerConst.EVENT_PARAM_ORDER_NUMBER, orderNo); + params.put(TaxiPassengerConst.EVENT_PARAM_UNABLE_START_REASON, reason); + AnalyticsManager.INSTANCE.track(TaxiPassengerConst.EVENT_KEY_AP_UNABLE_START_REASON, params); + } } 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 1efa8c1b03..56452fe256 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_mogo_movies_title_icon.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_mogo_movies_title_icon.png old mode 100755 new mode 100644 index 0768e35563..72dc087fd4 Binary files a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_mogo_movies_title_icon.png and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_mogo_movies_title_icon.png differ 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 1efa8c1b03..56452fe256 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_mogo_movies_title_icon.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_mogo_movies_title_icon.png old mode 100755 new mode 100644 index 0768e35563..72dc087fd4 Binary files a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_mogo_movies_title_icon.png and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_mogo_movies_title_icon.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_activity_serving_order_view.xml b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_activity_serving_order_view.xml index f59ae55046..404258867f 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_activity_serving_order_view.xml +++ b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_activity_serving_order_view.xml @@ -257,15 +257,30 @@ - - + app:layout_constraintLeft_toLeftOf="parent" > + + + + @@ -56,14 +56,7 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> - + + + + + @@ -228,7 +246,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="@dimen/dp_109" - android:layout_marginBottom="@dimen/dp_110" + android:layout_marginBottom="@dimen/dp_30" app:bgColor="@color/taxi_p_map_bg" app:blurRadius="@dimen/dp_60" app:layout_constraintBottom_toBottomOf="parent" diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_passenger_check_panel.xml b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_passenger_check_panel.xml index e7dc22f64a..3887d99934 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_passenger_check_panel.xml +++ b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_passenger_check_panel.xml @@ -189,7 +189,7 @@ android:layout_marginTop="@dimen/dp_14" tools:text="蘑菇 3291号为您服务" android:textColor="@color/taxi_p_check_keyboard_samll_mogo_color" - android:textSize="@dimen/dp_24" + android:textSize="24px" app:layout_constraintStart_toStartOf="@+id/tv_small_mogo" app:layout_constraintTop_toBottomOf="@+id/tv_small_mogo" /> @@ -198,12 +198,12 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="@dimen/dp_84" - android:layout_marginTop="@dimen/dp_129" + android:layout_marginTop="308px" android:text="@string/taxi_p_check_input_phone_tail_title" android:textColor="@color/taxi_p_check_keyboard_samll_mogo_color" - android:textSize="@dimen/sp_36" + android:textSize="@dimen/dp_36" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/tv_taxi_number" /> + app:layout_constraintTop_toTopOf="parent" /> - - + app:layout_constraintStart_toEndOf="@+id/tv_taxi_passenger_number_back" + app:layout_constraintTop_toTopOf="@+id/tv_taxi_passenger_number_back" /> + app:layout_constraintStart_toEndOf="@+id/tv_taxi_passenger_number_zero" + app:layout_constraintTop_toTopOf="@+id/tv_taxi_passenger_number_back" /> - - - - + app:layout_constraintHorizontal_chainStyle="packed" + app:layout_constraintStart_toStartOf="parent" /> + app:layout_constraintTop_toTopOf="@+id/tv_taxi_passenger_number_seven" /> + + + + + + + + + @@ -340,7 +347,7 @@ - - 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 e50749e0fd..6776cc12e1 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 @@ -28,7 +28,7 @@ + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-dispatch/src/main/java/com/zhjt/dispatch/DispatchDialogManager.java b/core/function-impl/mogo-core-function-dispatch/src/main/java/com/zhjt/dispatch/DispatchDialogManager.java index 67ec158a58..9c7590180b 100644 --- a/core/function-impl/mogo-core-function-dispatch/src/main/java/com/zhjt/dispatch/DispatchDialogManager.java +++ b/core/function-impl/mogo-core-function-dispatch/src/main/java/com/zhjt/dispatch/DispatchDialogManager.java @@ -93,7 +93,7 @@ public class DispatchDialogManager { } private void voice() { - AIAssist.getInstance(mContext).speakTTSVoice("请立即停车!请立即停车!"); + AIAssist.getInstance(mContext).speakTTSVoiceWithLevel("请立即停车!请立即停车!",AIAssist.LEVEL0); } public void releaseDialog() { diff --git a/core/function-impl/mogo-core-function-hmi/build.gradle b/core/function-impl/mogo-core-function-hmi/build.gradle index 9822314159..ccccc40f85 100644 --- a/core/function-impl/mogo-core-function-hmi/build.gradle +++ b/core/function-impl/mogo-core-function-hmi/build.gradle @@ -75,6 +75,8 @@ dependencies { implementation rootProject.ext.dependencies.android_start_up implementation rootProject.ext.dependencies.cicle_indicator + implementation rootProject.ext.dependencies.koomnative + implementation rootProject.ext.dependencies.koomxhook if (Boolean.valueOf(USE_MAVEN_PACKAGE)) { api rootProject.ext.dependencies.mogoaicloudservicesdk api rootProject.ext.dependencies.mogocommons @@ -137,6 +139,7 @@ dependencies { api project(':core:mogo-core-function-call') api project(':core:mogo-core-function-api') + api project(':libraries:mogo-adas') api project(':libraries:map-usbcamera') api project(':libraries:mogo-adas-other') } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/AndroidManifest.xml b/core/function-impl/mogo-core-function-hmi/src/main/AndroidManifest.xml index d9654fcfe8..ce62c801cf 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/AndroidManifest.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/AndroidManifest.xml @@ -2,8 +2,10 @@ - + + + diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt index 268afa1ffa..77bed87c57 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt @@ -9,9 +9,9 @@ import android.os.Build.VERSION_CODES import android.os.Bundle import android.text.TextUtils import android.transition.* -import android.util.Log import android.view.Gravity import android.view.View +import android.view.ViewGroup import android.view.WindowManager import android.view.WindowManager.LayoutParams import android.view.animation.* @@ -20,15 +20,22 @@ import androidx.core.view.* import androidx.lifecycle.lifecycleScope import com.alibaba.android.arouter.facade.annotation.Route import com.alibaba.android.arouter.launcher.ARouter +import com.kwai.koom.base.postOnMainThread +import com.mogo.cloud.passport.MoGoAiCloudClient +import com.mogo.commons.AbsMogoApplication +import com.mogo.commons.debug.DebugConfig import com.mogo.commons.mvp.BaseFragment import com.mogo.commons.mvp.MvpFragment import com.mogo.commons.voice.* +import com.mogo.eagle.core.data.app.AppConfigInfo import com.mogo.eagle.core.data.bindingcar.AdUpgradeStateHelper import com.mogo.eagle.core.data.bindingcar.IPCUpgradeStateInfo import com.mogo.eagle.core.data.camera.CameraEntity import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.config.HmiBuildConfig import com.mogo.eagle.core.data.constants.MoGoFragmentPaths +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_RTS +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.V2I import com.mogo.eagle.core.data.enums.SidePattern import com.mogo.eagle.core.data.enums.SidePattern.* import com.mogo.eagle.core.data.enums.WarningDirectionEnum @@ -38,14 +45,18 @@ import com.mogo.eagle.core.data.notice.NoticeTrafficStylePushData import com.mogo.eagle.core.data.report.ReportEntity import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotRecordListener import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener.Companion.STATUS_AUTOPILOT_RUNNING import com.mogo.eagle.core.function.api.hmi.IMoGoHmiViewProxy import com.mogo.eagle.core.function.api.hmi.IMoGoHmiViewProxy.IViewNotificationProvider +import com.mogo.eagle.core.function.api.hmi.view.IOchBusView import com.mogo.eagle.core.function.api.hmi.view.IViewLimitingVelocity import com.mogo.eagle.core.function.api.hmi.view.IViewNotification import com.mogo.eagle.core.function.api.hmi.view.IViewTrafficLight import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWaringProvider import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotRecordListenerManager import com.mogo.eagle.core.function.call.bindingcar.CallerBindingcarManager import com.mogo.eagle.core.function.call.check.CallerCheckManager @@ -53,6 +64,7 @@ import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager import com.mogo.eagle.core.function.call.map.CallerMapDataCollectorManager import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager import com.mogo.eagle.core.function.call.monitor.CallerMonitorManager +import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.function.hmi.WaringConst import com.mogo.eagle.core.function.hmi.notification.WarningFloat @@ -67,13 +79,18 @@ import com.mogo.eagle.core.function.hmi.ui.notice.NoticeNormalBannerView import com.mogo.eagle.core.function.hmi.ui.setting.DebugSettingView import com.mogo.eagle.core.function.hmi.ui.setting.IPCReportWindow import com.mogo.eagle.core.function.hmi.ui.setting.ReportListFloatWindow +import com.mogo.eagle.core.function.hmi.ui.setting.SOPSettingView import com.mogo.eagle.core.function.hmi.ui.tools.AdUpgradeDialog import com.mogo.eagle.core.function.hmi.ui.tools.AutoPilotAndCheckView +import com.mogo.eagle.core.function.hmi.ui.tools.MaskView +import com.mogo.eagle.core.function.hmi.ui.widget.DemoModeView +import com.mogo.eagle.core.function.hmi.ui.widget.StatusBarView import com.mogo.eagle.core.function.hmi.ui.widget.V2XNotificationView import com.mogo.eagle.core.utilcode.kotlin.* import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.mogo.logger.* import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_HMI +import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr import com.mogo.eagle.core.utilcode.mogo.toast.TipToast import com.mogo.eagle.core.utilcode.reminder.* import com.mogo.eagle.core.utilcode.reminder.api.* @@ -81,11 +98,17 @@ import com.mogo.eagle.core.utilcode.reminder.api.IReminder.IStateChangeListener import com.mogo.eagle.core.utilcode.reminder.api.impl.* import com.mogo.eagle.core.utilcode.util.* import com.mogo.eagle.core.utilcode.util.TimeUtils.millis2String +import com.mogo.map.MogoMap import com.mogo.module.common.enums.* +import com.zhidao.support.adas.high.common.MogoReport.Code.Error.EMAP.* import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig +import com.zhjt.service_biz.BizConfig import kotlinx.android.synthetic.main.fragment_hmi.* +import kotlinx.android.synthetic.main.view_auto_pilot_check.view.* +import kotlinx.android.synthetic.main.view_och_bus_operation.view.* import kotlinx.coroutines.* import mogo_msg.MogoReportMsg +import org.greenrobot.eventbus.EventBus import record_cache.RecordPanelOuterClass import java.util.* @@ -96,18 +119,25 @@ import java.util.* * 预警图层 */ @Route(path = MoGoFragmentPaths.PATH_FRAGMENT_HMI) - class MoGoHmiFragment : MvpFragment(), - IMoGoWaringProvider, - IMoGoHmiViewProxy, - MoGoHmiContract.View, - IMoGoAutopilotRecordListener, - IMoGoAutopilotStatusListener, IViewNotificationProvider { +class MoGoHmiFragment : MvpFragment(), + IMoGoWaringProvider, + IMoGoHmiViewProxy, + MoGoHmiContract.View, + IMoGoAutopilotRecordListener, + IMoGoAutopilotStatusListener, IViewNotificationProvider { private val TAG = "MoGoHmiFragment" // DebugSettingView private var mDebugSettingViewFloat: WarningFloat.Builder? = null private var mDebugSettingView: DebugSettingView? = null + //SOPSettingView + private var mSOPSettingViewFloat: WarningFloat.Builder? = null + private var mSOPSettingView: SOPSettingView? = null + + //StatusView + private var statusBarViewFloat: WarningFloat.Builder? = null + private var statusBarView: StatusBarView? = null private var mNoticeFloat: WarningFloat.Builder? = null @@ -120,6 +150,9 @@ import java.util.* // 检测、自动驾驶速度设置 private var toolsViewFloat: WarningFloat.Builder? = null + private var maskViewFloat: WarningFloat.Builder? = null + private var maskView: MaskView? = null + private var upgradeTipsView: (() -> View)? = null // HMI 视图控件代理 @@ -134,11 +167,12 @@ import java.util.* //工控机节点上报列表 private var reportList = arrayListOf() - //工控机上报列表悬浮窗 - private var reportListFloatWindow: ReportListFloatWindow?=null - private var ipcReportWindow: IPCReportWindow?=null - private var adUpgradeDialog: AdUpgradeDialog?=null + //工控机上报列表悬浮窗 + private var reportListFloatWindow: ReportListFloatWindow? = null + private var ipcReportWindow: IPCReportWindow? = null + + private var adUpgradeDialog: AdUpgradeDialog? = null private var lastSpeakJob: Job? = null @@ -147,6 +181,8 @@ import java.util.* private var showingV2XTip: IReminder? = null private var roadVideoDialog: RoadVideoDialog? = null + private var busOperationStatus: IOchBusView? = null + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) } @@ -162,16 +198,26 @@ import java.util.* } override fun initViews() { + toggleStatusBarView() + initViewShowWithConfig() + + //设置StatusBar初始状态 + if (FunctionBuildConfig.isDemoMode) { + statusBarView?.updateRightView(true, "demoMode", DemoModeView(requireContext())) + } else { + statusBarView?.updateRightView(false, "demoMode", DemoModeView(requireContext())) + } + ivCameraIcon?.setOnClickListener { if (cameraViewFloat == null) { showCameraList(CallerMonitorManager.getCameraList()) } } - /*ivCameraIcon?.setOnLongClickListener { - activity?.let { it1 -> CarcorderPreviewView.show(it1) } - true + /**ivCameraIcon?.setOnLongClickListener { + activity?.let { it1 -> CarcorderPreviewView.show(it1) } + true }*/ ivToolsIcon?.setOnClickListener { @@ -185,7 +231,50 @@ import java.util.* true } + // init appConfigInfo + AppConfigInfo.appName = AppUtils.getAppName() + if (AppConfigInfo.appVersionCode == 0) { + AppConfigInfo.appVersionCode = AppUtils.getAppVersionCode() + } + if (AppConfigInfo.appVersionName.isNullOrEmpty()) { + AppConfigInfo.appVersionName = AppUtils.getAppVersionName() + } + if (AppConfigInfo.appPackageName.isNullOrEmpty()) { + AppConfigInfo.appPackageName = AppUtils.getAppPackageName() + } + if (AppConfigInfo.uniqueDeviceId.isNullOrEmpty()) { + AppConfigInfo.uniqueDeviceId = DeviceIdUtils.getDeviceId(AbsMogoApplication.getApp()) + } + if (AppConfigInfo.widevineIDMd5.isNullOrEmpty()) { + AppConfigInfo.widevineIDMd5 = + DeviceIdUtils.getWidevineIDWithMd5(AbsMogoApplication.getApp()) + } + if (MoGoAiCloudClient.getInstance().aiCloudClientConfig != null) { + AppConfigInfo.mogoSN = MoGoAiCloudClient.getInstance().aiCloudClientConfig.sn + AppConfigInfo.mogoToken = MoGoAiCloudClient.getInstance().aiCloudClientConfig.token + } + AppConfigInfo.netMode = DebugConfig.getNetMode() + if (MogoMap.getInstance().mogoMap != null) { + AppConfigInfo.mapSdkVersion = MogoMap.getInstance().mogoMap.mapVersion + } + AppConfigInfo.isConnectNet = NetworkUtils.isConnected(context) + AppConfigInfo.isConnectSocket = DebugConfig.isDownloadSnapshot() + + when { + AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode) -> {// 司机端 + AppConfigInfo.isDriver = true + AppConfigInfo.isConnectedNetty = CallerTelematicManager.getServerStarted() + } + AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode) -> { + AppConfigInfo.isDriver = false + AppConfigInfo.isConnectedNetty = CallerTelematicManager.getClientConnStatus() + AppConfigInfo.serverSn = CallerTelematicManager.getServerToken() + } + else -> { + } + } + AppConfigInfo.teleTimeStamp = CallerAutoPilotManager.getTeleTimeStamp() } @OptIn(ExperimentalCoroutinesApi::class) @@ -208,45 +297,62 @@ import java.util.* } } - override fun getNotificationView(): IViewNotification? = context?.let { V2XNotificationView(it) } + override fun getNotificationView(): IViewNotification? = + context?.let { V2XNotificationView(it) } override fun onAutopilotRecordResult(recordPanel: RecordPanelOuterClass.RecordPanel) { CallerLogger.d("$M_HMI$TAG", "recordKey=${recordPanel.key},stat=${recordPanel.stat}") - if(BadCaseConfig.recordKeyList.contains(recordPanel.key)){ - if(recordPanel.stat == 100 || recordPanel.stat == 101){ + if (BadCaseConfig.recordKeyList.contains(recordPanel.key)) { + if (recordPanel.stat == 100 || recordPanel.stat == 101) { //成功结束录制 - TipToast.shortTip("${millis2String(System.currentTimeMillis(),TimeUtils.getHourMinSecondFormat())} bag录制成功") + TipToast.shortTip( + "${ + millis2String( + System.currentTimeMillis(), + TimeUtils.getHourMinSecondFormat() + ) + } bag录制成功" + ) } - if(recordPanel.stat == 200){ + if (recordPanel.stat == 200) { //录制失败 - TipToast.shortTip("${millis2String(System.currentTimeMillis(),TimeUtils.getHourMinSecondFormat())} bag录制失败") + TipToast.shortTip( + "${ + millis2String( + System.currentTimeMillis(), + TimeUtils.getHourMinSecondFormat() + ) + } bag录制失败" + ) } return } //在工控机taxi2.3.0版本和Bus2.4.0版本上不支持被动录包,不进行被动录包的弹窗 BadCaseConfig.dockerVersion?.let { - if(it.contains("taxi") && it.contains("2.3.0")){ + if (it.contains("taxi") && it.contains("2.3.0")) { return } - if(it.contains("bus") && it.contains("2.4.0")){ + if (it.contains("bus") && it.contains("2.4.0")) { return } } - //处于非美化模式下弹窗 - if (!FunctionBuildConfig.isDemoMode && (recordPanel.stat == 100 || recordPanel.stat == 101)) { + //处于非美化模式下弹窗;是地图数据采集任务时即type=2时,不弹窗 + if (!FunctionBuildConfig.isDemoMode && (recordPanel.stat == 100 || recordPanel.stat == 101) && recordPanel.type != 2) { //只在司机屏生效,乘客屏不生效 - if(AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)){ + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { activity?.let { CallerDevaToolsManager.onReceiveBadCaseRecord(recordPanel, it) } } } if (!FunctionBuildConfig.isDemoMode && recordPanel.type == 2 && ( - recordPanel.stat == 101 || //工控机采集完成-被动完成 - recordPanel.stat == 100 || //工控机采集完成-主动完成 - recordPanel.stat == 102 || //工控机达到最大采集时长 - recordPanel.stat == 103) //工控机磁盘满了 + recordPanel.stat == 101 || //工控机采集完成-被动完成 + recordPanel.stat == 100 || //工控机采集完成-主动完成 + recordPanel.stat == 102 || //工控机达到最大采集时长 + recordPanel.stat == 103) //工控机磁盘满了 ) { - CallerMapDataCollectorManager.finish(recordPanel.id, recordPanel.stat, "", recordPanel.filename - ?: "", recordPanel.note ?: "") + CallerMapDataCollectorManager.finish( + recordPanel.id, recordPanel.stat, "", recordPanel.filename + ?: "", recordPanel.note ?: "" + ) } } @@ -290,15 +396,19 @@ import java.util.* * @param warningReportList 提醒级别上报数据列表 * @param reportLevel 1:error级别 2:warning级别 */ - override fun showIPCReportWindow(errorReportList: ArrayList,warningReportList: ArrayList,reportLevel: Int) { - ThreadUtils.runOnUiThread{ - if(reportLevel == 1){ - if(ipcReportWindow==null){ - ipcReportWindow= activity?.let { IPCReportWindow(it) } - ipcReportWindow?.setClickListener(object: IPCReportWindow.ClickListener{ + override fun showIPCReportWindow( + errorReportList: ArrayList, + warningReportList: ArrayList, + reportLevel: Int + ) { + ThreadUtils.runOnUiThread { + if (reportLevel == 1) { + if (ipcReportWindow == null) { + ipcReportWindow = activity?.let { IPCReportWindow(it) } + ipcReportWindow?.setClickListener(object : IPCReportWindow.ClickListener { override fun closeWindow() { ipcReportWindow?.hideFloatWindow() - ipcReportWindow =null + ipcReportWindow = null } }) ipcReportWindow?.let { @@ -307,7 +417,7 @@ import java.util.* } ipcReportWindow?.showFloatWindow() } - ipcReportWindow?.refreshData(errorReportList,warningReportList,reportLevel) + ipcReportWindow?.refreshData(errorReportList, warningReportList, reportLevel) } } @@ -315,13 +425,17 @@ import java.util.* mViewNotificationProvider = provider } - override fun showVideoDialog(infList: List) { - context?.let { - if (roadVideoDialog == null) { - roadVideoDialog = RoadVideoDialog(it) - } - roadVideoDialog?.show(infList) - } + override fun setBusOperationView(view: IOchBusView) { + busOperationStatus = view + busOperationStatus?.showBusOperation() + } + + override fun setStatusBarDarkOrLight(light: Boolean) { + statusBarView?.setStatusBarDarkOrLight(light) + } + + override fun updateStatusBarRightView(insert: Boolean, tag: String, viewGroup: ViewGroup) { + statusBarView?.updateRightView(insert, tag, viewGroup) } /** @@ -362,44 +476,48 @@ import java.util.* dismissToolsFloatView() CallerDevaToolsManager.showFeedbackView(it) } + + override fun showSOPSettingView() { + toggleSOPView() + } }) } toolsViewFloat = WarningFloat.with(it) - .setTag("ToolsViewFloat") - .setLayout(toolsView!!) - .setSidePattern(SidePattern.LEFT) - .setGravity(Gravity.LEFT) - .setImmersionStatusBar(true) - .setWindowHeight(LayoutParams.MATCH_PARENT) - .setAnimator(object : DefaultAnimator() { - override fun enterAnim( - view: View, - params: LayoutParams, - windowManager: WindowManager, - sidePattern: SidePattern - ): Animator? = - super.enterAnim(view, params, windowManager, sidePattern) - ?.apply { - interpolator = OvershootInterpolator() - } + .setTag("ToolsViewFloat") + .setLayout(toolsView!!) + .setSidePattern(SidePattern.LEFT) + .setGravity(Gravity.LEFT) + .setImmersionStatusBar(true) + .setWindowHeight(LayoutParams.MATCH_PARENT) + .setAnimator(object : DefaultAnimator() { + override fun enterAnim( + view: View, + params: LayoutParams, + windowManager: WindowManager, + sidePattern: SidePattern + ): Animator? = + super.enterAnim(view, params, windowManager, sidePattern) + ?.apply { + interpolator = OvershootInterpolator() + } - override fun exitAnim( - view: View, - params: LayoutParams, - windowManager: WindowManager, - sidePattern: SidePattern - ): Animator? = - super.exitAnim(view, params, windowManager, sidePattern) - ?.setDuration(200) - }) - .addWarningStatusListener(object : IMoGoWarningStatusListener { - override fun onDismiss() { - toolsViewFloat = null - toolsView = null - // TODO:("") - } - }) - .show() + override fun exitAnim( + view: View, + params: LayoutParams, + windowManager: WindowManager, + sidePattern: SidePattern + ): Animator? = + super.exitAnim(view, params, windowManager, sidePattern) + ?.setDuration(200) + }) + .addWarningStatusListener(object : IMoGoWarningStatusListener { + override fun onDismiss() { + toolsViewFloat = null + toolsView = null + // TODO:("") + } + }) + .show() } else { toolsViewFloat?.show() } @@ -444,7 +562,7 @@ import java.util.* ivAiCollectTools.visibility = View.VISIBLE CallerDevaToolsManager.initBadCase(ivBadCaseTools) CallerDevaToolsManager.initAiCollect(ivAiCollectTools) - }else{ + } else { ivBadCaseTools.visibility = View.GONE ivAiCollectTools.visibility = View.GONE } @@ -505,9 +623,7 @@ import java.util.* */ override fun toggleDebugView() { CallerLogger.d("$M_HMI$TAG", "长按显示状态工具栏") - Log.i("DebugViewSwitchLog", "长按显示状态工具栏") activity?.let { - Log.i("DebugViewSwitchLog", "activity 不为null") if (mDebugSettingViewFloat != null) { WarningFloat.dismiss(mDebugSettingViewFloat!!.config.floatTag, false) mDebugSettingViewFloat = null @@ -516,64 +632,160 @@ import java.util.* reportListFloatWindow?.hideFloatWindow() reportListFloatWindow = null } else { - Log.i("DebugViewSwitchLog", "打开调试窗") if (mDebugSettingView == null) { mDebugSettingView = DebugSettingView(it) - Log.i("DebugViewSwitchLog", "new DebugSettingView") mDebugSettingView?.reportInit(reportList) - mDebugSettingView?.setClickListener(object: DebugSettingView.ClickListener{ + mDebugSettingView?.setClickListener(object : DebugSettingView.ClickListener { override fun showReportListWindow(show: Boolean) { - if(show){ + if (show) { //打开工控机上报列表 reportListFloatWindow = ReportListFloatWindow(it) reportListFloatWindow?.showFloatWindow() reportListFloatWindow?.refreshData(reportList) - }else{ + } else { //关闭工控机上报列表 reportListFloatWindow?.hideFloatWindow() } } }) - if(mDebugSettingView!=null){ - Log.i("DebugViewSwitchLog", "new DebugSettingView success") + if (mDebugSettingView != null) { + CallerLogger.d("$M_HMI$TAG", "new DebugSettingView success") } } var side = SidePattern.RIGHT var gravity = Gravity.RIGHT //调试窗默认靠右显示,Bus的乘客端右端有视图覆盖,调试窗靠左显示 if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode) && - AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)) { + AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode) + ) { side = SidePattern.LEFT gravity = Gravity.LEFT } mDebugSettingViewFloat = WarningFloat.with(it) - .setTag("DebugSettingView") - .setLayout(mDebugSettingView!!) - .setSidePattern(side) - .setGravity(gravity, offsetY = 70) - .setImmersionStatusBar(true) - .setAnimator(object : DefaultAnimator() { - override fun enterAnim( - view: View, - params: LayoutParams, - windowManager: WindowManager, - sidePattern: SidePattern - ): Animator? = - super.enterAnim(view, params, windowManager, sidePattern) - ?.apply { - interpolator = OvershootInterpolator() - } + .setTag("DebugSettingView") + .setLayout(mDebugSettingView!!) + .setSidePattern(side) + .setGravity(gravity, offsetY = 70) + .setImmersionStatusBar(true) + .setAnimator(object : DefaultAnimator() { + override fun enterAnim( + view: View, + params: LayoutParams, + windowManager: WindowManager, + sidePattern: SidePattern + ): Animator? = + super.enterAnim(view, params, windowManager, sidePattern) + ?.apply { + interpolator = OvershootInterpolator() + } - override fun exitAnim( - view: View, - params: LayoutParams, - windowManager: WindowManager, - sidePattern: SidePattern - ): Animator? = - super.exitAnim(view, params, windowManager, sidePattern) - ?.setDuration(200) - }) - .show() + override fun exitAnim( + view: View, + params: LayoutParams, + windowManager: WindowManager, + sidePattern: SidePattern + ): Animator? = + super.exitAnim(view, params, windowManager, sidePattern) + ?.setDuration(200) + }) + .show() + } + } + } + + override fun toggleSOPView() { + activity?.let { + if (mSOPSettingViewFloat != null) { + WarningFloat.dismiss(mSOPSettingViewFloat!!.config.floatTag, false) + mSOPSettingViewFloat = null + mSOPSettingView = null + } else { + if (mSOPSettingView == null) { + mSOPSettingView = SOPSettingView(it) + } + var side = RIGHT + var gravity = Gravity.RIGHT + //调试窗默认靠右显示,Bus的乘客端右端有视图覆盖,调试窗靠左显示 + if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode) && + AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode) + ) { + side = LEFT + gravity = Gravity.LEFT + } + mSOPSettingViewFloat = WarningFloat.with(it) + .setTag("mSOPSettingView") + .setLayout(mSOPSettingView!!) + .setSidePattern(side) + .setGravity(gravity, offsetY = 70) + .setImmersionStatusBar(true) + .setAnimator(object : DefaultAnimator() { + override fun enterAnim( + view: View, + params: LayoutParams, + windowManager: WindowManager, + sidePattern: SidePattern + ): Animator? = + super.enterAnim(view, params, windowManager, sidePattern) + ?.apply { + interpolator = OvershootInterpolator() + } + + override fun exitAnim( + view: View, + params: LayoutParams, + windowManager: WindowManager, + sidePattern: SidePattern + ): Animator? = + super.exitAnim(view, params, windowManager, sidePattern) + ?.setDuration(200) + }) + .show() + } + } + } + + private fun toggleStatusBarView() { + activity?.let{ + if(statusBarViewFloat!= null){ + WarningFloat.dismiss(statusBarViewFloat!!.config.floatTag, false) + statusBarViewFloat = null + statusBarView = null + }else{ + if (statusBarView == null){ + statusBarView = StatusBarView(it) + } + val side = TOP + val gravity = Gravity.TOP + statusBarViewFloat = WarningFloat.with(it) + .setTag("statusBarView") + .setLayout(statusBarView!!) + .setSidePattern(side) + .setWindowWidth(ScreenUtils.getScreenWidth()) + .setWindowHeight(BarUtils.getStatusBarHeight()) + .setGravity(gravity, 0) + .setImmersionStatusBar(true) + .setAnimator(object : DefaultAnimator() { + override fun enterAnim( + view: View, + params: LayoutParams, + windowManager: WindowManager, + sidePattern: SidePattern + ): Animator? = + super.enterAnim(view, params, windowManager, sidePattern) + ?.apply { + interpolator = LinearInterpolator() + } + + override fun exitAnim( + view: View, + params: LayoutParams, + windowManager: WindowManager, + sidePattern: SidePattern + ): Animator? = + super.exitAnim(view, params, windowManager, sidePattern) + ?.setDuration(200) + }) + .show() } } } @@ -588,91 +800,122 @@ import java.util.* */ @Synchronized override fun showWarningV2X( - v2xType: String, - alertContent: CharSequence?, - ttsContent: String?, - tag: String?, - listener: IMoGoWarningStatusListener?, - playTts: Boolean, - expireTime: Long + v2xType: String, + alertContent: CharSequence?, + ttsContent: String?, + tag: String?, + listener: IMoGoWarningStatusListener?, + playTts: Boolean, + expireTime: Long ) { - Log.d("liyz", "showWarningV2X v2xType = $v2xType --alertContent = $alertContent --ttsContent = $ttsContent --tag = $tag ") - val playTTS = playTts && !AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode) + val playTTS = + playTts && !AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode) activity?.let { val warningContent = alertContent ?: EventTypeEnum.getWarningContent(v2xType) + + //占道施工预警 + if (v2xType.equals("10006") || v2xType.equals("100061")) { + val currentTime = System.currentTimeMillis() / 1000 + val oldTime = + context?.let { it -> SharedPrefsMgr.getInstance(it).getLong("roadwork", 0) } + if (currentTime - oldTime!! > 60) { //超过一分钟,才会继续播报重复提醒 + context?.let { it -> + SharedPrefsMgr.getInstance(it) + .putLong("roadwork", System.currentTimeMillis() / 1000) + } + CallerAutoPilotManager.sendTripInfo(5, "", "", "", false); + } + } + if (warningContent.isEmpty()) { CallerLogger.e("$M_HMI$TAG", "Show warningContent is null or empty!") - Log.e("liyz", "Show warningContent is null or empty!") return } val content = mViewNotificationProvider?.getNotificationView() ?: return content.setWarningIcon(EventTypeEnum.getWarningIcon(v2xType)) content.setWarningContent(warningContent) - Log.d("$M_HMI$TAG", "--- show v2x dialog 1 ---: info -> v2x-type: $v2xType : expireTime: $expireTime") - Reminder.enqueue(this@MoGoHmiFragment, object : PopupWindowReminder(PopupWindow(content, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT).also { itx -> - itx.isTouchable = false - itx.isFocusable = false - itx.isClippingEnabled = false - itx.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) - val transition = Slide(when(content.sidePattern) { - LEFT, RESULT_LEFT-> Gravity.LEFT - RIGHT, RESULT_RIGHT -> Gravity.RIGHT - TOP, RESULT_TOP -> Gravity.TOP - BOTTOM, RESULT_BOTTOM -> Gravity.BOTTOM - else -> Gravity.TOP - }).also { t -> - t.interpolator = AccelerateDecelerateInterpolator() - t.duration = 200 - } - if (VERSION.SDK_INT >= VERSION_CODES.M) { - itx.enterTransition = transition - itx.exitTransition = transition - } - }) { - override fun show() { - val parent = it.window.decorView - parent.doOnAttach { - Log.d("$M_HMI$TAG", "--- show v2x dialog 2 ---: info -> v2x-type: $v2xType : expireTime: $expireTime") - popupWindow.showAtLocation(parent, content.layoutGravity, 0, 0) - } - } - override fun isOverride(): Boolean { - return true - } - - override fun key(): String { - return v2xType - } - }, object : IStateChangeListener { - - override fun onShow(reminder: IReminder) { - listener?.onShow() - lastShowV2XJob?.safeCancel() - lastSpeakJob?.safeCancel() - showingV2XTip = reminder - lifecycleScope.launch { - delay(expireTime) - }.also { itx -> - lastShowV2XJob = itx - }.invokeOnCompletion { _ -> - reminder.hide() - } - if (ttsContent != null && !TextUtils.isEmpty(ttsContent) && playTTS) { - lifecycleScope.launch { - speak(it, ttsContent) - }.also { itx -> - lastSpeakJob = itx + CallerLogger.d( + "$M_HMI$TAG", + "--- show v2x dialog 1 ---: info -> v2x-type: $v2xType : expireTime: $expireTime" + ) + Reminder.enqueue( + this@MoGoHmiFragment, + object : PopupWindowReminder( + PopupWindow( + content, + LayoutParams.WRAP_CONTENT, + LayoutParams.WRAP_CONTENT + ).also { itx -> + itx.isTouchable = false + itx.isFocusable = false + itx.isClippingEnabled = false + itx.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + val transition = Slide( + when (content.sidePattern) { + LEFT, RESULT_LEFT -> Gravity.LEFT + RIGHT, RESULT_RIGHT -> Gravity.RIGHT + TOP, RESULT_TOP -> Gravity.TOP + BOTTOM, RESULT_BOTTOM -> Gravity.BOTTOM + else -> Gravity.TOP + } + ).also { t -> + t.interpolator = AccelerateDecelerateInterpolator() + t.duration = 200 + } + if (VERSION.SDK_INT >= VERSION_CODES.M) { + itx.enterTransition = transition + itx.exitTransition = transition + } + }) { + override fun show() { + val parent = it.window.decorView + parent.doOnAttach { + CallerLogger.d( + "$M_HMI$TAG", + "--- show v2x dialog 2 ---: info -> v2x-type: $v2xType : expireTime: $expireTime" + ) + popupWindow.showAtLocation(parent, content.layoutGravity, 0, 0) } } - } - override fun onHide(reminder: IReminder) { - listener?.onDismiss() - showingV2XTip = null - showWarning(WarningDirectionEnum.ALERT_WARNING_NON) - } - }) + override fun isOverride(): Boolean { + return true + } + + override fun key(): String { + return v2xType + } + }, + object : IStateChangeListener { + + override fun onShow(reminder: IReminder) { + listener?.onShow() + lastShowV2XJob?.safeCancel() + lastSpeakJob?.safeCancel() + showingV2XTip = reminder + lifecycleScope.launch { + delay(expireTime) + }.also { itx -> + lastShowV2XJob = itx + }.invokeOnCompletion { _ -> + reminder.hide() + } + if (ttsContent != null && !TextUtils.isEmpty(ttsContent) && playTTS) { + lifecycleScope.launch { + speak(it, ttsContent) + }.also { itx -> + lastSpeakJob = itx + } + } + } + + override fun onHide(reminder: IReminder) { + listener?.onDismiss() + showingV2XTip = null + showWarning(WarningDirectionEnum.ALERT_WARNING_NON) + } + }) } } @@ -692,10 +935,10 @@ import java.util.* it.invokeOnCancellation { AIAssist.getInstance(ctx).stopSpeakTts(text) } - AIAssist.getInstance(ctx).speakTTSVoice(text, voiceCallback) + AIAssist.getInstance(ctx).speakTTSVoiceWithLevel(text, AIAssist.LEVEL2, voiceCallback) } catch (t: Throwable) { it.resumeWith(Result.success(Unit)) - Logger.e(TAG, t.message) + CallerLogger.d("$M_HMI$TAG", t.message) } } @@ -704,11 +947,11 @@ import java.util.* * @param tag 弹窗标识 */ override fun disableWarningV2X(tag: String?) { - UiThreadHandler.post { - activity?.let { - WarningFloat.dismiss(tag) - } - Log.d("$M_HMI$TAG", "--- disableWarningV2X ---") + activity?.let { + WarningFloat.dismiss(tag) + } + CallerLogger.d("$M_HMI$TAG", "--- disableWarningV2X ---") + lifecycleScope.launch { showingV2XTip?.takeIf { it.isShowing() }?.also { it.hide() } } } @@ -719,8 +962,8 @@ import java.util.* * @param checkLightId 0-都是默认不亮起,1-红,2-黄,3-绿 * @param lightSource 1:云端下发;2:自车感知 */ - override fun showWarningTrafficLight(checkLightId: Int,lightSource: Int) { - mViewTrafficLight?.showWarningTrafficLight(checkLightId,lightSource) + override fun showWarningTrafficLight(checkLightId: Int, lightSource: Int) { + mViewTrafficLight?.showWarningTrafficLight(checkLightId, lightSource) } override fun isWarningTrafficLightShow(): Boolean { @@ -794,7 +1037,7 @@ import java.util.* * @see WarningDirectionEnum */ override fun showWarning(direction: WarningDirectionEnum) { - Log.d(TAG,"showWarning====") + CallerLogger.d(TAG, "showWarning====") flV2XWarningView?.showWarning(direction) if (flV2XWarningView != null) { flicker(flV2XWarningView) @@ -804,12 +1047,12 @@ import java.util.* /** * 闪动动画 */ - private fun flicker(view: View) { - val alphaAnimation = AlphaAnimation(0f, 0.9f) - alphaAnimation.setDuration(300) //600 - alphaAnimation.setInterpolator(LinearInterpolator()) - alphaAnimation.setRepeatCount(Animation.INFINITE) - alphaAnimation.setRepeatMode(Animation.REVERSE) + fun flicker(view: View) { + val alphaAnimation = AlphaAnimation(0f, 0.88f) + alphaAnimation.duration = 600 + alphaAnimation.interpolator = LinearInterpolator() + alphaAnimation.repeatCount = Animation.INFINITE + alphaAnimation.repeatMode = Animation.REVERSE view.startAnimation(alphaAnimation) } @@ -845,42 +1088,42 @@ import java.util.* mNoticeFloat = it?.let { it1 -> noticeBannerView?.let { it2 -> WarningFloat.with(it1) - .setTag(WaringConst.NOTICE_FOR_TRAFFIC_KEY) - .setLayout(it2) - .setSidePattern(SidePattern.TOP) - .setCountDownTime(60 * 1000 * 3) - .setGravity(Gravity.CENTER_HORIZONTAL, offsetY = 110) - .setImmersionStatusBar(true) - .addWarningStatusListener(object : IMoGoWarningStatusListener { - override fun onShow() { - // 创建弹窗成功才进行TTS播报 + .setTag(WaringConst.NOTICE_FOR_TRAFFIC_KEY) + .setLayout(it2) + .setSidePattern(SidePattern.TOP) + .setCountDownTime(60 * 1000 * 3) + .setGravity(Gravity.CENTER_HORIZONTAL, offsetY = 110) + .setImmersionStatusBar(true) + .addWarningStatusListener(object : IMoGoWarningStatusListener { + override fun onShow() { + // 创建弹窗成功才进行TTS播报 // AIAssist.getInstance(activity) // .speakTTSVoice("") - } + } - }) - .setAnimator(object : DefaultAnimator() { - override fun enterAnim( - view: View, - params: LayoutParams, - windowManager: WindowManager, - sidePattern: SidePattern - ): Animator? = - super.enterAnim(view, params, windowManager, sidePattern) - ?.apply { - interpolator = OvershootInterpolator() - } + }) + .setAnimator(object : DefaultAnimator() { + override fun enterAnim( + view: View, + params: LayoutParams, + windowManager: WindowManager, + sidePattern: SidePattern + ): Animator? = + super.enterAnim(view, params, windowManager, sidePattern) + ?.apply { + interpolator = OvershootInterpolator() + } - override fun exitAnim( - view: View, - params: LayoutParams, - windowManager: WindowManager, - sidePattern: SidePattern - ): Animator? = - super.exitAnim(view, params, windowManager, sidePattern) - ?.setDuration(200) - }) - .show() + override fun exitAnim( + view: View, + params: LayoutParams, + windowManager: WindowManager, + sidePattern: SidePattern + ): Animator? = + super.exitAnim(view, params, windowManager, sidePattern) + ?.setDuration(200) + }) + .show() } } } @@ -895,41 +1138,41 @@ import java.util.* mNoticeFloat = it.let { it1 -> noticeBannerView?.let { it2 -> WarningFloat.with(it1) - .setTag(WaringConst.NOTICE_FOR_NORMAL_KEY) - .setLayout(it2) - .setSidePattern(SidePattern.TOP) - .setCountDownTime(10000) - .setGravity(Gravity.CENTER_HORIZONTAL, offsetY = 110) - .setImmersionStatusBar(true) - .addWarningStatusListener(object : IMoGoWarningStatusListener { - override fun onShow() { - // 创建弹窗成功才进行TTS播报 - // AIAssist.getInstance(activity) - // .speakTTSVoice("") - } - }) - .setAnimator(object : DefaultAnimator() { - override fun enterAnim( - view: View, - params: LayoutParams, - windowManager: WindowManager, - sidePattern: SidePattern - ): Animator? = - super.enterAnim(view, params, windowManager, sidePattern) - ?.apply { - interpolator = OvershootInterpolator() - } + .setTag(WaringConst.NOTICE_FOR_NORMAL_KEY) + .setLayout(it2) + .setSidePattern(SidePattern.TOP) + .setCountDownTime(10000) + .setGravity(Gravity.CENTER_HORIZONTAL, offsetY = 110) + .setImmersionStatusBar(true) + .addWarningStatusListener(object : IMoGoWarningStatusListener { + override fun onShow() { + // 创建弹窗成功才进行TTS播报 + // AIAssist.getInstance(activity) + // .speakTTSVoice("") + } + }) + .setAnimator(object : DefaultAnimator() { + override fun enterAnim( + view: View, + params: LayoutParams, + windowManager: WindowManager, + sidePattern: SidePattern + ): Animator? = + super.enterAnim(view, params, windowManager, sidePattern) + ?.apply { + interpolator = OvershootInterpolator() + } - override fun exitAnim( - view: View, - params: LayoutParams, - windowManager: WindowManager, - sidePattern: SidePattern - ): Animator? = - super.exitAnim(view, params, windowManager, sidePattern) - ?.setDuration(200) - }) - .show() + override fun exitAnim( + view: View, + params: LayoutParams, + windowManager: WindowManager, + sidePattern: SidePattern + ): Animator? = + super.exitAnim(view, params, windowManager, sidePattern) + ?.setDuration(200) + }) + .show() } } } @@ -944,6 +1187,66 @@ import java.util.* cameraListView?.showNoSignal() } + /** + * 展示蒙层 + */ + override fun showMaskView() { + if (maskViewFloat == null) { + context?.let { + if (maskViewFloat == null) { + if (maskView == null) { + maskView = MaskView(it) + } + + maskViewFloat = WarningFloat.with(it) + .setTag("MaskViewFloat") + .setLayout(maskView!!) + .setSidePattern(SidePattern.LEFT) + .setGravity(Gravity.CENTER) + .setImmersionStatusBar(true) + .setWindowHeight(LayoutParams.MATCH_PARENT) + .setWindowWidth(LayoutParams.MATCH_PARENT) +// .setCountDownTime(6000) + .setAnimator(object : DefaultAnimator() { + override fun enterAnim( + view: View, + params: LayoutParams, + windowManager: WindowManager, + sidePattern: SidePattern + ): Animator? = + super.enterAnim(view, params, windowManager, sidePattern) + ?.apply { + interpolator = OvershootInterpolator() + } + + override fun exitAnim( + view: View, + params: LayoutParams, + windowManager: WindowManager, + sidePattern: SidePattern + ): Animator? = + super.exitAnim(view, params, windowManager, sidePattern) + ?.setDuration(200) + }) + .addWarningStatusListener(object : IMoGoWarningStatusListener { + override fun onDismiss() { + maskViewFloat = null + maskView = null + // TODO:("") + } + }) + .show() + } else { + maskViewFloat?.show() + } + } + } + } + + override fun hideMaskView() { + dismissMaskView() + } + override fun showToolsView() { if (toolsViewFloat == null) { showToolsFloat() @@ -956,6 +1259,17 @@ import java.util.* dismissToolsFloatView() } + @BizConfig(V2I, "", BIZ_RTS) + override fun showVideoDialog(infList: List) { + context?.let { + if (roadVideoDialog == null) { + roadVideoDialog = RoadVideoDialog(it) + } + roadVideoDialog?.show(infList) + } + } + + @BizConfig(V2I, "", BIZ_RTS) private fun showCameraList(cameraList: List?) { context?.let { if (cameraViewFloat == null) { @@ -984,40 +1298,40 @@ import java.util.* } }) cameraViewFloat = WarningFloat.with(it) - .setTag("CameraListFloat") - .setLayout(cameraListView!!) - .setSidePattern(SidePattern.RIGHT) - .setGravity(Gravity.RIGHT, -40, 255) - .setImmersionStatusBar(true) - .setAnimator(object : DefaultAnimator() { - override fun enterAnim( - view: View, - params: LayoutParams, - windowManager: WindowManager, - sidePattern: SidePattern - ): Animator? = - super.enterAnim(view, params, windowManager, sidePattern) - ?.apply { - interpolator = OvershootInterpolator() - } + .setTag("CameraListFloat") + .setLayout(cameraListView!!) + .setSidePattern(SidePattern.RIGHT) + .setGravity(Gravity.RIGHT, -40, 255) + .setImmersionStatusBar(true) + .setAnimator(object : DefaultAnimator() { + override fun enterAnim( + view: View, + params: LayoutParams, + windowManager: WindowManager, + sidePattern: SidePattern + ): Animator? = + super.enterAnim(view, params, windowManager, sidePattern) + ?.apply { + interpolator = OvershootInterpolator() + } - override fun exitAnim( - view: View, - params: LayoutParams, - windowManager: WindowManager, - sidePattern: SidePattern - ): Animator? = - super.exitAnim(view, params, windowManager, sidePattern) - ?.setDuration(200) - }) - .addWarningStatusListener(object : IMoGoWarningStatusListener { - override fun onDismiss() { - cameraViewFloat = null - cameraListView = null - ivCameraIcon.setBackgroundResource(R.drawable.icon_camera_nor) - } - }) - .show() + override fun exitAnim( + view: View, + params: LayoutParams, + windowManager: WindowManager, + sidePattern: SidePattern + ): Animator? = + super.exitAnim(view, params, windowManager, sidePattern) + ?.setDuration(200) + }) + .addWarningStatusListener(object : IMoGoWarningStatusListener { + override fun onDismiss() { + cameraViewFloat = null + cameraListView = null + ivCameraIcon.setBackgroundResource(R.drawable.icon_camera_nor) + } + }) + .show() } else { cameraViewFloat?.show() } @@ -1040,9 +1354,17 @@ import java.util.* } } - private var isLeftLight :Boolean = false - private var isRightLight :Boolean = false - private var isDisappare :Boolean = false + private fun dismissMaskView() { + maskViewFloat?.let { + WarningFloat.dismiss(it.config.floatTag, false) + maskViewFloat = null + maskView = null + } + } + + private var isLeftLight: Boolean = false + private var isRightLight: Boolean = false + private var isDisappare: Boolean = false /** * 显示转向灯效果 if (HmiBuildConfig.isShowBadCaseView) { @@ -1129,11 +1451,18 @@ import java.util.* /** * 升级app弹框 */ - override fun showUpgradeDialog(name: String, url: String) { + override fun showUpgradeDialog( + name: String, + url: String, + title: String, + content: String, + installType: String + ) { if (upgradeAppDialog == null) { upgradeAppDialog = UpgradeAppDialog(requireContext()) } - upgradeAppDialog!!.showUpgradeAppDialog(name, url) + upgradeAppDialog!!.setCanceledOnTouchOutside(false) + upgradeAppDialog!!.showUpgradeAppDialog(name, url, title, content, installType) } /** @@ -1147,13 +1476,14 @@ import java.util.* padSn: String, releaseId: String ) { - ThreadUtils.runOnUiThread{ - if(adUpgradeDialog == null){ - adUpgradeDialog = AdUpgradeDialog(requireContext(),images, padSn, releaseId) - adUpgradeDialog?.setClickListener(object: AdUpgradeDialog.ClickListener{ + ThreadUtils.runOnUiThread { + if (adUpgradeDialog == null) { + adUpgradeDialog = AdUpgradeDialog(requireContext(), images, padSn, releaseId) + adUpgradeDialog?.setClickListener(object : AdUpgradeDialog.ClickListener { override fun confirm() { //确认升级 - CallerBindingcarManager.getBindingcarProvider().upgradeConfirm(images, padSn, releaseId) + CallerBindingcarManager.getBindingcarProvider() + .upgradeConfirm(images, padSn, releaseId) AdUpgradeStateHelper.setConfirmUpgrade(true) ToastUtils.showLong("最新版本下载中...") adUpgradeDialog?.dismiss() @@ -1172,10 +1502,10 @@ import java.util.* } override fun showAdUpgradeStatus(ipcUpgradeStateInfo: IPCUpgradeStateInfo) { - ThreadUtils.runOnUiThread{ + ThreadUtils.runOnUiThread { toolsView?.showAdUpgradeStatus(ipcUpgradeStateInfo) ipcUpgradeStateInfo.status.let { - if(AdUpgradeStateHelper.isUpgradeSuccess(it)){ + if (AdUpgradeStateHelper.isUpgradeSuccess(it)) { ToastUtils.showLong("升级成功") AdUpgradeStateHelper.setConfirmUpgrade(false) } @@ -1196,22 +1526,58 @@ import java.util.* HmiBuildConfig.isShowSnBindingView = isOpen } + private var takeOver = false /** * 工控机监控节点上报 */ override fun onAutopilotGuardian(guardianInfo: MogoReportMsg.MogoReportMessage?) { - guardianInfo?.let { - if(reportList.size>49){ - reportList.removeLast() - } - reportList.add(0, - ReportEntity(TimeUtils.millis2String(System.currentTimeMillis()), - it.src,it.level,it.msg,it.code,it.resultList,it.actionsList)) - } - reportListFloatWindow?.let { - ThreadUtils.runOnUiThread{ - it.refreshData(reportList) + ThreadUtils.runOnUiThread { + guardianInfo?.let { + if (reportList.size > 49) { + reportList.removeLast() + } + reportList.add( + 0, + ReportEntity( + TimeUtils.millis2String(System.currentTimeMillis()), + it.src, it.level, it.msg, it.code, it.resultList, it.actionsList + ) + ) + reportListFloatWindow?.refreshData(reportList) + + if (FunctionBuildConfig.isDemoMode) { + return@let + } + if (takeOver) { + return@let + } + when (it.code) { + EXIT_AUTOPILOT_FOR_PLANNING, + EXIT_AUTOPILOT_FOR_LOCATION, + EXIT_AUTOPILOT_FOR_CHASSIS, + EXIT_AUTOPILOT_FOR_DISTANCE -> { + showWarningV2X( + EventTypeEnum.TAKE_OVER_EVENT.poiType, + EventTypeEnum.TAKE_OVER_EVENT.content, + EventTypeEnum.TAKE_OVER_EVENT.tts, + EventTypeEnum.TAKE_OVER_EVENT.poiType, + object : IMoGoWarningStatusListener { + override fun onShow() { + takeOver = true + clTakeOverView.visibility = View.VISIBLE + } + + override fun onDismiss() { + takeOver = false + clTakeOverView.visibility = View.GONE + } + }, + true, + 6000L + ) + } + } } } } @@ -1222,12 +1588,16 @@ import java.util.* .navigation() as BaseFragment activity?.supportFragmentManager?.beginTransaction() ?.setCustomAnimations(R.anim.slide_in, R.anim.fade_out)?.apply { - if (!fragmentOverview.isAdded) { - add(R.id.module_main_id_smp_fragment, fragmentOverview, fragmentOverview.tagName) - } else { + if (!fragmentOverview.isAdded) { + add( + R.id.module_main_id_smp_fragment, + fragmentOverview, + fragmentOverview.tagName + ) + } else { show(fragmentOverview) - }.commitAllowingStateLoss() - } + }.commitAllowingStateLoss() + } CallerDevaToolsManager.hideStatusBar() } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/bindingcar/UpgradeAppDialog.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/bindingcar/UpgradeAppDialog.kt index 2a88a92cbe..3f2319fb5e 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/bindingcar/UpgradeAppDialog.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/bindingcar/UpgradeAppDialog.kt @@ -1,7 +1,9 @@ package com.mogo.eagle.core.function.hmi.ui.bindingcar import android.content.Context +import android.opengl.Visibility import android.util.Log +import android.view.View import android.widget.TextView import androidx.lifecycle.LifecycleObserver import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager @@ -21,22 +23,23 @@ class UpgradeAppDialog(context: Context) : BaseFloatDialog(context), LifecycleOb private val TAG = "UpgradeAppDialog" private var confirmTv: TextView? = null private var cancleTv: TextView? = null + private var upgradeTitleTv: TextView? = null + private var upgradeContentTv: TextView? = null + private var verticalLineView: View? = null + private var confirmForceTv: TextView? = null private var tag: String? = null private var downloarUrl: String? = null - private var mServiceApis: IMogoServiceApis? = null - private val statusChangedListenerForCheckNotice = IMogoStatusChangedListener { descriptor, isTrue -> - if (descriptor == StatusDescriptor.MAIN_PAGE_IS_BACKGROUND) { - dismiss() - } - } - init { setContentView(R.layout.dialog_upgrade_app) setCanceledOnTouchOutside(true) + upgradeTitleTv = findViewById(R.id.tv_upgrade_title) + upgradeContentTv = findViewById(R.id.tv_upgrade_content) confirmTv = findViewById(R.id.tv_upgrade_confirm) cancleTv = findViewById(R.id.tv_upgrade_cancel) + verticalLineView = findViewById(R.id.view_vertical_line) + confirmForceTv = findViewById(R.id.tv_upgrade_confirm_force) confirmTv?.setOnClickListener { downloadApp() @@ -45,6 +48,11 @@ class UpgradeAppDialog(context: Context) : BaseFloatDialog(context), LifecycleOb cancleTv?.setOnClickListener { dismiss() } + + confirmForceTv?.setOnClickListener { + downloadApp() + } + } /** @@ -61,12 +69,31 @@ class UpgradeAppDialog(context: Context) : BaseFloatDialog(context), LifecycleOb super.dismiss() } - fun showUpgradeAppDialog(name: String, url: String) { + // 升级类型 1:提示升级 2:静默升级 3:强制升级 + fun showUpgradeAppDialog(name: String, url: String, title: String, content: String, installType: String) { if (isShowing) { return } tag = name downloarUrl = url + upgradeTitleTv?.text = title + upgradeContentTv?.text = content + + if (installType.equals("1")) { + confirmForceTv?.visibility = View.GONE + confirmTv?.visibility = View.VISIBLE + cancleTv?.visibility = View.VISIBLE + verticalLineView?.visibility = View.VISIBLE + } else if (installType.equals("3")) { + confirmTv?.visibility = View.GONE + cancleTv?.visibility = View.GONE + verticalLineView?.visibility = View.GONE + + confirmForceTv?.visibility = View.VISIBLE + } else if (installType.equals("2")) { + //静默安装 + } + show() } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/pnc/PncActionsView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/pnc/PncActionsView.kt new file mode 100644 index 0000000000..539658cf16 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/pnc/PncActionsView.kt @@ -0,0 +1,119 @@ +package com.mogo.eagle.core.function.hmi.ui.pnc + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import androidx.appcompat.content.res.AppCompatResources +import androidx.constraintlayout.widget.ConstraintLayout +import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo +import com.mogo.eagle.core.data.autopilot.pnc.PncActionsHelper +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_PNC_ACTIONS +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.FOUNDATION +import com.mogo.eagle.core.data.trafficlight.TrafficLightResult +import com.mogo.eagle.core.data.trafficlight.currentRoadTrafficLight +import com.mogo.eagle.core.data.trafficlight.isRed +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotPlanningActionsListener +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener.Companion.STATUS_AUTOPILOT_RUNNING +import com.mogo.eagle.core.function.api.trafficlight.IMoGoTrafficLightListener +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotPlanningActionsListenerManager +import com.mogo.eagle.core.function.call.trafficlight.CallerTrafficLightListenerManager +import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.utilcode.util.UiThreadHandler +import com.zhjt.service_biz.BizConfig +import kotlinx.android.synthetic.main.view_pnc_actions.view.* +import mogo.telematics.pad.MessagePad + +class PncActionsView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : ConstraintLayout(context, attrs, defStyleAttr), IMoGoAutopilotPlanningActionsListener, + IMoGoTrafficLightListener, IMoGoAutopilotStatusListener { + + companion object { + const val TAG = "PncActionsView" + } + + @Volatile + private var mTrafficLightResult: TrafficLightResult? = null + + private var mAutoPilotStatusInfo: AutopilotStatusInfo? = null + + init { + LayoutInflater.from(context).inflate(R.layout.view_pnc_actions, this, true) + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + CallerAutoPilotStatusListenerManager.addListener(TAG, this) + CallerAutopilotPlanningActionsListenerManager.addListener(TAG, this) + CallerTrafficLightListenerManager.registerTrafficLightListener(TAG, this) + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + CallerAutoPilotStatusListenerManager.removeListener(TAG) + CallerAutopilotPlanningActionsListenerManager.removeListener(TAG) + CallerTrafficLightListenerManager.unRegisterTrafficLightListener(TAG) + } + + override fun onAutopilotStatusResponse(autoPilotStatusInfo: AutopilotStatusInfo) { + super.onAutopilotStatusResponse(autoPilotStatusInfo) + mAutoPilotStatusInfo = autoPilotStatusInfo + if (mAutoPilotStatusInfo!!.state != STATUS_AUTOPILOT_RUNNING) { + UiThreadHandler.post { + this.background = null + tvHmiPncActions.text = "" + } + } + } + + @BizConfig(FOUNDATION, "", BIZ_PNC_ACTIONS) + override fun pncActions(planningActionMsg: MessagePad.PlanningActionMsg) { + mAutoPilotStatusInfo?.let { + if (it.state == STATUS_AUTOPILOT_RUNNING) { + UiThreadHandler.post { + var actions: String? = null + planningActionMsg.actionMsg?.let { + actions = PncActionsHelper.getAction(it.drivingState.number, it.drivingAction.number) + + //如果是存在云端红绿灯数据条件下,设置云端数据 + if (PncActionsHelper.isWaitingTrafficlight(it.drivingState.number, it.drivingAction.number) + && mTrafficLightResult != null + && getWaitTrafficlightTime().isNotBlank()) { + actions += ",预计${getWaitTrafficlightTime()}秒后通过" + } else { + mTrafficLightResult = null + } + } + // update view + if (actions.isNullOrEmpty()) { + this.background = null + tvHmiPncActions.text = "" + } else { + this.background = AppCompatResources.getDrawable(context, R.drawable.pnc_actions_bg) + tvHmiPncActions.text = actions + } + } + } + } + + } + + override fun onTrafficLightStatus(trafficLightResult: TrafficLightResult) { + mTrafficLightResult = trafficLightResult + } + + private fun getWaitTrafficlightTime(): String { + return if (mTrafficLightResult != null + && mTrafficLightResult!!.currentRoadTrafficLight() != null + && mTrafficLightResult!!.currentRoadTrafficLight()!!.isRed() + ) { + mTrafficLightResult!!.currentRoadTrafficLight()!!.remain.toString() + } else { + "" + } + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt index 18bc7c28dc..4a764781c9 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt @@ -9,9 +9,9 @@ import android.graphics.Color import android.os.Build import android.text.Html import android.util.AttributeSet +import android.util.Log import android.view.LayoutInflater import android.view.View -import android.widget.* import androidx.annotation.RequiresApi import androidx.appcompat.widget.PopupMenu import androidx.constraintlayout.widget.ConstraintLayout @@ -21,12 +21,17 @@ import androidx.recyclerview.widget.LinearLayoutManager import chassis.Chassis import com.mogo.cloud.passport.MoGoAiCloudClient import com.mogo.cloud.passport.MoGoAiCloudClientConfig -import com.mogo.commons.AbsMogoApplication import com.mogo.commons.debug.DebugConfig import com.mogo.eagle.core.data.app.AppConfigInfo import com.mogo.eagle.core.data.autopilot.* import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.constants.MoGoConfig +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_BAG_RECORD +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_BEAUTY_MODE +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_FULL_LOG +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_RAIN_MODE +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_WARNING_UPLOAD import com.mogo.eagle.core.data.deva.chain.ChainConstant import com.mogo.eagle.core.data.deva.scene.SceneModule import com.mogo.eagle.core.data.enums.TrafficTypeEnum @@ -36,10 +41,12 @@ import com.mogo.eagle.core.data.obu.ObuStatusInfo import com.mogo.eagle.core.data.report.ReportEntity import com.mogo.eagle.core.data.upgrade.UpgradeVersionEntity import com.mogo.eagle.core.function.api.autopilot.* +import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsFuncConfigListener import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsListener import com.mogo.eagle.core.function.api.map.listener.IMoGoMapLocationListener import com.mogo.eagle.core.function.api.obu.IMoGoObuStatusListener import com.mogo.eagle.core.function.call.autopilot.* +import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsFuncConfigListenerManager import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsListenerManager import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager import com.mogo.eagle.core.function.call.hmi.CallerHmiManager @@ -50,12 +57,11 @@ import com.mogo.eagle.core.function.call.map.CallerSmpManager import com.mogo.eagle.core.function.call.obu.CallerOBUManager import com.mogo.eagle.core.function.call.obu.CallerObuListenerManager import com.mogo.eagle.core.function.call.setting.CallerMoGoUiSettingManager -import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.function.hmi.ui.logcatch.ILogViewListener import com.mogo.eagle.core.function.hmi.ui.logcatch.LogInfoView import com.mogo.eagle.core.function.hmi.ui.upgrade.UpgradeListAdapter -import com.mogo.eagle.core.network.* +import com.mogo.eagle.core.function.hmi.ui.widget.DemoModeView import com.mogo.eagle.core.utilcode.kotlin.onClick import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.mogo.logger.LogLevel @@ -65,6 +71,7 @@ import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr import com.mogo.eagle.core.utilcode.mogo.toast.TipToast import com.mogo.eagle.core.utilcode.util.* import com.mogo.map.MogoMap +import com.mogo.map.MogoMapUIController import com.mogo.map.uicontroller.VisualAngleMode import com.mogo.map.uicontroller.VisualAngleMode.* import com.mogo.module.service.routeoverlay.* @@ -92,8 +99,8 @@ class DebugSettingView @JvmOverloads constructor( ) : ConstraintLayout(context, attrs, defStyleAttr), IMoGoObuStatusListener, IMoGoAutopilotStatusListener, IMoGoAutopilotCarStateListener, IMoGoMapLocationListener, IMoGoAutopilotIdentifyListener, - IMoGoAutopilotPlanningListener, IMoGoAutopilotCarConfigListener, - IMoGoAutopilotVehicleStateListener { + IMoGoAutopilotPlanningListener, + IMoGoAutopilotVehicleStateListener, IMoGoDevaToolsFuncConfigListener { private val TAG = "DebugSettingView" @@ -151,6 +158,8 @@ class DebugSettingView @JvmOverloads constructor( SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS") } + private var isStarted = false + init { LayoutInflater.from(context).inflate(R.layout.view_debug_setting, this, true) initView() @@ -177,15 +186,19 @@ class DebugSettingView @JvmOverloads constructor( // 添加 ADAS车辆状态&定位 监听 CallerAutopilotCarStatusListenerManager.addListener(TAG, this) // 添加 地图样式改变 监听 - CallerMapLocationListenerManager.addListener(TAG, this) + CallerMapLocationListenerManager.addListener(TAG, this, false) // 添加 域控制器感知数据 监听 CallerAutopilotIdentifyListenerManager.addListener(TAG, this) // 添加 规划路径相关回调 监听 CallerAutopilotPlanningListenerManager.addListener(TAG, this) - // 添加 工控机基础信息回调 监听 - CallerAutopilotCarConfigListenerManager.addListener(TAG, this) //添加 车辆底盘数据回调 监听 CallerAutopilotVehicleStateListenerManager.addListener(TAG, this) + + //添加 业务配置监听 + CallerDevaToolsFuncConfigListenerManager.registerDevaToolsFuncConfigListener( + FuncBizConfig.FOUNDATION, TAG, true, this + ) + if (logInfoView != null) { logInfoView!!.onEnterForeground() } @@ -206,16 +219,17 @@ class DebugSettingView @JvmOverloads constructor( // 移除 ADAS车辆状态&定位 监听 CallerAutopilotCarStatusListenerManager.removeListener(TAG) // 移除 地图样式改变 监听 - CallerMapLocationListenerManager.removeListener(TAG) + CallerMapLocationListenerManager.removeListener(TAG, false) // 移除 域控制器感知数据 监听 CallerAutopilotIdentifyListenerManager.removeListener(TAG) // 移除 规划路径相关回调 监听 CallerAutopilotPlanningListenerManager.removeListener(TAG) - // 移除 工控机基础信息回调 监听 - CallerAutopilotCarConfigListenerManager.removeListener(TAG) - //移除 车辆底盘数据回调 监听 + // 移除 车辆底盘数据回调 监听 CallerAutopilotVehicleStateListenerManager.removeListener(TAG) + // 移除 业务配置监听 + CallerDevaToolsFuncConfigListenerManager.unRegisterDevaToolsFuncConfigListener( FuncBizConfig.FOUNDATION, TAG) + if (logInfoView != null) { logInfoView!!.onEnterBackground() } @@ -247,6 +261,23 @@ class DebugSettingView @JvmOverloads constructor( } } + /** + * 魔戒控制 + */ + tbMojie.setOnCheckedChangeListener { buttonView, isChecked -> + if (isChecked) { + buttonView.setCompoundDrawables(null, null, iconDown, null) + btnOpenAllGestures.visibility = View.VISIBLE + } else { + buttonView.setCompoundDrawables(null, null, iconRight, null) + btnOpenAllGestures.visibility = View.GONE + } + } + + btnOpenAllGestures.setOnClickListener { + MogoMapUIController.getInstance().setAllGesturesEnabled(true) + } + /** * 版本信息 */ @@ -535,24 +566,33 @@ class DebugSettingView @JvmOverloads constructor( } } + Log.i( + "1026-emArrow", + "debug setting FunctionBuildConfig.isDemoMode : ${FunctionBuildConfig.isDemoMode}" + ) // 演示模式,上一次勾选的数据 tbIsDemoMode.isChecked = FunctionBuildConfig.isDemoMode // 演示模式 tbIsDemoMode.setOnCheckedChangeListener { _, isChecked -> + CallerHmiManager.updateStatusBarRightView(isChecked, "demoMode", DemoModeView(context)) CallerAutoPilotManager.setDemoMode(isChecked) - if(!isChecked){ + if (!isChecked) { //关闭美化模式时,通知工控机 CallerAutoPilotManager.setIPCDemoMode(isChecked) } FunctionBuildConfig.isDemoMode = isChecked tbIsDrawAutopilotTrajectoryData.isEnabled = !isChecked - FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = isChecked if (!FunctionBuildConfig.isDemoMode) { tbIsDrawAutopilotTrajectoryData.isChecked = false } } + //只在司机端设置美化模式开关功能 + if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { + tbIsDemoMode.visibility = View.GONE + } + // 雨天模式,上一次勾选的数据 tbIsRainMode.isChecked = FunctionBuildConfig.isRainMode //雨天模式 @@ -565,6 +605,15 @@ class DebugSettingView @JvmOverloads constructor( tbIsRainMode.visibility = View.GONE } + tbBeautyMode.isChecked = FunctionBuildConfig.isBeautyMode + //感知优化模式 + tbBeautyMode.setOnCheckedChangeListener { _, isChecked -> + FunctionBuildConfig.isBeautyMode = isChecked + if (!FunctionBuildConfig.isBeautyMode) { + tbBeautyMode.isChecked = false + } + } + //重启工控机所有节点 btnIpcReboot.onClick { CallerAutoPilotManager.sendIpcReboot() @@ -585,36 +634,64 @@ class DebugSettingView @JvmOverloads constructor( } - // 初始化 GSP数据源 数据 rgGpsProvider.check( when (FunctionBuildConfig.gpsProvider) { - 0 -> { - R.id.rbGpsProviderAndroid - } - 1 -> { - R.id.rbGpsProviderRTK - } - 2 -> { - R.id.rbGpsProviderOBU - } + 0 -> R.id.rbGpsProviderAndroid + 1 -> R.id.rbGpsProviderRTK + 2 -> R.id.rbGpsProviderOBU else -> R.id.rbGpsProviderAndroid } ) rgGpsProvider.setOnCheckedChangeListener { _, checkedId -> when (checkedId) { - R.id.rbGpsProviderAndroid -> { - FunctionBuildConfig.gpsProvider = 0 + R.id.rbGpsProviderAndroid -> FunctionBuildConfig.gpsProvider = 0 + R.id.rbGpsProviderRTK -> FunctionBuildConfig.gpsProvider = 1 + R.id.rbGpsProviderOBU -> FunctionBuildConfig.gpsProvider = 2 + } + } + + // 初始化 tracker感知数据源 数据 + trackerProvider.check( + when (FunctionBuildConfig.debugTrackerProvider) { + 0 -> R.id.trackerProviderOrigin + 1 -> R.id.trackerProviderObu + else -> R.id.trackerProviderOrigin + } + ) + trackerProvider.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.trackerProviderOrigin -> { + FunctionBuildConfig.debugTrackerProvider = 0 + // update tracker provider view + trackerIPCProvider.visibility = View.VISIBLE } - R.id.rbGpsProviderRTK -> { - FunctionBuildConfig.gpsProvider = 1 - } - R.id.rbGpsProviderOBU -> { - FunctionBuildConfig.gpsProvider = 2 + R.id.trackerProviderObu -> { + FunctionBuildConfig.debugTrackerProvider = 1 + // update tracker provider view + trackerIPCProvider.visibility = View.GONE } } } + // 初始化 trackerIPC 感知数据源 数据 + trackerIPCProvider.check( + when (FunctionBuildConfig.trackerIPCProvider) { + 0 -> R.id.trackerIPCUnion + 1 -> R.id.trackerIPC + 2 -> R.id.trackerIPCObu + 3 -> R.id.trackerIPCV2I + else -> R.id.trackerIPCUnion + } + ) + trackerIPCProvider.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.trackerIPCUnion -> FunctionBuildConfig.trackerIPCProvider = 0 + R.id.trackerIPC -> FunctionBuildConfig.trackerIPCProvider = 1 + R.id.trackerIPCObu -> FunctionBuildConfig.trackerIPCProvider = 2 + R.id.trackerIPCV2I -> FunctionBuildConfig.trackerIPCProvider = 3 + } + } // 初始化 ADAS感知数据是否绘制 选择情况 tbIsDrawIdentifyData.isChecked = FunctionBuildConfig.isDrawIdentifyData @@ -751,20 +828,21 @@ class DebugSettingView @JvmOverloads constructor( } //状态中心-后台优化状态 - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){ + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { val backgroundStatus = "后台运行:" + if (BackgrounderPermission.getInstance() .isPermissionLongBackgroundRunning(context) ) "已优化" else "未优化" tvBackgroundOperation.text = Html.fromHtml(backgroundStatus, Html.FROM_HTML_MODE_LEGACY) tvBackgroundOperation.setOnClickListener { - BackgrounderPermission.getInstance().showPermissionLongBackgroundRunningDialog(context) + BackgrounderPermission.getInstance() + .showPermissionLongBackgroundRunningDialog(context) } BackgrounderPermission.getInstance().setListener { val str = "后台运行:" + if (it) "已优化" else "未优化" tvBackgroundOperation.text = Html.fromHtml(str, Html.FROM_HTML_MODE_LEGACY) } - }else { + } else { tvBackgroundOperation.visibility = GONE } //设置工控机连接状态 @@ -774,7 +852,8 @@ class DebugSettingView @JvmOverloads constructor( /** * 设置鹰眼本地参数配置监听 */ - @SuppressLint("SetTextI18n") private fun setEagleEyeConfigListener() { + @SuppressLint("SetTextI18n") + private fun setEagleEyeConfigListener() { //初始化刹车加速度阈值信息 val brakeThreshold = SharedPrefsMgr.getInstance(context) .getFloat(MoGoConfig.BRAKE_ACCELERATION_THRESHOLD, -2.5F) @@ -801,6 +880,17 @@ class DebugSettingView @JvmOverloads constructor( } } + btnBrakeThreshold.setOnLongClickListener { + if (!isStarted) { + CallerDevaToolsManager.startMonitor() + isStarted = true + } else { + CallerDevaToolsManager.stopMonitor() + isStarted = false + } + true + } + //设置连接司机屏IP btnConnectServerIp.setOnClickListener { val ip = etConnectServerIp.text.toString() @@ -815,7 +905,7 @@ class DebugSettingView @JvmOverloads constructor( FunctionBuildConfig.isReportWarning = isChecked } //异常上报开关只在司机端展示 - if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)){ + if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { tbReportWarning.visibility = GONE } @@ -826,7 +916,7 @@ class DebugSettingView @JvmOverloads constructor( p.menuInflater.inflate(R.menu.menu_env_pop, p.menu) MenuCompat.setGroupDividerEnabled(p.menu, true) p.setOnMenuItemClickListener { item -> - when(item.itemId) { + when (item.itemId) { R.id.group_hy -> { return@setOnMenuItemClickListener false } @@ -1034,7 +1124,10 @@ class DebugSettingView @JvmOverloads constructor( accelerationIsShow = isChecked } - tbRouteDynamicEffect.isChecked = AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode) && !AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode) + tbRouteDynamicEffect.isChecked = + AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode) && !AppIdentityModeUtils.isBus( + FunctionBuildConfig.appIdentityMode + ) tbRouteDynamicEffect.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { @@ -1379,6 +1472,19 @@ class DebugSettingView @JvmOverloads constructor( } } + /** + * ADAS红绿灯数据 + */ + cbAdasTrafficlight.setOnCheckedChangeListener { _, isChecked -> + val map = CallerDevaToolsManager.getTraceInfo() + val param = map[ChainConstant.CHAIN_LINK_LOG_WEB_SOCKET_TRAFFIC_LIGHT] + param?.let { + it.record = isChecked + map[ChainConstant.CHAIN_LINK_LOG_WEB_SOCKET_TRAFFIC_LIGHT] = param + CallerDevaToolsManager.refreshTraceInfo(map) + } + } + /** * ADAS PLANNING OBJ 感知障碍物 */ @@ -1412,6 +1518,10 @@ class DebugSettingView @JvmOverloads constructor( vehicle?.let { cbAdasVehicle.isChecked = it.record } + val trafficlight = traceInfoMap[ChainConstant.CHAIN_LINK_LOG_WEB_SOCKET_TRAFFIC_LIGHT] + trafficlight?.let { + cbAdasTrafficlight.isChecked = it.record + } } /** @@ -1499,50 +1609,6 @@ class DebugSettingView @JvmOverloads constructor( */ @SuppressLint("SetTextI18n") private fun drawAppInfo() { - AppConfigInfo.appName = AppUtils.getAppName() - if (AppConfigInfo.appVersionCode == 0) { - AppConfigInfo.appVersionCode = AppUtils.getAppVersionCode() - } - if (AppConfigInfo.appVersionName.isNullOrEmpty()) { - AppConfigInfo.appVersionName = AppUtils.getAppVersionName() - } - if (AppConfigInfo.appPackageName.isNullOrEmpty()) { - AppConfigInfo.appPackageName = AppUtils.getAppPackageName() - } - if (AppConfigInfo.uniqueDeviceId.isNullOrEmpty()) { - AppConfigInfo.uniqueDeviceId = DeviceIdUtils.getDeviceId(AbsMogoApplication.getApp()) - } - if (AppConfigInfo.widevineIDMd5.isNullOrEmpty()) { - AppConfigInfo.widevineIDMd5 = - DeviceIdUtils.getWidevineIDWithMd5(AbsMogoApplication.getApp()) - } - if (MoGoAiCloudClient.getInstance().aiCloudClientConfig != null) { - AppConfigInfo.mogoSN = MoGoAiCloudClient.getInstance().aiCloudClientConfig.sn - AppConfigInfo.mogoToken = MoGoAiCloudClient.getInstance().aiCloudClientConfig.token - } - - AppConfigInfo.netMode = DebugConfig.getNetMode() - if (MogoMap.getInstance().mogoMap != null) { - AppConfigInfo.mapSdkVersion = MogoMap.getInstance().mogoMap.mapVersion - } - AppConfigInfo.isConnectNet = NetworkUtils.isConnected(context) - AppConfigInfo.isConnectSocket = DebugConfig.isDownloadSnapshot() - - when { - AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode) -> {// 司机端 - AppConfigInfo.isDriver = true - AppConfigInfo.isConnectedNetty = CallerTelematicManager.getServerStarted() - } - AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode) -> { - AppConfigInfo.isDriver = false - AppConfigInfo.isConnectedNetty = CallerTelematicManager.getClientConnStatus() - AppConfigInfo.serverSn = CallerTelematicManager.getServerToken() - } - else -> { - } - } - AppConfigInfo.teleTimeStamp = CallerAutoPilotManager.getTeleTimeStamp() - /** * 设备绑定关系 */ @@ -1738,16 +1804,14 @@ class DebugSettingView @JvmOverloads constructor( */ override fun onAutopilotStatusResponse(autoPilotStatusInfo: AutopilotStatusInfo) { mAutoPilotStatusInfo = autoPilotStatusInfo - AppConfigInfo.isConnectAutopilot = autoPilotStatusInfo.connectStatus - AppConfigInfo.connectStatusDescribe = autoPilotStatusInfo.connectStatusDescribe setAutopilotConnectStatus() } /** * 设置工控机连接状态 */ - private fun setAutopilotConnectStatus(){ - ThreadUtils.runOnUiThread{ + private fun setAutopilotConnectStatus() { + ThreadUtils.runOnUiThread { tvAutopilotConnectStatus.text = Html.fromHtml( "工控机连接状态:${ if (AppConfigInfo.isConnectAutopilot) { @@ -1793,6 +1857,62 @@ class DebugSettingView @JvmOverloads constructor( } } + override fun updateBizView(type: String, lock: Boolean) { + when (type) { + BIZ_BEAUTY_MODE -> { + tbIsDemoMode.isClickable = !lock + if (lock) { + tbIsDemoMode.background = + resources.getDrawable(R.drawable.radio_button_lock_background) + } else { + tbIsDemoMode.background = + resources.getDrawable(R.drawable.radio_button_normal_background_right) + } + } + BIZ_RAIN_MODE -> { + tbIsRainMode.isClickable = !lock + if (lock) { + tbIsRainMode.background = + resources.getDrawable(R.drawable.radio_button_lock_background) + } else { + tbIsRainMode.background = + resources.getDrawable(R.drawable.radio_button_normal_background_right) + } + } + BIZ_WARNING_UPLOAD -> { + tbReportWarning.isClickable = !lock + if (lock) { + tbReportWarning.background = + resources.getDrawable(R.drawable.radio_button_lock_background) + } else { + tbReportWarning.background = null + } + } + BIZ_BAG_RECORD -> { + if (lock) { + btnRecordBag.isClickable = false + btnRecordBag.background = + resources.getDrawable(R.drawable.radio_button_lock_background) + } else { + btnRecordBag.isClickable = true + btnRecordBag.requestFocus() + btnRecordBag.background = null + } + } + BIZ_FULL_LOG -> { + if (lock) { + tbLogCatch.isClickable = false + tbLogCatch.background = + resources.getDrawable(R.drawable.radio_button_lock_background) + } else { + tbLogCatch.isClickable = true + tbLogCatch.requestFocus() + tbLogCatch.background = null + } + } + } + } + override fun onAutopilotCarStateData(gnssInfo: MessagePad.GnssInfo?) { mGnssInfo = gnssInfo //实时加速度列表 @@ -1858,18 +1978,6 @@ class DebugSettingView @JvmOverloads constructor( mRouteInfoSize = globalPathResp?.wayPointsList?.size ?: 0 } - /** - * 工控机基础信息回调 - */ - override fun onAutopilotCarConfig(carConfigResp: MessagePad.CarConfigResp) { - carConfigResp.let { - AppConfigInfo.plateNumber = it.plateNumber//车牌号 - AppConfigInfo.iPCMacAddress = it.macAddress//工控机MAC地址 - AppConfigInfo.protocolVersionNumber = it.protocolVersionValue//工控机协议版本 - } - - } - /** * 工控机异常回调 */ @@ -1915,7 +2023,7 @@ class DebugSettingView @JvmOverloads constructor( } } - override fun onLocationChanged(location: MogoLocation?, from: Int) { + override fun onLocationChanged(location: MogoLocation?, from: Int, isGps: Boolean) { } /** @@ -1990,7 +2098,8 @@ class DebugSettingView @JvmOverloads constructor( private fun toastMsg(msg: String) { //当司机屏处于美化(演示)模式、msg为空时不弹吐司 if (!FunctionBuildConfig.isDemoMode && msg.isNotEmpty() - && AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + && AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode) + ) { ToastUtils.showLong(msg) } } @@ -2048,4 +2157,5 @@ class DebugSettingView @JvmOverloads constructor( fun showReportListWindow(show: Boolean) } + } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/SOPSettingView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/SOPSettingView.kt new file mode 100644 index 0000000000..f26a810247 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/SOPSettingView.kt @@ -0,0 +1,232 @@ +package com.mogo.eagle.core.function.hmi.ui.setting + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import androidx.constraintlayout.widget.ConstraintLayout +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.data.config.HmiBuildConfig +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig +import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsFuncConfigListener +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager +import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsFuncConfigListenerManager +import com.mogo.eagle.core.function.call.hmi.CallerHmiManager +import com.mogo.eagle.core.function.call.obu.CallerOBUManager +import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils +import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.mogo.module.service.routeoverlay.RouteStrategy +import kotlinx.android.synthetic.main.view_debug_setting.view.* +import kotlinx.android.synthetic.main.view_sop_setting.view.* +import kotlinx.android.synthetic.main.view_sop_setting.view.tbRouteDynamicEffect + +/** + * SOP设置窗口 + */ +class SOPSettingView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : ConstraintLayout(context, attrs, defStyleAttr), IMoGoDevaToolsFuncConfigListener { + + companion object { + const val TAG = "SOPSettingView" + } + + init { + LayoutInflater.from(context).inflate(R.layout.view_sop_setting, this, true) + initView() + } + + private fun initView() { + //绕障类功能开关 + tbObstacleAvoidance.isChecked = FunctionBuildConfig.isDetouring + tbObstacleAvoidance.setOnCheckedChangeListener { _, isChecked -> + CallerAutoPilotManager.sendDetouring(isChecked) + FunctionBuildConfig.isDetouring = isChecked + } + + tbMarkingObstacles.isChecked = FunctionBuildConfig.isPNCWarning + //危险障碍物颜色标记开关 + tbMarkingObstacles.setOnCheckedChangeListener { _, isChecked -> + FunctionBuildConfig.isPNCWarning = isChecked + } + + if (AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)) { + tbMarkingObstacles.visibility = View.GONE + } + + //引导线动态效果 + tbRouteDynamicEffect.isChecked = + AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode) && !AppIdentityModeUtils.isBus( + FunctionBuildConfig.appIdentityMode + ) + tbRouteDynamicEffect.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + RouteStrategy.enable(true) + } else { + RouteStrategy.enable(false) + } + } + + //红绿灯标识 + tbTrafficLight.isChecked = HmiBuildConfig.isShowTrafficLightView + tbTrafficLight.setOnCheckedChangeListener { _, isChecked -> + if (!isChecked) { + HmiBuildConfig.isShowTrafficLightView = false + } else { + HmiBuildConfig.isShowTrafficLightView = true + CallerHmiManager.disableWarningTrafficLight() + } + } + + //限速标识 + tbSpeedLimit.isChecked = HmiBuildConfig.isShowLimitingVelocityView + tbSpeedLimit.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + HmiBuildConfig.isShowLimitingVelocityView = true + } else { + HmiBuildConfig.isShowLimitingVelocityView = false + CallerHmiManager.disableLimitingVelocity() + } + } + + // 演示模式,上一次勾选的数据 + tbDemoMode.isChecked = FunctionBuildConfig.isDemoMode + // 演示模式 + tbDemoMode.setOnCheckedChangeListener { _, isChecked -> + CallerAutoPilotManager.setDemoMode(isChecked) + if (!isChecked) { + //关闭美化模式时,通知工控机 + CallerAutoPilotManager.setIPCDemoMode(isChecked) + } + FunctionBuildConfig.isDemoMode = isChecked + } + //只在司机端设置美化模式开关功能 + if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { + tbDemoMode.visibility = View.GONE + } + + + // 雨天模式,上一次勾选的数据 + tbRainMode.isChecked = FunctionBuildConfig.isRainMode + //雨天模式 + tbRainMode.setOnCheckedChangeListener { _, isChecked -> + CallerAutoPilotManager.setRainMode(isChecked) + FunctionBuildConfig.isRainMode = isChecked + } + //雨天模式按钮只在司机屏生效,乘客屏不显示 + if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { + tbRainMode.visibility = View.GONE + } + + //OBU控制总开关 + tbObu.isChecked = CallerOBUManager.isConnected() + tbObu.setOnCheckedChangeListener { _, isChecked -> + if (!isChecked) { + if (AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode)) { + CallerOBUManager.resetObuIpAddress("192.168.1.199") + } else if (AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)) { + CallerOBUManager.resetObuIpAddress("192.168.8.199") + } + } else { + //断开链接 + CallerOBUManager.disConnectObu() + } + } + + + //是否开启异常上报 + tbIPCReport.isChecked = FunctionBuildConfig.isReportWarning + tbIPCReport.setOnCheckedChangeListener { _, isChecked -> + FunctionBuildConfig.isReportWarning = isChecked + } + + //变道绕障的目标障碍物速度阈值 + tvSpeed.text = "${FunctionBuildConfig.detouringSpeed} m/s" + ivSpeedReduce.setOnClickListener { + if (FunctionBuildConfig.detouringSpeed <= 3) { + ToastUtils.showShort("阈值最小可为3 m/s") + } else { + FunctionBuildConfig.detouringSpeed-- + tvSpeed.text = "${FunctionBuildConfig.detouringSpeed} m/s" + } + } + ivSpeedAdd.setOnClickListener { + if (FunctionBuildConfig.detouringSpeed >= 7) { + ToastUtils.showShort("阈值最大可为7 m/s") + } else { + FunctionBuildConfig.detouringSpeed++ + tvSpeed.text = "${FunctionBuildConfig.detouringSpeed} m/s" + } + } + btnSpeedSet.setOnClickListener { + val isSuccess = + CallerAutoPilotManager.sendDetouringSpeed(FunctionBuildConfig.detouringSpeed.toDouble()) + if (isSuccess == true) { + ToastUtils.showShort("变道绕障的目标障碍物速度阈值设置成功") + } else { + ToastUtils.showShort("变道绕障的目标障碍物速度阈值设置失败") + } + } + + if (AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)) { + tvSpeedThresholdTitle.visibility = View.GONE + ivSpeedReduce.visibility = View.GONE + tvSpeed.visibility = View.GONE + ivSpeedAdd.visibility = View.GONE + btnSpeedSet.visibility = View.GONE + } + + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + //添加 业务配置监听 + CallerDevaToolsFuncConfigListenerManager.registerDevaToolsFuncConfigListener( + FuncBizConfig.FOUNDATION, TAG, true, this + ) + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + // 移除 业务配置监听 + CallerDevaToolsFuncConfigListenerManager.unRegisterDevaToolsFuncConfigListener(FuncBizConfig.FOUNDATION, TAG) + } + + override fun updateBizView(type: String, lock: Boolean) { + when (type) { + FuncBizConfig.BIZ_BEAUTY_MODE -> { + tbDemoMode.isClickable = !lock + if (lock) { + tbDemoMode.background = + resources.getDrawable(R.drawable.radio_button_lock_background) + } else { + tbDemoMode.background = + resources.getDrawable(R.drawable.radio_button_normal_background_right) + } + } + FuncBizConfig.BIZ_RAIN_MODE -> { + tbRainMode.isClickable = !lock + if (lock) { + tbRainMode.background = + resources.getDrawable(R.drawable.radio_button_lock_background) + } else { + tbRainMode.background = + resources.getDrawable(R.drawable.radio_button_normal_background_right) + } + } + FuncBizConfig.BIZ_PNC_WARNING -> { + tbMarkingObstacles.isClickable = !lock + if (lock) { + tbMarkingObstacles.background = + resources.getDrawable(R.drawable.radio_button_lock_background) + } else { + tbMarkingObstacles.background = + resources.getDrawable(R.drawable.radio_button_normal_background_right) + } + } + } + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/takeover/TakeOverView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/takeover/TakeOverView.kt new file mode 100644 index 0000000000..7c33227f88 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/takeover/TakeOverView.kt @@ -0,0 +1,18 @@ +package com.mogo.eagle.core.function.hmi.ui.takeover + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import androidx.constraintlayout.widget.ConstraintLayout +import com.mogo.eagle.core.function.hmi.R + +class TakeOverView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : ConstraintLayout(context, attrs, defStyleAttr) { + + init { + LayoutInflater.from(context).inflate(R.layout.view_take_over, this, true) + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/AutoPilotAndCheckView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/AutoPilotAndCheckView.kt index c402d12e99..562f8806d9 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/AutoPilotAndCheckView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/AutoPilotAndCheckView.kt @@ -2,32 +2,35 @@ package com.mogo.eagle.core.function.hmi.ui.tools import android.annotation.SuppressLint import android.content.Context +import android.content.Intent import android.graphics.Color import android.graphics.drawable.ColorDrawable +import android.os.Process import android.util.AttributeSet import android.util.Log import android.view.LayoutInflater import android.view.View import android.widget.FrameLayout -import com.mogo.cloud.passport.MoGoAiCloudClient +import com.mogo.commons.debug.DebugConfig import com.mogo.eagle.core.data.app.AppConfigInfo import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo import com.mogo.eagle.core.data.bindingcar.IPCUpgradeStateInfo -import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.data.temp.EventLogout import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotCarConfigListener import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotCarConfigListenerManager -import com.mogo.eagle.core.function.call.bindingcar.CallerBindingcarManager +import com.mogo.eagle.core.function.call.hmi.CallerHmiManager import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.function.hmi.ui.utils.KeyBoardUtil import com.mogo.eagle.core.utilcode.kotlin.onClick -import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.util.ToastUtils import com.mogo.eagle.core.utilcode.util.UiThreadHandler import kotlinx.android.synthetic.main.view_auto_pilot_check.view.* import mogo.telematics.pad.MessagePad +import org.greenrobot.eventbus.EventBus +import kotlin.system.exitProcess /** * @author ChenFufeng @@ -57,15 +60,13 @@ class AutoPilotAndCheckView @JvmOverloads constructor( companion object { private var maxAcceleration: Double = 2.0 - private var speedLimit: Double = 0.0 + private var speedLimit: Int = 0 } @SuppressLint("ClickableViewAccessibility") private fun initView() { background = ColorDrawable(Color.parseColor("#F0151D41")) - if (keyBoardUtil == null) { - keyBoardUtil = KeyBoardUtil(sKeyBoardView, etInputSpeed) - } + keyBoardUtil?.setActionListener { inputContent -> inputContent.toIntOrNull()?.let { speed -> when { @@ -74,10 +75,6 @@ class AutoPilotAndCheckView @JvmOverloads constructor( ToastUtils.showShort("超过最大限速值60,设置失败") } else -> { - llSpeedPosition.background = - resources.getDrawable(R.drawable.pilot_speed_bg) - keyBoardUtil?.hideKeyboard() - etInputSpeed.clearFocus() // 设置自动驾驶速度 val isSuccess = CallerAutoPilotManager.setAutoPilotSpeed(speed) when { @@ -92,10 +89,15 @@ class AutoPilotAndCheckView @JvmOverloads constructor( } } } - KeyBoardUtil.hideSystemSoftKeyboard(context, etInputSpeed) ivCloseIcon.setOnClickListener { clickListener?.onClose(it) } + rlKillLayout.setOnClickListener { + killApp() + } + sopLayout.setOnClickListener { + clickListener?.showSOPSettingView() + } viewCheckStatus.setOnClickListener { clickListener?.go2CheckPage() } @@ -105,59 +107,90 @@ class AutoPilotAndCheckView @JvmOverloads constructor( ivDebugFeedback.onClick { clickListener?.showFeedbackView() } - etInputSpeed.setOnFocusChangeListener { v, hasFocus -> - when { - hasFocus -> { - llSpeedPosition.background = - resources.getDrawable(R.drawable.pilot_speed_high_light_bg) - if (keyBoardUtil == null) { - keyBoardUtil = KeyBoardUtil(sKeyBoardView, etInputSpeed) - } - keyBoardUtil?.showKeyboard() - } - else -> llSpeedPosition.background = - resources.getDrawable(R.drawable.pilot_speed_bg) - } - } - etInputSpeed.setOnTouchListener { v, event -> - var curTime = System.currentTimeMillis() - if (curTime - lastTime < 1000) { - return@setOnTouchListener true - } - if (!connectStatus) { - ToastUtils.showShort("设置车速失败,请启动域控制器") - keyBoardUtil?.hideKeyboard() - return@setOnTouchListener true - } else { - return@setOnTouchListener false - } - } - updateSpeedSettingViews() + if (AppConfigInfo.isConnectAutopilot) { CallerAutoPilotManager.getCarConfig() } - if (maxAcceleration > 0) { - tvAcceleration.text = "加速度 $maxAcceleration m/s²" - } +// if (maxAcceleration > 0) { +// tvAcceleration.text = "加速度 $maxAcceleration m/s²" +// } + tvAcceleration.text = "每次调整车速±5km/h,点击确定生效" if (speedLimit > 0) { - etInputSpeed.setText((speedLimit * 3.6).toInt().toString()) + tvSpeed.text = speedLimit.toString() + }else{ + tvSpeed.text = "0" } -// // 比如需要设置默认速度 -// val speed = "30" -// etInputSpeed.setText(speed) -// etInputSpeed.setSelection(speed.length) + ivSpeedReduce.setOnClickListener { + if(speedLimit>=5){ + speedLimit -= 5 + tvSpeed.text = speedLimit.toString() + }else{ + ToastUtils.showShort("车速不能再减了") + } + } + + ivSpeedAdd.setOnClickListener { + if(speedLimit<=55){ + speedLimit += 5 + tvSpeed.text = speedLimit.toString() + }else{ + ToastUtils.showShort("车速不能再加了") + } + } + + //速度确认 + tvSureModify.setOnClickListener { + val isSuccess = CallerAutoPilotManager.setAutoPilotSpeed(speedLimit) + when { + isSuccess -> { + //速度显示 + tvSpeed.text = speedLimit.toString() + ToastUtils.showShort("车速设置成功,立即生效") + } + else -> { + ToastUtils.showShort("设置车速失败,请启动域控制器") + } + } + } + + initOchView() + } + + private fun initOchView() { + actvLoginout.onClick { + EventBus.getDefault().post(EventLogout()) + } + actvLoginout.visibility = View.VISIBLE + CallerHmiManager.setBusOperationView(toolBusOperationView) + + when (DebugConfig.getProductFlavor()) { + "fPadLenovoOchTaxi" -> { + //出租车司机 + } + "fPadLenovoOchBus" ->{ + //小巴车司机 + } + else -> { + + } + } + } + + private fun killApp() { + Intent(Intent.ACTION_MAIN).apply { + addCategory(Intent.CATEGORY_HOME) + flags = Intent.FLAG_ACTIVITY_NEW_TASK + context.startActivity(this) + Process.killProcess(Process.myPid()) + exitProcess(0) + } } fun setClickListener(clickListener: ClickListener) { this.clickListener = clickListener } - private fun updateSpeedSettingViews() { - tvSpeedTitle.visibility = View.VISIBLE - llSpeedPosition.visibility = View.VISIBLE - } - fun showAdUpgradeStatus(ipcUpgradeStateInfo: IPCUpgradeStateInfo) { systemVersionView?.showAdUpgradeStatus(ipcUpgradeStateInfo) } @@ -184,19 +217,20 @@ class AutoPilotAndCheckView @JvmOverloads constructor( fun onClose(v: View) fun showDebugPanelView() fun showFeedbackView() + fun showSOPSettingView() } override fun onAutopilotCarConfig(carConfigResp: MessagePad.CarConfigResp) { UiThreadHandler.post { - tvAcceleration?.let { - maxAcceleration = carConfigResp.maxAcceleration - speedLimit = carConfigResp.speedLimit - tvAcceleration.text = "加速度 ${carConfigResp.maxAcceleration} m/s²" - etInputSpeed.setText((carConfigResp.speedLimit * 3.6).toInt().toString()) - AppConfigInfo.plateNumber = carConfigResp.plateNumber//车牌号 - AppConfigInfo.iPCMacAddress = carConfigResp.macAddress//工控机MAC地址 - AppConfigInfo.protocolVersionNumber = carConfigResp.protocolVersionValue//工控机协议版本 - } +// tvAcceleration?.let { +// maxAcceleration = carConfigResp.maxAcceleration +// speedLimit = carConfigResp.speedLimit +//// tvAcceleration.text = "加速度 ${carConfigResp.maxAcceleration} m/s²" +// tvSpeed.text = (carConfigResp.speedLimit * 3.6).toInt().toString() +// } + maxAcceleration = carConfigResp.maxAcceleration + speedLimit = (carConfigResp.speedLimit * 3.6).toInt() + tvSpeed.text = speedLimit.toString() } } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/BusOperationView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/BusOperationView.kt new file mode 100644 index 0000000000..141a3ef9d7 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/BusOperationView.kt @@ -0,0 +1,61 @@ +package com.mogo.eagle.core.function.hmi.ui.tools + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import com.mogo.eagle.core.function.api.hmi.view.IOchBusView +import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.utilcode.util.SharedPrefs +import com.mogo.eagle.core.utilcode.util.StringUtils +import kotlinx.android.synthetic.main.view_och_bus_operation.view.* +import org.greenrobot.eventbus.EventBus + +/** + * @author: wangmingjun + * @date: 2022/8/23 + */ +class BusOperationView @JvmOverloads constructor( + context: Context?, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0) + : IOchBusView(context, attrs, defStyleAttr) { + + init { + LayoutInflater.from(context).inflate(R.layout.view_och_bus_operation,this,true) + context?.let { + actvAccountPhone.text = phoneMask(SharedPrefs.getInstance(it).getString("och_account","")) + } + } + + override fun showBusOperation() { + ochBusOperationStatus.visibility = View.VISIBLE + } + + override fun changerOperationStatus(isOut: Boolean) { + + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + context?.let { + actvAccountPhone.text = phoneMask(SharedPrefs.getInstance(it).getString("och_account","")) + } + } + + + /** + * 用户电话号码的打码隐藏加星号加* + * 一般都是中间四位 + * @return 处理完成的手机号码 + */ + fun phoneMask(phone: String?): String? { + var res = "" + if (!StringUtils.isEmpty(phone)&&phone?.length==11) { + val stringBuilder = StringBuilder(phone) + res = stringBuilder.replace(3, 7, "****").toString() + } + return res + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/MaskView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/MaskView.kt new file mode 100644 index 0000000000..8592692e41 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/MaskView.kt @@ -0,0 +1,42 @@ +package com.mogo.eagle.core.function.hmi.ui.tools + +import android.annotation.SuppressLint +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.util.AttributeSet +import android.view.LayoutInflater +import android.widget.FrameLayout +import com.mogo.eagle.core.function.hmi.R + +/** + * @author lixiaopeng + * 蒙层view + */ +class MaskView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : FrameLayout( + context, + attrs, + defStyleAttr +) { + + private val TAG = "MaskView" + + init { + LayoutInflater.from(context).inflate(R.layout.view_mask, this, true) + initView() + } + + companion object { + private var speedLimit: Double = 0.0 + } + + @SuppressLint("ClickableViewAccessibility") + private fun initView() { +// background = ColorDrawable(Color.parseColor("#F0151D41")) + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/BatteryGroupView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/BatteryGroupView.kt new file mode 100644 index 0000000000..4bb2a24d01 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/BatteryGroupView.kt @@ -0,0 +1,109 @@ +package com.mogo.eagle.core.function.hmi.ui.widget + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.os.BatteryManager +import android.os.Handler +import android.os.Message +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import android.widget.ImageView +import android.widget.LinearLayout +import com.mogo.eagle.core.function.api.setting.IMoGoSkinModeChangeListener +import com.mogo.eagle.core.function.call.setting.CallerSkinModeListenerManager +import com.mogo.eagle.core.function.hmi.R +import java.lang.ref.WeakReference + +class BatteryGroupView : LinearLayout, IMoGoSkinModeChangeListener { + + constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 + ) : super(context, attrs, defStyleAttr) { + } + + private var batteryHandler: BatteryHandler = BatteryHandler(this) + private var view: View = + LayoutInflater.from(context).inflate(R.layout.view_battery_group, this, true) + private var batteryView: BatteryView = (view as BatteryGroupView).findViewById(R.id.viewBattery) + private var ivBatteryCharge: ImageView = (view as BatteryGroupView).findViewById(R.id.ivBatteryCharge) + private var mSkinMode = 0 + + private val batteryStateReceiver: BroadcastReceiver = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + when (intent.action) { + Intent.ACTION_BATTERY_CHANGED -> { + val level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0) + val scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, 0) + val charge = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1) + val percentage = (level * 100) / scale + val message = Message.obtain() + message.what = 0 + message.arg1 = percentage + message.arg2 = charge + batteryHandler.sendMessage(message) + } + } + } + } + + companion object { + + const val TAG = "BatteryGroupView" + + class BatteryHandler(batteryGroupView: BatteryGroupView) : Handler() { + + //虚引用 + private var stateViewWeakReference: WeakReference? = null + + init { + stateViewWeakReference = WeakReference(batteryGroupView) + } + + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val batteryGroupView = stateViewWeakReference?.get() + batteryGroupView?.let { + if (msg.what == 0) { + it.batteryView.setPower(msg.arg1) + val isCharging = msg.arg2 == BatteryManager.BATTERY_STATUS_CHARGING || + msg.arg2 == BatteryManager.BATTERY_STATUS_FULL + it.batteryView.setCharging(isCharging) + if (isCharging) { + it.ivBatteryCharge.visibility = View.VISIBLE + when(it.mSkinMode){ + 0 -> it.ivBatteryCharge.setImageResource(R.drawable.battery_charge_light) + 1 -> it.ivBatteryCharge.setImageResource(R.drawable.battery_charge_dark) + } + } else { + it.ivBatteryCharge.visibility = View.GONE + } + } + } + } + } + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + val intentFilter = IntentFilter() + intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED) + context.registerReceiver(batteryStateReceiver, intentFilter) + // 添加换肤监听 + CallerSkinModeListenerManager.addListener(TAG, this) + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + context.unregisterReceiver(batteryStateReceiver) + CallerSkinModeListenerManager.removeListener(TAG) + } + + override fun onSkinModeChange(skinMode: Int) { + mSkinMode = skinMode + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/BatteryView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/BatteryView.kt new file mode 100644 index 0000000000..c88cc7a1bb --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/BatteryView.kt @@ -0,0 +1,165 @@ +package com.mogo.eagle.core.function.hmi.ui.widget + +import android.annotation.SuppressLint +import android.content.Context +import android.graphics.Canvas +import android.graphics.Color +import android.graphics.Paint +import android.graphics.RectF +import android.util.AttributeSet +import android.view.View +import com.mogo.eagle.core.function.api.setting.IMoGoSkinModeChangeListener +import com.mogo.eagle.core.function.call.setting.CallerSkinModeListenerManager +import com.mogo.eagle.core.function.hmi.R +import kotlin.math.abs + + +class BatteryView : View , IMoGoSkinModeChangeListener { + + companion object{ + const val TAG = "BatteryView" + } + + private val radius = context.resources.getDimension(R.dimen.dp_4) // 圆角角度 + private val border = context.resources.getDimension(R.dimen.dp_3) // 外边缘宽度 + private val margin = context.resources.getDimension(R.dimen.dp_6) // 边框与内部电量距离 + private val width = context.resources.getDimension(R.dimen.dp_57) // 电池宽度 + private val height = context.resources.getDimension(R.dimen.dp_28) // 电池高度 + private val headWidth = context.resources.getDimension(R.dimen.dp_3) // 电池头宽度 + private val headHeight = context.resources.getDimension(R.dimen.dp_8) // 电池头高度 + private val headRadius = context.resources.getDimension(R.dimen.dp_1) // 电池头圆角角度 + private val batteryNumSize = context.resources.getDimension(R.dimen.dp_20) // 电量显示文字大小 + private var batteryColor = context.resources.getColor(R.color.color_27FFFFFF) // 电量内部颜色 + private var powerColor = Color.WHITE + + //默认满电 + private var mPower = 100 + + //是否充电 + private var mIsCharging = false + + constructor( + context: Context, + attrs: AttributeSet? = null + ) : super(context, attrs, 0) { + + } + + constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 + ) : super(context, attrs, defStyleAttr) { + } + + @SuppressLint("NewApi") + override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec) + setMeasuredDimension(width.toInt(), height.toInt()) + } + + @SuppressLint("DrawAllocation") + override fun onDraw(canvas: Canvas) { + super.onDraw(canvas) + //电池头 + val paint = Paint() + paint.style = Paint.Style.FILL + paint.strokeWidth = 0f + paint.isAntiAlias = true + paint.color = powerColor + + val rectHead = + RectF(width - headWidth, (height - headHeight) / 2, width, (height + headHeight) / 2) + canvas.drawRoundRect(rectHead, headRadius, headRadius, paint) + + //边框 + paint.strokeWidth = border + paint.style = Paint.Style.STROKE + val rectF = + RectF(radius / 2, radius / 2, width - headWidth - radius / 2, height - radius / 2) + canvas.drawRoundRect(rectF, radius, radius, paint) + + //文字画笔 + val textPaint = Paint() + textPaint.color = powerColor + textPaint.isAntiAlias = true + textPaint.textSize = batteryNumSize + textPaint.textAlign = Paint.Align.CENTER + //画数字 + val fontMetrics = textPaint.fontMetrics + canvas.drawText(mPower.toString(), rectF.centerX(), abs(fontMetrics.top), textPaint) + + //电池电量 + val powerValues = mPower / 100.0f + val paintPower = Paint(paint) + paintPower.style = Paint.Style.FILL + + //低电量 + val lowerPaint = Paint(paint) + lowerPaint.style = Paint.Style.FILL + lowerPaint.color = powerColor + if (mPower < 20) { + lowerPaint.color = Color.RED + } else { + lowerPaint.color = batteryColor + } + + //画电量 + if (powerValues != 0f) { + val right = (width - margin - headWidth) * powerValues + val bottom = height - margin + val rect = RectF(margin, margin, right, bottom) + //画矩形 + canvas.drawRoundRect(rect, radius, radius, lowerPaint) + } + } + + /** + * 设置当前电量 + */ + fun setPower(power: Int) { + if (this.mPower < 0) { + this.mPower = 0 + } + if (this.mPower > 100) { + this.mPower = 100 + } + this.mPower = power + if(isAttachedToWindow){ + invalidate() + } + } + + /** + * 是否充电中 + */ + fun setCharging(charging: Boolean) { + this.mIsCharging = charging + invalidate() + } + + override fun onSkinModeChange(skinMode: Int) { + when (skinMode) { + 0 -> { + batteryColor = resources.getColor(R.color.color_27FFFFFF) + powerColor = Color.WHITE + } + 1 -> { + batteryColor = resources.getColor(R.color.color_1E111111) + powerColor = resources.getColor(R.color.color_2C2E30) + } + } + invalidate() + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + // 添加换肤监听 + CallerSkinModeListenerManager.addListener(TAG, this) + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + CallerSkinModeListenerManager.removeListener(TAG) + } +} diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/BlueToothView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/BlueToothView.kt new file mode 100644 index 0000000000..85649ffa64 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/BlueToothView.kt @@ -0,0 +1,23 @@ +package com.mogo.eagle.core.function.hmi.ui.widget + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.widget.RelativeLayout +import com.mogo.eagle.core.function.hmi.R + +/** + * 魔戒蓝牙控件 + * 放置于StatusBar右侧位置 + */ +class BlueToothView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : RelativeLayout(context, attrs, defStyleAttr) { + + init { + LayoutInflater.from(context).inflate(R.layout.view_blue_tooth, this, true) + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/CircularProgressView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/CircularProgressView.kt index 214cd5e923..e84187017b 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/CircularProgressView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/CircularProgressView.kt @@ -6,7 +6,6 @@ import android.content.res.TypedArray import android.graphics.* import android.util.AttributeSet import android.util.DisplayMetrics -import android.util.Log import android.view.View import android.view.animation.LinearInterpolator import android.view.animation.OvershootInterpolator @@ -81,7 +80,6 @@ class CircularProgressView @JvmOverloads constructor( mRectF = RectF(mRectL.toFloat(), mRectT.toFloat(), (mRectL + mRectLength).toFloat(), (mRectT + mRectLength).toFloat()) - Log.d(TAG, "onMeasure:" + mRectF.toString() + "," + "width:" + measuredWidth.toString() + "," + "PaddingLeft:" + getPaddingLeft().toString()) } /** @@ -107,7 +105,6 @@ class CircularProgressView @JvmOverloads constructor( override fun onDraw(canvas: Canvas?) { super.onDraw(canvas) - Log.d(TAG, "onDraw") canvas?.let { mRectF?.let { it1 -> it.drawArc(it1, 0.0f, 360.0f, false, mBackPaint) } mRectF?.let { it1 -> @@ -154,7 +151,6 @@ class CircularProgressView @JvmOverloads constructor( val animator = ValueAnimator.ofInt(mProgress, progress) animator.addUpdateListener { mProgress = it.animatedValue as Int - Log.d(TAG, "setProgress" + mProgress.toString()) invalidate() } animator.interpolator = LinearInterpolator() diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/DemoModeView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/DemoModeView.kt new file mode 100644 index 0000000000..f0a51a62f8 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/DemoModeView.kt @@ -0,0 +1,23 @@ +package com.mogo.eagle.core.function.hmi.ui.widget + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.widget.RelativeLayout +import com.mogo.eagle.core.function.hmi.R + +/** + * 演示模式控件 + * 放置于StatusBar右侧位置 + */ +class DemoModeView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : RelativeLayout(context, attrs, defStyleAttr) { + + init { + LayoutInflater.from(context).inflate(R.layout.view_demo_mode, this, true) + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/PerspectiveSwitchView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/PerspectiveSwitchView.kt index 8b2d1bac06..4caa7e4038 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/PerspectiveSwitchView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/PerspectiveSwitchView.kt @@ -1,17 +1,15 @@ package com.mogo.eagle.core.function.hmi.ui.widget -import android.content.Context -import android.util.AttributeSet -import android.view.LayoutInflater -import android.view.View -import android.widget.FrameLayout -import com.mogo.commons.AbsMogoApplication +import android.content.* +import android.util.* +import android.view.* +import android.widget.* +import com.mogo.commons.* import com.mogo.eagle.core.function.hmi.R -import com.mogo.map.MogoMapUIController -import com.mogo.map.MogoMarkerManager -import com.mogo.map.uicontroller.VisualAngleMode -import com.mogo.module.common.MogoApisHandler -import com.mogo.module.common.constants.DataTypes +import com.mogo.eagle.core.function.v2x.events.scenario.scene.airoad.* +import com.mogo.map.* +import com.mogo.map.uicontroller.* +import com.mogo.module.common.constants.* import kotlinx.android.synthetic.main.view_perspective_switch.view.* /** @@ -34,15 +32,20 @@ class PerspectiveSwitchView @JvmOverloads constructor( override fun onClick(v: View?) { //切换地图的远近视图 if (MogoMapUIController.getInstance().currentMapVisualAngle.isLongSight) { - MogoMarkerManager.getInstance(AbsMogoApplication.getApp()) - .visibleAllMarkers() +// MogoMarkerManager.getInstance(AbsMogoApplication.getApp()) +// .visibleAllMarkers() MogoMapUIController.getInstance().changeMapVisualAngle(VisualAngleMode.MODE_MEDIUM_SIGHT, null) textSwitch.setText(R.string.module_map_model_normal) } else if (MogoMapUIController.getInstance().currentMapVisualAngle.isMediumSight) { - MogoMarkerManager.getInstance(AbsMogoApplication.getApp()) - .inVisibleWithoutMarkers(DataTypes.TYPE_MARKER_ADAS) +// MogoMarkerManager.getInstance(AbsMogoApplication.getApp()) +// .inVisibleWithoutMarkers(DataTypes.TYPE_MARKER_ADAS) MogoMapUIController.getInstance().changeMapVisualAngle(VisualAngleMode.MODE_LONG_SIGHT, null) textSwitch.setText(R.string.module_map_model_faster) + } else { +// MogoMarkerManager.getInstance(AbsMogoApplication.getApp()) +// .visibleAllMarkers() + MogoMapUIController.getInstance().changeMapVisualAngle(VisualAngleMode.MODE_MEDIUM_SIGHT, null) + textSwitch.setText(R.string.module_map_model_normal) } } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SingleTrafficLightView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SingleTrafficLightView.kt index b856ecf35e..12842094df 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SingleTrafficLightView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SingleTrafficLightView.kt @@ -7,6 +7,7 @@ import android.view.View import android.widget.ImageView import android.widget.TextView import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.data.config.HmiBuildConfig import com.mogo.eagle.core.function.api.hmi.view.IViewTrafficLight import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils @@ -49,7 +50,9 @@ class SingleTrafficLightView @JvmOverloads constructor( override fun showWarningTrafficLight(checkLightId: Int,lightSource: Int) { super.showWarningTrafficLight(checkLightId,lightSource) mCurrentLightId = checkLightId - updateTrafficLightIcon(checkLightId,lightSource) + if(!HmiBuildConfig.isShowTrafficLightView){ + updateTrafficLightIcon(checkLightId,lightSource) + } } /** diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SpeedPanelView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SpeedPanelView.kt index 72374b2774..f0f2cbce26 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SpeedPanelView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SpeedPanelView.kt @@ -1,17 +1,17 @@ package com.mogo.eagle.core.function.hmi.ui.widget import android.content.Context -import android.graphics.Color +import android.graphics.* import android.location.Location -import android.util.AttributeSet +import android.util.* import android.view.Gravity import android.widget.FrameLayout import com.alibaba.android.arouter.launcher.ARouter import com.mogo.eagle.core.data.constants.MogoServicePaths import com.mogo.eagle.core.function.call.hmi.CallerHmiManager import com.mogo.eagle.core.function.hmi.R -import com.mogo.eagle.core.utilcode.util.UiThreadHandler -import com.mogo.map.MogoMapUIController +import com.mogo.eagle.core.utilcode.util.* +import com.mogo.map.* import com.mogo.map.navi.IMogoCarLocationChangedListener2 import com.mogo.service.IMogoServiceApis import java.util.* @@ -38,6 +38,11 @@ class SpeedPanelView @JvmOverloads constructor( var mSpeedLimmit = 60; + + private val timer by lazy { + Timer() + } + init { initEvent(context) @@ -61,29 +66,30 @@ class SpeedPanelView @JvmOverloads constructor( } } - private val timerTask = object : TimerTask() { - override fun run() { - if (mLatLng != null) { - mSpeedLimmit = MogoMapUIController.getInstance() - .getLimitSpeed(mLatLng!!.longitude, mLatLng!!.latitude, mLatLng!!.bearing) - UiThreadHandler.post { - val speed = (mLatLng!!.speed * 3.6f).toInt() - mSpeedChartView.setArcColor(Color.parseColor(if (speed > mSpeedLimmit) "#DB3137" else "#3E77F6")) - mSpeedChartView.setValues(speed) - setBackgroundResource(if (speed > mSpeedLimmit) R.drawable.yi_biao_pan_bg_speeding else R.drawable.yi_biao_pan_bg_nor) + private var timerTask : TimerTask? = null + + override fun onAttachedToWindow() { + super.onAttachedToWindow() // 注册位置回调 + mMogoServiceApis.registerCenterApi.registerCarLocationChangedListener(TAG, this) + // 开启定时查询速度 + timerTask?.cancel() + val task = object : TimerTask() { + override fun run() { + if (mLatLng != null) { + + mSpeedLimmit = MogoMapUIController.getInstance() + .getLimitSpeed(mLatLng!!.longitude, mLatLng!!.latitude, mLatLng!!.bearing) + UiThreadHandler.post { + val speed = (mLatLng!!.speed * 3.6f).toInt() + mSpeedChartView.setArcColor(Color.parseColor(if (speed > mSpeedLimmit) "#DB3137" else "#3E77F6")) + mSpeedChartView.setValues(speed) + setBackgroundResource(if (speed > mSpeedLimmit) R.drawable.yi_biao_pan_bg_speeding else R.drawable.yi_biao_pan_bg_nor) + } } } } - } - - override fun onAttachedToWindow() { - super.onAttachedToWindow() - // 注册位置回调 - mMogoServiceApis.registerCenterApi - .registerCarLocationChangedListener(TAG, this) - - // 开启定时查询速度 - Timer().schedule(timerTask, Date(), 100) + this.timerTask = task + timer.schedule(task, Date(), 100) } override fun onDetachedFromWindow() { @@ -92,7 +98,7 @@ class SpeedPanelView @JvmOverloads constructor( mMogoServiceApis.registerCenterApi .unregisterMogoLocationListener(TAG) try { - timerTask.cancel() + timerTask?.cancel() } catch (e: Exception) { e.printStackTrace() } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/StatusBarView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/StatusBarView.kt new file mode 100644 index 0000000000..766c2f62b9 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/StatusBarView.kt @@ -0,0 +1,90 @@ +package com.mogo.eagle.core.function.hmi.ui.widget + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.ViewGroup +import android.widget.RelativeLayout +import com.mogo.eagle.core.function.api.setting.IMoGoSkinModeChangeListener +import com.mogo.eagle.core.function.call.setting.CallerSkinModeListenerManager +import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.utilcode.util.BarUtils +import com.mogo.eagle.core.utilcode.util.ScreenUtils +import kotlinx.android.synthetic.main.view_status_bar.view.* +import java.util.concurrent.CopyOnWriteArrayList + +class StatusBarView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : RelativeLayout(context, attrs, defStyleAttr), IMoGoSkinModeChangeListener { + + companion object { + const val TAG = "StatusBarView" + } + + init { + LayoutInflater.from(context).inflate(R.layout.view_status_bar, this, true) + } + + private val rightViewList = CopyOnWriteArrayList() + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + val layoutParamsLeft = + LayoutParams(ScreenUtils.getScreenWidth() / 3, BarUtils.getStatusBarHeight()) + viewStatusBarLeft.layoutParams = layoutParamsLeft + val layoutParamsRight = + LayoutParams(ScreenUtils.getScreenWidth() / 3 * 2, BarUtils.getStatusBarHeight()) + layoutParamsRight.addRule(ALIGN_PARENT_END) + layoutParamsRight.addRule(CENTER_HORIZONTAL) + layoutParamsRight.addRule(CENTER_IN_PARENT) + layoutParamsRight.marginEnd = context.resources.getDimension(R.dimen.dp_44).toInt() + viewStatusBarRight.layoutParams = layoutParamsRight + viewStatusBarRight.addView(BatteryGroupView(this.context)) + + // 添加换肤监听 + CallerSkinModeListenerManager.addListener(TAG, this) + } + + override fun onSkinModeChange(skinMode: Int) { + when (skinMode) { + 0 -> setStatusBarDarkOrLight(false) + 1 -> setStatusBarDarkOrLight(true) + } + } + + fun setStatusBarDarkOrLight(light: Boolean) { + if (light) { + setTextColor(resources.getColor(R.color.color_2C2E30)) + } else { + setTextColor(resources.getColor(R.color.color_FFFFFF)) + } + } + + fun updateRightView(insert: Boolean, tag: String, viewGroup: ViewGroup) { + if (insert) { + rightViewList.add(0, tag) + viewStatusBarRight.addView(viewGroup, 0) + } else { + rightViewList.forEachIndexed { index, s -> + if (s == tag) { + rightViewList.removeAt(index) + viewStatusBarRight.removeViewAt(index) + } + } + } + } + + private fun setTextColor(color: Int) { + viewTextClock.setTextColor(color) + viewStatusBarTag.setTextColor(color) + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + CallerSkinModeListenerManager.removeListener(TAG) + } + +} + diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SteeringWheelView.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SteeringWheelView.java index 67594f090e..34f476121f 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SteeringWheelView.java +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SteeringWheelView.java @@ -3,7 +3,6 @@ package com.mogo.eagle.core.function.hmi.ui.widget; import android.content.Context; import android.graphics.BlurMaskFilter; import android.util.AttributeSet; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.animation.RotateAnimation; @@ -54,12 +53,10 @@ public class SteeringWheelView extends ConstraintLayout { public SteeringWheelView(@NonNull Context context) { super(context); - Log.d(TAG, "1"); } public SteeringWheelView(@NonNull Context context, @Nullable AttributeSet attrs) { super(context, attrs); - Log.d(TAG, "2"); if (AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)) { LayoutInflater.from(context).inflate(R.layout.hmi_steering_wheel_bus, this); } else { @@ -94,12 +91,10 @@ public class SteeringWheelView extends ConstraintLayout { public SteeringWheelView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); - Log.d(TAG, "3"); } public SteeringWheelView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); - Log.d(TAG, "4"); } private final IMoGoAutopilotStatusListener mGoAutopilotStatusListener = new IMoGoAutopilotStatusListener() { @@ -127,7 +122,6 @@ public class SteeringWheelView extends ConstraintLayout { int state = autopilotStatusInfo.getState(); CallerLogger.INSTANCE.d(M_BUS_P + TAG, "state = %s", state); if (autopilotIV != null) { - Log.d(TAG, "autopilotIV != null"); if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) { if (AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)) { // TODO @@ -151,7 +145,7 @@ public class SteeringWheelView extends ConstraintLayout { } } } else { - Log.d(TAG, "autopilotIV=null"); + CallerLogger.INSTANCE.d(TAG, "autopilotIV=null"); } } }); @@ -192,7 +186,6 @@ public class SteeringWheelView extends ConstraintLayout { */ @Override public void onAutopilotLightSwitchData(@org.jetbrains.annotations.Nullable Chassis.LightSwitch lightSwitch) { - Log.d(TAG, "车辆转向灯:" + lightSwitch.toString()); } /** @@ -201,7 +194,6 @@ public class SteeringWheelView extends ConstraintLayout { */ @Override public void onAutopilotBrakeLightData(boolean brakeLight) { - Log.d(TAG, "刹车灯:" + String.valueOf(brakeLight)); } /** @@ -219,7 +211,6 @@ public class SteeringWheelView extends ConstraintLayout { */ @Override public void onAutopilotSteeringData(float steering) { - Log.d(TAG, "steering原始值====" + String.valueOf(steering)); if (Math.abs(steering) < 1) { steering = 0; } @@ -227,7 +218,6 @@ public class SteeringWheelView extends ConstraintLayout { ThreadUtils.runOnUiThread(new Runnable() { @Override public void run() { - Log.d(TAG, "steering忽略小数点后====" + String.valueOf((int) steeringValue)); if (steeringTVL != null && steeringValue > 0) { steeringTVR.setVisibility(View.INVISIBLE); steeringTVL.setVisibility(View.VISIBLE); @@ -237,7 +227,7 @@ public class SteeringWheelView extends ConstraintLayout { steeringTVR.setVisibility(View.VISIBLE); steeringTVR.setText(String.valueOf((int) -steeringValue) + "°"); } else { - Log.d(TAG, "onAutopilotSteeringData error"); + CallerLogger.INSTANCE.d(TAG, "onAutopilotSteeringData error"); } animationWithSteeringData(-steeringValue); if (steeringCircularV != null) { @@ -260,7 +250,7 @@ public class SteeringWheelView extends ConstraintLayout { ThreadUtils.runOnUiThread(new Runnable() { @Override public void run() { - Log.d(TAG, "乘客屏档位" + gear.toString()); + CallerLogger.INSTANCE.d(TAG, "乘客屏档位" + gear.toString()); if (tapPositionView != null) { tapPositionView.updateWithGear(gear); } @@ -288,7 +278,6 @@ public class SteeringWheelView extends ConstraintLayout { * @param steering */ private void animationWithSteeringData(float steering) { - Log.d(TAG, "方向盘转动" + String.valueOf(steering)); rotateAnimation = new RotateAnimation(fromDegrees, steering, RotateAnimation.RELATIVE_TO_SELF, 0.5f, RotateAnimation.RELATIVE_TO_SELF, 0.5f); diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SystemVersionView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SystemVersionView.kt index 4dec896fc6..bfbbb46acb 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SystemVersionView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SystemVersionView.kt @@ -16,7 +16,6 @@ import com.mogo.eagle.core.function.call.bindingcar.CallerBindingCarListenerMana import com.mogo.eagle.core.function.call.bindingcar.CallerBindingcarManager import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger -import com.mogo.eagle.core.utilcode.mogo.logger.Logger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_HMI import com.mogo.eagle.core.utilcode.util.AppUtils import com.mogo.eagle.core.utilcode.util.ThreadUtils diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/TrafficDataView.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/TrafficDataView.java index cc2d7aa78d..dd21592b78 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/TrafficDataView.java +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/TrafficDataView.java @@ -1,5 +1,7 @@ package com.mogo.eagle.core.function.hmi.ui.widget; +import static com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING; + import android.annotation.SuppressLint; import android.content.Context; import android.os.Handler; @@ -15,7 +17,7 @@ import androidx.constraintlayout.widget.ConstraintLayout; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotVehicleStateListener; import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager; -import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotCarStatusListenerManager; +import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotPlanningActionsListenerManager; import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotVehicleStateListenerManager; import com.mogo.eagle.core.function.hmi.R; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; @@ -24,6 +26,7 @@ import com.mogo.eagle.core.utilcode.util.ThreadUtils; import org.jetbrains.annotations.NotNull; import chassis.Chassis; +import mogo.telematics.pad.MessagePad; /** * @author Jing @@ -60,7 +63,7 @@ public class TrafficDataView extends ConstraintLayout { accTextView.setText("- " + accStr); } int state = CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState(); - if (state < 2) { + if (state < STATUS_AUTOPILOT_RUNNING) { if (mBrake > 0) { brakeStatus.setImageResource(R.drawable.traffic_data_brake); } else if (mThrottle >= 0 && mBrake == 0) { @@ -99,11 +102,7 @@ public class TrafficDataView extends ConstraintLayout { super.onAttachedToWindow(); handler.sendEmptyMessageDelayed(MSG_SEND_UPDATE, 1000L); CallerAutopilotVehicleStateListenerManager.INSTANCE.addListener(TAG, mIMoGoAutopilotVehicleStateListener); - CallerAutopilotCarStatusListenerManager.INSTANCE.addListener(TAG, gnssInfo -> { - if (gnssInfo != null) { - acceleration = gnssInfo.getAcceleration(); - } - }); + CallerAutopilotPlanningActionsListenerManager.INSTANCE.addListener(TAG, planningActionMsg -> acceleration = planningActionMsg.getDestinationAcc()); } private void initView(@NonNull Context context) { @@ -119,7 +118,7 @@ public class TrafficDataView extends ConstraintLayout { protected void onDetachedFromWindow() { super.onDetachedFromWindow(); CallerAutopilotVehicleStateListenerManager.INSTANCE.removeListener(TAG); - CallerAutopilotCarStatusListenerManager.INSTANCE.removeListener(TAG); + CallerAutopilotPlanningActionsListenerManager.INSTANCE.removeListener(TAG); } private final IMoGoAutopilotVehicleStateListener mIMoGoAutopilotVehicleStateListener = new IMoGoAutopilotVehicleStateListener() { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/V2XWarningView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/V2XWarningView.kt index 80c0da6125..6bc394fba8 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/V2XWarningView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/V2XWarningView.kt @@ -2,7 +2,6 @@ package com.mogo.eagle.core.function.hmi.ui.widget import android.content.Context import android.util.AttributeSet -import android.util.Log import android.view.LayoutInflater import android.view.View import android.widget.RelativeLayout @@ -53,7 +52,6 @@ class V2XWarningView @JvmOverloads constructor( * @param closeTime 倒计时 */ fun showWarning(direction: WarningDirectionEnum, closeTime: Long) { - Log.d(TAG, "预警红边:预警方向->$direction 预警倒计时->$closeTime") UiThreadHandler.post { // 如果传入的不是关闭显示,则设置倒计时,定时关闭红框警示 if (direction != ALERT_WARNING_NON) { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/VipIdentificationView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/VipIdentificationView.kt index 3692ba8b97..70c1dbd01c 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/VipIdentificationView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/VipIdentificationView.kt @@ -26,12 +26,17 @@ class VipIdentificationView @JvmOverloads constructor( override fun onAttachedToWindow() { super.onAttachedToWindow() val lp = this.layoutParams as LayoutParams - if (AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)) { - lp.marginStart = resources.getDimension(R.dimen.module_vip_margin_left_bus).toInt() - lp.topMargin = resources.getDimension(R.dimen.module_vip_margin_top_bus).toInt() + if (AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode) + && AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { + lp.marginStart = resources.getDimension(R.dimen.module_vip_margin_left_bus_passenger).toInt() + lp.topMargin = resources.getDimension(R.dimen.module_vip_margin_top_passenger).toInt() + } else if (AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode) + && AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { + lp.marginStart = resources.getDimension(R.dimen.module_vip_margin_left_taxi_passenger).toInt() + lp.topMargin = resources.getDimension(R.dimen.module_vip_margin_top_passenger).toInt() } else { - lp.marginStart = resources.getDimension(R.dimen.module_vip_margin_left_taxi).toInt() - lp.topMargin = resources.getDimension(R.dimen.module_vip_margin_top_taxi).toInt() + lp.marginStart = resources.getDimension(R.dimen.module_vip_margin_left).toInt() + lp.topMargin = resources.getDimension(R.dimen.module_vip_margin_top).toInt() } this.layoutParams = lp invalidate() diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/WifiStateView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/WifiStateView.kt new file mode 100644 index 0000000000..c5c11e034a --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/WifiStateView.kt @@ -0,0 +1,127 @@ +package com.mogo.eagle.core.function.hmi.ui.widget + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.net.wifi.WifiManager +import android.os.Handler +import android.os.Message +import android.util.AttributeSet +import androidx.appcompat.widget.AppCompatImageView +import com.mogo.eagle.core.function.api.setting.IMoGoSkinModeChangeListener +import com.mogo.eagle.core.function.call.setting.CallerSkinModeListenerManager +import com.mogo.eagle.core.function.hmi.R +import java.lang.ref.WeakReference + + +class WifiStateView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : AppCompatImageView(context, attrs, defStyleAttr), IMoGoSkinModeChangeListener { + + companion object { + const val TAG = "WifiStateView" + + class WifiHandler(wifiStateView: WifiStateView) : Handler() { + + //虚引用 + private var stateViewWeakReference: WeakReference? = null + + init { + stateViewWeakReference = WeakReference(wifiStateView) + } + + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val wifiStateView = stateViewWeakReference?.get() + wifiStateView?.updateView(msg.what) { + wifiStateView.setImageResource(it) + } + } + } + } + + private var wifiManager: WifiManager? = null + private var wifiHandler: WifiHandler? = null + + @Volatile + private var mSkinMode: Int = 0 + + @Volatile + private var level: Int = 0 + + init { + wifiManager = + context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager? + wifiHandler = WifiHandler(this) + } + + private val wifiStateReceiver: BroadcastReceiver = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + when (intent.action) { + WifiManager.WIFI_STATE_CHANGED_ACTION, WifiManager.RSSI_CHANGED_ACTION -> { + if (wifiManager!!.wifiState == WifiManager.WIFI_STATE_DISABLED + || wifiManager!!.wifiState == WifiManager.WIFI_STATE_DISABLING + ) { + wifiHandler?.sendEmptyMessage(-1) + return + } + val wifiInfo = wifiManager!!.connectionInfo + level = WifiManager.calculateSignalLevel(wifiInfo.rssi, 5) + wifiHandler?.sendEmptyMessage(level) + } + } + } + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + val intentFilter = IntentFilter() + //Wifi连接状态变化 + intentFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION) + //Wifi信号强度变化 + intentFilter.addAction(WifiManager.RSSI_CHANGED_ACTION) + context.registerReceiver(wifiStateReceiver, intentFilter) + // 添加换肤监听 + CallerSkinModeListenerManager.addListener(TAG, this) + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + wifiHandler?.removeCallbacksAndMessages(null) + context.unregisterReceiver(wifiStateReceiver) + CallerSkinModeListenerManager.removeListener(TAG) + } + + override fun onSkinModeChange(skinMode: Int) { + mSkinMode = skinMode + wifiHandler?.sendEmptyMessage(level) + } + + fun updateView(wifiState: Int, resId: ((Int) -> Unit)) { + when (mSkinMode) { + 0 -> { + when (wifiState) { + -1 -> resId.invoke(R.drawable.wifi_light_state_close) + 0 -> resId.invoke(R.drawable.wifi_light_state_one) + 1 -> resId.invoke(R.drawable.wifi_light_state_two) + 2 -> resId.invoke(R.drawable.wifi_light_state_three) + 3 -> resId.invoke(R.drawable.wifi_light_state_four) + 4 -> resId.invoke(R.drawable.wifi_light_state_five) + } + } + 1 -> { + when (wifiState) { + -1 -> resId.invoke(R.drawable.wifi_light_state_close) + 0 -> resId.invoke(R.drawable.wifi_dark_state_one) + 1 -> resId.invoke(R.drawable.wifi_dark_state_two) + 2 -> resId.invoke(R.drawable.wifi_dark_state_three) + 3 -> resId.invoke(R.drawable.wifi_dark_state_four) + 4 -> resId.invoke(R.drawable.wifi_dark_state_five) + } + } + } + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/KoomInitTask.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/KoomInitTask.kt new file mode 100644 index 0000000000..4fb06a0f67 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/KoomInitTask.kt @@ -0,0 +1,24 @@ +package com.mogo.eagle.core.function.main + +import android.app.Application +import android.os.Build +import com.kwai.koom.base.CommonConfig +import com.kwai.koom.base.InitTask +import com.kwai.koom.base.MonitorManager + +object KoomInitTask : InitTask { + override fun init(application: Application) { + val config = CommonConfig.Builder() + .setApplication(application) // Set application + .setDebugMode(false) + .setVersionNameInvoker { "1.0.0" } // Set version name, java leak feature use it + .setSdkVersionMatch( + Build.VERSION.SDK_INT <= 31 && Build.VERSION.SDK_INT + >= Build.VERSION_CODES.LOLLIPOP + ) // Set if current sdk version is supported + .build() + + MonitorManager.initCommonConfig(config) + .apply { onApplicationCreate() } + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainActivity.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainActivity.java index 5fabab1775..bded69ba63 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainActivity.java +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainActivity.java @@ -1,5 +1,8 @@ package com.mogo.eagle.core.function.main; +import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_ALIAS_CODE_RECORD_NATIVE_LEAK; +import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_LINK_LEAK; +import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_LINK_LOG_NATIVE_LEAK; import static com.mogo.eagle.core.function.main.MainPresenter.MOGO_PERMISSION_REQUEST_CODE; import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_HMI; @@ -8,7 +11,9 @@ import android.content.pm.PackageManager; import android.os.Build; import android.os.Bundle; import android.provider.Settings; +import android.view.Gravity; import android.view.View; +import android.view.ViewGroup; import android.widget.FrameLayout; import androidx.annotation.NonNull; @@ -19,8 +24,12 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.alibaba.android.arouter.launcher.ARouter; -import com.mogo.cloud.commons.BuildConfig; +import com.kwai.koom.base.MonitorManager; +import com.kwai.koom.nativeoom.leakmonitor.LeakMonitor; +import com.kwai.koom.nativeoom.leakmonitor.LeakMonitorConfig; +import com.kwai.koom.nativeoom.leakmonitor.LeakRecord; import com.mogo.commons.context.ContextHolderUtil; +import com.mogo.commons.debug.DebugConfig; import com.mogo.commons.mvp.BaseFragment; import com.mogo.commons.mvp.MvpActivity; import com.mogo.commons.mvp.MvpFragment; @@ -31,6 +40,7 @@ import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener; import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager; import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager; import com.mogo.eagle.core.function.hmi.R; +import com.mogo.eagle.core.function.hmi.ui.widget.StatusBarView; import com.mogo.eagle.core.function.main.cards.MogoModulesManager; import com.mogo.eagle.core.function.main.service.MogoMainService; import com.mogo.eagle.core.function.main.stagetwo.AutopilotStartup; @@ -40,6 +50,7 @@ import com.mogo.eagle.core.utilcode.mogo.AppLaunchTimeUtils; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.mogo.permissions.PermissionsDialogUtils; import com.mogo.eagle.core.utilcode.mogo.toast.ResourcesHelper; +import com.mogo.eagle.core.utilcode.util.BarUtils; import com.mogo.eagle.core.utilcode.util.NetworkUtils; import com.mogo.eagle.core.utilcode.util.ProcessUtils; import com.mogo.map.listener.IMogoHosListenerRegister; @@ -54,6 +65,8 @@ import com.mogo.service.statusmanager.IMogoStatusManager; import com.rousetime.android_startup.StartupManager; import com.rousetime.android_startup.model.LoggerLevel; import com.rousetime.android_startup.model.StartupConfig; +import com.zhjt.service.chain.ChainLog; +import com.zhjt.service.chain.TracingConstants; import java.util.ArrayList; import java.util.HashMap; @@ -106,6 +119,7 @@ public class MainActivity extends MvpActivity implement @Override protected void initViews() { + injectStatusBar(); getWindow().setBackgroundDrawable(null); mFloatingLayout = findViewById(R.id.module_main_id_floating_view); @@ -126,6 +140,24 @@ public class MainActivity extends MvpActivity implement } } + private void injectStatusBar() { + FrameLayout decorView =(FrameLayout) this.getWindow().getDecorView(); + View contentView = ((ViewGroup)decorView.findViewById(android.R.id.content)).getChildAt(0); + contentView.setFitsSystemWindows(false); + decorView.setClipToPadding(false); + + View statusBarView = decorView.findViewWithTag("status_bar"); + if (statusBarView == null) { + statusBarView = new StatusBarView(this); + statusBarView.setTag("status_bar"); + } + FrameLayout.LayoutParams statusBarLP = + new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, BarUtils.getStatusBarHeight()); + statusBarLP.topMargin = 0; + statusBarLP.gravity = Gravity.TOP; + decorView.addView(statusBarView, statusBarLP); + } + // 隐藏布局 protected void hideLayout() { mFloatingLayout.setVisibility(View.GONE); @@ -164,6 +196,7 @@ public class MainActivity extends MvpActivity implement @Override public void onWindowFocusChanged(boolean hasFocus) { + super.onWindowFocusChanged(hasFocus); if (hasFocus) { // 统计代码 final Map properties = new HashMap<>(); @@ -208,7 +241,7 @@ public class MainActivity extends MvpActivity implement */ public void startUpInStage2() { StartupConfig config = null; - if (BuildConfig.DEBUG) { + if (DebugConfig.isDebug()) { config = new StartupConfig.Builder() .setLoggerLevel(LoggerLevel.DEBUG) .setOpenStatistics(true) @@ -274,6 +307,10 @@ public class MainActivity extends MvpActivity implement // 启动一些基本的服务:定位等 startBaseService(); + if (DebugConfig.isDebug()) { + // 启动Native内存泄漏监测 + startLeakMonitor(); + } } /** @@ -288,6 +325,42 @@ public class MainActivity extends MvpActivity implement // startService(intentCarcorderService); } + private void startLeakMonitor() { + LeakMonitorConfig leakMonitorConfig = new LeakMonitorConfig.Builder() + .setLoopInterval(50000) + .setMonitorThreshold(16) + .setNativeHeapAllocatedThreshold(0) + .setSelectedSoList(new String[]{"libhdmap", "libmap", + "libAMapSDK_NAVI_v8_0_1", "libZegoExpressEngine", + "libcntts" + }) + .setEnableLocalSymbolic(DebugConfig.isDebug()) + .setLeakListener(leaks -> { + StringBuilder stringBuilder = new StringBuilder(); + if (!leaks.isEmpty()) { + for (LeakRecord leakRecord : leaks) { + stringBuilder.append(leakRecord.toString()); + } + printLeakMsg(stringBuilder.toString()); + } + }) + .build(); + MonitorManager.addMonitorConfig(leakMonitorConfig); + LeakMonitor.INSTANCE.start(); + } + + @ChainLog( + linkChainLog = CHAIN_LINK_LOG_NATIVE_LEAK, + linkCode = CHAIN_LINK_LEAK, + endpoint = TracingConstants.Endpoint.PAD, + nodeAliasCode = CHAIN_ALIAS_CODE_RECORD_NATIVE_LEAK, + paramIndexes = {0}, + clientPkFileName = "sn" + ) + private void printLeakMsg(String leakRecord) { + CallerLogger.INSTANCE.d(M_HMI + TAG, "内存泄漏日志如下:\n" + leakRecord); + } + @Override public void hideCoverUpLayout() { mConnectInfoRV.setVisibility(View.GONE); @@ -388,7 +461,8 @@ public class MainActivity extends MvpActivity implement } @Override - public void onAutopilotIpcConnectStatusChanged(int status, @Nullable String reason) { } + public void onAutopilotIpcConnectStatusChanged(int status, @Nullable String reason) { + } @Override public void onAutopilotSNRequest() { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainLauncherActivity.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainLauncherActivity.java index 5a12bbc6fb..5e4b73b40e 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainLauncherActivity.java +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainLauncherActivity.java @@ -5,11 +5,17 @@ import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_LINK_INIT; import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_LINK_LOG_CONNECT_STATUS; import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_HMI; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; import android.content.Intent; +import android.content.IntentFilter; import android.os.Bundle; import android.os.Handler; import android.os.Process; import android.text.TextUtils; +import android.util.Log; +import android.view.KeyEvent; +import android.view.MotionEvent; import android.widget.FrameLayout; import androidx.annotation.Nullable; @@ -19,11 +25,18 @@ import com.mogo.commons.debug.DebugConfig; import com.mogo.eagle.core.data.config.FunctionBuildConfig; import com.mogo.eagle.core.function.api.base.IMoGoFunctionProvider; import com.mogo.eagle.core.function.api.setting.IMoGoSkinModeChangeListener; +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager; +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager; +import com.mogo.eagle.core.function.call.hmi.CallerHmiManager; import com.mogo.eagle.core.function.call.setting.CallerSkinModeListenerManager; import com.mogo.eagle.core.function.hmi.R; +import com.mogo.eagle.core.function.main.moujie.BluetoothMonitorReceiver; +import com.mogo.eagle.core.function.main.moujie.ConnectBluetoothEvent; import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; -import com.mogo.eagle.core.utilcode.util.BarUtils; +import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr; +import com.mogo.eagle.core.utilcode.util.ToastUtils; +import com.mogo.eagle.core.utilcode.util.UiThreadHandler; import com.mogo.service.intent.IMogoIntentListener; import com.rousetime.android_startup.model.CostTimesModel; import com.zhjt.service.chain.ChainLog; @@ -31,8 +44,15 @@ import com.zhjt.service.chain.TracingConstants; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; import java.util.List; +import java.util.Set; +import java.util.Timer; +import java.util.TimerTask; /** * 针对作为Launcher的情况,做个性化操作 @@ -45,12 +65,45 @@ public class MainLauncherActivity extends MainActivity implements IMogoIntentLis private final static Handler handlerV2XEvent = new Handler(); private static Runnable runnableV2XEvent; + private volatile double accelerated;//加速度 + private Timer timerHorn; + private Timer timerAcc; + + private BluetoothMonitorReceiver mBluetoothReceiver = null; + private BluetoothAdapter mBluetoothAdapter; +// private List mAreadlyConnectedList = new ArrayList<>();//已连接设备集合 + private int numberA = 0; + private boolean isLongPressA = false; + private int numberB = 0; + private boolean isLongPressB = false; + private int numberC = 0; + private boolean isLongPressC = false; + private int numberD = 0; + private boolean isLongPressD = false; + private int numberE = 0; + private boolean isLongPressE = false; + + @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); DebugConfig.setNeedRequestUserInfo(true); EventBus.getDefault().register(this); CallerLogger.INSTANCE.i(M_HMI + TAG, "onCreate"); + + } + + @Override + protected void onResume() { + super.onResume(); + + initBluetooth(); + mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); + if (!mBluetoothAdapter.isEnabled()) { + mBluetoothAdapter.enable(); + } + mBluetoothAdapter.startDiscovery(); + showBondedDevice(mBluetoothAdapter); } @Override @@ -155,12 +208,209 @@ public class MainLauncherActivity extends MainActivity implements IMogoIntentLis } } + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + return super.onKeyDown(keyCode, event); + } + + + @Override + public boolean dispatchKeyEvent(KeyEvent event) { +// Log.d("liyz", "dispatchKeyEvent code = " + event.getKeyCode() + "--action = " + event.getAction() + "----" + event); + String bluetoothName = SharedPrefsMgr.getInstance(getContext()).getString("BLUETOOTH"); + if (bluetoothName.equals("MINI_KEYBOARD")) { + if (event.getKeyCode() == KeyEvent.KEYCODE_A) { //单击向左变道,长按-1 + if (event.getAction() == KeyEvent.ACTION_DOWN) { + numberA++; + if (numberA > 2) { + if (!isLongPressA) { + ToastUtils.showShort("方块 长按A -2 "); + sendAcc(true, -2); + isLongPressA = true; + } + } + } else if (event.getAction() == KeyEvent.ACTION_UP) { + if (numberA == 1) { + ToastUtils.showShort("方块 点击A -1 "); + sendAcc(true, -1); + } + numberA = 0; + isLongPressA = false; + } + return true; + } else if (event.getKeyCode() == KeyEvent.KEYCODE_B) { //单击向右变道,长按-2 + if (event.getAction() == KeyEvent.ACTION_DOWN) { + numberB++; + if (numberB > 2) { + if (!isLongPressB) { + ToastUtils.showShort("方块 长按B 无操作 "); + isLongPressB = true; + } + } + } else if (event.getAction() == KeyEvent.ACTION_UP) { + if (numberB == 1) { + ToastUtils.showShort("方块 单击B 复原 "); + sendAcc(false, 0.0); + } + numberB = 0; + isLongPressB = false; + } + return true; + } else if (event.getKeyCode() == KeyEvent.KEYCODE_C) { //单击鸣笛, + if (event.getAction() == KeyEvent.ACTION_DOWN) { + numberC++; + if (numberC > 2) { + if (!isLongPressC) { + ToastUtils.showShort("方块 长按C 无操作"); + isLongPressC = true; + } + } + } else if (event.getAction() == KeyEvent.ACTION_UP) { + if (numberC == 1) { + ToastUtils.showShort("方块 单击C ← 向左变道 "); + CallerAutoPilotManager.INSTANCE.sendOperatorChangeLaneLeft(); + } + numberC = 0; + isLongPressC = false; + } + return true; + } else if (event.getKeyCode() == KeyEvent.KEYCODE_D) { //单击开启自动驾驶, + if (event.getAction() == KeyEvent.ACTION_DOWN) { + numberD++; + if (numberD > 2) { + if (!isLongPressD) { + ToastUtils.showShort("方块 长按D 无操作"); + isLongPressD = true; + } + } + } else if (event.getAction() == KeyEvent.ACTION_UP) { + if (numberD == 1) { + ToastUtils.showShort("方块 单击D → 向右变道 "); + CallerAutoPilotManager.INSTANCE.sendOperatorChangeLaneRight(); + } + numberD = 0; + isLongPressD = false; + } + return true; + } else if (event.getKeyCode() == KeyEvent.KEYCODE_E) { //单击复原, + if (event.getAction() == KeyEvent.ACTION_DOWN) { + numberE++; + if (numberE > 2) { + if (!isLongPressE) { + ToastUtils.showShort("方块 长按E 鸣笛 "); + CallerAutoPilotManager.INSTANCE.sendOperatorSetHorn(1); + if (timerHorn == null) { + timerHorn = new Timer(); + } + timerHorn.schedule(new TimerTask() { + @Override + public void run() { + CallerAutoPilotManager.INSTANCE.sendOperatorSetHorn(2); + timerHorn = null; + } + }, 500); + isLongPressE = true; + } + } + } else if (event.getAction() == KeyEvent.ACTION_UP) { + if (numberE == 1) { + ToastUtils.showShort("方块 单击E 开启自动驾驶 "); +// CallerAutoPilotManager.INSTANCE.setControlAutopilotCarAuto(true); + CallerAutoPilotManager.INSTANCE.startAutoPilot(CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getAutopilotControlParameters()); + } + numberE = 0; + isLongPressE = false; + } + return true; + } + } + + return super.dispatchKeyEvent(event); + } + + @Override + public boolean dispatchTouchEvent(MotionEvent event) { + + return super.dispatchTouchEvent(event); + } + @Override public void onSkinModeChange(int skinMode) { - if (skinMode == 0) { - BarUtils.setStatusBarLightMode(this, false); + + } + + private synchronized void sendAcc(boolean isSend, double acc) { + if (isSend) { + accelerated = acc; + if (timerAcc == null) { + timerAcc = new Timer(); + timerAcc.schedule(new TimerTask() { + @Override + public void run() { + CallerAutoPilotManager.INSTANCE.sendOperatorSetAcceleratedSpeed(accelerated); + } + }, 0, 500); + } } else { - BarUtils.setStatusBarLightMode(this, true); + if (timerAcc != null) { + timerAcc.cancel(); + timerAcc = null; + } + CallerAutoPilotManager.INSTANCE.sendOperatorSetAcceleratedSpeed(acc); } } + + /** + * 初始化蓝牙广播 + */ + private void initBluetooth() { + this.mBluetoothReceiver = new BluetoothMonitorReceiver(); + IntentFilter intentFilter = new IntentFilter(); + // 监视蓝牙关闭和打开的状态 + intentFilter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED); + + // 监视蓝牙设备与APP连接的状态 + intentFilter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED); + intentFilter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED); + + // 注册广播 + registerReceiver(this.mBluetoothReceiver, intentFilter); + } + + /** + * 查找蓝牙连接过的蓝牙设备 + * + */ + private void showBondedDevice(BluetoothAdapter bluetoothAdapter) { +// mAreadlyConnectedList.clear(); + Set deviceList = bluetoothAdapter.getBondedDevices(); + for (BluetoothDevice device : deviceList) { + try { + //使用反射调用获取设备连接状态方法 + Method isConnectedMethod = BluetoothDevice.class.getDeclaredMethod("isConnected", (Class[]) null); + isConnectedMethod.setAccessible(true); + boolean isConnected = (boolean) isConnectedMethod.invoke(device, (Object[]) null); +// mAreadlyConnectedList.add(device); +// Log.d("liyz", "-- device.getName() = " + device.getName()); //device.getAddress() + if (device.getName().equals("MINI_KEYBOARD")) { + SharedPrefsMgr.getInstance(getContext()).putString("BLUETOOTH", device.getName()); + } + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + } + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onAutoConnection(ConnectBluetoothEvent event) { +// connectBluetooth(); + } + + } + + diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainMoGoApplication.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainMoGoApplication.java index b8e0c0560f..2c01c33429 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainMoGoApplication.java +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainMoGoApplication.java @@ -7,9 +7,10 @@ import android.os.Process; import com.bytedance.boost_multidex.BoostMultiDex; import com.elegant.utils.UiThreadHandler; -import com.mogo.cloud.passport.MoGoAiCloudClientConfig; import com.mogo.cloud.socket.SocketBuildConfig; import com.mogo.commons.AbsMogoApplication; +import com.mogo.commons.debug.DebugConfig; +import com.mogo.commons.voice.AIAssist; import com.mogo.eagle.core.data.config.FunctionBuildConfig; import com.mogo.eagle.core.data.constants.MoGoConfig; import com.mogo.eagle.core.data.constants.MogoServicePaths; @@ -28,8 +29,12 @@ import com.mogo.module.common.MogoModule; import com.mogo.module.common.MogoModulePaths; import com.mogo.module.service.ServiceConst; import com.zhidao.support.obu.ami.AmiClientManager; +import com.zhjt.mogo_core_function_devatools.monitor.db.CpuInfo; +import com.zhjt.mogo_core_function_devatools.monitor.db.MemInfo; +import com.zhjt.mogo_core_function_devatools.monitor.db.MonitorDb; import java.lang.reflect.Field; +import java.util.List; /** * 默认初始化一些基础服务配置 @@ -37,8 +42,6 @@ import java.lang.reflect.Field; public abstract class MainMoGoApplication extends AbsMogoApplication { private static final String TAG = "MogoApplication"; - // 配置云服务API - protected MoGoAiCloudClientConfig clientConfig = MoGoAiCloudClientConfig.getInstance(); private long start; @Override @@ -54,10 +57,14 @@ public abstract class MainMoGoApplication extends AbsMogoApplication { initCrashConfig(); initLogConfig(); initTipToast(); + AIAssist.getInstance(this); initModules(); - + if (DebugConfig.isDebug()) { + initKoom(); + } //查询是否有版本的更新 queryAppUpgrade(); + checkMonitorDb(); } @Override @@ -72,7 +79,23 @@ public abstract class MainMoGoApplication extends AbsMogoApplication { public void run() { CallerBindingcarManager.getBindingcarProvider().queryAppUpgrade(); } - },5000); + },9000); + } + + private void checkMonitorDb() { + new Thread(() -> { + long limitId = 50001; + List cpuList = MonitorDb.getDb(this).monitorDao().getAllCPUById(limitId); + List memList = MonitorDb.getDb(this).monitorDao().getAllMemById(limitId); + // 大于5w条清除 + if (cpuList.size() > 0 || memList.size() > 0) { + this.deleteDatabase(MonitorDb.INTERNAL_DB_NAME); + } + }).start(); + } + + private void initKoom() { + KoomInitTask.INSTANCE.init(this); } /** @@ -94,7 +117,7 @@ public abstract class MainMoGoApplication extends AbsMogoApplication { } SocketBuildConfig.isPrintLog = false; // 初始化DevaTools,开始链路记录 - CallerDevaToolsManager.INSTANCE.init(this); + CallerDevaToolsManager.INSTANCE.init(); } private void initOverviewDb() { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/moujie/BluetoothMonitorReceiver.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/moujie/BluetoothMonitorReceiver.java new file mode 100644 index 0000000000..a968560284 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/moujie/BluetoothMonitorReceiver.java @@ -0,0 +1,62 @@ +package com.mogo.eagle.core.function.main.moujie; + +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.util.Log; +import android.widget.Toast; + +import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr; + +import org.greenrobot.eventbus.EventBus; + +/** + * @author lixiaopeng + * @description + * @since 2022/7/29 + */ +public class BluetoothMonitorReceiver extends BroadcastReceiver { + + @Override + public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + if (action != null) { + switch (action) { + case BluetoothAdapter.ACTION_STATE_CHANGED: + int blueState = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, 0); + switch (blueState) { + case BluetoothAdapter.STATE_TURNING_ON: +// Toast.makeText(context, "蓝牙正在打开", Toast.LENGTH_SHORT).show(); + break; + case BluetoothAdapter.STATE_ON: +// Toast.makeText(context, "蓝牙已经打开", Toast.LENGTH_SHORT).show(); + EventBus.getDefault().post(new ConnectBluetoothEvent()); + break; + case BluetoothAdapter.STATE_TURNING_OFF: +// Toast.makeText(context, "蓝牙正在关闭", Toast.LENGTH_SHORT).show(); + break; + case BluetoothAdapter.STATE_OFF: +// Toast.makeText(context, "蓝牙已经关闭", Toast.LENGTH_SHORT).show(); + break; + } + break; + + case BluetoothDevice.ACTION_ACL_CONNECTED: +// Toast.makeText(context, "蓝牙设备已连接", Toast.LENGTH_SHORT).show(); +// SharedPrefsMgr.getInstance(context).putBoolean("BLUETOOTH", true); + break; + + case BluetoothDevice.ACTION_ACL_DISCONNECTED: +// SharedPrefsMgr.getInstance(context).putBoolean("BLUETOOTH", false); +// Toast.makeText(context, "蓝牙设备已断开", Toast.LENGTH_SHORT).show(); + EventBus.getDefault().post(new ConnectBluetoothEvent()); + break; + } + + } + + } + +} diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/moujie/ConnectBluetoothEvent.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/moujie/ConnectBluetoothEvent.java new file mode 100644 index 0000000000..750e92e49d --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/moujie/ConnectBluetoothEvent.java @@ -0,0 +1,10 @@ +package com.mogo.eagle.core.function.main.moujie; + +/** + * @author lixiaopeng + * @description 连接蓝牙事件 + * @since 2022/8/16 + */ +public class ConnectBluetoothEvent { + +} diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/service/MogoMainService.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/service/MogoMainService.java index 3e9ac110d3..c8c2bd0bad 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/service/MogoMainService.java +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/service/MogoMainService.java @@ -67,7 +67,7 @@ class MogoMainService extends Service implements IMogoLocationListener { @Override public int onStartCommand(Intent intent, int flags, int startId) { - return START_STICKY; + return START_NOT_STICKY; } private void initAndStartLocation() { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi-2560x1440/icon_bus_operation_status.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi-2560x1440/icon_bus_operation_status.png new file mode 100755 index 0000000000..3bb32ec0aa Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi-2560x1440/icon_bus_operation_status.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi-2560x1440/icon_bus_operation_status_un.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi-2560x1440/icon_bus_operation_status_un.png new file mode 100755 index 0000000000..de0935fe4d Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi-2560x1440/icon_bus_operation_status_un.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi-2560x1440/icon_take_over_request.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi-2560x1440/icon_take_over_request.png new file mode 100644 index 0000000000..11b42eaa3d Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi-2560x1440/icon_take_over_request.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_bus_operation_status.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_bus_operation_status.png new file mode 100755 index 0000000000..3bb32ec0aa Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_bus_operation_status.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_bus_operation_status_un.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_bus_operation_status_un.png new file mode 100755 index 0000000000..de0935fe4d Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_bus_operation_status_un.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/close_nor.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/close_nor.png new file mode 100644 index 0000000000..2e2017cb27 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/close_nor.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/debug_icon_sop.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/debug_icon_sop.png new file mode 100644 index 0000000000..85809efdf3 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/debug_icon_sop.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_account_head.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_account_head.png new file mode 100755 index 0000000000..c9de0b61b9 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_account_head.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_add.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_add.png new file mode 100644 index 0000000000..429d1196be Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_add.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_bus_operation_status.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_bus_operation_status.png new file mode 100755 index 0000000000..3bb32ec0aa Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_bus_operation_status.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_bus_operation_status_un.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_bus_operation_status_un.png new file mode 100755 index 0000000000..de0935fe4d Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_bus_operation_status_un.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_reduce.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_reduce.png new file mode 100644 index 0000000000..aa10f4b5de Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_reduce.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_speed_add.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_speed_add.png new file mode 100644 index 0000000000..bbd0601d27 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_speed_add.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_speed_reduce.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_speed_reduce.png new file mode 100644 index 0000000000..905094d461 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_speed_reduce.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/battery_charge_dark.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/battery_charge_dark.png new file mode 100644 index 0000000000..02cea388b5 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/battery_charge_dark.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/battery_charge_light.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/battery_charge_light.png new file mode 100644 index 0000000000..92df72187c Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/battery_charge_light.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/blue_tooth.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/blue_tooth.png new file mode 100644 index 0000000000..97eaf32b50 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/blue_tooth.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bus_autopilot_text_color_selector.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bus_autopilot_text_color_selector.xml new file mode 100644 index 0000000000..15f6897792 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bus_autopilot_text_color_selector.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bus_operation_status_bg_selector1.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bus_operation_status_bg_selector1.xml new file mode 100755 index 0000000000..6553f76cc4 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bus_operation_status_bg_selector1.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/demo_mode.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/demo_mode.png new file mode 100644 index 0000000000..380b81e942 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/demo_mode.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/icon_take_over_request.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/icon_take_over_request.png new file mode 100644 index 0000000000..11b42eaa3d Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/icon_take_over_request.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/pnc_actions_bg.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/pnc_actions_bg.png new file mode 100644 index 0000000000..7d8e46f213 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/pnc_actions_bg.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/radio_button_lock_background.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/radio_button_lock_background.xml new file mode 100644 index 0000000000..db91c70905 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/radio_button_lock_background.xml @@ -0,0 +1,15 @@ + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/taxi_loginout_bg.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/taxi_loginout_bg.xml new file mode 100644 index 0000000000..cab42294b4 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/taxi_loginout_bg.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/taxi_loginout_sure_bg.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/taxi_loginout_sure_bg.xml new file mode 100644 index 0000000000..d681263571 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/taxi_loginout_sure_bg.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/wifi_dark_state_five.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/wifi_dark_state_five.png new file mode 100644 index 0000000000..35355cfe86 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/wifi_dark_state_five.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/wifi_dark_state_four.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/wifi_dark_state_four.png new file mode 100644 index 0000000000..5d468b24fc Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/wifi_dark_state_four.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/wifi_dark_state_one.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/wifi_dark_state_one.png new file mode 100644 index 0000000000..df81af8117 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/wifi_dark_state_one.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/wifi_dark_state_three.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/wifi_dark_state_three.png new file mode 100644 index 0000000000..ab0c000aab Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/wifi_dark_state_three.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/wifi_dark_state_two.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/wifi_dark_state_two.png new file mode 100644 index 0000000000..351b04b150 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/wifi_dark_state_two.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/wifi_light_state_close.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/wifi_light_state_close.png new file mode 100644 index 0000000000..7090814f91 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/wifi_light_state_close.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/wifi_light_state_five.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/wifi_light_state_five.png new file mode 100644 index 0000000000..8f48f53e24 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/wifi_light_state_five.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/wifi_light_state_four.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/wifi_light_state_four.png new file mode 100644 index 0000000000..56e484f3ca Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/wifi_light_state_four.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/wifi_light_state_one.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/wifi_light_state_one.png new file mode 100644 index 0000000000..1b06cb152d Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/wifi_light_state_one.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/wifi_light_state_three.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/wifi_light_state_three.png new file mode 100644 index 0000000000..1ee2dcd8fe Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/wifi_light_state_three.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/wifi_light_state_two.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/wifi_light_state_two.png new file mode 100644 index 0000000000..6f88fb8307 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/wifi_light_state_two.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/dialog_upgrade_app.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/dialog_upgrade_app.xml index 0850212f75..54fecfe8d0 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/dialog_upgrade_app.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/dialog_upgrade_app.xml @@ -2,7 +2,7 @@ @@ -10,7 +10,7 @@ android:id="@+id/tv_upgrade_title" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="50px" + android:layout_marginTop="30px" android:text="@string/application_upgrade" android:textColor="#FFFFFFFF" android:textSize="56px" @@ -22,7 +22,7 @@ android:id="@+id/tv_upgrade_tips" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="50px" + android:layout_marginTop="30px" android:text="@string/application_upgrade_confirm" android:textColor="#FFFFFFFF" android:textSize="43px" @@ -30,15 +30,32 @@ app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="@id/tv_upgrade_title" /> + + + app:layout_constraintTop_toBottomOf="@id/tv_upgrade_content" /> + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/fragment_hmi.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/fragment_hmi.xml index 64c1661753..45d79417e2 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/fragment_hmi.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/fragment_hmi.xml @@ -8,7 +8,7 @@ + + + + + app:layout_constraintTop_toTopOf="@+id/viewLimitingVelocity" + app:layout_goneMarginEnd="40px" + app:layout_goneMarginTop="30px" /> diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_auto_pilot_check.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_auto_pilot_check.xml index cb55f1540f..fcdc0ab192 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_auto_pilot_check.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_auto_pilot_check.xml @@ -17,24 +17,35 @@ android:layout_width="match_parent" android:layout_height="wrap_content"> - + + + android:orientation="horizontal" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.0" + app:layout_constraintStart_toStartOf="@+id/tv_check_title" + app:layout_constraintTop_toBottomOf="@+id/v_second_group"> + + + + + + + + + + + + + + + + app:layout_constraintBottom_toBottomOf="@+id/v_second_group" + app:layout_constraintStart_toEndOf="@+id/v_second_group" + app:layout_constraintTop_toTopOf="@+id/v_second_group" /> + app:layout_constraintTop_toBottomOf="@id/sopLayout" /> + app:layout_constraintTop_toBottomOf="@id/sopLayout" /> - + app:layout_constraintTop_toBottomOf="@id/tvSpeedTitle" + /> - + - + - + + + + app:layout_constraintTop_toBottomOf="@id/ivSpeedReduce" /> + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_blue_tooth.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_blue_tooth.xml new file mode 100644 index 0000000000..e5e6fcb799 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_blue_tooth.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_camera_list.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_camera_list.xml index b043efbb09..379e8e32d4 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_camera_list.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_camera_list.xml @@ -5,8 +5,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@color/notice_check_dialog_bg_color" - android:minWidth="777px" - android:minHeight="485px" + android:minWidth="882px" + android:minHeight="550px" app:roundLayoutRadius="30px"> @@ -68,8 +68,8 @@ + app:layout_constraintTop_toTopOf="@id/tbReportMore" /> + android:layout_height="wrap_content" /> + android:layout_height="wrap_content" /> + android:layout_height="wrap_content" /> + android:layout_height="wrap_content" /> + android:minLines="7" /> + android:textSize="@dimen/dp_24" /> + + + + + +