This commit is contained in:
wangcongtao
2020-10-22 14:17:12 +08:00
1425 changed files with 31249 additions and 12020 deletions

View File

@@ -9,15 +9,14 @@ import com.mogo.map.marker.IMogoMarkerManager;
import com.mogo.map.navi.IMogoNavi;
import com.mogo.map.uicontroller.IMogoMapUIController;
import com.mogo.module.carchattingprovider.ICarsChattingProvider;
import com.mogo.module.common.MogoApisHandler;
import com.mogo.module.common.entity.MarkerResponse;
import com.mogo.module.common.entity.MarkerShowEntity;
import com.mogo.module.gps.simulator.IMogoGpsSimulatorManager;
import com.mogo.module.service.marker.MapMarkerManager;
import com.mogo.service.IMogoServiceApis;
import com.mogo.service.MogoServicePaths;
import com.mogo.service.adas.IMogoADASController;
import com.mogo.service.analytics.IMogoAnalytics;
import com.mogo.service.cardmanager.IMogoCardManager;
import com.mogo.service.connection.IMogoSocketManager;
import com.mogo.service.datamanager.IMogoDataManager;
import com.mogo.service.fragmentmanager.IMogoFragmentManager;
@@ -51,7 +50,6 @@ public class MarkerServiceHandler {
private static IMogoStatusManager sMogoStatusManager;
private static IMogoImageloader sImageloader;
private static IMogoSocketManager sMogoSocketManager;
private static IMogoCardManager sMogoCardManager;
private static IMogoAnalytics sMogoAnalytics;
private static IMogoRegisterCenter sRegisterCenter;
private static IMogoActionManager sActionManager;
@@ -69,12 +67,11 @@ public class MarkerServiceHandler {
return;
}
sApis = ( IMogoServiceApis ) ARouter.getInstance().build( MogoServicePaths.PATH_SERVICE_APIS ).navigation( context );
sApis = MogoApisHandler.getInstance().getApis();
sMapService = sApis.getMapServiceApi();
sImageloader = sApis.getImageLoaderApi();
sMogoStatusManager = sApis.getStatusManagerApi();
sMogoSocketManager = sApis.getSocketManagerApi( context );
sMogoCardManager = sApis.getCardManagerApi();
sMogoAnalytics = sApis.getAnalyticsApi();
sMarkerManager = sMapService.getMarkerManager( context );
sNavi = sMapService.getNavi( context );
@@ -127,10 +124,6 @@ public class MarkerServiceHandler {
return sMogoStatusManager;
}
public static IMogoCardManager getMogoCardManager() {
return sMogoCardManager;
}
public static IMogoAnalytics getMogoAnalytics() {
return sMogoAnalytics;
}

View File

@@ -100,4 +100,9 @@ public class MogoServiceProvider implements IMogoModuleProvider {
MogoServices.getInstance().init( AbsMogoApplication.getApp() );
}, 5_000L );
}
@Override
public void onDestroy() {
MogoServices.getInstance().destroy();
}
}

View File

