opt
This commit is contained in:
@@ -26,6 +26,7 @@ import com.mogo.service.map.IMogoMapService;
|
||||
import com.mogo.service.module.IMogoActionManager;
|
||||
import com.mogo.service.module.IMogoRegisterCenter;
|
||||
import com.mogo.service.statusmanager.IMogoStatusManager;
|
||||
import com.mogo.utils.logger.Logger;
|
||||
import com.zhidao.carchattingprovider.CallChattingProviderConstant;
|
||||
|
||||
/**
|
||||
@@ -195,11 +196,9 @@ public class MarkerServiceHandler {
|
||||
/**
|
||||
* 对指定类型高亮处理
|
||||
* 建议使用
|
||||
*
|
||||
* @see MapMarkerManager#highlightedMarker(String, boolean)
|
||||
*/
|
||||
@Deprecated
|
||||
public static void highlightedMarker( String typeTag ) {
|
||||
getMapMarkerManager().highlightedMarker( typeTag, false );
|
||||
Logger.w( TAG, "do not invoke this method any more." );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -493,6 +493,7 @@ public class MogoServices implements IMogoMapListener,
|
||||
if ( mStatusManager.isUserInteracted() ) {
|
||||
mLastCustomRefreshCenterLocation = latLng;
|
||||
mLastZoomLevel = zoom;
|
||||
Logger.d( TAG, "user interacted" );
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -500,6 +501,7 @@ public class MogoServices implements IMogoMapListener,
|
||||
if ( mStatusManager.isV2XShow() ) {
|
||||
mLastCustomRefreshCenterLocation = latLng;
|
||||
mLastZoomLevel = zoom;
|
||||
Logger.d( TAG, "user v2x show" );
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -507,6 +509,7 @@ public class MogoServices implements IMogoMapListener,
|
||||
if ( mStatusManager.isSearchUIShow() ) {
|
||||
mLastCustomRefreshCenterLocation = latLng;
|
||||
mLastZoomLevel = zoom;
|
||||
Logger.d( TAG, "user search Ui show" );
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -555,7 +558,7 @@ public class MogoServices implements IMogoMapListener,
|
||||
}
|
||||
float distance = Utils.calculateLineDistance( latLng, mLastCustomRefreshCenterLocation );
|
||||
Logger.d( TAG, "move distance = %s, factor = %s", distance, factor );
|
||||
return distance > factor;
|
||||
return distance > factor / 2;
|
||||
} catch ( Exception e ) {
|
||||
Logger.e( TAG, e, "warming. " );
|
||||
return false;
|
||||
@@ -684,8 +687,6 @@ public class MogoServices implements IMogoMapListener,
|
||||
private void onAdasOn() {
|
||||
// ADAS 时,不在自动刷新打点策略
|
||||
stopAutoRefreshStrategy();
|
||||
// 清除所有的打点信息记录
|
||||
MarkerServiceHandler.getMapMarkerManager().alreadySmallMarker.clear();
|
||||
}
|
||||
|
||||
private void onAdasClosed() {
|
||||
|
||||
@@ -1,19 +1,13 @@
|
||||
package com.mogo.module.service.marker;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import android.view.animation.BounceInterpolator;
|
||||
import android.view.animation.OvershootInterpolator;
|
||||
|
||||
import com.mogo.map.MogoLatLng;
|
||||
import com.mogo.map.location.MogoLocation;
|
||||
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.MogoMarkersHandler;
|
||||
import com.mogo.module.common.ModuleNames;
|
||||
import com.mogo.module.common.entity.MarkerCarPois;
|
||||
import com.mogo.module.common.entity.MarkerCardResult;
|
||||
@@ -30,7 +24,6 @@ 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.cardmanager.IMogoCardChangedListener;
|
||||
import com.mogo.service.connection.IMogoOnMessageListener;
|
||||
import com.mogo.service.module.IMogoBizActionDoneListener;
|
||||
import com.mogo.utils.ThreadPoolService;
|
||||
@@ -54,28 +47,18 @@ import java.util.Map;
|
||||
* version: 1.0
|
||||
*/
|
||||
public class MapMarkerManager implements IMogoMarkerClickListener,
|
||||
IMogoOnMessageListener< MarkerResponse >, IMogoCardChangedListener,
|
||||
IMogoOnMessageListener< MarkerResponse >,
|
||||
IMogoBizActionDoneListener {
|
||||
private static final String TAG = "MapMarkerManager";
|
||||
// 是否选中在线卡片及气泡,语音搜索触发
|
||||
private boolean mIsAISearchOnlineData = false;
|
||||
|
||||
private Context mContext;
|
||||
// 最后一次选中的气泡
|
||||
private IMogoMarker mLastCheckMarker;
|
||||
private static MapMarkerManager mMarkerManager;
|
||||
|
||||
private String mCurrentModuleName = ServiceConst.CARD_TYPE_BUSINESS_OPERATION;
|
||||
// 记录其它已经缩小的Marker
|
||||
public ArrayList< String > alreadySmallMarker = new ArrayList<>();
|
||||
// 存储所有汽车marker
|
||||
// public ArrayList<IMogoMarker> carMarkers = new ArrayList<>();
|
||||
// 距离用户最近的Marker
|
||||
private IMogoMarker mNearlyMarker = null;
|
||||
// 记录上次请求数据,切换卡片时做数据处理
|
||||
private MarkerCardResult mLastDataResult;
|
||||
|
||||
private boolean mIsMarkerClicked = false;
|
||||
private RefreshModel mRefreshModel;
|
||||
private MogoLatLng mCarLatLng;
|
||||
// 平滑移动事件间隔(单位:秒)
|
||||
@@ -105,7 +88,6 @@ public class MapMarkerManager implements IMogoMarkerClickListener,
|
||||
|
||||
// 长连接
|
||||
MarkerServiceHandler.getMogoSocketManager().registerOnMessageListener( 401001, this );
|
||||
MarkerServiceHandler.getMogoCardManager().registerCardChangedListener( TAG, this );
|
||||
MarkerServiceHandler.getActionManager().registerBizActionDoneListener( this );
|
||||
}
|
||||
|
||||
@@ -115,30 +97,11 @@ public class MapMarkerManager implements IMogoMarkerClickListener,
|
||||
Logger.e( TAG, "do not invoke anymore." );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSwitched( int position, String moduleName ) {
|
||||
Logger.d( TAG, "当前C位卡片:" + moduleName );
|
||||
if ( ( TextUtils.isEmpty( mCurrentModuleName ) || TextUtils.equals( mCurrentModuleName,
|
||||
ServiceConst.CARD_TYPE_BUSINESS_OPERATION ) ) && mIsMarkerClicked ) {
|
||||
mIsMarkerClicked = false;
|
||||
// 在广告位(默认位置)点击marker造成卡片切换的,还是现实全部marker 【需求:os2.0.2-2.5-4】
|
||||
highlightedMarker( moduleName, false );
|
||||
mCurrentModuleName = moduleName;
|
||||
} else {
|
||||
mCurrentModuleName = moduleName;
|
||||
runOnTargetThread( () -> {
|
||||
MarkerServiceHandler.getMarkerManager().removeMarkersExcept( ModuleNames.CARD_TYPE_USER_DATA );
|
||||
drawMarkerByCurrentType( mLastDataResult );
|
||||
} );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 地图上的Marker点击回调
|
||||
*/
|
||||
@Override
|
||||
public boolean onMarkerClicked( IMogoMarker marker ) {
|
||||
mIsMarkerClicked = true;
|
||||
Logger.d( TAG, "onMarkerClicked 点击了大而全中的Marker:" + marker );
|
||||
try {
|
||||
boolean result = switchMarkerOpenStatus( marker );
|
||||
@@ -173,90 +136,6 @@ public class MapMarkerManager implements IMogoMarkerClickListener,
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
// 对指定类型高亮处理
|
||||
public synchronized void highlightedMarker( final String typeTag ) {
|
||||
highlightedMarker( typeTag, false );
|
||||
}
|
||||
|
||||
public synchronized void highlightedMarker( final String typeTag, final boolean netDataRefresh ) {
|
||||
try {
|
||||
Logger.e( TAG, "上一次选中的卡片类型:mCurrentModuleName==" + mCurrentModuleName );
|
||||
if ( !TextUtils.isEmpty( mCurrentModuleName ) && TextUtils.equals( mCurrentModuleName,
|
||||
typeTag ) && !netDataRefresh ) {
|
||||
return;
|
||||
}
|
||||
// 从已经缩小的记录删除
|
||||
alreadySmallMarker.remove( typeTag );
|
||||
List< IMogoMarker > currentHighLightList =
|
||||
MarkerServiceHandler.getMarkerManager().getMarkers( typeTag );
|
||||
|
||||
if ( currentHighLightList == null || currentHighLightList.size() == 0 ) {
|
||||
alreadySmallMarker.clear();
|
||||
// 放大所有的气泡
|
||||
Map< String, List< IMogoMarker > > lastHighLightList =
|
||||
MarkerServiceHandler.getMarkerManager().getAllMarkers();
|
||||
for ( String markerName : lastHighLightList.keySet() ) {
|
||||
setMarkersBig( lastHighLightList.get( markerName ) );
|
||||
}
|
||||
} else {
|
||||
// 缩小其他的气泡
|
||||
Map< String, List< IMogoMarker > > lastHighLightList =
|
||||
MarkerServiceHandler.getMarkerManager().getAllMarkers();
|
||||
for ( String markerName : lastHighLightList.keySet() ) {
|
||||
if ( !markerName.equals( typeTag ) ) {
|
||||
if ( !alreadySmallMarker.contains( markerName ) ) {
|
||||
alreadySmallMarker.add( markerName );
|
||||
setMarkersSmall( lastHighLightList.get( markerName ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 将当前卡片选中的气泡放大
|
||||
setMarkersBig( currentHighLightList );
|
||||
}
|
||||
|
||||
} catch ( Exception e ) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private static void setMarkersBig( List< IMogoMarker > markers ) {
|
||||
if ( markers == null || markers.isEmpty() ) {
|
||||
return;
|
||||
}
|
||||
for ( IMogoMarker mogoMarker : markers ) {
|
||||
if ( mogoMarker == null || mogoMarker.isDestroyed() ) {
|
||||
continue;
|
||||
}
|
||||
try {
|
||||
mogoMarker.startScaleAnimation( 0.6f, 1f, 0.6f, 1f, 1000, new BounceInterpolator() );
|
||||
} catch ( Exception e ) {
|
||||
Logger.e( TAG, e, "error." );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void setMarkersSmall( List< IMogoMarker > markers ) {
|
||||
if ( markers == null || markers.isEmpty() ) {
|
||||
return;
|
||||
}
|
||||
for ( IMogoMarker mogoMarker : markers ) {
|
||||
smallMarker( mogoMarker );
|
||||
}
|
||||
}
|
||||
|
||||
private static void smallMarker( IMogoMarker mogoMarker ) {
|
||||
if ( mogoMarker == null || mogoMarker.isDestroyed() ) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
mogoMarker.startScaleAnimation( 1f, 0.6f, 1f, 0.6f, 300, new OvershootInterpolator() );
|
||||
} catch ( Exception e ) {
|
||||
Logger.e( TAG, e, "error." );
|
||||
}
|
||||
}
|
||||
|
||||
// 展开气泡
|
||||
private void openMarker( IMogoMarker mogoMarker ) {
|
||||
if ( mogoMarker == null ) {
|
||||
@@ -339,21 +218,7 @@ public class MapMarkerManager implements IMogoMarkerClickListener,
|
||||
dispatchDataToBiz();
|
||||
} );
|
||||
|
||||
// 语音触发的在线车辆搜索,采用增量的形式绘制
|
||||
if ( mIsAISearchOnlineData = isOnlineCarDataOnly( mLastDataResult ) ) {
|
||||
MarkerServiceHandler.getMarkerManager().removeMarkers( ServiceConst.CARD_TYPE_USER_DATA );
|
||||
MarkerServiceHandler.getMogoCardManager().switch2( ServiceConst.CARD_TYPE_USER_DATA );
|
||||
} else {
|
||||
mLastCheckMarker = null;
|
||||
// 清空所有地图上绘制的Marker
|
||||
MarkerServiceHandler.getMarkerManager().removeMarkersExcept( ModuleNames.CARD_TYPE_USER_DATA );
|
||||
}
|
||||
|
||||
drawMarkerByCurrentType( mLastDataResult );
|
||||
// 同步新绘制的气泡状态
|
||||
alreadySmallMarker.clear();
|
||||
// highlightedMarker( mCurrentModuleName, true );
|
||||
|
||||
trackData( mLastDataResult );
|
||||
}
|
||||
|
||||
@@ -385,11 +250,6 @@ public class MapMarkerManager implements IMogoMarkerClickListener,
|
||||
return;
|
||||
}
|
||||
|
||||
if ( TextUtils.isEmpty( mCurrentModuleName ) ) {
|
||||
// 默认大而全
|
||||
mCurrentModuleName = ServiceConst.CARD_TYPE_BUSINESS_OPERATION;
|
||||
}
|
||||
|
||||
drawAllMarker( markerCardResult );
|
||||
}
|
||||
|
||||
@@ -399,14 +259,12 @@ public class MapMarkerManager implements IMogoMarkerClickListener,
|
||||
* @param markerCardResult
|
||||
*/
|
||||
private void drawAllMarker( MarkerCardResult markerCardResult ) {
|
||||
// List<MarkerOnlineCar> onlineCarList = markerCardResult.getOnlineCar();
|
||||
List< MarkerExploreWay > exploreWayList = markerCardResult.getExploreWay();
|
||||
List< MarkerShareMusic > shareMusicList = markerCardResult.getShareMusic();
|
||||
// List< MarkerShareMusic > shareMusicList = markerCardResult.getShareMusic();
|
||||
List< MarkerNoveltyInfo > noveltyInfoList = markerCardResult.getNoveltyInfo();
|
||||
|
||||
// drawOnlineCarMarkers(onlineCarList, ServiceConst.MAX_AMOUNT_ALL);
|
||||
drawRoadConditionMarker( exploreWayList, ServiceConst.MAX_AMOUNT_ALL );
|
||||
drawShareMusicMarker( shareMusicList, ServiceConst.MAX_AMOUNT_ALL );
|
||||
// drawShareMusicMarker( shareMusicList, ServiceConst.MAX_AMOUNT_ALL );
|
||||
drawNoveltyMarker( noveltyInfoList, ServiceConst.MAX_AMOUNT_ALL );
|
||||
}
|
||||
|
||||
@@ -421,10 +279,9 @@ public class MapMarkerManager implements IMogoMarkerClickListener,
|
||||
return;
|
||||
}
|
||||
|
||||
double nearlyDistance = Float.MAX_VALUE;
|
||||
int size = getAppropriateSize( maxAmount, onlineCarList );
|
||||
|
||||
Map< String, IMogoMarker > existCarMap = purgeCarsData( onlineCarList );
|
||||
Map< String, IMogoMarker > existCarMap = purgeMarkerData( onlineCarList, ModuleNames.CARD_TYPE_USER_DATA );
|
||||
|
||||
for ( int i = 0; i < size; i++ ) {
|
||||
MarkerOnlineCar markerOnlineCar = onlineCarList.get( i );
|
||||
@@ -439,119 +296,13 @@ public class MapMarkerManager implements IMogoMarkerClickListener,
|
||||
markerShowEntity.setIconUrl( markerOnlineCar.getUserInfo().getUserHead() );
|
||||
}
|
||||
|
||||
if ( markerOnlineCar.getUserInfo() == null || TextUtils.isEmpty( markerOnlineCar.getUserInfo().getSn() ) ) {
|
||||
continue;
|
||||
}
|
||||
IMogoMarker mogoMarker = existCarMap.get( markerOnlineCar.getUserInfo().getSn() );
|
||||
String sn = getCarSnFromEntity( markerOnlineCar );
|
||||
IMogoMarker mogoMarker = existCarMap.get( sn );
|
||||
if ( mogoMarker == null ) {
|
||||
Logger.d( TAG, "car [%s] need be create.", markerOnlineCar.getUserInfo().getSn() );
|
||||
mogoMarker = drawMapMarker( markerShowEntity );
|
||||
}
|
||||
startSmooth( mogoMarker, markerOnlineCar, markerLocation );
|
||||
|
||||
// 计算在线车辆距离当前车辆的距离,每次都与最后一次距离最近的进行比较,保留距离最近的车辆,进行卡片展示
|
||||
try {
|
||||
// 当前车辆的位置
|
||||
MogoLocation currentLocation = MarkerServiceHandler.getMogoLocationClient().getLastKnowLocation();
|
||||
|
||||
// 计算车辆距离指定气泡的距离
|
||||
float calculateDistance =
|
||||
Utils.calculateLineDistance( new MogoLatLng( markerLocation.getLat(),
|
||||
markerLocation.getLon() ),
|
||||
new MogoLatLng( currentLocation.getLatitude(),
|
||||
currentLocation.getLongitude() ) );
|
||||
|
||||
// 进行比较,保留最近的一个数据
|
||||
if ( calculateDistance < nearlyDistance ) {
|
||||
nearlyDistance = calculateDistance;
|
||||
mNearlyMarker = mogoMarker;
|
||||
}
|
||||
|
||||
} catch ( Exception e ) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
Logger.d( TAG, "距离当前车辆位置最近的距离为:" + nearlyDistance );
|
||||
|
||||
try {
|
||||
// 在ACC on 之后第一次获取到了在线车辆数据,选中最近的一个Marker
|
||||
if ( !mIsAISearchOnlineData ) {
|
||||
return;
|
||||
}
|
||||
if ( mNearlyMarker == null ) {
|
||||
return;
|
||||
}
|
||||
Logger.d( TAG, "语音搜索触发,默认选中最近的在线车辆:" + mNearlyMarker );
|
||||
// 移动地图到指定位置
|
||||
MarkerServiceHandler.getMogoStatusManager().setUserInteractionStatus( ServiceConst.TYPE, true, false );
|
||||
MarkerServiceHandler.getMapUIController().moveToCenter( mNearlyMarker.getPosition() );
|
||||
onMarkerClicked( mNearlyMarker );
|
||||
MogoMarkersHandler.getInstance().onMarkerClicked( mNearlyMarker );
|
||||
mIsAISearchOnlineData = false;
|
||||
|
||||
} catch ( Exception e ) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据新的在线车辆列表,选出已存在的在线车辆,并从视图和内存中移除不存在的在线车辆
|
||||
*
|
||||
* @param newCarsList
|
||||
* @return
|
||||
*/
|
||||
private Map< String, IMogoMarker > purgeCarsData( List< MarkerOnlineCar > newCarsList ) {
|
||||
|
||||
final long start = System.currentTimeMillis();
|
||||
Map< String, IMogoMarker > existCarsMap = new HashMap<>();
|
||||
List< IMogoMarker > allCarsList = MarkerServiceHandler.getMarkerManager().getMarkers( ModuleNames.CARD_TYPE_USER_DATA );
|
||||
if ( allCarsList == null || allCarsList.isEmpty() ) {
|
||||
return existCarsMap;
|
||||
}
|
||||
if ( newCarsList == null || newCarsList.isEmpty() ) {
|
||||
return existCarsMap;
|
||||
}
|
||||
|
||||
Map< String, IMogoMarker > allCarsMap = new HashMap<>();
|
||||
for ( IMogoMarker marker : allCarsList ) {
|
||||
String sn = getCarSnFromMarker( marker );
|
||||
Logger.d( TAG, "sn = [%s]", sn );
|
||||
allCarsMap.put( sn, marker );
|
||||
}
|
||||
for ( MarkerOnlineCar markerOnlineCar : newCarsList ) {
|
||||
String sn = markerOnlineCar.getUserInfo().getSn();
|
||||
if ( allCarsMap.containsKey( sn ) ) {
|
||||
Logger.d( TAG, " car [%s] is cached.", sn );
|
||||
existCarsMap.put( sn, allCarsMap.get( sn ) );
|
||||
}
|
||||
}
|
||||
for ( String sn : allCarsMap.keySet() ) {
|
||||
if ( !existCarsMap.containsKey( sn ) ) {
|
||||
IMogoMarker dirtyMarker = allCarsMap.get( sn );
|
||||
allCarsList.remove( dirtyMarker );
|
||||
dirtyMarker.destroy();
|
||||
Logger.d( TAG, " car [%s] is destroy.", sn );
|
||||
}
|
||||
}
|
||||
allCarsMap.clear();
|
||||
Logger.i( "timer", "purge data cost " + ( System.currentTimeMillis() - start ) + "ms" );
|
||||
return existCarsMap;
|
||||
}
|
||||
|
||||
private String getCarSnFromMarker( IMogoMarker marker ) {
|
||||
if ( marker == null || marker.getObject() == null || marker.isDestroyed() ) {
|
||||
return null;
|
||||
}
|
||||
if ( !( marker.getObject() instanceof MarkerShowEntity ) ) {
|
||||
return null;
|
||||
}
|
||||
if ( !( ( ( MarkerShowEntity ) marker.getObject() ).getBindObj() instanceof MarkerOnlineCar ) ) {
|
||||
return null;
|
||||
}
|
||||
if ( ( ( MarkerOnlineCar ) ( ( MarkerShowEntity ) marker.getObject() ).getBindObj() ).getUserInfo() == null ) {
|
||||
return null;
|
||||
}
|
||||
return ( ( MarkerOnlineCar ) ( ( MarkerShowEntity ) marker.getObject() ).getBindObj() ).getUserInfo().getSn();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -562,9 +313,11 @@ public class MapMarkerManager implements IMogoMarkerClickListener,
|
||||
private void drawRoadConditionMarker( List< MarkerExploreWay > exploreWayList, int maxAmount ) {
|
||||
// 将数据同步给探路,避免探路每次 perform 的时候去拉取,造成消耗
|
||||
if ( exploreWayList == null || exploreWayList.isEmpty() ) {
|
||||
MarkerServiceHandler.getMarkerManager().removeMarkers( ModuleNames.CARD_TYPE_ROAD_CONDITION );
|
||||
return;
|
||||
}
|
||||
int size = getAppropriateSize( maxAmount, exploreWayList );
|
||||
Map< String, IMogoMarker > existCarMap = purgeMarkerData( exploreWayList, ModuleNames.CARD_TYPE_ROAD_CONDITION );
|
||||
for ( int i = 0; i < size; i++ ) {
|
||||
MarkerExploreWay markerExploreWay = exploreWayList.get( i );
|
||||
if ( !markerExploreWay.getCanLive() ) {
|
||||
@@ -576,21 +329,28 @@ public class MapMarkerManager implements IMogoMarkerClickListener,
|
||||
markerShowEntity.setMarkerType( markerExploreWay.getType() );
|
||||
markerShowEntity.setTextContent( markerExploreWay.getAddr() );
|
||||
|
||||
drawMapMarker( markerShowEntity );
|
||||
String sn = getCarSnFromEntity( markerExploreWay );
|
||||
IMogoMarker mogoMarker = existCarMap.get( sn );
|
||||
if ( mogoMarker == null ) {
|
||||
drawMapMarker( markerShowEntity );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 共享音乐
|
||||
*
|
||||
* @param shareMusicList
|
||||
*/
|
||||
private void drawShareMusicMarker( List< MarkerShareMusic > shareMusicList, int maxAmount ) {
|
||||
if ( shareMusicList == null ) {
|
||||
if ( shareMusicList == null || shareMusicList.isEmpty() ) {
|
||||
MarkerServiceHandler.getMarkerManager().removeMarkers( ModuleNames.CARD_TYPE_SHARE_MUSIC );
|
||||
return;
|
||||
}
|
||||
int size = getAppropriateSize( maxAmount, shareMusicList );
|
||||
Map< String, IMogoMarker > existCarMap = purgeMarkerData( shareMusicList, ModuleNames.CARD_TYPE_SHARE_MUSIC );
|
||||
for ( int i = 0; i < size; i++ ) {
|
||||
MarkerShareMusic markerShareMusic = shareMusicList.get( i );
|
||||
MarkerLocation markerLocation = markerShareMusic.getLocation();
|
||||
@@ -601,7 +361,11 @@ public class MapMarkerManager implements IMogoMarkerClickListener,
|
||||
markerShowEntity.setTextContent( markerShareMusic.getMediaName() );
|
||||
markerShowEntity.setIconUrl( markerShareMusic.getMediaImg() );
|
||||
|
||||
drawMapMarker( markerShowEntity );
|
||||
String sn = getCarSnFromEntity( markerShareMusic );
|
||||
IMogoMarker mogoMarker = existCarMap.get( sn );
|
||||
if ( mogoMarker == null ) {
|
||||
drawMapMarker( markerShowEntity );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -611,10 +375,12 @@ public class MapMarkerManager implements IMogoMarkerClickListener,
|
||||
* @param noveltyInfoList
|
||||
*/
|
||||
private void drawNoveltyMarker( List< MarkerNoveltyInfo > noveltyInfoList, int maxAmount ) {
|
||||
if ( noveltyInfoList == null ) {
|
||||
if ( noveltyInfoList == null || noveltyInfoList.isEmpty() ) {
|
||||
MarkerServiceHandler.getMarkerManager().removeMarkers( ModuleNames.CARD_TYPE_NOVELTY );
|
||||
return;
|
||||
}
|
||||
int size = getAppropriateSize( maxAmount, noveltyInfoList );
|
||||
Map< String, IMogoMarker > existCarMap = purgeMarkerData( noveltyInfoList, ModuleNames.CARD_TYPE_NOVELTY );
|
||||
for ( int i = 0; i < size; i++ ) {
|
||||
MarkerNoveltyInfo noveltyInfo = noveltyInfoList.get( i );
|
||||
MarkerLocation markerLocation = noveltyInfo.getLocation();
|
||||
@@ -628,10 +394,83 @@ public class MapMarkerManager implements IMogoMarkerClickListener,
|
||||
} else {
|
||||
markerShowEntity.setTextContent( noveltyInfo.getContentData().getTitle() );
|
||||
}
|
||||
drawMapMarker( markerShowEntity );
|
||||
String sn = getCarSnFromEntity( noveltyInfo );
|
||||
IMogoMarker mogoMarker = existCarMap.get( sn );
|
||||
if ( mogoMarker == null ) {
|
||||
drawMapMarker( markerShowEntity );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* S = (A ∩ B) ∪ B
|
||||
* (A ∩ B)作为旧列表需要保留的部分
|
||||
*
|
||||
* @param newList
|
||||
* @return
|
||||
*/
|
||||
private Map< String, IMogoMarker > purgeMarkerData( List newList, String markerType ) {
|
||||
|
||||
final long start = System.currentTimeMillis();
|
||||
Map< String, IMogoMarker > existMap = new HashMap<>();
|
||||
List< IMogoMarker > allCarsList = MarkerServiceHandler.getMarkerManager().getMarkers( markerType );
|
||||
if ( allCarsList == null || allCarsList.isEmpty() ) {
|
||||
return existMap;
|
||||
}
|
||||
if ( newList == null || newList.isEmpty() ) {
|
||||
return existMap;
|
||||
}
|
||||
|
||||
Map< String, IMogoMarker > allMap = new HashMap<>();
|
||||
for ( IMogoMarker marker : allCarsList ) {
|
||||
String sn = getCarSnFromMarker( marker );
|
||||
allMap.put( sn, marker );
|
||||
}
|
||||
for ( Object entity : newList ) {
|
||||
String sn = getCarSnFromEntity( entity );
|
||||
if ( allMap.containsKey( sn ) ) {
|
||||
existMap.put( sn, allMap.get( sn ) );
|
||||
}
|
||||
}
|
||||
for ( String sn : allMap.keySet() ) {
|
||||
if ( !existMap.containsKey( sn ) ) {
|
||||
IMogoMarker dirtyMarker = allMap.get( sn );
|
||||
allCarsList.remove( dirtyMarker );
|
||||
dirtyMarker.destroy();
|
||||
}
|
||||
}
|
||||
allMap.clear();
|
||||
Logger.i( "timer", "purge data cost " + ( System.currentTimeMillis() - start ) + "ms" );
|
||||
return existMap;
|
||||
}
|
||||
|
||||
private String getCarSnFromEntity( Object entity ) {
|
||||
try {
|
||||
if ( entity instanceof MarkerOnlineCar ) {
|
||||
return ( ( MarkerOnlineCar ) entity ).getUserInfo().getSn();
|
||||
} else if ( entity instanceof MarkerShareMusic ) {
|
||||
return ( ( MarkerShareMusic ) entity ).getUserInfo().getSn();
|
||||
} else if ( entity instanceof MarkerNoveltyInfo ) {
|
||||
return ( ( MarkerNoveltyInfo ) entity ).getSn();
|
||||
} else if ( entity instanceof MarkerExploreWay ) {
|
||||
return ( ( MarkerExploreWay ) entity ).getUserInfo().getSn();
|
||||
}
|
||||
} catch ( Exception e ) {
|
||||
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
private String getCarSnFromMarker( IMogoMarker marker ) {
|
||||
if ( marker == null || marker.getObject() == null || marker.isDestroyed() ) {
|
||||
return null;
|
||||
}
|
||||
if ( !( marker.getObject() instanceof MarkerShowEntity ) ) {
|
||||
return null;
|
||||
}
|
||||
return getCarSnFromEntity( ( ( MarkerShowEntity ) marker.getObject() ).getBindObj() );
|
||||
}
|
||||
|
||||
/**
|
||||
* @param maxAmount 展示的最大数量
|
||||
* @param list
|
||||
@@ -811,18 +650,14 @@ public class MapMarkerManager implements IMogoMarkerClickListener,
|
||||
*/
|
||||
public synchronized IMogoMarker drawMapMarker( MarkerShowEntity markerShowEntity ) {
|
||||
try {
|
||||
return drawMapMarker( markerShowEntity, isSmallType() );
|
||||
return drawMapMarkerImpl( markerShowEntity );
|
||||
} catch ( Exception e ) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isSmallType() {
|
||||
return !TextUtils.isEmpty( mCurrentModuleName ) && mLastCheckMarker != null && !mLastCheckMarker.isDestroyed() && TextUtils.equals( mCurrentModuleName, mLastCheckMarker.getOwner() );
|
||||
}
|
||||
|
||||
private IMogoMarker drawMapMarker( MarkerShowEntity markerShowEntity, boolean isSmall ) {
|
||||
private IMogoMarker drawMapMarkerImpl( MarkerShowEntity markerShowEntity ) {
|
||||
if ( markerShowEntity == null || markerShowEntity.getMarkerLocation() == null ) {
|
||||
return null;
|
||||
}
|
||||
@@ -843,12 +678,6 @@ public class MapMarkerManager implements IMogoMarkerClickListener,
|
||||
marker.setOwner( markerShowEntity.getMarkerType() );
|
||||
markerView.setMarker( marker );
|
||||
marker.setOnMarkerClickListener( this );
|
||||
|
||||
if ( isSmall ) {
|
||||
List< IMogoMarker > markers = new ArrayList<>();
|
||||
markers.add( marker );
|
||||
setMarkersSmall( markers );
|
||||
}
|
||||
markerShowEntity.setMarker( marker );
|
||||
return marker;
|
||||
}
|
||||
@@ -906,9 +735,6 @@ public class MapMarkerManager implements IMogoMarkerClickListener,
|
||||
}
|
||||
|
||||
List< MarkerOnlineCar > onlineCarList = result.getOnlineCar();
|
||||
if ( !MarkerServiceHandler.getMogoStatusManager().isADASShow() ) {
|
||||
dispatchDataToBis( ServiceConst.CARD_TYPE_USER_DATA, onlineCarList == null ? new ArrayList<>() : onlineCarList );
|
||||
}
|
||||
if ( MarkerServiceHandler.getMogoStatusManager().isSearchUIShow() ) {
|
||||
return;
|
||||
}
|
||||
@@ -933,15 +759,7 @@ public class MapMarkerManager implements IMogoMarkerClickListener,
|
||||
if ( MarkerServiceHandler.getMogoStatusManager().isSearchUIShow() ) {
|
||||
return true;
|
||||
}
|
||||
if ( MarkerServiceHandler.getMogoStatusManager().isADASShow() ) {
|
||||
return false;
|
||||
}
|
||||
if ( TextUtils.equals( ServiceConst.CARD_TYPE_USER_DATA, mCurrentModuleName )
|
||||
|| TextUtils.equals( ServiceConst.CARD_TYPE_BUSINESS_OPERATION, mCurrentModuleName )
|
||||
|| TextUtils.equals( ServiceConst.CARD_TYPE_CARS_CHATTING, mCurrentModuleName ) ) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
private void removeCarMarkers() {
|
||||
@@ -1016,7 +834,7 @@ public class MapMarkerManager implements IMogoMarkerClickListener,
|
||||
}
|
||||
|
||||
public String getCurrentModuleName() {
|
||||
return mCurrentModuleName;
|
||||
return "";
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user