顺义分支和dev分支合并

This commit is contained in:
wangcongtao
2020-08-19 14:54:15 +08:00
1564 changed files with 61672 additions and 2947 deletions

View File

@@ -63,8 +63,6 @@ public class MarkerServiceHandler {
private static ICarsChattingProvider sCarChatting;
private static IMogoGpsSimulatorManager sGpsSimulatorManager;
private static MapMarkerManager sMapMarkerManager;
public static synchronized void init( final Context context ) {
if ( sGpsSimulatorManager != null ) {
@@ -92,8 +90,7 @@ public class MarkerServiceHandler {
sCarChatting = ( ICarsChattingProvider ) ARouter.getInstance().build( CallChattingProviderConstant.CAR_CALL_PROVIDER ).navigation( context );
sMapMarkerManager = MapMarkerManager.getInstance();
sMapMarkerManager.init( context );
MapMarkerManager.getInstance().init( context );
sGpsSimulatorManager = ARouter.getInstance().navigation( IMogoGpsSimulatorManager.class );
}
@@ -143,7 +140,7 @@ public class MarkerServiceHandler {
}
public static MapMarkerManager getMapMarkerManager() {
return sMapMarkerManager;
return MapMarkerManager.getInstance();
}
public static IMogoRegisterCenter getRegisterCenter() {

View File

@@ -2,58 +2,24 @@ package com.mogo.module.service;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.text.TextUtils;
import android.view.MotionEvent;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import com.alibaba.android.arouter.facade.annotation.Route;
import com.alibaba.android.arouter.launcher.ARouter;
import com.mogo.commons.AbsMogoApplication;
import com.mogo.map.MogoLatLng;
import com.mogo.map.listener.IMogoMapListener;
import com.mogo.map.location.IMogoLocationListener;
import com.mogo.map.location.MogoLocation;
import com.mogo.map.marker.IMogoMarkerClickListener;
import com.mogo.map.marker.IMogoMarkerManager;
import com.mogo.map.model.MogoPoi;
import com.mogo.map.navi.IMogoNaviListener;
import com.mogo.map.navi.MogoNaviInfo;
import com.mogo.map.navi.MogoTraffic;
import com.mogo.map.uicontroller.EnumMapUI;
import com.mogo.map.uicontroller.IMogoMapUIController;
import com.mogo.module.common.MogoModule;
import com.mogo.module.common.MogoModulePaths;
import com.mogo.module.service.network.RefreshCallback;
import com.mogo.module.service.network.RefreshModel;
import com.mogo.module.service.receiver.MogoReceiver;
import com.mogo.module.service.refresh.AutoRefreshStrategy;
import com.mogo.module.service.refresh.CustomRefreshStrategy;
import com.mogo.service.MogoServicePaths;
import com.mogo.service.intent.IMogoIntentListener;
import com.mogo.service.intent.IMogoIntentManager;
import com.mogo.service.map.IMogoMapService;
import com.mogo.service.module.IMogoModuleLifecycle;
import com.mogo.service.module.IMogoModuleProvider;
import com.mogo.service.module.IMogoRegisterCenter;
import com.mogo.service.module.ModuleType;
import com.mogo.service.statusmanager.IMogoStatusChangedListener;
import com.mogo.service.statusmanager.IMogoStatusManager;
import com.mogo.service.statusmanager.StatusDescriptor;
import com.mogo.utils.UiThreadHandler;
import com.mogo.utils.logger.Logger;
import java.util.Iterator;
import java.util.List;
/**
* @author congtaowang
* @since 2020-01-03
@@ -128,6 +94,8 @@ public class MogoServiceProvider implements IMogoModuleProvider {
@Override
public void init( Context context ) {
Logger.d( TAG, "init" );
MarkerServiceHandler.init( context );
UiThreadHandler.postDelayed( () -> {
MogoServices.getInstance().init( AbsMogoApplication.getApp() );
}, 5_000L );

View File

@@ -33,6 +33,7 @@ import com.mogo.module.common.MogoModulePaths;
import com.mogo.module.common.map.MapCenterPointStrategy;
import com.mogo.module.common.map.Scene;
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;
@@ -55,6 +56,7 @@ 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.UiThreadHandler;
import com.mogo.utils.WorkThreadHandler;
import com.mogo.utils.logger.Logger;
@@ -76,7 +78,6 @@ import java.util.List;
public class MogoServices implements IMogoMapListener,
IMogoLocationListener,
IMogoNaviListener,
IMogoStatusChangedListener,
IMogoIntentListener,
IMogoAimlessModeListener,
IMogoVoiceCmdCallBack,
@@ -189,23 +190,25 @@ public class MogoServices implements IMogoMapListener,
}
}
/**
* 自动刷新锁车、缩放比例16、半径 2KM
*/
private void invokeAutoRefresh() {
if ( mStatusManager.isSearchUIShow() || mStatusManager.isV2XShow() ) {
mStatusManager.setUserInteractionStatus( TAG, true, false );
mUiController.recoverLockMode();
return;
}
mStatusManager.setUserInteractionStatus( ServiceConst.TYPE, true, false );
mUiController.changeZoom( ServiceConst.DEFAULT_LOCK_CAR_ZOOM_LEVEL );
mUiController.setLockZoom( ServiceConst.DEFAULT_LOCK_CAR_ZOOM_LEVEL );
};
/**
* 自动刷新锁车、缩放比例16、半径 2KM
*/
private void invokeAutoRefresh() {
if ( mStatusManager.isSearchUIShow() || mStatusManager.isV2XShow() ) {
mStatusManager.setUserInteractionStatus( TAG, true, false );
mUiController.recoverLockMode();
notifyRefreshData( mLastAutoRefreshLocation, ServiceConst.DEFAULT_AUTO_REFRESH_DATA_RADIUS, mAutoRefreshCallback );
return;
}
};
mStatusManager.setUserInteractionStatus( ServiceConst.TYPE, true, false );
mUiController.changeZoom( ServiceConst.DEFAULT_LOCK_CAR_ZOOM_LEVEL );
mUiController.setLockZoom( ServiceConst.DEFAULT_LOCK_CAR_ZOOM_LEVEL );
mStatusManager.setUserInteractionStatus( TAG, true, false );
mUiController.recoverLockMode();
notifyRefreshData( mLastAutoRefreshLocation, ServiceConst.DEFAULT_AUTO_REFRESH_DATA_RADIUS, mAutoRefreshCallback );
}
private Context mContext;
/**
@@ -270,22 +273,86 @@ public class MogoServices implements IMogoMapListener,
private boolean mIsMainPageFirstResume = true;
private boolean mIsFirstAccOn = true;
private IMogoStatusChangedListener statusChangedListener = new StatusChangedAdapter() {
@Override
public void onUserInteracted( boolean userInteracted ) {
if ( userInteracted ) {
restartAutoRefreshAtTime( ServiceConst.DEFAULT_AUTO_REFRESH_WHEN_INTERRUPT );
}
}
@Override
public void onSearchUIShow( boolean visible ) {
if ( visible ) {
// 搜索时,不在自动刷新打点策略
stopAutoRefreshStrategy();
} else {
// 搜索后,打开打点策略
if ( mAutoRefreshCallback != null ) {
mAutoRefreshCallback.onSuccess( null );
}
}
}
@Override
public void onMainPageResumeStatusChanged( boolean resume ) {
if ( resume ) {
registerInternalUnWakeupWords();
if ( !mIsMainPageFirstResume ) {
restartAutoRefreshAtTime( 2_000L );
}
mIsMainPageFirstResume = false;
LauncherCardRefresher.getInstance( mContext ).stop();
} else {
unregisterInternalUnWakeupWords();
stopAutoRefreshStrategy();
}
}
@Override
public void onSeekHelpingStatusChanged( boolean isSeekingHelping ) {
CarIconDisplayStrategy.getInstance().changeCarIconStatus( isSeekingHelping );
notifySeekHelpingStatusChanged( isSeekingHelping );
}
@Override
public void onAccStatusChanged( boolean accOn ) {
if ( accOn ) {
if ( mIsFirstAccOn ) {
mIsFirstAccOn = false;
return;
}
initLocationServiceProcess( mContext );
mADASController.showADAS();
MarkerServiceHandler.getApis().getMapServiceApi().getSingletonLocationClient( mContext ).start();
MarkerServiceHandler.getApis().getMapServiceApi().getMarkerManager( mContext ).removeMarkers();
UiThreadHandler.postDelayed( () -> {
refreshStrategy();
}, 3_000L );
} else {
MarkerServiceHandler.getApis().getMapServiceApi().getSingletonLocationClient( mContext ).stop();
MarkerServiceHandler.getApis().getMapServiceApi().getMarkerManager( mContext ).removeMarkers();
}
}
};
public void init( Context context ) {
mContext = context;
initWorkThread();
MarkerServiceHandler.init( mContext );
mRefreshModel = new RefreshModel( context );
mMogoMapService = MarkerServiceHandler.getMapService();
mUiController = mMogoMapService.getMapUIController();
mNavi = mMogoMapService.getNavi( context );
mStatusManager = MarkerServiceHandler.getMogoStatusManager();
mStatusManager.registerStatusChangedListener( ServiceConst.TYPE, StatusDescriptor.USER_INTERACTED, this );
mStatusManager.registerStatusChangedListener( ServiceConst.TYPE, StatusDescriptor.SEARCH_UI, this );
mStatusManager.registerStatusChangedListener( ServiceConst.TYPE, StatusDescriptor.ADAS_UI, this );
mStatusManager.registerStatusChangedListener( ServiceConst.TYPE, StatusDescriptor.MAIN_PAGE_RESUME, this );
mStatusManager.registerStatusChangedListener( ServiceConst.TYPE, StatusDescriptor.SEEK_HELPING, this );
mStatusManager.registerStatusChangedListener( ServiceConst.TYPE, StatusDescriptor.USER_INTERACTED, statusChangedListener );
mStatusManager.registerStatusChangedListener( ServiceConst.TYPE, StatusDescriptor.SEARCH_UI, statusChangedListener );
mStatusManager.registerStatusChangedListener( ServiceConst.TYPE, StatusDescriptor.MAIN_PAGE_RESUME, statusChangedListener );
mStatusManager.registerStatusChangedListener( ServiceConst.TYPE, StatusDescriptor.SEEK_HELPING, statusChangedListener );
mStatusManager.registerStatusChangedListener( ServiceConst.TYPE, StatusDescriptor.ACC_STATUS, statusChangedListener );
mStatusManager.setAIAssistReady( TAG, AIAssist.getInstance( mContext ).hasFlush() );
registerMogoReceiver( context );
@@ -317,6 +384,9 @@ public class MogoServices implements IMogoMapListener,
mIntentManager.registerIntentListener( ServiceConst.COMMAND_ZHIDAO_NEARBY_USER_ONLINE, this );
mIntentManager.registerIntentListener( ServiceConst.COMMAND_ZHIDAO_NEARBY_FRIEND_BYLOCATION, this );
mIntentManager.registerIntentListener( ServiceConst.COMMAND_BACK, this );
mIntentManager.registerIntentListener( MogoReceiver.ACTION_AUTO_NAVI_RECEIVER, this );
mIntentManager.registerIntentListener( MogoReceiver.ACTION_AUTO_NAVI_SEND, this );
mIntentManager.registerIntentListener( MogoReceiver.ACTION_MOGO, this );
mADASController = MarkerServiceHandler.getADASController();
mLauncher = MarkerServiceHandler.getLauncher();
@@ -362,6 +432,8 @@ public class MogoServices implements IMogoMapListener,
if ( msg.obj instanceof RefreshObject ) {
RefreshObject ro = ( ( RefreshObject ) msg.obj );
if ( ro.mLonLat == null ) {
invokeAutoRefreshStrategy();
Logger.w( TAG, "lonLat is null." );
return;
}
mRefreshModel.refreshData( ro.mLonLat, ro.mRadius, ro.mAmount, ro.mCallback );
@@ -406,6 +478,9 @@ public class MogoServices implements IMogoMapListener,
filter.addAction( MogoReceiver.ACTION_VOICE_READY );
filter.addAction( MogoReceiver.ACTION_MOCK );
filter.addAction( Intent.ACTION_CLOSE_SYSTEM_DIALOGS );
filter.addAction( MogoReceiver.ACTION_AUTO_NAVI_RECEIVER );
filter.addAction( MogoReceiver.ACTION_AUTO_NAVI_SEND );
filter.addAction( MogoReceiver.ACTION_MOGO );
try {
context.getApplicationContext().registerReceiver( mAIAssistReceiver, filter );
Logger.i( TAG, "register voice receiver." );
@@ -474,10 +549,10 @@ public class MogoServices implements IMogoMapListener,
}
private void stopAutoRefreshStrategy() {
stopAutoRefreshStrategy(true);
stopAutoRefreshStrategy( true );
}
private void stopAutoRefreshStrategy(boolean stopOnlineCarRefresh) {
private void stopAutoRefreshStrategy( boolean stopOnlineCarRefresh ) {
if ( DebugConfig.isDebug() ) {
Logger.d( TAG, Log.getStackTraceString( new Throwable() ) );
}
@@ -615,9 +690,7 @@ public class MogoServices implements IMogoMapListener,
// 自动刷新触发
final MogoLatLng point = new MogoLatLng( location.getLatitude(), location.getLongitude() );
if ( mLastAutoRefreshLocation == null ) {
mLastAutoRefreshLocation = point;
mLoopRequest = true;
notifyRefreshData( mLastAutoRefreshLocation, getQueryRadius(), mAutoRefreshCallback );
startFirstLocationRequest( point );
return;
}
float distance = Utils.calculateLineDistance( mLastAutoRefreshLocation, point );
@@ -631,8 +704,27 @@ public class MogoServices implements IMogoMapListener,
}
}
/**
* 首次定位成功后,执行道路事件的刷新
*
* @param point
*/
private void startFirstLocationRequest( MogoLatLng point ) {
mLastAutoRefreshLocation = point;
mLoopRequest = true;
notifyRefreshData( mLastAutoRefreshLocation, getQueryRadius(), mAutoRefreshCallback );
}
@Override
public void onCarLocationChanged2( Location latLng ) {
if ( latLng == null ) {
return;
}
// poi 定位无法获取时,使用该定位
if ( mLastAutoRefreshLocation == null ) {
MogoLatLng point = new MogoLatLng( latLng.getLatitude(), latLng.getLongitude() );
startFirstLocationRequest( point );
}
}
@Override
@@ -664,61 +756,6 @@ public class MogoServices implements IMogoMapListener,
mThreadHandler.sendMessage( msg );
}
@Override
public void onStatusChanged( StatusDescriptor descriptor, boolean isTrue ) {
//Logger.d( TAG, "状态发生改变---descriptor---" + descriptor + "----isTrue---" + isTrue );
switch ( descriptor ) {
case USER_INTERACTED:
if ( isTrue ) {
restartAutoRefreshAtTime( ServiceConst.DEFAULT_AUTO_REFRESH_WHEN_INTERRUPT );
}
break;
case SEARCH_UI:
if ( isTrue ) {
// 搜索时,不在自动刷新打点策略
stopAutoRefreshStrategy();
} else {
// 搜索后,打开打点策略
if ( mAutoRefreshCallback != null ) {
mAutoRefreshCallback.onSuccess( null );
}
}
break;
case ADAS_UI:
try {
if ( isTrue ) {
onAdasOn();
} else {
onAdasClosed();
}
} catch ( Exception e ) {
e.printStackTrace();
}
break;
case MAIN_PAGE_RESUME:
if ( isTrue ) {
registerInternalUnWakeupWords();
if ( !mIsMainPageFirstResume ) {
restartAutoRefreshAtTime( 2_000L );
}
mIsMainPageFirstResume = false;
} else {
unregisterInternalUnWakeupWords();
stopAutoRefreshStrategy();
}
break;
case SEEK_HELPING:
CarIconDisplayStrategy.getInstance().changeCarIconStatus( isTrue );
notifySeekHelpingStatusChanged( isTrue );
break;
case ACC_STATUS:
if ( isTrue ) {
mADASController.showADAS();
}
break;
}
}
private void notifySeekHelpingStatusChanged( boolean seekHelpingStatus ) {
Intent intent = new Intent( "com.mogo.launcher.adas.app" );
try {
@@ -734,35 +771,35 @@ public class MogoServices implements IMogoMapListener,
}
}
private void onAdasOn() {
// ADAS 时,不在自动刷新打点策略
stopAutoRefreshStrategy();
}
private void onAdasClosed() {
refreshStrategy();
// ADAS关闭后打开打点策略
if ( mAutoRefreshCallback != null ) {
mAutoRefreshCallback.onSuccess( null );
}
}
public void restartAutoRefreshAtTime( long time ) {
restartAutoRefreshAtTime( time, true );
}
public void clearAllData() {
try {
MarkerServiceHandler.getMapService().getMarkerManager( mContext ).removeMarkers();
} catch ( Exception e ) {
e.printStackTrace();
}
}
private void restartAutoRefreshAtTime( long time, boolean stopOnlineCarRefresh ) {
if ( time < 0 ) {
Logger.w( TAG, "ignore refresh request case time < 0" );
return;
Logger.w( TAG, "refresh request case time < 0, set to 0 and go on." );
time = 0;
}
stopAutoRefreshStrategy(stopOnlineCarRefresh);
stopAutoRefreshStrategy( stopOnlineCarRefresh );
mRefreshRemainingTime = time;
long delay = ServiceConst.DECREASE_INTERVAL;
if ( mRefreshRemainingTime < ServiceConst.DECREASE_INTERVAL ) {
delay = mRefreshRemainingTime;
}
mHandler.sendEmptyMessageDelayed( ServiceConst.MSG_TYPE_REFRESH_DECREASE, delay );
if ( time == 0 ) {
Logger.d( TAG, "立即刷新" );
invokeAutoRefresh();
} else {
mHandler.sendEmptyMessageDelayed( ServiceConst.MSG_TYPE_REFRESH_DECREASE, delay );
}
Logger.i( TAG, "下次刷新时间:%ss后", mRefreshRemainingTime );
}
@@ -776,20 +813,22 @@ public class MogoServices implements IMogoMapListener,
@Override
public void onUpdateTraffic2( MogoTraffic traffic ) {
if ( traffic != null ) {
if ( mCurrentLimit == traffic.getSpeedLimit() ) {
return;
}
mCurrentLimit = traffic.getSpeedLimit();
Logger.i( TAG, "speed = %d, desc = %s", traffic.getSpeedLimit(), traffic.getDesc() );
// 发送当前限速到 adas
Intent intent = new Intent( "com.mogo.launcher.adas" );
intent.putExtra( "adas_speed_limit", traffic.getSpeedLimit() );
mContext.sendBroadcast( intent );
if ( traffic == null ) {
return;
}
if ( mCurrentLimit == traffic.getSpeedLimit() ) {
return;
}
mCurrentLimit = traffic.getSpeedLimit();
Logger.i( TAG, "speed = %d, desc = %s", traffic.getSpeedLimit(), traffic.getDesc() );
// 发送当前限速到 adas
Intent intent = new Intent( "com.mogo.launcher.adas" );
intent.putExtra( "adas_speed_limit", traffic.getSpeedLimit() );
mContext.sendBroadcast( intent );
}
@Override

View File

@@ -0,0 +1,45 @@
package com.mogo.module.service;
import com.mogo.service.statusmanager.IMogoStatusChangedListener;
import com.mogo.service.statusmanager.StatusDescriptor;
public
/**
* @author congtaowang
* @since 2020/8/6
*
* 描述
*/
abstract class StatusChangedAdapter implements IMogoStatusChangedListener {
@Override
public void onStatusChanged( StatusDescriptor descriptor, boolean isTrue ) {
switch ( descriptor ) {
case USER_INTERACTED:
onUserInteracted( isTrue );
break;
case SEARCH_UI:
onSearchUIShow( isTrue );
break;
case MAIN_PAGE_RESUME:
onMainPageResumeStatusChanged( isTrue );
break;
case SEEK_HELPING:
onSeekHelpingStatusChanged( isTrue );
break;
case ACC_STATUS:
onAccStatusChanged( isTrue );
break;
}
}
public abstract void onUserInteracted( boolean userInteracted );
public abstract void onSearchUIShow( boolean visible );
public abstract void onMainPageResumeStatusChanged( boolean resume );
public abstract void onSeekHelpingStatusChanged( boolean isSeekingHelping );
public abstract void onAccStatusChanged( boolean accOn );
}

View File

@@ -3,10 +3,12 @@ package com.mogo.module.service.intent;
import android.content.Context;
import android.content.Intent;
import com.mogo.module.common.utils.CarSeries;
import com.mogo.module.service.MarkerServiceHandler;
import com.mogo.module.service.ServiceConst;
import com.mogo.module.service.launchercard.LauncherCardRefresher;
import com.mogo.module.service.receiver.AccStatusReceiver;
import com.mogo.module.service.receiver.MogoReceiver;
import com.mogo.utils.TipToast;
import com.mogo.utils.logger.Logger;
public
@@ -18,16 +20,21 @@ public
*/
class AccStatusIntentHandler implements IntentHandler {
public static final byte ACC_ON = 1;
public static final byte ACC_OFF = 0;
public static final byte ACC_OFF_DELAY = 3;
private static final String TAG = "AccStatusIntentHandler";
private static volatile AccStatusIntentHandler sInstance;
private AccStatusIntentHandler(){}
private AccStatusIntentHandler() {
}
public static AccStatusIntentHandler getInstance(){
if( sInstance == null ){
synchronized( AccStatusIntentHandler.class ) {
if( sInstance == null ){
public static AccStatusIntentHandler getInstance() {
if ( sInstance == null ) {
synchronized ( AccStatusIntentHandler.class ) {
if ( sInstance == null ) {
sInstance = new AccStatusIntentHandler();
}
}
@@ -35,7 +42,7 @@ class AccStatusIntentHandler implements IntentHandler {
return sInstance;
}
public synchronized void release(){
public synchronized void release() {
sInstance = null;
}
@@ -43,15 +50,31 @@ class AccStatusIntentHandler implements IntentHandler {
public void handle( Context context, Intent intent ) {
String action = intent.getAction();
if ( Intent.ACTION_POWER_CONNECTED.equals( action ) ) {
MarkerServiceHandler.getMogoStatusManager().setAccStatus( ServiceConst.TYPE, true );
Logger.d( TAG, "acc status: %s", true );
if ( CarSeries.getSeries() == CarSeries.CAR_SERIES_F80X ) {
MarkerServiceHandler.getMogoStatusManager().setAccStatus( ServiceConst.TYPE, true );
Logger.d( TAG, "acc status: %s", true );
}
} else if ( Intent.ACTION_POWER_DISCONNECTED.equals( action ) ) {
MarkerServiceHandler.getMogoStatusManager().setAccStatus( ServiceConst.TYPE, false );
Logger.d( TAG, "acc status: %s", false );
if ( CarSeries.getSeries() == CarSeries.CAR_SERIES_F80X ) {
MarkerServiceHandler.getMogoStatusManager().setAccStatus( ServiceConst.TYPE, false );
Logger.d( TAG, "acc status: %s", false );
}
} else if ( AccStatusReceiver.ACTION_NWD_ACC.equals( action ) ) {
int state = intent.getByteExtra( AccStatusReceiver.PARAM_ACC_STATUS, ( byte ) 0 );
Logger.d( TAG, "acc status: %s", state == 1 );
MarkerServiceHandler.getMogoStatusManager().setAccStatus( ServiceConst.TYPE, state == 1 );
int state = intent.getByteExtra( AccStatusReceiver.PARAM_ACC_STATUS, ACC_OFF );
if ( state != ACC_OFF && state != ACC_ON && state != ACC_OFF_DELAY ) {
return;
}
boolean accOn = state == ACC_ON;
if ( MarkerServiceHandler.getMogoStatusManager().isAccOn() == accOn ) {
return;
}
Logger.d( TAG, "acc status: %s", state );
MarkerServiceHandler.getMogoStatusManager().setAccStatus( ServiceConst.TYPE, accOn );
if ( state == ACC_ON ) {
LauncherCardRefresher.getInstance( context ).start();
} else if ( state == ACC_OFF ) {
LauncherCardRefresher.getInstance( context ).stop();
}
}
}
}

View File

@@ -17,6 +17,6 @@ public class EmptyIntentHandler implements IntentHandler {
@Override
public void handle( Context context, Intent intent ) {
Logger.w( TAG, "空实现." );
Logger.w( TAG, "空实现. %s", intent.getAction() );
}
}

View File

@@ -37,6 +37,7 @@ public class IntentHandlerFactory {
mHandlers.put( MogoReceiver.ACTIION_ADAS, ADASStatusIntentHandler.getInstance() );
mHandlers.put( MogoReceiver.ACTION_VOICE_READY, new AIAssistIntentHandler() );
mHandlers.put( ServiceConst.COMMAND_BACK, WholeVoiceCommandIntentHandler.getInstance() );
mHandlers.put( MogoReceiver.ACTION_MOGO, new MogoControllerIntentHandler() );
}
private static final class InstanceHolder {

View File

@@ -15,6 +15,9 @@ import com.mogo.commons.debug.DebugConfig;
import com.mogo.map.MogoLatLng;
import com.mogo.map.marker.IMogoMarker;
import com.mogo.map.marker.MogoMarkerOptions;
import com.mogo.map.navi.IMogoNaviListener;
import com.mogo.map.navi.MogoNaviInfo;
import com.mogo.map.navi.MogoTraffic;
import com.mogo.map.search.geo.IMogoGeoSearch;
import com.mogo.map.search.geo.IMogoGeoSearchListener;
import com.mogo.map.search.geo.MogoGeocodeResult;
@@ -154,6 +157,49 @@ public class MockIntentHandler implements IntentHandler {
case 13: {
double lat = intent.getFloatExtra( "lat", 0.0f );
double lon = intent.getFloatExtra( "lon", 0.0f );
boolean real = intent.getBooleanExtra( "real", false );
MarkerServiceHandler.getRegisterCenter().registerMogoNaviListener( TAG, new IMogoNaviListener() {
@Override
public void onInitNaviFailure() {
}
@Override
public void onInitNaviSuccess() {
}
@Override
public void onNaviInfoUpdate( MogoNaviInfo naviinfo ) {
}
@Override
public void onStartNavi() {
}
@Override
public void onStopNavi() {
}
@Override
public void onCalculateSuccess() {
MarkerServiceHandler.getRegisterCenter().unregisterMogoNaviListener( TAG );
MarkerServiceHandler.getNavi().startNavi( real );
}
@Override
public void onoCalculateFailed() {
}
@Override
public void onUpdateTraffic( MogoTraffic traffic ) {
}
} );
MarkerServiceHandler.getNavi().naviTo( new MogoLatLng( lat, lon ) );
}
case 14: {

View File

@@ -0,0 +1,37 @@
package com.mogo.module.service.intent;
import android.content.Context;
import android.content.Intent;
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 MogoControllerIntentHandler implements IntentHandler {
public static final String KEY_OPER = "oper";
public static final int TYPE_OPER_OPEN_LOG = 1;
public static final int TYPE_OPER_CLOSE_LOG = 2;
@Override
public void handle( Context context, Intent intent ) {
int oper = intent.getIntExtra( KEY_OPER, 0 );
switch ( oper ) {
case TYPE_OPER_OPEN_LOG:
Logger.init( LogLevel.DEBUG );
NetConfig.instance().setLoggable( true );
break;
case TYPE_OPER_CLOSE_LOG:
Logger.init( LogLevel.OFF );
NetConfig.instance().setLoggable( false );
break;
}
}
}

View File

@@ -0,0 +1,53 @@
package com.mogo.module.service.launchercard;
public class LauncherCardRefreshStrategy {
private long interval; // 间隔时间
private static LauncherCardRefreshType type = LauncherCardRefreshType.OnlineCar;
private LauncherCardRefreshStrategy next;
private int msgType;// 触发的消息类型
public LauncherCardRefreshStrategy( long interval, LauncherCardRefreshStrategy next, int msgType ) {
this.interval = interval;
this.next = next;
this.msgType = msgType;
}
public int getMsgType() {
return msgType;
}
public long getInterval() {
return interval;
}
public LauncherCardRefreshType getType() {
if ( type == LauncherCardRefreshType.ExploreWay ) {
type = LauncherCardRefreshType.OnlineCar;
} else {
type = LauncherCardRefreshType.ExploreWay;
}
return type;
}
public int getLimit() {
return type.limit;
}
public String getDesc() {
return type.desc;
}
public int getRadius() {
return 2_000;
}
public LauncherCardRefreshStrategy getNext() {
if ( next == null ) {
return this;
}
return next;
}
}

View File

@@ -0,0 +1,15 @@
package com.mogo.module.service.launchercard;
public enum LauncherCardRefreshType {
ExploreWay( 50, "道路事件" ),
OnlineCar( 20, "车友" );
public int limit;
public String desc;
LauncherCardRefreshType( int limit, String desc ) {
this.limit = limit;
this.desc = desc;
}
}

View File

@@ -0,0 +1,262 @@
package com.mogo.module.service.launchercard;
import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import com.mogo.commons.debug.DebugConfig;
import com.mogo.commons.voice.AIAssist;
import com.mogo.commons.voice.VoicePreemptType;
import com.mogo.map.MogoLatLng;
import com.mogo.map.location.MogoLocation;
import com.mogo.module.common.entity.MarkerResponse;
import com.mogo.module.service.MarkerServiceHandler;
import com.mogo.module.service.R;
import com.mogo.module.service.network.RefreshCallback;
import com.mogo.module.service.network.RefreshModel;
import com.mogo.utils.AppUtils;
import com.mogo.utils.logger.Logger;
import com.mogo.utils.storage.SharedPrefsMgr;
public
/**
* @author congtaowang
* @since 2020/8/17
*
* 描述
*/
class LauncherCardRefresher {
private static final String TAG = "LauncherCardRefresher";
public static final String KEY_LauncherCardTipCounter = "LauncherCardTipCounter";
public static final String KEY_LauncherCardTipLastTipTime = "LauncherCardTipLastTipTime";
private static volatile LauncherCardRefresher sInstance;
public static final int MSG_REFRESH = 2020;
public static final int MSG_TTS_TIP = 2021;
public static final long ONE_MINUTE = 60 * 1000L;
public static final long HALF_ONE_MINUTE = 30 * 1000L;
private LauncherCardRefresher( Context context ) {
mContext = context;
}
public static LauncherCardRefresher getInstance( Context context ) {
if ( sInstance == null ) {
synchronized ( LauncherCardRefresher.class ) {
if ( sInstance == null ) {
sInstance = new LauncherCardRefresher( context );
}
}
}
return sInstance;
}
public synchronized void release() {
sInstance = null;
}
private Object readResolve() {
// 阻止反序列化,必须实现 Serializable 接口
return sInstance;
}
private Handler mHandler = new Handler( Looper.getMainLooper() ) {
@Override
public void handleMessage( Message msg ) {
super.handleMessage( msg );
if ( mRefreshStop ) {
return;
}
switch ( msg.what ) {
case MSG_REFRESH:
try {
handleRefreshMsg();
} catch ( Exception e ) {
Logger.e( TAG, e, "error when refresh launcher card." );
}
break;
case MSG_TTS_TIP:
playTTS();
mRefreshStrategy = mRefreshStrategy.getNext();
restart();
break;
}
}
};
private final Context mContext;
private boolean mRefreshStop = true;
private boolean mStart = false;
private RefreshModel mRefreshModel;
private LauncherCardRefreshStrategy mRefreshStrategy = new LauncherCardRefreshStrategy(
2 * ONE_MINUTE,
new LauncherCardRefreshStrategy(
3 * ONE_MINUTE,
new LauncherCardRefreshStrategy(
20 * ONE_MINUTE,
null,
MSG_REFRESH ),
MSG_REFRESH ),
MSG_TTS_TIP
);
public void start() {
if ( DebugConfig.isLauncher() || DebugConfig.getCarMachineType() == DebugConfig.CAR_MACHINE_TYPE_BYD ) {
return;
}
if ( mStart ) {
return;
}
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 * 24 * 60 **/ ONE_MINUTE ) {
stop();
return;
} else {
SharedPrefsMgr.getInstance( mContext ).putInt( KEY_LauncherCardTipCounter, 0 );
counter = 0;
SharedPrefsMgr.getInstance( mContext ).putLong( KEY_LauncherCardTipLastTipTime, 0L );
}
}
mHandler.sendEmptyMessageDelayed( mRefreshStrategy.getMsgType(), mRefreshStrategy.getInterval() );
Logger.d( TAG, "start" );
mRefreshStop = false;
mStart = true;
SharedPrefsMgr.getInstance( mContext ).putInt( KEY_LauncherCardTipCounter, ++counter );
SharedPrefsMgr.getInstance( mContext ).putLong( KEY_LauncherCardTipLastTipTime, System.currentTimeMillis() );
}
public void stop() {
mRefreshStop = true;
mStart = false;
mHandler.removeMessages( MSG_REFRESH );
mHandler.removeMessages( MSG_TTS_TIP );
Logger.d( TAG, "stop" );
}
private void restart() {
if ( !mStart ) {
return;
}
mRefreshStop = false;
mHandler.removeMessages( MSG_REFRESH );
mHandler.removeMessages( MSG_TTS_TIP );
mHandler.sendEmptyMessageDelayed( mRefreshStrategy.getMsgType(), mRefreshStrategy.getInterval() );
}
private void handleRefreshMsg() {
if ( mRefreshModel == null ) {
mRefreshModel = new RefreshModel( mContext );
}
MogoLocation location = MarkerServiceHandler.getMogoLocationClient().getLastKnowLocation();
if ( location == null ) {
restart();
return;
}
MogoLatLng latLng = new MogoLatLng( location.getLatitude(), location.getLongitude() );
if ( mRefreshStrategy.getType() == LauncherCardRefreshType.ExploreWay ) {
handleRefreshExplorerWayData( latLng );
} else {
handleRefreshOnlineCarData( latLng );
}
}
private void handleRefreshExplorerWayData( MogoLatLng latLng ) {
mRefreshModel.refreshDataSync( latLng,
mRefreshStrategy.getRadius(),
mRefreshStrategy.getLimit(),
new RefreshCallback< MarkerResponse >() {
@Override
public void onSuccess( MarkerResponse response ) {
notifyLauncherCard( LauncherCardRefreshType.ExploreWay, response );
mRefreshStrategy = mRefreshStrategy.getNext();
restart();
}
@Override
public void onFail() {
mRefreshStrategy = mRefreshStrategy.getNext();
restart();
}
} );
}
private void handleRefreshOnlineCarData( MogoLatLng latLng ) {
mRefreshModel.queryOnLineCarWithRoute( latLng,
false,
true,
mRefreshStrategy.getRadius(),
mRefreshStrategy.getLimit(),
new RefreshCallback< MarkerResponse >() {
@Override
public void onSuccess( MarkerResponse response ) {
notifyLauncherCard( LauncherCardRefreshType.OnlineCar, response );
mRefreshStrategy = mRefreshStrategy.getNext();
restart();
}
@Override
public void onFail() {
mRefreshStrategy = mRefreshStrategy.getNext();
restart();
}
} );
}
private boolean notifyLauncherCard( LauncherCardRefreshType type, MarkerResponse response ) {
if ( response == null || response.getResult() == null ) {
return false;
}
String tts = mContext.getString( R.string.module_service_launcher_card_tips );
String info = mContext.getString( R.string.module_service_launcher_card_info );
if ( type == LauncherCardRefreshType.ExploreWay ) {
if ( response.getResult().getExploreWay() == null || response.getResult().getExploreWay().isEmpty() ) {
return false;
}
speakTTS( String.format( tts, response.getResult().getExploreWay().size(), mRefreshStrategy.getDesc() ) );
notifyLauncherCard( String.format( info, response.getResult().getExploreWay().size(), mRefreshStrategy.getDesc() ) );
} else {
if ( response.getResult().getOnlineCar() == null || response.getResult().getOnlineCar().isEmpty() ) {
return false;
}
speakTTS( String.format( tts, response.getResult().getOnlineCar().size(), mRefreshStrategy.getDesc() ) );
notifyLauncherCard( String.format( info, response.getResult().getOnlineCar().size(), mRefreshStrategy.getDesc() ) );
}
return true;
}
private void speakTTS( String msg ) {
if ( AppUtils.isAppForeground( mContext ) ) {
return;
}
Logger.d( TAG, msg );
AIAssist.getInstance( mContext ).speakTTSVoice( msg );
}
private void notifyLauncherCard( String info ) {
Intent intent = new Intent( "com.mogo.launcher.v2x" );
intent.putExtra( "v2x_warning_type", 20000 );
intent.putExtra( "v2x_warining_timeout", 20 );
intent.putExtra( "v2x_warning_tts", "" );
intent.putExtra( "v2x_warning_info", info );
mContext.sendBroadcast( intent );
}
private void playTTS() {
try {
AIAssist.getInstance( mContext ).speakTTSVoice( mContext.getString( R.string.module_service_open_app_tip ) );
} catch ( Exception e ) {
e.printStackTrace();
}
}
}

View File

@@ -3,6 +3,8 @@ 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;
import com.mogo.commons.debug.DebugConfig;
@@ -11,6 +13,7 @@ import com.mogo.map.marker.IMogoMarker;
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.module.common.ModuleNames;
import com.mogo.module.common.entity.MarkerCarPois;
import com.mogo.module.common.entity.MarkerCardResult;
@@ -34,6 +37,7 @@ import com.mogo.service.module.IMogoBizActionDoneListener;
import com.mogo.utils.ResourcesHelper;
import com.mogo.utils.ThreadPoolService;
import com.mogo.utils.UiThreadHandler;
import com.mogo.utils.WorkThreadHandler;
import com.mogo.utils.logger.Logger;
import org.json.JSONArray;
@@ -91,7 +95,14 @@ public class MapMarkerManager implements IMogoMarkerClickListener,
* @param context
*/
public void init( Context context ) {
mContext = context;
if ( mContext != null ) {
return;
}
Logger.d( TAG, "初始化" );
mContext = context.getApplicationContext();
mRefreshModel = new RefreshModel( mContext );
// 长连接
@@ -293,6 +304,7 @@ public class MapMarkerManager implements IMogoMarkerClickListener,
MogoLatLng centerPoint ) {
// 将数据同步给在线车辆,避免每次 perform 的时候去拉取,造成消耗
if ( onlineCarList == null || onlineCarList.isEmpty() ) {
MarkerServiceHandler.getMarkerManager().removeMarkers( ModuleNames.CARD_TYPE_USER_DATA );
return;
}
@@ -324,9 +336,12 @@ public class MapMarkerManager implements IMogoMarkerClickListener,
String sn = getPrimaryKeyFromEntity( markerOnlineCar );
IMogoMarker mogoMarker = existCarMap.get( sn );
if ( mogoMarker == null ) {
if ( mogoMarker == null || mogoMarker.isDestroyed() ) {
mogoMarker = drawMapMarker( markerShowEntity, ServiceConst.MARKER_Z_INDEX_LOW );
}
if ( mogoMarker != null ) {
mogoMarker.setVisible( true );
}
startSmooth( mogoMarker, markerOnlineCar, markerLocation );
}
@@ -363,14 +378,51 @@ public class MapMarkerManager implements IMogoMarkerClickListener,
String sn = getPrimaryKeyFromEntity( markerExploreWay );
IMogoMarker mogoMarker = existCarMap.get( sn );
if ( mogoMarker == null ) {
if ( mogoMarker == null || mogoMarker.isDestroyed() ) {
Logger.d( TAG, "draw road condition, sn = %s", sn );
drawMapMarker( markerShowEntity, ServiceConst.MARKER_Z_INDEX_HIGH );
try {
if ( DebugConfig.isRoadEventAnimated() ) {
post2AddAndStartAnimation( markerShowEntity, i * 100L );
} else {
mogoMarker = drawMapMarker( markerShowEntity, ServiceConst.MARKER_Z_INDEX_HIGH );
}
} catch ( Exception e ) {
e.printStackTrace();
}
}
}
}
}
private void post2AddAndStartAnimation( MarkerShowEntity entity, long delay ) {
if ( entity == null ) {
return;
}
WorkThreadHandler.getInstance().postDelayed( () -> {
if ( entity == null ) {
return;
}
IMogoMarker marker = drawMapMarker( entity, ServiceConst.MARKER_Z_INDEX_HIGH );
if ( marker == null ) {
return;
}
marker.startScaleAnimationWithAlpha( 0, 1.2f, 0, 1.2f, 0f, 1f, 300, new LinearInterpolator(), new OnMarkerAnimationListener() {
@Override
public void onAnimStart() {
Logger.d( TAG, " onAnimStart ---1----> " );
}
@Override
public void onAnimEnd() {
if ( marker == null || marker.isDestroyed() ) {
return;
}
marker.startScaleAnimation( 1.2f, 1, 1.2f, 1, 100, new LinearInterpolator(), null );
}
} );
}, delay );
}
/**
* S = (A ∩ B) B
* A ∩ B)作为旧列表需要保留的部分

View File

@@ -54,6 +54,7 @@ public class UserDataMarkerInfoWindowAdapter implements IMogoInfoWindowAdapter {
private View mInfoWindowView = null;
private View mContentContainer;
private MogoImageView mUserHeader;
private TextView mContent;
private TextView mTag;
@@ -92,12 +93,23 @@ public class UserDataMarkerInfoWindowAdapter implements IMogoInfoWindowAdapter {
if ( mInfoWindowView == null ) {
mInfoWindowView = LayoutInflater.from( mContext ).inflate( R.layout.view_map_data_user_info_window, 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 );
mTag = mInfoWindowView.findViewById( R.id.module_service_id_tag );
mCall = mInfoWindowView.findViewById( R.id.module_service_id_call );
}
if ( DebugConfig.getCarMachineType() == DebugConfig.CAR_MACHINE_TYPE_BYD ) {
mContentContainer.setPadding(
mContentContainer.getPaddingLeft(),
mContentContainer.getPaddingTop(),
mContentContainer.getResources().getDimensionPixelSize( R.dimen.module_service_id_marker_content_paddingRight_widthoutCall ),
mContentContainer.getPaddingBottom()
);
mCall.setVisibility( View.GONE );
}
try {
MarkerShowEntity markerShowEntity = ( MarkerShowEntity ) marker.getObject();
mContent.setText( markerShowEntity.getTextContent() );

View File

@@ -26,6 +26,10 @@ public interface RefreshApiService {
@POST( "/yycp-launcherSnapshot/launcherSnapshot/querySnapshotAsync" )
Observable< BaseData > refreshData( @FieldMap Map< String, Object > parameters );
@FormUrlEncoded
@POST( "/yycp-launcherSnapshot/launcherSnapshot/querySnapshotSync" )
Observable< MarkerResponse > refreshDataSync( @FieldMap Map< String, Object > parameters );
@FormUrlEncoded
@POST( "/yycp-launcherSnapshot/user/queryOnLineCarWithRoute" )
Observable<MarkerResponse> queryOnLineCarWithRoute(@FieldMap Map< String, Object > parameters );

View File

@@ -67,11 +67,7 @@ public class RefreshModel {
refreshBody.limit = limit;
refreshBody.location = new RefreshBody.LatLon( latLng.lat, latLng.lng );
refreshBody.radius = radius;
refreshBody.dataType.add( ServiceConst.CARD_TYPE_CARS_CHATTING );
refreshBody.dataType.add( ServiceConst.CARD_TYPE_ROAD_CONDITION );
refreshBody.dataType.add( ServiceConst.CARD_TYPE_SHARE_MUSIC );
// refreshBody.dataType.add(ServiceConst.CARD_TYPE_USER_DATA);
refreshBody.dataType.add( ServiceConst.CARD_TYPE_NOVELTY );
String data = GsonUtil.jsonFromObject( refreshBody );
query.put( "data", data );
@@ -109,6 +105,51 @@ public class RefreshModel {
}
}
public void refreshDataSync( 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.dataType.add( ServiceConst.CARD_TYPE_ROAD_CONDITION );
String data = GsonUtil.jsonFromObject( refreshBody );
query.put( "data", data );
Logger.d( TAG, data );
mRefreshApiService.refreshDataSync( query )
.subscribeOn( Schedulers.io() )
.observeOn( AndroidSchedulers.mainThread() )
.subscribe( new SubscribeImpl< MarkerResponse >( RequestOptions.create( mContext ) ) {
@Override
public void onSuccess( MarkerResponse o ) {
super.onSuccess( o );
if ( callback != null ) {
callback.onSuccess( o );
}
}
@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 );
if ( callback != null ) {
callback.onFail();
}
}
} );
}
}
/**
* 查询车辆 及路线
*

View File

@@ -53,6 +53,13 @@ public class MogoReceiver extends BroadcastReceiver {
public static final String ACTION_MOCK = "com.mogo.mock";
// 接受其他app发给高德的广播
public static final String ACTION_AUTO_NAVI_RECEIVER = "AUTONAVI_STANDARD_BROADCAST_RECV";
// 接受高德发过来的广播
public static final String ACTION_AUTO_NAVI_SEND = "AUTONAVI_STANDARD_BROADCAST_SEND";
public static final String ACTION_MOGO = "com.mogo.ACTION";
private IMogoIntentManager mMogoIntentManager;
public MogoReceiver(Context context) {

View File

@@ -21,6 +21,11 @@ public class MogoRefreshStrategyController implements IMogoRefreshStrategyContro
MogoServices.getInstance().restartAutoRefreshAtTime( delay );
}
@Override
public void clearAllData() {
MogoServices.getInstance().clearAllData();
}
@Override
public void init( Context context ) {