@@ -5,6 +5,8 @@ import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.location.Location;
import android.net.ConnectivityManager;
import android.net.wifi.WifiManager;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
@@ -15,8 +17,12 @@ import android.view.MotionEvent;
import androidx.annotation.NonNull;
import com.mogo.commons.debug.DebugConfig;
import com.mogo.commons.network.ParamsProvider;
import com.mogo.commons.network.SubscribeImpl;
import com.mogo.commons.storage.SpStorage;
import com.mogo.commons.voice.AIAssist;
import com.mogo.commons.voice.IMogoVoiceCmdCallBack;
import com.mogo.map.IDestroyable;
import com.mogo.map.MogoLatLng;
import com.mogo.map.listener.IMogoMapListener;
import com.mogo.map.location.IMogoLocationListener;
@@ -30,13 +36,18 @@ import com.mogo.map.navi.MogoTraffic;
import com.mogo.map.uicontroller.IMogoMapUIController;
import com.mogo.module.common.MogoModule;
import com.mogo.module.common.MogoModulePaths;
import com.mogo.module.common.entity.MarkerResponse;
import com.mogo.module.common.map.MapCenterPointStrategy;
import com.mogo.module.common.map.Scene;
import com.mogo.module.service.autopilot.AutoPilotRemoteController;
import com.mogo.module.service.intent.IntentHandlerFactory;
import com.mogo.module.service.launchercard.LauncherCardRefresher;
import com.mogo.module.service.marker.MapMarkerManager;
import com.mogo.module.service.network.RefreshCallback;
import com.mogo.module.service.network.RefreshModel;
import com.mogo.module.service.network.bean.HomeCompanyDistanceForPushData;
import com.mogo.module.service.network.bean.HomeCompanyDistanceForPushResponse;
import com.mogo.module.service.onlinecar.panel.NavigationTargetInfo;
import com.mogo.module.service.receiver.MogoReceiver;
import com.mogo.module.service.refresh.AutoRefreshStrategy;
import com.mogo.module.service.refresh.CustomRefreshStrategy;
@@ -44,6 +55,7 @@ import com.mogo.module.service.refresh.RefreshObject;
import com.mogo.module.service.strategy.CarIconDisplayStrategy;
import com.mogo.service.adas.IMogoADASController;
import com.mogo.service.cardmanager.IMogoCardManager;
import com.mogo.service.connection.IMogoOnMessageListener;
import com.mogo.service.fragmentmanager.FragmentStackTransactionListener;
import com.mogo.service.fragmentmanager.IMogoFragmentManager;
import com.mogo.service.intent.IMogoIntentListener;
@@ -56,13 +68,20 @@ import com.mogo.service.module.MogoAction;
import com.mogo.service.statusmanager.IMogoStatusChangedListener;
import com.mogo.service.statusmanager.IMogoStatusManager;
import com.mogo.service.statusmanager.StatusDescriptor;
import com.mogo.utils.NetworkUtils;
import com.mogo.utils.UiThreadHandler;
import com.mogo.utils.WorkThreadHandler;
import com.mogo.utils.logger.Logger;
import com.mogo.utils.network.RequestOptions;
import com.mogo.utils.network.utils.GsonUtil;
import org.json.JSONObject;
import java.util.List;
import java.util.Map;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
/**
* @author congtaowang
@@ -82,7 +101,8 @@ public class MogoServices implements IMogoMapListener,
IMogoAimlessModeListener,
IMogoVoiceCmdCallBack,
FragmentStackTransactionListener,
IMogoCarLocationChangedListener2 {
IMogoCarLocationChangedListener2,
IDestroyable {
private boolean mInternalUnWakeupRegisterStatus = false;
@@ -113,8 +133,6 @@ public class MogoServices implements IMogoMapListener,
private IMogoMapUIController mUiController;
private IMogoCardManager mCardManager;
/**
* 是否已计算出地图显示状态
*/
@@ -187,6 +205,9 @@ public class MogoServices implements IMogoMapListener,
invokeAutoRefresh();
}
break;
case ServiceConst.MSG_SCHEDULE_CALCULATE_NOT_HOME_COMPANY_DISTANCE_FOR_PUSH:
handleCalculationNotHomeCompanyDistanceForPush( msg.arg1 );
break;
}
}
@@ -224,9 +245,10 @@ public class MogoServices implements IMogoMapListener,
/**
* 手动刷新回调
*/
private RefreshCallback mCustomRefreshCallback = new RefreshCallback() {
private RefreshCallback mCustomRefreshCallback = new RefreshCallback< MarkerResponse >() {
@Override
public void onSuccess( Object o ) {
public void onSuccess( MarkerResponse o ) {
MapMarkerManager.getInstance().onSyncMarkerResponse( o );
mLoopRequest = false;
// 用户手动操作地图刷新成功后,设置状态为 true引发延时策略
mStatusManager.setUserInteractionStatus( ServiceConst.TYPE, true, true );
@@ -241,9 +263,10 @@ public class MogoServices implements IMogoMapListener,
/**
* 自动刷新回调
*/
private RefreshCallback mAutoRefreshCallback = new RefreshCallback() {
private RefreshCallback mAutoRefreshCallback = new RefreshCallback< MarkerResponse >() {
@Override
public void onSuccess( Object o ) {
public void onSuccess( MarkerResponse o ) {
MapMarkerManager.getInstance().onSyncMarkerResponse( o );
mLoopRequest = false;
Logger.d( TAG, "request Success." );
invokeAutoRefreshStrategy();
@@ -269,7 +292,7 @@ public class MogoServices implements IMogoMapListener,
/**
* 当前限速
*/
private int mCurrentLimit = 0;
private int mCurrentLimit = -1;
private boolean mIsMainPageFirstResume = true;
@@ -387,11 +410,12 @@ public class MogoServices implements IMogoMapListener,
mIntentManager.registerIntentListener( MogoReceiver.ACTION_AUTO_NAVI_RECEIVER, this );
mIntentManager.registerIntentListener( MogoReceiver.ACTION_AUTO_NAVI_SEND, this );
mIntentManager.registerIntentListener( MogoReceiver.ACTION_MOGO, this );
mIntentManager.registerIntentListener( ServiceConst.COMMAND_ONLINE_CAR_PANEL, this );
mIntentManager.registerIntentListener( ConnectivityManager.CONNECTIVITY_ACTION, this );
mADASController = MarkerServiceHandler.getADASController();
mLauncher = MarkerServiceHandler.getLauncher();
mFragmentManager = MarkerServiceHandler.getFragmentManager();
mCardManager = MarkerServiceHandler.getMogoCardManager();
mFragmentManager.addMainFragmentStackTransactionListener( this );
@@ -400,6 +424,8 @@ public class MogoServices implements IMogoMapListener,
if ( DebugConfig.isLaunchLocationService() ) {
initLocationServiceProcess( context );
}
AutoPilotRemoteController.getInstance().start();
}
private void initLocationServiceProcess( Context context ) {
@@ -436,7 +462,7 @@ public class MogoServices implements IMogoMapListener,
Logger.w( TAG, "lonLat is null." );
return;
}
mRefreshModel.refreshData( ro.mLonLat, ro.mRadius, ro.mAmount, ro.mCallback );
mRefreshModel.refreshExplorerWayData( ro.mLonLat, ro.mRadius, ro.mAmount, ro.mCallback );
MapMarkerManager.getInstance().getOnlineCarDataByAutoRefreshStrategy( ro.mLonLat );
Logger.i( TAG, "刷新半径 = %s, 点 = %s, zoomLevel = %s, amount = %s", ro.mRadius, ro.mLonLat, mLastZoomLevel, ro.mAmount );
@@ -481,7 +507,8 @@ public class MogoServices implements IMogoMapListener,
filter.addAction( MogoReceiver.ACTION_AUTO_NAVI_RECEIVER );
filter.addAction( MogoReceiver.ACTION_AUTO_NAVI_SEND );
filter.addAction( MogoReceiver.ACTION_MOGO );
filter.addAction(MogoReceiver.ACTION_TXZ_BLOCK_SEARCH);
filter.addAction( MogoReceiver.ACTION_TXZ_BLOCK_SEARCH );
filter.addAction( ConnectivityManager.CONNECTIVITY_ACTION );
try {
context.getApplicationContext().registerReceiver( mAIAssistReceiver, filter );
Logger.i( TAG, "register voice receiver." );
@@ -749,7 +776,7 @@ public class MogoServices implements IMogoMapListener,
return;
}
Logger.d( TAG, mAutoRefreshCallback == callback ? "触发自动刷新" : "触发手动刷新" );
int amount = 10;
int amount = 20;
Message msg = Message.obtain();
msg.what = ServiceConst.MSG_REQUEST_DATA;
@@ -818,7 +845,6 @@ public class MogoServices implements IMogoMapListener,
return;
}
if ( mCurrentLimit == traffic.getSpeedLimit() ) {
return;
}
@@ -845,6 +871,10 @@ public class MogoServices implements IMogoMapListener,
} else if ( ServiceConst.COMMAND_PREVIOUS.equals( command ) ) {
onActionDone( MogoAction.Prev );
} else {
if ( TextUtils.equals( command, ConnectivityManager.CONNECTIVITY_ACTION )
&& NetworkUtils.isConnected( mContext ) ) {
mIntentManager.unregisterIntentListener( ConnectivityManager.CONNECTIVITY_ACTION, this );
}
IntentHandlerFactory.getInstance().handle( mContext, command, intent );
}
}
@@ -923,4 +953,90 @@ public class MogoServices implements IMogoMapListener,
AIAssist.getInstance( mContext ).registerUnWakeupCommand( ServiceConst.CMD_BACK, ServiceConst.CMD_BACK_WORDS, this );
}
}
@Override
public void onStartNavi() {
if ( DebugConfig.isIsScheduleCalculateNotHomeCompanyDistanceForPush() ) {
Logger.d( TAG, "onStartNavi: scheduleCalculationNotHomeCompanyDistanceForPush" );
scheduleCalculationNotHomeCompanyDistanceForPush( 1, ServiceConst.INTERVAL_SCHEDULE_CALCULATE_NOT_HOME_COMPANY_DISTANCE_FOR_PUSH );
} else {
Logger.d( TAG, "onStartNavi: scheduleCalculationNotHomeCompanyDistanceForPush un support" );
}
}
@Override
public void onStopNavi() {
SpStorage.setNavigationTarget( "" );
Logger.d( TAG, "onStopNavi: remove MSG_SCHEDULE_CALCULATE_NOT_HOME_COMPANY_DISTANCE_FOR_PUSH msg" );
mHandler.removeMessages( ServiceConst.MSG_SCHEDULE_CALCULATE_NOT_HOME_COMPANY_DISTANCE_FOR_PUSH );
}
/**
* 延时一分钟发起计算导航目的地推送策略
*/
private void scheduleCalculationNotHomeCompanyDistanceForPush( int time, long delay ) {
Message msg = Message.obtain();
msg.what = ServiceConst.MSG_SCHEDULE_CALCULATE_NOT_HOME_COMPANY_DISTANCE_FOR_PUSH;
msg.arg1 = time;
mHandler.sendMessageDelayed( msg, delay );
}
/**
* 发起计算导航目的地推送策略
*
* @param time 第x次重试
*/
private void handleCalculationNotHomeCompanyDistanceForPush( final int time ) {
if ( time > 3 ) {
return;
}
String json = SpStorage.getNavigationTarget();
if ( !TextUtils.isEmpty( json ) ) {
try {
NavigationTargetInfo info = GsonUtil.objectFromJson( json, NavigationTargetInfo.class );
Logger.d( TAG, "info = %s", info );
HomeCompanyDistanceForPushData data = new HomeCompanyDistanceForPushData();
data.lat = Double.valueOf( info.getToPoiLatitude() );
data.lon = Double.valueOf( info.getToPoiLongitude() );
final Map< String, Object > query = new ParamsProvider.Builder( mContext ).build();
query.put( "data", GsonUtil.jsonFromObject( data ) );
mRefreshModel.getRefreshApiService().calculationNotHomeCompanyDistanceForPush( query )
.subscribeOn( Schedulers.io() )
.observeOn( AndroidSchedulers.mainThread() )
.subscribe( new SubscribeImpl< HomeCompanyDistanceForPushResponse >( RequestOptions.create( mContext ) ) {
@Override
public void onSuccess( HomeCompanyDistanceForPushResponse o ) {
super.onSuccess( o );
if ( o != null && o.result != null ) {
Logger.d( TAG, "calculationNotHomeCompanyDistanceForPush result %s", o.result.pushFlag );
}
}
@Override
public void onError( Throwable e ) {
super.onError( e );
Logger.d( TAG, "re scheduleCalculationNotHomeCompanyDistanceForPush after 30s" );
// 延时30s重试
scheduleCalculationNotHomeCompanyDistanceForPush( time + 1, 30_000L );
}
@Override
public void onError( String message, int code ) {
super.onError( message, code );
}
} );
} catch ( Exception e ) {
Logger.e( TAG, e, "handleCalculationNotHomeCompanyDistanceForPush" );
}
}
}
@Override
public void destroy() {
Logger.d( TAG, "MogoServices do nothings." );
}
}

View File

@@ -108,7 +108,6 @@ public class ServiceConst {
public static final int MSG_REQUEST_DATA = 0x201;
/**
*
* 锁车消息
*/
public static final int MSG_LOCK_CAR = 0x202;
@@ -159,7 +158,7 @@ public class ServiceConst {
};
public static final String CMD_BACK = "back";
public static final String[] CMD_BACK_WORDS = new String[]{"关闭", "返回"};
public static final String[] CMD_BACK_WORDS = new String[]{"关闭", "返回"};
/**
@@ -203,4 +202,20 @@ public class ServiceConst {
public static final int ONLINE_SEARCH_LIMIT = 20;
public static final int ONLINE_SEARCH_RADIUS = 2_000;
/**
* 查找目的地车友
*/
public static final String COMMAND_ONLINE_CAR_PANEL = "com.zhidao.search.riders";
/**
* 导航开始后延时1分钟开启推送策略
*/
public static final int MSG_SCHEDULE_CALCULATE_NOT_HOME_COMPANY_DISTANCE_FOR_PUSH = 0x301;
/**
* 延时1分钟开启推送策略
*/
public static final long INTERVAL_SCHEDULE_CALCULATE_NOT_HOME_COMPANY_DISTANCE_FOR_PUSH = 60 * 1_000L;
}

View File

@@ -0,0 +1,23 @@
package com.mogo.module.service.autopilot;
import java.util.List;
public
/**
* @author congtaowang
* @since 2020/10/16
*
* 自动驾驶参数
*/
class AutoPilotParameters {
public AutoPilotLonLat startLatLon;
public List< AutoPilotLonLat > wayLatLons;
public AutoPilotLonLat endLatLon;
public float speedLimit;
public static class AutoPilotLonLat {
public double lat;
public double lon;
}
}

View File

@@ -0,0 +1,81 @@
package com.mogo.module.service.autopilot;
import com.mogo.commons.AbsMogoApplication;
import com.mogo.module.common.MogoApisHandler;
import com.mogo.service.connection.IMogoOnMessageListener;
import com.mogo.service.connection.IMogoSocketManager;
import com.mogo.utils.logger.Logger;
import com.mogo.utils.network.utils.GsonUtil;
public
/**
* @author congtaowang
* @since 2020/10/16
*
* 远端控制自动驾驶
*/
class AutoPilotRemoteController {
private static final String TAG = "AutoPilotRemoteController";
private static volatile AutoPilotRemoteController sInstance;
private IMogoSocketManager mMogoSocketManager;
private IMogoOnMessageListener< AutoPilotParameters > mParametersListener = new IMogoOnMessageListener< AutoPilotParameters >() {
@Override
public Class< AutoPilotParameters > target() {
return AutoPilotParameters.class;
}
@Override
public void onMsgReceived( AutoPilotParameters obj ) {
if ( obj == null ) {
Logger.e( TAG, "远端控制参数为null", new NullPointerException() );
return;
}
String json = GsonUtil.jsonFromObject( obj );
Logger.d( TAG, json );
MogoApisHandler.getInstance().getApis().getAdasControllerApi().aiCloudToAdasData( json );
}
};
/**
* 远端控制自动驾驶的消息类型
*/
public static final int MSG_TYPE_REMOTE_CONTROL_AUTOPILOT = 401014;
private AutoPilotRemoteController() {
mMogoSocketManager = MogoApisHandler.getInstance().getApis().getSocketManagerApi( AbsMogoApplication.getApp() );
}
public static AutoPilotRemoteController getInstance() {
if ( sInstance == null ) {
synchronized ( AutoPilotRemoteController.class ) {
if ( sInstance == null ) {
sInstance = new AutoPilotRemoteController();
}
}
}
return sInstance;
}
public void start() {
mMogoSocketManager.registerOnMessageListener( MSG_TYPE_REMOTE_CONTROL_AUTOPILOT, mParametersListener );
}
public synchronized void release() {
sInstance = null;
if ( mMogoSocketManager != null ) {
mMogoSocketManager.unregisterOnMessageListener( MSG_TYPE_REMOTE_CONTROL_AUTOPILOT, mParametersListener );
}
mMogoSocketManager = null;
mParametersListener = null;
}
private Object readResolve() {
// 阻止反序列化,必须实现 Serializable 接口
return sInstance;
}
}

View File

@@ -2,6 +2,7 @@ package com.mogo.module.service.intent;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import com.mogo.module.service.ServiceConst;
import com.mogo.module.service.receiver.AccStatusReceiver;
@@ -21,7 +22,6 @@ public class IntentHandlerFactory {
private IntentHandlerFactory() {
// private constructor
mHandlers.put( MogoReceiver.ACTION_MOCK, new MockIntentHandler() );
mHandlers.put( ServiceConst.COMMAND_SWITCH_CARD, new SwitchCardIntentHandler() );
mHandlers.put( ServiceConst.COMMAND_OPERATION, new AppOperationIntentHandler() );
mHandlers.put( ServiceConst.COMMAND_MY_LOCATION, new MyLocationHandler() );
mHandlers.put( ServiceConst.COMMAND_ZHIDAO_NEARBY_CAR_ONLINE, OnlineCarSearchIntentHandler.getInstance() );
@@ -38,6 +38,8 @@ public class IntentHandlerFactory {
mHandlers.put( MogoReceiver.ACTION_VOICE_READY, new AIAssistIntentHandler() );
mHandlers.put( ServiceConst.COMMAND_BACK, WholeVoiceCommandIntentHandler.getInstance() );
mHandlers.put( MogoReceiver.ACTION_MOGO, new MogoControllerIntentHandler() );
mHandlers.put( ServiceConst.COMMAND_ONLINE_CAR_PANEL, new OnlineCarPanelIntentHandler() );
mHandlers.put( ConnectivityManager.CONNECTIVITY_ACTION, new NetworkChangedIntentHandler() );
}
private static final class InstanceHolder {

View File

@@ -12,6 +12,7 @@ import android.widget.TextView;
import com.mogo.commons.AbsMogoApplication;
import com.mogo.commons.debug.DebugConfig;
import com.mogo.commons.voice.AIAssist;
import com.mogo.map.MogoLatLng;
import com.mogo.map.marker.IMogoMarker;
import com.mogo.map.marker.MogoMarkerOptions;
@@ -340,6 +341,22 @@ public class MockIntentHandler implements IntentHandler {
TipToast.shortTip( "设置完成,下次启动生效" );
SharedPrefsMgr.getInstance( context ).putBoolean( "useCustomMap", intent.getBooleanExtra( "useCustomMap", false ) );
break;
case 30:
MarkerServiceHandler.getMapService().getMapUIController().forceRender();
break;
case 31:
Intent intent3 = new Intent();
intent3.setAction( "AUTONAVI_STANDARD_BROADCAST_RECV" );
intent3.putExtra( "KEY_TYPE", 12404 );
intent3.putExtra( "EXTRA_REQUEST_AUTO_STATE", 0 );
context.sendBroadcast( intent3 );
break;
case 32:
MarkerServiceHandler.getMapService().getMapUIController().setTrafficEnabled( true );
break;
case 33:
AIAssist.getInstance( context ).speakTTSVoice( "庞帆说这个是一个 hard coding." );
break;
}
}

View File

@@ -0,0 +1,38 @@
package com.mogo.module.service.intent;
import android.content.Context;
import android.content.Intent;
import com.mogo.module.common.MogoApisHandler;
import com.mogo.utils.NetworkUtils;
import com.mogo.utils.logger.LogLevel;
import com.mogo.utils.logger.Logger;
import com.mogo.utils.network.NetConfig;
public
/**
* @author congtaowang
* @since 2020/8/17
*
* 描述
*/
class NetworkChangedIntentHandler implements IntentHandler {
private static final String TAG = "NetworkChangedIntentHandler";
@Override
public void handle( Context context, Intent intent ) {
if ( NetworkUtils.isConnected( context ) ) {
try {
Logger.d( TAG, "setTrafficEnabled" );
MogoApisHandler.getInstance()
.getApis()
.getMapServiceApi()
.getMapUIController()
.setTrafficEnabled( true );
} catch ( Exception e ) {
e.printStackTrace();
}
}
}
}

View File

@@ -0,0 +1,38 @@
package com.mogo.module.service.intent;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.text.TextUtils;
import com.mogo.commons.storage.SpStorage;
import com.mogo.commons.voice.AIAssist;
import com.mogo.module.service.MarkerServiceHandler;
public
/**
* @author congtaowang
* @since 2020/9/21
*
* 描述
*/
class OnlineCarPanelIntentHandler implements IntentHandler {
@Override
public void handle( Context context, Intent intent ) {
String json = SpStorage.getNavigationTarget();
if ( TextUtils.isEmpty( json ) ) {
AIAssist.getInstance( context ).speakTTSVoice( "没有导航目的地" );
return;
}
AIAssist.getInstance( context ).speakTTSVoice( "正在查询" );
if ( MarkerServiceHandler.getMogoStatusManager().isMainPageOnResume() ) {
MarkerServiceHandler.getApis().getOnlineCarPanelApi().showPanel();
} else {
Intent start = new Intent( Intent.ACTION_VIEW );
start.addFlags( Intent.FLAG_ACTIVITY_NEW_TASK );
start.setData( Uri.parse( "mogo://launcher/main/switch2?type=showOnlineCarPanel" ) );
context.startActivity( start );
}
}
}

View File

@@ -1,65 +0,0 @@
package com.mogo.module.service.intent;
import android.content.Context;
import android.content.Intent;
import android.text.TextUtils;
import com.mogo.module.service.MarkerServiceHandler;
import com.mogo.module.service.ServiceConst;
import com.mogo.utils.AppUtils;
import com.mogo.utils.UiThreadHandler;
import org.json.JSONException;
import org.json.JSONObject;
/**
* @author congtaowang
* @since 2020-04-17
* <p>
* 描述
*/
public class SwitchCardIntentHandler implements IntentHandler {
@Override
public void handle( Context context, Intent intent ) {
String data = intent.getStringExtra( "data" );
try {
JSONObject jsonObject = new JSONObject( data );
String card = jsonObject.getString( "card" );
if ( TextUtils.equals( "多媒体卡片", card )
|| TextUtils.equals( "媒体中心卡片", card )
|| TextUtils.equals( "音乐卡片", card ) ) {
switchCard2( context, ServiceConst.CARD_TYPE_SHARE_MUSIC );
} else if ( TextUtils.equals( "探路卡片", card ) ) {
switchCard2( context, ServiceConst.CARD_TYPE_ROAD_CONDITION );
} else if ( TextUtils.equals( "在线车辆卡片", card ) ) {
switchCard2( context, ServiceConst.CARD_TYPE_USER_DATA );
} else if ( TextUtils.equals( "新鲜事卡片", card ) ) {
switchCard2( context, ServiceConst.CARD_TYPE_NOVELTY );
}
} catch ( JSONException e ) {
e.printStackTrace();
}
}
/**
* 切换卡片
*/
public static void switchCard2( Context context, String card ) {
if ( AppUtils.isApplicationBroughtToBackground( context ) ) {
MarkerServiceHandler.getLauncher().backToLauncher( context );
UiThreadHandler.postDelayed( () -> {
if ( MarkerServiceHandler.getMogoStatusManager().isADASShow() ) {
MarkerServiceHandler.getADASController().closeADAS();
}
MarkerServiceHandler.getMogoCardManager().switch2( card, true );
}, 2000L );
} else {
MarkerServiceHandler.getFragmentManager().clearAll();
if ( MarkerServiceHandler.getMogoStatusManager().isADASShow() ) {
MarkerServiceHandler.getADASController().closeADAS();
}
MarkerServiceHandler.getMogoCardManager().switch2( card, true );
}
}
}

View File

@@ -20,7 +20,9 @@ import com.mogo.module.service.network.RefreshCallback;
import com.mogo.module.service.network.RefreshModel;
import com.mogo.module.service.network.ZhidaoRefreshModel;
import com.mogo.module.service.network.bean.LauncherCardAdvertisementData;
import com.mogo.service.passport.IMogoTicketCallback;
import com.mogo.utils.AppUtils;
import com.mogo.utils.NetworkUtils;
import com.mogo.utils.logger.Logger;
import com.mogo.utils.network.RequestOptions;
import com.mogo.utils.storage.SharedPrefsMgr;
@@ -51,19 +53,21 @@ class LauncherCardRefresher {
private static volatile LauncherCardRefresher sInstance;
// 刷新道路事件/车友
public static final int MSG_REFRESH = 2020;
public static final int MSG_EXPLORER_WAY_OR_ONLINE_CAR_DATA = 2020;
// 开始引导策略
public static final int MSG_INDUCE = 2019;
// 刷新卡片默认显示内容
public static final int MSG_REFRESH_DEFAULT_CARD = 2021;
// 刷新卡片广告
public static final int MSG_REFRESH_ADVERTISEMENT = 2022;
// 开始刷新广告数据
public static final int MSG_START_REFRESH_ADVERTISEMENT = 2023;
// 加载网络配置数据
public static final int MSG_LOAD_NET_CONFIG = 2023;
// 默认播报
public static final int MSG_START_LOOP_DEFAULT_CARD = 2024;
public static final long ONE_MINUTE = 60 * 1000L;
public static final long ONE_DAY = 24 * 60 * ONE_MINUTE;
private String mLaunchTTSText;
private long mDefaultTTSPlayInterval = 3 * ONE_MINUTE;
private long mDefaultTTSPlayInterval = 60 * ONE_MINUTE;
private LauncherCardAdvertisementData.LauncherCardAdvertisement mDefaultLauncherCardConfig;
private List< LauncherCardAdvertisementData.LauncherCardAdvertisement > mAdvertisements;
@@ -72,6 +76,16 @@ class LauncherCardRefresher {
*/
private int mDefaultConfigCounter = 0;
/**
* 事件/车友播报次数
*/
private int mMsgExplorerWayOrOnlineCarDataCounter = 0;
/**
* 因为缓存ticket失效导致失败的情况需要重新请求ticket然后再次获取数据这里重试3次
*/
private int mRefreshTicketCounter = 0;
private LauncherCardRefresher( Context context ) {
mContext = context;
mRefreshModel = new RefreshModel( mContext );
@@ -106,30 +120,31 @@ class LauncherCardRefresher {
return;
}
switch ( msg.what ) {
case MSG_REFRESH:
case MSG_LOAD_NET_CONFIG:
loadNetworkConfigStrategy();
break;
case MSG_REFRESH_DEFAULT_CARD:
renderDefaultLauncherCardConfig( false );
mRefreshStrategy = mRefreshStrategy.getNext();
restart();
break;
case MSG_INDUCE:
handleInduceStrategy();
break;
case MSG_EXPLORER_WAY_OR_ONLINE_CAR_DATA:
try {
handleRefreshMsg();
handleRefreshExplorerWayOrOnlineCarMsg();
} catch ( Exception e ) {
Logger.e( TAG, e, "error when refresh launcher card." );
}
break;
case MSG_REFRESH_DEFAULT_CARD:
renderDefaultLauncherCardConfig();
// 开启广告
startLoopRenderAdvertisements();
mRefreshStrategy = mRefreshStrategy.getNext();
restart();
break;
case MSG_START_LOOP_DEFAULT_CARD:
renderDefaultLauncherCardConfig();
renderDefaultLauncherCardConfig( false );
break;
case MSG_REFRESH_ADVERTISEMENT:
int index = msg.arg1;// 当前广告索引
loopRenderAdvertisements( index );
break;
case MSG_START_REFRESH_ADVERTISEMENT:
startAdvertisementsStrategy();
break;
}
}
};
@@ -139,20 +154,20 @@ class LauncherCardRefresher {
private boolean mStart = false;
private RefreshModel mRefreshModel;
private ZhidaoRefreshModel mZhidaoRefreshModel;
private LauncherCardRefreshStrategy mRefreshStrategy = new LauncherCardRefreshStrategy(
2 * ONE_MINUTE,
new LauncherCardRefreshStrategy(
3 * ONE_MINUTE,
new LauncherCardRefreshStrategy(
5 * ONE_MINUTE,
null,
MSG_REFRESH ),
MSG_REFRESH ),
MSG_REFRESH_DEFAULT_CARD
private LauncherCardRefreshStrategy mExplorerWayOrOnlineCarDataStrategy = new LauncherCardRefreshStrategy(
40 * ONE_MINUTE, null, MSG_EXPLORER_WAY_OR_ONLINE_CAR_DATA
);
private LauncherCardRefreshStrategy mInduceStrategy = new LauncherCardRefreshStrategy(
3 * ONE_MINUTE, mExplorerWayOrOnlineCarDataStrategy, MSG_INDUCE
);
private LauncherCardRefreshStrategy mLauncherCardConfigStrategy = new LauncherCardRefreshStrategy(
2 * ONE_MINUTE, mInduceStrategy, MSG_REFRESH_DEFAULT_CARD
);
private LauncherCardRefreshStrategy mRefreshStrategy = mLauncherCardConfigStrategy;
public void start() {
if ( DebugConfig.isLauncher() || DebugConfig.getCarMachineType() == DebugConfig.CAR_MACHINE_TYPE_BYD ) {
if ( !DebugConfig.isIsSupportLauncherCardRefreshStrategy() ) {
return;
}
if ( mStart ) {
@@ -160,16 +175,24 @@ class LauncherCardRefresher {
}
Logger.d( TAG, "start" );
mLaunchTTSText = mContext.getString( R.string.module_service_open_app_tip );
startExplorerWayStrategy();
// 延时一分钟加载数据已保证accOn之后网络恢复正常
mHandler.sendEmptyMessageDelayed( MSG_START_REFRESH_ADVERTISEMENT, ONE_MINUTE );
mDefaultConfigCounter = 0;
mRefreshTicketCounter = 0;
mMsgExplorerWayOrOnlineCarDataCounter = 0;
mRefreshStrategy = mLauncherCardConfigStrategy;
// 延时加载数据已保证accOn之后网络恢复正常
long delay = ONE_MINUTE;
if ( NetworkUtils.isConnected( mContext ) ) {
delay = 0L;
}
mHandler.sendEmptyMessageDelayed( MSG_LOAD_NET_CONFIG, delay );
startInduceStrategy();
SharedPrefsMgr.getInstance( mContext ).putLong( KEY_LauncherCardTipLastTipTime, System.currentTimeMillis() );
}
/**
* 道路事件和车友播报
* 引导策略:本地策略 & 网络策略
*/
private void startExplorerWayStrategy() {
private void startInduceStrategy() {
mHandler.sendEmptyMessageDelayed( mRefreshStrategy.getMsgType(), mRefreshStrategy.getInterval() );
mRefreshStop = false;
mStart = true;
@@ -178,9 +201,12 @@ class LauncherCardRefresher {
public void stop() {
mRefreshStop = true;
mStart = false;
mHandler.removeMessages( MSG_REFRESH );
mHandler.removeMessages( MSG_INDUCE );
mHandler.removeMessages( MSG_EXPLORER_WAY_OR_ONLINE_CAR_DATA );
mHandler.removeMessages( MSG_REFRESH_DEFAULT_CARD );
mHandler.removeMessages( MSG_START_LOOP_DEFAULT_CARD );
mHandler.removeMessages( MSG_REFRESH_ADVERTISEMENT );
mHandler.removeMessages( MSG_LOAD_NET_CONFIG );
Logger.d( TAG, "stop" );
}
@@ -189,36 +215,57 @@ class LauncherCardRefresher {
return;
}
mRefreshStop = false;
mHandler.removeMessages( MSG_REFRESH );
mHandler.removeMessages( mRefreshStrategy.getMsgType() );
mHandler.sendEmptyMessageDelayed( mRefreshStrategy.getMsgType(), mRefreshStrategy.getInterval() );
}
private void handleRefreshMsg() {
/**
* 开始诱导策略
* 第一次如果有活动,则优先播报活动,否则播报道路事件/车友
* 后面的按各自的时间间隔播报
*/
private void handleInduceStrategy() {
if ( mAdvertisements != null && !mAdvertisements.isEmpty() ) {
loopRenderAdvertisements( 0 );
startNextRefreshStrategy();
} else {
handleRefreshExplorerWayOrOnlineCarMsg();
}
}
private void startNextRefreshStrategy() {
mRefreshStrategy = mRefreshStrategy.getNext();
restart();
}
private void handleRefreshExplorerWayOrOnlineCarMsg() {
MogoLocation location = MarkerServiceHandler.getMogoLocationClient().getLastKnowLocation();
if ( location == null ) {
restart();
return;
}
mMsgExplorerWayOrOnlineCarDataCounter++;
if ( mMsgExplorerWayOrOnlineCarDataCounter > 2 ) {
return;
}
MogoLatLng latLng = new MogoLatLng( location.getLatitude(), location.getLongitude() );
handleRefreshData( latLng, mRefreshStrategy.getType() );
handleRefreshExplorerWayOrOnlineCarData( latLng, mRefreshStrategy.getType() );
}
private void handleRefreshData( MogoLatLng latLng, LauncherCardRefreshType type ) {
mRefreshModel.refreshDataSync( latLng,
private void handleRefreshExplorerWayOrOnlineCarData( MogoLatLng latLng, LauncherCardRefreshType type ) {
mRefreshModel.refreshLauncherCardDataSync( latLng,
mRefreshStrategy.getRadius(),
mRefreshStrategy.getLimit(),
new RefreshCallback< MarkerResponse >() {
@Override
public void onSuccess( MarkerResponse response ) {
notifyRefreshChanged( type, response );
mRefreshStrategy = mRefreshStrategy.getNext();
restart();
startNextRefreshStrategy();
}
@Override
public void onFail() {
mRefreshStrategy = mRefreshStrategy.getNext();
restart();
startNextRefreshStrategy();
}
} );
}
@@ -251,6 +298,9 @@ class LauncherCardRefresher {
}
}
Logger.d( TAG, "返回数据情况:道路事件:%s, 车友: %s", response.getResult().getExploreWay() == null ? 0 : response.getResult().getExploreWay().size(),
response.getResult().getOnlineCar() == null ? 0 : response.getResult().getOnlineCar().size() );
if ( size == 0 ) {
return false;
}
@@ -289,8 +339,10 @@ class LauncherCardRefresher {
* 1. 刷新默认卡片样式
* <p>
* 2. 播报默认卡片语音
*
* @param sendConfigOnly 仅发送配置到
*/
private void renderDefaultLauncherCardConfig() {
private void renderDefaultLauncherCardConfig( boolean sendConfigOnly ) {
if ( mDefaultLauncherCardConfig != null ) {
long curr = System.currentTimeMillis();
if ( mDefaultLauncherCardConfig.endTime > curr && mDefaultLauncherCardConfig.startTime < curr ) {
@@ -301,6 +353,7 @@ class LauncherCardRefresher {
intent.putExtra( "v2x_card_button_name", mDefaultLauncherCardConfig.buttonContent );
intent.putExtra( "v2x_card_startTime", mDefaultLauncherCardConfig.startTime );
intent.putExtra( "v2x_card_endTime", mDefaultLauncherCardConfig.endTime );
intent.putExtra( "v2x_card_is_default", true );
mContext.sendBroadcast( intent );
Logger.d( TAG, "发送默认配置广播到桌面卡片." );
if ( !TextUtils.isEmpty( mDefaultLauncherCardConfig.content ) ) {
@@ -312,6 +365,10 @@ class LauncherCardRefresher {
}
}
if ( sendConfigOnly ) {
return;
}
if ( mDefaultConfigCounter++ >= 3 ) {
return;
}
@@ -319,7 +376,7 @@ class LauncherCardRefresher {
int counter = SharedPrefsMgr.getInstance( mContext ).getInt( KEY_LauncherCardTipCounter, 0 );
if ( counter >= 5 ) {
long lastTipTime = SharedPrefsMgr.getInstance( mContext ).getLong( KEY_LauncherCardTipLastTipTime, 0L );
if ( System.currentTimeMillis() - lastTipTime < 10 * ONE_MINUTE ) {
if ( System.currentTimeMillis() - lastTipTime < 1 * ONE_DAY ) {
return;
} else {
SharedPrefsMgr.getInstance( mContext ).putInt( KEY_LauncherCardTipCounter, 0 );
@@ -341,7 +398,7 @@ class LauncherCardRefresher {
/**
* 请求广告数据
*/
private void startAdvertisementsStrategy() {
private void loadNetworkConfigStrategy() {
final Map< String, Object > query = new ParamsProvider.Builder( mContext )
.append( "modelType", 30 )
.build();
@@ -369,9 +426,37 @@ class LauncherCardRefresher {
@Override
public void onError( String message, int code ) {
super.onError( message, code );
if ( code == 100046 ) {
refreshTicket();
}
Logger.e( TAG, "获取配置失败 msg = %s, code = %s", message, code );
}
} );
}
private void refreshTicket() {
mRefreshTicketCounter++;
Logger.d( TAG, "刷新ticket" );
MarkerServiceHandler.getApis().getPassportManagerApi().requestTicket( new IMogoTicketCallback() {
@Override
public void onTicketGot( String ticket ) {
Logger.d( TAG, "ticket=%s", ticket );
if ( mRefreshTicketCounter < 3 ) {
loadNetworkConfigStrategy();
}
}
@Override
public void onError( int code, String msg ) {
Logger.d( TAG, "code=%s, msg=%s", code, msg );
}
@Override
public void onLoginSuccess( String token, String sn ) {
Logger.d( TAG, "token=%s, sn=%s", token, sn );
}
} );
}
private void handleGotCarAdvertisingList( List< LauncherCardAdvertisementData.LauncherCardAdvertisement > data ) {
@@ -387,6 +472,7 @@ class LauncherCardRefresher {
}
if ( launcherCardAdvertisement.cardType == LauncherCardAdvertisementData.TYPE_DEFAULT_CONFIG ) {
mDefaultLauncherCardConfig = launcherCardAdvertisement;
renderDefaultLauncherCardConfig( true );
} else if ( launcherCardAdvertisement.cardType == LauncherCardAdvertisementData.TYPE_ACTIVITY ) {
long curr = System.currentTimeMillis();
if ( curr > launcherCardAdvertisement.startTime && curr < launcherCardAdvertisement.endTime ) {
@@ -399,8 +485,9 @@ class LauncherCardRefresher {
if ( !mAdvertisements.isEmpty() && mAdvertisements.size() > 1 ) {
LauncherCardAdvertisementData.LauncherCardAdvertisement[] sorted = new LauncherCardAdvertisementData.LauncherCardAdvertisement[mAdvertisements.size()];
sorted = mAdvertisements.toArray( sorted );
Arrays.sort( sorted, ( ( o1, o2 ) -> {
return o1.sort < o2.sort ? 1 : ( o1.sort == o2.sort ? 0 : -1 );
return o1.sort > o2.sort ? 1 : ( o1.sort == o2.sort ? 0 : -1 );
} ) );
mAdvertisements = Arrays.asList( sorted );
}
@@ -415,26 +502,6 @@ class LauncherCardRefresher {
mHandler.sendMessageDelayed( msg, mDefaultTTSPlayInterval );
}
/**
* 开始按策略展示广告
*/
private void startLoopRenderAdvertisements() {
Message msg = Message.obtain();
if ( mAdvertisements == null || mAdvertisements.isEmpty() ) {
return;
} else {
try {
LauncherCardAdvertisementData.LauncherCardAdvertisement advertisement = mAdvertisements.get( 0 );
msg.what = MSG_REFRESH_ADVERTISEMENT;
msg.arg1 = 1;
mHandler.sendMessageDelayed( msg, advertisement.popupNum * ONE_MINUTE );
} catch ( Exception e ) {
e.printStackTrace();
}
}
}
private void loopRenderAdvertisements( int index ) {
try {
index = index % mAdvertisements.size();
@@ -465,6 +532,9 @@ class LauncherCardRefresher {
intent.putExtra( "v2x_card_button_name", advertisement.buttonContent );
intent.putExtra( "v2x_card_startTime", advertisement.startTime );
intent.putExtra( "v2x_card_endTime", advertisement.endTime );
intent.putExtra( "v2x_card_activity_id", advertisement.id );
intent.putExtra( "v2x_card_timeout", 20 * 1000 );
intent.putExtra( "v2x_card_is_default", false );
mContext.sendBroadcast( intent );
if ( !AppUtils.isAppForeground( mContext ) ) {
speakTTS( advertisement.content, true );

View File

@@ -0,0 +1,111 @@
package com.mogo.module.service.marker;
import com.mogo.module.carchattingprovider.ICallProviderResponse;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public
/**
* @author congtaowang
* @since 2020/9/28
*
* 描述
*/
abstract class CallProviderResponseImpl implements ICallProviderResponse {
@Override
public void addFriend( boolean b ) {
}
@Override
public void callInvokeError( @NotNull String s ) {
}
@Override
public void callStatus( int i ) {
}
@Override
public void callWindowStatus( boolean b ) {
}
@Override
public void canCall( boolean b ) {
}
@Override
public void hideUserWindowError( @NotNull String s ) {
}
@Override
public void invisibleUser( boolean b ) {
}
@Override
public void isFriend( boolean b ) {
}
@Override
public void isOnLine( boolean b, @Nullable String s ) {
}
@Override
public void userInfoCallBack( @Nullable String s, @Nullable String s1 ) {
}
@Override
public void userWindowStatus( boolean b ) {
}
@Override
public void call( @NotNull String s ) {
}
@Override
public void cancelMatch( boolean b ) {
}
@Override
public void error( @NotNull String s ) {
}
@Override
public void hangUp( boolean b ) {
}
@Override
public void invokeCallData( @NotNull String s ) {
}
@Override
public void match( @NotNull String s ) {
}
@Override
public void matchInvokeResult( boolean b, @NotNull String s ) {
}
@Override
public void mute( boolean b ) {
}
}

View File

@@ -13,16 +13,12 @@ import androidx.constraintlayout.widget.ConstraintLayout;
import com.mogo.map.marker.MogoMarkerOptions;
import com.mogo.module.common.entity.MarkerExploreWay;
import com.mogo.module.common.entity.MarkerNoveltyInfo;
import com.mogo.module.common.entity.MarkerOnlineCar;
import com.mogo.module.common.entity.MarkerPoiTypeEnum;
import com.mogo.module.common.entity.MarkerShareMusic;
import com.mogo.module.common.entity.MarkerShowEntity;
import com.mogo.module.service.R;
import com.mogo.module.service.ServiceConst;
import java.util.Random;
/**
* author : donghongyu
* e-mail : 1358506549@qq.com
@@ -56,7 +52,7 @@ public class MapMarkerInfoView extends MapMarkerBaseView {
}
protected void initView( Context context ) {
LayoutInflater.from( context ).inflate( R.layout.view_map_marker_info, this );
LayoutInflater.from( context ).inflate( R.layout.modudle_services_marker_layout_info, this );
ivUserHead = findViewById( R.id.ivUserHead );
ivIcon = findViewById( R.id.ivIcon );
clMarkerContent = findViewById( R.id.clMarkerContent );
@@ -94,10 +90,10 @@ public class MapMarkerInfoView extends MapMarkerBaseView {
ivIcon.setImageResource( R.drawable.icon_map_marker_refuel );
break;
case MarkerPoiTypeEnum.TRAFFIC_CHECK:
ivIcon.setImageResource( R.drawable.icon_map_marker_road_check2_light );
ivIcon.setImageResource( R.drawable.icon_map_marker_road_check2_white );
break;
case MarkerPoiTypeEnum.ROAD_CLOSED:
ivIcon.setImageResource( R.drawable.icon_map_marker_road_block_off2_light );
ivIcon.setImageResource( R.drawable.icon_map_marker_road_block_off2_white );
break;
case MarkerPoiTypeEnum.SHOP_DISCOUNT:
ivIcon.setImageResource( R.drawable.icon_map_marker_shop_discount );
@@ -106,40 +102,43 @@ public class MapMarkerInfoView extends MapMarkerBaseView {
ivIcon.setImageResource( R.drawable.icon_map_marker_4s );
break;
case MarkerPoiTypeEnum.FOURS_ROAD_WORK:
ivIcon.setImageResource( R.drawable.icon_map_marker_road_work2_light );
ivIcon.setImageResource( R.drawable.icon_map_marker_road_work2_white );
break;
case MarkerPoiTypeEnum.FOURS_BLOCK_UP:
ivIcon.setImageResource( R.drawable.icon_map_marker_road_block_up2_light );
ivIcon.setImageResource( R.drawable.icon_map_marker_road_block_up2_white );
break;
case MarkerPoiTypeEnum.FOURS_PONDING:
ivIcon.setImageResource( R.drawable.icon_map_marker_pondingl2_light );
ivIcon.setImageResource( R.drawable.icon_map_marker_pondingl2_white );
break;
case MarkerPoiTypeEnum.FOURS_SHOP_FREE:
ivIcon.setImageResource( R.drawable.icon_map_marker_shop );
break;
case MarkerPoiTypeEnum.FOURS_FOG:
ivIcon.setImageResource( R.drawable.module_service_ic_rc_dark_frog2_light );
ivIcon.setImageResource( R.drawable.module_service_ic_rc_dark_frog2_white );
break;
case MarkerPoiTypeEnum.FOURS_ICE:
ivIcon.setImageResource( R.drawable.module_service_ic_rc_freeze2_light );
ivIcon.setImageResource( R.drawable.module_service_ic_rc_freeze2_white );
break;
case MarkerPoiTypeEnum.FOURS_PARKING:
ivIcon.setImageResource( R.drawable.module_service_ic_rc_parking2 );
break;
case MarkerPoiTypeEnum.FOURS_ACCIDENT:
ivIcon.setImageResource( R.drawable.module_service_ic_rc_accident3_light );
ivIcon.setImageResource( R.drawable.module_service_ic_rc_accident3_white );
break;
case MarkerPoiTypeEnum.FOURS_NEALY:
ivIcon.setImageResource( R.drawable.icon_map_marker_shear_news );
break;
case MarkerPoiTypeEnum.FOURS_LIVING:
ivIcon.setImageResource( R.drawable.icon_map_marker_living_light );
ivIcon.setImageResource( R.drawable.icon_map_marker_living_white );
break;
case MarkerPoiTypeEnum.ILLEGAL_PARK_LIVING:
ivIcon.setImageResource( R.drawable.module_service_ic_rc_illegal_park_light );
ivIcon.setImageResource( R.drawable.module_service_ic_rc_illegal_park_white );
break;
case MarkerPoiTypeEnum.ROAD_SLIPPERY:
ivIcon.setImageResource( R.drawable.module_service_ic_rc_road_slippery_light );
break;
default:
ivIcon.setImageResource( R.drawable.icon_map_marker_road_block_up2_light );
ivIcon.setImageResource( R.drawable.icon_map_marker_road_block_up2_white );
break;
}
}

View File

@@ -3,7 +3,6 @@ package com.mogo.module.service.marker;
import android.content.Context;
import android.graphics.Rect;
import android.text.TextUtils;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.LinearInterpolator;
import com.mogo.commons.AbsMogoApplication;
@@ -14,7 +13,9 @@ import com.mogo.map.marker.IMogoMarkerClickListener;
import com.mogo.map.marker.IMogoMarkerManager;
import com.mogo.map.marker.MogoMarkerOptions;
import com.mogo.map.marker.anim.OnMarkerAnimationListener;
import com.mogo.map.uicontroller.EnumMapUI;
import com.mogo.module.common.ModuleNames;
import com.mogo.module.common.api.CallChatApi;
import com.mogo.module.common.entity.MarkerCarPois;
import com.mogo.module.common.entity.MarkerCardResult;
import com.mogo.module.common.entity.MarkerExploreWay;
@@ -24,7 +25,6 @@ import com.mogo.module.common.entity.MarkerOnlineCar;
import com.mogo.module.common.entity.MarkerResponse;
import com.mogo.module.common.entity.MarkerShareMusic;
import com.mogo.module.common.entity.MarkerShowEntity;
import com.mogo.module.common.utils.CarSeries;
import com.mogo.module.service.MarkerServiceHandler;
import com.mogo.module.service.R;
import com.mogo.module.service.ServiceConst;
@@ -32,8 +32,10 @@ import com.mogo.module.service.Utils;
import com.mogo.module.service.network.RefreshCallback;
import com.mogo.module.service.network.RefreshModel;
import com.mogo.module.service.utils.ViewUtils;
import com.mogo.service.adas.IMogoADASControlStatusChangedListener;
import com.mogo.service.connection.IMogoOnMessageListener;
import com.mogo.service.module.IMogoBizActionDoneListener;
import com.mogo.utils.AppUtils;
import com.mogo.utils.ResourcesHelper;
import com.mogo.utils.ThreadPoolService;
import com.mogo.utils.UiThreadHandler;
@@ -58,7 +60,8 @@ import java.util.Map;
*/
public class MapMarkerManager implements IMogoMarkerClickListener,
IMogoOnMessageListener< MarkerResponse >,
IMogoBizActionDoneListener {
IMogoBizActionDoneListener,
IMogoADASControlStatusChangedListener {
private static final String TAG = "MapMarkerManager";
private Context mContext;
@@ -105,15 +108,27 @@ public class MapMarkerManager implements IMogoMarkerClickListener,
mContext = context.getApplicationContext();
mRefreshModel = new RefreshModel( mContext );
// 长连接
MarkerServiceHandler.getMogoSocketManager().registerOnMessageListener( 401001, this );
MarkerServiceHandler.getActionManager().registerBizActionDoneListener( this );
}
MarkerServiceHandler.getApis().getRegisterCenterApi().registerADASControlStatusChangedListener( TAG, this );
// ACC ON 的时候重置为trueACC OFF 设置为 false
// 保留 - 外部模块调用
public void setCheckOn( boolean checkOnLineData ) {
Logger.e( TAG, "do not invoke anymore." );
CallChatApi.getInstance().getApiProvider().registerUserWindowStatusListener( TAG, mContext, new CallProviderResponseImpl() {
@Override
public void userWindowStatus( boolean show ) {
try {
if ( mLastCheckMarker == null ) {
return;
}
if ( TextUtils.equals( mLastCheckMarker.getOwner(), ModuleNames.CARD_TYPE_USER_DATA )
&& !show ) {
closeMarker( mLastCheckMarker );
}
} catch ( Exception e ) {
e.printStackTrace();
}
}
} );
}
/**
@@ -125,6 +140,7 @@ public class MapMarkerManager implements IMogoMarkerClickListener,
try {
boolean result = switchMarkerOpenStatus( marker );
if ( !result ) {
updateCarUserInfoWindow( marker );
return false;
}
@@ -181,11 +197,7 @@ public class MapMarkerManager implements IMogoMarkerClickListener,
mLastCheckMarker = mogoMarker;
// 在线车辆点击使用infoWindow
if ( TextUtils.equals( mogoMarker.getOwner(), ModuleNames.CARD_TYPE_USER_DATA ) ) {
if ( !mogoMarker.isDestroyed() ) {
mogoMarker.setInfoWindowAdapter( UserDataMarkerInfoWindowAdapter.getInstance( mContext ) );
mogoMarker.showInfoWindow();
Logger.d( TAG, "打开info window" );
}
updateCarUserInfoWindow( mogoMarker );
} else {
Object object = mogoMarker.getObject();
if ( object != null ) {
@@ -205,7 +217,22 @@ public class MapMarkerManager implements IMogoMarkerClickListener,
}
}
MarkerServiceHandler.getMogoStatusManager().setUserInteractionStatus( TAG, true, false );
MarkerServiceHandler.getMapUIController().moveToCenter( mogoMarker.getPosition(), CarSeries.getSeries() == CarSeries.CAR_SERIES_F80X );
MarkerServiceHandler.getMapUIController().moveToCenter( mogoMarker.getPosition(), DebugConfig.isRoadEventAnimated() );
}
private void updateCarUserInfoWindow( IMogoMarker marker ) {
if ( marker != null && !marker.isDestroyed() ) {
try {
if ( !TextUtils.equals( marker.getOwner(), ModuleNames.CARD_TYPE_USER_DATA ) ) {
return;
}
marker.setIcon( OnlineCarMarkerView.getInstance().getSelectedBitmap( getCarVehicleType( marker ) ) );
MarkerOnlineCar onlineCar = ( MarkerOnlineCar ) ( ( MarkerShowEntity ) marker.getObject() ).getBindObj();
CallChatApi.getInstance().showUserWindow( mContext, onlineCar );
} catch ( Exception e ) {
Logger.e( TAG, e, "openMarker" );
}
}
}
// 折叠气泡
@@ -215,8 +242,7 @@ public class MapMarkerManager implements IMogoMarkerClickListener,
}
// 在线车辆点击使用infoWindow
if ( TextUtils.equals( mogoMarker.getOwner(), ModuleNames.CARD_TYPE_USER_DATA ) ) {
mogoMarker.hideInfoWindow();
Logger.d( TAG, "关闭info window" );
mogoMarker.setIcon( OnlineCarMarkerView.getInstance().getBitmap( getCarVehicleType( mogoMarker ) ) );
} else {
Object object = mogoMarker.getObject();
if ( object != null ) {
@@ -236,6 +262,17 @@ public class MapMarkerManager implements IMogoMarkerClickListener,
}
}
private int getCarVehicleType( IMogoMarker marker ) {
try {
return ( ( MarkerOnlineCar )
( ( MarkerShowEntity ) marker.getObject() ).getBindObj() )
.getCarInfo()
.getVehicleType();
} catch ( Exception e ) {
return 0;
}
}
// 绘制Marker
public synchronized void drawMapMarker( MarkerResponse response ) {
@@ -450,7 +487,9 @@ public class MapMarkerManager implements IMogoMarkerClickListener,
for ( Object entity : newList ) {
String sn = getPrimaryKeyFromEntity( entity );
if ( allMap.containsKey( sn ) ) {
existMap.put( sn, allMap.get( sn ) );
if ( !isNewVehicleType( entity, allMap.get( sn ) ) ) {
existMap.put( sn, allMap.get( sn ) );
}
}
}
for ( String sn : allMap.keySet() ) {
@@ -465,6 +504,21 @@ public class MapMarkerManager implements IMogoMarkerClickListener,
return existMap;
}
private boolean isNewVehicleType( Object object, IMogoMarker marker ) {
if ( object instanceof MarkerOnlineCar
&& marker != null
&& marker.getObject() instanceof MarkerShowEntity
&& ( ( MarkerShowEntity ) marker.getObject() ).getBindObj() instanceof MarkerOnlineCar ) {
try {
return ( ( MarkerOnlineCar ) object ).getCarInfo().getVehicleType()
!= ( ( MarkerOnlineCar ) ( ( MarkerShowEntity ) marker.getObject() ).getBindObj() ).getCarInfo().getVehicleType();
} catch ( Exception e ) {
}
}
return false;
}
private String getPrimaryKeyFromEntity( Object entity ) {
if ( entity instanceof MarkerExploreWay ) {
String id = ( ( MarkerExploreWay ) entity ).getInfoId();
@@ -651,7 +705,7 @@ public class MapMarkerManager implements IMogoMarkerClickListener,
try {
return drawMapMarkerImpl( markerShowEntity, zIndex );
} catch ( Exception e ) {
e.printStackTrace();
Logger.e( TAG, e, "drawMapMarker" );
return null;
}
}
@@ -698,6 +752,16 @@ public class MapMarkerManager implements IMogoMarkerClickListener,
} );
}
public void onSyncMarkerResponse( MarkerResponse response ) {
if ( ignoreDrawRequest() ) {
return;
}
Logger.d( TAG, "接收到了地图大而全数据" );
runOnTargetThread( () -> {
drawMapMarker( response );
} );
}
public void syncLocation( double lon, double lat ) {
mCarLatLng = new MogoLatLng( lat, lon );
}
@@ -777,7 +841,7 @@ public class MapMarkerManager implements IMogoMarkerClickListener,
}
Logger.d( TAG, "内部 - 请求开始" );
mRefreshModel.queryOnLineCarWithRoute( latLng, onlyFocus, onlySameCity, radius, limit, new RefreshCallback() {
mRefreshModel.queryOnLineCarWithRoute( latLng, onlyFocus, onlySameCity, radius, limit, false, new RefreshCallback() {
@Override
public void onSuccess( Object o ) {
MarkerResponse data = ( MarkerResponse ) o;
@@ -847,6 +911,9 @@ public class MapMarkerManager implements IMogoMarkerClickListener,
// 平滑移动
private void startSmooth( IMogoMarker iMogoMarker, MarkerOnlineCar markerOnlineCar,
MarkerLocation markerLocation ) {
if ( iMogoMarker == null ) {
return;
}
List< MarkerCarPois > poiList = markerOnlineCar.getPois();
if ( filterErrorPoint( poiList ) ) {
return;
@@ -949,4 +1016,20 @@ public class MapMarkerManager implements IMogoMarkerClickListener,
}
}
}
@Override
public void onMapUiModeChanged( EnumMapUI mapUI ) {
switch ( mapUI ) {
case Type_Light:
case Type_Night:
if ( mLastDataResult != null ) {
runOnTargetThread( () -> {
MarkerServiceHandler.getMarkerManager().removeMarkers( ModuleNames.CARD_TYPE_ROAD_CONDITION );
drawMarkerByCurrentType( mLastDataResult );
mLastCheckMarker = null;
} );
}
break;
}
}
}

View File

@@ -3,7 +3,6 @@ package com.mogo.module.service.marker;
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.widget.ImageView;
import androidx.annotation.Nullable;
@@ -43,7 +42,7 @@ public class MapMarkerView extends MapMarkerBaseView {
}
protected void initView( Context context ) {
LayoutInflater.from( context ).inflate( R.layout.view_map_marker, this );
LayoutInflater.from( context ).inflate( R.layout.modudle_services_marker_layout, this );
ivIcon = findViewById( R.id.ivIcon );
ivCar = findViewById( R.id.ivCar );
}
@@ -101,6 +100,9 @@ public class MapMarkerView extends MapMarkerBaseView {
case MarkerPoiTypeEnum.ILLEGAL_PARK_LIVING:
ivIcon.setImageResource( R.drawable.module_service_ic_rc_illegal_park );
break;
case MarkerPoiTypeEnum.ROAD_SLIPPERY:
ivIcon.setImageResource( R.drawable.module_service_ic_rc_road_slippery );
break;
case MarkerPoiTypeEnum.FOURS_PARKING:
default:
ivIcon.setImageResource( R.drawable.icon_map_marker_road_block_up2 );

View File

@@ -22,6 +22,7 @@ import java.util.Map;
public class OnlineCarMarkerView implements IMarkerView {
private static Map< Integer, SoftReference< Bitmap > > sRef = new HashMap<>();
private static Map< Integer, SoftReference< Bitmap > > sTypedRef = new HashMap<>();
private OnlineCarMarkerView() {
// private constructor
@@ -50,8 +51,20 @@ public class OnlineCarMarkerView implements IMarkerView {
if ( sRef.get( vehicleType ) == null || sRef.get( vehicleType ).get() == null
|| sRef.get( vehicleType ).get().isRecycled() ) {
switch ( vehicleType ) {
case 5:
sRef.put( vehicleType, new SoftReference<>( BitmapFactory.decodeResource( AbsMogoApplication.getApp().getResources(), R.drawable.icon_map_marker_car_type_taxi ) ) );
break;
case 6:
sRef.put( vehicleType, new SoftReference<>( BitmapFactory.decodeResource( AbsMogoApplication.getApp().getResources(), R.drawable.icon_map_marker_car_type_bus ) ) );
break;
case 1:
sRef.put( vehicleType, new SoftReference<>( BitmapFactory.decodeResource( AbsMogoApplication.getApp().getResources(), R.drawable.icon_map_marker_car_type_110 ) ) );
break;
case 2:
sRef.put( vehicleType, new SoftReference<>( BitmapFactory.decodeResource( AbsMogoApplication.getApp().getResources(), R.drawable.icon_map_marker_car_type2 ) ) );
sRef.put( vehicleType, new SoftReference<>( BitmapFactory.decodeResource( AbsMogoApplication.getApp().getResources(), R.drawable.icon_map_marker_car_type_120 ) ) );
break;
case 7:
sRef.put( vehicleType, new SoftReference<>( BitmapFactory.decodeResource( AbsMogoApplication.getApp().getResources(), R.drawable.icon_map_marker_car_type_119 ) ) );
break;
default:
sRef.put( vehicleType, new SoftReference<>( BitmapFactory.decodeResource( AbsMogoApplication.getApp().getResources(), R.drawable.icon_map_marker_car_gray ) ) );
@@ -60,6 +73,20 @@ public class OnlineCarMarkerView implements IMarkerView {
return sRef.get( vehicleType ).get();
}
public Bitmap getSelectedBitmap( int vehicleType ) {
if ( sTypedRef.get( vehicleType ) == null || sTypedRef.get( vehicleType ).get() == null
|| sTypedRef.get( vehicleType ).get().isRecycled() ) {
switch ( vehicleType ) {
case 2:
sTypedRef.put( vehicleType, new SoftReference<>( BitmapFactory.decodeResource( AbsMogoApplication.getApp().getResources(), R.drawable.icon_map_marker_car_type2 ) ) );
break;
default:
sTypedRef.put( vehicleType, new SoftReference<>( BitmapFactory.decodeResource( AbsMogoApplication.getApp().getResources(), R.drawable.icon_map_marker_car_gray_selected ) ) );
}
}
return sTypedRef.get( vehicleType ).get();
}
@Override
public void setMarker( IMogoMarker marker ) {

View File

@@ -8,7 +8,6 @@ import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import com.alibaba.android.arouter.launcher.ARouter;
import com.mogo.commons.debug.DebugConfig;
import com.mogo.commons.network.SubscribeImpl;
import com.mogo.map.marker.IMogoInfoWindowAdapter;
@@ -22,7 +21,6 @@ import com.mogo.module.service.R;
import com.mogo.module.service.network.RefreshApiService;
import com.mogo.module.service.network.RefreshModel;
import com.mogo.module.service.network.bean.DemoUserInfoEntity;
import com.mogo.service.MogoServicePaths;
import com.mogo.service.imageloader.MogoImageView;
import com.mogo.service.network.IMogoNetwork;
import com.mogo.utils.UiThreadHandler;
@@ -92,7 +90,7 @@ public class UserDataMarkerInfoWindowAdapter implements IMogoInfoWindowAdapter {
}
if ( mInfoWindowView == null ) {
mInfoWindowView = LayoutInflater.from( mContext ).inflate( R.layout.view_map_data_user_info_window, null );
mInfoWindowView = LayoutInflater.from( mContext ).inflate( R.layout.modudle_services_marker_info_window_layout, null );
mContentContainer = mInfoWindowView.findViewById( R.id.module_service_id_marker_content );
mUserHeader = mInfoWindowView.findViewById( R.id.module_service_id_user_header );
mContent = mInfoWindowView.findViewById( R.id.module_service_id_content );

View File

@@ -3,6 +3,7 @@ package com.mogo.module.service.network;
import com.mogo.commons.data.BaseData;
import com.mogo.module.common.entity.MarkerResponse;
import com.mogo.module.service.network.bean.DemoUserInfoEntity;
import com.mogo.module.service.network.bean.HomeCompanyDistanceForPushResponse;
import java.util.Map;
@@ -37,4 +38,8 @@ public interface RefreshApiService {
*/
@GET( "/yycp-launcherSnapshot/mock/getMockUserInfos" )
Observable< DemoUserInfoEntity > getMockUsers();
@FormUrlEncoded
@POST("/yycp-travel-condition/trajectoryPrediction/calculationNotHomeCompanyDistanceForPush")
Observable< HomeCompanyDistanceForPushResponse > calculationNotHomeCompanyDistanceForPush( @FieldMap Map< String, Object > parameters);
}

View File

@@ -20,6 +20,7 @@ public class RefreshBody {
public boolean onlyFocus; // 是否仅查询已关注的好友
public boolean onlySameCity; // 是否仅查询注册城市相同的同城用户
public boolean viewPush; // 是否走V2X通道 true-401011false -401001
public boolean onlyRealUser;
public static class LatLon {

View File

@@ -65,13 +65,14 @@ public class RefreshModel {
}
}
public void refreshData( MogoLatLng latLng, int radius, int limit, final RefreshCallback callback ) {
public void refreshExplorerWayData( MogoLatLng latLng, int radius, int limit, final RefreshCallback callback ) {
if ( mRefreshApiService != null ) {
final Map< String, Object > query = new ParamsProvider.Builder( mContext ).build();
final RefreshBody refreshBody = new RefreshBody();
refreshBody.limit = limit;
refreshBody.location = new RefreshBody.LatLon( latLng.lat, latLng.lng );
refreshBody.radius = radius;
refreshBody.viewPush = true;
refreshBody.dataType.add( ServiceConst.CARD_TYPE_ROAD_CONDITION );
String data = GsonUtil.jsonFromObject( refreshBody );
@@ -79,12 +80,12 @@ public class RefreshModel {
Logger.d( TAG, data );
mRefreshApiService.refreshData( query )
mRefreshApiService.refreshDataSync( query )
.subscribeOn( Schedulers.io() )
.observeOn( AndroidSchedulers.mainThread() )
.subscribe( new SubscribeImpl< BaseData >( RequestOptions.create( mContext ) ) {
.subscribe( new SubscribeImpl< MarkerResponse >( RequestOptions.create( mContext ) ) {
@Override
public void onSuccess( BaseData o ) {
public void onSuccess( MarkerResponse o ) {
super.onSuccess( o );
if ( callback != null ) {
callback.onSuccess( o );
@@ -110,7 +111,7 @@ public class RefreshModel {
}
}
public void refreshDataSync( MogoLatLng latLng, int radius, int limit, final RefreshCallback callback ) {
public void refreshLauncherCardDataSync( MogoLatLng latLng, int radius, int limit, final RefreshCallback callback ) {
if ( mRefreshApiService != null ) {
final Map< String, Object > query = new ParamsProvider.Builder( mContext ).build();
final RefreshBody refreshBody = new RefreshBody();
@@ -124,7 +125,6 @@ public class RefreshModel {
query.put( "data", data );
Logger.d( TAG, data );
mRefreshApiService.refreshDataSync( query )
.subscribeOn( Schedulers.io() )
.observeOn( AndroidSchedulers.mainThread() )
@@ -163,12 +163,14 @@ public class RefreshModel {
* @param onlyFocus 是否仅查询已关注的好友
* @param onlySameCity 是否仅查询注册城市相同的同城用户
* @param callback
* @param onlyRealUser 是否只查询真实用户
*/
public void queryOnLineCarWithRoute( MogoLatLng latLng,
boolean onlyFocus,
boolean onlySameCity,
int radius,
int limit,
boolean onlyRealUser,
final RefreshCallback callback ) {
if ( mRefreshApiService != null ) {
final Map< String, Object > query = new ParamsProvider.Builder( mContext ).build();
@@ -181,6 +183,7 @@ public class RefreshModel {
refreshBody.location = new RefreshBody.LatLon( latLng.lat, latLng.lng );
refreshBody.onlyFocus = onlyFocus;
refreshBody.onlySameCity = onlySameCity;
refreshBody.onlyRealUser = onlyRealUser;
refreshBody.dataType.add( ServiceConst.CARD_TYPE_USER_DATA );
query.put( "data", GsonUtil.jsonFromObject( refreshBody ) );
@@ -196,6 +199,14 @@ public class RefreshModel {
}
}
@Override
public void onError( Throwable e ) {
super.onError( e );
if ( callback != null ) {
callback.onFail();
}
}
@Override
public void onError( String message, int code ) {
super.onError( message, code );

View File

@@ -0,0 +1,14 @@
package com.mogo.module.service.network.bean;
public
/**
* @author congtaowang
* @since 2020/9/22
*
* 描述
*/
class HomeCompanyDistanceForPushData {
public double lon;
public double lat;
}

View File

@@ -0,0 +1,19 @@
package com.mogo.module.service.network.bean;
import com.mogo.commons.data.BaseData;
public
/**
* @author congtaowang
* @since 2020/9/22
*
* 描述
*/
class HomeCompanyDistanceForPushResponse extends BaseData {
public HomeCompanyDistanceForPushResult result;
public static class HomeCompanyDistanceForPushResult {
public boolean pushFlag;
}
}

View File

@@ -32,6 +32,7 @@ class LauncherCardAdvertisementData extends BaseData {
* 活动展示顺序 sort
*/
public static class LauncherCardAdvertisement {
public String id;
public String name;
public int cardType;
public String filePath;

View File

@@ -0,0 +1,15 @@
package com.mogo.module.service.onlinecar.panel;
import androidx.fragment.app.FragmentActivity;
/**
* @author congtaowang
* @since 2020/9/21
* <p>
* 描述
*/
class ContainerHandler {
public static int sContainerId = 0;
public static FragmentActivity sAttachContext;
}

View File

@@ -0,0 +1,27 @@
package com.mogo.module.service.onlinecar.panel;
import com.mogo.commons.mvp.IView;
import com.mogo.module.common.entity.MarkerOnlineCar;
import java.util.List;
/**
* @author congtaowang
* @since 2020/9/21
* <p>
* 描述
*/
interface IOnlineCarPanelView extends IView {
void showLoading(boolean visible);
void renderOnlineCarList( List< MarkerOnlineCar > onlineCars, double lon, double lat );
void renderEmptyUi( OnlineCarStrategy strategy );
void renderNoNavigationInfoUi();
void renderErrorUi();
void removeSelf();
}

View File

@@ -0,0 +1,85 @@
package com.mogo.module.service.onlinecar.panel;
public
/**
* @author congtaowang
* @since 2020/9/21
* <p>
* 描述
*/
class NavigationTargetInfo {
/**
* FromPoiName : 东城区小黄庄北街2号
* FromPoiAddr : 在中国银行(北京安贞桥支行)附近
* FromPoiLongitude : 116.41082763671875
* FromPoiLatitude : 39.96831130981445
* ToPoiName : 北京市北京市北小营镇宏大工业开发中心A座7号
* ToPoiLongitude : 116.74490356445312
* ToPoiLatitude : 40.19820785522461
*/
private String FromPoiName;
private String FromPoiAddr;
private String FromPoiLongitude;
private String FromPoiLatitude;
private String ToPoiName;
private String ToPoiLongitude;
private String ToPoiLatitude;
public String getFromPoiName() {
return FromPoiName;
}
public void setFromPoiName( String FromPoiName ) {
this.FromPoiName = FromPoiName;
}
public String getFromPoiAddr() {
return FromPoiAddr;
}
public void setFromPoiAddr( String FromPoiAddr ) {
this.FromPoiAddr = FromPoiAddr;
}
public String getFromPoiLongitude() {
return FromPoiLongitude;
}
public void setFromPoiLongitude( String FromPoiLongitude ) {
this.FromPoiLongitude = FromPoiLongitude;
}
public String getFromPoiLatitude() {
return FromPoiLatitude;
}
public void setFromPoiLatitude( String FromPoiLatitude ) {
this.FromPoiLatitude = FromPoiLatitude;
}
public String getToPoiName() {
return ToPoiName;
}
public void setToPoiName( String ToPoiName ) {
this.ToPoiName = ToPoiName;
}
public String getToPoiLongitude() {
return ToPoiLongitude;
}
public void setToPoiLongitude( String ToPoiLongitude ) {
this.ToPoiLongitude = ToPoiLongitude;
}
public String getToPoiLatitude() {
return ToPoiLatitude;
}
public void setToPoiLatitude( String ToPoiLatitude ) {
this.ToPoiLatitude = ToPoiLatitude;
}
}

View File

@@ -0,0 +1,71 @@
package com.mogo.module.service.onlinecar.panel;
import android.content.Context;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import com.alibaba.android.arouter.facade.annotation.Route;
import com.mogo.service.MogoServicePaths;
import com.mogo.service.strategy.IMogoOnlineCarListPanelProvider;
import com.mogo.utils.logger.Logger;
public
/**
* @author congtaowang
* @since 2020/9/21
*
* 描述
*/
@Route( path = MogoServicePaths.PATH_ONLINE_CAR_PANEL )
class OnlineCarListPanelProvider implements IMogoOnlineCarListPanelProvider {
private static final String TAG = "OnlineCarListPanelProvider";
@Override
public void initContainer( int containerId, FragmentActivity activity ) {
ContainerHandler.sContainerId = containerId;
ContainerHandler.sAttachContext = activity;
}
@Override
public void showPanel() {
if ( ContainerHandler.sAttachContext == null ) {
return;
}
Fragment fragment = new OnlineCarPanelFragment();
Logger.d( TAG, "showPanel" );
ContainerHandler.sAttachContext
.getSupportFragmentManager()
.beginTransaction()
.replace( ContainerHandler.sContainerId, fragment, TAG )
.commitNowAllowingStateLoss();
}
@Override
public void hidePanel() {
if ( ContainerHandler.sAttachContext == null ) {
return;
}
Logger.d( TAG, "hidePanel" );
Fragment fragment = ContainerHandler.sAttachContext.getSupportFragmentManager().findFragmentByTag( TAG );
if ( fragment != null ) {
ContainerHandler.sAttachContext
.getSupportFragmentManager()
.beginTransaction()
.remove( fragment )
.commitNowAllowingStateLoss();
}
}
@Override
public void clear() {
ContainerHandler.sContainerId = 0;
ContainerHandler.sAttachContext = null;
}
@Override
public void init( Context context ) {
}
}

View File

@@ -0,0 +1,118 @@
package com.mogo.module.service.onlinecar.panel;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.request.RequestOptions;
import com.mogo.map.location.MogoLocation;
import com.mogo.module.common.MogoApisHandler;
import com.mogo.module.common.api.CallChatApi;
import com.mogo.module.common.entity.MarkerLocation;
import com.mogo.module.common.entity.MarkerOnlineCar;
import com.mogo.module.common.glide.SkinAbleBitmapTarget;
import com.mogo.module.service.MarkerServiceHandler;
import com.mogo.module.service.R;
import com.mogo.module.service.Utils;
import com.mogo.utils.ResourcesHelper;
import com.mogo.utils.WindowUtils;
import com.mogo.utils.glide.GlideApp;
import com.mogo.utils.logger.Logger;
import java.util.List;
/**
* @author congtaowang
* @since 2020/9/21
* <p>
* 描述
*/
class OnlineCarPanelAdapter extends RecyclerView.Adapter< OnlineCarPanelAdapter.VH > {
private static final String TAG = "OnlineCarPanelAdapter";
private List< MarkerOnlineCar > mDatums;
private double mToLon;
private double mToLat;
public OnlineCarPanelAdapter( List< MarkerOnlineCar > mDatums, double mToLon, double mToLat ) {
this.mDatums = mDatums;
this.mToLon = mToLon;
this.mToLat = mToLat;
}
public void setDatums( List< MarkerOnlineCar > mDatums ) {
this.mDatums = mDatums;
notifyDataSetChanged();
}
@NonNull
@Override
public OnlineCarPanelAdapter.VH onCreateViewHolder( @NonNull ViewGroup parent, int viewType ) {
return new VH( LayoutInflater.from( parent.getContext() ).inflate( R.layout.module_services_online_car_panel_item, null ) );
}
@Override
public void onBindViewHolder( @NonNull OnlineCarPanelAdapter.VH holder, int position ) {
holder.bind( mDatums.get( position ), mToLon, mToLat );
}
@Override
public int getItemCount() {
return mDatums == null ? 0 : mDatums.size();
}
public static class VH extends RecyclerView.ViewHolder {
private ImageView avatar;
private TextView nickname;
private TextView distance;
private TextView detail;
public VH( @NonNull View itemView ) {
super( itemView );
RecyclerView.LayoutParams params = new RecyclerView.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT );
params.bottomMargin = ResourcesHelper.getDimensionPixelSize( itemView.getContext(), R.dimen.module_services_panel_item_marginBottom );
itemView.setLayoutParams( params );
avatar = itemView.findViewById( R.id.module_services_id_panel_item_avatar );
nickname = itemView.findViewById( R.id.module_services_id_panel_item_nickname );
distance = itemView.findViewById( R.id.module_services_id_panel_item_distance );
detail = itemView.findViewById( R.id.module_services_id_panel_item_detail );
}
public void bind( MarkerOnlineCar car, double lon, double lat ) {
RequestOptions options = new RequestOptions().circleCrop().placeholder( R.drawable.module_common_default_user_head ).error( R.drawable.module_common_default_user_head );
GlideApp.with( itemView.getContext() ).asBitmap().apply( options ).load( car.getUserInfo().getUserHead() ).into( new SkinAbleBitmapTarget( avatar, options ) );
nickname.setText( car.getUserInfo().getUserName() );
String content = getDistanceStr( car.getLocation(), lon, lat );
distance.setText( content );
detail.setOnClickListener( view -> {
MogoApisHandler.getInstance().getApis().getAnalyticsApi().track( "Mogoer_List_click", null );
try {
CallChatApi.getInstance().showUserWindow( itemView.getContext(), car );
} catch ( Exception e ) {
Logger.e( TAG, e, "detail.OnClick" );
}
} );
}
private String getDistanceStr( MarkerLocation location, double lon, double lat ) {
if ( location == null ) {
return "未知";
}
float distance = Utils.calculateLineDistance( location.getLon(), location.getLat(), lon, lat );
if ( distance >= 1000 ) {
return String.format( "%.1fKM", distance / 1000 );
} else {
return String.format( "%.1fM", distance );
}
}
}
}

View File

@@ -0,0 +1,183 @@
package com.mogo.module.service.onlinecar.panel;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.mogo.commons.mvp.MvpFragment;
import com.mogo.commons.voice.AIAssist;
import com.mogo.module.common.MogoApisHandler;
import com.mogo.module.common.entity.MarkerOnlineCar;
import com.mogo.module.common.view.OnPreventFastClickListener;
import com.mogo.module.service.MarkerServiceHandler;
import com.mogo.module.service.R;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author congtaowang
* @since 2020/9/21
* <p>
* 描述
*/
public class OnlineCarPanelFragment extends MvpFragment< IOnlineCarPanelView, OnlineCarPanelPresenter > implements IOnlineCarPanelView {
private RecyclerView mList;
private View mErrorPanel;
private View mRefreshPanel;
private TextView mEmptyTip;
private View m20KMStrategy;
private View m40KMStrategy;
private ProgressBar mLoading;
private OnlineCarPanelAdapter mOnlineCarPanelAdapter;
@Override
protected int getLayoutId() {
return R.layout.module_services_fragment_online_car_panel;
}
@Override
protected void initViews() {
findViewById( R.id.module_services_id_close ).setOnClickListener( new OnPreventFastClickListener() {
@Override
public void onClickImpl( View v ) {
removeSelf();
}
} );
mList = findViewById( R.id.module_services_id_recycler_view );
mRefreshPanel = findViewById( R.id.module_services_id_load_strategy_container );
mErrorPanel = findViewById( R.id.module_services_id_error_container );
m20KMStrategy = findViewById( R.id.module_services_id_20Km_radius );
m40KMStrategy = findViewById( R.id.module_services_id_40Km_radius );
mEmptyTip = findViewById( R.id.module_services_empty_tip );
mLoading = findViewById( R.id.module_services_id_loading );
mList.setLayoutManager( new LinearLayoutManager( getContext(), LinearLayoutManager.VERTICAL, false ) );
m20KMStrategy.setOnClickListener( new OnPreventFastClickListener() {
@Override
public void onClickImpl( View v ) {
mPresenter.next20KMStrategy();
}
} );
m40KMStrategy.setOnClickListener( new OnPreventFastClickListener() {
@Override
public void onClickImpl( View v ) {
mPresenter.next40KMStrategy();
}
} );
mErrorPanel.setOnClickListener( new OnPreventFastClickListener() {
@Override
public void onClickImpl( View v ) {
mPresenter.loadOnlineCar();
}
} );
mRootView.setOnClickListener( view -> {
} );
}
public void refreshPanel() {
mPresenter.refreshPanel();
}
@Override
public void showLoading( boolean visible ) {
if ( visible ) {
mRefreshPanel.setVisibility( View.GONE );
mList.setVisibility( View.GONE );
mErrorPanel.setVisibility( View.GONE );
mLoading.setVisibility( View.VISIBLE );
} else {
mLoading.setVisibility( View.GONE );
}
}
@NonNull
@Override
protected OnlineCarPanelPresenter createPresenter() {
return new OnlineCarPanelPresenter( this );
}
@Override
public void renderOnlineCarList( List< MarkerOnlineCar > onlineCars, double lon, double lat ) {
mRefreshPanel.setVisibility( View.GONE );
mErrorPanel.setVisibility( View.GONE );
mList.setVisibility( View.VISIBLE );
mLoading.setVisibility( View.GONE );
if ( mOnlineCarPanelAdapter == null ) {
mOnlineCarPanelAdapter = new OnlineCarPanelAdapter( onlineCars, lon, lat );
mList.setAdapter( mOnlineCarPanelAdapter );
} else {
mOnlineCarPanelAdapter.setDatums( onlineCars );
}
AIAssist.getInstance( getContext() ).speakTTSVoice( String.format( "为您找到%s个车友", onlineCars.size() ) );
Map< String, Object > properties = new HashMap<>();
properties.put( "number", onlineCars.size() );
MogoApisHandler.getInstance().getApis().getAnalyticsApi().track( "Mogoer_List_number", properties );
}
@Override
public void renderEmptyUi( OnlineCarStrategy strategy ) {
mErrorPanel.setVisibility( View.GONE );
mList.setVisibility( View.GONE );
mRefreshPanel.setVisibility( View.VISIBLE );
mLoading.setVisibility( View.GONE );
AIAssist.getInstance( getContext() ).speakTTSVoice( "未找到车友" );
if ( strategy == null ) {
m20KMStrategy.setVisibility( View.GONE );
m40KMStrategy.setVisibility( View.GONE );
mEmptyTip.setText( getString( R.string.module_services_online_car_panel_empty_tmpl, OnlineCarStrategy.Strategy3.getRadiusKM() ) );
} else {
switch ( strategy ) {
case Strategy3:
m20KMStrategy.setVisibility( View.GONE );
m40KMStrategy.setVisibility( View.GONE );
case Strategy2:
m20KMStrategy.setVisibility( View.GONE );
case Default:
break;
}
mEmptyTip.setText( getString( R.string.module_services_online_car_panel_empty_tmpl, strategy.getRadiusKM() ) );
}
}
@Override
public void renderNoNavigationInfoUi() {
mList.setVisibility( View.GONE );
mRefreshPanel.setVisibility( View.GONE );
mErrorPanel.setVisibility( View.VISIBLE );
mLoading.setVisibility( View.GONE );
}
@Override
public void renderErrorUi() {
mList.setVisibility( View.GONE );
mRefreshPanel.setVisibility( View.GONE );
mLoading.setVisibility( View.GONE );
mErrorPanel.setVisibility( View.VISIBLE );
}
@Override
public void removeSelf() {
MarkerServiceHandler.getApis().getOnlineCarPanelApi().hidePanel();
}
@Override
public void onDestroyView() {
if ( mPresenter != null ) {
mPresenter.destroy();
}
super.onDestroyView();
}
}

View File

@@ -0,0 +1,122 @@
package com.mogo.module.service.onlinecar.panel;
import android.text.TextUtils;
import androidx.annotation.NonNull;
import androidx.lifecycle.LifecycleOwner;
import com.mogo.commons.mvp.Presenter;
import com.mogo.commons.storage.SpStorage;
import com.mogo.map.IDestroyable;
import com.mogo.map.MogoLatLng;
import com.mogo.map.navi.IMogoNaviListener2;
import com.mogo.module.common.MogoApisHandler;
import com.mogo.module.common.entity.MarkerResponse;
import com.mogo.module.service.network.RefreshCallback;
import com.mogo.module.service.network.RefreshModel;
import com.mogo.utils.logger.Logger;
import com.mogo.utils.network.utils.GsonUtil;
/**
* @author congtaowang
* @since 2020/9/21
* <p>
* 描述
*/
class OnlineCarPanelPresenter extends Presenter< IOnlineCarPanelView > implements
RefreshCallback< MarkerResponse >,
IMogoNaviListener2,
IDestroyable {
private static final String TAG = "OnlineCarPanelPresenter";
public static final int LIMIT = 20;
private RefreshModel mRefreshModel;
private OnlineCarStrategy mStrategy;
private NavigationTargetInfo mNavigationTargetInfo;
private Double mToLat;
private Double mToLon;
public OnlineCarPanelPresenter( IOnlineCarPanelView view ) {
super( view );
mRefreshModel = new RefreshModel( getContext() );
MogoApisHandler.getInstance().getApis().getRegisterCenterApi().registerMogoNaviListener( TAG, this );
}
@Override
public void onStopNavi() {
mView.removeSelf();
}
@Override
public void onCreate( @NonNull LifecycleOwner owner ) {
super.onCreate( owner );
refreshPanel();
}
public void next20KMStrategy() {
mStrategy = OnlineCarStrategy.Strategy2;
loadOnlineCar();
}
public void next40KMStrategy() {
mStrategy = OnlineCarStrategy.Strategy3;
loadOnlineCar();
}
public void refreshPanel() {
mStrategy = OnlineCarStrategy.Default;
String json = SpStorage.getNavigationTarget();
if ( TextUtils.isEmpty( json ) ) {
mView.renderNoNavigationInfoUi();
return;
}
Logger.d( TAG, json );
mNavigationTargetInfo = GsonUtil.objectFromJson( json, NavigationTargetInfo.class );
loadOnlineCar();
}
public void loadOnlineCar() {
if ( mNavigationTargetInfo == null ) {
mView.renderNoNavigationInfoUi();
return;
}
mView.showLoading( true );
try {
mToLat = Double.valueOf( mNavigationTargetInfo.getToPoiLatitude() );
mToLon = Double.valueOf( mNavigationTargetInfo.getToPoiLongitude() );
mRefreshModel.queryOnLineCarWithRoute( new MogoLatLng( mToLat, mToLon ),
false,
false,
mStrategy.getRadius(),
LIMIT,
true,
this
);
} catch ( Exception e ) {
mView.renderNoNavigationInfoUi();
}
}
@Override
public void onSuccess( MarkerResponse o ) {
if ( o == null
|| o.getResult() == null
|| o.getResult().getOnlineCar() == null
|| o.getResult().getOnlineCar().isEmpty() ) {
mView.renderEmptyUi( mStrategy );
} else {
mView.renderOnlineCarList( o.getResult().getOnlineCar(), mToLon, mToLat );
}
}
@Override
public void onFail() {
mView.renderErrorUi();
}
@Override
public void destroy() {
MogoApisHandler.getInstance().getApis().getRegisterCenterApi().unregisterMogoNaviListener( TAG );
}
}

View File

@@ -0,0 +1,35 @@
package com.mogo.module.service.onlinecar.panel;
/**
* @author congtaowang
* @since 2020/9/21
* <p>
* 描述
*/
enum OnlineCarStrategy {
Strategy3( 40_000, null ),
Strategy2( 20_000, Strategy3 ),
Default( 10_000, Strategy2 ),
;
private int radius;
private OnlineCarStrategy next;
OnlineCarStrategy( int radius, OnlineCarStrategy next ) {
this.radius = radius;
this.next = next;
}
public int getRadius() {
return radius;
}
public int getRadiusKM() {
return radius / 1000;
}
public OnlineCarStrategy getNext() {
return next;
}
}