diff --git a/foudations/mogo-commons/src/main/java/com/mogo/commons/voice/IMogoVoiceCmdCallBack.java b/foudations/mogo-commons/src/main/java/com/mogo/commons/voice/IMogoVoiceCmdCallBack.java index 58365cd886..eb26dc64f6 100644 --- a/foudations/mogo-commons/src/main/java/com/mogo/commons/voice/IMogoVoiceCmdCallBack.java +++ b/foudations/mogo-commons/src/main/java/com/mogo/commons/voice/IMogoVoiceCmdCallBack.java @@ -34,33 +34,33 @@ public interface IMogoVoiceCmdCallBack { * * @param cmd */ - void onCmdSelected( String cmd ); + default void onCmdSelected( String cmd ){} /** * 语音播报临时免唤醒“确定”命令 * * @param speakText 播报内容 */ - void onCmdAction( String speakText ); + default void onCmdAction( String speakText ){} /** * 语音播报临时免唤醒“取消”命令 * * @param speakText 播报内容 */ - void onCmdCancel( String speakText ); + default void onCmdCancel( String speakText ){} /** * 语音播报完毕 * * @param speakText 播报内容 */ - void onSpeakEnd( String speakText ); + default void onSpeakEnd( String speakText ){} /** * 语音播报完临时命令选择超时 * * @param speakText 播报内容 */ - void onSpeakSelectTimeOut( String speakText ); + default void onSpeakSelectTimeOut( String speakText ){} } \ No newline at end of file diff --git a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/CalculatePathItem.java b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/CalculatePathItem.java index ec40a2b4fb..8a705ce576 100644 --- a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/CalculatePathItem.java +++ b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/CalculatePathItem.java @@ -55,7 +55,7 @@ public class CalculatePathItem { return mPath.getLabels(); } - public String getTime() { + public String getFormattedTime() { if ( mTimeBuilder == null ) { final int time = mPath.getAllTime(); mTimeBuilder = new StringBuilder(); @@ -64,6 +64,14 @@ public class CalculatePathItem { return mTimeBuilder.toString(); } + public int getTime(){ + return mPath.getAllTime(); + } + + public int getDistance(){ + return mPath.getAllLength(); + } + private StringBuilder mTimeBuilder; private void fillFormatTime( int seconds, StringBuilder builder ) { @@ -83,7 +91,7 @@ public class CalculatePathItem { private String mDistanceCacheStr = ""; - public String getDistance() { + public String getFormattedDistance() { if ( TextUtils.isEmpty( mDistanceCacheStr ) ) { int distance = mPath.getAllLength(); if ( distance == -1 ) { diff --git a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/NaviOverlayHelper.java b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/NaviOverlayHelper.java index 9448f2b296..c057446979 100644 --- a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/NaviOverlayHelper.java +++ b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/NaviOverlayHelper.java @@ -13,7 +13,6 @@ import com.amap.api.maps.model.LatLng; import com.amap.api.maps.model.LatLngBounds; import com.amap.api.maps.model.Marker; import com.amap.api.maps.model.MarkerOptions; -import com.amap.api.maps.model.MarkerOptionsCreator; import com.amap.api.maps.model.Polyline; import com.amap.api.navi.AMapNavi; import com.amap.api.navi.model.AMapNaviLocation; @@ -21,15 +20,12 @@ import com.amap.api.navi.model.AMapNaviPath; import com.amap.api.navi.model.NaviInfo; import com.amap.api.navi.model.NaviLatLng; import com.mogo.map.MogoLatLng; -import com.mogo.map.MogoMap; import com.mogo.map.impl.amap.AMapWrapper; import com.mogo.map.impl.amap.R; import com.mogo.map.impl.amap.overlay.RouteOverLayWrapper; -import com.mogo.map.marker.MogoMarkerOptions; import com.mogo.map.marker.MogoMarkersHandler; import com.mogo.map.navi.MogoCalculatePath; import com.mogo.map.navi.OnCalculatePathItemClickInteraction; -import com.mogo.utils.UiThreadHandler; import com.mogo.utils.WindowUtils; import com.mogo.utils.logger.Logger; @@ -394,10 +390,12 @@ public class NaviOverlayHelper implements OnCalculatePathItemClickInteraction { if ( mCalculatePathItems != null && !mCalculatePathItems.isEmpty() ) { for ( CalculatePathItem calculatePathItem : mCalculatePathItems ) { MogoCalculatePath path = new MogoCalculatePath(); - path.setDistance( calculatePathItem.getDistance() ); + path.setFormattedDistance( calculatePathItem.getFormattedDistance() ); path.setPathId( calculatePathItem.getId() ); path.setStrategyName( calculatePathItem.getStrategyName() ); + path.setFormattedTime( calculatePathItem.getFormattedTime() ); path.setTime( calculatePathItem.getTime() ); + path.setDistance( calculatePathItem.getDistance() ); List< NaviLatLng > coordList = calculatePathItem.getPath().getCoordList(); ArrayList< MogoLatLng > mogoLatLngs = new ArrayList<>(); for ( NaviLatLng latlng : coordList diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/marker/MogoMarkersHandler.java b/libraries/mogo-map-api/src/main/java/com/mogo/map/marker/MogoMarkersHandler.java index 07919c3124..51425cae06 100644 --- a/libraries/mogo-map-api/src/main/java/com/mogo/map/marker/MogoMarkersHandler.java +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/marker/MogoMarkersHandler.java @@ -86,7 +86,7 @@ public class MogoMarkersHandler implements IMogoMarkerClickListener, IMogoMarker if ( marker == null ) { return; } - if ( !mServicesMarkers.containsKey( tag ) ) { + if ( mServicesMarkers.get( tag ) == null ) { mServicesMarkers.put( tag, new ArrayList< IMogoMarker >() ); } mServicesMarkers.get( tag ).add( marker ); @@ -96,7 +96,7 @@ public class MogoMarkersHandler implements IMogoMarkerClickListener, IMogoMarker if ( markers == null || markers.isEmpty() ) { return; } - if ( !mServicesMarkers.containsKey( tag ) ) { + if ( mServicesMarkers.get( tag ) == null ) { mServicesMarkers.put( tag, new ArrayList< IMogoMarker >() ); } mServicesMarkers.get( tag ).addAll( markers ); diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/navi/IMogoNaviListener.java b/libraries/mogo-map-api/src/main/java/com/mogo/map/navi/IMogoNaviListener.java index abe7a663b8..ff989a920f 100644 --- a/libraries/mogo-map-api/src/main/java/com/mogo/map/navi/IMogoNaviListener.java +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/navi/IMogoNaviListener.java @@ -11,44 +11,44 @@ public interface IMogoNaviListener { /** * 导航初始化失败 */ - void onInitNaviFailure(); + default void onInitNaviFailure(){} /** * 导航初始化成功 */ - void onInitNaviSuccess(); + default void onInitNaviSuccess(){} /** * 导航引导信息 * * @param naviinfo */ - void onNaviInfoUpdate( MogoNaviInfo naviinfo ); + default void onNaviInfoUpdate( MogoNaviInfo naviinfo ){} /** * 导航开始回调 */ - void onStartNavi(); + default void onStartNavi(){} /** * 导航停止:包括到达目的地和主动停止导航 */ - void onStopNavi(); + default void onStopNavi(){} /** * 路径规划成功 */ - void onCalculateSuccess(); + default void onCalculateSuccess(){} /** * 路径规划失败 */ - void onoCalculateFailed(); + default void onoCalculateFailed(){} /** * 巡航信息发生改变 * Deprecated, use {@link IMogoAimlessModeListener#onUpdateTraffic2(MogoTraffic)} instead. */ @Deprecated - void onUpdateTraffic( MogoTraffic traffic ); + default void onUpdateTraffic( MogoTraffic traffic ){} } diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/navi/IMogoNaviListener2.java b/libraries/mogo-map-api/src/main/java/com/mogo/map/navi/IMogoNaviListener2.java index 831d5d77a0..c0d261c1d6 100644 --- a/libraries/mogo-map-api/src/main/java/com/mogo/map/navi/IMogoNaviListener2.java +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/navi/IMogoNaviListener2.java @@ -11,10 +11,10 @@ public interface IMogoNaviListener2 extends IMogoNaviListener { /** * 实际导航结束 */ - void onArriveDestination(); + default void onArriveDestination() { } /** * 模拟导航结束 */ - void onEndEmulatorNavi(); + default void onEndEmulatorNavi(){} } diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/navi/MogoCalculatePath.java b/libraries/mogo-map-api/src/main/java/com/mogo/map/navi/MogoCalculatePath.java index 394772abaa..ec44cd59cb 100644 --- a/libraries/mogo-map-api/src/main/java/com/mogo/map/navi/MogoCalculatePath.java +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/navi/MogoCalculatePath.java @@ -20,12 +20,14 @@ public class MogoCalculatePath { /** * 时间 */ - private String mTime; + private String mFormattedTime; + private int mTime; /** * 距离 */ - private String mDistance; + private String mFormattedDistance; + private int mDistance; /** * 红绿灯个数 @@ -69,20 +71,20 @@ public class MogoCalculatePath { this.mStrategyName = mStrategyName; } - public String getTime() { - return mTime; + public String getFormattedTime() { + return mFormattedTime; } - public void setTime( String mTime ) { - this.mTime = mTime; + public void setFormattedTime( String mTime ) { + this.mFormattedTime = mTime; } - public String getDistance() { - return mDistance; + public String getFormattedDistance() { + return mFormattedDistance; } - public void setDistance( String mDistance ) { - this.mDistance = mDistance; + public void setFormattedDistance( String mDistance ) { + this.mFormattedDistance = mDistance; } public int getTrafficLights() { @@ -125,4 +127,22 @@ public class MogoCalculatePath { public void setPathId( int mPathId ) { this.mPathId = mPathId; } + + public int getTime() { + return mTime; + } + + public MogoCalculatePath setTime( int time ) { + this.mTime = time; + return this; + } + + public int getDistance() { + return mDistance; + } + + public MogoCalculatePath setDistance( int distance ) { + this.mDistance = distance; + return this; + } } diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/MogoMarkerManager.java b/libraries/mogo-map/src/main/java/com/mogo/map/MogoMarkerManager.java index bb3aa752d9..33d7bfff49 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/MogoMarkerManager.java +++ b/libraries/mogo-map/src/main/java/com/mogo/map/MogoMarkerManager.java @@ -3,7 +3,6 @@ package com.mogo.map; import android.content.Context; import android.util.Log; -import com.mogo.map.impl.amap.InterceptorHandler; import com.mogo.map.impl.amap.overlay.RouteOverlayHelper; import com.mogo.map.marker.IMogoMarker; import com.mogo.map.marker.IMogoMarkerManager; @@ -54,6 +53,7 @@ public class MogoMarkerManager implements IMogoMarkerManager { try { return MogoMap.getInstance().getMogoMap().addMarker( tag, options ); } catch ( Exception e ) { + Logger.e( TAG, Log.getStackTraceString( e ) ); return null; } } diff --git a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppNavigatorFragment.java b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppNavigatorFragment.java index 3092323b9d..d5b4006ee4 100644 --- a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppNavigatorFragment.java +++ b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppNavigatorFragment.java @@ -57,7 +57,7 @@ public class AppNavigatorFragment extends MvpFragment { // openSearchPanel(); // trackNavigatorClickEvent( 1 ); @@ -222,44 +222,44 @@ public class AppNavigatorFragment extends MvpFragment= 3) { - index = index - CARD_SIZE; - } - //RecyclerView 的特性,如果是否在屏幕内 - //if (index < 0) { - // index -= 2; - //} - - Logger.d(TAG, "position--" - + position - + "index--" - + index - + "scroll-->" - + scroller.getCurrentItem() - + index); - - //scroller.setPendingScroll(getResources().getDimensionPixelSize(R.dimen.dp_137)*index); - //layoutManager.scrollToPositionWithOffset(scroller.getCurrentItem() + index,0); - //scroller.smoothScrollBy(getResources().getDimensionPixelSize(R.dimen.dp_137)*index,0); - - if (Math.abs(index) == 1) { - scroller.smoothScrollBy(getResources().getDimensionPixelSize(R.dimen.dp_137) * index, - 0, null, 10); - } else { - layoutManager.startSmoothPendingScroll(layoutManager.getCurrentPosition() + index); - } +// DiscreteScrollLayoutManager layoutManager = +// (DiscreteScrollLayoutManager) scroller.getLayoutManager(); +// +// int currentPosition = (scroller.getCurrentItem() - 2) % CARD_SIZE; +// +// int index = position - currentPosition; +// +// if (index == 0) { +// return; +// } +// if (index <= -3) { +// index += CARD_SIZE; +// } else if (index >= 3) { +// index = index - CARD_SIZE; +// } +// //RecyclerView 的特性,如果是否在屏幕内 +// //if (index < 0) { +// // index -= 2; +// //} +// +// Logger.d(TAG, "position--" +// + position +// + "index--" +// + index +// + "scroll-->" +// + scroller.getCurrentItem() +// + index); +// +// //scroller.setPendingScroll(getResources().getDimensionPixelSize(R.dimen.dp_137)*index); +// //layoutManager.scrollToPositionWithOffset(scroller.getCurrentItem() + index,0); +// //scroller.smoothScrollBy(getResources().getDimensionPixelSize(R.dimen.dp_137)*index,0); +// +// if (Math.abs(index) == 1) { +// scroller.smoothScrollBy(getResources().getDimensionPixelSize(R.dimen.dp_137) * index, +// 0, null, 10); +// } else { +// layoutManager.startSmoothPendingScroll(layoutManager.getCurrentPosition() + index); +// } //layoutManager.smoothScrollToPosition(scroller.getCurrentItem() + index); //currentPosition = position; } diff --git a/modules/mogo-module-apps/src/main/res/layout/module_apps_fragment_apps_navigator.xml b/modules/mogo-module-apps/src/main/res/layout/module_apps_fragment_apps_navigator.xml index 35a825c7c5..1a0b739e7f 100644 --- a/modules/mogo-module-apps/src/main/res/layout/module_apps_fragment_apps_navigator.xml +++ b/modules/mogo-module-apps/src/main/res/layout/module_apps_fragment_apps_navigator.xml @@ -10,6 +10,7 @@ impleme private View mHeader; private View mCards; - private View mCardsBkg; private View mApps; private View mEntrance; private FrameLayout mFloatingLayout; private FrameLayout mCoverUpLayout; - private FrameLayout mCardCoverUpBottomLayout; private View mLeftShadowFrame; private View mTopShadowFrame; @@ -180,14 +178,12 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme mHeader = findViewById( R.id.module_main_id_header_fragment_container ); mCards = findViewById( R.id.module_main_id_cards_container ); - mCardsBkg = findViewById( R.id.module_main_id_cards_bkg ); mApps = findViewById( R.id.module_main_id_apps_fragment_container ); mEntrance = findViewById( R.id.module_main_id_entrance_fragment_container ); mFloatingLayout = findViewById( R.id.module_main_id_floating_view ); mLeftShadowFrame = findViewById( R.id.module_main_id_map_left_shadow_frame ); mTopShadowFrame = findViewById( R.id.module_main_id_map_top_shadow_frame ); mCoverUpLayout = findViewById( R.id.module_main_id_cover_up ); - mCardCoverUpBottomLayout = findViewById( R.id.module_main_id_card_cover_up_bottom ); // 避免事件穿透导致地图被滑动 mLeftShadowFrame.setOnClickListener( view -> { @@ -204,8 +200,6 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme mFloatingLayout.setVisibility( View.GONE ); mLeftShadowFrame.setVisibility( View.GONE ); mTopShadowFrame.setVisibility( View.GONE ); - mCardsBkg.setVisibility( View.GONE ); - mCardCoverUpBottomLayout.setVisibility( View.GONE ); } // 显示布局 @@ -217,8 +211,6 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme mFloatingLayout.setVisibility( View.VISIBLE ); mLeftShadowFrame.setVisibility( View.VISIBLE ); mTopShadowFrame.setVisibility( View.VISIBLE ); - mCardsBkg.setVisibility( View.VISIBLE ); - mCardCoverUpBottomLayout.setVisibility( View.VISIBLE ); } @Override @@ -305,23 +297,21 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme // 默认触发第一个卡片 mOnPageChangeListener.onPageSelected( 0 ); } - mCardCoverUpBottomLayout.setVisibility( View.VISIBLE ); } @Override public void hideCoverUpLayout() { mCoverUpLayout.setVisibility( View.GONE ); - mCardsBkg.setVisibility( View.VISIBLE ); } @Override public void loadCardModules() { List< IMogoModuleProvider > providers = mMogoModuleHandler.loadCardsModule(); - mCardModulesAdapter = new CardModulesAdapter( this, providers ); - mCardsContainer.setOffscreenPageLimit( providers.size() ); - mCardsContainer.setPageTransformer( true, mTransformer ); - mCardsContainer.setAdapter( mCardModulesAdapter ); +// mCardModulesAdapter = new CardModulesAdapter( this, providers ); +// mCardsContainer.setOffscreenPageLimit( providers.size() ); +// mCardsContainer.setPageTransformer( true, mTransformer ); +// mCardsContainer.setAdapter( mCardModulesAdapter ); } @NonNull diff --git a/modules/mogo-module-main/src/main/res/drawable-ldpi/module_main_card_cover_up_bottom.png b/modules/mogo-module-main/src/main/res/drawable-ldpi/module_main_card_cover_up_bottom.png deleted file mode 100644 index 84957fe291..0000000000 Binary files a/modules/mogo-module-main/src/main/res/drawable-ldpi/module_main_card_cover_up_bottom.png and /dev/null differ diff --git a/modules/mogo-module-main/src/main/res/drawable-xhdpi/module_main_card_cover_up_bottom.png b/modules/mogo-module-main/src/main/res/drawable-xhdpi/module_main_card_cover_up_bottom.png deleted file mode 100644 index e15483dbfb..0000000000 Binary files a/modules/mogo-module-main/src/main/res/drawable-xhdpi/module_main_card_cover_up_bottom.png and /dev/null differ diff --git a/modules/mogo-module-main/src/main/res/layout/module_main_activity_main.xml b/modules/mogo-module-main/src/main/res/layout/module_main_activity_main.xml index 6be848e190..603a0ecaed 100644 --- a/modules/mogo-module-main/src/main/res/layout/module_main_activity_main.xml +++ b/modules/mogo-module-main/src/main/res/layout/module_main_activity_main.xml @@ -37,12 +37,6 @@ android:layout_marginLeft="@dimen/module_main_card_container_marginLeft" android:layout_marginTop="@dimen/module_main_card_container_marginTop"> - - - diff --git a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/constants/AMapConstants.java b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/constants/AMapConstants.java index 738d2ad4bc..a3a709ce12 100644 --- a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/constants/AMapConstants.java +++ b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/constants/AMapConstants.java @@ -47,4 +47,6 @@ public class AMapConstants { */ public static final String COMMAND_START_NAVI = "com.ileja.navi.route.confirm"; + public static final String COMMAND_CHOOSE_PATH = "com.zhidao.route.plan"; + } diff --git a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/constants/DataConstants.java b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/constants/DataConstants.java index 029bbdc252..9bc52fdf63 100644 --- a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/constants/DataConstants.java +++ b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/constants/DataConstants.java @@ -2,6 +2,9 @@ package com.mogo.module.navi.constants; import android.net.Uri; +import java.util.HashMap; +import java.util.Map; + /** * @author zyz * @since 2019-10-02 @@ -42,4 +45,32 @@ public class DataConstants { public static final String COMPANY_ADDRESS_LATITUDE = "companyAddressLatitude"; public static final String COMPANY_ADDRESS_LONGITUDE = "companyAddressLongitude"; + // 泛化语义 + public static final String STRATEGY_THE_TIME_SHORTEST_PATH = "STRATEGY_THE_TIME_SHORTEST_PATH"; + public static final String[] WORDS_STRATEGY_THE_TIME_SHORTEST_PATH = {"最快的"}; + public static final String STRATEGY_THE_DISTANCE_SHORTEST_PATH = "STRATEGY_THE_DISTANCE_SHORTEST_PATH"; + public static final String[] WORDS_STRATEGY_THE_DISTANCE_SHORTED_PATH = {"路程最短的"}; + + // 第x个选个 + public static final String STRATEGY_THE_FIRST_PATH = "STRATEGY_THE_FIRST_PATH"; + public static final String[] WORDS_STRATEGY_THE_FIRST_PATH = {"第一个"}; + public static final String STRATEGY_THE_SECOND_PATH = "STRATEGY_THE_SECOND_PATH"; + public static final String[] WORDS_STRATEGY_THE_SECOND_PATH = {"第二个"}; + public static final String STRATEGY_THE_THIRD_PATH = "STRATEGY_THE_THIRD_PATH"; + public static final String[] WORDS_STRATEGY_THE_THIRD_PATH = {"第三个"}; + + // 开始导航 + public static final String STRATEGY_START_NAVI = "STRATEGY_START_NAVI"; + public static final String[] WORDS_STRATEGY_START_NAVI = {"开始导航", "开始"}; + + public static final Map< String, String[] > sCmds = new HashMap<>(); + + static { + sCmds.put( STRATEGY_THE_TIME_SHORTEST_PATH, WORDS_STRATEGY_THE_TIME_SHORTEST_PATH ); + sCmds.put( STRATEGY_THE_DISTANCE_SHORTEST_PATH, WORDS_STRATEGY_THE_DISTANCE_SHORTED_PATH ); + sCmds.put( STRATEGY_THE_FIRST_PATH, WORDS_STRATEGY_THE_FIRST_PATH ); + sCmds.put( STRATEGY_THE_SECOND_PATH, WORDS_STRATEGY_THE_SECOND_PATH ); + sCmds.put( STRATEGY_THE_THIRD_PATH, WORDS_STRATEGY_THE_THIRD_PATH ); + sCmds.put( STRATEGY_START_NAVI, WORDS_STRATEGY_START_NAVI ); + } } diff --git a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/adapter/CalculatePathAdapter.java b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/adapter/CalculatePathAdapter.java index 338c0ff859..93d8ebb3da 100644 --- a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/adapter/CalculatePathAdapter.java +++ b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/adapter/CalculatePathAdapter.java @@ -4,7 +4,6 @@ import android.content.Context; import android.text.TextUtils; import android.view.View; import com.mogo.map.navi.MogoCalculatePath; -import com.mogo.map.search.inputtips.MogoTip; import com.mogo.module.navi.R; import com.mogo.module.navi.ui.adapter.base.RecycleBaseAdapter; import com.mogo.module.navi.ui.adapter.base.RecycleViewHolder; @@ -53,8 +52,8 @@ public class CalculatePathAdapter extends RecycleBaseAdapter if (holder.getLayoutPosition() >= 2) { mName.setVisibility(View.GONE); } - holder.setText(R.id.amap_calculate_item_strategy_time, item.getTime()); - holder.setText(R.id.amap_calculate_item_strategy_distance, item.getDistance()); + holder.setText(R.id.amap_calculate_item_strategy_time, item.getFormattedTime()); + holder.setText(R.id.amap_calculate_item_strategy_distance, item.getFormattedDistance()); holder.setText(R.id.amap_calculate_item_strategy_desc, item.getDesc()); if (TextUtils.isEmpty(item.getDesc())) { diff --git a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/search/ChoosePathFragment.kt b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/search/ChoosePathFragment.kt index f715aa8428..750335c1be 100644 --- a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/search/ChoosePathFragment.kt +++ b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/search/ChoosePathFragment.kt @@ -11,25 +11,26 @@ import com.mogo.commons.voice.IMogoVoiceCmdCallBack import com.mogo.map.MogoLatLng import com.mogo.map.navi.IMogoNaviListener import com.mogo.map.navi.MogoCalculatePath -import com.mogo.map.navi.MogoNaviInfo -import com.mogo.map.navi.MogoTraffic -import com.mogo.module.common.MogoModulePaths +import com.mogo.map.navi.MogoNaviConfig import com.mogo.module.common.map.MapCenterPointStrategy import com.mogo.module.common.map.Scene import com.mogo.module.navi.R import com.mogo.module.navi.constants.AMapConstants +import com.mogo.module.navi.constants.DataConstants import com.mogo.module.navi.constants.SearchServiceHolder import com.mogo.module.navi.manager.SettingManager import com.mogo.module.navi.ui.adapter.CalculatePathAdapter import com.mogo.module.navi.ui.base.BaseFragment import com.mogo.service.intent.IMogoIntentListener import com.mogo.utils.UiThreadHandler +import com.mogo.utils.logger.Logger import kotlinx.android.synthetic.main.fragment_search_category.group_path import kotlinx.android.synthetic.main.fragment_search_category.pb_path import kotlinx.android.synthetic.main.fragment_search_category.rv_search_result import kotlinx.android.synthetic.main.fragment_search_category.tv_navi_navi import kotlinx.android.synthetic.main.include_search_bar.et_navi_search import kotlinx.android.synthetic.main.include_search_bar.iv_navi_back +import org.json.JSONObject /** * @author zyz @@ -37,24 +38,34 @@ import kotlinx.android.synthetic.main.include_search_bar.iv_navi_back */ class ChoosePathFragment : BaseFragment(), IMogoNaviListener, IMogoVoiceCmdCallBack, IMogoIntentListener { + var mTimeShortestPosition = -1 + var mDistanceShortestPosition = -1 + override fun onCmdSelected(cmd: String?) { when (cmd) { - "firstPath" -> { + DataConstants.STRATEGY_THE_FIRST_PATH -> { selectItem(0) startNavi() - } - "secondPath" -> { + DataConstants.STRATEGY_THE_SECOND_PATH -> { selectItem(1) startNavi() - } - "thirdPath" -> { + DataConstants.STRATEGY_THE_THIRD_PATH -> { selectItem(2) startNavi() - } - "startNavi" -> { + DataConstants.STRATEGY_START_NAVI -> { + startNavi() + } + DataConstants.STRATEGY_THE_DISTANCE_SHORTEST_PATH -> { + // 路程最短 + selectItem(mDistanceShortestPosition) + startNavi() + } + DataConstants.STRATEGY_THE_TIME_SHORTEST_PATH -> { + // 时间最短 + selectItem(mTimeShortestPosition) startNavi() } "retry" -> { @@ -63,45 +74,15 @@ class ChoosePathFragment : BaseFragment(), IMogoNaviListener, IMogoVoiceCmdCallB "cancel" -> { SearchServiceHolder.fragmentManager.clearAll() } - } - } private fun selectItem(index: Int) { - - if (mAdapter.list.size > index) { + if (mAdapter.list.size > index && index > 0) { selectPath(mAdapter.list[index]) } } - override fun onCmdAction(speakText: String?) { - } - - override fun onCmdCancel(speakText: String?) { - } - - override fun onSpeakEnd(speakText: String?) { - } - - override fun onSpeakSelectTimeOut(speakText: String?) { - } - - override fun onInitNaviFailure() { - } - - override fun onInitNaviSuccess() { - } - - override fun onNaviInfoUpdate(naviinfo: MogoNaviInfo?) { - } - - override fun onStartNavi() { - } - - override fun onStopNavi() { - } - override fun onCalculateSuccess() { var calculatedStrategies = SearchServiceHolder.getNavi().calculatedStrategies if (calculatedStrategies != null && calculatedStrategies.size > 0) { @@ -115,9 +96,33 @@ class ChoosePathFragment : BaseFragment(), IMogoNaviListener, IMogoVoiceCmdCallB return@postDelayed } SearchServiceHolder.getNavi().itemClickInteraction.onItemClicked(calculatedStrategies[0].tagId) + + if (calculatedStrategies.size == 1) { + // 一条路线,自动开启导航 + startNavi() + } }, 500L) + + if (calculatedStrategies.size > 1) { + + var timeShortest = Integer.MAX_VALUE + var distanceShortest = Integer.MAX_VALUE + + for (i in 0 until calculatedStrategies.size) { + if (timeShortest > calculatedStrategies[i].time) { + timeShortest = calculatedStrategies[i].time + mTimeShortestPosition = i + } + if (distanceShortest > calculatedStrategies[i].distance) { + distanceShortest = calculatedStrategies[i].distance + mDistanceShortestPosition = i + } + } + + Logger.d(TAG, "mTimeShortestPosition = ${mTimeShortestPosition}, mDistanceShortestPosition = $mDistanceShortestPosition") + AIAssist.getInstance(context).speakTTSVoice(String.format("已为你规划处%d条路线,请选择", calculatedStrategies.size)) + } } - AIAssist.getInstance(context).speakTTSVoice(String.format("已为你规划处%d条路线,请选择", calculatedStrategies.size)) pb_path.visibility = View.GONE group_path.visibility = View.GONE tv_navi_navi.text = getString(R.string.start_navi) @@ -132,10 +137,6 @@ class ChoosePathFragment : BaseFragment(), IMogoNaviListener, IMogoVoiceCmdCallB pb_path.visibility = View.GONE registerRetryVoice() - - } - - override fun onUpdateTraffic(traffic: MogoTraffic?) { } private lateinit var mAdapter: CalculatePathAdapter @@ -143,24 +144,16 @@ class ChoosePathFragment : BaseFragment(), IMogoNaviListener, IMogoVoiceCmdCallB return R.layout.fragment_search_category } - val firstPath: String = "第一个" - val secondPath: String = "第二个" - val thirdPath: String = "第三个" - val startNavi: String = "开始导航" - var mogoTip: MogoLatLng? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) mogoTip = arguments?.getParcelable(AMapConstants.KEY_PARCELABLE) - } // 是否开启导航 var isStartedNavi = false - override fun onViewCreated( - view: View, - savedInstanceState: Bundle?) { + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) iv_navi_back.setOnClickListener { @@ -199,13 +192,14 @@ class ChoosePathFragment : BaseFragment(), IMogoNaviListener, IMogoVoiceCmdCallB SearchServiceHolder.getMarkerManger().removeMarkers() - AIAssist.getInstance(context).registerUnWakeupCommand("firstPath", arrayOf(firstPath), this) - AIAssist.getInstance(context).registerUnWakeupCommand("secondPath", arrayOf(secondPath), this) - AIAssist.getInstance(context).registerUnWakeupCommand("thirdPath", arrayOf(thirdPath), this) - AIAssist.getInstance(context).registerUnWakeupCommand("startNavi", arrayOf(startNavi, "开始"), this) + DataConstants.sCmds.entries.filter { + it != null && !TextUtils.isEmpty(it.key) && (it.value?.isNotEmpty() ?: false) + }.forEach { + AIAssist.getInstance(mContext).registerUnWakeupCommand(it.key, it.value, this@ChoosePathFragment) + } SearchServiceHolder.intentManager.registerIntentListener(AMapConstants.COMMAND_START_NAVI, this) - + SearchServiceHolder.intentManager.registerIntentListener(AMapConstants.COMMAND_CHOOSE_PATH, this) } private fun registerRetryVoice() { @@ -214,7 +208,6 @@ class ChoosePathFragment : BaseFragment(), IMogoNaviListener, IMogoVoiceCmdCallB private fun unregisterRetryVoice() { AIAssist.getInstance(context).unregisterUnWakeupCommand("retry") - } private fun retry() { @@ -227,7 +220,6 @@ class ChoosePathFragment : BaseFragment(), IMogoNaviListener, IMogoVoiceCmdCallB if (TextUtils.isEmpty(mAdapter.selectTag)) { return } -// moveMapToRight() SearchServiceHolder.getNavi().startNavi(!SettingManager.isMonitor()) SearchServiceHolder.getMapUIController().recoverLockMode() @@ -253,21 +245,81 @@ class ChoosePathFragment : BaseFragment(), IMogoNaviListener, IMogoVoiceCmdCallB SearchServiceHolder.getNavi().clearCalculatePaths() } - AIAssist.getInstance(context).unregisterUnWakeupCommand("firstPath") - AIAssist.getInstance(context).unregisterUnWakeupCommand("secondPath") - AIAssist.getInstance(context).unregisterUnWakeupCommand("thirdPath") - AIAssist.getInstance(context).unregisterUnWakeupCommand("startNavi") + DataConstants.sCmds.entries.filter { + it != null && !TextUtils.isEmpty(it.key) && (it.value?.isNotEmpty() ?: false) + }.forEach { + AIAssist.getInstance(mContext).unregisterUnWakeupCommand(it.key) + } SearchServiceHolder.intentManager.unregisterIntentListener(AMapConstants.COMMAND_START_NAVI, this) + SearchServiceHolder.intentManager.unregisterIntentListener(AMapConstants.COMMAND_CHOOSE_PATH, this) } override fun onIntentReceived(intentStr: String?, intent: Intent?) { - if (TextUtils.equals(AMapConstants.COMMAND_START_NAVI, intentStr)) { - startNavi() + when (intentStr) { + AMapConstants.COMMAND_START_NAVI -> { + startNavi() + } + AMapConstants.COMMAND_CHOOSE_PATH -> { + choosePath(intent) + } + } + } + + private fun choosePath(intent: Intent?) { + var dataJsonStr = intent?.getStringExtra("data") ?: "" + try { + var jsonObj = JSONObject(dataJsonStr) + var routePlan = jsonObj.optString("route_plan", " ") + when (routePlan) { + "最快" -> { + // 时间最短 + selectItem(mTimeShortestPosition) + startNavi() + } + "不走高速" -> { + // 仅在导航场景下,⽀持第三⽅进⾏路线偏好的重新选择。 + // 避免收费 | 1 + // 多策略算路 | 2 + // 不走高速 | 3 + // 躲避拥堵 | 4 + // 不走高速且避免收费 | 5 + // 不走高速且躲避拥堵 | 6 + // 躲避收费和拥堵 | 7 + // 不走高速躲避收费和拥堵 | 8 + // 高速优先 | 20 + // 躲避拥堵且高速优先 | 24 + var prefer = 3 + val config = MogoNaviConfig().congestion(prefer == 4) + .cost(prefer == 1 || prefer == 7) + .highSpeed(prefer == 20) + .avoidSpeed(prefer == 3) + SearchServiceHolder.getNavi().reCalculateRoute(config) + } + "最近" -> { + // 路程最短 + selectItem(mDistanceShortestPosition) + startNavi() + } + "躲避拥堵" -> { + var prefer = 4 + val config = MogoNaviConfig().congestion(prefer == 4) + .cost(prefer == 1 || prefer == 7) + .highSpeed(prefer == 20) + .avoidSpeed(prefer == 3) + SearchServiceHolder.getNavi().reCalculateRoute(config) + } + } + } catch (e: Exception) { + } } companion object { + + @JvmField + val TAG: String = "ChoosePathFragment" + fun newInstance(searchPoi: MogoLatLng): Fragment { MapCenterPointStrategy.setMapCenterPointByScene(SearchServiceHolder.getMapUIController(), Scene.CALCULATE_PATH) var bundle = Bundle() diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/marker/MapMarkerManager.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/marker/MapMarkerManager.java index 0298414d3b..77024d794b 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/marker/MapMarkerManager.java +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/marker/MapMarkerManager.java @@ -3,6 +3,7 @@ package com.mogo.module.service.marker; import android.content.Context; import android.content.Intent; import android.text.TextUtils; +import android.util.Log; import android.view.animation.BounceInterpolator; import android.view.animation.OvershootInterpolator; @@ -257,20 +258,6 @@ public class MapMarkerManager implements IMogoMarkerClickListener, } } - /** - * 关闭 Marker 详情 - * - * @param marker 要关闭的Marker - */ - public synchronized void closeMarkerSelect( IMogoMarker marker ) { - // 将上次选中 Marker 设置为未选中状态 - if ( marker != null ) { - Logger.i( TAG, "closeMarkerSelect 将出Marker详情关闭:" + marker ); - closeMarker( marker ); - mLastCheckMarker = null; - } - } - // 展开气泡 private void openMarker( IMogoMarker mogoMarker ) { if ( mogoMarker == null ) { @@ -358,7 +345,7 @@ public class MapMarkerManager implements IMogoMarkerClickListener, } else { mLastCheckMarker = null; // 清空所有地图上绘制的Marker - MarkerServiceHandler.getMarkerManager().removeMarkers(); + MarkerServiceHandler.getMarkerManager().removeMarkersExcept( ModuleNames.CARD_TYPE_USER_DATA ); } drawMarkerByCurrentType( mLastDataResult ); @@ -402,29 +389,7 @@ public class MapMarkerManager implements IMogoMarkerClickListener, mCurrentModuleName = ServiceConst.CARD_TYPE_BUSINESS_OPERATION; } - List< MarkerOnlineCar > onlineCarList = markerCardResult.getOnlineCar(); - List< MarkerExploreWay > exploreWayList = markerCardResult.getExploreWay(); - List< MarkerShareMusic > shareMusicList = markerCardResult.getShareMusic(); - List< MarkerNoveltyInfo > noveltyInfoList = markerCardResult.getNoveltyInfo(); - - switch ( mCurrentModuleName ) { - case ServiceConst.CARD_TYPE_BUSINESS_OPERATION: - drawAllMarker( markerCardResult ); - break; - case ServiceConst.CARD_TYPE_NOVELTY: - drawNoveltyMarker( noveltyInfoList, ServiceConst.MAX_AMOUNT_SINGLE_CARD ); - break; -// case ServiceConst.CARD_TYPE_CARS_CHATTING: -// case ServiceConst.CARD_TYPE_USER_DATA: -// drawOnlineCarMarkers(onlineCarList, ServiceConst.MAX_AMOUNT_SINGLE_CARD); -// break; - case ServiceConst.CARD_TYPE_ROAD_CONDITION: - drawRoadConditionMarker( exploreWayList, ServiceConst.MAX_AMOUNT_SINGLE_CARD ); - break; - case ServiceConst.CARD_TYPE_SHARE_MUSIC: - drawShareMusicMarker( shareMusicList, ServiceConst.MAX_AMOUNT_SINGLE_CARD ); - break; - } + drawAllMarker( markerCardResult ); } /** @@ -457,6 +422,9 @@ public class MapMarkerManager implements IMogoMarkerClickListener, double nearlyDistance = Float.MAX_VALUE; int size = getAppropriateSize( maxAmount, onlineCarList ); + + Map< String, IMogoMarker > existCarMap = purgeCarsData( onlineCarList ); + for ( int i = 0; i < size; i++ ) { MarkerOnlineCar markerOnlineCar = onlineCarList.get( i ); MarkerLocation markerLocation = markerOnlineCar.getLocation(); @@ -470,9 +438,15 @@ public class MapMarkerManager implements IMogoMarkerClickListener, markerShowEntity.setIconUrl( markerOnlineCar.getUserInfo().getUserHead() ); } - IMogoMarker iMogoMarker = drawMapMarker( markerShowEntity ); -// iMogoMarker.setInfoWindowAdapter(this); - startSmooth( iMogoMarker, markerOnlineCar, markerLocation ); + if ( markerOnlineCar.getUserInfo() == null || TextUtils.isEmpty( markerOnlineCar.getUserInfo().getSn() ) ) { + continue; + } + IMogoMarker mogoMarker = existCarMap.get( markerOnlineCar.getUserInfo().getSn() ); + if ( mogoMarker == null ) { + Logger.d( TAG, "car [%s] need be create.", markerOnlineCar.getUserInfo().getSn() ); + mogoMarker = drawMapMarker( markerShowEntity ); + } + startSmooth( mogoMarker, markerOnlineCar, markerLocation ); // 计算在线车辆距离当前车辆的距离,每次都与最后一次距离最近的进行比较,保留距离最近的车辆,进行卡片展示 try { @@ -489,7 +463,7 @@ public class MapMarkerManager implements IMogoMarkerClickListener, // 进行比较,保留最近的一个数据 if ( calculateDistance < nearlyDistance ) { nearlyDistance = calculateDistance; - mNearlyMarker = iMogoMarker; + mNearlyMarker = mogoMarker; } } catch ( Exception e ) { @@ -519,6 +493,66 @@ public class MapMarkerManager implements IMogoMarkerClickListener, } } + /** + * 根据新的在线车辆列表,选出已存在的在线车辆,并从视图和内存中移除不存在的在线车辆 + * + * @param newCarsList + * @return + */ + private Map< String, IMogoMarker > purgeCarsData( List< MarkerOnlineCar > newCarsList ) { + + final long start = System.currentTimeMillis(); + Map< String, IMogoMarker > existCarsMap = new HashMap<>(); + List< IMogoMarker > allCarsList = MarkerServiceHandler.getMarkerManager().getMarkers( ModuleNames.CARD_TYPE_USER_DATA ); + if ( allCarsList == null || allCarsList.isEmpty() ) { + return existCarsMap; + } + if ( newCarsList == null || newCarsList.isEmpty() ) { + return existCarsMap; + } + + Map< String, IMogoMarker > allCarsMap = new HashMap<>(); + for ( IMogoMarker marker : allCarsList ) { + String sn = getCarSnFromMarker( marker ); + Logger.d( TAG, "sn = [%s]", sn ); + allCarsMap.put( sn, marker ); + } + for ( MarkerOnlineCar markerOnlineCar : newCarsList ) { + String sn = markerOnlineCar.getUserInfo().getSn(); + if ( allCarsMap.containsKey( sn ) ) { + Logger.d( TAG, " car [%s] is cached.", sn ); + existCarsMap.put( sn, allCarsMap.get( sn ) ); + } + } + for ( String sn : allCarsMap.keySet() ) { + if ( !existCarsMap.containsKey( sn ) ) { + IMogoMarker dirtyMarker = allCarsMap.get( sn ); + allCarsList.remove( dirtyMarker ); + dirtyMarker.destroy(); + Logger.d( TAG, " car [%s] is destroy.", sn ); + } + } + allCarsMap.clear(); + Logger.i( "timer", "purge data cost " + ( System.currentTimeMillis() - start ) + "ms" ); + return existCarsMap; + } + + private String getCarSnFromMarker( IMogoMarker marker ) { + if ( marker == null || marker.getObject() == null || marker.isDestroyed() ) { + return null; + } + if ( !( marker.getObject() instanceof MarkerShowEntity ) ) { + return null; + } + if ( !( ( ( MarkerShowEntity ) marker.getObject() ).getBindObj() instanceof MarkerOnlineCar ) ) { + return null; + } + if ( ( ( MarkerOnlineCar ) ( ( MarkerShowEntity ) marker.getObject() ).getBindObj() ).getUserInfo() == null ) { + return null; + } + return ( ( MarkerOnlineCar ) ( ( MarkerShowEntity ) marker.getObject() ).getBindObj() ).getUserInfo().getSn(); + } + /** * 探路数据 * @@ -869,7 +903,7 @@ public class MapMarkerManager implements IMogoMarkerClickListener, if ( result == null ) { return; } - removeCarMarkers(); + List< MarkerOnlineCar > onlineCarList = result.getOnlineCar(); if ( !MarkerServiceHandler.getMogoStatusManager().isADASShow() ) { dispatchDataToBis( ServiceConst.CARD_TYPE_USER_DATA, onlineCarList == null ? new ArrayList<>() : onlineCarList );