adaptee) {
+ this.adaptee = adaptee;
+ }
+
+ @Override
+ public void onScrollStart(@NonNull T currentItemHolder, int adapterPosition) {
+
+ }
+
+ @Override
+ public void onScrollEnd(@NonNull T currentItemHolder, int adapterPosition) {
+
+ }
+
+ @Override
+ public void onScroll(float scrollPosition,
+ int currentIndex, int newIndex,
+ @Nullable T currentHolder, @Nullable T newCurrentHolder) {
+ adaptee.onScroll(scrollPosition, currentIndex, newIndex, currentHolder, newCurrentHolder);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof ScrollListenerAdapter) {
+ return adaptee.equals(((ScrollListenerAdapter) obj).adaptee);
+ } else {
+ return super.equals(obj);
+ }
+ }
+}
diff --git a/libraries/card-library/src/main/res/values/attr.xml b/libraries/card-library/src/main/res/values/attr.xml
new file mode 100644
index 0000000000..7310089318
--- /dev/null
+++ b/libraries/card-library/src/main/res/values/attr.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/libraries/card-library/src/main/res/values/strings.xml b/libraries/card-library/src/main/res/values/strings.xml
new file mode 100644
index 0000000000..4909bfbff7
--- /dev/null
+++ b/libraries/card-library/src/main/res/values/strings.xml
@@ -0,0 +1,4 @@
+
+ You should not set LayoutManager on DiscreteScrollView.class instance. Library uses a special one. Just don\'t call the method.
+ InfiniteScrollAdapter is supposed to work only with DiscreteScrollView
+
diff --git a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapNaviViewWrapper.java b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapNaviViewWrapper.java
index bc39f455c6..65d62c8ff2 100644
--- a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapNaviViewWrapper.java
+++ b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapNaviViewWrapper.java
@@ -7,6 +7,7 @@ import android.graphics.Point;
import android.graphics.Rect;
import android.os.Bundle;
import android.os.SystemClock;
+import android.os.Trace;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.Interpolator;
@@ -319,7 +320,9 @@ public class AMapNaviViewWrapper implements IMogoMapView,
@Override
public void onLockMap( boolean isLock ) {
Logger.d( TAG, "lock status = %s", isLock );
+ Trace.beginSection( "timer.onCameraChangeFinish" );
MogoMapListenerHandler.getInstance().onLockMap( isLock );
+ Trace.endSection();
}
@Override
@@ -418,7 +421,6 @@ public class AMapNaviViewWrapper implements IMogoMapView,
}
-
private boolean checkAMapView() {
if ( mMapView == null ) {
Logger.e( TAG, "高德mapView实例为空,请检查" );
@@ -549,17 +551,19 @@ public class AMapNaviViewWrapper implements IMogoMapView,
@Override
public void onCameraChangeFinish( CameraPosition cameraPosition ) {
if ( cameraPosition != null ) {
- MogoMapListenerHandler.getInstance()
- .onMapChanged( ObjectUtils.fromAMap( cameraPosition.target ), cameraPosition.zoom,
- cameraPosition.tilt, cameraPosition.bearing );
+ Trace.beginSection( "timer.onCameraChangeFinish" );
+ MogoMapListenerHandler.getInstance().onMapChanged( ObjectUtils.fromAMap( cameraPosition.target ),
+ cameraPosition.zoom,
+ cameraPosition.tilt,
+ cameraPosition.bearing );
+ Trace.endSection();
}
}
@Override
public MogoLatLng getCameraNorthEastPosition() {
try {
- return ObjectUtils.fromAMap(
- mMapView.getMap().getProjection().getVisibleRegion().latLngBounds.northeast );
+ return ObjectUtils.fromAMap( mMapView.getMap().getProjection().getVisibleRegion().latLngBounds.northeast );
} catch ( Exception e ) {
}
@@ -569,8 +573,7 @@ public class AMapNaviViewWrapper implements IMogoMapView,
@Override
public MogoLatLng getCameraSouthWestPosition() {
try {
- return ObjectUtils.fromAMap(
- mMapView.getMap().getProjection().getVisibleRegion().latLngBounds.southwest );
+ return ObjectUtils.fromAMap( mMapView.getMap().getProjection().getVisibleRegion().latLngBounds.southwest );
} catch ( Exception e ) {
}
diff --git a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapWrapper.java b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapWrapper.java
index 9b73bf10ab..6372fcd37f 100644
--- a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapWrapper.java
+++ b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapWrapper.java
@@ -6,16 +6,21 @@ import com.amap.api.maps.AMap;
import com.amap.api.maps.CameraUpdateFactory;
import com.amap.api.maps.model.Marker;
import com.amap.api.maps.model.MarkerOptions;
+import com.amap.api.maps.model.Polyline;
+import com.amap.api.maps.model.PolylineOptions;
import com.amap.api.navi.AMapNaviView;
import com.mogo.map.IMogoMap;
import com.mogo.map.IMogoUiSettings;
import com.mogo.map.impl.amap.marker.AMapInfoWindowAdapter;
import com.mogo.map.impl.amap.marker.AMapMarkerWrapper;
+import com.mogo.map.impl.amap.overlay.AMapPolylineWrapper;
import com.mogo.map.impl.amap.uicontroller.AMapUIController;
import com.mogo.map.impl.amap.utils.ObjectUtils;
import com.mogo.map.marker.IMogoMarker;
import com.mogo.map.marker.MogoMarkerOptions;
import com.mogo.map.marker.MogoMarkersHandler;
+import com.mogo.map.overlay.IMogoPolyline;
+import com.mogo.map.overlay.MogoPolylineOptions;
import com.mogo.map.uicontroller.IMogoMapUIController;
import com.mogo.utils.logger.Logger;
@@ -219,6 +224,19 @@ public class AMapWrapper implements IMogoMap {
return 0;
}
+ @Override
+ public IMogoPolyline addPolyline( MogoPolylineOptions options ) {
+ if ( checkAMap() ) {
+ PolylineOptions polylineOptions = ObjectUtils.fromMogo( options );
+ if ( polylineOptions == null ) {
+ return null;
+ }
+ Polyline polyline = mAMap.addPolyline( polylineOptions );
+ return new AMapPolylineWrapper( polyline, options );
+ }
+ return null;
+ }
+
private boolean checkAMap() {
if ( mAMap == null ) {
Logger.e( TAG, "高德map实例为空,请检查" );
diff --git a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/location/ALocationClient.java b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/location/ALocationClient.java
index 8dc2020411..a551c302bc 100644
--- a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/location/ALocationClient.java
+++ b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/location/ALocationClient.java
@@ -1,6 +1,7 @@
package com.mogo.map.impl.amap.location;
import android.content.Context;
+import android.os.Trace;
import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
@@ -139,6 +140,7 @@ public class ALocationClient implements IMogoLocationClient {
aMapLocation.getLongitude() == 0.0D ) {
return;
}
+ Trace.beginSection("timer.onLocationChanged");
mLastLocation = ObjectUtils.fromAMap( aMapLocation );
synchronized ( sListeners ) {
Iterator< IMogoLocationListener > listenerIterator = sListeners.iterator();
@@ -146,6 +148,7 @@ public class ALocationClient implements IMogoLocationClient {
listenerIterator.next().onLocationChanged( mLastLocation.clone() );
}
}
+ Trace.endSection();
}
}
diff --git a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/marker/AMapMarkerWrapper.java b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/marker/AMapMarkerWrapper.java
index e248076708..a98e791870 100644
--- a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/marker/AMapMarkerWrapper.java
+++ b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/marker/AMapMarkerWrapper.java
@@ -294,7 +294,13 @@ public class AMapMarkerWrapper implements IMogoMarker, Observer {
@Override
public String getOwner() {
- return this.mOwner == null ? mMogoMarkerOptions.getOwner() : mOwner;
+ if ( mOwner != null ) {
+ return mOwner;
+ }
+ if ( mMogoMarkerOptions != null ) {
+ return mMogoMarkerOptions.getOwner();
+ }
+ return null;
}
@Override
diff --git a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/NaviListenerAdapter.java b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/NaviListenerAdapter.java
index 92cd15011f..81259970c1 100644
--- a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/NaviListenerAdapter.java
+++ b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/NaviListenerAdapter.java
@@ -2,6 +2,7 @@ package com.mogo.map.impl.amap.navi;
import android.content.Context;
import android.graphics.Rect;
+import android.os.Trace;
import com.amap.api.maps.model.Polyline;
import com.amap.api.navi.AMapNavi;
@@ -178,8 +179,10 @@ public class NaviListenerAdapter extends AMapNaviListenerAdapter {
@Override
public void onNaviInfoUpdate( NaviInfo naviInfo ) {
+ Trace.beginSection( "NaviListenerAdapter.onNaviInfoUpdate" );
MogoNaviListenerHandler.getInstance().onNaviInfoUpdate( ObjectUtils.fromAMap( mContext, naviInfo ) );
mNaviOverlayHelper.handleNaviInfoUpdate( naviInfo );
+ Trace.endSection();
}
@Override
@@ -201,8 +204,10 @@ public class NaviListenerAdapter extends AMapNaviListenerAdapter {
@Override
public void onLocationChange( AMapNaviLocation aMapNaviLocation ) {
+ Trace.beginSection( "NaviListenerAdapter.onLocationChange" );
super.onLocationChange( aMapNaviLocation );
mNaviOverlayHelper.handlePassedLocation( aMapNaviLocation );
+ Trace.endSection();
}
public void stopNavi() {
diff --git a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/overlay/AMapPolylineWrapper.java b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/overlay/AMapPolylineWrapper.java
new file mode 100644
index 0000000000..0c2766d842
--- /dev/null
+++ b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/overlay/AMapPolylineWrapper.java
@@ -0,0 +1,196 @@
+package com.mogo.map.impl.amap.overlay;
+
+import com.amap.api.maps.model.LatLng;
+import com.amap.api.maps.model.Polyline;
+import com.amap.api.maps.model.PolylineOptions;
+import com.mogo.map.MogoLatLng;
+import com.mogo.map.impl.amap.utils.ObjectUtils;
+import com.mogo.map.overlay.IMogoPolyline;
+import com.mogo.map.overlay.MogoPolylineOptions;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author congtaowang
+ * @since 2020-03-10
+ *
+ * 描述
+ */
+public class AMapPolylineWrapper implements IMogoPolyline {
+
+ private Polyline mPolyline;
+ private MogoPolylineOptions mOptions;
+ private boolean mIsDestroyed = false;
+
+ public AMapPolylineWrapper( Polyline mPolyline,
+ MogoPolylineOptions mOptions ) {
+ this.mPolyline = mPolyline;
+ this.mOptions = mOptions;
+ }
+
+ @Override
+ public void destroy() {
+ remove();
+ }
+
+ @Override
+ public void remove() {
+ if ( mPolyline != null ) {
+ mPolyline.remove();
+ }
+ mIsDestroyed = true;
+ }
+
+ @Override
+ public String getId() {
+ if ( mPolyline != null ) {
+ return mPolyline.getId();
+ }
+ return null;
+ }
+
+ @Override
+ public void setPoints( List< MogoLatLng > lonLats ) {
+ if ( lonLats == null || lonLats.isEmpty() ) {
+ mPolyline.setPoints( new ArrayList< LatLng >() );
+ return;
+ }
+ ArrayList< LatLng > points = new ArrayList<>();
+ for ( MogoLatLng lonLat : lonLats ) {
+ LatLng latLng = ObjectUtils.fromMogo2( lonLat );
+ if ( latLng == null ) {
+ continue;
+ }
+ points.add( latLng );
+ }
+ mPolyline.setPoints( points );
+ }
+
+ @Override
+ public List< MogoLatLng > getPoints() {
+ if ( mPolyline == null ) {
+ return null;
+ }
+ ArrayList< MogoLatLng > lonLats = new ArrayList<>();
+ List< LatLng > points = mPolyline.getPoints();
+ if ( points != null ) {
+ for ( LatLng latLng : points ) {
+ MogoLatLng lonLat = ObjectUtils.fromAMap( latLng );
+ if ( lonLat == null ) {
+ continue;
+ }
+ lonLats.add( lonLat );
+ }
+ }
+ return lonLats;
+ }
+
+ @Override
+ public void setGeodesic( boolean draw ) {
+ if ( mPolyline != null ) {
+ mPolyline.setGeodesic( draw );
+ }
+ }
+
+ @Override
+ public boolean isGeodesic() {
+ return mPolyline == null ? false : mPolyline.isGeodesic();
+ }
+
+ @Override
+ public void setDottedLine( boolean dottedLine ) {
+ if ( mPolyline != null ) {
+ mPolyline.setDottedLine( dottedLine );
+ }
+ }
+
+ @Override
+ public boolean isDottedLine() {
+ return mPolyline == null ? false : mPolyline.isDottedLine();
+ }
+
+ @Override
+ public void setWidth( float width ) {
+ if ( mPolyline != null ) {
+ mPolyline.setWidth( width );
+ }
+ }
+
+ @Override
+ public float getWidth() {
+ if ( mPolyline != null ) {
+ return mPolyline.getWidth();
+ }
+ return 0;
+ }
+
+ @Override
+ public void setColor( int color ) {
+ if ( mPolyline != null ) {
+ mPolyline.setColor( color );
+ }
+ }
+
+ @Override
+ public int getColor() {
+ if ( mPolyline != null ) {
+ return mPolyline.getColor();
+ }
+ return 0;
+ }
+
+ @Override
+ public void setZIndex( float zIndex ) {
+ if ( mPolyline != null ) {
+ mPolyline.setZIndex( zIndex );
+ }
+ }
+
+ @Override
+ public float getZIndex() {
+ if ( mPolyline != null ) {
+ return mPolyline.getZIndex();
+ }
+ return 0;
+ }
+
+ @Override
+ public void setVisible( boolean visible ) {
+ if ( mPolyline != null ) {
+ mPolyline.setVisible( visible );
+ }
+ }
+
+ @Override
+ public boolean isVisible() {
+ if ( mPolyline != null ) {
+ return mPolyline.isVisible();
+ }
+ return false;
+ }
+
+ @Override
+ public void setTransparency( float transparency ) {
+ if ( mPolyline != null ) {
+ mPolyline.setTransparency( transparency );
+ }
+ }
+
+ @Override
+ public void setOption( MogoPolylineOptions option ) {
+ PolylineOptions target = ObjectUtils.fromMogo( option );
+ if ( target == null ) {
+ return;
+ }
+ mOptions = option;
+ if ( mPolyline != null ) {
+ mPolyline.setOptions( target );
+ }
+ }
+
+ @Override
+ public boolean isDestroyed() {
+ return false;
+ }
+}
diff --git a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/utils/ObjectUtils.java b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/utils/ObjectUtils.java
index 415974d956..e2f3c11892 100644
--- a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/utils/ObjectUtils.java
+++ b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/utils/ObjectUtils.java
@@ -10,6 +10,7 @@ import com.amap.api.maps.model.BitmapDescriptorFactory;
import com.amap.api.maps.model.LatLng;
import com.amap.api.maps.model.MarkerOptions;
import com.amap.api.maps.model.Poi;
+import com.amap.api.maps.model.PolylineOptions;
import com.amap.api.navi.model.AMapCongestionLink;
import com.amap.api.navi.model.AMapNaviTrafficFacilityInfo;
import com.amap.api.navi.model.AimLessModeCongestionInfo;
@@ -46,6 +47,7 @@ import com.mogo.map.navi.MogoCongestionLink;
import com.mogo.map.navi.MogoNaviInfo;
import com.mogo.map.navi.MogoNaviListenerHandler;
import com.mogo.map.navi.MogoTraffic;
+import com.mogo.map.overlay.MogoPolylineOptions;
import com.mogo.map.search.geo.MogoAoiItem;
import com.mogo.map.search.geo.MogoBusinessArea;
import com.mogo.map.search.geo.MogoCrossroad;
@@ -704,4 +706,31 @@ public class ObjectUtils {
}
return null;
}
+
+ public static PolylineOptions fromMogo( MogoPolylineOptions options ) {
+ if ( options == null ) {
+ return null;
+ }
+ PolylineOptions target = new PolylineOptions();
+ if ( options.getPoints() != null ) {
+ List< LatLng > points = new ArrayList<>();
+ for ( MogoLatLng point : options.getPoints() ) {
+ points.add( fromMogo2( point ) );
+ }
+ target.addAll( points );
+ }
+ target.width( options.getWidth() );
+ target.color( options.getColor() );
+ target.zIndex( options.getWidth() );
+ target.visible( options.isVisible() );
+ target.geodesic( options.isGeodesic() );
+ target.setDottedLine( options.isDottedLine() );
+ target.useGradient( options.isGradient() );
+ target.transparency( options.getTransparency() );
+ target.aboveMaskLayer( options.isAboveMaskLayer() );
+ target.lineCapType( PolylineOptions.LineCapType.LineCapRound );
+ target.lineJoinType( PolylineOptions.LineJoinType.LineJoinRound );
+ target.setDottedLineType( PolylineOptions.DOTTEDLINE_TYPE_CIRCLE );
+ return target;
+ }
}
diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/IMogoMap.java b/libraries/mogo-map-api/src/main/java/com/mogo/map/IMogoMap.java
index f306f0f4cb..1c648028dd 100644
--- a/libraries/mogo-map-api/src/main/java/com/mogo/map/IMogoMap.java
+++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/IMogoMap.java
@@ -2,6 +2,8 @@ package com.mogo.map;
import com.mogo.map.marker.IMogoMarker;
import com.mogo.map.marker.MogoMarkerOptions;
+import com.mogo.map.overlay.IMogoPolyline;
+import com.mogo.map.overlay.MogoPolylineOptions;
import com.mogo.map.uicontroller.IMogoMapUIController;
import java.util.ArrayList;
@@ -127,4 +129,12 @@ public interface IMogoMap {
* @return
*/
float getZoomLevel();
+
+ /**
+ * 添加线段
+ *
+ * @param options
+ * @return
+ */
+ IMogoPolyline addPolyline( MogoPolylineOptions options );
}
diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/listener/MogoMapListenerHandler.java b/libraries/mogo-map-api/src/main/java/com/mogo/map/listener/MogoMapListenerHandler.java
index 5c90b7de00..186e614ee8 100644
--- a/libraries/mogo-map-api/src/main/java/com/mogo/map/listener/MogoMapListenerHandler.java
+++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/listener/MogoMapListenerHandler.java
@@ -54,63 +54,49 @@ public class MogoMapListenerHandler implements IMogoMapListener, IMogoMapListene
@Override
public void onMapLoaded() {
if ( mDelegateListener != null ) {
- synchronized ( mDelegateListener ) {
- mDelegateListener.onMapLoaded();
- }
+ mDelegateListener.onMapLoaded();
}
}
@Override
public void onTouch( MotionEvent motionEvent ) {
if ( mDelegateListener != null ) {
- synchronized ( mDelegateListener ) {
- mDelegateListener.onTouch( motionEvent );
- }
+ mDelegateListener.onTouch( motionEvent );
}
}
@Override
public void onPOIClick( MogoPoi poi ) {
if ( mDelegateListener != null ) {
- synchronized ( mDelegateListener ) {
- mDelegateListener.onPOIClick( poi );
- }
+ mDelegateListener.onPOIClick( poi );
}
}
@Override
public void onMapClick( MogoLatLng latLng ) {
if ( mDelegateListener != null ) {
- synchronized ( mDelegateListener ) {
- mDelegateListener.onMapClick( latLng );
- }
+ mDelegateListener.onMapClick( latLng );
}
}
@Override
public void onLockMap( boolean isLock ) {
if ( mDelegateListener != null ) {
- synchronized ( mDelegateListener ) {
- mDelegateListener.onLockMap( isLock );
- }
+ mDelegateListener.onLockMap( isLock );
}
}
@Override
public void onMapModeChanged( EnumMapUI ui ) {
if ( mDelegateListener != null ) {
- synchronized ( mDelegateListener ) {
- mDelegateListener.onMapModeChanged( ui );
- }
+ mDelegateListener.onMapModeChanged( ui );
}
}
@Override
public void onMapChanged( MogoLatLng location, float zoom, float tilt, float bearing ) {
if ( mDelegateListener != null ) {
- synchronized ( mDelegateListener ) {
- mDelegateListener.onMapChanged( location, zoom, tilt, bearing );
- }
+ mDelegateListener.onMapChanged( location, zoom, tilt, bearing );
}
}
}
diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/overlay/IMogoOverlayManager.java b/libraries/mogo-map-api/src/main/java/com/mogo/map/overlay/IMogoOverlayManager.java
new file mode 100644
index 0000000000..f429797e1a
--- /dev/null
+++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/overlay/IMogoOverlayManager.java
@@ -0,0 +1,18 @@
+package com.mogo.map.overlay;
+
+/**
+ * @author congtaowang
+ * @since 2020-03-10
+ *
+ * 覆盖物
+ */
+public interface IMogoOverlayManager {
+
+ /**
+ * 绘制线段
+ *
+ * @param options
+ * @return
+ */
+ IMogoPolyline addPolyline( MogoPolylineOptions options );
+}
diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/overlay/IMogoPolyline.java b/libraries/mogo-map-api/src/main/java/com/mogo/map/overlay/IMogoPolyline.java
new file mode 100644
index 0000000000..f20e545720
--- /dev/null
+++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/overlay/IMogoPolyline.java
@@ -0,0 +1,144 @@
+package com.mogo.map.overlay;
+
+import androidx.annotation.ColorInt;
+
+import com.mogo.map.IDestroyable;
+import com.mogo.map.MogoLatLng;
+
+import java.util.List;
+
+/**
+ * @author congtaowang
+ * @since 2020-03-10
+ *
+ * 线段
+ */
+public interface IMogoPolyline extends IDestroyable {
+
+
+ /**
+ * 是否已经销毁
+ *
+ * @return
+ */
+ boolean isDestroyed();
+
+ /**
+ * 移除
+ */
+ void remove();
+
+ /**
+ * 获取ID
+ *
+ * @return
+ */
+ String getId();
+
+ /**
+ * 设置绘制点数据
+ *
+ * @param lonLats
+ */
+ void setPoints( List< MogoLatLng > lonLats );
+
+ /**
+ * 获取点
+ *
+ * @return
+ */
+ List< MogoLatLng > getPoints();
+
+ /**
+ * 测地线
+ *
+ * @param draw
+ */
+ void setGeodesic( boolean draw );
+
+ /**
+ * 是否设置了测地线
+ *
+ * @return
+ */
+ boolean isGeodesic();
+
+ /**
+ * 虚线
+ *
+ * @param dottedLine
+ */
+ void setDottedLine( boolean dottedLine );
+
+ /**
+ * 是否是虚线
+ *
+ * @return
+ */
+ boolean isDottedLine();
+
+ /**
+ * 设置线宽
+ *
+ * @param width
+ */
+ void setWidth( float width );
+
+ /**
+ * 获取线宽
+ *
+ * @return
+ */
+ float getWidth();
+
+ /**
+ * 设置线条颜色
+ *
+ * @param color
+ */
+ void setColor( @ColorInt int color );
+
+ /**
+ * 获取线条颜色
+ *
+ * @return
+ */
+ @ColorInt
+ int getColor();
+
+ /**
+ * 设置Z轴
+ */
+ void setZIndex( float zIndex );
+
+ /**
+ * 获取Z轴
+ *
+ * @return
+ */
+ float getZIndex();
+
+ /**
+ * 设置显示/隐藏
+ */
+ void setVisible( boolean visible );
+
+ /**
+ * 是否可见
+ *
+ * @return
+ */
+ boolean isVisible();
+
+ /**
+ * 设置透明度
+ *
+ * @param transparency
+ */
+ void setTransparency( float transparency );
+
+ /**
+ * 设置配置项
+ */
+ void setOption( MogoPolylineOptions option );
+}
diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/overlay/MogoPolylineOptions.java b/libraries/mogo-map-api/src/main/java/com/mogo/map/overlay/MogoPolylineOptions.java
new file mode 100644
index 0000000000..a9cd740f09
--- /dev/null
+++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/overlay/MogoPolylineOptions.java
@@ -0,0 +1,214 @@
+package com.mogo.map.overlay;
+
+import android.graphics.Color;
+
+import androidx.annotation.ColorInt;
+
+import com.mogo.map.MogoLatLng;
+import com.mogo.map.location.MogoLocation;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * @author congtaowang
+ * @since 2020-03-10
+ *
+ * 线段属性
+ */
+public class MogoPolylineOptions {
+
+ private List< MogoLatLng > mPoints;
+ private float mWidth = 10.0F;
+ private int mColor = Color.BLACK;
+ private float mZIndex = 0.0F;
+ private boolean mIsVisible = true;
+ private boolean mIsGeodesic = false;
+ private boolean mIsDottedLine = false;
+ private boolean mIsGradient = false;
+ private float mTransparency = 1.0F;
+ private boolean mIsAboveMaskLayer = false;
+ private boolean mIsPointsUpdated = false;
+
+ public MogoPolylineOptions() {
+ this.mPoints = new ArrayList<>();
+ }
+
+ /**
+ * 设置顶点
+ *
+ * @param points
+ * @return
+ */
+ public MogoPolylineOptions points( List< MogoLatLng > points ) {
+ this.mPoints.clear();
+ this.mPoints.addAll( points );
+ this.mIsPointsUpdated = true;
+ return this;
+ }
+
+ /**
+ * 添加顶点到集合最后
+ *
+ * @param points
+ * @return
+ */
+ public MogoPolylineOptions add( MogoLatLng... points ) {
+ if ( points != null ) {
+ this.mPoints.addAll( Arrays.asList( points ) );
+ this.mIsPointsUpdated = true;
+ }
+ return this;
+ }
+
+ public MogoPolylineOptions add( double lon, double lat ) {
+ this.mPoints.add( new MogoLatLng( lat, lon ) );
+ return this;
+ }
+
+ public MogoPolylineOptions add( MogoLocation location ) {
+ if ( location != null ) {
+ this.mPoints.add( new MogoLatLng( location.getLatitude(), location.getLongitude() ) );
+ }
+ return this;
+ }
+
+ /**
+ * 设置线宽
+ */
+ public MogoPolylineOptions width( float width ) {
+ this.mWidth = width;
+ return this;
+ }
+
+ /**
+ * 设置线的颜色
+ *
+ * @param color
+ * @return
+ */
+ public MogoPolylineOptions color( @ColorInt int color ) {
+ this.mColor = color;
+ return this;
+ }
+
+ /**
+ * 设置Z轴的值
+ *
+ * @param zIndex
+ * @return
+ */
+ public MogoPolylineOptions zIndex( float zIndex ) {
+ this.mZIndex = zIndex;
+ return this;
+ }
+
+ /**
+ * 设置是否可见
+ *
+ * @param isVisible
+ * @return
+ */
+ public MogoPolylineOptions visible( boolean isVisible ) {
+ this.mIsVisible = isVisible;
+ return this;
+ }
+
+ /**
+ * 设置是否绘制测地线
+ *
+ * @param isGeodesic
+ * @return
+ */
+ public MogoPolylineOptions geodesic( boolean isGeodesic ) {
+ this.mIsGeodesic = isGeodesic;
+ return this;
+ }
+
+ /**
+ * 是否是虚线
+ *
+ * @param isDottedLine
+ * @return
+ */
+ public MogoPolylineOptions dottedLine( boolean isDottedLine ) {
+ this.mIsDottedLine = isDottedLine;
+ return this;
+ }
+
+ /**
+ * 是否使用渐变色
+ *
+ * @param isGradient
+ * @return
+ */
+ public MogoPolylineOptions useGradient( boolean isGradient ) {
+ this.mIsGradient = isGradient;
+ return this;
+ }
+
+ /**
+ * 设置透明度
+ *
+ * @param transparency
+ * @return
+ */
+ public MogoPolylineOptions transparency( float transparency ) {
+ this.mTransparency = transparency;
+ return this;
+ }
+
+ /**
+ * @param isAboveMaskLayer
+ * @return
+ */
+ public MogoPolylineOptions aboveMaskLayer( boolean isAboveMaskLayer ) {
+ this.mIsAboveMaskLayer = isAboveMaskLayer;
+ return this;
+ }
+
+ public List< MogoLatLng > getPoints() {
+ return mPoints;
+ }
+
+ public float getWidth() {
+ return mWidth;
+ }
+
+ public int getColor() {
+ return mColor;
+ }
+
+ public float getZIndex() {
+ return mZIndex;
+ }
+
+ public boolean isVisible() {
+ return mIsVisible;
+ }
+
+ public boolean isGeodesic() {
+ return mIsGeodesic;
+ }
+
+ public boolean isDottedLine() {
+ return mIsDottedLine;
+ }
+
+ public boolean isGradient() {
+ return mIsGradient;
+ }
+
+ public float getTransparency() {
+ return mTransparency;
+ }
+
+ public boolean isAboveMaskLayer() {
+ return mIsAboveMaskLayer;
+ }
+
+ public boolean isPointsUpdated() {
+ return mIsPointsUpdated;
+ }
+}
diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/MogoOverlayManager.java b/libraries/mogo-map/src/main/java/com/mogo/map/MogoOverlayManager.java
new file mode 100644
index 0000000000..6cde910cf3
--- /dev/null
+++ b/libraries/mogo-map/src/main/java/com/mogo/map/MogoOverlayManager.java
@@ -0,0 +1,40 @@
+package com.mogo.map;
+
+import com.mogo.map.overlay.IMogoOverlayManager;
+import com.mogo.map.overlay.IMogoPolyline;
+import com.mogo.map.overlay.MogoPolylineOptions;
+
+/**
+ * @author congtaowang
+ * @since 2020-03-10
+ *
+ * 描述
+ */
+public class MogoOverlayManager implements IMogoOverlayManager {
+
+ private MogoOverlayManager() {
+ // private constructor
+ }
+
+ private static final class InstanceHolder {
+ private static final MogoOverlayManager INSTANCE = new MogoOverlayManager();
+ }
+
+ public static MogoOverlayManager getInstance() {
+ return InstanceHolder.INSTANCE;
+ }
+
+ private Object readResolve() {
+ // 阻止反序列化,必须实现 Serializable 接口
+ return InstanceHolder.INSTANCE;
+ }
+
+ @Override
+ public IMogoPolyline addPolyline( MogoPolylineOptions options ) {
+ try {
+ return MogoMap.getInstance().getMogoMap().addPolyline( options );
+ } catch ( Exception e ) {
+ return null;
+ }
+ }
+}
diff --git a/modules/mogo-module-apps/build.gradle b/modules/mogo-module-apps/build.gradle
index 8b87ab74eb..4ac0696a0d 100644
--- a/modules/mogo-module-apps/build.gradle
+++ b/modules/mogo-module-apps/build.gradle
@@ -43,10 +43,10 @@ dependencies {
implementation rootProject.ext.dependencies.material
annotationProcessor rootProject.ext.dependencies.aroutercompiler
implementation rootProject.ext.dependencies.androidxrecyclerview
-
if (Boolean.valueOf(RELEASE)) {
implementation rootProject.ext.dependencies.mogomap
implementation rootProject.ext.dependencies.mogomapapi
+ implementation rootProject.ext.dependencies.mogomapapi
implementation rootProject.ext.dependencies.mogoutils
api rootProject.ext.dependencies.mogocommons
api rootProject.ext.dependencies.mogoserviceapi
@@ -58,6 +58,8 @@ dependencies {
api project(":foudations:mogo-commons")
api project(':services:mogo-service-api')
implementation project(':modules:mogo-module-common')
+ implementation project(":libraries:card-library")
+
}
}
diff --git a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppNavigatorFragment.java b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppNavigatorFragment.java
index 8caeabbe1b..6cf4635b34 100644
--- a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppNavigatorFragment.java
+++ b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppNavigatorFragment.java
@@ -3,12 +3,18 @@ package com.mogo.module.apps;
import android.os.Bundle;
import android.view.View;
+import android.widget.HorizontalScrollView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.LinearSnapHelper;
+import androidx.recyclerview.widget.RecyclerView;
import com.alibaba.android.arouter.launcher.ARouter;
import com.mogo.commons.mvp.MvpFragment;
+import com.mogo.module.apps.adapter.AppIndicatorAdapter;
+import com.mogo.module.apps.utils.CardScaleTransformer;
import com.mogo.module.apps.utils.LaunchUtils;
import com.mogo.module.common.MogoModulePaths;
import com.mogo.service.MogoServicePaths;
@@ -18,6 +24,9 @@ import com.mogo.service.fragmentmanager.IMogoFragmentManager;
import com.mogo.service.module.IMogoModuleProvider;
import com.mogo.utils.TipToast;
+import com.yarolegovich.discretescrollview.DiscreteScrollView;
+import com.yarolegovich.discretescrollview.transform.ScaleTransformer;
+import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
@@ -27,11 +36,10 @@ import java.util.Map;
*
* 描述
*/
-public class AppNavigatorFragment extends MvpFragment< AppNavigatorView, AppNavigatorPresenter > implements AppNavigatorView {
+public class AppNavigatorFragment extends MvpFragment
+ implements AppNavigatorView, DiscreteScrollView.OnItemChangedListener,
+ DiscreteScrollView.ScrollStateChangeListener {
- private View mNavigation;
- private View mMediaCenter;
- private View mCarSettings;
private View mApps;
private IMogoFragmentManager mMogoFragmentManager;
@@ -42,6 +50,7 @@ public class AppNavigatorFragment extends MvpFragment< AppNavigatorView, AppNavi
private IMogoModuleProvider mSearchProvider;
private IMogoAnalytics mMogoAnalytics;
+ private DiscreteScrollView scroller;
@Override
protected int getLayoutId() {
@@ -51,66 +60,105 @@ public class AppNavigatorFragment extends MvpFragment< AppNavigatorView, AppNavi
@Override
protected void initViews() {
- mMogoFragmentManager = ( IMogoFragmentManager ) ARouter.getInstance().build( MogoServicePaths.PATH_FRAGMENT_MANAGER ).navigation();
+ mMogoFragmentManager = (IMogoFragmentManager) ARouter.getInstance()
+ .build(MogoServicePaths.PATH_FRAGMENT_MANAGER)
+ .navigation();
- mNavigation = findViewById( R.id.module_apps_id_navigation );
- mMediaCenter = findViewById( R.id.module_apps_ic_media_center );
- mCarSettings = findViewById( R.id.module_apps_ic_car_settings );
- mApps = findViewById( R.id.module_apps_id_apps );
- mNavigation.setOnClickListener( view -> {
- openSearchPanel();
- trackNavigatorClickEvent( 1 );
- } );
- mMediaCenter.setOnClickListener( view -> {
- try {
- LaunchUtils.launchByPkg( getContext(), AppsConst.APP_PKG_MUSIC );
- trackNavigatorClickEvent( 2 );
- } catch ( Exception e ) {
- TipToast.shortTip( R.string.module_apps_str_no_app );
- }
- } );
- mCarSettings.setOnClickListener( view -> {
- try {
- LaunchUtils.launchByPkg( getContext(), AppsConst.APP_PKG_CAR_SETTINGS );
- trackNavigatorClickEvent( 3 );
- } catch ( Exception e ) {
- TipToast.shortTip( R.string.module_apps_str_no_app );
- }
- } );
- mApps.setOnClickListener( view -> {
+ mApps = findViewById(R.id.module_apps_id_apps);
+
+ scroller = findViewById(R.id.module_apps_id_scroller);
+ scroller.setSlideOnFling(true);
+ scroller.addOnItemChangedListener(this);
+ scroller.addScrollStateChangeListener(this);
+ //scroller.setItemTransitionTimeMillis(DiscreteScrollViewOptions.getTransitionTime());
+ scroller.setItemTransformer(new CardScaleTransformer.Builder()
+ .setMinScale(0.84f)
+ .build());
+ //
+ //
+ //LinearLayoutManager linearLayoutManager =
+ // new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false);
+ //
+ //scroller.setLayoutManager(linearLayoutManager);
+
+ ArrayList integers = new ArrayList<>(10);
+
+ integers.add(R.drawable.module_apps_ic_interest);
+ integers.add(R.drawable.module_apps_ic_online_car);
+ integers.add(R.drawable.module_apps_ic_news);
+ integers.add(R.drawable.module_apps_ic_tanlu);
+ integers.add(R.drawable.module_apps_ic_media_center);
+
+ AppIndicatorAdapter appIndicatorAdapter = new AppIndicatorAdapter(getContext(), integers);
+ scroller.setAdapter(appIndicatorAdapter);
+ scroller.scrollToPosition(Integer.MAX_VALUE / 2-1);
+ //mNavigation.setOnClickListener( view -> {
+ // openSearchPanel();
+ // trackNavigatorClickEvent( 1 );
+ //} );
+ //mMediaCenter.setOnClickListener( view -> {
+ // try {
+ // LaunchUtils.launchByPkg( getContext(), AppsConst.APP_PKG_MUSIC );
+ // trackNavigatorClickEvent( 2 );
+ // } catch ( Exception e ) {
+ // TipToast.shortTip( R.string.module_apps_str_no_app );
+ // }
+ //} );
+ //mCarSettings.setOnClickListener( view -> {
+ // try {
+ // LaunchUtils.launchByPkg( getContext(), AppsConst.APP_PKG_CAR_SETTINGS );
+ // trackNavigatorClickEvent( 3 );
+ // } catch ( Exception e ) {
+ // TipToast.shortTip( R.string.module_apps_str_no_app );
+ // }
+ //} );
+ mApps.setOnClickListener(view -> {
openAppsPanel();
- trackNavigatorClickEvent( 4 );
- } );
+ trackNavigatorClickEvent(4);
+ });
+ }
+
+ private void scrollToCenter(int index) {
+
}
@NonNull
@Override
protected AppNavigatorPresenter createPresenter() {
- return new AppNavigatorPresenter( this );
+ return new AppNavigatorPresenter(this);
}
private void openSearchPanel() {
- mSearchProvider = ( IMogoModuleProvider ) ARouter.getInstance().build( MogoModulePaths.PATH_MODULE_SEARCH ).navigation();
- final Fragment fragment = mSearchProvider.createFragment( getContext(), null );
- mMogoFragmentManager.push( new FragmentDescriptor.Builder().fragment( fragment ).tag( MogoModulePaths.PATH_FRAGMENT_SEARCH ).notifyMainModule( true ).build() );
+ mSearchProvider = (IMogoModuleProvider) ARouter.getInstance()
+ .build(MogoModulePaths.PATH_MODULE_SEARCH)
+ .navigation();
+ final Fragment fragment = mSearchProvider.createFragment(getContext(), null);
+ mMogoFragmentManager.push(new FragmentDescriptor.Builder().fragment(fragment)
+ .tag(MogoModulePaths.PATH_FRAGMENT_SEARCH)
+ .notifyMainModule(true)
+ .build());
}
@Override
- public void onActivityCreated( @Nullable Bundle savedInstanceState ) {
- super.onActivityCreated( savedInstanceState );
- mMogoFragmentManager = ( IMogoFragmentManager ) ARouter.getInstance().build( MogoServicePaths.PATH_FRAGMENT_MANAGER ).navigation( getContext() );
- mMogoAnalytics = ( IMogoAnalytics ) ARouter.getInstance().build( MogoServicePaths.PATH_UTILS_ANALYTICS ).navigation( getContext() );
+ public void onActivityCreated(@Nullable Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+ mMogoFragmentManager = (IMogoFragmentManager) ARouter.getInstance()
+ .build(MogoServicePaths.PATH_FRAGMENT_MANAGER)
+ .navigation(getContext());
+ mMogoAnalytics = (IMogoAnalytics) ARouter.getInstance()
+ .build(MogoServicePaths.PATH_UTILS_ANALYTICS)
+ .navigation(getContext());
}
@Override
public void openAppsPanel() {
- AppsListActivity.start( getActivity() );
+ AppsListActivity.start(getActivity());
}
- private void trackNavigatorClickEvent( int type ) {
- final Map< String, Object > properties = new HashMap<>();
- properties.put( "type", type );
- mMogoAnalytics.track( "Launcher_APP_Icon", properties );
+ private void trackNavigatorClickEvent(int type) {
+ final Map properties = new HashMap<>();
+ properties.put("type", type);
+ mMogoAnalytics.track("Launcher_APP_Icon", properties);
}
@Override
@@ -120,8 +168,27 @@ public class AppNavigatorFragment extends MvpFragment< AppNavigatorView, AppNavi
@Override
public void onDestroyView() {
super.onDestroyView();
- if ( mPresenter != null ) {
- mPresenter.onDestroy( getViewLifecycleOwner() );
+ if (mPresenter != null) {
+ mPresenter.onDestroy(getViewLifecycleOwner());
}
}
+
+ @Override
+ public void onCurrentItemChanged(@Nullable RecyclerView.ViewHolder viewHolder, int i) {
+
+ }
+
+ @Override public void onScrollStart(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
+
+ }
+
+ @Override public void onScrollEnd(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
+
+ }
+
+ @Override
+ public void onScroll(float v, int i, int i1, @Nullable RecyclerView.ViewHolder viewHolder,
+ @Nullable RecyclerView.ViewHolder t1) {
+
+ }
}
diff --git a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/adapter/AppIndicatorAdapter.java b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/adapter/AppIndicatorAdapter.java
new file mode 100644
index 0000000000..f5003e91d1
--- /dev/null
+++ b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/adapter/AppIndicatorAdapter.java
@@ -0,0 +1,34 @@
+package com.mogo.module.apps.adapter;
+
+import android.content.Context;
+import android.view.View;
+import android.widget.ImageView;
+import com.mogo.module.apps.R;
+import com.mogo.module.apps.adapter.base.RecycleBaseAdapter;
+import com.mogo.module.apps.adapter.base.RecycleViewHolder;
+import java.util.List;
+
+/**
+ * @author zyz
+ * 2020-03-09.
+ */
+public class AppIndicatorAdapter extends RecycleBaseAdapter {
+ /**
+ *
+ */
+ public AppIndicatorAdapter(Context context, List list
+ ) {
+ super(context, list, R.layout.module_apps_item_app_indicator);
+ }
+
+ @Override public int getItemCount() {
+ return Integer.MAX_VALUE;
+ }
+
+ @Override public void onBindViewHolder(RecycleViewHolder holder, Integer integer) {
+ ImageView ivIndicator = holder.getView(R.id.module_apps_id_app_icon);
+ ivIndicator.setImageResource(integer);
+ holder.setText(R.id.module_apps_id_app_name,names[holder.getLayoutPosition()%5] );
+ }
+ private String[] names=new String[]{"新鲜事","在线车辆","首页","探路","车聊聊"};
+}
diff --git a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/adapter/base/RecycleBaseAdapter.java b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/adapter/base/RecycleBaseAdapter.java
new file mode 100644
index 0000000000..2a8cc64079
--- /dev/null
+++ b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/adapter/base/RecycleBaseAdapter.java
@@ -0,0 +1,122 @@
+package com.mogo.module.apps.adapter.base;
+
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Toast;
+import androidx.recyclerview.widget.RecyclerView;
+import java.util.List;
+
+/**
+ *
+ * Title: adapter
+ *
+ *
+ * Description:
+ *
+ *
+ * Copyright: Copyright (c) 2015
+ *
+ *
+ *
+ */
+public abstract class RecycleBaseAdapter extends
+ RecyclerView.Adapter
+{
+
+ protected Context context;
+ protected List list;
+ private int resourceID;
+ private Toast toast;
+
+ /**
+ * @param context
+ */
+ public RecycleBaseAdapter(Context context, List list, int resourceID)
+ {
+ super();
+ this.context = context;
+ this.list = list;
+ this.resourceID = resourceID;
+ }
+
+ @Override
+ public RecycleViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType)
+ {
+ View v = LayoutInflater.from(context).inflate(resourceID, viewGroup,
+ false);
+
+ RecycleViewHolder holder = RecycleViewHolder
+ .get(v);
+
+ initHolder(holder);
+
+ return holder;
+ }
+
+ @Override
+ public void onBindViewHolder(
+ RecycleViewHolder viewHolder, int position)
+ {
+ onBindViewHolder(viewHolder, list.get(position % list.size()));
+ }
+
+ @Override
+ public int getItemCount()
+ {
+ return list == null ? 0 : list.size();
+ }
+
+ public abstract void onBindViewHolder(
+ RecycleViewHolder holder, T t);
+
+ public void initHolder(RecycleViewHolder holder)
+ {
+
+ }
+ public void setDatas(List list)
+ {
+ setDatas(list, false);
+ }
+
+ public void setDatas(List list, boolean add)
+ {
+ if (add)
+ {
+ this.list.addAll(list);
+ }
+ else
+ {
+ this.list = list;
+ }
+ notifyDataSetChanged();
+ }
+ public void clear(){
+ if (list != null) {
+ list.clear();
+ notifyDataSetChanged();
+ }
+ }
+ public void messageShow(String mes)
+ {
+ if (toast==null){
+ toast= Toast.makeText(context,mes, Toast.LENGTH_LONG);
+ }
+ else{
+ toast.setText(mes);
+ }
+ toast.show();
+ }
+
+ public T getItem(int position){
+ if (list==null||list.size()==0){
+ return null;
+ }
+ return list.get(position);
+ }
+
+ public List getList() {
+ return list;
+ }
+}
diff --git a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/adapter/base/RecycleViewHolder.java b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/adapter/base/RecycleViewHolder.java
new file mode 100644
index 0000000000..58bbebbfce
--- /dev/null
+++ b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/adapter/base/RecycleViewHolder.java
@@ -0,0 +1,138 @@
+package com.mogo.module.apps.adapter.base;
+
+import android.graphics.Bitmap;
+import android.text.SpannableString;
+import android.util.SparseArray;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.ImageView;
+import android.widget.TextView;
+import androidx.recyclerview.widget.RecyclerView;
+
+public class RecycleViewHolder extends RecyclerView.ViewHolder {
+
+ private SparseArray mViews;
+
+ private View mConvertView;
+
+ public RecycleViewHolder(View itemView) {
+ super(itemView);
+ this.mConvertView = itemView;
+ mViews = new SparseArray();
+ // TODO Auto-generated constructor stub
+ }
+
+ public static RecycleViewHolder get(View itemView) {
+ return new RecycleViewHolder(itemView);
+ }
+
+ public View getConvertView() {
+ return mConvertView;
+ }
+
+ public T getView(int viewId) {
+ View view = mViews.get(viewId);
+ if (view == null) {
+ view = mConvertView.findViewById(viewId);
+ mViews.put(viewId, view);
+ }
+ return (T) view;
+ }
+
+ /**
+ *
+ * @param viewId
+ * @param text
+ * @return
+ */
+ public RecycleViewHolder setText(int viewId, String text) {
+ TextView tv = getView(viewId);
+ if (tv==null)return this;
+ tv.setText(text);
+ return this;
+ }
+
+ /**
+ *
+ * @param viewId
+ * @param text
+ * @return
+ */
+ public RecycleViewHolder setText(int viewId, SpannableString text) {
+ TextView tv = getView(viewId);
+ tv.setText(text);
+ return this;
+ }
+
+ /**
+ *
+ * @param viewId
+ * @param resId
+ * @return
+ */
+ public RecycleViewHolder setImageResource(int viewId, int resId) {
+ ImageView view = getView(viewId);
+ view.setImageResource(resId);
+ return this;
+ }
+
+ /**
+ *
+ * @param viewId
+ * @return
+ */
+ public RecycleViewHolder setImageBitmap(int viewId, Bitmap bitmap) {
+ ImageView view = getView(viewId);
+ view.setImageBitmap(bitmap);
+ return this;
+ }
+
+
+ /**
+ *
+ * @param viewId
+ * @param resId
+ * @return
+ */
+ // public ViewHolder setImageURI(int viewId, String url) {
+ // ImageView view = getView(viewId);
+ // // ImageLoader.getInstance.loadImg(view,url);
+ // return this;
+ // }
+
+ /**
+ *
+ * @param viewId
+ * @param resId
+ * @return
+ */
+ public RecycleViewHolder setBackgroundImage(int viewId, int resId) {
+ View view = getView(viewId);
+ view.setBackgroundResource(resId);
+ return this;
+ }
+
+ /**
+ *
+ * @param viewId
+ * @param resId
+ * @return
+ */
+ public RecycleViewHolder setTextColor(int viewId, int resId) {
+ TextView view = getView(viewId);
+ view.setTextColor(resId);
+ return this;
+ }
+
+ /**
+ *
+ * @param viewId
+ * @return
+ */
+ public RecycleViewHolder setOnClickListener(int viewId,
+ OnClickListener listener) {
+ getView(viewId).setOnClickListener(listener);
+ return this;
+ }
+
+}
diff --git a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/utils/CardScaleTransformer.java b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/utils/CardScaleTransformer.java
new file mode 100644
index 0000000000..1bc8021d5d
--- /dev/null
+++ b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/utils/CardScaleTransformer.java
@@ -0,0 +1,91 @@
+package com.mogo.module.apps.utils;
+
+import android.view.View;
+import androidx.annotation.FloatRange;
+import com.mogo.module.apps.R;
+import com.yarolegovich.discretescrollview.transform.DiscreteScrollItemTransformer;
+import com.yarolegovich.discretescrollview.transform.Pivot;
+import com.yarolegovich.discretescrollview.transform.ScaleTransformer;
+
+/**
+ * @author zyz
+ * 2020-03-11.
+ */
+public class CardScaleTransformer implements DiscreteScrollItemTransformer {
+
+ private Pivot pivotX;
+ private Pivot pivotY;
+ private float minScale;
+ private float maxMinDiff;
+
+ public CardScaleTransformer() {
+ pivotX = Pivot.X.CENTER.create();
+ pivotY = Pivot.Y.BOTTOM.create();
+ minScale = 0.8f;
+ maxMinDiff = 0.2f;
+ }
+
+ @Override
+ public void transformItem(View item, float position) {
+
+ item= item.findViewById(R.id.module_apps_id_app_icon);
+ pivotX.setOn(item);
+ pivotY.setOn(item);
+ float closenessToCenter = 1f - Math.abs(position);
+ float scale = minScale + maxMinDiff * closenessToCenter;
+ item.setScaleX(scale);
+ item.setScaleY(scale);
+ }
+
+ public static class Builder {
+
+ private CardScaleTransformer transformer;
+ private float maxScale;
+
+ public Builder() {
+ transformer = new CardScaleTransformer();
+ maxScale = 1f;
+ }
+
+ public Builder setMinScale(@FloatRange(from = 0.01) float scale) {
+ transformer.minScale = scale;
+ return this;
+ }
+
+ public Builder setMaxScale(@FloatRange(from = 0.01) float scale) {
+ maxScale = scale;
+ return this;
+ }
+
+ public Builder setPivotX(Pivot.X pivotX) {
+ return setPivotX(pivotX.create());
+ }
+
+ public Builder setPivotX(Pivot pivot) {
+ assertAxis(pivot, Pivot.AXIS_X);
+ transformer.pivotX = pivot;
+ return this;
+ }
+
+ public Builder setPivotY(Pivot.Y pivotY) {
+ return setPivotY(pivotY.create());
+ }
+
+ public Builder setPivotY(Pivot pivot) {
+ assertAxis(pivot, Pivot.AXIS_Y);
+ transformer.pivotY = pivot;
+ return this;
+ }
+
+ public CardScaleTransformer build() {
+ transformer.maxMinDiff = maxScale - transformer.minScale;
+ return transformer;
+ }
+
+ private void assertAxis(Pivot pivot, @Pivot.Axis int axis) {
+ if (pivot.getAxis() != axis) {
+ throw new IllegalArgumentException("You passed a Pivot for wrong axis.");
+ }
+ }
+ }
+}
diff --git a/modules/mogo-module-apps/src/main/res/drawable-ldpi/module_apps_ic_apps.png b/modules/mogo-module-apps/src/main/res/drawable-ldpi/module_apps_ic_apps.png
deleted file mode 100755
index c564b8867f..0000000000
Binary files a/modules/mogo-module-apps/src/main/res/drawable-ldpi/module_apps_ic_apps.png and /dev/null differ
diff --git a/modules/mogo-module-apps/src/main/res/drawable-xhdpi/module_apps_ic_apps.png b/modules/mogo-module-apps/src/main/res/drawable-xhdpi/module_apps_ic_apps.png
index 80ecfda0bd..f1fc6671f2 100755
Binary files a/modules/mogo-module-apps/src/main/res/drawable-xhdpi/module_apps_ic_apps.png and b/modules/mogo-module-apps/src/main/res/drawable-xhdpi/module_apps_ic_apps.png differ
diff --git a/modules/mogo-module-apps/src/main/res/drawable-xhdpi/module_apps_ic_chat_icon.png b/modules/mogo-module-apps/src/main/res/drawable-xhdpi/module_apps_ic_chat_icon.png
new file mode 100755
index 0000000000..9d74b24ea8
Binary files /dev/null and b/modules/mogo-module-apps/src/main/res/drawable-xhdpi/module_apps_ic_chat_icon.png differ
diff --git a/modules/mogo-module-apps/src/main/res/drawable-xhdpi/module_apps_ic_chat_unchecked.png b/modules/mogo-module-apps/src/main/res/drawable-xhdpi/module_apps_ic_chat_unchecked.png
new file mode 100755
index 0000000000..9b4d5501dc
Binary files /dev/null and b/modules/mogo-module-apps/src/main/res/drawable-xhdpi/module_apps_ic_chat_unchecked.png differ
diff --git a/modules/mogo-module-apps/src/main/res/drawable-xhdpi/module_apps_ic_interest.png b/modules/mogo-module-apps/src/main/res/drawable-xhdpi/module_apps_ic_interest.png
new file mode 100755
index 0000000000..5d0d4e1a6d
Binary files /dev/null and b/modules/mogo-module-apps/src/main/res/drawable-xhdpi/module_apps_ic_interest.png differ
diff --git a/modules/mogo-module-apps/src/main/res/drawable-xhdpi/module_apps_ic_interest_unchecked.png b/modules/mogo-module-apps/src/main/res/drawable-xhdpi/module_apps_ic_interest_unchecked.png
new file mode 100755
index 0000000000..807d603b7b
Binary files /dev/null and b/modules/mogo-module-apps/src/main/res/drawable-xhdpi/module_apps_ic_interest_unchecked.png differ
diff --git a/modules/mogo-module-apps/src/main/res/drawable-xhdpi/module_apps_ic_media_center.png b/modules/mogo-module-apps/src/main/res/drawable-xhdpi/module_apps_ic_media_center.png
old mode 100644
new mode 100755
index 13aa66438a..1e6247d47a
Binary files a/modules/mogo-module-apps/src/main/res/drawable-xhdpi/module_apps_ic_media_center.png and b/modules/mogo-module-apps/src/main/res/drawable-xhdpi/module_apps_ic_media_center.png differ
diff --git a/modules/mogo-module-apps/src/main/res/drawable-xhdpi/module_apps_ic_media_center_checked.png b/modules/mogo-module-apps/src/main/res/drawable-xhdpi/module_apps_ic_media_center_checked.png
new file mode 100755
index 0000000000..ded21b6af2
Binary files /dev/null and b/modules/mogo-module-apps/src/main/res/drawable-xhdpi/module_apps_ic_media_center_checked.png differ
diff --git a/modules/mogo-module-apps/src/main/res/drawable-xhdpi/module_apps_ic_news.png b/modules/mogo-module-apps/src/main/res/drawable-xhdpi/module_apps_ic_news.png
new file mode 100755
index 0000000000..b3bc19464e
Binary files /dev/null and b/modules/mogo-module-apps/src/main/res/drawable-xhdpi/module_apps_ic_news.png differ
diff --git a/modules/mogo-module-apps/src/main/res/drawable-xhdpi/module_apps_ic_news_unchecked.png b/modules/mogo-module-apps/src/main/res/drawable-xhdpi/module_apps_ic_news_unchecked.png
new file mode 100755
index 0000000000..5a64a68660
Binary files /dev/null and b/modules/mogo-module-apps/src/main/res/drawable-xhdpi/module_apps_ic_news_unchecked.png differ
diff --git a/modules/mogo-module-apps/src/main/res/drawable-xhdpi/module_apps_ic_online_car.png b/modules/mogo-module-apps/src/main/res/drawable-xhdpi/module_apps_ic_online_car.png
new file mode 100755
index 0000000000..761a11b72a
Binary files /dev/null and b/modules/mogo-module-apps/src/main/res/drawable-xhdpi/module_apps_ic_online_car.png differ
diff --git a/modules/mogo-module-apps/src/main/res/drawable-xhdpi/module_apps_ic_online_car_unchecked.png b/modules/mogo-module-apps/src/main/res/drawable-xhdpi/module_apps_ic_online_car_unchecked.png
new file mode 100755
index 0000000000..b967fc7071
Binary files /dev/null and b/modules/mogo-module-apps/src/main/res/drawable-xhdpi/module_apps_ic_online_car_unchecked.png differ
diff --git a/modules/mogo-module-apps/src/main/res/drawable-xhdpi/module_apps_ic_tanlu.png b/modules/mogo-module-apps/src/main/res/drawable-xhdpi/module_apps_ic_tanlu.png
new file mode 100755
index 0000000000..edd6eaca26
Binary files /dev/null and b/modules/mogo-module-apps/src/main/res/drawable-xhdpi/module_apps_ic_tanlu.png differ
diff --git a/modules/mogo-module-apps/src/main/res/drawable-xhdpi/module_apps_ic_tanlu_unchecked.png b/modules/mogo-module-apps/src/main/res/drawable-xhdpi/module_apps_ic_tanlu_unchecked.png
new file mode 100755
index 0000000000..ac2a05136b
Binary files /dev/null and b/modules/mogo-module-apps/src/main/res/drawable-xhdpi/module_apps_ic_tanlu_unchecked.png differ
diff --git a/modules/mogo-module-apps/src/main/res/layout/module_apps_fragment_apps_navigator.xml b/modules/mogo-module-apps/src/main/res/layout/module_apps_fragment_apps_navigator.xml
index 97cbe13f84..5c05b17a94 100644
--- a/modules/mogo-module-apps/src/main/res/layout/module_apps_fragment_apps_navigator.xml
+++ b/modules/mogo-module-apps/src/main/res/layout/module_apps_fragment_apps_navigator.xml
@@ -1,35 +1,46 @@
-
+ android:paddingBottom="@dimen/module_apps_navigation_icon_paddingBottom"
+ >
-
+
+
-
-
-
-
\ No newline at end of file
+
+
+
+
+
\ No newline at end of file
diff --git a/modules/mogo-module-apps/src/main/res/layout/module_apps_item_app_indicator.xml b/modules/mogo-module-apps/src/main/res/layout/module_apps_item_app_indicator.xml
new file mode 100644
index 0000000000..8e02e01c0e
--- /dev/null
+++ b/modules/mogo-module-apps/src/main/res/layout/module_apps_item_app_indicator.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/modules/mogo-module-apps/src/main/res/values-xhdpi/dimens.xml b/modules/mogo-module-apps/src/main/res/values-xhdpi/dimens.xml
index ff19f10f5d..8981b061bc 100644
--- a/modules/mogo-module-apps/src/main/res/values-xhdpi/dimens.xml
+++ b/modules/mogo-module-apps/src/main/res/values-xhdpi/dimens.xml
@@ -5,9 +5,9 @@
30px
4px
103px
- 120px
- 120px
- 60px
+ 94px
+ 94px
+ 43px
60px
32px
32px
diff --git a/modules/mogo-module-apps/src/main/res/values/dimens.xml b/modules/mogo-module-apps/src/main/res/values/dimens.xml
index 604c52ddec..f3a1d89594 100644
--- a/modules/mogo-module-apps/src/main/res/values/dimens.xml
+++ b/modules/mogo-module-apps/src/main/res/values/dimens.xml
@@ -14,4 +14,5 @@
220px
220px
154px
+ 174px
\ No newline at end of file
diff --git a/modules/mogo-module-back/build.gradle b/modules/mogo-module-back/build.gradle
index 28579c4416..f0c93b2d40 100644
--- a/modules/mogo-module-back/build.gradle
+++ b/modules/mogo-module-back/build.gradle
@@ -47,13 +47,21 @@ dependencies {
implementation rootProject.ext.dependencies.rxandroid
if (Boolean.valueOf(RELEASE)) {
+ implementation rootProject.ext.dependencies.mogomap
+ implementation rootProject.ext.dependencies.mogomapapi
implementation rootProject.ext.dependencies.mogoutils
implementation rootProject.ext.dependencies.mogocommons
+ implementation rootProject.ext.dependencies.mogoserviceapi
implementation rootProject.ext.dependencies.modulecommon
+ implementation rootProject.ext.dependencies.moduleshare
} else {
+ implementation project(":libraries:mogo-map")
+ implementation project(":libraries:mogo-map-api")
implementation project(":foudations:mogo-utils")
- api project(":foudations:mogo-commons")
+ implementation project(":foudations:mogo-commons")
+ implementation project(':services:mogo-service-api')
implementation project(':modules:mogo-module-common')
+ implementation project(':modules:mogo-module-share')
}
}
diff --git a/modules/mogo-module-back/src/main/java/com/mogo/module/back/BackToLauncherModuleProvider.java b/modules/mogo-module-back/src/main/java/com/mogo/module/back/BackToLauncherModuleProvider.java
index 5a1e46cb39..bb4d000185 100644
--- a/modules/mogo-module-back/src/main/java/com/mogo/module/back/BackToLauncherModuleProvider.java
+++ b/modules/mogo-module-back/src/main/java/com/mogo/module/back/BackToLauncherModuleProvider.java
@@ -1,33 +1,31 @@
package com.mogo.module.back;
-import android.app.Activity;
import android.content.Context;
-import android.os.Build;
+import android.content.Intent;
import android.os.Bundle;
-import android.text.TextUtils;
-import android.util.ArrayMap;
-import android.util.Log;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
-import androidx.fragment.app.FragmentActivity;
-import androidx.fragment.app.FragmentManager;
import com.alibaba.android.arouter.facade.annotation.Route;
+import com.alibaba.android.arouter.launcher.ARouter;
+import com.alibaba.idst.nls.internal.utils.L;
+import com.mogo.commons.AbsMogoApplication;
import com.mogo.map.listener.IMogoMapListener;
import com.mogo.map.location.IMogoLocationListener;
import com.mogo.map.marker.IMogoMarkerClickListener;
import com.mogo.map.navi.IMogoNaviListener;
+import com.mogo.service.IMogoServiceApis;
+import com.mogo.service.MogoServicePaths;
+import com.mogo.service.fragmentmanager.IMogoFragmentManager;
+import com.mogo.service.intent.IMogoIntentListener;
+import com.mogo.service.intent.IMogoIntentManager;
import com.mogo.service.module.IMogoModuleLifecycle;
import com.mogo.service.module.IMogoModuleProvider;
import com.mogo.service.module.ModuleType;
import com.mogo.utils.logger.Logger;
-import java.lang.reflect.Field;
-import java.util.HashMap;
-import java.util.Map;
-
/**
* @author congtaowang
* @since 2020-02-26
@@ -35,7 +33,12 @@ import java.util.Map;
* 描述
*/
@Route( path = BackToLauncherConst.MODULE_PATH )
-public class BackToLauncherModuleProvider implements IMogoModuleProvider {
+public class BackToLauncherModuleProvider implements IMogoModuleProvider, IMogoIntentListener {
+
+ private IMogoServiceApis mServiceApis;
+ private IMogoIntentManager mIntentManager;
+
+ public static final String COMMAND_BACK = "com.ileja.launcher.back";
private static final String TAG = "BackToLauncherModuleProvider";
@@ -98,54 +101,17 @@ public class BackToLauncherModuleProvider implements IMogoModuleProvider {
@Override
public void init( Context context ) {
BackToMainHomeManager.addMainHomeView();
-// final Activity activity = getTopActivity(context.getPackageName());
-// if ( activity instanceof FragmentActivity ) {
-// Logger.d( TAG, "init." );
-// FragmentManager fragmentManager = ( ( FragmentActivity ) activity ).getSupportFragmentManager();
-// fragmentManager.beginTransaction()
-// .add( new Back2LauncherFragment(), BackToLauncherConst.MODULE_NAME )
-// .commitAllowingStateLoss();
-// fragmentManager.executePendingTransactions();
-// }
+ mServiceApis = ( IMogoServiceApis ) ARouter.getInstance().build( MogoServicePaths.PATH_SERVICE_APIS ).navigation();
+ mIntentManager = mServiceApis.getIntentManagerApi();
+ mIntentManager.registerIntentListener( COMMAND_BACK, this );
+ BackToMainHomeManager.init( mServiceApis.getFragmentManagerApi() );
}
-// /**
-// * 获取当前运行的activity
-// */
-// private Activity getTopActivity(String process) {
-// Log.i("activity", "[getTopActivity]");
-// try {
-// Class activityThreadClass = Class.forName("android.app.ActivityThread");
-// Object activityThread = activityThreadClass.getMethod("currentActivityThread").invoke(null);
-// Field activitiesField = activityThreadClass.getDeclaredField("mActivities");
-// activitiesField.setAccessible(true);
-// //16~18 HashMap
-// //19~27 ArrayMap
-// Map