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..734edccdd6 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 @@ -8,13 +8,17 @@ 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 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 +29,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 +38,61 @@ public class BusPassengerLineStationsAdapter extends RecyclerView.Adapter 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/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 2) { + if (mLinePointsLatLng.size() > 2) { //设置线段纹理 PolylineOptions polylineOptions = new PolylineOptions(); 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..dfc9495007 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,7 +10,6 @@ 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; @@ -24,6 +23,7 @@ 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; @@ -58,6 +58,7 @@ public class BusPassengerRouteFragment extends private RotateAnimation rotateAnimation; private float lastBearing = 0; private BusPassengerLineStationsAdapter mAdapter; + private TextView emptyTv; @Override public int getStationPanelViewId() { @@ -79,6 +80,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 +88,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); @@ -145,7 +148,7 @@ public class BusPassengerRouteFragment extends if (latLngList.size() > 0) { drawablePolyline(latLngList,haveArrivedIndex); } else { - clearPolyline(); + clearMapView(); } } @@ -161,7 +164,7 @@ public class BusPassengerRouteFragment extends }); } } else { - clearPolyline(); + clearMapView(); } } @@ -182,12 +185,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 +226,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 +285,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..420ea4fda3 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 @@ -146,9 +146,9 @@ android:id="@+id/bus_p_line_stations_rl" android:layout_width="match_parent" android:layout_height="match_parent" - android:layout_marginTop="@dimen/dp_280" - android:paddingBottom="@dimen/dp_30" - android:paddingLeft="@dimen/bus_p_route_info_margin_left" + android:layout_marginTop="@dimen/dp_260" + android:paddingBottom="@dimen/dp_20" + android:paddingLeft="@dimen/dp_30" android:paddingRight="@dimen/bus_p_route_info_margin_right" android:requiresFadingEdge="vertical" app:layout_constraintLeft_toLeftOf="@+id/bus_p_driver_num_plate_tv" diff --git a/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_stations_common_item.xml b/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_stations_common_item.xml new file mode 100644 index 0000000000..9dea0ed75d --- /dev/null +++ b/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_stations_common_item.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + \ 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/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/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 40ea27c44a..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,6 +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..9beee80214 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 @@ -75,5 +75,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 adbbf2c0eb..4d02c0d64d 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 @@ -34,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; @@ -50,6 +51,7 @@ 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; @@ -73,17 +75,12 @@ public abstract class BaseBusTabFragment private ImageView ctvAutopilotStatusIv; private TextView ctvAutopilotStatusTv; protected TextView tvArrived; -// protected TextView tvOperationStatus; 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"; @@ -111,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); @@ -128,10 +123,9 @@ public abstract class BaseBusTabFragment // 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); @@ -144,16 +138,19 @@ 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 { - 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); } @@ -201,10 +198,6 @@ public abstract class BaseBusTabFragment ); findViewById(R.id.btnAutopilotRoute).setOnClickListener(view -> debugArrivedRoute()); - -// tvOperationStatus.setOnClickListener(view -> { -// onChangeOperationStatus(); -// }); tvArrived.setOnClickListener(view -> { onArriveStation(); @@ -287,23 +280,17 @@ 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); - }); - setArrivedClikable(false); - } + public void showSlidePanel(String text) { + getActivity().runOnUiThread(() -> { + slidePanelView.setText(text); + slidePanelView.setVisibility(View.VISIBLE); + }); + setArrivedClikable(false); } /** @@ -336,6 +323,9 @@ public abstract class BaseBusTabFragment }); } + public void playDI(){ + SoundPoolHelper.getSoundPoolHelper().playSoundWithRedId(getContext(), R.raw.bus_di); + } /** * 改变自动驾驶状态 * @@ -428,22 +418,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; } 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 7278755f1a..2d150eabfc 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,21 @@ 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.voice.AIAssist; import com.mogo.eagle.core.data.map.CenterLine; -import com.mogo.eagle.core.data.temp.EventBusOperation; +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.hmi.CallerHmiManager; import com.mogo.eagle.core.function.call.map.CallerHDMapManager; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.util.ToastUtils; @@ -25,17 +28,20 @@ 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.OCHCommitDialog; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; import java.util.List; -import mogo.telematics.pad.MessagePad; - /** * 网约车小巴界面 @@ -44,61 +50,76 @@ 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 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); - //调用测试面板 - 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 按钮状态 showAutopilotBiz(); mSwitchLine.setOnClickListener(this); + + mLineName.setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + showHideTestBar(); + return false; + } + }); } @Subscribe(threadMode = ThreadMode.MAIN) - public void onClickChangeOperationStatus(EventBusOperation eventBusOperation){ - if (eventBusOperation.getId() == 0){ // 查询 - mPresenter.queryOperationStatus(); - }else if (eventBusOperation.getId() == 1){ // 出车/收车切换 - CallerLogger.INSTANCE.d(M_BUS + TAG,"bus出车/收车"); - onChangeOperationStatus(); - } + public void changeOverview(EventLogout eventLogout){ + CallerLogger.INSTANCE.d(M_BUS + TAG,"changeOverview Event消息去登出"); + mPresenter.logout(); } @Override @@ -122,126 +143,235 @@ 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){ + + 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(), 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); - } else if (currentStation == stationList.size() - 1) {// 是否到达终点 - isArriveEndStation = true; - nextStationName = "--"; - mNextTag.setText(getResources().getString(R.string.bus_arrive_to_end_end)); + } - setOrRemoveMapMaker(false, BusConst.BUS_START_MAP_MAKER, startStation.getLat() - , startStation.getLon(),R.raw.star_marker); + if (stationList.size() > 2){ //只有两个站点 + updateMoreThanTwoStationsUI(stationList,arrivingOrArrivedIndex,isArrived); + }else { + updateTwoStationsUI(stationList,arrivingOrArrivedIndex,isArrived); + } - 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); + updateBusTestBarInfo(); + } + + /** + * 有两个以上站点的路线 + * @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 { + 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); } } - // 获取下一站点名称 - if (nextStation > currentStation && nextStation <= stationList.size() - 1) { - nextStationName = stationList.get(nextStation).getName(); - } + } + + /** + * 只有两个站点的路线 + * @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); - // 是否到达终点 - if ( nextStation == stationList.size() - 1 || nextStation == -1) { - mNextTag.setText(getResources().getString(R.string.bus_arrive_to_end_end)); }else { - mNextTag.setText(getResources().getString(R.string.bus_arrive_to_next_tag)); - } + 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); - if (currentStation == 0 && isArrived){ - showOrHideSwitchLineBtn(true); - }else { - showOrHideSwitchLineBtn(false); + }else { //到终点途中 + firstStationItem.setStationPointBg(0); + firstStationItem.setStationArrowBg(1); + thirdStationItem.setStationPointBg(1); + } } - - // 重置滑动按钮文字 - 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); mSwitchLine.setTag(0); mSwitchLine.setText(getResources().getString(R.string.bus_switch_line_btn)); }else {//显示结束路线 -// mSwitchLine.setVisibility(View.GONE); mSwitchLine.setTag(1); mSwitchLine.setText(getResources().getString(R.string.bus_close_line_btn)); } @@ -274,7 +404,7 @@ public class BusFragment extends BaseBusTabFragment if (isAnimateRunning){ stopAutopilotAnimation(); } - mPresenter.autoDriveToNextStation(false); + mPresenter.autoDriveToNextStation(); } /** @@ -288,39 +418,6 @@ public class BusFragment extends BaseBusTabFragment } } - @Override - protected void onChangeOperationStatus() { - super.onChangeOperationStatus(); - mPresenter.onChangeOperationStatus(); - } - - /** - * 修改经营状态 - * - * @param launch true-收车,false-出车 - */ - public void changeOperationStatus(boolean launch) { - isOperationStatus = launch; - - CallerHmiManager.INSTANCE.changeBusOperationStatus(launch); - - if (launch) { - // 出车的时候重制站点状态 - mPresenter.queryBusRoutes(); -// tvOperationStatus.setText("收车"); - tvArrived.setVisibility(View.VISIBLE); - showPanel(); - } else { - AIAssist.getInstance(getContext()).speakTTSVoice("已收车"); -// tvOperationStatus.setText("出车"); - tvArrived.setVisibility(View.GONE); - hideSlidePanel(); - hidPanel(); - //移除起点终点 - clearBusStationsMarkers(); - } - } - public void clearBusStationsMarkers(){ CallerLogger.INSTANCE.d(M_BUS + TAG,"clearBusStationsMarkers()"); if (null != startStation) { @@ -370,7 +467,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()); } } @@ -409,8 +506,26 @@ public class BusFragment extends BaseBusTabFragment if ((int)mSwitchLine.getTag() == 0){//切换路线 Intent intent = new Intent(getContext(), BusSwitchLineActivity.class); startActivity(intent); - }else {//结束路线 - mPresenter.resetCurrentLineStatus(); + }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(); } } } 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 0d79156db8..fe1b1ba2d2 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,15 @@ 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; /** * @author: wangmingjun @@ -63,10 +66,41 @@ public class BusLineModel { }); } - public void commitSwitchLineId(int lineId){ - BusServiceManager.getInstance().switchLine(mContext,lineId, new IBusServiceCallback() { + /** + * 通过线路id 查询线路排班表 + * @param lineId + * @param position 位置 + */ + public void queryBusLineTasksById(int lineId, int position,boolean autoRefresh){ + BusServiceManager.getInstance().queryBusTaskByLineId(mContext, String.valueOf(lineId),new IBusServiceCallback() { + @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(String failMsg) { + if (!NetworkUtils.isConnected(mContext)) { + ToastUtils.showShort("网络异常,请稍后重试"); + }else { + ToastUtils.showShort("查询所有绑定路线失败:"+failMsg); + } + } + }); + } + + public void commitSwitchLineId(int taskId,int lineId){ + BusServiceManager.getInstance().switchLine(mContext,taskId, new IBusServiceCallback() { @Override public void onSuccess(BusRoutesResponse o) { + SharedPrefs.getInstance(mContext).putInt(BusSwitchLineActivity.LASTCOMMITLINEID,lineId); if (mBusLinesCallback != null){ mBusLinesCallback.onChangeLineIdSuccess(); } @@ -77,7 +111,7 @@ public class BusLineModel { 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 f8e5b3bd17..049ca1c820 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,19 +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 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; @@ -29,22 +28,20 @@ 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.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; @@ -53,25 +50,26 @@ 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.BusTrajectoryManager; +import com.mogo.och.common.module.biz.constant.OchCommonConst; +import com.mogo.och.common.module.biz.provider.LoginService; +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.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 +81,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 +99,27 @@ 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; //乘客核销回调 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 +143,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")) { @@ -196,21 +196,18 @@ 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 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) { @@ -280,64 +277,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 +294,7 @@ public class BusOrderModel { //自动驾驶路线规划接口 CallerAutopilotPlanningListenerManager.INSTANCE.removeListener(moGoAutopilotPlanningListener); + loginService = null; } private Object readResolve() { @@ -384,15 +328,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 +348,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; } @@ -429,33 +368,97 @@ public class BusOrderModel { || 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) { // 重复请求小巴路线,直至成功 - queryBusStationDelay(); + //改为任务,为空不再去一直取 +// queryBusStationDelay(); } }); } + /** + * 更新正在运行的任务UI + * @param stations + */ + 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; + } + } + } + + 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 resetCurrentLineStatus() { - CallerLogger.INSTANCE.d( M_BUS + TAG, "结束当前路线"); - BusServiceManager.getInstance().resetCurrentLineStatus(mContext, currentLineId - , new IBusServiceCallback() { + public void abortTask() { + CallerLogger.INSTANCE.d( M_BUS + TAG, "结束当前路线abortTask"); + BusServiceManager.getInstance().abortTask(mContext, currentTaskId + , new IBusServiceCallback() { @Override - public void onSuccess(BusRoutesResponse o) { - CallerLogger.INSTANCE.d(M_BUS + TAG, "结束当前路线成功: " + o); - isGoingToNextStation = false; + public void onSuccess(BaseData o) { + CallerLogger.INSTANCE.d(M_BUS + TAG, "abortTask success: " + o); + clearNativeTag(); if (o.code == 0){ // 重置成功 + clearNativeTag(); + clearBusStationDatas(); queryBusRoutes(); + startOrStopQueryPassengerWriteOff(false); } } @@ -467,40 +470,9 @@ public class BusOrderModel { } - /** - * 离站上报 - */ - 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() { - @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(); - queryBusRoutes(); - } - } - @Override - public void onFail(String failMsg) { - if (!NetworkUtils.isConnected(mContext)) { - ToastUtils.showShort("网络异常,请稍后重试"); - }else{ - ToastUtils.showShort("离站上报失败:"+failMsg); - } - } - }); + private void clearNativeTag() { + isGoingToNextStation = false; + backgroundCurrentStationIndex = 0; } /** @@ -508,271 +480,244 @@ 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(); -// } + private void leaveStationSuccess(int leaveIndex) { //开启自动驾驶 2.10.0: 如果自动驾驶状态下开启, 非自动驾驶状态下不开启,需手动点击自动驾驶按钮开启 - if (isRestart || CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState() - == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING){ - startAutopilot(isRestart); - } - if (isGoingToNextStation) { - // 为了避免恢复自动驾驶时重复的接口请求 - return; - } 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() + + ", 请稍候重试"); + return; + } + + firstStartAutopilot ++; triggerStartServiceEvent(isRestart, false); - isArrivedStation = false; - BusStationBean currentStation = stationList.get( backgroundCurrentStationIndex); - BusStationBean nextStation = stationList.get( backgroundCurrentStationIndex + 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()); - parameters.endName = PinYinUtil.getPinYinHeadChar(nextStation.getName()); - parameters.startLatLon = new AutopilotControlParameters - .AutoPilotLonLat( currentStation.getLat(), currentStation.getLon() ); - parameters.endLatLon = new AutopilotControlParameters - .AutoPilotLonLat( nextStation.getLat(), nextStation.getLon() ); - parameters.vehicleType = VEHICLE_TYPE; - if (parameters.autoPilotLine == null) { - parameters.autoPilotLine = new AutopilotControlParameters.AutoPilotLine( - busRoutesResult.getLineId(), - busRoutesResult.csvFileUrl, busRoutesResult.csvFileMd5, - busRoutesResult.txtFileUrl, busRoutesResult.txtFileMd5, - busRoutesResult.contrailSaveTime, busRoutesResult.carModel, - busRoutesResult.csvFileUrlDPQP, busRoutesResult.csvFileMd5DPQP, - busRoutesResult.txtFileUrlDPQP, busRoutesResult.txtFileMd5DPQP, - busRoutesResult.contrailSaveTimeDPQP); + AutopilotControlParameters parameters = initAutopilotControlParameters(leaveIndex); + if (null == parameters) { + CallerLogger.INSTANCE.e(M_BUS + TAG, "行程日志-AutopilotControlParameters is empty."); + return; } - CallerLogger.INSTANCE.d( M_BUS + TAG, "开启自动驾驶====" + GsonUtil.jsonFromObject(parameters) - +" startLatLon="+currentStation.getName()+",endLatLon="+nextStation.getName()); + 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.getInstance().queryStationWriteOffPassengers(mContext, + currentTaskId, + stationList.get(backgroundCurrentStationIndex).getSiteId(), + prePassengerWriteOffTime, + new IBusServiceCallback(){ + + @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(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(boolean isRestart) { + private void arriveSiteStation() { if ( backgroundCurrentStationIndex +1 > stationList.size() - 1 ) { //到站短时间内调用多次 CallerLogger.INSTANCE.e( M_BUS + TAG, "数组越界" ); return; } - int arrivedStationIndex = 0; - if (!isRestart){ - arrivedStationIndex = backgroundCurrentStationIndex + 1; - } + int arrivedStationIndex = backgroundCurrentStationIndex + 1; + String arriveStation = stationList.get(arrivedStationIndex).getName(); CallerLogger.INSTANCE.d(M_BUS + TAG,"arriveSiteStation-currentStationIndex = "+ arrivedStationIndex); - BusServiceManager.getInstance().arriveSiteStation(mContext - , stationList.get(arrivedStationIndex).getSeq(), stationList.get(arrivedStationIndex).getSiteId() - , new IBusServiceCallback() { + BusServiceManager.getInstance().arriveSiteStation(mContext , + stationList.get(arrivedStationIndex).getSeq(), + stationList.get(arrivedStationIndex).getSiteId(), + currentTaskId , + new IBusServiceCallback() { @Override public void onSuccess(BaseData o) { - CallerLogger.INSTANCE.d(M_BUS + TAG,"arriveSiteStation success"); - if (!isRestart){ - renderArriveBusStation(); + CallerLogger.INSTANCE.d(M_BUS + TAG,"行程日志-arriveSiteStation success"); + queryBusRoutes(); + + ttsTips(String.format(mContext + .getString(R.string.bus_arrived_station_tip), + arriveStation)); + + //5s轮询核销乘客 + startOrStopQueryPassengerWriteOff(true); + } + + @Override + public void onFail(String failMsg) { + isArrivedStation = false; + isGoingToNextStation = true; + if (ToastUtilsOch.isCustomFastClick(5000)){ + if (!NetworkUtils.isConnected(mContext)) { + ToastUtils.showShort("网络异常,请稍后重试"); + }else { + ToastUtils.showShort(failMsg); + } } } - - @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); - } + /** + * 离站上报 + */ + 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(); } - } - - /** - * 查询到站下车乘客 - */ - 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() { + String finalNextStationName = nextStationName; + BusServiceManager.getInstance().leaveStation(mContext, + stationList.get(backgroundCurrentStationIndex).getSeq(), + stationList.get(backgroundCurrentStationIndex).getSiteId(), + currentTaskId, + new IBusServiceCallback() { @Override - public void onSuccess(QueryLeaveAwayPassengersResponse o) { - hadQueryLeaveAwayPassager = true; - arriveSiteStation(false); - playLeavePassengersMsg( o ); - queryBusOrders(); + public void onSuccess(BaseData o) { + isArrivedStation = false; + CallerLogger.INSTANCE.d( M_BUS + TAG, "行程日志-离站成功开往下一站====" ); + //需要更改当前站和下一站的状态 然后渲染 + startOrStopQueryPassengerWriteOff(false); + queryBusRoutes(); + leaveStationSuccess(backgroundCurrentStationIndex); + leaveTTSTips(finalNextStationName); } - @Override public void onFail(String failMsg) { - hadQueryLeaveAwayPassager = true; - arriveSiteStation(false); + if (!NetworkUtils.isConnected(mContext)) { + ToastUtils.showShort("网络异常,请稍后重试"); + }else{ + ToastUtils.showShort("离站上报失败:"+failMsg); + } } }); } - /** - * 收车 - */ - public void stopTakeOrder(){ - BusServiceManager.getInstance().stopTakeOrder(mContext, new IBusServiceCallback() { + //车站10s后播报 + private void leaveTTSTips(String nextStation) { + UiThreadHandler.postDelayed(new Runnable() { @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); - } + public void run() { + ttsTips(String.format(mContext + .getString(R.string.bus_leave_station_tip), + nextStation)); } + },DELAY_10S); + } + + private void ttsTips(String notice) { + UiThreadHandler.post(() ->{ + AIAssist.getInstance(mContext).speakTTSVoice(notice); }); } /** * 关闭美化模式 */ - private void closeBeautificationMode() { + 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(收车)"); + FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = false; //是否强制绘制引导线 + CallerAutoPilotManager.INSTANCE.setIgnoreConditionDraw(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 ) { + public void autoDriveToNextStation() { if ( backgroundCurrentStationIndex >= stationList.size() - 1 ) { // 当前站是最后一站,结束当前行程 travelOver(); return; } - leaveStation(false,isRestart); + leaveStation(); } /** * 渲染站点信息 * 服务端返回的OchBusRoutesResult逻辑, 离开站为当前站, 到达下一站后才会将下一站置为当前站, - * 车机端展示 离开站为当前站点,前往站为下一站, 下一站到站后在置为当前站 + * 车机端展示 三站: 中间为即将到到达或者刚到达的站 * @param result */ - private void renderBusStationsStatus(BusRoutesResult 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 + "renderBusStationsStatus--", + CallerLogger.INSTANCE.d( M_BUS + "updateBusStationsStatus--", "Index="+ i+" ,name = "+s.getName()+" ,"+s.isLeaving()+","+s.getDrivingStatus()); // 是否正在开往下一站 @@ -786,66 +731,64 @@ public class BusOrderModel { } } + if (backgroundCurrentStationIndex == 0 && + stationList.get(0).getDrivingStatus() == STATION_STATUS_STOPPED + && !stationList.get(0).isLeaving()){ //默认是第一站到站查询 + startOrStopQueryPassengerWriteOff(true); + } + BusStationBean currentStation = stationList.get(backgroundCurrentStationIndex); CallerLogger.INSTANCE.d( M_BUS + TAG, - "渲染站点信息服务端currentStationIndex="+backgroundCurrentStationIndex - +" isLeaving()="+currentStation.isLeaving()); - - //当前站点是始发站,告诉服务端到达始发站。 如果没有这个节点, 服务器不知道始发站到达状态 - // ,订单开始站下在始发站的状态流转有问题 - if (backgroundCurrentStationIndex == 0 && !currentStation.isLeaving()){ - arriveSiteStation(true); - } + "行程日志-STATION_STATUS_STOPPED-backgroundCurrentStationIndex=" + +backgroundCurrentStationIndex + +" isLeaving()="+currentStation.isLeaving()); // 美化是否开始 if (FunctionBuildConfig.isDemoMode && (backgroundCurrentStationIndex >= 0 - && backgroundCurrentStationIndex <= stationList.size()-1) - && stationList.get(backgroundCurrentStationIndex).isLeaving()){//行驶过程中设置美化 - FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = true; - CallerAutoPilotManager.INSTANCE.setIgnoreConditionDraw(true); - CallerAutoPilotManager.INSTANCE.setIPCDemoMode(true); - CallerLogger.INSTANCE.d(M_BUS + TAG, "美化模式-ignore:置为true(每次滑动出发)"); + && 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 (refreshBusStationsCallback != null){ - refreshBusStationsCallback.refreshBusStations(result.getName(),stationList - , backgroundCurrentStationIndex, getNextStopStation(),!currentStation.isLeaving()); + + if ( currentStation.isLeaving() && slidePanelHideCallback != null) { + slidePanelHideCallback.hideSlidePanel(); } - if ( currentStation.isLeaving() && slidePannelHideCallback != null) { - slidePannelHideCallback.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(); } } - /** - * 根据订单状态、获取下一站靠站的的站点 - * - * @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; - } - /** * 延时查询站点信心 */ @@ -857,63 +800,13 @@ public class BusOrderModel { * 在踩刹车、控制方向盘等操作后,会停止自动驾驶,重启自动驾驶的话相当于重新设置自动驾驶目的地 */ public void restartAutopilot() { - CallerLogger.INSTANCE.d( M_BUS + TAG, "重启自动驾驶===" + isGoingToNextStation ); - autoDriveToNextStation( true ); + CallerLogger.INSTANCE.d( M_BUS + TAG, "行程日志-重启自动驾驶===" + isGoingToNextStation ); + //只去启动自动驾驶,不再去上报离站 + startAutopilot(firstStartAutopilot >= 1,-1); } - /** - * 播报下车乘客信息 - * - * @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(); - } + public boolean isRestartAutopilot(){ + return firstStartAutopilot > 1; } /** @@ -927,12 +820,34 @@ public class BusOrderModel { } CallerLogger.INSTANCE.d( M_BUS + TAG, "单程结束====" ); CallerAutoPilotManager.INSTANCE.cancelAutoPilot(); - AIAssist.getInstance( mContext ).speakTTSVoice( "感谢您体验'蘑菇车联'无人驾驶小巴车,请您携带好随身物品,我们下次再见" ); - leaveStation(true,true); + + endTask(); } - public boolean isWorking() { - return mIsWorking; + /** + * task正常结束 + */ + private void endTask() { + CallerLogger.INSTANCE.d( M_BUS + TAG, "任务正常走完endTask()"); + BusServiceManager.getInstance().endTask(mContext, currentTaskId + , new IBusServiceCallback() { + @Override + public void onSuccess(BaseData o) { + CallerLogger.INSTANCE.d(M_BUS + TAG, "endTask success: " + o); + if (o.code == 0){ + clearNativeTag(); + clearBusStationDatas(); + queryBusRoutes();// 重新获取任务 + startOrStopQueryPassengerWriteOff(false); + ttsTips(mContext.getString(R.string.bus_end_task_tip)); + } + } + + @Override + public void onFail(String failMsg) { + ToastUtils.showShort(failMsg); + } + }); } /** @@ -941,32 +856,37 @@ public class BusOrderModel { */ public void onArriveAt( MessagePad.ArrivalNotification data){ if ( backgroundCurrentStationIndex +1 > stationList.size() - 1 ) { - CallerLogger.INSTANCE.e( M_BUS + TAG, "到站异常,取消后续操作结束" ); + 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; - if (FunctionBuildConfig.isDemoMode && backgroundCurrentStationIndex <= stationList.size() - 1) {//到达一站结束美化 - FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = false; - CallerAutoPilotManager.INSTANCE.setIgnoreConditionDraw(false); - CallerAutoPilotManager.INSTANCE.setIPCDemoMode(false); - CallerLogger.INSTANCE.d(M_BUS + TAG, "美化模式-ignore:置为false(到最后一站)"); - } - CallerLogger.INSTANCE.d( M_BUS + TAG, "到站====currentStationIndex=" + backgroundCurrentStationIndex); + CallerLogger.INSTANCE.d( M_BUS + TAG, "行程日志-当前==backgroundCurrentStationIndex=" + + backgroundCurrentStationIndex); + isGoingToNextStation = false; - queryStationLeaveAwayPassengers(); - UiThreadHandler.postDelayed(new Runnable() {// 先查询下车乘客,再上报到站,便于后台筛查下车订单 - @Override - public void run() { - if (!hadQueryLeaveAwayPassager){ - arriveSiteStation(false); - } - hadQueryLeaveAwayPassager = false; - } - },1500); + arriveSiteStation(); } public boolean isGoingToNextStation() { @@ -989,7 +909,7 @@ public class BusOrderModel { }); } - private void startOrStopOrderLoop(boolean start) { + public void startOrStopOrderLoop(boolean start) { CallerLogger.INSTANCE.d(M_BUS + TAG, "startOrStopOrderLoop() " + start); if (start) { BusModelLoopManager.getInstance().startHeartbeatLoop(); @@ -998,6 +918,11 @@ public class BusOrderModel { } } + // 登出 + public void logout() { + loginService.loginOut(mLatitude,mLongitude); + } + public void triggerStartServiceEvent(boolean isRestart, boolean send) { if (stationList == null || backgroundCurrentStationIndex >= stationList.size()-1) { return; @@ -1015,4 +940,67 @@ public class BusOrderModel { 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); + } + + AutopilotControlParameters parameters = new AutopilotControlParameters(); + parameters.routeID = busRoutesResult.getLineId(); + parameters.routeName = busRoutesResult.getName(); + parameters.startName = PinYinUtil.getPinYinHeadChar(currentStation.getName()); + parameters.endName = PinYinUtil.getPinYinHeadChar(nextStation.getName()); + parameters.startLatLon = new AutopilotControlParameters + .AutoPilotLonLat( currentStation.getLat(), currentStation.getLon() ); + parameters.endLatLon = new AutopilotControlParameters + .AutoPilotLonLat( nextStation.getLat(), nextStation.getLon() ); + parameters.vehicleType = VEHICLE_TYPE; + if (parameters.autoPilotLine == null) { + parameters.autoPilotLine = new AutopilotControlParameters.AutoPilotLine( + busRoutesResult.getLineId(), + busRoutesResult.csvFileUrl, busRoutesResult.csvFileMd5, + busRoutesResult.txtFileUrl, busRoutesResult.txtFileMd5, + busRoutesResult.contrailSaveTime, busRoutesResult.carModel, + busRoutesResult.csvFileUrlDPQP, busRoutesResult.csvFileMd5DPQP, + busRoutesResult.txtFileUrlDPQP, busRoutesResult.txtFileMd5DPQP, + busRoutesResult.contrailSaveTimeDPQP); + } + + 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 index 44284cb122..d99fcc5d26 100644 --- 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 @@ -10,13 +10,14 @@ 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.BusCloseTaskRequest; +import com.mogo.och.bus.bean.BusQueryLineTaskResponse; import com.mogo.och.bus.bean.BusQueryLinesResponse; -import com.mogo.och.bus.bean.BusResetLineStatusRequest; +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.BusWriteOffPassengersQueryRequest; 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; @@ -54,46 +55,59 @@ public class BusServiceManager { } /** - * 查询小巴车线路 + * 查询小巴车当前任务 * @param context * @param callback */ public void queryBusRoutes(Context context, IBusServiceCallback callback) { //获取当前高德坐标 - mService.querySiteByCoordinate(MoGoAiCloudClientConfig.getInstance().getServiceAppId() + mService.queryBusRoutes(MoGoAiCloudClientConfig.getInstance().getServiceAppId() ,MoGoAiCloudClientConfig.getInstance().getToken() - , new BusQueryLineStationsRequest(BusOrderModel.getInstance().mLongitude - , BusOrderModel.getInstance().mLatitude,true)) + , new BusQueryLineStationsRequest()) .subscribeOn( Schedulers.io() ).observeOn( AndroidSchedulers.mainThread() ) - .subscribe( getSubscribeImpl(context,callback,"querySiteByCoordinate")); + .subscribe( getSubscribeImpl(context,callback,"queryBusRoutes")); } /** * 重置线路站点 * @param context - * @param lineId + * @param taskId * @param callback */ - public void switchLine(Context context, int lineId, IBusServiceCallback callback){ + public void switchLine(Context context, int taskId, IBusServiceCallback callback){ mService.switchLine(MoGoAiCloudClientConfig.getInstance().getServiceAppId() - ,MoGoAiCloudClientConfig.getInstance().getToken(),new BusResetDrivingLineRequest(lineId)) + ,MoGoAiCloudClientConfig.getInstance().getToken(),new BusResetDrivingLineRequest(taskId)) .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) - .subscribe(getSubscribeImpl(context,callback,"debugResetStationStatus")); + .subscribe(getSubscribeImpl(context,callback,"switchLine")); } /** - * 结束当前路线,当前路线状态重置到始发站 + * 中断当前任务 * @param context - * @param lineId + * @param taskId * @param callback */ - public void resetCurrentLineStatus(Context context, int lineId, IBusServiceCallback callback){ - mService.resetCurrentLineStatus(MoGoAiCloudClientConfig.getInstance().getServiceAppId() + public void abortTask(Context context, int taskId, IBusServiceCallback callback){ + mService.abortTask(MoGoAiCloudClientConfig.getInstance().getServiceAppId() ,MoGoAiCloudClientConfig.getInstance().getToken() - ,new BusResetLineStatusRequest()) + ,new BusCloseTaskRequest(taskId)) .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) - .subscribe(getSubscribeImpl(context,callback,"resetCurrentLineStatus")); + .subscribe(getSubscribeImpl(context,callback,"abortTask")); + } + + /** + * 正常结束任务 + * @param context + * @param taskId + * @param callback + */ + public void endTask(Context context, int taskId, IBusServiceCallback callback){ + mService.endTask(MoGoAiCloudClientConfig.getInstance().getServiceAppId() + ,MoGoAiCloudClientConfig.getInstance().getToken() + ,new BusCloseTaskRequest(taskId)) + .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) + .subscribe(getSubscribeImpl(context,callback,"endTask")); } /** @@ -103,11 +117,10 @@ public class BusServiceManager { * @param siteId * @param callback */ - public void leaveStation(Context context, int seq, int siteId, IBusServiceCallback callback){ + public void leaveStation(Context context, int seq, int siteId,int taskId, IBusServiceCallback callback){ mService.leaveStation(MoGoAiCloudClientConfig.getInstance().getServiceAppId() ,MoGoAiCloudClientConfig.getInstance().getToken() - ,new BusUpdateSiteStatusRequest(seq,siteId, BusOrderModel.getInstance().mLongitude - , BusOrderModel.getInstance().mLatitude)) + ,new BusUpdateSiteStatusRequest(taskId,siteId,seq)) .subscribeOn( Schedulers.io() ) .observeOn( AndroidSchedulers.mainThread() ) .subscribe(getSubscribeImpl(context,callback,"leaveStation")); @@ -120,14 +133,14 @@ public class BusServiceManager { * @param siteId * @param callback */ - public void arriveSiteStation(Context context, int seq, int siteId, IBusServiceCallback callback){ + public void arriveSiteStation(Context context, int seq, int siteId,int taskId, + IBusServiceCallback callback){ mService.arriveSiteStation(MoGoAiCloudClientConfig.getInstance().getServiceAppId() ,MoGoAiCloudClientConfig.getInstance().getToken() - ,new BusUpdateSiteStatusRequest(seq,siteId - , BusOrderModel.getInstance().mLongitude, BusOrderModel.getInstance().mLatitude)) + ,new BusUpdateSiteStatusRequest(taskId,siteId,seq)) .subscribeOn( Schedulers.io() ) .observeOn( AndroidSchedulers.mainThread() ) - .subscribe(getSubscribeImpl(context,callback,"leaveStation")); + .subscribe(getSubscribeImpl(context,callback,"arriveSiteStation")); } /** @@ -147,48 +160,23 @@ public class BusServiceManager { } /** - * 收车 + * 查询当前到站点核销乘客 * @param context + * @param siteId * @param callback */ - public void stopTakeOrder(Context context, IBusServiceCallback callback){ - mService.stopTakeOrder(MoGoAiCloudClientConfig.getInstance().getServiceAppId() + public void queryStationWriteOffPassengers(Context context,int taskId,int siteId,long prePassengerTime + , IBusServiceCallback callback){ + mService.queryWriteOffPassengers( 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()) + ,new BusWriteOffPassengersQueryRequest(taskId,siteId,prePassengerTime)) .subscribeOn( Schedulers.io() ) .observeOn( AndroidSchedulers.mainThread() ) - .subscribe(getSubscribeImpl(context,callback,"queryOperationStatus")); + .subscribe(getSubscribeImpl(context,callback,"queryStationWriteOffPassengers")); } + + /** * 查询小巴车订单 * @param context @@ -211,6 +199,15 @@ public class BusServiceManager { .subscribe(getSubscribeImpl(context,callback,"queryBusLines")); } + public void queryBusTaskByLineId(Context context,String lineId,IBusServiceCallback callback){ + mService.queryBusTaskByLineId(MoGoAiCloudClientConfig.getInstance().getServiceAppId() + ,MoGoAiCloudClientConfig.getInstance().getToken() + ,lineId) + .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){ 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 291fb9f67f..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,14 +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.BusResetLineStatusRequest; 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; @@ -40,16 +41,15 @@ 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); /** * @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" ) + @POST( "/autopilot-car-hailing/cab/flow/v1/bus/driver/bus/startTask" ) Observable switchLine(@Header ("appId") String appId, @Header("ticket") String ticket, @Body BusResetDrivingLineRequest request); /** @@ -59,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); /** * 到站 更新到站信息 @@ -70,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); @@ -86,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") @@ -142,16 +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/operation/v1/driver/bus/line/resetStart") - Observable resetCurrentLineStatus(@Header ("appId") String appId, @Header("ticket") String ticket, @Body BusResetLineStatusRequest data); + @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/presenter/BusLinePresenter.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusLinePresenter.java index bafd9f298b..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(); @@ -61,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(){ @@ -76,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 15b161f032..8106fb33e6 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,6 +9,7 @@ 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.eagle.core.data.autopilot.AutopilotStatusInfo; import com.mogo.eagle.core.data.config.FunctionBuildConfig; @@ -16,14 +17,21 @@ 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.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.zhidao.socket.utils.LoginStatusUtil; import org.jetbrains.annotations.NotNull; @@ -40,27 +48,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 { 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); - queryOperationStatus(); BusOrderModel.getInstance().queryBusRoutes(); initModelListener(); } @@ -73,86 +80,72 @@ 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); } 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); + OCHAdasAbilityManager.getInstance().release(); } - public void queryBusRoutes() { - BusOrderModel.getInstance().queryBusRoutes(); + public void abortTask() { + BusOrderModel.getInstance().abortTask(); } - public void queryOperationStatus(){ - BusOrderModel.getInstance().queryOperationStatus(); - } - - public void resetCurrentLineStatus() { - BusOrderModel.getInstance().resetCurrentLineStatus(); - } - - 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)); } } + @Override + public void updateEmptyUi() { + runOnUIThread(() -> mView.updateLineEmptyUI()); + } + @Override public void clearBusStationsMarkers() { runOnUIThread(() -> mView.clearBusStationsMarkers()); } - 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 hideSlidePanel() { if (mView != null) { @@ -163,6 +156,7 @@ public class BusPresenter extends Presenter @Override public void onAutopilotArriveAtStation(MessagePad.ArrivalNotification arrivalNotification) { + CallerLogger.INSTANCE.e( M_BUS + TAG, "行程日志-onAutopilotArriveAtStation arrive"); BusOrderModel.getInstance().onArriveAt(arrivalNotification); } @@ -179,62 +173,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)); @@ -295,4 +278,34 @@ 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人" + mView.showNotice(passengerNum + "人"); + }else { //是 1 播放 "滴" + mView.playDI(); + } + } } 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/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" /> + + + + + \ 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 57ae0979a5..8609630b9c 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 @@ -12,7 +12,7 @@ - - - - - - - - - - - - - - - - - + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintRight_toLeftOf="@+id/bus_task_time_tv"/> + + - - - - - - - + - - + - - - - - + 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 cc1babed1f..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,7 +86,7 @@ 92px 30px - 616px + 618px 754px @@ -138,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 dee684f3e6..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,7 +86,7 @@ 92px 30px - 616px + 618px 754px @@ -136,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 96338fac55..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 @@ -45,4 +45,11 @@ #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 ce34734e02..83e1b61a23 100644 --- a/OCH/mogo-och-bus/src/main/res/values/dimens.xml +++ b/OCH/mogo-och-bus/src/main/res/values/dimens.xml @@ -152,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 992ab6c19c..c44067da93 100644 --- a/OCH/mogo-och-bus/src/main/res/values/strings.xml +++ b/OCH/mogo-och-bus/src/main/res/values/strings.xml @@ -5,20 +5,23 @@ 启动成功 启动失败 自动驾驶 - 路线列表 + 任务列表 + 暂无任务 + 选择时间 路线: 起点: 终点: 确认 - 切换路线 - 结束路线 + 选择任务 + 结束任务 自动驾驶状态中,不可切换或结束路线 当前行程未完成,不可切换路线 当前车辆无路线\n请联系运营人员绑定 起点: 终点: - 更换路线成功 - 更换路线失败 + 往%1$s方向 + 更换任务成功 + 更换任务失败 起点: 终点: @@ -26,4 +29,18 @@ 下一站: 自动驾驶状态为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..5bacbfe0d7 --- /dev/null +++ b/OCH/mogo-och-common-module/src/debug/java/com/mogo/och/common/module/utils/SimpleInterceptor.kt @@ -0,0 +1,75 @@ +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/operation/v1/driver/bus/loginStatus" -> { + val builder = Response.Builder() + val create:ResponseBody + if(first) { + create = ResponseBody.create( + MediaType.parse("application/json"), + "{\"code\":0,\"msg\":\"\",\"data\":{\"servingStatus\":0,\"driverStatus\":1,\"orderNo\":\"12111\",\"purpose\":1,\"sn\":\"fjsdlfjslf\",\"plateNumber\":\"车牌号\",\"phone\":\"18811539480\",\"lineId\":\"线路id\",\"taskId\":\"任务id\"}}" + ) + first = false + }else{ + create = ResponseBody.create( + MediaType.parse("application/json"), + "{\"code\":0,\"msg\":\"\",\"data\":{\"servingStatus\":0,\"driverStatus\":0,\"orderNo\":\"12111\",\"purpose\":1,\"sn\":\"fjsdlfjslf\",\"plateNumber\":\"车牌号\",\"phone\":\"18811539480\",\"lineId\":\"线路id\",\"taskId\":\"任务id\"}}" + ) + first = true + } + builder.code(200) + builder.request(original) + builder.protocol(Protocol.HTTP_1_1) + builder.message("") + return builder.body(create).build() + } + "/autopilot-car-hailing/line/v2/driver/bus/task/query" -> { + val builder = Response.Builder() + val create = ResponseBody.create(MediaType.parse("application/json"), "{\"code\":0,\"msg\":\"\",\"data\":[{\"id\":1,\"taskStartTime\":1663722000000},{\"id\":2,\"taskStartTime\":1663725600000},{\"id\":3,\"taskStartTime\":1663729200000},{\"id\":4,\"taskStartTime\":1663732800000},{\"id\":5,\"taskStartTime\":1663736400000},{\"id\":6,\"taskStartTime\":1663740000000},{\"id\":7,\"taskStartTime\":1663743600000},{\"id\":8,\"taskStartTime\":1663747200000},{\"id\":9,\"taskStartTime\":1663750800000},{\"id\":10,\"taskStartTime\":1663754400000}]}") + builder.code(200) + builder.request(original) + builder.protocol(Protocol.HTTP_1_1) + builder.message("") + return builder.body(create).build() + } + "/autopilot-car-hailing/cab/flow/v1/bus/driver/bus/startTask" -> { + val builder = Response.Builder() + val create = ResponseBody.create(MediaType.parse("application/json"), "{\"code\":0,\"msg\":\"\",\"data\":null}") + builder.code(200) + builder.request(original) + builder.protocol(Protocol.HTTP_1_1) + builder.message("") + return builder.body(create).build() + } + "/autopilot-car-hailing/cab/flow/v1/bus/driver/bus/endOperation" -> { + val builder = Response.Builder() + val create = ResponseBody.create(MediaType.parse("application/json"), "{\"code\":0,\"msg\":\"\",\"data\":null}") + builder.code(200) + builder.request(original) + builder.protocol(Protocol.HTTP_1_1) + builder.message("") + return builder.body(create).build() + } + "/autopilot-car-hailing/cab/flow/v1/bus/driver/bus/startOperation" -> { + val builder = Response.Builder() + val create = ResponseBody.create(MediaType.parse("application/json"), "{\"code\":0,\"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-taxi/src/main/java/com/mogo/och/taxi/bean/DriverStatusQueryRespBean.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/DriverStatusQueryRespBean.java similarity index 65% rename from OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/DriverStatusQueryRespBean.java rename to OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/DriverStatusQueryRespBean.java index ac630c9ecf..0b8692ae59 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/DriverStatusQueryRespBean.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/DriverStatusQueryRespBean.java @@ -1,4 +1,4 @@ -package com.mogo.och.taxi.bean; +package com.mogo.och.common.module.biz.bean; import com.mogo.eagle.core.data.BaseData; @@ -15,5 +15,11 @@ public class DriverStatusQueryRespBean extends BaseData { 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-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiLoginReqBean.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLoginReqBean.java similarity index 81% rename from OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiLoginReqBean.java rename to OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLoginReqBean.java index 0591d3f878..ebe1fa2731 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiLoginReqBean.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLoginReqBean.java @@ -1,8 +1,8 @@ -package com.mogo.och.taxi.bean; +package com.mogo.och.common.module.biz.bean; /** - * Created by pangfan on 2021/8/19 - * 司机端准备好或者乘客已验证上车请求参数 + * Created by yangyakun on 2021/8/19 + * 通过手机号验证码登录 */ public class TaxiLoginReqBean { diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiLoginRespBean.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLoginRespBean.java similarity index 54% rename from OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiLoginRespBean.java rename to OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLoginRespBean.java index c1265a9be3..9cda2a96c6 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiLoginRespBean.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLoginRespBean.java @@ -1,14 +1,14 @@ -package com.mogo.och.taxi.bean; +package com.mogo.och.common.module.biz.bean; import com.mogo.eagle.core.data.BaseData; /** - * Created by pangfan on 2021/8/19 - * 司机端准备好或者乘客已验证上车请求参数 + * Created by yangyakun on 2021/8/19 + * 通过验证码登录 */ public class TaxiLoginRespBean extends BaseData { - public TaxiLoginRespBean.Result data; + public Result data; public static class Result { public Double lat; diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiLoginSmsReqBean.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLoginSmsReqBean.java similarity index 54% rename from OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiLoginSmsReqBean.java rename to OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLoginSmsReqBean.java index 3a4d4d7a4f..3c246bc153 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiLoginSmsReqBean.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLoginSmsReqBean.java @@ -1,8 +1,8 @@ -package com.mogo.och.taxi.bean; +package com.mogo.och.common.module.biz.bean; /** - * Created by pangfan on 2021/8/19 - * 司机端准备好或者乘客已验证上车请求参数 + * Created by yyk on 2021/8/19 + * 获取验证码 */ public class TaxiLoginSmsReqBean { diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiLogoutReqBean.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLogoutReqBean.java similarity index 77% rename from OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiLogoutReqBean.java rename to OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLogoutReqBean.java index ced9b2eddb..22e63dd838 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiLogoutReqBean.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLogoutReqBean.java @@ -1,8 +1,8 @@ -package com.mogo.och.taxi.bean; +package com.mogo.och.common.module.biz.bean; /** - * Created by pangfan on 2021/8/19 - * 司机端准备好或者乘客已验证上车请求参数 + * Created by yyk on 2021/8/19 + * 登出请求参数 */ public class TaxiLogoutReqBean { public String sn; 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-taxi/src/main/java/com/mogo/och/taxi/callback/ITaxiLoginCallback.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/callback/ITaxiLoginCallback.java similarity index 58% rename from OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/ITaxiLoginCallback.java rename to OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/callback/ITaxiLoginCallback.java index a8f35171cb..5cbca0d853 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/ITaxiLoginCallback.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/callback/ITaxiLoginCallback.java @@ -1,11 +1,4 @@ -package com.mogo.och.taxi.callback; - -import androidx.annotation.NonNull; - -import com.mogo.och.taxi.bean.OrderQueryRespBean; -import com.mogo.och.taxi.bean.OrderQueryRouteInfoRespBean; - -import java.util.List; +package com.mogo.och.common.module.biz.callback; /** * Created on 2021/9/8 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-taxi/src/main/java/com/mogo/och/taxi/constant/TaxiLoginStatusEnum.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/TaxiLoginStatusEnum.kt similarity index 90% rename from OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/TaxiLoginStatusEnum.kt rename to OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/TaxiLoginStatusEnum.kt index 5e19782f5e..451196d777 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/TaxiLoginStatusEnum.kt +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/TaxiLoginStatusEnum.kt @@ -1,4 +1,4 @@ -package com.mogo.och.taxi.constant +package com.mogo.och.common.module.biz.constant /** * Created on 2022/08/19 diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiLoginModel.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginModel.kt similarity index 72% rename from OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiLoginModel.kt rename to OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginModel.kt index bdef0b53fd..d945f03a1f 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiLoginModel.kt +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginModel.kt @@ -1,21 +1,22 @@ -package com.mogo.och.taxi.model +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.och.taxi.model.TaxiLoginModel -import com.mogo.och.taxi.callback.ITaxiLoginCallback -import com.mogo.module.common.MogoApisHandler -import com.mogo.map.navi.IMogoCarLocationChangedListener2 -import com.mogo.och.taxi.network.TaxiServiceManager -import com.mogo.och.taxi.network.TaxiServiceCallback +import com.mogo.eagle.core.utilcode.util.SharedPrefs import com.mogo.eagle.core.utilcode.util.ToastUtils -import com.mogo.och.taxi.R -import com.mogo.och.taxi.bean.TaxiLoginReqBean -import com.mogo.och.taxi.bean.TaxiLoginRespBean -import com.mogo.och.taxi.constant.TaxiLoginStatusEnum -import com.mogo.och.taxi.utils.StatusManager +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 @@ -24,7 +25,7 @@ import com.mogo.och.taxi.utils.StatusManager * 网约车 - 出租车业务逻辑处理 */ @SuppressLint("StaticFieldLeak") -object TaxiLoginModel{ +object OchCommonLoginModel{ private val TAG = "TaxiLoginModel" private var mContext: Context? = null @@ -34,10 +35,7 @@ object TaxiLoginModel{ fun init(context: Context) { mContext = context.applicationContext // 达到起始站围栏监听 - MogoApisHandler.getInstance() - .apis - .registerCenterApi - .registerCarLocationChangedListener(TAG, mCarLocationChangedListener2) + MogoApisHandler.getInstance().apis.registerCenterApi.registerCarLocationChangedListener(TAG, mCarLocationChangedListener2) } fun hasInit():Boolean{ @@ -73,8 +71,8 @@ object TaxiLoginModel{ * 获取手机验证码 */ fun getPhoneCode(phone: String?) { - TaxiServiceManager.getInstance().getPhoneCode(mContext, phone, - object : TaxiServiceCallback { + OchCommonServiceManager.getInstance().getPhoneCode(mContext, phone, + object : OchCommonServiceCallback { override fun onSuccess(data: BaseData?) { if (null != data && 0 == data.code) { // 获取验证码成功 @@ -96,20 +94,23 @@ object TaxiLoginModel{ } override fun onFail(code: Int, msg: String) { - ToastUtils.showShort("$code,$msg") + ToastUtilsOch.showWithCodeMessage(code,msg) } }) } fun gotoLogin(phone: String, code: String) { val location4Login = TaxiLoginReqBean.Location4Login(mLatitude, mLongitude) - TaxiServiceManager.getInstance().gotoLoginBycode(mContext, phone, code, location4Login, - object : TaxiServiceCallback { + OchCommonServiceManager.getInstance().gotoLoginBycode(mContext, 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)) - StatusManager.setLoginStatus(TaxiLoginStatusEnum.Login) + LoginStatusManager.setLoginStatus(TaxiLoginStatusEnum.Login) + mContext?.let { + SharedPrefs.getInstance(it).putString("och_account",phone) + } iTaxiLoginCallback?.loginSuccess() } else { if (data != null) { @@ -127,7 +128,7 @@ object TaxiLoginModel{ } override fun onFail(code: Int, msg: String) { - ToastUtils.showShort("$code,$msg") + ToastUtilsOch.showWithCodeMessage(code,msg) } }) } 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..0b1e9f0bfb --- /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.getInstance().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.getInstance().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-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceCallback.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceCallback.java new file mode 100644 index 0000000000..8433def5f0 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceCallback.java @@ -0,0 +1,18 @@ +package com.mogo.och.common.module.biz.network; + +/** + * @author congtaowang + * @since 2021/1/15 + * + * 修改订单状态回调接口 + */ +public interface OchCommonServiceCallback< T > { + + void onSuccess(T data); + + void onFail(int code, String msg); + + default void onError() { + + } +} diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceManager.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceManager.java new file mode 100644 index 0000000000..ecc0129cfe --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceManager.java @@ -0,0 +1,187 @@ +package com.mogo.och.common.module.biz.network; + +import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI; + +import android.content.Context; + +import com.mogo.cloud.passport.MoGoAiCloudClient; +import com.mogo.cloud.passport.MoGoAiCloudClientConfig; +import com.mogo.commons.debug.DebugConfig; +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.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 com.mogo.och.common.module.biz.constant.OchCommonConst; + +import io.reactivex.Observable; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +/** + * Created by pangfan on 2021/8/19 + */ +public class OchCommonServiceManager { + private static final String TAG = OchCommonServiceManager.class.getSimpleName(); + + private static final class SingletonHolder { + private static final OchCommonServiceManager INSTANCE = new OchCommonServiceManager(); + } + + public static OchCommonServiceManager getInstance() { + return SingletonHolder.INSTANCE; + } + + private OchCommonServiceApiNew mOCHTaxiServiceApi; + + private OchCommonServiceManager() { + if (mOCHTaxiServiceApi == null){ + mOCHTaxiServiceApi = MoGoRetrofitFactory.getInstance(OchCommonConst.getBaseUrl()).create(OchCommonServiceApiNew.class); + } + } + + /** + * 获取手机验证码 + * @param context + * @param callback + */ + public void getPhoneCode(Context context, String phone, + OchCommonServiceCallback callback) { + mOCHTaxiServiceApi.getPhoneCode(MoGoAiCloudClientConfig.getInstance().getServiceAppId() + , MoGoAiCloudClientConfig.getInstance().getToken() + , new TaxiLoginSmsReqBean(phone)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(getSubscribeImpl(context, callback, "getPhoneCode")); + } + /** + * 通过验证码登录 + * @param context + * @param callback + */ + public void gotoLoginBycode(Context context, String phone, String code, + TaxiLoginReqBean.Location4Login location4Login, + OchCommonServiceCallback callback) { + String sn = MoGoAiCloudClientConfig.getInstance().getSn(); + Observable taxiLoginRespBeanObservable = null; + switch (DebugConfig.getProductFlavor()) { + case "fPadLenovoOchTaxi": {//出租车司机 + taxiLoginRespBeanObservable = mOCHTaxiServiceApi.gotoLoginBycode4Taxi(MoGoAiCloudClientConfig.getInstance().getServiceAppId() + , MoGoAiCloudClientConfig.getInstance().getToken() + , new TaxiLoginReqBean(phone, code, sn, location4Login)); + break; + } + case "fPadLenovoOchBus": {//小巴车司机 + taxiLoginRespBeanObservable = mOCHTaxiServiceApi.gotoLoginBycode4Bus(MoGoAiCloudClientConfig.getInstance().getServiceAppId() + , MoGoAiCloudClientConfig.getInstance().getToken() + , new TaxiLoginReqBean(phone, code, sn, location4Login)); + break; + } + } + if (taxiLoginRespBeanObservable != null) { + taxiLoginRespBeanObservable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) + .subscribe(getSubscribeImpl(context, callback, "gotoLoginBycode")); + } + } + + /** + * 登出 + */ + public void logout(Context context, TaxiLogoutReqBean.Location4Login location4Login, OchCommonServiceCallback callback) { + Observable logout = null; + switch (DebugConfig.getProductFlavor()) { + case "fPadLenovoOchTaxi": {//出租车司机 + logout = mOCHTaxiServiceApi.logout4Taxi( + MoGoAiCloudClientConfig.getInstance().getServiceAppId(), + MoGoAiCloudClientConfig.getInstance().getToken(), + new TaxiLogoutReqBean(MoGoAiCloudClientConfig.getInstance().getSn(), location4Login)); + break; + } + case "fPadLenovoOchBus": {//小巴车司机 + logout = mOCHTaxiServiceApi.logout4Bus( + MoGoAiCloudClientConfig.getInstance().getServiceAppId(), + MoGoAiCloudClientConfig.getInstance().getToken(), + new TaxiLogoutReqBean(MoGoAiCloudClientConfig.getInstance().getSn(), location4Login)); + break; + } + } + if (logout != null) { + logout.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) + .subscribe(getSubscribeImpl(context, callback, "logout")); + } + } + + /** + * 接单状态和登录状态查询 + * + * @param context + * @param callback + */ + public void queryDriverServiceStatus(Context context, + OchCommonServiceCallback callback) { + if (MoGoAiCloudClientConfig.getInstance().getToken().isEmpty()) { + callback.onFail(OchCommonConst.WAIT_TAKEN, "等待令牌中请稍等"); + MoGoAiCloudClient.getInstance().refreshToken(); + return; + } + String flavor = ""; + switch (DebugConfig.getProductFlavor()) { + case "fPadLenovoOchTaxi": {//出租车司机 + flavor = "taxi"; + break; + } + case "fPadLenovoOchBus": {//小巴车司机 + flavor = "bus"; + break; + } + case "fPadLenovoOchBusPassenger": {//小巴车乘客 + flavor = "bus/passenger"; + break; + } + } + mOCHTaxiServiceApi.queryDriverServiceStatusAndLoginStatus(flavor, MoGoAiCloudClientConfig.getInstance().getServiceAppId() + , MoGoAiCloudClientConfig.getInstance().getToken() + , MoGoAiCloudClientConfig.getInstance().getSn()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(getSubscribeImpl(context, callback, "queryDriverServiceStatus")); + } + + + private SubscribeImpl getSubscribeImpl( + Context context, OchCommonServiceCallback callback, String apiName) { + return new SubscribeImpl(RequestOptions.create(context)) { + @Override + public void onSuccess(T o) { + super.onSuccess(o); + CallerLogger.INSTANCE.d(M_TAXI + 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 + 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 + TAG, String.format(apiName + ": onError() code = %d; message = %s;", code, message)); + if (callback != null) { + callback.onFail(code, message); + } + } + }; + } +} diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/TaxiLoginPresenter.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/presenter/OchCommonLoginPresenter.kt similarity index 73% rename from OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/TaxiLoginPresenter.kt rename to OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/presenter/OchCommonLoginPresenter.kt index 1497683ddc..4f607084b2 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/TaxiLoginPresenter.kt +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/presenter/OchCommonLoginPresenter.kt @@ -1,4 +1,4 @@ -package com.mogo.och.taxi.presenter +package com.mogo.och.common.module.biz.presenter import androidx.lifecycle.LifecycleOwner import com.mogo.commons.AbsMogoApplication @@ -7,10 +7,10 @@ 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.taxi.R -import com.mogo.och.taxi.callback.ITaxiLoginCallback -import com.mogo.och.taxi.model.TaxiLoginModel -import com.mogo.och.taxi.ui.TaxiLoginDialogFragment +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 @@ -23,7 +23,7 @@ import java.util.concurrent.TimeUnit * * 描述 */ -class TaxiLoginPresenter(view: TaxiLoginDialogFragment?) : +class OchCommonLoginPresenter(view: TaxiLoginDialogFragment?) : Presenter(view), ITaxiLoginCallback { private var countDownDisposable: Disposable? = null @@ -33,12 +33,12 @@ class TaxiLoginPresenter(view: TaxiLoginDialogFragment?) : } private fun initListeners() { - TaxiLoginModel.init(AbsMogoApplication.getApp()) - TaxiLoginModel.setiTaxiLoginCallback(this) + OchCommonLoginModel.init(AbsMogoApplication.getApp()) + OchCommonLoginModel.setiTaxiLoginCallback(this) } fun getPhoneCode(phone:String){ - if(!TaxiLoginModel.hasInit()){ + if(!OchCommonLoginModel.hasInit()){ initListeners() } if (!RegexUtils.isMobileExact(phone)) { @@ -46,7 +46,7 @@ class TaxiLoginPresenter(view: TaxiLoginDialogFragment?) : mView?.inputPhoneError() return } - TaxiLoginModel.getPhoneCode(phone) + OchCommonLoginModel.getPhoneCode(phone) } override fun onCreate(owner: LifecycleOwner) { @@ -58,7 +58,7 @@ class TaxiLoginPresenter(view: TaxiLoginDialogFragment?) : override fun onDestroy(owner: LifecycleOwner) { super.onDestroy(owner) - TaxiLoginModel.release() + OchCommonLoginModel.release() countDownDisposable?.let { if (!it.isDisposed) { it.dispose() @@ -67,7 +67,7 @@ class TaxiLoginPresenter(view: TaxiLoginDialogFragment?) : } companion object { - private val TAG = TaxiLoginPresenter::class.java.simpleName + private val TAG = OchCommonLoginPresenter::class.java.simpleName } override fun getPhoneCodeSuccess() { @@ -82,10 +82,10 @@ class TaxiLoginPresenter(view: TaxiLoginDialogFragment?) : }, { CallerLogger.d(SceneConstant.M_TAXI_P + TAG, "倒计时onError:${it}") it.printStackTrace() - mView?.setCountDownText(context.getString(R.string.module_och_taxi_login_get_code),true) + mView?.setCountDownText(AbsMogoApplication.getApp().getString(R.string.module_och_taxi_login_get_code),true) }, { CallerLogger.d(SceneConstant.M_TAXI_P + TAG, "倒计时onComplete") - mView?.setCountDownText(context.getString(R.string.module_och_taxi_login_get_code),true) + mView?.setCountDownText(AbsMogoApplication.getApp().getString(R.string.module_och_taxi_login_get_code),true) }) } @@ -94,7 +94,7 @@ class TaxiLoginPresenter(view: TaxiLoginDialogFragment?) : } fun gotoLogin(phone: String, code: String) { - if(!TaxiLoginModel.hasInit()){ + if(!OchCommonLoginModel.hasInit()){ initListeners() } if (!RegexUtils.isMobileExact(phone)) { @@ -107,6 +107,6 @@ class TaxiLoginPresenter(view: TaxiLoginDialogFragment?) : return } mView?.closeSoftInput() - TaxiLoginModel.gotoLogin(phone,code) + 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-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiLoginDialogFragment.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/ui/TaxiLoginDialogFragment.kt similarity index 81% rename from OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiLoginDialogFragment.kt rename to OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/ui/TaxiLoginDialogFragment.kt index 19da74fbae..3ad8a1cfd2 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiLoginDialogFragment.kt +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/ui/TaxiLoginDialogFragment.kt @@ -1,4 +1,4 @@ -package com.mogo.och.taxi.ui +package com.mogo.och.common.module.biz.ui import android.content.DialogInterface import android.graphics.Rect @@ -8,6 +8,7 @@ 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 @@ -15,24 +16,26 @@ import androidx.core.widget.addTextChangedListener import androidx.fragment.app.DialogFragment import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentTransaction -import com.mogo.cloud.passport.MoGoAiCloudClient +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.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.BarUtils import com.mogo.eagle.core.utilcode.util.KeyboardUtils -import com.mogo.och.taxi.R -import com.mogo.och.taxi.constant.TaxiConst -import com.mogo.och.taxi.presenter.TaxiLoginPresenter +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(), +class TaxiLoginDialogFragment : MvpDialogFragment(), DialogInterface.OnKeyListener { lateinit var clMain: ConstraintLayout @@ -42,6 +45,7 @@ class TaxiLoginDialogFragment : MvpDialogFragment + BarUtils.setNavBarVisibility(window,false) + } + } + } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -71,7 +83,9 @@ class TaxiLoginDialogFragment : MvpDialogFragment @@ -83,6 +97,17 @@ class TaxiLoginDialogFragment : MvpDialogFragment { + acivLoginBg.setImageResource(R.drawable.taxi_ic_login_bg) + } + "fPadLenovoOchBus" -> { + acivLoginBg.setImageResource(R.drawable.bus_ic_login_bg) + } + } + } + private fun initListener() { mRootView.isFocusable = true mRootView.isFocusableInTouchMode = true @@ -123,6 +148,13 @@ class TaxiLoginDialogFragment : MvpDialogFragment if(itEditable.isNotEmpty()){ @@ -169,8 +201,8 @@ class TaxiLoginDialogFragment : MvpDialogFragment 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); + } + + public void release() { + releaseListeners(); + } +} 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/CoordinateCalculateRouteUtil.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/CoordinateCalculateRouteUtil.java index 01ec888715..d0532ffea9 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 @@ -144,26 +144,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 { + latePoints.addAll(mRoutePoints.subList(currentIndex,mRoutePoints.size()-1)); + } + return latePoints; } - return latePoints; + } return latePoints; } @@ -180,20 +183,22 @@ 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; + } } + return currentIndex; } - return currentIndex; } return currentIndex; } diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/NumberFormatUtil.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/NumberFormatUtil.java index 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/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 index 829093f3a7..a2a02a8475 100644 --- 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 @@ -4,6 +4,11 @@ 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; @@ -14,4 +19,15 @@ public class ToastUtilsOch { 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/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-taxi/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 similarity index 100% rename from OCH/mogo-och-taxi/src/main/res/color/taxi_login_get_code_text_color.xml rename to OCH/mogo-och-common-module/src/main/res/color/taxi_login_get_code_text_color.xml 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-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_ic_login_bg.webp b/OCH/mogo-och-common-module/src/main/res/drawable-xhdpi/taxi_ic_login_bg.webp similarity index 100% rename from OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_ic_login_bg.webp rename to OCH/mogo-och-common-module/src/main/res/drawable-xhdpi/taxi_ic_login_bg.webp diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/taxi_login_bg_selector.xml b/OCH/mogo-och-common-module/src/main/res/drawable/taxi_login_bg_selector.xml similarity index 100% rename from OCH/mogo-och-taxi/src/main/res/drawable/taxi_login_bg_selector.xml rename to OCH/mogo-och-common-module/src/main/res/drawable/taxi_login_bg_selector.xml diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/taxi_login_enable.xml b/OCH/mogo-och-common-module/src/main/res/drawable/taxi_login_enable.xml similarity index 100% rename from OCH/mogo-och-taxi/src/main/res/drawable/taxi_login_enable.xml rename to OCH/mogo-och-common-module/src/main/res/drawable/taxi_login_enable.xml diff --git a/OCH/mogo-och-taxi/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 similarity index 100% rename from OCH/mogo-och-taxi/src/main/res/drawable/taxi_login_get_code_text_color.xml rename to OCH/mogo-och-common-module/src/main/res/drawable/taxi_login_get_code_text_color.xml diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/taxi_login_phone_error.xml b/OCH/mogo-och-common-module/src/main/res/drawable/taxi_login_phone_error.xml similarity index 100% rename from OCH/mogo-och-taxi/src/main/res/drawable/taxi_login_phone_error.xml rename to OCH/mogo-och-common-module/src/main/res/drawable/taxi_login_phone_error.xml diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/taxi_login_phone_normal.xml b/OCH/mogo-och-common-module/src/main/res/drawable/taxi_login_phone_normal.xml similarity index 100% rename from OCH/mogo-och-taxi/src/main/res/drawable/taxi_login_phone_normal.xml rename to OCH/mogo-och-common-module/src/main/res/drawable/taxi_login_phone_normal.xml diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/taxi_login_unenable.xml b/OCH/mogo-och-common-module/src/main/res/drawable/taxi_login_unenable.xml similarity index 100% rename from OCH/mogo-och-taxi/src/main/res/drawable/taxi_login_unenable.xml rename to OCH/mogo-och-common-module/src/main/res/drawable/taxi_login_unenable.xml 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-taxi/src/main/res/layout/taxi_login_view.xml b/OCH/mogo-och-common-module/src/main/res/layout/taxi_login_view.xml similarity index 99% rename from OCH/mogo-och-taxi/src/main/res/layout/taxi_login_view.xml rename to OCH/mogo-och-common-module/src/main/res/layout/taxi_login_view.xml index a75d2b576b..104d59e06a 100644 --- a/OCH/mogo-och-taxi/src/main/res/layout/taxi_login_view.xml +++ b/OCH/mogo-och-common-module/src/main/res/layout/taxi_login_view.xml @@ -7,6 +7,7 @@ android:layout_height="match_parent"> 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/model/TaxiPassengerModel.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.java index c3070eb0ba..297efdd6a9 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 @@ -497,7 +497,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); } diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerBaseFragment.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerBaseFragment.java index 34b8898d5f..4af679e575 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerBaseFragment.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerBaseFragment.java @@ -20,6 +20,7 @@ import com.mogo.eagle.core.function.api.hmi.view.IViewNotification; 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.map.CallerSmpManager; +import com.mogo.eagle.core.function.v2x.events.scenario.scene.airoad.AiRoadMarker; import com.mogo.eagle.core.utilcode.util.OverlayViewUtils; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; import com.mogo.map.MogoMapUIController; @@ -132,15 +133,18 @@ public class TaxiPassengerBaseFragment extends MvpFragment){ 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..fdef63f02d 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,6 +13,7 @@ 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.eagle.core.utilcode.util.BarUtils import com.mogo.och.common.module.utils.DateTimeUtil import com.mogo.och.common.module.utils.NumberFormatUtil import com.mogo.och.taxi.passenger.R @@ -293,6 +294,7 @@ class VideoActivity : AppCompatActivity() { override fun onResume() { super.onResume() + BarUtils.setNavBarVisibility(window,false) val carouselLayoutManager = rvVideoPlaylist?.layoutManager as CarouselLayoutManager val (centerItemPosition: Int, player) = getPlayer(carouselLayoutManager) if(centerItemPosition<0){ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_arrived_end_panel.xml b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_arrived_end_panel.xml index f07f9b6bb4..0f8835bef9 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_arrived_end_panel.xml +++ b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_arrived_end_panel.xml @@ -29,7 +29,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" @@ -44,7 +44,7 @@ @@ -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/src/main/java/com/mogo/och/taxi/callback/ITaxiCarStatusCallback.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/ITaxiCarStatusCallback.java index ac0eddc08a..b51f44ec35 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/ITaxiCarStatusCallback.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/ITaxiCarStatusCallback.java @@ -6,9 +6,7 @@ package com.mogo.och.taxi.callback; * Model->Presenter回调:接单车状态变更 登录状态变更 */ public interface ITaxiCarStatusCallback { - void onCarStatusChanged(boolean inOperation,String role); void onServiceDataUpdate(long dailyTimeDuration, long dailyOrderNum); - void onCarLoginStatusChange(boolean isLogin); } diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/ITaxiControllerStatusCallback.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/ITaxiControllerStatusCallback.java index ad3229062c..439f6ea974 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/ITaxiControllerStatusCallback.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/ITaxiControllerStatusCallback.java @@ -12,4 +12,6 @@ public interface ITaxiControllerStatusCallback { void onVRModeChanged(boolean isVRMode); // 自车定位 void onCarLocationChanged(Location location); + //开始开启自动驾驶 + void startOpenAutopilot(); } diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/TaxiConst.kt b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/TaxiConst.kt index 41a1280592..2a399bb339 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/TaxiConst.kt +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/TaxiConst.kt @@ -81,6 +81,5 @@ class TaxiConst { const val TIMER_START_AUTOPILOT_INTERVAL = 20 * 1000L - const val WAIT_TAKEN = 100046 } } \ No newline at end of file diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/TaxtServingStatusManager.kt b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/TaxtServingStatusManager.kt new file mode 100644 index 0000000000..7a42236e8b --- /dev/null +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/TaxtServingStatusManager.kt @@ -0,0 +1,38 @@ +package com.mogo.och.taxi.constant + +object TaxtServingStatusManager { + + /** + * 接单状态 + */ + private var openOrderStatus: TaxiOpenOrderStatusEnum = TaxiOpenOrderStatusEnum.None + + // region 是否可用接单 + @JvmStatic + fun isOpeningOrderStatus():Boolean{ + if(openOrderStatus==TaxiOpenOrderStatusEnum.Ordering){ + return true + } + return false + } + @JvmStatic + fun setOpenOrderStatus(status: Int) { + when (status) { + 0 -> { + this.openOrderStatus = TaxiOpenOrderStatusEnum.UnOrdering + } + 1 -> { + this.openOrderStatus = TaxiOpenOrderStatusEnum.Ordering + } + else -> { + this.openOrderStatus = TaxiOpenOrderStatusEnum.None + } + } + } + @JvmStatic + fun getOpenOrderStatus(): TaxiOpenOrderStatusEnum { + return openOrderStatus + } + + //endregion +} \ No newline at end of file diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiModel.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiModel.java index 06b77b0491..14f7a00753 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiModel.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiModel.java @@ -13,11 +13,11 @@ import android.net.ConnectivityManager; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import com.alibaba.android.arouter.launcher.ARouter; import com.amap.api.maps.model.LatLng; import com.elegant.network.utils.GsonUtil; import com.mogo.aicloud.services.socket.MogoAiCloudSocketManager; import com.mogo.cloud.commons.utils.CoordinateUtils; -import com.mogo.commons.debug.DebugConfig; import com.mogo.eagle.core.data.BaseData; import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters; import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo; @@ -28,18 +28,20 @@ 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.mogo.storage.SharedPrefsMgr; import com.mogo.eagle.core.utilcode.util.NetworkUtils; 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.biz.constant.LoginStatusManager; +import com.mogo.och.common.module.biz.constant.OchCommonConst; +import com.mogo.och.common.module.biz.provider.LoginService; +import com.mogo.och.common.module.manager.OCHAdasAbilityManager; import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil; import com.mogo.och.common.module.utils.PinYinUtil; import com.mogo.och.common.module.utils.ToastUtilsOch; import com.mogo.och.taxi.R; import com.mogo.och.taxi.bean.DriverServiceDataRespBean; -import com.mogo.och.taxi.bean.DriverStatusQueryRespBean; import com.mogo.och.taxi.bean.OrderGrabRespBean; import com.mogo.och.taxi.bean.OrderGrabStatusQueryRespBean; import com.mogo.och.taxi.bean.OrderQueryRespBean; @@ -50,19 +52,17 @@ import com.mogo.och.taxi.bean.OrdersListQueryRespBean; import com.mogo.och.taxi.bean.OrdersNewBookingQueryRespBean; import com.mogo.och.taxi.bean.QueryOrderRouteResp; import com.mogo.och.taxi.bean.TaxiDataBaseRespBean; -import com.mogo.och.taxi.bean.TaxiLogoutReqBean; import com.mogo.och.taxi.bean.TaxiOrPassengerReadyReqBean; import com.mogo.och.taxi.callback.ITaxiADASStatusCallback; import com.mogo.och.taxi.callback.ITaxiCarStatusCallback; import com.mogo.och.taxi.callback.ITaxiControllerStatusCallback; import com.mogo.och.taxi.callback.ITaxiOrderStatusCallback; -import com.mogo.och.taxi.constant.TaxiDriverRoleEnum; import com.mogo.och.taxi.constant.TaxiConst; import com.mogo.och.taxi.constant.TaxiOrderStatusEnum; import com.mogo.och.taxi.constant.TaxiOrderTypeEnum; +import com.mogo.och.taxi.constant.TaxtServingStatusManager; import com.mogo.och.taxi.network.TaxiServiceCallback; import com.mogo.och.taxi.network.TaxiServiceManager; -import com.mogo.och.taxi.utils.StatusManager; import com.mogo.och.taxi.utils.TaxiAnalyticsManager; import com.mogo.och.taxi.utils.OrderUtil; import com.mogo.aicloud.services.socket.IMogoLifecycleListener; @@ -79,10 +79,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; -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; @@ -119,7 +116,6 @@ public class TaxiModel { private ITaxiCarStatusCallback mCarStatusCallback; //Model->Presenter:接单状态、登录状态和司机今日接单状态 private ITaxiControllerStatusCallback mControllerStatusCallback; //Model->Presenter:VR mode等 private ITaxiOrderStatusCallback mOrderStatusCallback; //Model->Presenter:订单变更 - private Disposable subscribe; private volatile boolean isRestartAutopilot = false; @@ -127,6 +123,8 @@ public class TaxiModel { private double mLongitude, mLatitude; + private LoginService loginService; + private TaxiModel() { } @@ -149,6 +147,7 @@ public class TaxiModel { public void init(Context context) { mContext = context.getApplicationContext(); initListeners(); + loginService = (LoginService) ARouter.getInstance().build(OchCommonConst.LOGINSERVICE).navigation(); // IMogoServiceApis apis = MogoApisHandler.getInstance().getApis(); // apis.getSocketManagerApi(mContext).init(mContext, DebugConfig.getSocketAppId()); @@ -193,16 +192,13 @@ public class TaxiModel { CallerLogger.INSTANCE.d(M_TAXI + TAG, "Undeliverable exception"); } }); - queryCarStatus(); } public void release() { startOrStopOrderLoop(false); startOrStopCalculateRouteInfo(false); releaseListeners(); - if(subscribe!=null&&!subscribe.isDisposed()){ - subscribe.dispose(); - } + loginService = null; } private void initListeners() { @@ -248,7 +244,7 @@ public class TaxiModel { CallerAutopilotPlanningListenerManager.INSTANCE.removeListener(moGoAutopilotPlanningListener); } - private void startOrStopOrderLoop(boolean start) { + public void startOrStopOrderLoop(boolean start) { CallerLogger.INSTANCE.d(M_TAXI + TAG, "startOrStopOrderLoop() " + start); if (start) { TaxiModelLoopManager.getInstance().startInAndWaitOrdersLoop(); @@ -261,82 +257,18 @@ public class TaxiModel { } } - /** - * 接单状态和登录状态查询 - * 1、初始化查下状态 - * 2、点击更新接单状态 如果是初始化状态就查下状态 - * 3、点击更新接单状态后 查询状态 - * 4、网络状态波动时 查询状态 - * 5、登出后更新状态 - */ - public void queryCarStatus() { - TaxiServiceManager.getInstance().queryDriverServiceStatus(mContext, - new TaxiServiceCallback() { - @Override - public void onSuccess(DriverStatusQueryRespBean data) { - if (null != data && 0 == data.code) { - StatusManager.setLoginStatus(data.data.driverStatus); - StatusManager.setOpenOrderStatus(data.data.servingStatus); - //更新view - CallerLogger.INSTANCE.d(M_TAXI + TAG, "changeCarStatus:" + StatusManager.getLoginStatus()); - startOrStopOrderLoop(StatusManager.isLogin()&&StatusManager.isOpeningOrderStatus()); - if(mCarStatusCallback!=null) { - mCarStatusCallback.onCarLoginStatusChange(StatusManager.isLogin()); - } - String role = ""; - if (TaxiDriverRoleEnum.DEMO.getCode() == data.data.purpose) { - role = TaxiConst.DEMO_USER; - } else if (TaxiDriverRoleEnum.TEST.getCode() == data.data.purpose) { - role = TaxiConst.TEST_USER; - } - if (mCarStatusCallback != null) { - mCarStatusCallback.onCarStatusChanged(StatusManager.isOpeningOrderStatus(), role); - } - - } - } - - @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==TaxiConst.WAIT_TAKEN){ - subscribe = Observable.timer(3, TimeUnit.SECONDS).subscribe(aLong -> { - queryCarStatus(); - }); - }else { - if (mCarStatusCallback != null) { - mCarStatusCallback.onCarLoginStatusChange(StatusManager.isLogin()); - } - } - } - }); - } - //更新接单状态 public void updateCarStatus() { - if(!StatusManager.isLogin()){ - queryCarStatus(); + if(!LoginStatusManager.isLogin()){ + loginService.queryLoginStatusByNet(); return; } - TaxiServiceManager.getInstance().changeOrderServing(mContext,StatusManager.isOpeningOrderStatus(), + TaxiServiceManager.getInstance().changeOrderServing(mContext,TaxtServingStatusManager.isOpeningOrderStatus(), new TaxiServiceCallback() { @Override public void onSuccess(BaseData data) { if (null != data && 0 == data.code) { - //StatusManager.changeOrderStatus(); - queryCarStatus(); + loginService.queryLoginStatusByNet(); } } @@ -386,6 +318,8 @@ public class TaxiModel { //1.1.2. 当本地有currentOrder: //orderId不一致时:通过currentOrder.orderId查询订单状态,并通知ui更新 //orderId一致且orderStatus不一致时:则更新currentOrder,并通知ui更新 + CallerLogger.INSTANCE.d(M_TAXI + TAG,"AutopilotControl-mCurrentOCHOrder = "+mCurrentOCHOrder.orderStatus + + ", orderStatus = " +data.data.servicing.get(0).orderStatus); if (!mCurrentOCHOrder.orderNo.equals(data.data.servicing.get(0).orderNo)) { queryCurOrderStatus(); } else if (mCurrentOCHOrder.orderStatus != data.data.servicing.get(0).orderStatus) { @@ -855,20 +789,51 @@ public class TaxiModel { TaxiTrajectoryManager.getInstance().syncTrajectoryInfo(); SharedPrefsMgr.getInstance(mContext).putString(TaxiConst.SP_KEY_OCH_TAXI_ORDER, GsonUtil.jsonFromObject(data)); - if (FunctionBuildConfig.isDemoMode - && mCurrentOCHOrder.orderStatus == TaxiOrderStatusEnum.OnTheWayToEnd.getCode()) { - // 当美化模式(演示模式)开启时: 订单对应自动驾驶开启后,置true - FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = true; - CallerAutoPilotManager.INSTANCE.setIgnoreConditionDraw(true); - CallerAutoPilotManager.INSTANCE.setIPCDemoMode(true); - CallerLogger.INSTANCE.d(M_TAXI + TAG, "美化模式-ignore:置为true(更新本地order信息)"); + + if (mCurrentOCHOrder.orderStatus == TaxiOrderStatusEnum.OnTheWayToEnd.getCode()){ + if (FunctionBuildConfig.isDemoMode) { + // 当美化模式(演示模式)开启时: 订单对应自动驾驶开启后,置true + FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = true; + CallerAutoPilotManager.INSTANCE.setIgnoreConditionDraw(true); + CallerAutoPilotManager.INSTANCE.setIPCDemoMode(true); + CallerLogger.INSTANCE.d(M_TAXI + TAG, "美化模式-ignore:置为true(更新本地order信息)"); + } + + updateAutopilotControlParameters(); } + if (mCurrentOCHOrder.orderStatus == TaxiOrderStatusEnum.ArriveAtEnd.getCode()){ + if (FunctionBuildConfig.isDemoMode) { + CallerAutoPilotManager.INSTANCE.setIPCDemoMode(false); + } + + clearAutopilotControlParameters(); + } + } + + /** + * 将业务订单信息保存,鹰眼可取用 + */ + private void updateAutopilotControlParameters() { + + AutopilotControlParameters parameters = initAutopilotControlParameters(); + if (null == parameters){ + CallerLogger.INSTANCE.e(M_TAXI + TAG, "AutopilotControlParameters is empty."); + return; + } + CallerLogger.INSTANCE.d(M_TAXI + TAG, "AutopilotControlParameters is update."); + CallerAutoPilotStatusListenerManager.INSTANCE.updateAutopilotControlParameters(parameters); + } + + private void clearAutopilotControlParameters(){ + CallerLogger.INSTANCE.d(M_TAXI + TAG, "AutopilotControlParameters is clear."); + CallerAutoPilotStatusListenerManager.INSTANCE.updateAutopilotControlParameters(null); } //清除订单信息 public void clearCurrentOCHOrder() { startOrStopCalculateRouteInfo(false); mCurrentOCHOrder = null; + clearAutopilotControlParameters(); TaxiTrajectoryManager.getInstance().syncTrajectoryInfo(); SharedPrefsMgr.getInstance(mContext).remove(TaxiConst.SP_KEY_OCH_TAXI_ORDER); isRestartAutopilot = false; @@ -909,6 +874,12 @@ public class TaxiModel { return; } + if (!FunctionBuildConfig.isDemoMode && !OCHAdasAbilityManager.getInstance().getAutopilotAbilityStatus()){ + ToastUtils.showLong(OCHAdasAbilityManager.getInstance().getAutopilotUnAbilityReason() + + ", 请稍候重试"); + return; + } + if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE == CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState()) { // TODO: 2021/11/28 工控机存在刚开始状态为0,但是可以开启变为2,工控机解决前不显示此toast @@ -923,12 +894,45 @@ public class TaxiModel { isRestartAutopilot = true; } + AutopilotControlParameters parameters = initAutopilotControlParameters(); + + if (null == parameters) { + CallerLogger.INSTANCE.e(M_TAXI + TAG, "AutopilotControlParameters is empty."); + return; + } + + CallerAutoPilotManager.INSTANCE.startAutoPilot(parameters); + CallerLogger.INSTANCE.d(M_TAXI + TAG, "start autopilot with parameter: %s", + GsonUtil.jsonFromObject(parameters) + + " ,startSiteName=" + mCurrentOCHOrder.startSiteAddr + + " ,endSiteName=" + mCurrentOCHOrder.endSiteAddr + + "isRestartAutopilot = "+isRestartAutopilot); + + TaxiAnalyticsManager.getInstance().triggerStartAutopilotEvent(isRestartAutopilot, false, + mCurrentOCHOrder.startSiteAddr, mCurrentOCHOrder.endSiteAddr, mCurrentOCHOrder.orderNo); + + if (mControllerStatusCallback != null) { + mControllerStatusCallback.startOpenAutopilot(); + } + + // TODO: 2021/8/20 无工控机环境, 手动调起自动驾驶开启返回结果,有工控机环境要删除 +// OCHTaxiUiController.getInstance().onAutoPilotStatusChanged( IMogoAdasOCHCallback.STATUS_AUTOPILOT_RUNNING, "开启自动驾驶" ); + } + + private AutopilotControlParameters initAutopilotControlParameters() { + + if (!checkCurrentOCHOrder()) { + CallerLogger.INSTANCE.e(M_TAXI + TAG, "no order or order is empty."); + return null; + } + + AutopilotControlParameters parameters = new AutopilotControlParameters(); + double startWgsLon = mCurrentOCHOrder.startSitePoint.get(0); double startWgsLat = mCurrentOCHOrder.startSitePoint.get(1); double endWgsLon = mCurrentOCHOrder.endSitePoint.get(0); double endWgsLat = mCurrentOCHOrder.endSitePoint.get(1); - AutopilotControlParameters parameters = new AutopilotControlParameters(); parameters.vehicleType = mCurrentOCHOrder.businessType; parameters.startName = PinYinUtil.getPinYinHeadChar(mCurrentOCHOrder.startSiteAddr); // 起点名称拼音首字母大写:科学城B区2号门(KXCBQ2HM) parameters.endName = PinYinUtil.getPinYinHeadChar(mCurrentOCHOrder.endSiteAddr); // 终点名称拼音首字母大写:科学城C区三号门(KXCCQSHM) @@ -944,15 +948,7 @@ public class TaxiModel { mCurrentOCHOrder.txtFileUrlDPQP, mCurrentOCHOrder.txtFileMd5DPQP, mCurrentOCHOrder.contrailSaveTimeDPQP); } - CallerAutoPilotManager.INSTANCE.startAutoPilot(parameters); - CallerLogger.INSTANCE.d(M_TAXI + TAG, "start autopilot with parameter: %s", GsonUtil.jsonFromObject(parameters) - + " ,startSiteName=" + mCurrentOCHOrder.startSiteAddr + " ,endSiteName=" + mCurrentOCHOrder.endSiteAddr); - - TaxiAnalyticsManager.getInstance().triggerStartAutopilotEvent(isRestartAutopilot, false, - mCurrentOCHOrder.startSiteAddr, mCurrentOCHOrder.endSiteAddr, mCurrentOCHOrder.orderNo); - - // TODO: 2021/8/20 无工控机环境, 手动调起自动驾驶开启返回结果,有工控机环境要删除 -// OCHTaxiUiController.getInstance().onAutoPilotStatusChanged( IMogoAdasOCHCallback.STATUS_AUTOPILOT_RUNNING, "开启自动驾驶" ); + return parameters; } //结束自动驾驶 @@ -977,18 +973,8 @@ public class TaxiModel { startLon, startLat, location.getLongitude(), location.getLatitude()); - if (DebugConfig.isDebug() && mCurrentOCHOrder.orderStatus == TaxiOrderStatusEnum.OnTheWayToStart.getCode()) { - // ToastUtils.showShort("距离上车点:" + Double.valueOf(distance).intValue()); - } - CallerLogger.INSTANCE.i(M_TAXI + TAG, "judgeStartStation() distance = " + distance); - if (distance > TaxiConst.ARRIVE_AT_START_STATION_DISTANCE) { - distance = CoordinateUtils.calculateLineDistance(startLon, startLat, - CallerAutoPilotStatusListenerManager.INSTANCE.getCurWgs84Lon(), - CallerAutoPilotStatusListenerManager.INSTANCE.getCurWgs84Lat()); - } - if (distance <= TaxiConst.ARRIVE_AT_START_STATION_DISTANCE) { arrivedStartPoint(); return; @@ -1002,8 +988,8 @@ public class TaxiModel { CallerLogger.INSTANCE.d(M_TAXI + TAG, "onIntentReceived = %s", intentStr); if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intentStr)) { if (NetworkUtils.isConnected(mContext)) { - startOrStopOrderLoop(StatusManager.isLogin()&&StatusManager.isOpeningOrderStatus()); - queryCarStatus(); + startOrStopOrderLoop(LoginStatusManager.isLogin()&&TaxtServingStatusManager.isOpeningOrderStatus()); + loginService.queryLoginStatusByNet(); } } } @@ -1075,12 +1061,6 @@ public class TaxiModel { CallerLogger.INSTANCE.i(M_TAXI + TAG, "judgeEndStation() distance = " + distance); - if (distance > TaxiConst.ARRIVE_AT_START_STATION_DISTANCE) { - distance = CoordinateUtils.calculateLineDistance(startLon, startLat, - CallerAutoPilotStatusListenerManager.INSTANCE.getCurWgs84Lon(), - CallerAutoPilotStatusListenerManager.INSTANCE.getCurWgs84Lat()); - } - if (distance <= TaxiConst.ARRIVE_AT_START_STATION_DISTANCE) { if (!checkCurrentOCHOrder() || (getCurOrderStatus() == TaxiOrderStatusEnum.ArriveAtEnd)) { @@ -1161,7 +1141,6 @@ public class TaxiModel { TaxiAnalyticsManager.getInstance().triggerStartAutopilotEvent(isRestartAutopilot, true, mCurrentOCHOrder.startSiteAddr, mCurrentOCHOrder.endSiteAddr, mCurrentOCHOrder.orderNo); - if (FunctionBuildConfig.isDemoMode) { // 当美化模式(演示模式)开启时: 订单对应自动驾驶开启后,置true FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = true; @@ -1179,7 +1158,7 @@ public class TaxiModel { // 当美化模式(演示模式)开启时:且有订单、且为去往目的地状态,维持自动驾驶icon开启状态 return; } - if (state != mPrevAPStatus && mADASStatusCallback != null){ + if (mADASStatusCallback != null){ mADASStatusCallback.onAutopilotEnable(); } mPrevAPStatus = state; @@ -1191,7 +1170,7 @@ public class TaxiModel { // 当美化模式(演示模式)开启时:且有订单、且为去往目的地状态,维持自动驾驶icon开启状态 return; } - if (state != mPrevAPStatus && mADASStatusCallback != null){ + if (mADASStatusCallback != null){ mADASStatusCallback.onAutopilotDisable(); } mPrevAPStatus = state; @@ -1209,7 +1188,7 @@ public class TaxiModel { } return; } - if (state != mPrevAPStatus && mADASStatusCallback != null){ + if (mADASStatusCallback != null){ mADASStatusCallback.onManMachineCoDriving(); } mPrevAPStatus = state; @@ -1233,8 +1212,9 @@ public class TaxiModel { if (FunctionBuildConfig.isDemoMode) { // 当美化模式(演示模式)开启时: 到达目的地,置false - FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = false; - CallerAutoPilotManager.INSTANCE.setIgnoreConditionDraw(false); + // 2022.10.08 到达目的地时候取消自动起自驾, 服务完成取消引导线和自动驾驶按钮状态 +// FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = false; +// CallerAutoPilotManager.INSTANCE.setIgnoreConditionDraw(false); CallerAutoPilotManager.INSTANCE.setIPCDemoMode(false); CallerLogger.INSTANCE.d(M_TAXI + TAG, "美化模式-ignore:置为false(到达目的地)"); } @@ -1312,7 +1292,7 @@ public class TaxiModel { public void updateOrderRouteInfo(List models) { if (null == models || models.size() == 0) return; if (mCurrentOCHOrder == null) return; - Logger.d(M_TAXI + TAG, "--------计算出sumLength开始---------- "); + CallerLogger.INSTANCE.d(M_TAXI + TAG, "--------计算出sumLength开始---------- "); //转换成高德坐标系 if (mRoutePoints.size() > 0){ @@ -1323,12 +1303,12 @@ public class TaxiModel { } public void startDynamicCalculateRouteInfo() { - Logger.d(M_TAXI + TAG, "--------mCurrentOCHOrder---------- " + mCurrentOCHOrder); + CallerLogger.INSTANCE.d(M_TAXI + TAG, "--------mCurrentOCHOrder---------- " + mCurrentOCHOrder); if (mCurrentOCHOrder != null && mRoutePoints.size() == 0) {//根据orderNo去查询 queryOrderRouteList(mCurrentOCHOrder.orderNo); } - Logger.d(M_TAXI + TAG, "--------mRoutePoints.size---------- " + mRoutePoints.size()); + CallerLogger.INSTANCE.d(M_TAXI + TAG, "--------mRoutePoints.size---------- " + mRoutePoints.size()); if (mRoutePoints.size() > 0){ reportTotalDisAndTime(); @@ -1340,9 +1320,7 @@ public class TaxiModel { private void reportTotalDisAndTime() { float lastSumLength = CoordinateCalculateRouteUtil.calculateRouteSumLength(mRoutePoints); double lastTime = lastSumLength / TaxiConst.TAXI_AVERAGE_SPEED * 3.6; //秒 -// if (mOrderStatusCallback != null) { -// mOrderStatusCallback.onCurrentOrderDistToEndChanged((long) lastSumLength, (long) lastTime); -// } + reportOrderRemain((long) lastSumLength, (long) lastTime); } @@ -1368,7 +1346,7 @@ public class TaxiModel { } double lastTime = lastSumLength / TaxiConst.TAXI_AVERAGE_SPEED * 3.6; //秒 - Logger.d(M_TAXI + "dynamicCalculateRouteInfo" + CallerLogger.INSTANCE.d(M_TAXI + "dynamicCalculateRouteInfo" , "---lastSumLength: " + lastSumLength + "----lastTime : " + lastTime + " thread = "+ Thread.currentThread().getName()); @@ -1464,9 +1442,7 @@ public class TaxiModel { , new TaxiServiceCallback() { @Override public void onSuccess(TaxiDataBaseRespBean data) { - if (null != data && 0 == data.code){ - updateOrderStatus(TaxiOrderStatusEnum.UserArriveAtStart); - } + } @Override @@ -1488,9 +1464,7 @@ public class TaxiModel { , new TaxiServiceCallback() { @Override public void onSuccess(TaxiDataBaseRespBean data) { - if (null != data && 0 == data.code){ - updateOrderStatus(TaxiOrderStatusEnum.OnTheWayToEnd); - } + } @Override @@ -1510,9 +1484,7 @@ public class TaxiModel { , new TaxiServiceCallback() { @Override public void onSuccess(TaxiDataBaseRespBean data) { - if (null != data && 0 == data.code){ - updateOrderStatus(TaxiOrderStatusEnum.ArriveAtStart); - } + } @Override @@ -1533,9 +1505,7 @@ public class TaxiModel { , new TaxiServiceCallback() { @Override public void onSuccess(TaxiDataBaseRespBean data) { - if (null != data && 0 == data.code){ - updateOrderStatus(TaxiOrderStatusEnum.ArriveAtEnd); - } + } @Override @@ -1556,9 +1526,9 @@ public class TaxiModel { , new TaxiServiceCallback() { @Override public void onSuccess(TaxiDataBaseRespBean data) { - if (null != data && 0 == data.code){ - updateOrderStatus(TaxiOrderStatusEnum.JourneyCompleted); - } +// if (null != data && 0 == data.code){ +// updateOrderStatus(TaxiOrderStatusEnum.JourneyCompleted); +// } } @Override @@ -1567,43 +1537,9 @@ public class TaxiModel { } }); } - //更新当前订单状态 - public void updateOrderStatus(final TaxiOrderStatusEnum orderStatus) { - if (mCurrentOCHOrder == null) { - return; - } - mCurrentOCHOrder.orderStatus = orderStatus.getCode(); - if (mOrderStatusCallback != null) { - mOrderStatusCallback.onCurrentOrderStatusChanged(mCurrentOCHOrder); - } - } // 登出 public void logout() { - TaxiLogoutReqBean.Location4Login location4Login = new TaxiLogoutReqBean.Location4Login(mLatitude, mLongitude); - TaxiServiceManager.getInstance().logout(mContext,location4Login, - new TaxiServiceCallback() { - @Override - public void onSuccess(BaseData data) { - if (null != data && 0 == data.code) { - mCarStatusCallback.onCarLoginStatusChange(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); - } - }); + loginService.loginOut(mLatitude,mLongitude); } } diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/TaxiServiceApiNew.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/TaxiServiceApiNew.java index 8b29d4039d..cbb3885cf6 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/TaxiServiceApiNew.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/TaxiServiceApiNew.java @@ -2,7 +2,6 @@ package com.mogo.och.taxi.network; import com.mogo.eagle.core.data.BaseData; import com.mogo.och.taxi.bean.CarHeartbeatReqBean; import com.mogo.och.taxi.bean.DriverServiceDataRespBean; -import com.mogo.och.taxi.bean.DriverStatusQueryRespBean; import com.mogo.och.taxi.bean.DriverStatusUpdateReqBean; import com.mogo.och.taxi.bean.OrderCancelReqBean; import com.mogo.och.taxi.bean.OrderGrabReqBean; @@ -20,10 +19,6 @@ import com.mogo.och.taxi.bean.OrdersListQueryRespBean; import com.mogo.och.taxi.bean.OrdersNewBookingQueryRespBean; import com.mogo.och.taxi.bean.QueryOrderRouteResp; import com.mogo.och.taxi.bean.TaxiDataBaseRespBean; -import com.mogo.och.taxi.bean.TaxiLoginReqBean; -import com.mogo.och.taxi.bean.TaxiLoginRespBean; -import com.mogo.och.taxi.bean.TaxiLoginSmsReqBean; -import com.mogo.och.taxi.bean.TaxiLogoutReqBean; import com.mogo.och.taxi.bean.TaxiOrPassengerReadyReqBean; import com.mogo.och.taxi.bean.UpdateOrderDisAndTimeReqBean; @@ -290,35 +285,6 @@ interface TaxiServiceApiNew { Observable orderCompleted(@Header ("appId") String appId , @Header("ticket") String ticket,@Body TaxiOrPassengerReadyReqBean data); - - /** - * 获取手机验证码 - * - * @return - */ - @Headers( {"Content-type:application/json;charset=UTF-8"} ) -// @GET( "/autopilot-car-hailing/api/v1/driver/serviceStatus/query" ) - @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 gotoLoginBycode(@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 logout(@Header ("appId") String appId,@Header("ticket") String ticket, - @Body TaxiLogoutReqBean data); /** * 暂停接单 * @param data @@ -339,15 +305,4 @@ interface TaxiServiceApiNew { @POST( "/autopilot-car-hailing/cab/flow/v1/driver/taxi/resetOrderServing" ) Observable resetOrderServing(@Header ("appId") String appId,@Header("ticket") String ticket ,@Body DriverStatusUpdateReqBean data); - /** - * 接单状态和登录状态查询 - * @param sn - * @return - */ - @Headers( {"Content-type:application/json;charset=UTF-8"} ) -// @GET( "/autopilot-car-hailing/api/v1/driver/serviceStatus/query" ) - @GET( "/autopilot-car-hailing/operation/v1/driver/taxi/loginStatus" ) - Observable queryDriverServiceStatusAndLoginStatus(@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/TaxiServiceManager.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/TaxiServiceManager.java index 333ca64fd9..1d99bce35c 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/TaxiServiceManager.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/TaxiServiceManager.java @@ -4,7 +4,6 @@ import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAX import android.content.Context; -import com.mogo.cloud.passport.MoGoAiCloudClient; import com.mogo.cloud.passport.MoGoAiCloudClientConfig; import com.mogo.eagle.core.data.BaseData; import com.mogo.eagle.core.network.MoGoRetrofitFactory; @@ -13,7 +12,6 @@ import com.mogo.eagle.core.network.SubscribeImpl; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.och.taxi.bean.CarHeartbeatReqBean; import com.mogo.och.taxi.bean.DriverServiceDataRespBean; -import com.mogo.och.taxi.bean.DriverStatusQueryRespBean; import com.mogo.och.taxi.bean.DriverStatusUpdateReqBean; import com.mogo.och.taxi.bean.OrderCancelReqBean; import com.mogo.och.taxi.bean.OrderGrabReqBean; @@ -31,10 +29,6 @@ import com.mogo.och.taxi.bean.OrdersListQueryRespBean; import com.mogo.och.taxi.bean.OrdersNewBookingQueryRespBean; import com.mogo.och.taxi.bean.QueryOrderRouteResp; import com.mogo.och.taxi.bean.TaxiDataBaseRespBean; -import com.mogo.och.taxi.bean.TaxiLoginReqBean; -import com.mogo.och.taxi.bean.TaxiLoginRespBean; -import com.mogo.och.taxi.bean.TaxiLoginSmsReqBean; -import com.mogo.och.taxi.bean.TaxiLogoutReqBean; import com.mogo.och.taxi.bean.TaxiOrPassengerReadyReqBean; import com.mogo.och.taxi.bean.UpdateOrderDisAndTimeReqBean; import com.mogo.och.taxi.constant.TaxiConst; @@ -263,26 +257,6 @@ public class TaxiServiceManager { .subscribe(getSubscribeImpl(context, callback, "updateDriverServiceStatus")); } - /** - * 接单状态和登录状态查询 - * @param context - * @param callback - */ - public void queryDriverServiceStatus(Context context, - TaxiServiceCallback callback) { - if(MoGoAiCloudClientConfig.getInstance().getToken().isEmpty()){ - callback.onFail(TaxiConst.WAIT_TAKEN,"等待令牌中请稍等"); - MoGoAiCloudClient.getInstance().refreshToken(); - return; - } - mOCHTaxiServiceApi.queryDriverServiceStatusAndLoginStatus(MoGoAiCloudClientConfig.getInstance().getServiceAppId() - ,MoGoAiCloudClientConfig.getInstance().getToken() - ,MoGoAiCloudClientConfig.getInstance().getSn()) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(getSubscribeImpl(context, callback, "queryDriverServiceStatus")); - } - /** * 车机端上传心跳数据(只在出车状态时上传):包含高德坐标系经纬度 * @param context @@ -451,56 +425,10 @@ public class TaxiServiceManager { ,orderNo,loc)) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .subscribe(getSubscribeImpl(context, callback, "arriveTerminal")); + .subscribe(getSubscribeImpl(context, callback, "orderCompleted")); } - /** - * 获取手机验证码 - * @param context - * @param callback - */ - public void getPhoneCode(Context context,String phone, - TaxiServiceCallback callback) { - mOCHTaxiServiceApi.getPhoneCode(MoGoAiCloudClientConfig.getInstance().getServiceAppId() - , MoGoAiCloudClientConfig.getInstance().getToken() - , new TaxiLoginSmsReqBean(phone)) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(getSubscribeImpl(context, callback, "getPhoneCode")); - } - /** - * 通过验证码登录 - * @param context - * @param callback - */ - public void gotoLoginBycode(Context context, String phone, String code, - TaxiLoginReqBean.Location4Login location4Login, - TaxiServiceCallback callback) { - String sn = MoGoAiCloudClientConfig.getInstance().getSn(); - mOCHTaxiServiceApi.gotoLoginBycode(MoGoAiCloudClientConfig.getInstance().getServiceAppId() - , MoGoAiCloudClientConfig.getInstance().getToken() - , new TaxiLoginReqBean(phone, code, sn, location4Login)) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(getSubscribeImpl(context, callback, "gotoLoginBycode")); - } - - /** - * 登出 - */ - public void logout(Context context, TaxiLogoutReqBean.Location4Login location4Login, TaxiServiceCallback callback) { - mOCHTaxiServiceApi.logout( - MoGoAiCloudClientConfig.getInstance().getServiceAppId(), - MoGoAiCloudClientConfig.getInstance().getToken(), - new TaxiLogoutReqBean(MoGoAiCloudClientConfig.getInstance().getSn(), location4Login)) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(getSubscribeImpl(context, callback, "logout")); - } - - - private SubscribeImpl getSubscribeImpl( Context context, TaxiServiceCallback callback, String apiName) { return new SubscribeImpl(RequestOptions.create(context)) { diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/TaxiPresenter.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/TaxiPresenter.java index 5bd2c9cb2f..936ac5e68f 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/TaxiPresenter.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/TaxiPresenter.java @@ -15,7 +15,12 @@ import com.mogo.commons.mvp.Presenter; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; +import com.mogo.och.common.module.biz.bean.DriverStatusQueryRespBean; +import com.mogo.och.common.module.biz.callback.ILoginCallback; +import com.mogo.och.common.module.biz.constant.LoginStatusManager; +import com.mogo.och.common.module.manager.OCHAdasAbilityManager; import com.mogo.och.taxi.constant.TaxiConst; +import com.mogo.och.taxi.constant.TaxiDriverRoleEnum; import com.mogo.och.taxi.constant.TaxiOrderStatusEnum; import com.mogo.och.taxi.bean.OrderQueryRespBean; import com.mogo.och.taxi.bean.OrderQueryRouteInfoRespBean; @@ -23,6 +28,7 @@ import com.mogo.och.taxi.callback.ITaxiADASStatusCallback; import com.mogo.och.taxi.callback.ITaxiCarStatusCallback; import com.mogo.och.taxi.callback.ITaxiControllerStatusCallback; import com.mogo.och.taxi.callback.ITaxiOrderStatusCallback; +import com.mogo.och.taxi.constant.TaxtServingStatusManager; import com.mogo.och.taxi.model.TaxiModel; import com.mogo.och.taxi.ui.TaxiFragment; @@ -37,16 +43,16 @@ import java.util.List; * 描述 */ public class TaxiPresenter extends Presenter implements ITaxiADASStatusCallback, - ITaxiCarStatusCallback, ITaxiOrderStatusCallback, ITaxiControllerStatusCallback { + ITaxiCarStatusCallback, ITaxiOrderStatusCallback, ITaxiControllerStatusCallback, ILoginCallback { private static final String TAG = TaxiPresenter.class.getSimpleName(); - private boolean isFirstShow = true; private int preAutopilotStatus = 0; public TaxiPresenter(TaxiFragment view) { super(view); TaxiModel.getInstance().init(AbsMogoApplication.getApp()); + OCHAdasAbilityManager.getInstance().init(AbsMogoApplication.getApp()); initListeners(); } @@ -64,16 +70,6 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS TaxiModel.getInstance().release(); } - @Override - public void onResume(@NonNull LifecycleOwner owner) { - super.onResume(owner); - if(isFirstShow){ - isFirstShow = false; - }else { - TaxiModel.getInstance().queryCarStatus(); - } - } - private void initListeners() { TaxiModel.getInstance().setADASStatusCallback(this); TaxiModel.getInstance().setCarStatusCallback(this); @@ -86,6 +82,7 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS TaxiModel.getInstance().setCarStatusCallback(null); TaxiModel.getInstance().setControllerStatusCallback(null); TaxiModel.getInstance().setOrderStatusCallback(null); + OCHAdasAbilityManager.getInstance().release(); } private void runOnUIThread( Runnable executor ) { @@ -100,12 +97,19 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS } /** - * 开启自动驾驶 + * 开启自动驾驶 自驾模式 */ public void startAutoPilot() { TaxiModel.getInstance().startAutoPilot(); } + /** + * 人工模式 + */ + public void startManualDrive(){ + TaxiModel.getInstance().startServicePilotDone(); + } + /** * 跳过乘客验证环节 */ @@ -113,13 +117,6 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS TaxiModel.getInstance().jumpPassengerCheckDone(); } - /** - * 登录成功后查询登录状态 - */ - public void queryLoginStatus() { - TaxiModel.getInstance().queryCarStatus(); - } - /** * 司机确认车辆环境可开启自动驾驶 */ @@ -218,25 +215,11 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS preAutopilotStatus = IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING; } - @Override - public void onCarStatusChanged(boolean inOperation, String role) { - runOnUIThread(() -> mView.updateOperationStatus(inOperation,role)); - } - @Override public void onServiceDataUpdate(long dailyTimeDuration, long dailyOrderNum) { runOnUIThread(() -> mView.onServiceDataUpdate(dailyTimeDuration,dailyOrderNum)); } - @Override - public void onCarLoginStatusChange(boolean isLogin) { - if(isLogin){ - mView.hideLoginDialogFragment(); - }else { - mView.showLoginDialogFragment(); - } - } - @Override public void onOrdersInServiceChanged(@NonNull @NotNull List inServiceList) { @@ -337,4 +320,36 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS }); } } + + @Override + public void startOpenAutopilot() { + runOnUIThread(() -> { + mView.startOrStopLoadingAnim(true); + }); + } + + @Override + public void loginSuccess(DriverStatusQueryRespBean data) { + //设置 接单状态 + TaxtServingStatusManager.setOpenOrderStatus(data.data.servingStatus); + //设置 是否启动订单轮训 + TaxiModel.getInstance().startOrStopOrderLoop(LoginStatusManager.isLogin()&&TaxtServingStatusManager.isOpeningOrderStatus()); + + // 设置当前用户角色 + String role = ""; + if (TaxiDriverRoleEnum.DEMO.getCode() == data.data.purpose) { + role = TaxiConst.DEMO_USER; + } else if (TaxiDriverRoleEnum.TEST.getCode() == data.data.purpose) { + role = TaxiConst.TEST_USER; + } + String finalRole = role; + runOnUIThread(() -> { + mView.updateOperationStatus(TaxtServingStatusManager.isOpeningOrderStatus(), finalRole); + }); + } + + @Override + public void loginFail(boolean isLogin) { + + } } diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/BaseTaxiTabFragment.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/BaseTaxiTabFragment.java index 32c19748a4..54ee62dd60 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/BaseTaxiTabFragment.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/BaseTaxiTabFragment.java @@ -1,12 +1,12 @@ package com.mogo.och.taxi.ui; +import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI; import static com.mogo.och.taxi.constant.TaxiConst.TIMER_START_AUTOPILOT_INTERVAL; import android.animation.ObjectAnimator; import android.os.Handler; import android.os.Looper; import android.os.SystemClock; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.animation.LinearInterpolator; @@ -21,9 +21,7 @@ import androidx.annotation.Nullable; import androidx.constraintlayout.widget.Group; import androidx.fragment.app.FragmentTransaction; -import com.mogo.cloud.httpdns.util.L; import com.mogo.commons.AbsMogoApplication; -import com.mogo.commons.debug.DebugConfig; import com.mogo.commons.mvp.IView; import com.mogo.commons.mvp.MvpFragment; import com.mogo.commons.mvp.Presenter; @@ -36,6 +34,8 @@ 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.call.map.CallerSmpManager; +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; import com.mogo.map.MogoMapUIController; @@ -195,22 +195,24 @@ public abstract class BaseTaxiTabFragment taxiLoginDialogFragment = null; private WeakReference personalDialogFragment = null; protected double mCurLatitude = 0.0; protected double mCurLongitude = 0.0; + private LoginService loginService; + + @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()); + } + } @Nullable @Override @@ -77,14 +84,13 @@ public class TaxiFragment extends BaseTaxiTabFragment { if (!isStarting){ mPresenter.startAutoPilot(); - startOrStopLoadingAnim(true); } TaxiModel.getInstance().setOnTheWayToEndStation(); }); @@ -379,57 +383,11 @@ public class TaxiFragment extends BaseTaxiTabFragment(TaxiLoginDialogFragment.newInstance()); - } - TaxiLoginDialogFragment taxiLoginDialog = taxiLoginDialogFragment.get(); - if(taxiLoginDialog!=null) { - if (taxiLoginDialog.getDialog() != null && taxiLoginDialog.getDialog().isShowing()) { - return; - } - if (taxiLoginDialog.isAdded()) {//解决方法就是添加这行代码,如果已经添加了,就移除掉然后再show,就不会出现Fragment already added的错误了。 - getParentFragmentManager().beginTransaction().remove(taxiLoginDialog).commitAllowingStateLoss(); - } - CallerLogger.INSTANCE.d(M_TAXI + TAG,"showLoginDialogFragment 展示登录界面"); - taxiLoginDialog.show(getParentFragmentManager(), TaxiLoginDialogFragment.Companion.getTAG()); - taxiLoginDialog.setOnDismissListener(dialog -> { - taxiLoginDialogFragment.clear(); - mPresenter.queryLoginStatus(); - }); - } - } - public void hideLoginDialogFragment(){ - CallerLogger.INSTANCE.d(M_TAXI + TAG,"hideLoginDialogFragment 隐藏登录界面"); - if(taxiLoginDialogFragment!=null&&taxiLoginDialogFragment.get()!=null){ - taxiLoginDialogFragment.get().dismissAllowingStateLoss(); - } - } - private void testRouteInfoUpload() { TPRouteDataTestUtils.converToRouteData(); } - /** - * Taxi调试信息:订单、线路、轨迹等信息 - * - * START - */ + //region Taxi调试信息:订单、线路、轨迹等信息 private View testBar; private TextView testCurOrderId; private TextView testCurLineId; @@ -474,7 +432,6 @@ public class TaxiFragment extends BaseTaxiTabFragment orders = new ArrayList<>(); private String[] mTabTitles = {"在线时长","订单完成数"}; private List fragments = new ArrayList<>(); - private int mNextPage = 0; + private int mNextPage = 1;//订单列表分页从1开始 private int mPerPageSize = 10; private static TaxiFragment mTaxiFragment; private static boolean serverHadNoData = false; @@ -266,25 +266,31 @@ public class TaxiPersonalDialogFragment extends DialogFragment implements View.O } public void onOrdersListPageRefresh(List ordersList){ - if (null == ordersList && mNextPage == 0){//无数据 - mOrdersRv.setVisibility(View.GONE); - mNoDatas.setVisibility(View.VISIBLE); - return; - } - mOrdersRv.setVisibility(View.VISIBLE); - mNoDatas.setVisibility(View.GONE); - if ((null == ordersList) || (ordersList.size() < mPerPageSize && mNextPage > 0)){//已经没有更多数据,提示无数据 - //已经没有更多数据 - serverHadNoData = true; + try { + if (null == ordersList && mNextPage == 0){//无数据 + mOrdersRv.setVisibility(View.GONE); + mNoDatas.setVisibility(View.VISIBLE); + return; + } + mOrdersRv.setVisibility(View.VISIBLE); + mNoDatas.setVisibility(View.GONE); + if ((null == ordersList) || (ordersList.size() < mPerPageSize && mNextPage > 0)){//已经没有更多数据,提示无数据 + //已经没有更多数据 + serverHadNoData = true; + orders.addAll(ordersList); + mAdapter.notifyDataSetChanged(); + mNextPage = mNextPage +1; + return; + } + serverHadNoData = false; orders.addAll(ordersList); - mAdapter.notifyDataSetChanged(); + if(mAdapter!=null) { + mAdapter.notifyDataSetChanged(); + } mNextPage = mNextPage +1; - return; + }catch (Exception e){ + e.fillInStackTrace(); } - serverHadNoData = false; - orders.addAll(ordersList); - mAdapter.notifyDataSetChanged(); - mNextPage = mNextPage +1; } class OrderAdapter extends RecyclerView.Adapter{ diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiServerOrdersFragment.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiServerOrdersFragment.java index edc7ef9ef7..0e4f2bd53b 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiServerOrdersFragment.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiServerOrdersFragment.java @@ -213,8 +213,8 @@ public class TaxiServerOrdersFragment extends BaseTaxiUIFragment { beingServerdOrdersFragment.onCurrentOrderRouteInfoGot(routeInfo); } - public void updateOrderUI() { + public void updateOrderBottomBtnUI() { if (null == beingServerdOrdersFragment) return; - beingServerdOrdersFragment.updateOrderUI(); + beingServerdOrdersFragment.updateOrderBottomBtnUI(); } } diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/utils/StatusManager.kt b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/utils/StatusManager.kt deleted file mode 100644 index f563bbc030..0000000000 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/utils/StatusManager.kt +++ /dev/null @@ -1,73 +0,0 @@ -package com.mogo.och.taxi.utils - -import com.mogo.och.taxi.constant.TaxiLoginStatusEnum -import com.mogo.och.taxi.constant.TaxiOpenOrderStatusEnum - -object StatusManager { - /** - * 登录状态 - */ - private var loginStatus: TaxiLoginStatusEnum = TaxiLoginStatusEnum.None - - /** - * 接单状态 - */ - private var openOrderStatus: TaxiOpenOrderStatusEnum = TaxiOpenOrderStatusEnum.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 - } - // region 是否可用接单 - @JvmStatic - fun isOpeningOrderStatus():Boolean{ - if(openOrderStatus==TaxiOpenOrderStatusEnum.Ordering){ - return true - } - return false - } - @JvmStatic - fun setOpenOrderStatus(status: Int) { - when (status) { - 0 -> { - this.openOrderStatus = TaxiOpenOrderStatusEnum.UnOrdering - } - 1 -> { - this.openOrderStatus = TaxiOpenOrderStatusEnum.Ordering - } - else -> { - this.openOrderStatus = TaxiOpenOrderStatusEnum.None - } - } - } - @JvmStatic - fun getOpenOrderStatus(): TaxiOpenOrderStatusEnum { - return openOrderStatus - } - - //endregion -} \ No newline at end of file diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/order_drive_mode_bg.png b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/order_drive_mode_bg.png new file mode 100644 index 0000000000..ec754b829f Binary files /dev/null and b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/order_drive_mode_bg.png differ diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1600/order_drive_mode_bg.png b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1600/order_drive_mode_bg.png new file mode 100644 index 0000000000..ec754b829f Binary files /dev/null and b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1600/order_drive_mode_bg.png differ diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1600/taxi_ic_login_bg.webp b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1600/taxi_ic_login_bg.webp deleted file mode 100644 index 7af7432551..0000000000 Binary files a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1600/taxi_ic_login_bg.webp and /dev/null differ diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/order_drive_mode_bg.png b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/order_drive_mode_bg.png new file mode 100644 index 0000000000..ec754b829f Binary files /dev/null and b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/order_drive_mode_bg.png differ diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_ic_login_bg.webp b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_ic_login_bg.webp deleted file mode 100644 index 7af7432551..0000000000 Binary files a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_ic_login_bg.webp and /dev/null differ diff --git a/OCH/mogo-och-taxi/src/main/res/layout/auto_or_manual_btn_view.xml b/OCH/mogo-och-taxi/src/main/res/layout/auto_or_manual_btn_view.xml new file mode 100644 index 0000000000..4a265074d9 --- /dev/null +++ b/OCH/mogo-och-taxi/src/main/res/layout/auto_or_manual_btn_view.xml @@ -0,0 +1,33 @@ + + + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-taxi/src/main/res/layout/taxi_being_order.xml b/OCH/mogo-och-taxi/src/main/res/layout/taxi_being_order.xml index 285701fa67..9cb4d3a230 100644 --- a/OCH/mogo-och-taxi/src/main/res/layout/taxi_being_order.xml +++ b/OCH/mogo-och-taxi/src/main/res/layout/taxi_being_order.xml @@ -275,6 +275,13 @@ android:textColor="#4DFFFFFF" android:textSize="24sp" app:layout_constraintBottom_toBottomOf="parent" /> + + + + #657EE2 - #2961F2 - #14FF0000 - #FF0000 - #666666 - #86A5F7 - #111533 - #878890 - #EF262C - #4D000000 - \ No newline at end of file diff --git a/OCH/mogo-och-taxi/src/main/res/values/strings.xml b/OCH/mogo-och-taxi/src/main/res/values/strings.xml index b24bdb28d8..ba114d72bd 100644 --- a/OCH/mogo-och-taxi/src/main/res/values/strings.xml +++ b/OCH/mogo-och-taxi/src/main/res/values/strings.xml @@ -19,6 +19,8 @@ 出现异常情况时,可选择原因无责取消订单: 确认 开始服务 + 自驾模式 + 安全模式 跳过乘客验证 等待乘客开始行程 请等待乘客启动自动驾驶,或您自行启动 @@ -30,17 +32,6 @@ 自动驾驶状态为0不可用 司机端未确认可以开启自动驾驶 - 欢迎您登录 - 登录 - 获取验证码 - 请输入验证码 - 获取验证码成功 - 登录成功 - 请输入正确的手机号 - 请输入正确的验证码 - 请输入手机号 - 请输入手机号 - 网络异常,请稍后重试 请求出现异常,请稍后重试 \ No newline at end of file diff --git a/OCH/mogo-och-taxi/src/main/res/values/styles.xml b/OCH/mogo-och-taxi/src/main/res/values/styles.xml index ec73feaae9..bd2964b922 100644 --- a/OCH/mogo-och-taxi/src/main/res/values/styles.xml +++ b/OCH/mogo-och-taxi/src/main/res/values/styles.xml @@ -23,22 +23,4 @@ - - \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 7fb3812077..508935760b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -7,6 +7,7 @@ apply plugin: 'kotlin-android-extensions' apply plugin: 'android-aspectjx' apply plugin: 'bugly' +def isReleaseBuild = isReleaseBuild() //apply ByteX宿主 if (!isAndroidTestBuild()) { apply plugin: 'bytex' @@ -27,25 +28,36 @@ if (!isAndroidTestBuild()) { enableTraceToServer false enableLoggerToLocal true } + + apply plugin: 'biz.config.hook' } if (!isAndroidTestBuild()) { apply plugin: 'apm-plugin' } -//if (!isAndroidTestBuild()) { -// apply plugin: 'bytex.threadOpt' -// thread_opt { -// enable true -// enableInDebug true -// logLevel "DEBUG" -// //白名单中的类不进行替换 -// white_list = [ -// 'leakcanary.*', -// 'com.loc.*' -// ] -// } -//} +if (!isAndroidTestBuild()) { + apply plugin: 'bytex.threadOpt' + thread_opt { + enable !isReleaseBuild + enableInDebug !isReleaseBuild + logLevel "DEBUG" + } +} + +if (!isAndroidTestBuild()) { + apply plugin: 'LancetX' + LancetX { + enable true + enableInDebug true + + weaveGroup { + leak_canary_crash_fix { + enable !isReleaseBuild + } + } + } +} //if (!isAndroidTestBuild()) { // /** @@ -248,6 +260,7 @@ dependencies { debugImplementation rootProject.ext.dependencies.debugleakcanary releaseImplementation rootProject.ext.dependencies.releaseleakcanary implementation rootProject.ext.dependencies.android_start_up + implementation rootProject.ext.dependencies.lancetx_runtime // // 暂不使用Shizuku-API // implementation rootProject.ext.dependencies.shizuku_provider @@ -278,6 +291,10 @@ dependencies { androidTestImplementation rootProject.ext.dependencies.androidx_espresso_core androidTestImplementation rootProject.ext.dependencies.localbroadcastmanager androidTestImplementation rootProject.ext.dependencies.mogo_v2x + + if (isAndroidTestBuild()) { + implementation "com.mogo.thread.opt:lib:${THREAD_OPT_VERSION}" + } } if (!isAndroidTestBuild()) { @@ -368,3 +385,12 @@ boolean isAndroidTestBuild() { } return false } + +boolean isReleaseBuild() { + for (String s : gradle.startParameter.taskNames) { + if (s.contains("Release") | s.contains("release")) { + return true + } + } + return false +} diff --git a/app/src/androidTest/java/com/mogo/functions/test/RoadAITest.kt b/app/src/androidTest/java/com/mogo/functions/test/RoadAITest.kt index 5298e6cf99..2b282ce620 100644 --- a/app/src/androidTest/java/com/mogo/functions/test/RoadAITest.kt +++ b/app/src/androidTest/java/com/mogo/functions/test/RoadAITest.kt @@ -61,54 +61,54 @@ class RoadAITest { .setRoadId("200091") .setLaneNo("-2") .setTileId("556834853") - .setBearing(156) + .setBearing(90) .build()) .setPoint(GPSPoint_PB .newBuilder() - .setLat(26.819533419884188) - .setLon(112.57506466334905) + .setLat(40.20313763799314) + .setLon(116.72844402744953) .build()) .build()) .addPolygon(0, GPSPoint_PB .newBuilder() - .setLat(26.819544927961125) - .setLon(112.57503948748804) + .setLat(40.20314863899314) + .setLon(116.72844412744953) .build()) .addPolygon(1, GPSPoint_PB .newBuilder() - .setLat(26.81953162903423) - .setLon(112.57503758421541) + .setLat(40.20314563819314) + .setLon(116.72844412744953) .build()) .addPolygon(2, GPSPoint_PB .newBuilder() - .setLat(26.81952255026517) - .setLon(112.5750496963295) + .setLat(40.20312263869314) + .setLon(116.72844401744953) .build()) .addPolygon(3, GPSPoint_PB .newBuilder() - .setLat(26.819517691652617) - .setLon(112.57507582382465) - .build()) - .addPolygon(4, GPSPoint_PB - .newBuilder() - .setLat(26.819521911807858) - .setLon(112.57508983920647) - .build()) - .addPolygon(5, GPSPoint_PB - .newBuilder() - .setLat(26.819535210732194) - .setLon(112.57509174248064) - .build()) - .addPolygon(6, GPSPoint_PB - .newBuilder() - .setLat(26.81954428950259) - .setLon(112.5750796303722) - .build()) - .addPolygon(7, GPSPoint_PB - .newBuilder() - .setLat(26.819549148117684) - .setLon(112.57505350287552) + .setLat(40.20322763889314) + .setLon(116.7284381644953) .build()) +// .addPolygon(4, GPSPoint_PB +// .newBuilder() +// .setLat(26.819521911807858) +// .setLon(112.57508983920647) +// .build()) +// .addPolygon(5, GPSPoint_PB +// .newBuilder() +// .setLat(26.819535210732194) +// .setLon(112.57509174248064) +// .build()) +// .addPolygon(6, GPSPoint_PB +// .newBuilder() +// .setLat(26.81954428950259) +// .setLon(112.5750796303722) +// .build()) +// .addPolygon(7, GPSPoint_PB +// .newBuilder() +// .setLat(26.819549148117684) +// .setLon(112.57505350287552) +// .build()) .addRoad(0, Road_PB .newBuilder() .setRoadId("200090") diff --git a/app/src/main/java/com/mogo/launcher/MogoApplication.java b/app/src/main/java/com/mogo/launcher/MogoApplication.java index c472f0a6d4..ee39bc7a34 100644 --- a/app/src/main/java/com/mogo/launcher/MogoApplication.java +++ b/app/src/main/java/com/mogo/launcher/MogoApplication.java @@ -3,14 +3,14 @@ package com.mogo.launcher; import com.mogo.eagle.core.function.main.MainMoGoApplication; import android.content.Context; -//import androidx.annotation.NonNull; +import androidx.annotation.NonNull; import com.mogo.eagle.core.utilcode.mogo.logger.LogLevel; import com.mogo.eagle.core.utilcode.mogo.logger.Logger; import com.mogo.launcher.crash.CrashSystem; -//import com.mogo.thread.ext.core.ThreadManager; -//import com.mogo.thread.ext.core.config.ThreadConfig; -// -//import java.util.concurrent.ThreadPoolExecutor; +import com.mogo.thread.ext.core.ThreadManager; +import com.mogo.thread.ext.core.config.ThreadConfig; + +import java.util.concurrent.ThreadPoolExecutor; /** * @author congtaowang @@ -23,36 +23,40 @@ public class MogoApplication extends MainMoGoApplication { @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); -// ThreadConfig.Builder builder = new ThreadConfig.Builder().listener(new ThreadConfig.TaskExecuteListener() { -// @Override -// public boolean isEnabled() { -// return true; // 如果返回true,会有后续的回调;如果返回false, 不会有后续的回调 -// } + ThreadConfig.Builder builder = new ThreadConfig.Builder().listener(new ThreadConfig.TaskExecuteListener() { + @Override + public boolean isEnabled() { + return true; // 如果返回true,会有后续的回调;如果返回false, 不会有后续的回调 + } + + @Override + public void onExecutorBefore(@NonNull Runnable runnable, @NonNull ThreadConfig.TaskType type) { + //每个任务执行前回调 +// if (type == ThreadConfig.TaskType.HandlerThread) { // -// @Override -// public void onExecutorBefore(@NonNull Runnable runnable) { -// //每个任务执行前回调 -// } // -// @Override -// public void onExecutorAfter(@NonNull Runnable runnable) { -// //每个任务执行后回调 -// } -// -// /** -// * @param core 线程池的核心数 -// * @param max 线程池的最大线程数 -// * @param active 线程池正在活跃的任务数 -// * @param completed 线程池已完成的任务数 -// */ -// @Override -// public void onExecutorStateChanged(@NonNull ThreadPoolExecutor pool, int core, int max, int active, long completed) { -// //线程池在执行过程,状态变化回调 -// //Log.d("POOL", "core:" + core + ";max:" + max + ";active:" + active + ";completed:" + completed); -// } -// }); -// builder.loggable(false); -// ThreadManager.INSTANCE.init(builder); +// } + } + + @Override + public void onExecutorAfter(@NonNull Runnable runnable, @NonNull ThreadConfig.TaskType type) { + //每个任务执行后回调 + } + + /** + * @param core 线程池的核心数 + * @param max 线程池的最大线程数 + * @param active 线程池正在活跃的任务数 + * @param completed 线程池已完成的任务数 + */ + @Override + public void onExecutorStateChanged(@NonNull ThreadPoolExecutor pool, int core, int max, int active, long completed) { + //线程池在执行过程,状态变化回调 + //Log.d("POOL", "core:" + core + ";max:" + max + ";active:" + active + ";completed:" + completed); + } + }); + builder.loggable(false); + ThreadManager.INSTANCE.init(builder); } @Override diff --git a/app/src/main/java/com/mogo/launcher/lancet/LeakCanaryCrashFix.kt b/app/src/main/java/com/mogo/launcher/lancet/LeakCanaryCrashFix.kt new file mode 100644 index 0000000000..738fa78a8e --- /dev/null +++ b/app/src/main/java/com/mogo/launcher/lancet/LeakCanaryCrashFix.kt @@ -0,0 +1,51 @@ +package com.mogo.launcher.lancet + +import android.database.sqlite.* +import androidx.annotation.* +import com.knightboost.lancet.api.* +import com.knightboost.lancet.api.annotations.* +import com.knightboost.lancet.api.annotations.Weaver + +/** + * 此类主要用来修正三方库引起的崩溃 + */ +@Keep +@Weaver +@Group("leak_canary_crash_fix") +class LeakCanaryCrashFix { + + @Insert + @TargetClass("leakcanary.internal.activity.db.ScopedLeaksDb\$DbOpener") + @TargetMethod(methodName = "getReadableDatabase") + fun proxyGetReadableSQLiteDb(): SQLiteDatabase? { + try { + return Origin.call() as SQLiteDatabase? + } catch (t: Throwable) { + t.printStackTrace() + } + return null + } + + @Insert + @TargetClass("leakcanary.internal.activity.db.ScopedLeaksDb\$DbOpener") + @TargetMethod(methodName = "getWritableDatabase") + fun proxyGetWritableSQLiteDb(): SQLiteDatabase? { + try { + return Origin.call() as SQLiteDatabase? + } catch (t: Throwable) { + t.printStackTrace() + } + return null + } + + @Insert + @TargetClass("leakcanary.internal.activity.db.ScopedLeaksDb\$DbOpener") + @TargetMethod(methodName = "close") + fun proxyClose() { + try { + Origin.callVoid() + } catch (t: Throwable) { + t.printStackTrace() + } + } +} \ No newline at end of file diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/MainActivity.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/MainActivity.java index 832cd76fe5..ab90d01575 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/MainActivity.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/MainActivity.java @@ -86,17 +86,16 @@ import com.zhidao.support.adas.high.AdasOptions; import com.zhidao.support.adas.high.OnAdasConnectStatusListener; import com.zhidao.support.adas.high.OnAdasListener; import com.zhidao.support.adas.high.OnMultiDeviceListener; +import com.zhidao.support.adas.high.bean.AutopilotAbility; import com.zhidao.support.adas.high.bean.VersionCompatibility; import com.zhidao.support.adas.high.common.ByteUtil; import com.zhidao.support.adas.high.common.Constants.IPC_CONNECTION_STATUS; import com.zhidao.support.adas.high.common.CupidLogUtils; -import com.zhidao.support.adas.high.common.MessageType; import com.zhidao.support.adas.high.common.ProtocolStatus; import com.zhidao.support.adas.high.common.ReceiveTimeoutManager; import com.zhidao.support.adas.high.other.permission.BackgrounderPermission; import com.zhidao.support.adas.high.other.permission.OnAdasPermissionListener; import com.zhidao.support.adas.high.other.router.RouterActivity; -import com.zhidao.support.adas.high.subscribe.SubscribeInterfaceOptions; import java.net.Inet4Address; import java.net.InetAddress; @@ -106,12 +105,11 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.Enumeration; -import java.util.HashSet; import java.util.List; import java.util.Locale; -import java.util.Set; import java.util.concurrent.ScheduledExecutorService; +import chassis.Chassis; import chassis.VehicleStateOuterClass; import io.netty.channel.Channel; import mogo.telematics.pad.MessagePad; @@ -167,6 +165,8 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas private ListPopupWindow listPopupWindow; private FloatWindow floatWindow; private View include_title; + private boolean isAutopilotAbility = true; + private String autopilotAbilityReason; private List specialVehicleBeanList;//特种车辆 // @Override // protected void onStart() { @@ -809,6 +809,50 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas DataDistribution.getInstance().addData(base); } + @Override + public void onAutopilotAbility(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 (isAutopilotAbility) + if (ability.brake > 0) { + isAutopilotAbility = false; + autopilotAbilityReason = "制动踏板被踩下"; + } + if (isAutopilotAbility) + if (ability.statusInfo == null) { + isAutopilotAbility = false; + autopilotAbilityReason = "系统Topic不正常"; + } + 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 = "系统正在关闭"; + } + if (isAutopilotAbility) + if (ability.statusInfo.getSysState() == SystemStatusInfo.SystemState.SYS_FAULT) { + isAutopilotAbility = false; + autopilotAbilityReason = "系统异常"; + } + if (isAutopilotAbility) + for (SystemStatusInfo.HealthInfo healthInfo : ability.statusInfo.getHealthInfoList()) { + if (healthInfo.getState() == SystemStatusInfo.HealthState.FAULT) { + isAutopilotAbility = false; + autopilotAbilityReason = healthInfo.getName() + " Topic异常"; + break; + } + } + Log.i(TAG, "是否可以启动自动驾驶=" + isAutopilotAbility + " 原因=" + autopilotAbilityReason); + } + @Override public void onTrajectory(MessagePad.Header header, MessagePad.Trajectory trajectory) { Trajectory base = new Trajectory(header, trajectory, sdf); @@ -984,20 +1028,22 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas } else { /*—————————————作为司机端———————————*/ int mode = Constants.getIpcConnectionMode(this); - Set messageTypes = new HashSet<>(); - // 注释掉下面代码,默认开启点云订阅 - messageTypes.add(MessageType.TYPE_RECEIVE_POINT_CLOUD); - SubscribeInterfaceOptions subscribeInterfaceOptions = SubscribeInterfaceOptions.newBuilder() - .setRole(com.zhidao.support.adas.high.common.Constants.TERMINAL_ROLE.DEBUG) - .setType(com.zhidao.support.adas.high.common.Constants.SUBSCRIBE_TYPE.UNSUBSCRIBE) - .setMessageTypes(messageTypes).build(); +// Set messageTypes = new HashSet<>(); +// // 注释掉下面代码,默认开启点云订阅 +// messageTypes.add(MessageType.TYPE_RECEIVE_POINT_CLOUD); +// SubscribeInterfaceOptions subscribeInterfaceOptions = SubscribeInterfaceOptions.newBuilder() +// .setRole(com.zhidao.support.adas.high.common.Constants.TERMINAL_ROLE.DEBUG) +// .setType(com.zhidao.support.adas.high.common.Constants.SUBSCRIBE_TYPE.UNSUBSCRIBE) +// .setMessageTypes(messageTypes).build(); switch (mode) { default: case AdasOptions.IPC_CONNECTION_MODE.FIXATION: - options = new AdasOptions.Builder().setSubscribeInterfaceOptions(subscribeInterfaceOptions).setClient(false).setIpcFixationIP(AdasManager.getInstance().getIPCFixationIPList(this)).setIpcConnectionMode(mode).build(); + options = new AdasOptions.Builder().setClient(false).setIpcFixationIP(AdasManager.getInstance().getIPCFixationIPList(this)).setIpcConnectionMode(mode).build(); +// options = new AdasOptions.Builder().setSubscribeInterfaceOptions(subscribeInterfaceOptions).setClient(false).setIpcFixationIP(AdasManager.getInstance().getIPCFixationIPList(this)).setIpcConnectionMode(mode).build(); break; case AdasOptions.IPC_CONNECTION_MODE.ASSIGN: - options = new AdasOptions.Builder().setSubscribeInterfaceOptions(subscribeInterfaceOptions).setClient(false).setIpcAssignIP(Constants.getIPCIp(this)).setIpcConnectionMode(mode).build(); + options = new AdasOptions.Builder().setClient(false).setIpcAssignIP(Constants.getIPCIp(this)).setIpcConnectionMode(mode).build(); +// options = new AdasOptions.Builder().setSubscribeInterfaceOptions(subscribeInterfaceOptions).setClient(false).setIpcAssignIP(Constants.getIPCIp(this)).setIpcConnectionMode(mode).build(); break; } diff --git a/app_mogo_magic_ring/src/main/java/com/zhidao/adas/magic/ui/MainActivity.java b/app_mogo_magic_ring/src/main/java/com/zhidao/adas/magic/ui/MainActivity.java index 34ce6568ae..cb31782c7b 100644 --- a/app_mogo_magic_ring/src/main/java/com/zhidao/adas/magic/ui/MainActivity.java +++ b/app_mogo_magic_ring/src/main/java/com/zhidao/adas/magic/ui/MainActivity.java @@ -45,6 +45,7 @@ import com.zhidao.support.adas.high.AdasManager; import com.zhidao.support.adas.high.AdasOptions; import com.zhidao.support.adas.high.OnAdasConnectStatusListener; import com.zhidao.support.adas.high.OnAdasListener; +import com.zhidao.support.adas.high.bean.AutopilotAbility; import com.zhidao.support.adas.high.bean.VersionCompatibility; import com.zhidao.support.adas.high.common.Constants.IPC_CONNECTION_STATUS; import com.zhidao.support.adas.high.common.CupidLogUtils; @@ -804,4 +805,9 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas break; } } + + @Override + public void onAutopilotAbility(AutopilotAbility ability) { + + } } diff --git a/build.gradle b/build.gradle index 2d52e63827..0eb109a8a4 100644 --- a/build.gradle +++ b/build.gradle @@ -32,11 +32,13 @@ buildscript { classpath 'com.tencent.bugly:symtabfileuploader:2.2.1' classpath "com.bytedance.android.byteX:base-plugin:0.3.0" classpath "com.mogo.cloud:hook:${HOOK_LOG_VERSION}" + classpath "com.mogo.cloud:bizconfig:${BIZCONFIG_VERSION}" classpath 'com.volcengine:apm_insight_plugin:1.4.1' - classpath 'com.mogo.thread.opt:plg:2.2.12' + classpath "com.mogo.thread.opt:plg:${THREAD_OPT_VERSION}" classpath 'com.mogo.cloud:systrace:1.0.1' classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.18' classpath 'com.mogo.sticky:service:1.0.8' + classpath 'io.github.knight-zxw:lancet-plugin:0.0.1' // classpath ("com.tencent.matrix:matrix-gradle-plugin:0.6.6") { changing = true } } diff --git a/config.gradle b/config.gradle index 0341f9f4a2..c06741f482 100644 --- a/config.gradle +++ b/config.gradle @@ -1,22 +1,6 @@ ext { time = "" kotlin_version = "1.4.31" - android = [ - launcherApplicationId : "com.mogo.launcher", - independentApplicationId : "com.mogo.launcher.app", - fLauncherApplicationId : "com.mogo.launcher.f", - bydautoIndependentApplicationId: "com.mogo.launcher.app.bydauto", - fLauncherAmapApiValue : "ace34d685cc04836c03905e4d1536125", - bydautoIndependentApiValue : "b1e1d527b02a493913c50985827c943a", - commonLauncherAmapApiValue : "a36b9f7b086fa3951bb35338a5a06dd3", - commonIndependentAmapApiValue : "1c3fbc5f5e183619ffb1e7bc01e6751f", - compileSdkVersion : 29, - buildToolsVersion : "29.0.2", - minSdkVersion : 21, - targetSdkVersion : 21, - minSdkVersionPadLenovo : 23, - targetSdkVersionPadLenovo : 23, - ] dependencies = [ // androidx androidxappcompat : "androidx.appcompat:appcompat:1.3.1", @@ -134,6 +118,8 @@ ext { //plugin mogochainbase : "com.mogo.cloud:service-chain:${SERVICE_CHAIN_VERSION}", mogochainplugin : "com.mogo.cloud:hook:${HOOK_LOG_VERSION}", + mogoservicebiz : "com.mogo.cloud:service-biz:${SERVICE_BIZ_VERSION}", + mogobizconfig : "com.mogo.cloud:bizconfig:${BIZCONFIG_VERSION}", //========================= 旧版本架构 Maven 版本管理 ========================= // modules @@ -248,7 +234,30 @@ ext { //========================= Koom ====================== koomnative : "com.kuaishou.koom:koom-native-leak-static:2.2.0", - koomxhook : "com.kuaishou.koom:xhook-static:2.2.0" + koomxhook : "com.kuaishou.koom:xhook-static:2.2.0", + + //========================= Koom ====================== + recyclerviewadapterhelper : "io.github.cymchad:BaseRecyclerViewAdapterHelper:3.0.4", + + + //========================= LancetX =================== + lancetx_runtime : "io.github.knight-zxw:lancet-runtime:0.0.1" + ] + android = [ + launcherApplicationId : "com.mogo.launcher", + independentApplicationId : "com.mogo.launcher.app", + fLauncherApplicationId : "com.mogo.launcher.f", + bydautoIndependentApplicationId: "com.mogo.launcher.app.bydauto", + fLauncherAmapApiValue : "ace34d685cc04836c03905e4d1536125", + bydautoIndependentApiValue : "b1e1d527b02a493913c50985827c943a", + commonLauncherAmapApiValue : "a36b9f7b086fa3951bb35338a5a06dd3", + commonIndependentAmapApiValue : "1c3fbc5f5e183619ffb1e7bc01e6751f", + compileSdkVersion : 29, + buildToolsVersion : "29.0.2", + minSdkVersion : 21, + targetSdkVersion : 21, + minSdkVersionPadLenovo : 23, + targetSdkVersionPadLenovo : 23, ] } diff --git a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt index 3d8d1ce4c3..5fc8dffe6f 100644 --- a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt +++ b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt @@ -2,12 +2,10 @@ package com.mogo.eagle.core.function.autopilot import android.Manifest.permission import android.content.Context -import android.util.Log import androidx.annotation.RequiresPermission import chassis.SpecialVehicleTaskCmdOuterClass import com.alibaba.android.arouter.facade.annotation.Route import com.mogo.cloud.passport.MoGoAiCloudClientConfig -import com.mogo.eagle.core.data.app.AppConfigInfo import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters import com.mogo.eagle.core.data.autopilot.toAutoPilotLine import com.mogo.eagle.core.data.autopilot.toRouteInfo @@ -28,6 +26,7 @@ import com.mogo.eagle.core.function.autopilot.adapter.MoGoAdasListenerImpl import com.mogo.eagle.core.function.autopilot.adapter.MoGoAdasMsgConnectStatusListenerImpl import com.mogo.eagle.core.function.autopilot.adapter.MoGoHandAdasMsgManager import com.mogo.eagle.core.function.autopilot.server.AsyncDataToAutopilotServer +import com.mogo.eagle.core.function.autopilot.telematic.EventListener import com.mogo.eagle.core.function.autopilot.telematic.IMsgHandler import com.mogo.eagle.core.function.autopilot.telematic.TeleMsgHandler import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotCarConfigListenerManager @@ -39,6 +38,7 @@ import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_ import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr import com.mogo.eagle.core.utilcode.util.ThreadUtils import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.mogo.telematic.MogoProtocolMsg import com.mogo.telematic.MogoProtocolMsg.NORMAL_DATA import com.mogo.telematic.MogoProtocolMsg.SYNC_MODE_STATUS @@ -57,6 +57,7 @@ import com.zhjt.service.chain.ChainLog import com.zhjt.service.chain.TracingConstants import io.netty.channel.Channel import mogo.telematics.pad.MessagePad +import java.util.* import java.util.concurrent.TimeUnit @@ -72,6 +73,10 @@ class MoGoAutopilotProvider : private val TAG = "MoGoAutoPilotProvider" private var mContext: Context? = null private lateinit var msgHandler: IMsgHandler + private var timer: Timer? = null + + @Volatile + private var isInit = false override val functionName: String get() = TAG @@ -83,7 +88,6 @@ class MoGoAutopilotProvider : // 初始化ADAS 域控制器 CupidLogUtils.setEnableLog(false) msgHandler = TeleMsgHandler() - // TODO 临时方案,根据不同的身份标识,连接不同的工控机IP if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) {// 司机 // 注册地图采集功能 CallerMapDataCollectorManager.registerOnMapCollectTaskListener(this) @@ -98,13 +102,16 @@ class MoGoAutopilotProvider : // "192.168.1.102" val options = AdasOptions.Builder() - .setIpcConnectionMode(AdasOptions.IPC_CONNECTION_MODE.FIXATION) - .setIpcFixationIP(AdasManager.getInstance().getIPCFixationIPList(mContext)) - .setClient(false) + .setIpcConnectionMode(AdasOptions.IPC_CONNECTION_MODE.FIXATION) + .setIpcFixationIP(AdasManager.getInstance().getIPCFixationIPList(mContext)) + .setClient(false) // .setSubscribeInterfaceOptions(subscribeInterfaceOptions)// - .build() + .build() AdasManager.getInstance().create(options, MoGoAdasMsgConnectStatusListenerImpl()) + //////////////////////////////////注意先后顺序,AdasManager.getInstance().create后才可以设置监听///////////////////////////////////////////// + // 监听ADAS-SDK获取到的工控机数据 + AdasManager.getInstance().setOnAdasListener(MoGoAdasListenerImpl()) NSDNettyManager.getInstance().startNSDNettyServerWithSN(context, object : NettyServerListener { override fun onMessageResponseServer(msg: MogoProtocolMsg?, channel: Channel?) { @@ -113,11 +120,25 @@ class MoGoAutopilotProvider : override fun onStartServer() { ToastUtils.showShort("司机端服务启动成功!") + if (timer == null) { + timer = Timer() + } + // 10s同步一次数据到乘客屏 + timer!!.schedule(object : TimerTask() { + override fun run() { + // 同步是否开启美化模式 + setDemoMode(FunctionBuildConfig.isDemoMode) + setIgnoreConditionDraw(FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData) + msgHandler.synMsgToAllClients() + } + }, 1000, 10000) invokeNettyConnResult("司机端服务启动成功!") } override fun onStopServer() { ToastUtils.showLong("司机端服务停止!") + timer?.cancel() + timer = null invokeNettyConnResult("司机端服务停止!") } @@ -133,45 +154,85 @@ class MoGoAutopilotProvider : } }, MoGoAiCloudClientConfig.getInstance().sn) } else { - // 乘客端默认接收绘制全局路径+引导线 - //FunctionBuildConfig.isDemoMode = true - //FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = true - // "192.168.1.103" - val options = AdasOptions - .Builder() - .setClient(true) - .build() - AdasManager.getInstance().create(options, MoGoAdasMsgConnectStatusListenerImpl()) NSDNettyManager.getInstance() - .searchAndConnectServer(context, MoGoAiCloudClientConfig.getInstance().sn, - AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode), - object : NettyClientListener { - override fun onMessageResponseClient( - msg: MogoProtocolMsg?, - sign: String?, - channel: Channel - ) { - // 乘客端收到adas数据直接解析,后续分发解析后的数据流程同司机端 - msgHandler.handleMsgFromServer(msg, channel) - } + .searchAndConnectServer(context, MoGoAiCloudClientConfig.getInstance().sn, + AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode), + object : NettyClientListener { + override fun onMessageResponseClient( + msg: MogoProtocolMsg?, + sign: String?, + channel: Channel + ) { + // 乘客端收到adas数据直接解析,后续分发解析后的数据流程同司机端 + msgHandler.handleMsgFromServer(msg, channel) + } - override fun onClientStatusConnectChanged( - statusCode: Int, - sign: String?, - channel: Channel - ) { - msgHandler.handleClientConnStatus(statusCode, sign, channel) - } - }) + override fun onClientStatusConnectChanged( + statusCode: Int, + sign: String?, + channel: Channel + ) { + msgHandler.handleClientConnStatus(statusCode, sign, channel) + } + }) } + msgHandler.setListener(object : EventListener { + override fun connectDevice(isSupportMulti: Boolean) { + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + if (!isInit) { + isInit = true + // 转发工控机数据给乘客屏 + listenDeviceData() + } + } else { + if (!isInit) { + isInit = true + UiThreadHandler.post { + if (isSupportMulti) { + // 直连工控机 + directConnect() + } else { + val options = AdasOptions + .Builder() + .setClient(true) + .build() + AdasManager.getInstance() + .create(options, MoGoAdasMsgConnectStatusListenerImpl()) + // 监听ADAS-SDK获取到的工控机数据 + AdasManager.getInstance().setOnAdasListener(MoGoAdasListenerImpl()) + // 接收司机屏发过来的感知、定位等数据 + listenDeviceData() + } + } + } + } + } + }) + CallerAutopilotCarConfigListenerManager.addListener(TAG, this) + CallerLogger.i("$M_ADAS_IMPL$TAG", "initServer……") + // 同步数据给工控机的服务 + AsyncDataToAutopilotServer.INSTANCE.initServer() + // 同步是否开启雨天模式 + setRainMode(FunctionBuildConfig.isRainMode) + } + + private fun directConnect() { + val options = AdasOptions + .Builder() + .setIpcConnectionMode(AdasOptions.IPC_CONNECTION_MODE.FIXATION) + .setIpcFixationIP(AdasManager.getInstance().getIPCFixationIPList(mContext)) + .setClient(false)// 乘客端直连工控机改为false + .build() + AdasManager.getInstance().create(options, MoGoAdasMsgConnectStatusListenerImpl()) //////////////////////////////////注意先后顺序,AdasManager.getInstance().create后才可以设置监听///////////////////////////////////////////// - - // 监听ADAS-SDK获取到的工控机数据(乘客也需注册) + // 监听ADAS-SDK获取到的工控机数据 AdasManager.getInstance().setOnAdasListener(MoGoAdasListenerImpl()) - // 乘客屏监听工控机基础信息回调 - if (!AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { - CallerAutopilotCarConfigListenerManager.addListener(TAG, this) - } + } + + /** + * 司机屏转发工控机发过来的数据,乘客屏接收解析后的数据保持原流程不变 + */ + private fun listenDeviceData() { AdasManager.getInstance().setOnMultiDeviceListener(object : OnMultiDeviceListener { override fun onForwardingDriverIPCMessage(bytes: ByteArray?) { if (bytes == null) @@ -194,18 +255,9 @@ class MoGoAutopilotProvider : MogoProtocolMsg(NORMAL_DATA, bytes.size, bytes), null ) - } - }); - - CallerLogger.i("$M_ADAS_IMPL$TAG", "initServer……") - // 同步数据给工控机的服务 - AsyncDataToAutopilotServer.INSTANCE.initServer() - // 同步是否开启美化模式 - setDemoMode(FunctionBuildConfig.isDemoMode) - // 同步是否开启雨天模式 - setRainMode(FunctionBuildConfig.isRainMode) + }) } /** @@ -327,7 +379,7 @@ class MoGoAutopilotProvider : } override fun recordPackage(type: Int, id: Int, duration: Int, bduration: Int): Boolean { - return AdasManager.getInstance().startRecordPackage(id,duration, type, bduration) + return AdasManager.getInstance().startRecordPackage(id, duration, type, bduration) } override fun stopRecord(type: Int, id: Int): Boolean { @@ -369,7 +421,6 @@ class MoGoAutopilotProvider : } - /** * 演示模式(美化模式)设置只限定于鹰眼 * isEnable = true 开启 @@ -378,7 +429,12 @@ class MoGoAutopilotProvider : override fun setDemoMode(isEnable: Boolean) { // 同步给乘客端 if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { - val byteArray = if (isEnable) byteArrayOf(1) else byteArrayOf(0) + val byteArray = if (isEnable) { + "1;${System.currentTimeMillis()}".toByteArray() + } else { + "0;${System.currentTimeMillis()}".toByteArray() + } +// val byteArray = if (isEnable) byteArrayOf(1) else byteArrayOf(0) if (NSDNettyManager.getInstance().isServerStart) { NSDNettyManager.getInstance() .sendMsgToAllClients( @@ -397,7 +453,11 @@ class MoGoAutopilotProvider : override fun setIgnoreConditionDraw(isIgnore: Boolean) { // 同步给乘客端 if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { - val byteArray = if (isIgnore) byteArrayOf(1) else byteArrayOf(0) + val byteArray = if (isIgnore) { + "1;${System.currentTimeMillis()}".toByteArray() + } else { + "0;${System.currentTimeMillis()}".toByteArray() + } if (NSDNettyManager.getInstance().isServerStart) { NSDNettyManager.getInstance() .sendMsgToAllClients( @@ -495,7 +555,10 @@ class MoGoAutopilotProvider : if (isEnable) { AdasManager.getInstance().sendAutoPilotModeReq(1, 0, null) } else { - AdasManager.getInstance().sendAutoPilotModeReq(0, 0, null) + // 司机屏才可关闭自动驾驶 + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + AdasManager.getInstance().sendAutoPilotModeReq(0, 0, null) + } } } @@ -568,11 +631,23 @@ class MoGoAutopilotProvider : } override fun onAutopilotCarConfig(carConfigResp: MessagePad.CarConfigResp) { - // 乘客屏才监听 - AppConfigInfo.plateNumber = carConfigResp.plateNumber - CallerBindingcarManager.getBindingcarProvider() - .getBindingcarInfo(carConfigResp.macAddress, MoGoAiCloudClientConfig.getInstance().sn) - invokeNettyConnResult("乘客屏车牌号:${carConfigResp.plateNumber},Mac地址为:${carConfigResp.macAddress}") + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + if (!isInit) { + isInit = true + if (carConfigResp.dockVersion.contains("2.3.0")) {// 不支持多连接 + // 司机屏转发工控机发过来的数据 + listenDeviceData() + } + } + msgHandler.synMsgToAllClients() + } else {// 乘客屏 + CallerBindingcarManager.getBindingcarProvider() + .getBindingcarInfo( + carConfigResp.macAddress, + MoGoAiCloudClientConfig.getInstance().sn + ) + invokeNettyConnResult("乘客屏车牌号:${carConfigResp.plateNumber},Mac地址为:${carConfigResp.macAddress}") + } } @ChainLog( @@ -592,7 +667,6 @@ class MoGoAutopilotProvider : } override fun sendStatusQueryReq() { - Log.d(TAG, "---- sendStatusQueryReq ----") AdasManager.getInstance().sendStatusQueryReq() } diff --git a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasListenerImpl.kt b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasListenerImpl.kt index e0c6e29796..f53c1f082b 100644 --- a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasListenerImpl.kt +++ b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasListenerImpl.kt @@ -35,6 +35,7 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager.invokeAutopilotGuardian import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager.invokeAutopilotSNRequest import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager.invokeAutopilotStatusRespByQuery +import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotActionsListenerManager.invokeAutopilotAbility import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotCarConfigListenerManager.invokeAutopilotCarConfigData import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotCarStatusListenerManager.invokeAutopilotCarStateData import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotIdentifyListenerManager @@ -48,8 +49,10 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotPointCloudList import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotRecordListenerManager.invokeAutopilotRecordResult import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotVehicleStateListenerManager import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.zhidao.support.adas.high.AdasManager import com.zhidao.support.adas.high.OnAdasListener +import com.zhidao.support.adas.high.bean.AutopilotAbility import com.zhidao.support.adas.high.common.ProtocolStatus import com.zhjt.service.chain.ChainLog import com.zhjt.service.chain.TracingConstants.Endpoint.Companion.PAD @@ -76,12 +79,12 @@ class MoGoAdasListenerImpl : OnAdasListener { //车前引导线 @ChainLog( - linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_TRAJECTORY, - linkCode = CHAIN_LINK_ADAS, - endpoint = PAD, - nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_TRAJECTORY, - paramIndexes = [0, 1], - clientPkFileName = "sn" + linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_TRAJECTORY, + linkCode = CHAIN_LINK_ADAS, + endpoint = PAD, + nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_TRAJECTORY, + paramIndexes = [0, 1], + clientPkFileName = "sn" ) override fun onTrajectory(header: MessagePad.Header, trajectory: MessagePad.Trajectory?) { if (HdMapBuildConfig.isMapLoaded) { @@ -93,16 +96,16 @@ class MoGoAdasListenerImpl : OnAdasListener { //感知物体 @ChainLog( - linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_DATA_TRACKED, - linkCode = CHAIN_LINK_ADAS, - endpoint = PAD, - nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_RECT_DATA, - paramIndexes = [0, 1], - clientPkFileName = "sn" + linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_DATA_TRACKED, + linkCode = CHAIN_LINK_ADAS, + endpoint = PAD, + nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_RECT_DATA, + paramIndexes = [0, 1], + clientPkFileName = "sn" ) override fun onTrackedObjects( - header: MessagePad.Header, - trackedObjects: MessagePad.TrackedObjects + header: MessagePad.Header, + trackedObjects: MessagePad.TrackedObjects ) { if (HdMapBuildConfig.isMapLoaded) { invokeAutopilotIdentifyDataUpdate(trackedObjects.objsList as List?) @@ -111,12 +114,12 @@ class MoGoAdasListenerImpl : OnAdasListener { //自车定位信息 @ChainLog( - linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_GNSSINFO, - linkCode = CHAIN_LINK_ADAS, - endpoint = PAD, - nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_CAR_STATE, - paramIndexes = [0, 1], - clientPkFileName = "sn" + linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_GNSSINFO, + linkCode = CHAIN_LINK_ADAS, + endpoint = PAD, + nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_CAR_STATE, + paramIndexes = [0, 1], + clientPkFileName = "sn" ) override fun onGnssInfo(header: MessagePad.Header, gnssInfo: MessagePad.GnssInfo?) { invokeAutopilotCarStateData(gnssInfo) @@ -126,9 +129,9 @@ class MoGoAdasListenerImpl : OnAdasListener { CallerMapUIServiceManager.getMapUIController()?.syncLocation2Map(gnssInfo) // 同步更新经纬度和系统时间至 AutoPilotStatusListener CallerAutoPilotStatusListenerManager.updateAutoPilotLatLon( - gnssInfo.satelliteTime, - gnssInfo.longitude, - gnssInfo.latitude + gnssInfo.satelliteTime, + gnssInfo.longitude, + gnssInfo.latitude ) } } @@ -136,16 +139,16 @@ class MoGoAdasListenerImpl : OnAdasListener { //自车状态(底盘),车灯等。 @ChainLog( - linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_VEHICLE, - linkCode = CHAIN_LINK_ADAS, - endpoint = PAD, - nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_VEHICLE, - paramIndexes = [0, 1], - clientPkFileName = "sn" + linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_VEHICLE, + linkCode = CHAIN_LINK_ADAS, + endpoint = PAD, + nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_VEHICLE, + paramIndexes = [0, 1], + clientPkFileName = "sn" ) override fun onVehicleState( - header: MessagePad.Header, - vehicleState: VehicleStateOuterClass.VehicleState? + header: MessagePad.Header, + vehicleState: VehicleStateOuterClass.VehicleState? ) { if (vehicleState != null) { @@ -174,16 +177,16 @@ class MoGoAdasListenerImpl : OnAdasListener { //自动驾驶状态 @ChainLog( - linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT, - linkCode = CHAIN_LINK_ADAS, - endpoint = PAD, - nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_STATUS, - paramIndexes = [0, 1], - clientPkFileName = "sn" + linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT, + linkCode = CHAIN_LINK_ADAS, + endpoint = PAD, + nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_STATUS, + paramIndexes = [0, 1], + clientPkFileName = "sn" ) override fun onAutopilotState( - header: MessagePad.Header, - autopilotState: MessagePad.AutopilotState? + header: MessagePad.Header, + autopilotState: MessagePad.AutopilotState? ) { if (autopilotState != null) { //工控机模拟时间 @@ -209,6 +212,9 @@ class MoGoAdasListenerImpl : OnAdasListener { autopilotStatusInfo.dockVersion = it.dockVersion AppConfigInfo.dockerVersion = it.dockVersion } + CallerLogger.d("Upgrade", "origin = ${autopilotStatusInfo.connectStatus} -----now = ${AppConfigInfo.isConnectAutopilot} ") + AppConfigInfo.isConnectAutopilot = autopilotStatusInfo.connectStatus + AppConfigInfo.connectStatusDescribe = autopilotStatusInfo.connectStatusDescribe invokeAutoPilotStatus() } } @@ -216,16 +222,16 @@ class MoGoAdasListenerImpl : OnAdasListener { //监控 @ChainLog( - linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT, - linkCode = CHAIN_LINK_ADAS, - endpoint = PAD, - nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_GUARDIAN, - paramIndexes = [0, 1], - clientPkFileName = "sn" + linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT, + linkCode = CHAIN_LINK_ADAS, + endpoint = PAD, + nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_GUARDIAN, + paramIndexes = [0, 1], + clientPkFileName = "sn" ) override fun onReportMessage( - header: MessagePad.Header, - mogoReportMessage: MogoReportMsg.MogoReportMessage? + header: MessagePad.Header, + mogoReportMessage: MogoReportMsg.MogoReportMessage? ) { if (HdMapBuildConfig.isMapLoaded) { invokeAutopilotGuardian(mogoReportMessage) @@ -234,27 +240,27 @@ class MoGoAdasListenerImpl : OnAdasListener { //感知红绿灯 @ChainLog( - linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_TRAFFIC_LIGHT, - linkCode = CHAIN_LINK_ADAS, - endpoint = PAD, - nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_TRAFFIC_LIGHT, - paramIndexes = [0, 1], - clientPkFileName = "sn" + linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_TRAFFIC_LIGHT, + linkCode = CHAIN_LINK_ADAS, + endpoint = PAD, + nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_TRAFFIC_LIGHT, + paramIndexes = [0, 1], + clientPkFileName = "sn" ) override fun onPerceptionTrafficLight( - header: MessagePad.Header?, - trafficLights: TrafficLightOuterClass.TrafficLights? + header: MessagePad.Header?, + trafficLights: TrafficLightOuterClass.TrafficLights? ) { if (trafficLights != null) { CallerAutopilotIdentifyListenerManager.invokeAutopilotPerceptionTrafficLight( - trafficLights + trafficLights ) } } override fun onPredictionObstacleTrajectory( - header: MessagePad.Header?, - predictionObjects: Prediction.mPredictionObjects? + header: MessagePad.Header?, + predictionObjects: Prediction.mPredictionObjects? ) { //他车轨迹预测 } @@ -272,16 +278,16 @@ class MoGoAdasListenerImpl : OnAdasListener { //planning障碍物 @ChainLog( - linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_PLANNING_OBJECTS, - linkCode = CHAIN_LINK_ADAS, - endpoint = PAD, - nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_PLANNING_OBJECTS, - paramIndexes = [0, 1], - clientPkFileName = "sn" + linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_PLANNING_OBJECTS, + linkCode = CHAIN_LINK_ADAS, + endpoint = PAD, + nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_PLANNING_OBJECTS, + paramIndexes = [0, 1], + clientPkFileName = "sn" ) override fun onPlanningObjects( - header: MessagePad.Header?, - planningObjects: MessagePad.PlanningObjects + header: MessagePad.Header?, + planningObjects: MessagePad.PlanningObjects ) { if (HdMapBuildConfig.isMapLoaded) { invokeAutopilotIdentifyPlanningObj(planningObjects.objsList as List) @@ -289,42 +295,45 @@ class MoGoAdasListenerImpl : OnAdasListener { } override fun onBasicInfoReq( - header: MessagePad.Header, - basicInfoReq: MessagePad.BasicInfoReq? + header: MessagePad.Header, + basicInfoReq: MessagePad.BasicInfoReq? ) { invokeAutopilotSNRequest() } //工控机基础配置信息 @ChainLog( - linkChainLog = CHAIN_LINK_LOG_CONNECT_STATUS, - linkCode = CHAIN_LINK_ADAS, - endpoint = PAD, - nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_CAR_CONFIG, - paramIndexes = [0, 1], - clientPkFileName = "sn" + linkChainLog = CHAIN_LINK_LOG_CONNECT_STATUS, + linkCode = CHAIN_LINK_ADAS, + endpoint = PAD, + nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_CAR_CONFIG, + paramIndexes = [0, 1], + clientPkFileName = "sn" ) override fun onCarConfigResp( - header: MessagePad.Header, - carConfigResp: MessagePad.CarConfigResp? + header: MessagePad.Header, + carConfigResp: MessagePad.CarConfigResp? ) { - if (HdMapBuildConfig.isMapLoaded && carConfigResp != null) { + if (/*HdMapBuildConfig.isMapLoaded &&*/ carConfigResp != null) { + AppConfigInfo.plateNumber = carConfigResp.plateNumber//车牌号 + AppConfigInfo.iPCMacAddress = carConfigResp.macAddress//工控机MAC地址 + AppConfigInfo.protocolVersionNumber = carConfigResp.protocolVersionValue//工控机协议版本 invokeAutopilotCarConfigData(carConfigResp) } } //全局路径规划 @ChainLog( - linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT, - linkCode = CHAIN_LINK_ADAS, - endpoint = PAD, - nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_ROUTE, - paramIndexes = [0, 1], - clientPkFileName = "sn" + linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT, + linkCode = CHAIN_LINK_ADAS, + endpoint = PAD, + nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_ROUTE, + paramIndexes = [0, 1], + clientPkFileName = "sn" ) override fun onGlobalPathResp( - header: MessagePad.Header, - globalPathResp: MessagePad.GlobalPathResp? + header: MessagePad.Header, + globalPathResp: MessagePad.GlobalPathResp? ) { if (HdMapBuildConfig.isMapLoaded) { invokeAutopilotRotting(globalPathResp) @@ -333,16 +342,16 @@ class MoGoAdasListenerImpl : OnAdasListener { //数据采集,badCase @ChainLog( - linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT, - linkCode = CHAIN_LINK_ADAS, - endpoint = PAD, - nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_RECORD, - paramIndexes = [0, 1], - clientPkFileName = "sn" + linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT, + linkCode = CHAIN_LINK_ADAS, + endpoint = PAD, + nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_RECORD, + paramIndexes = [0, 1], + clientPkFileName = "sn" ) override fun onRecordResult( - header: MessagePad.Header, - recordPanel: RecordPanelOuterClass.RecordPanel? + header: MessagePad.Header, + recordPanel: RecordPanelOuterClass.RecordPanel? ) { if (recordPanel != null) { invokeAutopilotRecordResult(recordPanel) @@ -364,16 +373,16 @@ class MoGoAdasListenerImpl : OnAdasListener { //到站回调 @ChainLog( - linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT, - linkCode = CHAIN_LINK_ADAS, - endpoint = PAD, - nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_ARRIVE, - paramIndexes = [0, 1], - clientPkFileName = "sn" + linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT, + linkCode = CHAIN_LINK_ADAS, + endpoint = PAD, + nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_ARRIVE, + paramIndexes = [0, 1], + clientPkFileName = "sn" ) override fun onArrivalNotification( - header: MessagePad.Header, - arrivalNotification: MessagePad.ArrivalNotification? + header: MessagePad.Header, + arrivalNotification: MessagePad.ArrivalNotification? ) { if (HdMapBuildConfig.isMapLoaded) { invokeArriveAtStation(arrivalNotification) @@ -382,16 +391,16 @@ class MoGoAdasListenerImpl : OnAdasListener { //状态查询应答 @ChainLog( - linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT, - linkCode = CHAIN_LINK_ADAS, - endpoint = PAD, - nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_STATUS_QUERY_RESP, - paramIndexes = [0, 1], - clientPkFileName = "sn" + linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT, + linkCode = CHAIN_LINK_ADAS, + endpoint = PAD, + nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_STATUS_QUERY_RESP, + paramIndexes = [0, 1], + clientPkFileName = "sn" ) override fun onStatusQueryResp( - header: MessagePad.Header?, - statusInfo: SystemStatusInfo.StatusInfo? + header: MessagePad.Header?, + statusInfo: SystemStatusInfo.StatusInfo? ) { invokeAutopilotStatusRespByQuery(statusInfo) } @@ -400,8 +409,8 @@ class MoGoAdasListenerImpl : OnAdasListener { * 数据采集配置应答 */ override fun onRecordDataConfigResp( - header: MessagePad.Header?, - config: MessagePad.RecordDataConfig? + header: MessagePad.Header?, + config: MessagePad.RecordDataConfig? ) { } @@ -410,16 +419,16 @@ class MoGoAdasListenerImpl : OnAdasListener { * planning决策状态, 透传 */ @ChainLog( - linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_PLANNING_ACTIONS, - linkCode = CHAIN_LINK_ADAS, - endpoint = PAD, - nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_PLANNING_ACTIONS, - paramIndexes = [0, 1], - clientPkFileName = "sn" + linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_PLANNING_ACTIONS, + linkCode = CHAIN_LINK_ADAS, + endpoint = PAD, + nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_PLANNING_ACTIONS, + paramIndexes = [0, 1], + clientPkFileName = "sn" ) override fun onPlanningActionMsg( - header: MessagePad.Header?, - planningActionMsg: MessagePad.PlanningActionMsg? + header: MessagePad.Header?, + planningActionMsg: MessagePad.PlanningActionMsg? ) { planningActionMsg?.let { invokePNCActions(it) @@ -430,4 +439,12 @@ class MoGoAdasListenerImpl : OnAdasListener { override fun onError(status: ProtocolStatus, bytes: ByteArray) { } + + /** + * 是否可以启动自动驾驶 + * 使用方法查看:app_ipc_monitoring/uiMainActivity/onAutopilotAbility + */ + override fun onAutopilotAbility(ability: AutopilotAbility?) { + invokeAutopilotAbility(ability) + } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasMsgConnectStatusListenerImpl.kt b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasMsgConnectStatusListenerImpl.kt index 2399c2d11d..a9da4f3990 100644 --- a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasMsgConnectStatusListenerImpl.kt +++ b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasMsgConnectStatusListenerImpl.kt @@ -137,13 +137,23 @@ class MoGoAdasMsgConnectStatusListenerImpl : OnAdasConnectStatusListener, */ private fun syncBasicInfoToAutopilot(sn: String? = null) { CallerLogger.d("$M_ADAS_IMPL$TAG", "同步PAD的SN给工控机……") - // 设置PAD-SN给工控,网络环境 - AdasManager.getInstance() - .sendBasicInfoResp( - MoGoAiCloudClientConfig.getInstance().sn, - getEnvironment(), - getTerminalRole() - ) + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + // 设置PAD-SN给工控,网络环境 + AdasManager.getInstance() + .sendBasicInfoResp( + MoGoAiCloudClientConfig.getInstance().sn, + getEnvironment(), + getTerminalRole() + ) + } else { + // 乘客屏先不传sn + AdasManager.getInstance() + .sendBasicInfoResp( + "", + getEnvironment(), + getTerminalRole() + ) + } } private fun getEnvironment(): Int { diff --git a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoHandAdasMsgManager.java b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoHandAdasMsgManager.java index 6db47cdab3..32530d996d 100644 --- a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoHandAdasMsgManager.java +++ b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoHandAdasMsgManager.java @@ -13,6 +13,7 @@ import com.mogo.eagle.core.data.constants.MoGoConfig; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotCarConfigListener; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotCarStateListener; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotVehicleStateListener; +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager; import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotCarConfigListenerManager; import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotCarStatusListenerManager; import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotVehicleStateListenerManager; @@ -62,6 +63,15 @@ public class MoGoHandAdasMsgManager implements private int brakeLight = -1; + public void getConfig() { + com.elegant.utils.UiThreadHandler.postDelayed(new Runnable() { + @Override + public void run() { + CallerAutoPilotManager.INSTANCE.getCarConfig(); + } + }, 0); + } + private int setTurnLightState(int turn_light) { if (turn_light == 0) { if (isOnTurnLight) { @@ -108,6 +118,7 @@ public class MoGoHandAdasMsgManager implements @Override public void onAutopilotCarConfig(@NotNull MessagePad.CarConfigResp carConfigResp) { if (carConfigResp != null && !TextUtils.isEmpty(carConfigResp.getMacAddress())) { + Log.d("Upgrade", "MoGoHandAdasMsgManager address = " + carConfigResp.getMacAddress()); CallerBindingcarManager.getBindingcarProvider().getBindingcarInfo(carConfigResp.getMacAddress(), MoGoAiCloudClientConfig.getInstance().getSn()); } } @@ -169,6 +180,7 @@ public class MoGoHandAdasMsgManager implements } + @Override public void onSweeperFutianCleanSystemState(VehicleStateOuterClass.SweeperFuTianCleanSystemState cleanSystemState) { diff --git a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/telematic/EventListener.kt b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/telematic/EventListener.kt new file mode 100644 index 0000000000..381a39a613 --- /dev/null +++ b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/telematic/EventListener.kt @@ -0,0 +1,5 @@ +package com.mogo.eagle.core.function.autopilot.telematic + +interface EventListener { + fun connectDevice(isSupportMulti: Boolean) +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/telematic/IMsgHandler.kt b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/telematic/IMsgHandler.kt index f4d1c9bbab..2e9c751e2e 100644 --- a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/telematic/IMsgHandler.kt +++ b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/telematic/IMsgHandler.kt @@ -17,4 +17,8 @@ interface IMsgHandler { fun synWriteTime() fun getTeleTimeStamp(): Long + + fun synMsgToAllClients() + + fun setListener(eventListener: EventListener?) } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/telematic/TeleMsgHandler.kt b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/telematic/TeleMsgHandler.kt index fbf3c04fb7..e5afd93c6b 100644 --- a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/telematic/TeleMsgHandler.kt +++ b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/telematic/TeleMsgHandler.kt @@ -1,6 +1,5 @@ package com.mogo.eagle.core.function.autopilot.telematic -import android.util.Log import androidx.lifecycle.ProcessLifecycleOwner import androidx.lifecycle.lifecycleScope import com.google.protobuf.TextFormat @@ -13,7 +12,7 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager.setDemoMode import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager.setIgnoreConditionDraw import com.mogo.eagle.core.function.call.bindingcar.CallerBindingcarManager -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.logger.* import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.eagle.core.utilcode.util.ToastUtils import com.mogo.telematic.MogoProtocolMsg @@ -41,6 +40,14 @@ class TeleMsgHandler : IMsgHandler { @Volatile private var isReceiveSN = false + @Volatile + private var demoModeTime = 0L + + @Volatile + private var timestamp = 0L + + private var listener: EventListener? = null + override fun handleMsgFromServer(msg: MogoProtocolMsg?, channel: Channel?) { msg?.let { when (it.protocolType) { @@ -57,23 +64,35 @@ class TeleMsgHandler : IMsgHandler { } } MogoProtocolMsg.SYNC_MODE_STATUS -> { - FunctionBuildConfig.isDemoMode = when (it.body[0].toInt()) { - 1 -> true - else -> false + val content = String(it.body) + if (content.contains(";")) { + val strArr = content.split(";") + if (strArr.size == 2) { + val currTime = strArr[1].toLong() + if (currTime > demoModeTime) { + FunctionBuildConfig.isDemoMode = when (strArr[0]) { + "1" -> true + else -> false + } + demoModeTime = currTime + invokeNettyConnResult("乘客屏收到的美化模式DemoMode为:${FunctionBuildConfig.isDemoMode}") + } else { + invokeNettyConnResult("乘客屏收到过时的美化模式DemoMode为:${FunctionBuildConfig.isDemoMode}") + } + } } - invokeNettyConnResult("乘客屏收到的美化模式DemoMode为:${FunctionBuildConfig.isDemoMode}") } MogoProtocolMsg.REQ_MAC_ADDRESS -> { val carConfig = MessagePad.CarConfigResp.parseFrom(msg.body) AppConfigInfo.plateNumber = carConfig.plateNumber AppConfigInfo.iPCMacAddress = carConfig.macAddress AppConfigInfo.dockerVersion = carConfig.dockVersion + listener?.connectDevice(!carConfig.dockVersion.contains("2.3.0")) invokeNettyConnResult( "司机屏发送给乘客屏配置信息为:${ TextFormat.printer().escapingNonAscii(false).printToString(carConfig) }" ) -// Log.d("liyz", "TeleMsgHandler macAddress = " + carConfig.macAddress) CallerBindingcarManager.getBindingcarProvider().getBindingcarInfo( carConfig.macAddress, MoGoAiCloudClientConfig.getInstance().sn @@ -87,11 +106,24 @@ class TeleMsgHandler : IMsgHandler { } // 美化模式是否忽略条件直接绘制 11 -> { - FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = when (it.body[0].toInt()) { - 1 -> true - else -> false + val content = String(it.body) + if (content.contains(";")) { + val strArr = content.split(";") + if (strArr.size == 2) { + val currTime = strArr[1].toLong() + if (currTime > timestamp) { + FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = + when (strArr[0]) { + "1" -> true + else -> false + } + timestamp = currTime + invokeNettyConnResult("乘客屏收到的美化模式isIgnore为:${FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData}") + } else { + invokeNettyConnResult("乘客屏收到过时的美化模式isIgnore为:${FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData}") + } + } } - invokeNettyConnResult("乘客屏收到的美化模式isIgnore为:${FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData}") } else -> { } @@ -105,6 +137,7 @@ class TeleMsgHandler : IMsgHandler { MogoProtocolMsg.REQ_MAC_ADDRESS -> { val carConfig = AdasManager.getInstance().carConfig if (carConfig != null) { + listener?.connectDevice(!carConfig.dockVersion.contains("2.3.0")) val configArray = carConfig.toByteArray() NSDNettyManager.getInstance().sendMsgToSpecifiedClient( @@ -225,6 +258,10 @@ class TeleMsgHandler : IMsgHandler { return wrTimeStamp } + override fun setListener(eventListener: EventListener?) { + listener = eventListener + } + private fun reqServerSN() { if (NettyTcpClient.sSERVER_SN.isNullOrEmpty()) { ProcessLifecycleOwner.get().lifecycleScope.launch { @@ -244,4 +281,20 @@ class TeleMsgHandler : IMsgHandler { } } } + + override fun synMsgToAllClients() { + if (NSDNettyManager.getInstance().isServerStart) { + val carConfig = AdasManager.getInstance().carConfig + if (carConfig != null) { + val configArray = carConfig.toByteArray() + + NSDNettyManager.getInstance().sendMsgToAllClients( + MogoProtocolMsg( + MogoProtocolMsg.REQ_MAC_ADDRESS, + configArray.size, configArray + ) + ) + } + } + } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/BindHostConst.kt b/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/BindHostConst.kt new file mode 100644 index 0000000000..04bf67be17 --- /dev/null +++ b/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/BindHostConst.kt @@ -0,0 +1,26 @@ +package com.mogo.eagle.core.function + +import com.mogo.commons.debug.DebugConfig + +/** + * cmdb 域名 + */ +class BindHostConst { + + companion object { + private const val UPGRADE_APP_HOST_DEV = "https://eagle-qa.zhidaozhixing.com/" + private const val UPGRADE_APP_HOST = "http://eagle-mis.zhidaozhixing.com/" + + @JvmStatic + fun getBaseUrl(): String { + return when (DebugConfig.getNetMode()) { + DebugConfig.NET_MODE_DEV -> UPGRADE_APP_HOST_DEV + DebugConfig.NET_MODE_QA -> UPGRADE_APP_HOST_DEV + DebugConfig.NET_MODE_DEMO -> UPGRADE_APP_HOST + DebugConfig.NET_MODE_RELEASE -> UPGRADE_APP_HOST + else -> UPGRADE_APP_HOST + } + } + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/appupgrade/network/UpgradeApiService.java b/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/appupgrade/network/UpgradeApiService.java index f6357e630a..bfed267d94 100644 --- a/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/appupgrade/network/UpgradeApiService.java +++ b/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/appupgrade/network/UpgradeApiService.java @@ -11,7 +11,7 @@ import retrofit2.http.Query; /** * @author lixiaopeng - * @description 绑定车辆 + * @description 升级 * @since: 6/20/22 */ public interface UpgradeApiService { @@ -21,7 +21,8 @@ public interface UpgradeApiService { * @return {@link UpgradeAppInfo} */ @Headers("Content-Type:application/json;charset=UTF-8") - @POST("unify/selectResources") - Observable getUpgradeInfo(@Query("resources") String res, @Body RequestBody requestBody); + @POST("eagleEye-mis/config/versionInfo") +// Observable getUpgradeInfo(@Query("resources") String res, @Body RequestBody requestBody); + Observable getUpgradeInfo(@Body RequestBody requestBody); } diff --git a/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/appupgrade/network/UpgradeAppNetWorkManager.java b/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/appupgrade/network/UpgradeAppNetWorkManager.java index cefcdcc149..fd4ec34bb6 100644 --- a/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/appupgrade/network/UpgradeAppNetWorkManager.java +++ b/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/appupgrade/network/UpgradeAppNetWorkManager.java @@ -4,20 +4,13 @@ import android.content.Context; import android.util.Log; import com.mogo.cloud.passport.MoGoAiCloudClientConfig; -import com.mogo.commons.constants.SharedPrefsConstants; -import com.mogo.eagle.core.data.bindingcar.BindingcarInfo; -import com.mogo.eagle.core.data.bindingcar.ModifyBindingcarInfo; import com.mogo.eagle.core.data.bindingcar.UpgradeAppInfo; -import com.mogo.eagle.core.function.api.bindingcar.BindingcarCallBack; +import com.mogo.eagle.core.function.BindHostConst; import com.mogo.eagle.core.function.call.hmi.CallerHmiManager; import com.mogo.eagle.core.network.MoGoRetrofitFactory; import com.mogo.eagle.core.network.utils.GsonUtil; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; -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.AppUtils; -import com.mogo.eagle.core.utilcode.util.GsonUtils; -import com.mogo.module.common.constants.HostConst; import io.reactivex.Observer; import io.reactivex.android.schedulers.AndroidSchedulers; @@ -35,11 +28,11 @@ import okhttp3.RequestBody; public class UpgradeAppNetWorkManager { private static volatile UpgradeAppNetWorkManager requestNoticeManager; private final UpgradeApiService mUpgradeApiService; - private static final String TAG = "UpgradeAppNetWorkManager"; + private static final String TAG = "Upgrade"; private UpgradeAppNetWorkManager() { - mUpgradeApiService = MoGoRetrofitFactory.getInstance(HostConst.UPGRADE_APP_HOST) + mUpgradeApiService = MoGoRetrofitFactory.getInstance(BindHostConst.getBaseUrl()) .create(UpgradeApiService.class); } @@ -58,18 +51,16 @@ public class UpgradeAppNetWorkManager { /** * 获取app升级信息 */ - public void getAppUpgradeInfo(Context context, String screenType, String carType) { - String sn = "X20202203105S688HZ"; -// int versionCode = 2070000; -// String versionName = "2.7.0"; - -// String sn = MoGoAiCloudClientConfig.getInstance().getSn(); + public void getAppUpgradeInfo(Context context, String mac, String screenType) { +// String sn = "X20202203105S688HZ"; +// String mac = "48:b0:2d:3a:bc:78"; + String sn = MoGoAiCloudClientConfig.getInstance().getSn(); int versionCode = AppUtils.getAppVersionCode(); - String versionName = AppUtils.getAppVersionName(); - - UpgradeAppRequest request = new UpgradeAppRequest(sn, versionCode, versionName, screenType, carType); + CallerLogger.INSTANCE.d(TAG, "getAppUpgradeInfo mac = " + mac + "---type = " + screenType + "---sn = " + sn + "---versionCode =" + versionCode); + Log.d(TAG, "mac = " + mac + "---type = " + screenType + "---sn = " + sn + "---versionCode =" + versionCode); + UpgradeAppRequest request = new UpgradeAppRequest(sn, mac, screenType); RequestBody requestBody = RequestBody.create(MediaType.get("application/json;charset=UTF-8"), GsonUtil.jsonFromObject(request)); - mUpgradeApiService.getUpgradeInfo("apps_control", requestBody) + mUpgradeApiService.getUpgradeInfo(requestBody) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer() { @@ -79,18 +70,21 @@ public class UpgradeAppNetWorkManager { @Override public void onNext(@NonNull UpgradeAppInfo info) { - if (info != null && info.getData() != null && info.getData().size() > 0) { - CallerLogger.INSTANCE.d(TAG, "UpgradeAppInfo url = " + info.getData().get(0).getApp_url() + "----code = " + info.getData().get(0).getVersion_code()); -// if (info.getData().get(0).getVersion_code() > versionCode) { - - CallerHmiManager.INSTANCE.showUpgradeDialog(info.getData().get(0).getApp_url().substring(info.getData().get(0).getApp_url().lastIndexOf("/")+1), info.getData().get(0).getApp_url()); -// } + if (info != null && info.result != null) { + CallerLogger.INSTANCE.d(TAG, "UpgradeAppInfo url = " + info.result.getAppUrl() + "----code = " + info.result.getVersionCode()); + Log.d(TAG, "UpgradeAppInfo url = " + info.result.getAppUrl() + "----code = " + info.result.getVersionCode() + "--versionCode =" + versionCode + "--info.result = " + info.result); + if (info.result.getVersionCode() > versionCode) { + CallerHmiManager.INSTANCE.showUpgradeDialog(info.result.getAppUrl().substring(info.result.getAppUrl().lastIndexOf("/")+1), info.result.getAppUrl(), info.result.getInstallTitle(), info.result.getInstallContent(), info.result.getInstallType()); + } + } else { + Log.e(TAG, "onNext info == null"); + CallerLogger.INSTANCE.d(TAG, "UpgradeAppInfo onNext info == null"); } } @Override - public void onError(@NonNull Throwable e) { - CallerLogger.INSTANCE.e(TAG, "UpgradeAppInfo onError e = " + e.toString() + "---e.getMessage = " + e.getMessage()); + public void onError(Throwable e) { + } @Override diff --git a/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/appupgrade/network/UpgradeAppRequest.java b/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/appupgrade/network/UpgradeAppRequest.java index 78e35e9531..ab5c927cc2 100644 --- a/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/appupgrade/network/UpgradeAppRequest.java +++ b/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/appupgrade/network/UpgradeAppRequest.java @@ -6,18 +6,15 @@ package com.mogo.eagle.core.function.appupgrade.network; * @since: 11/15/21 */ public class UpgradeAppRequest { + private String mac; private String sn; - private int version_code; - private String version_name; - private String screen_type; - private String car_type; + private String screenType; - public UpgradeAppRequest( String sn, int versionCode, String versionName, String type, String carType) { + + public UpgradeAppRequest( String sn, String mac, String screenType) { this.sn = sn; - this.version_code = versionCode; - this.version_name = versionName; - this.screen_type = type; - this.car_type = carType; + this.mac = mac; + this.screenType = screenType; } public String getSn() { @@ -28,46 +25,20 @@ public class UpgradeAppRequest { this.sn = sn; } - public int getVersion_code() { - return version_code; + public String getMac() { + return mac; } - public void setVersion_code(int version_code) { - this.version_code = version_code; + public void setMac(String mac) { + this.mac = mac; } - public String getVersion_name() { - return version_name; + public String getScreenType() { + return screenType; } - public void setVersion_name(String version_name) { - this.version_name = version_name; + public void setScreenType(String screenType) { + this.screenType = screenType; } - public String getScreen_type() { - return screen_type; - } - - public void setScreen_type(String screen_type) { - this.screen_type = screen_type; - } - - public String getCar_type() { - return car_type; - } - - public void setCar_type(String car_type) { - this.car_type = car_type; - } - - @Override - public String toString() { - return "UpgradeAppRequest{" + - "sn='" + sn + '\'' + - ", version_code=" + version_code + - ", version_name='" + version_name + '\'' + - ", screen_type='" + screen_type + '\'' + - ", car_type='" + car_type + '\'' + - '}'; - } } diff --git a/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/bindingcar/BindingcarProvider.java b/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/bindingcar/BindingcarProvider.java index 8a5e01ee78..1e61715f12 100644 --- a/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/bindingcar/BindingcarProvider.java +++ b/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/bindingcar/BindingcarProvider.java @@ -11,6 +11,7 @@ import com.mogo.eagle.core.function.api.bindingcar.BindingcarCallBack; import com.mogo.eagle.core.function.api.bindingcar.IMoGoBindingcarProvider; import com.mogo.eagle.core.function.appupgrade.network.UpgradeAppNetWorkManager; import com.mogo.eagle.core.function.bindingcar.network.BindingcarNetWorkManager; +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager; import com.mogo.eagle.core.function.ipcupgrade.IPCUpgradeManager; import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils; import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr; @@ -57,6 +58,7 @@ public class BindingcarProvider implements IMoGoBindingcarProvider { */ @Override public void getBindingcarInfo(String macAddress, String widevineIDWithMd5) { + Log.d("Upgrade", "getBindingcarInfo macAddress = " + macAddress + "--widevineIDWithMd5 = " + widevineIDWithMd5); mAddress = macAddress; mWidevineIDWithMd5 = widevineIDWithMd5; if (getScreenType() == 1) { //司机屏 @@ -116,6 +118,10 @@ public class BindingcarProvider implements IMoGoBindingcarProvider { } } + /** + * 以后可能废弃 + * @return + */ private int getScreenType() { int screenType = -1; if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { @@ -142,12 +148,33 @@ public class BindingcarProvider implements IMoGoBindingcarProvider { } + private String getCarScreenType() { + String screenType = ""; + if(AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode) && AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { + screenType = "1"; //taxi乘客端 + } + + if(AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode) && AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + screenType = "2"; //taxi司机端 + } + + if(AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode) && AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { + screenType = "3"; //bus 乘客端 + } + + if(AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode) && AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + screenType = "4"; //bus 司机端 + } + + return screenType; + } + /** * 查询app是否需要升级 */ @Override public void queryAppUpgrade() { - UpgradeAppNetWorkManager.getInstance().getAppUpgradeInfo(mContext, String.valueOf(getScreenType()), String.valueOf(getCarType())); + UpgradeAppNetWorkManager.getInstance().getAppUpgradeInfo(mContext, mAddress, getCarScreenType()); } } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt index 39cd282e7b..8ebdf939ae 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt @@ -11,6 +11,8 @@ import com.mogo.eagle.core.data.deva.scene.SceneModule import com.mogo.eagle.core.data.deva.scene.SceneTAG import com.mogo.eagle.core.function.api.devatools.IDevaToolsProvider import com.zhjt.mogo_core_function_devatools.badcase.BadCaseManager +import com.zhjt.mogo_core_function_devatools.funcconfig.FuncConfigCenter.Companion.bizConfigCenter +import com.zhjt.mogo_core_function_devatools.funcconfig.FuncConfigImpl import com.zhjt.mogo_core_function_devatools.logcatch.MogoLogCatchManager import com.zhjt.mogo_core_function_devatools.monitor.MonitorManager import com.zhjt.mogo_core_function_devatools.scene.SceneManager.Companion.sceneManager @@ -30,8 +32,12 @@ class DevaToolsProvider : IDevaToolsProvider { override fun init(context: Context) { mContext = context - traceManager.init(context) - MogoLogCatchManager.init(context) + } + + override fun initBiz() { + bizConfigCenter.init(mContext!!) + traceManager.init(mContext!!) + MogoLogCatchManager.init(mContext!!) } override fun startLogCatch() { diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/record/RecordHelper.java b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/record/RecordHelper.java index bea8b5f739..bcd74d8efe 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/record/RecordHelper.java +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/record/RecordHelper.java @@ -6,7 +6,6 @@ import android.os.Environment; import android.util.Log; 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.FileUtils; import com.zhjt.mogo_core_function_devatools.badcase.record.fft.FftFactory; import com.zhjt.mogo_core_function_devatools.badcase.record.listener.RecordListener; @@ -177,14 +176,14 @@ public class RecordHelper { AudioRecordThread() { bufferSize = AudioRecord.getMinBufferSize(currentConfig.getSampleRate(), currentConfig.getChannelConfig(), currentConfig.getEncodingConfig()) * RECORD_AUDIO_BUFFER_TIMES; - Logger.d(TAG, "record buffer size = %s", bufferSize); + CallerLogger.INSTANCE.d("$M_DEVA$TAG", "record buffer size = %s", bufferSize); audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, currentConfig.getSampleRate(), currentConfig.getChannelConfig(), currentConfig.getEncodingConfig(), bufferSize); if (currentConfig.getFormat() == RecordConfig.RecordFormat.MP3) { if (mp3EncodeThread == null) { initMp3EncoderThread(bufferSize); } else { - Logger.e(TAG, "mp3EncodeThread != null, 请检查代码"); + CallerLogger.INSTANCE.e("$M_DEVA$TAG", "mp3EncodeThread != null, 请检查代码"); } } } @@ -206,7 +205,7 @@ public class RecordHelper { private void startPcmRecorder() { state = RecordState.RECORDING; notifyState(); - Logger.d(TAG, "开始录制 Pcm"); + CallerLogger.INSTANCE.d("$M_DEVA$TAG", "开始录制 Pcm"); FileOutputStream fos = null; try { fos = new FileOutputStream(tmpFile); @@ -224,7 +223,7 @@ public class RecordHelper { if (state == RecordState.STOP) { makeFile(); } else { - Logger.i(TAG, "暂停!"); + CallerLogger.INSTANCE.i("$M_DEVA$TAG", "暂停!"); } } catch (Exception e) { notifyError("录音失败"); @@ -240,7 +239,7 @@ public class RecordHelper { if (state != RecordState.PAUSE) { state = RecordState.IDLE; notifyState(); - Logger.d(TAG, "录音结束"); + CallerLogger.INSTANCE.d("$M_DEVA$TAG", "录音结束"); } } @@ -268,7 +267,7 @@ public class RecordHelper { notifyState(); stopMp3Encoded(); } else { - Logger.d(TAG, "暂停"); + CallerLogger.INSTANCE.d("$M_DEVA$TAG", "暂停"); } } } @@ -283,7 +282,7 @@ public class RecordHelper { } }); } else { - Logger.e(TAG, "mp3EncodeThread is null, 代码业务流程有误,请检查!! "); + CallerLogger.INSTANCE.e("$M_DEVA$TAG", "mp3EncodeThread is null, 代码业务流程有误,请检查!! "); } } @@ -302,7 +301,7 @@ public class RecordHelper { break; } notifyFinish(); - Logger.i(TAG, "录音完成! path: %s ; 大小:%s", resultFile.getAbsoluteFile(), resultFile.length()); + CallerLogger.INSTANCE.i("$M_DEVA$TAG", "录音完成! path: %s ; 大小:%s", resultFile.getAbsoluteFile(), resultFile.length()); } /** @@ -377,7 +376,7 @@ public class RecordHelper { private String getFilePath(String fileName) { if (!FileUtils.createOrExistsDir(ROOT_PATH)) { - Logger.w(TAG, "文件夹创建失败:%s", ROOT_PATH); + CallerLogger.INSTANCE.w("$M_DEVA$TAG", "文件夹创建失败:%s", ROOT_PATH); return null; } @@ -388,7 +387,7 @@ public class RecordHelper { private String getTempFilePath() { if (!FileUtils.createOrExistsDir(TEMP_PATH)) { - Logger.e(TAG, "文件夹创建失败:%s", TEMP_PATH); + CallerLogger.INSTANCE.e("$M_DEVA$TAG", "文件夹创建失败:%s", TEMP_PATH); } String fileName = String.format(Locale.getDefault(), "tmp_%s", FileUtils.getNowString(new SimpleDateFormat("yyyyMMddHHmmssSSS", Locale.SIMPLIFIED_CHINESE))); return String.format(Locale.getDefault(), "%s%s.pcm", TEMP_PATH, fileName); diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigCenter.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigCenter.kt new file mode 100644 index 0000000000..3e585ace26 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigCenter.kt @@ -0,0 +1,100 @@ +package com.zhjt.mogo_core_function_devatools.funcconfig + +import android.content.Context +import com.mogo.aicloud.services.socket.IMogoOnMessageListener +import com.mogo.aicloud.services.socket.MogoAiCloudSocketManager +import com.mogo.commons.AbsMogoApplication +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_ALIAS_CODE_FUNC_CONFIG_CHANGED +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_LINK_CLOUD_SHOW +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_LINK_LOG_CONNECT_STATUS +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotCarConfigListener +import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotCarConfigListenerManager +import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsFuncConfigListenerManager +import com.mogo.eagle.core.utilcode.util.GsonUtils +import com.mogo.eagle.core.utilcode.util.SPUtils +import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.mogo.eagle.core.utilcode.util.UiThreadHandler +import com.zhjt.mogo_core_function_devatools.funcconfig.FuncConfigConst.Companion.FUNC_CONFIG_TYPE +import com.zhjt.mogo_core_function_devatools.funcconfig.FuncConfigConst.Companion.defaultFuncConfig +import com.zhjt.mogo_core_function_devatools.funcconfig.network.FuncConfigNetWorkModel +import com.zhjt.service.chain.ChainLog +import com.zhjt.service.chain.TracingConstants +import com.zhjt.service_biz.BizManager +import com.zhjt.service_biz.FuncConfig +import mogo.telematics.pad.MessagePad + +class FuncConfigCenter : IMogoOnMessageListener, IMoGoAutopilotCarConfigListener { + + companion object { + + private const val TAG = "FuncConfigCenter" + + val bizConfigCenter by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + FuncConfigCenter() + } + } + + private var mContext: Context? = null + private val funcConfigNetWorkModel = FuncConfigNetWorkModel() + + fun init(context: Context) { + mContext = context + MogoAiCloudSocketManager.getInstance(AbsMogoApplication.getApp().applicationContext) + .registerOnMessageListener(FUNC_CONFIG_TYPE, this) + CallerAutopilotCarConfigListenerManager.addListener(TAG, this) + } + + override fun onAutopilotCarConfig(carConfigResp: MessagePad.CarConfigResp) { + if (!carConfigResp.macAddress.isNullOrEmpty()) { + UiThreadHandler.post { + funcConfigNetWorkModel.requestFuncConfig(carConfigResp.macAddress, { + SPUtils.getInstance("biz_config").put("config", GsonUtils.toJson(it)) + refreshConfig(it) + }, { + val bizJson = SPUtils.getInstance("biz_config") + .getString("config", GsonUtils.toJson(defaultFuncConfig())) + refreshConfig(GsonUtils.fromJson(bizJson, FuncConfig::class.java)) + }) + } + }else{ + ToastUtils.showLong("未获取到域控mac信息") + } + } + + override fun target(): Class { + return FuncConfig::class.java + } + + override fun onMsgReceived(obj: FuncConfig?) { + obj?.let { + refreshConfig(it) + } + } + + @ChainLog( + linkChainLog = CHAIN_LINK_LOG_CONNECT_STATUS, + linkCode = CHAIN_LINK_CLOUD_SHOW, + endpoint = TracingConstants.Endpoint.PAD, + nodeAliasCode = CHAIN_ALIAS_CODE_FUNC_CONFIG_CHANGED, + paramIndexes = [0], + clientPkFileName = "sn" + ) + private fun refreshConfig(funcConfig: FuncConfig) { + BizManager.updateBizConfigData(funcConfig) + funcConfig.business.forEach { business -> + CallerDevaToolsFuncConfigListenerManager.invokeDevaToolsFuncConfigBizUpdate( + business.biz.uppercase(), + business.data + ) + } + } + + fun onDestroy() { + MogoAiCloudSocketManager.getInstance(AbsMogoApplication.getApp().applicationContext) + .unregisterLifecycleListener(FUNC_CONFIG_TYPE) + CallerAutopilotCarConfigListenerManager.removeListener(TAG) + mContext = null + } + + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigConst.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigConst.kt new file mode 100644 index 0000000000..9b2fd420b0 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigConst.kt @@ -0,0 +1,121 @@ +package com.zhjt.mogo_core_function_devatools.funcconfig + +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_AUTOPILOT_LANE_SELECTION +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_AVW +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_BSW +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_BYPASS +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_CLW +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_DNPW +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_EBW +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_FCW +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_FULL_LOG +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_HLW +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_IVP +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_IVP_GREEN +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_IVS +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_LCW +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_LIMIT_SPEED_SET +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_LTA +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_OPT_LINE +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_PNC_ACTIONS +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_RAIN_MODE +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_RTS +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_SLW +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_TJW +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_TRACE_LOG +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_VIP +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_VRU +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_VRU_RI +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_WARNING_UPLOAD +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.FOUNDATION +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.V2I +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.V2N +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.V2V +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils +import com.mogo.eagle.core.utilcode.util.AppUtils +import com.zhjt.mogo_core_function_devatools.BuildConfig +import com.zhjt.mogo_core_function_devatools.env.EnvChangeManager +import com.zhjt.service_biz.Business +import com.zhjt.service_biz.FuncConfig +import com.zhjt.service_biz.SubBiz + +class FuncConfigConst { + + companion object{ + + const val FUNC_CONFIG_TYPE = 500001 + + fun defaultFuncConfig(): FuncConfig { + val businessList = mutableListOf() + + val v2nSubList = mutableListOf() + v2nSubList.add(SubBiz(BIZ_VIP, lock = false, state = true, dependNode = "", data = "")) + v2nSubList.add(SubBiz(BIZ_OPT_LINE, lock = false, state = false, dependNode = "", data = "")) + v2nSubList.add(SubBiz(BIZ_VRU, lock = false, state = true, dependNode = "", data = "")) + v2nSubList.add(SubBiz(BIZ_VRU_RI, lock = false, state = false, dependNode = "", data = "")) + v2nSubList.add(SubBiz(BIZ_HLW, lock = false, state = true, dependNode = "", data = "")) + businessList.add(Business(V2N, v2nSubList)) + + val v2iSubList = mutableListOf() + v2iSubList.add(SubBiz(BIZ_IVP_GREEN, lock = false, state = true, dependNode = "", data = "")) + v2iSubList.add(SubBiz(BIZ_IVP, lock = false, state = true, dependNode = "", data = "")) + v2iSubList.add(SubBiz(BIZ_RTS, lock = false, state = true, dependNode = "", data = "")) + v2iSubList.add(SubBiz(BIZ_SLW, lock = false, state = true, dependNode = "", data = "")) + v2iSubList.add(SubBiz(BIZ_IVS, lock = false, state = true, dependNode = "", data = "")) + v2iSubList.add(SubBiz(BIZ_TJW, lock = false, state = true, dependNode = "", data = "")) + businessList.add(Business(V2I,v2iSubList)) + + val v2vSubList = mutableListOf() + v2vSubList.add(SubBiz(BIZ_AVW, lock = false, state = true, dependNode = "", data = "")) + v2vSubList.add(SubBiz(BIZ_LCW, lock = false, state = true, dependNode = "", data = "")) + v2vSubList.add(SubBiz(BIZ_BSW, lock = false, state = true, dependNode = "", data = "")) + v2vSubList.add(SubBiz(BIZ_EBW, lock = false, state = true, dependNode = "", data = "")) + v2vSubList.add(SubBiz(BIZ_FCW, lock = false, state = true, dependNode = "", data = "")) + v2vSubList.add(SubBiz(BIZ_LTA, lock = false, state = true, dependNode = "", data = "")) + v2vSubList.add(SubBiz(BIZ_CLW, lock = false, state = true, dependNode = "", data = "")) + v2vSubList.add(SubBiz(BIZ_DNPW, lock = false, state = true, dependNode = "", data = "")) + businessList.add(Business(V2V,v2vSubList)) + + val foundationSubList = mutableListOf() + foundationSubList.add(SubBiz(BIZ_BEAUTY_MODE, lock = false, state = false, dependNode = "", data = "")) + foundationSubList.add(SubBiz(BIZ_RAIN_MODE, lock = false, state = false, dependNode = "", data = "")) + foundationSubList.add(SubBiz(BIZ_FULL_LOG, lock = false, state = true, dependNode = "", data = "")) + foundationSubList.add(SubBiz(BIZ_TRACE_LOG, lock = false, state = true, dependNode = "", data = "")) + foundationSubList.add(SubBiz(BIZ_BAG_RECORD, lock = false, state = true, dependNode = "", data = "")) + foundationSubList.add(SubBiz(BIZ_WARNING_UPLOAD, lock = false, state = true, dependNode = "", data = "")) + foundationSubList.add(SubBiz(BIZ_LIMIT_SPEED_SET, lock = false, state = true, dependNode = "", data = "")) + foundationSubList.add(SubBiz(BIZ_BYPASS, lock = false, state = true, dependNode = "", data = "")) + foundationSubList.add(SubBiz(BIZ_AUTOPILOT_LANE_SELECTION, lock = false, state = true, dependNode = "", data = "")) + foundationSubList.add(SubBiz(BIZ_PNC_ACTIONS, lock = false, state = true, dependNode = "", data = "")) + businessList.add(Business(FOUNDATION,foundationSubList)) + + return FuncConfig(0, AppUtils.getAppVersionCode(), getChannelCode(), getEnv(), businessList) + } + + private fun getEnv():Int{ + return if(EnvChangeManager.getEnvConfig()!= null){ + EnvChangeManager.getEnvConfig()!!.netMode + }else { + 0 + } + } + + // todo 新增车型需要更新(清扫车) + fun getChannelCode(): Int{ + return when{ + AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode) + && AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode) -> 1 + AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode) + && AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode) -> 2 + AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode) + && AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode) -> 3 + AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode) + && AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode) -> 4 + else -> 0 + } + } + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigImpl.kt new file mode 100644 index 0000000000..0f9f976b4f --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigImpl.kt @@ -0,0 +1,33 @@ +package com.zhjt.mogo_core_function_devatools.funcconfig + +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_BEAUTY_MODE +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.bizconfig.FuncBizConfig.Companion.FOUNDATION +import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsFuncConfigListener +import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsFuncConfigListenerManager + +object FuncConfigImpl { + + private const val TAG = "FuncConfigImpl" + + fun init() { + CallerDevaToolsFuncConfigListenerManager.registerDevaToolsFuncConfigListener(FOUNDATION, + TAG, + object : IMoGoDevaToolsFuncConfigListener { + override fun updateBizData( + type: String, + state: Boolean, + lock: Boolean, + data: String? + ) { + when (type) { + } + } + } + ) + + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/network/FuncConfigApiService.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/network/FuncConfigApiService.kt new file mode 100644 index 0000000000..2ef42eb569 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/network/FuncConfigApiService.kt @@ -0,0 +1,16 @@ +package com.zhjt.mogo_core_function_devatools.funcconfig.network + +import com.mogo.eagle.core.data.BaseResponse +import com.zhjt.service_biz.FuncConfig +import retrofit2.http.Body +import retrofit2.http.Headers +import retrofit2.http.POST + +interface FuncConfigApiService { + + //FuncConfig + @Headers("Content-Type:application/json;charset=UTF-8") + @POST("eagleEye-mis/config/abilityInfo") + suspend fun funcConfig(@Body map: MutableMap): BaseResponse + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/network/FuncConfigHost.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/network/FuncConfigHost.kt new file mode 100644 index 0000000000..1d8648ec24 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/network/FuncConfigHost.kt @@ -0,0 +1,22 @@ +package com.zhjt.mogo_core_function_devatools.funcconfig.network + +import com.mogo.commons.debug.DebugConfig + +class FuncConfigHost { + + companion object{ + private const val HOST_DEV = "https://eagle-qa.zhidaozhixing.com" + private const val HOST_RELEASE = "https://eagle.zhidaozhixing.com" + + fun get(): String{ + return when (DebugConfig.getNetMode()) { + DebugConfig.NET_MODE_DEV -> HOST_DEV + DebugConfig.NET_MODE_QA -> HOST_DEV + DebugConfig.NET_MODE_DEMO -> HOST_RELEASE + DebugConfig.NET_MODE_RELEASE -> HOST_RELEASE + else -> HOST_RELEASE + } + } + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/network/FuncConfigNetWorkModel.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/network/FuncConfigNetWorkModel.kt new file mode 100644 index 0000000000..84f786e521 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/network/FuncConfigNetWorkModel.kt @@ -0,0 +1,71 @@ +package com.zhjt.mogo_core_function_devatools.funcconfig.network + +import com.mogo.cloud.passport.MoGoAiCloudClientConfig +import com.mogo.eagle.core.data.BaseResponse +import com.mogo.eagle.core.network.MoGoRetrofitFactory +import com.mogo.eagle.core.network.apiCall +import com.mogo.eagle.core.network.request +import com.mogo.eagle.core.utilcode.util.DeviceUtils +import com.zhjt.mogo_core_function_devatools.funcconfig.FuncConfigConst +import com.zhjt.service_biz.FuncConfig + +class FuncConfigNetWorkModel { + + private fun getNetWorkApi(baseUrl: String = FuncConfigHost.get()): FuncConfigApiService { + return MoGoRetrofitFactory.getInstanceNoCallAdapter(baseUrl) + .create(FuncConfigApiService::class.java) + } + + private var retryTime = 0 + private var success: ((FuncConfig) -> Unit)? = null + private var error: ((String) -> Unit)? = null + + fun requestFuncConfig( + mac:String, + onSuccess: ((FuncConfig) -> Unit)? = null, + onError: ((String) -> Unit)? = null + ) { + request> { + val map = mutableMapOf() + start { + if (success == null) { + success = onSuccess + } + if (error == null) { + error = onError + } + map["sn"] = MoGoAiCloudClientConfig.getInstance().sn + map["mac"] = mac + map["channelVersion"] = FuncConfigConst.getChannelCode() + } + loader { + apiCall { + getNetWorkApi().funcConfig(map) + } + } + onSuccess { + if (it.result != null) { + success?.invoke(it.result) + } else { + if (retryTime < 3) { + retryTime += 1 + requestFuncConfig(mac) + } else { + error?.invoke("FuncConfig error msg is null") + } + } + } + onError { + if (retryTime < 3) { + retryTime += 1 + requestFuncConfig(mac) + } else if (it.message != null) { + error?.invoke(it.message ?: "FuncConfig error msg is null") + } + + } + + } + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/logcatch/MogoLogCatchManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/logcatch/MogoLogCatchManager.kt index 7614bfc5e2..8cbc2c5abc 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/logcatch/MogoLogCatchManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/logcatch/MogoLogCatchManager.kt @@ -12,6 +12,8 @@ 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.constants.MoGoConfig +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_FULL_LOG +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.FOUNDATION import com.mogo.eagle.core.function.api.map.deva.IMoGoMapDevaProvider import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsListenerManager @@ -34,6 +36,7 @@ import com.zhjt.mogo_core_function_devatools.logcatch.MogoLogCatchConst.Companio import com.zhjt.mogo_core_function_devatools.logcatch.MogoLogCatchConst.Companion.LOG_PUSH_TYPE import com.zhjt.mogo_core_function_devatools.logcatch.MogoLogCatchConst.Companion.START_CATCH_LOG import com.zhjt.mogo_core_function_devatools.logcatch.MogoLogCatchConst.Companion.STOP_CATCH_LOG +import com.zhjt.service_biz.BizConfig import java.io.File @SuppressLint("StaticFieldLeak") @@ -136,6 +139,7 @@ object MogoLogCatchManager : IMogoOnMessageListener, Handl return false } + @BizConfig(FOUNDATION, "", BIZ_FULL_LOG) fun startCatchLog(duration: Int = 10, logPrefixName: String? = null) { if (catchingList.contains(manualContent.pkgName + logPrefixName)) { TipToast.shortTip("已经在抓取日志了,请稍后再试") @@ -156,7 +160,7 @@ object MogoLogCatchManager : IMogoOnMessageListener, Handl private fun startCatchLog(content: RemoteLogPushContent, logPrefixName: String? = null) { CallerLogger.d("$M_DEVA$TAG", "startCatchLog path : ${content.pkgName + logPrefixName}") - if(MoGoAiCloudClientConfig.getInstance().sn == null){ + if (MoGoAiCloudClientConfig.getInstance().sn == null) { ThreadUtils.runOnUiThread { TipToast.shortTip("缺少设备唯一ID,请检查网络") } @@ -247,14 +251,14 @@ object MogoLogCatchManager : IMogoOnMessageListener, Handl } override fun uploadFile(filePath: String) { - if(!mapCacheUpload){ + if (!mapCacheUpload) { return } val file = File(filePath) if (file.isFile) { CallerLogger.d("$M_DEVA$TAG", "uploadFile path : $filePath") LogInfoManagerFactory.handleSingleUploadFile(filePath) - }else{ + } else { CallerLogger.d("$M_DEVA$TAG", "file absPath : ${file.absolutePath}") } } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/scene/SceneManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/scene/SceneManager.kt index 14f87bb3e6..329b2ff2ab 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/scene/SceneManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/scene/SceneManager.kt @@ -5,7 +5,6 @@ import com.mogo.eagle.core.data.deva.scene.SceneModule import com.mogo.eagle.core.data.deva.scene.SceneModuleTAG import com.mogo.eagle.core.data.deva.scene.SceneTAG import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsListenerManager -import com.mogo.eagle.core.utilcode.mogo.logger.Logger import com.mogo.eagle.core.utilcode.mogo.logger.scene.Scene.Companion.scene import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_ADAS_IMPL import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS @@ -71,7 +70,6 @@ class SceneManager { //默认未创建的,符合scene tag,首次初始化logger=true scene.addChangeListener { change -> - Logger.i("emArrow","scene change : $change") sceneModuleTAG.map.iterator().forEach { map -> val sceneModule = map.value sceneModule.name?.let { diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/StatusManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/StatusManager.kt index 42d8590c53..7ce7f46979 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/StatusManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/StatusManager.kt @@ -12,6 +12,7 @@ import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener import com.mogo.eagle.core.function.call.autopilot.* import com.mogo.eagle.core.utilcode.kotlin.* import com.mogo.eagle.core.utilcode.mogo.logger.* +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_DEVA import com.mogo.eagle.core.utilcode.util.* import com.zhjt.mogo_core_function_devatools.status.entity.CanStatus import com.zhjt.mogo_core_function_devatools.status.entity.GpsStatus @@ -50,10 +51,10 @@ object StatusManager { override fun onAutopilotGuardian(guardianInfo: MogoReportMsg.MogoReportMessage?) { super.onAutopilotGuardian(guardianInfo) guardianInfo?.code?.takeIf { - Logger.d(TAG, "-- onAutopilotGuardian ---: code: $it") + CallerLogger.d("$M_DEVA$TAG", "-- onAutopilotGuardian ---: code: $it") it.contains("RTK_STATUS", true) || it.contains("CAN", true) || it == "ILCT_RTK_OR_SLAM_CHANGE" }?.run { - Logger.d(TAG, "-- onAutopilotGuardian trigger req ---: code: $this") + CallerLogger.d("$M_DEVA$TAG", "-- onAutopilotGuardian trigger req ---: code: $this") req() } } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/gps/GpsImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/gps/GpsImpl.kt index 01b5a2ff9f..43c94c86b5 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/gps/GpsImpl.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/gps/GpsImpl.kt @@ -49,9 +49,19 @@ internal class GpsImpl(ctx: Context): IFlow(ctx) { false } + private val onStateListener = object : IAppStateListener { + + override fun onAppStateChanged(isForeground: Boolean) { + if (isForeground) { + send(isLocationEnabled(), isGrandFineLocation()) + } + } + } + override fun onCreate() { val isGranted = isGrandFineLocation() + AppStateManager.registerAppStateListener(onStateListener) send(isLocationEnabled(), isGranted) if (!isGranted) { PermissionUtils.requestAccessFineLocation(object : SimpleCallback { @@ -88,6 +98,7 @@ internal class GpsImpl(ctx: Context): IFlow(ctx) { } catch (t: Throwable) { t.printStackTrace() } + AppStateManager.unRegisterAppStateListener(onStateListener) } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/rtk/RTKImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/rtk/RTKImpl.kt index c5663854b5..69f1b8f199 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/rtk/RTKImpl.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/rtk/RTKImpl.kt @@ -4,7 +4,8 @@ import android.content.* import android.util.* import com.mogo.eagle.core.function.api.autopilot.* import com.mogo.eagle.core.function.call.autopilot.* -import com.mogo.eagle.core.utilcode.mogo.logger.* +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_DEVA import com.zhjt.mogo_core_function_devatools.status.entity.RTKStatus import com.zhjt.mogo_core_function_devatools.status.flow.IFlow import kotlinx.coroutines.* @@ -31,7 +32,7 @@ internal class RTKImpl(ctx: Context): IFlow(ctx), IMoGoAutopilotStatu override fun onCreate() { send(RTKStatus(getDesc(), getCode())) - Logger.d(TAG, "-- onCreate --") + CallerLogger.d("$M_DEVA$TAG", "-- onCreate --") CallerAutoPilotStatusListenerManager.addListener(TAG, this) CallerAutopilotCarStatusListenerManager.addListener(TAG, this) if (CallerAutoPilotManager.isConnected()) { @@ -67,7 +68,7 @@ internal class RTKImpl(ctx: Context): IFlow(ctx), IMoGoAutopilotStatu override fun onAutopilotIpcConnectStatusChanged(status: Int, reason: String?) { super.onAutopilotIpcConnectStatusChanged(status, reason) if (!CallerAutoPilotManager.isConnected()) { - Logger.d(TAG, "工控机断开了....") + CallerLogger.d("$M_DEVA$TAG", "工控机断开了....") healthInfo.set(null) send(RTKStatus("", -1)) } @@ -114,7 +115,7 @@ internal class RTKImpl(ctx: Context): IFlow(ctx), IMoGoAutopilotStatu override fun onDestroy() { super.onDestroy() isOldVersion.set(false) - Logger.d(TAG, "-- onDestroy --") + CallerLogger.d("$M_DEVA$TAG", "-- onDestroy --") CallerAutoPilotStatusListenerManager.removeListener(TAG) CallerAutopilotCarStatusListenerManager.removeListener(TAG) } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/adapter/StatusAdapter.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/adapter/StatusAdapter.kt index 7e9d4fded7..040e8a70c2 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/adapter/StatusAdapter.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/adapter/StatusAdapter.kt @@ -7,8 +7,8 @@ import androidx.core.content.* import androidx.recyclerview.widget.* import com.mogo.eagle.core.utilcode.kotlin.* import com.mogo.eagle.core.utilcode.mogo.logger.* +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_DEVA import com.mogo.eagle.core.utilcode.util.* -import com.zhjt.mogo_core_function_devatools.* import com.zhjt.mogo_core_function_devatools.R import com.zhjt.mogo_core_function_devatools.R.drawable import com.zhjt.mogo_core_function_devatools.status.entity.* @@ -16,7 +16,6 @@ import com.zhjt.mogo_core_function_devatools.status.entity.IpcStatus import com.zhjt.mogo_core_function_devatools.status.entity.Status import com.zhjt.mogo_core_function_devatools.status.entity.TracingStatus.Tracing.* import com.zhjt.mogo_core_function_devatools.status.ui.adapter.StatusAdapter.StatusViewHolder -import kotlinx.coroutines.* internal class StatusAdapter(val ctx: Context, var data: ArrayList): RecyclerView.Adapter() { @@ -124,7 +123,7 @@ internal class StatusAdapter(val ctx: Context, var data: ArrayList): Rec is TracingStatus -> { val extra = status.state.extra val extraDesc = if (extra != null && extra.isNotEmpty()) extra.values.joinToString(",") else "" - Logger.d(TAG, "traceing_state: $status -> extra: $extraDesc :: extra: $extra") + CallerLogger.d("$M_DEVA$TAG", "traceing_state: $status -> extra: $extraDesc :: extra: $extra") when(status.state) { //"轨迹类型:${ if (status.state == TRACK_LOADED) "循迹" else if (status.state == ROUTE_LOADED) "自主算路" else "暂无轨迹" }" MAP_TRA_TYPE -> { diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/trace/TraceManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/trace/TraceManager.kt index 5d38abba20..a0c48db9ec 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/trace/TraceManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/trace/TraceManager.kt @@ -61,7 +61,8 @@ class TraceManager : IMoGoCloudListener { FwBuild(true, -1, pkgName + ChainConstant.CHAIN_LINK_LOG_ADAS_PLANNING_ACTIONS) fwBuildMap[ChainConstant.CHAIN_LINK_LOG_NATIVE_LEAK] = FwBuild(true, -1, pkgName + ChainConstant.CHAIN_LINK_LOG_RECORD_NATIVE_LEAK) - + fwBuildMap[ChainConstant.CHAIN_LINK_LOG_CLOUD_V2N] = + FwBuild(true, -1, pkgName + ChainConstant.CHAIN_LINK_LOG_CLOUD_WEB_SOCKET_V2N) traceInfoCache[ChainConstant.CHAIN_LINK_LOG_CONNECT_STATUS] = @@ -84,6 +85,8 @@ class TraceManager : IMoGoCloudListener { ChainLogParam(true, "ADAS PLANNING 决策行为") traceInfoCache[ChainConstant.CHAIN_LINK_LOG_NATIVE_LEAK] = ChainLogParam(true, "Native Leak Record") + traceInfoCache[ChainConstant.CHAIN_LINK_LOG_CLOUD_V2N] = + ChainLogParam(true, "Cloud WebSocket V2N") FileWriteManager.getInstance() .init(context, MoGoAiCloudClientConfig.getInstance().sn, pkgName, fwBuildMap) diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/UpgradeManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/UpgradeManager.kt index d4a9242b9b..d563420be8 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/UpgradeManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/UpgradeManager.kt @@ -77,7 +77,6 @@ class UpgradeManager : IDownload { if (downloadUrl != null) { AppUtils.installApp(Config.downLoadPath + downloadUrl.substring(downloadUrl.lastIndexOf("/") + 1)) } - findKey(downloadUrl) { CallerDevaToolsUpgradeListenerManager.invokeUpgradeFinish(it) } diff --git a/core/function-impl/mogo-core-function-hmi/build.gradle b/core/function-impl/mogo-core-function-hmi/build.gradle index 9f40e36205..ccccc40f85 100644 --- a/core/function-impl/mogo-core-function-hmi/build.gradle +++ b/core/function-impl/mogo-core-function-hmi/build.gradle @@ -139,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/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 4bdb0a6522..7dc0a07cd8 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,7 +9,6 @@ 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.WindowManager @@ -20,15 +19,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,6 +44,7 @@ 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 @@ -46,7 +53,9 @@ 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 @@ -54,6 +63,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 @@ -81,13 +91,13 @@ import com.mogo.eagle.core.utilcode.reminder.* import com.mogo.eagle.core.utilcode.reminder.api.* 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.SoundUtils -import com.mogo.eagle.core.utilcode.util.ThreadUtils -import com.mogo.eagle.core.utilcode.util.TimeUtils +import com.mogo.eagle.core.utilcode.util.* import com.mogo.eagle.core.utilcode.util.TimeUtils.millis2String -import com.mogo.eagle.core.utilcode.util.ToastUtils +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.* @@ -104,12 +114,12 @@ 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 @@ -145,11 +155,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 @@ -183,8 +194,8 @@ import java.util.* } /**ivCameraIcon?.setOnLongClickListener { - activity?.let { it1 -> CarcorderPreviewView.show(it1) } - true + activity?.let { it1 -> CarcorderPreviewView.show(it1) } + true }*/ ivToolsIcon?.setOnClickListener { @@ -198,7 +209,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) @@ -221,45 +275,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 } } //处于非美化模式下弹窗;是地图数据采集任务时即type=2时,不弹窗 - if (!FunctionBuildConfig.isDemoMode && (recordPanel.stat == 100 || recordPanel.stat == 101) && recordPanel.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 ?: "" + ) } } @@ -303,15 +374,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 { @@ -320,7 +395,7 @@ import java.util.* } ipcReportWindow?.showFloatWindow() } - ipcReportWindow?.refreshData(errorReportList,warningReportList,reportLevel) + ipcReportWindow?.refreshData(errorReportList, warningReportList, reportLevel) } } @@ -328,19 +403,6 @@ import java.util.* mViewNotificationProvider = provider } - override fun showVideoDialog(infList: List) { - context?.let { - if (roadVideoDialog == null) { - roadVideoDialog = RoadVideoDialog(it) - } - roadVideoDialog?.show(infList) - } - } - - override fun changeBusOperationStatus(isOut: Boolean) { - busOperationStatus?.changerOperationStatus(isOut) - } - override fun setBusOperationView(view: IOchBusView) { busOperationStatus = view busOperationStatus?.showBusOperation() @@ -387,41 +449,41 @@ import java.util.* }) } 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() } @@ -466,7 +528,7 @@ import java.util.* ivAiCollectTools.visibility = View.VISIBLE CallerDevaToolsManager.initBadCase(ivBadCaseTools) CallerDevaToolsManager.initAiCollect(ivAiCollectTools) - }else{ + } else { ivBadCaseTools.visibility = View.GONE ivAiCollectTools.visibility = View.GONE } @@ -527,9 +589,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 @@ -538,64 +598,63 @@ 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() } } } @@ -610,15 +669,16 @@ 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 ) { - val playTTS = playTts && !AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode) + val playTTS = + playTts && !AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode) activity?.let { val warningContent = alertContent ?: EventTypeEnum.getWarningContent(v2xType) @@ -629,70 +689,87 @@ import java.util.* 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) + } + }) } } @@ -715,7 +792,7 @@ import java.util.* AIAssist.getInstance(ctx).speakTTSVoice(text, voiceCallback) } catch (t: Throwable) { it.resumeWith(Result.success(Unit)) - Logger.e(TAG, t.message) + CallerLogger.d("$M_HMI$TAG", t.message) } } @@ -727,7 +804,7 @@ import java.util.* activity?.let { WarningFloat.dismiss(tag) } - Log.d("$M_HMI$TAG", "--- disableWarningV2X ---") + CallerLogger.d("$M_HMI$TAG", "--- disableWarningV2X ---") lifecycleScope.launch { showingV2XTip?.takeIf { it.isShowing() }?.also { it.hide() } } @@ -739,8 +816,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 { @@ -814,7 +891,7 @@ import java.util.* * @see WarningDirectionEnum */ override fun showWarning(direction: WarningDirectionEnum) { - Log.d(TAG,"showWarning====") + CallerLogger.d(TAG, "showWarning====") flV2XWarningView?.showWarning(direction) flicker(flV2XWarningView) } @@ -824,10 +901,10 @@ import java.util.* */ fun flicker(view: View) { val alphaAnimation = AlphaAnimation(0f, 0.88f) - alphaAnimation.setDuration(600) - alphaAnimation.setInterpolator(LinearInterpolator()) - alphaAnimation.setRepeatCount(Animation.INFINITE) - alphaAnimation.setRepeatMode(Animation.REVERSE) + alphaAnimation.duration = 600 + alphaAnimation.interpolator = LinearInterpolator() + alphaAnimation.repeatCount = Animation.INFINITE + alphaAnimation.repeatMode = Animation.REVERSE view.startAnimation(alphaAnimation) } @@ -863,42 +940,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() } } } @@ -913,41 +990,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() } } } @@ -1034,6 +1111,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) { @@ -1062,40 +1150,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() } @@ -1126,9 +1214,9 @@ import java.util.* } } - private var isLeftLight :Boolean = false - private var isRightLight :Boolean = false - private var isDisappare :Boolean = false + private var isLeftLight: Boolean = false + private var isRightLight: Boolean = false + private var isDisappare: Boolean = false /** * 显示转向灯效果 if (HmiBuildConfig.isShowBadCaseView) { @@ -1215,11 +1303,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) } /** @@ -1233,13 +1328,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() @@ -1258,10 +1354,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) } @@ -1282,22 +1378,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 + ) + } + } } } } @@ -1308,12 +1440,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 index 1d756041cf..539658cf16 100644 --- 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 @@ -7,6 +7,8 @@ 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 @@ -19,6 +21,7 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotPlanningAction 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 @@ -67,6 +70,7 @@ class PncActionsView @JvmOverloads constructor( } } + @BizConfig(FOUNDATION, "", BIZ_PNC_ACTIONS) override fun pncActions(planningActionMsg: MessagePad.PlanningActionMsg) { mAutoPilotStatusInfo?.let { if (it.state == STATUS_AUTOPILOT_RUNNING) { 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 99488de39b..e9af260e2d 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 @@ -22,12 +22,17 @@ import chassis.Chassis import chassis.VehicleStateOuterClass 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 @@ -37,10 +42,13 @@ 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.autopilot.IMoGoAutopilotStatusListener.Companion +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 @@ -51,12 +59,10 @@ 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.utilcode.kotlin.onClick import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.mogo.logger.LogLevel @@ -94,8 +100,8 @@ class DebugSettingView @JvmOverloads constructor( ) : ConstraintLayout(context, attrs, defStyleAttr), IMoGoObuStatusListener, IMoGoAutopilotStatusListener, IMoGoAutopilotCarStateListener, IMoGoMapLocationListener, IMoGoAutopilotIdentifyListener, - IMoGoAutopilotPlanningListener, IMoGoAutopilotCarConfigListener, - IMoGoAutopilotVehicleStateListener { + IMoGoAutopilotPlanningListener, + IMoGoAutopilotVehicleStateListener, IMoGoDevaToolsFuncConfigListener { private val TAG = "DebugSettingView" @@ -181,15 +187,21 @@ 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, + this + ) + if (logInfoView != null) { logInfoView!!.onEnterForeground() } @@ -210,16 +222,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(this) + if (logInfoView != null) { logInfoView!!.onEnterBackground() } @@ -562,20 +575,19 @@ class DebugSettingView @JvmOverloads constructor( // 演示模式 tbIsDemoMode.setOnCheckedChangeListener { _, isChecked -> 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)){ + if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { tbIsDemoMode.visibility = View.GONE } @@ -620,45 +632,28 @@ 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.rbGpsProviderRTK -> { - FunctionBuildConfig.gpsProvider = 1 - } - R.id.rbGpsProviderOBU -> { - FunctionBuildConfig.gpsProvider = 2 - } + 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 - } + 0 -> R.id.trackerProviderOrigin + 1 -> R.id.trackerProviderObu else -> R.id.trackerProviderOrigin } ) @@ -667,14 +662,34 @@ class DebugSettingView @JvmOverloads constructor( R.id.trackerProviderOrigin -> { FunctionBuildConfig.debugTrackerProvider = 0 // update tracker provider view + trackerIPCProvider.visibility = View.VISIBLE } 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 @@ -811,20 +826,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 } //设置工控机连接状态 @@ -834,7 +850,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) @@ -886,7 +903,7 @@ class DebugSettingView @JvmOverloads constructor( FunctionBuildConfig.isReportWarning = isChecked } //异常上报开关只在司机端展示 - if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)){ + if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { tbReportWarning.visibility = GONE } @@ -897,7 +914,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 } @@ -1105,7 +1122,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) { @@ -1587,50 +1607,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() - /** * 设备绑定关系 */ @@ -1826,16 +1802,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) { @@ -1881,6 +1855,48 @@ class DebugSettingView @JvmOverloads constructor( } } + override fun updateBizData(type: String, state: Boolean, lock: Boolean, data: String?) { + when (type) { + BIZ_BEAUTY_MODE -> { + 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 -> { + 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 -> { + if(lock){ + tbReportWarning.background = resources.getDrawable(R.drawable.radio_button_lock_background) + }else{ + tbReportWarning.background = null + } + } + BIZ_BAG_RECORD -> { + if (lock) { + btnRecordBag.background = resources.getDrawable(R.drawable.radio_button_lock_background) + } else { + btnRecordBag.requestFocus() + btnRecordBag.background = null + } + } + BIZ_FULL_LOG -> { + if (lock) { + tbLogCatch.background = resources.getDrawable(R.drawable.radio_button_lock_background) + } else { + tbLogCatch.requestFocus() + tbLogCatch.background = null + } + } + } + } + override fun onAutopilotCarStateData(gnssInfo: MessagePad.GnssInfo?) { mGnssInfo = gnssInfo //实时加速度列表 @@ -1946,18 +1962,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//工控机协议版本 - } - - } - /** * 工控机异常回调 */ @@ -2003,7 +2007,7 @@ class DebugSettingView @JvmOverloads constructor( } } - override fun onLocationChanged(location: MogoLocation?, from: Int) { + override fun onLocationChanged(location: MogoLocation?, from: Int, isGps: Boolean) { } /** @@ -2085,7 +2089,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) } } @@ -2143,4 +2148,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/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 2dc8c466e2..26c294afd6 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 @@ -14,7 +14,6 @@ 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.temp.EventBusOperation 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 @@ -160,14 +159,15 @@ class AutoPilotAndCheckView @JvmOverloads constructor( actvLoginout.onClick { EventBus.getDefault().post(EventLogout()) } + actvLoginout.visibility = View.VISIBLE + CallerHmiManager.setBusOperationView(toolBusOperationView) when (DebugConfig.getProductFlavor()) { "fPadLenovoOchTaxi" -> { - actvLoginout.visibility = View.VISIBLE + //出租车司机 } "fPadLenovoOchBus" ->{ - CallerHmiManager.setBusOperationView(toolBusOperationView) - EventBus.getDefault().post(EventBusOperation(0)) + //小巴车司机 } else -> { @@ -229,9 +229,6 @@ class AutoPilotAndCheckView @JvmOverloads constructor( 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//工控机协议版本 } } } 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 index bfc83e98b9..37709763dd 100644 --- 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 @@ -4,9 +4,10 @@ import android.content.Context import android.util.AttributeSet import android.view.LayoutInflater import android.view.View -import com.mogo.eagle.core.data.temp.EventBusOperation 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 @@ -18,11 +19,13 @@ class BusOperationView @JvmOverloads constructor( context: Context?, attrs: AttributeSet? = null, defStyleAttr: Int = 0) - : IOchBusView(context, attrs, defStyleAttr), View.OnClickListener { + : IOchBusView(context, attrs, defStyleAttr) { init { LayoutInflater.from(context).inflate(R.layout.view_och_bus_operation,this,true) - ochBusOperationStatus.setOnClickListener(this) + context?.let { + actvAccountPhone.text = SharedPrefs.getInstance(it).getString("account","") + } } override fun showBusOperation() { @@ -30,14 +33,29 @@ class BusOperationView @JvmOverloads constructor( } override fun changerOperationStatus(isOut: Boolean) { - if (isOut){ - ochBusOperationStatusCTV.text = "收车" - }else{ - ochBusOperationStatusCTV.text = "出车" + + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + context?.let { + actvAccountPhone.text = phoneMask(SharedPrefs.getInstance(it).getString("och_account","")) } } - override fun onClick(v: View?) { - EventBus.getDefault().post(EventBusOperation(1)) + + /** + * 用户电话号码的打码隐藏加星号加* + * 一般都是中间四位 + * @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/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/PerspectiveSwitchView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/PerspectiveSwitchView.kt index e2f86e8bb8..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 @@ -6,10 +6,9 @@ import android.view.* import android.widget.* import com.mogo.commons.* import com.mogo.eagle.core.function.hmi.R -import com.mogo.eagle.core.function.hmi.R.drawable +import com.mogo.eagle.core.function.v2x.events.scenario.scene.airoad.* import com.mogo.map.* import com.mogo.map.uicontroller.* -import com.mogo.map.uicontroller.VisualAngleMode.MODE_MEDIUM_SIGHT import com.mogo.module.common.constants.* import kotlinx.android.synthetic.main.view_perspective_switch.view.* @@ -33,18 +32,18 @@ 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() +// MogoMarkerManager.getInstance(AbsMogoApplication.getApp()) +// .visibleAllMarkers() MogoMapUIController.getInstance().changeMapVisualAngle(VisualAngleMode.MODE_MEDIUM_SIGHT, null) textSwitch.setText(R.string.module_map_model_normal) } 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/SteeringWheelView.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SteeringWheelView.java index 7fe1bbbc7c..fbf8c38268 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; @@ -55,12 +54,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 { @@ -95,12 +92,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() { @@ -128,7 +123,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 @@ -152,7 +146,7 @@ public class SteeringWheelView extends ConstraintLayout { } } } else { - Log.d(TAG, "autopilotIV=null"); + CallerLogger.INSTANCE.d(TAG, "autopilotIV=null"); } } }); @@ -197,7 +191,6 @@ public class SteeringWheelView extends ConstraintLayout { */ @Override public void onAutopilotLightSwitchData(@org.jetbrains.annotations.Nullable Chassis.LightSwitch lightSwitch) { - Log.d(TAG, "车辆转向灯:" + lightSwitch.toString()); } /** @@ -206,7 +199,6 @@ public class SteeringWheelView extends ConstraintLayout { */ @Override public void onAutopilotBrakeLightData(boolean brakeLight) { - Log.d(TAG, "刹车灯:" + String.valueOf(brakeLight)); } /** @@ -224,7 +216,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; } @@ -232,7 +223,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); @@ -242,7 +232,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) { @@ -265,7 +255,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); } @@ -293,7 +283,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/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/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 ba48df44ff..a3526435ed 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 @@ -26,8 +26,8 @@ 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.cloud.commons.BuildConfig; 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; @@ -217,7 +217,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) @@ -283,8 +283,10 @@ public class MainActivity extends MvpActivity implement // 启动一些基本的服务:定位等 startBaseService(); - // 启动Native内存泄漏监测 - startLeakMonitor(); + if (DebugConfig.isDebug()) { + // 启动Native内存泄漏监测 + startLeakMonitor(); + } } /** @@ -304,7 +306,11 @@ public class MainActivity extends MvpActivity implement .setLoopInterval(50000) .setMonitorThreshold(16) .setNativeHeapAllocatedThreshold(0) - .setEnableLocalSymbolic(true) + .setSelectedSoList(new String[]{"libhdmap", "libmap", + "libAMapSDK_NAVI_v8_0_1", "libZegoExpressEngine", + "libcntts" + }) + .setEnableLocalSymbolic(DebugConfig.isDebug()) .setLeakListener(leaks -> { StringBuilder stringBuilder = new StringBuilder(); if (!leaks.isEmpty()) { 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 57a75e5d82..f2bf122979 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 @@ -26,6 +26,7 @@ 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.setting.CallerSkinModeListenerManager; import com.mogo.eagle.core.function.hmi.R; import com.mogo.eagle.core.function.main.moujie.BluetoothMonitorReceiver; @@ -218,7 +219,9 @@ public class MainLauncherActivity extends MainActivity implements IMogoIntentLis if (currentTime - oldTime > 6) { SharedPrefsMgr.getInstance(getContext()).putLong("old_time_up", System.currentTimeMillis() / 1000); // ToastUtils.showShort("长按 ↑↑↑ 开启自动驾驶"); - CallerAutoPilotManager.INSTANCE.setControlAutopilotCarAuto(true); +// CallerAutoPilotManager.INSTANCE.setControlAutopilotCarAuto(true); + CallerAutoPilotManager.INSTANCE.startAutoPilot(CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getAutopilotControlParameters()); + } return true; @@ -337,7 +340,8 @@ public class MainLauncherActivity extends MainActivity implements IMogoIntentLis } else if (event.getAction() == KeyEvent.ACTION_UP) { if (numberE == 1) { // ToastUtils.showShort("方块 单击E 开启自动驾驶 "); - CallerAutoPilotManager.INSTANCE.setControlAutopilotCarAuto(true); +// CallerAutoPilotManager.INSTANCE.setControlAutopilotCarAuto(true); + CallerAutoPilotManager.INSTANCE.startAutoPilot(CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getAutopilotControlParameters()); } numberE = 0; isLongPressE = false; 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 abe6e87ea1..f99afd3f39 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,9 @@ import android.os.Process; import com.bytedance.boost_multidex.BoostMultiDex; import com.elegant.utils.UiThreadHandler; -import com.kwai.koom.base.DefaultInitTask; import com.mogo.cloud.socket.SocketBuildConfig; import com.mogo.commons.AbsMogoApplication; +import com.mogo.commons.debug.DebugConfig; import com.mogo.eagle.core.data.config.FunctionBuildConfig; import com.mogo.eagle.core.data.constants.MoGoConfig; import com.mogo.eagle.core.data.constants.MogoServicePaths; @@ -57,8 +57,9 @@ public abstract class MainMoGoApplication extends AbsMogoApplication { initLogConfig(); initTipToast(); initModules(); - - initKoom(); + if (DebugConfig.isDebug()) { + initKoom(); + } //查询是否有版本的更新 queryAppUpgrade(); checkMonitorDb(); @@ -76,7 +77,7 @@ public abstract class MainMoGoApplication extends AbsMogoApplication { public void run() { CallerBindingcarManager.getBindingcarProvider().queryAppUpgrade(); } - },5000); + },9000); } private void checkMonitorDb() { @@ -92,7 +93,7 @@ public abstract class MainMoGoApplication extends AbsMogoApplication { } private void initKoom() { - DefaultInitTask.INSTANCE.init(this); + KoomInitTask.INSTANCE.init(this); } /** @@ -114,7 +115,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/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-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/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/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 da8b0411b0..042c7ad3ce 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 @@ -48,6 +48,16 @@ app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toTopOf="parent" /> + + + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" /> + 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 88f719956b..fb2eaba745 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,34 @@ android:layout_width="match_parent" android:layout_height="wrap_content"> - + + + android:orientation="horizontal" + app:layout_constraintEnd_toEndOf="parent" + 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" /> @@ -280,29 +293,22 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/viewSystemVersion" /> - - - + android:visibility="gone" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/systemVersionView" + tools:visibility="visible" /> @@ -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" /> + android:textSize="@dimen/dp_24" /> + android:textSize="@dimen/dp_24" /> @@ -273,10 +269,9 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="@dimen/dp_10" - android:text="重启IPC节点" - android:textSize="@dimen/dp_24" android:background="@drawable/radio_button_normal_background_right" - /> + android:text="重启IPC节点" + android:textSize="@dimen/dp_24" /> + android:textSize="14sp" /> - + android:text="复制" + android:textColor="#0000FF" + android:textSize="14sp" /> @@ -624,13 +616,12 @@ + android:visibility="gone" /> + app:layout_constraintTop_toBottomOf="@id/tvIpcInfo" />