diff --git a/foudations/mogo-utils/src/main/java/com/mogo/utils/AssetsUtils.java b/foudations/mogo-utils/src/main/java/com/mogo/utils/AssetsUtils.java new file mode 100644 index 0000000000..7ec9448cd7 --- /dev/null +++ b/foudations/mogo-utils/src/main/java/com/mogo/utils/AssetsUtils.java @@ -0,0 +1,37 @@ +package com.mogo.utils; + +import android.content.Context; +import android.text.TextUtils; +import android.util.Log; +import java.io.BufferedInputStream; +import java.io.InputStream; + +/** + * @author congtaowang + * @since 2019-12-12 + *
+ * 读取asset文件 + */ +public class AssetsUtils { + + private static final String TAG = "amap.AssetsUtils"; + + public static byte[] read( Context context, String fileName ) { + if ( context == null || TextUtils.isEmpty( fileName ) ) { + return null; + } + byte[] buffer = null; + try { + InputStream is = context.getAssets().open( fileName ); + BufferedInputStream bis = new BufferedInputStream( is ); + buffer = new byte[is.available()]; + bis.read( buffer ); + bis.close(); + is.close(); + Log.d( TAG, "read assets success: " + fileName + " size=" + buffer.length ); + } catch ( Exception e ) { + e.printStackTrace(); + } + return buffer; + } +} diff --git a/gradle.properties b/gradle.properties index 8aa999532c..ac1785fca2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -22,7 +22,7 @@ SNAPSHOT_REPOSITORY_URL=http://nexus.zhidaoauto.com/repository/maven-snapshots/ USERNAME=xintai PASSWORD=xintai2018 # 编译模式: false - 依赖本地版本, true - 依赖 maven 版本 -RELEASE=true +RELEASE=false # 模块版本 DEMO_MODULE_MAP_VERSION=1.0.0-SNAPSHOT DEMO_MODULE_MAP2_VERSION=1.0.0-SNAPSHOT diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/TextWatcherAdapter.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/TextWatcherAdapter.java new file mode 100644 index 0000000000..469b5f538d --- /dev/null +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/TextWatcherAdapter.java @@ -0,0 +1,28 @@ +package com.mogo.module.common; + +import android.text.Editable; +import android.text.TextWatcher; + +/** + * @author congtaowang + * @since 2019-10-02 + *
+ * 描述 + */ +public class TextWatcherAdapter implements TextWatcher { + + @Override + public void beforeTextChanged( CharSequence s, int start, int count, int after ) { + + } + + @Override + public void onTextChanged( CharSequence s, int start, int before, int count ) { + + } + + @Override + public void afterTextChanged( Editable s ) { + + } +} diff --git a/modules/mogo-module-map/src/main/java/com/mogo/module/map/location/AMapLocationManager.java b/modules/mogo-module-map/src/main/java/com/mogo/module/map/location/AMapLocationManager.java new file mode 100644 index 0000000000..2aeee6ba15 --- /dev/null +++ b/modules/mogo-module-map/src/main/java/com/mogo/module/map/location/AMapLocationManager.java @@ -0,0 +1,131 @@ +package com.mogo.module.map.location; + +import android.content.Context; +import android.util.Log; +import com.amap.api.location.AMapLocation; +import com.amap.api.location.AMapLocationClient; +import com.amap.api.location.AMapLocationClientOption; +import com.amap.api.location.AMapLocationListener; +import com.amap.api.maps.model.LatLng; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; + +public class AMapLocationManager { + + private static final String TAG = "AMapLocationManager"; + + private static final Set< AMapLocationListener > mLocationChangeListeners = new HashSet<>(); + private static final InternalLocationListener mInternalLocationListener = new InternalLocationListener(); + + private AMapLocationClient mLocationClient; + + private static AMapLocation sLastKnowLocation = null; + + private static volatile AMapLocationManager sInstance; + + public static AMapLocationManager getInstance( Context context ) { + if ( sInstance == null ) { + synchronized ( AMapLocationManager.class ) { + if ( sInstance == null ) { + sInstance = new AMapLocationManager( context ); + } + } + } + return sInstance; + } + + public synchronized void release() { + stop(); + mLocationChangeListeners.clear(); + mLocationClient = null; + sLastKnowLocation = null; + sInstance = null; + } + + private AMapLocationManager( Context context ) { + if ( context == null ) { + throw new NullPointerException( "context can't be null." ); + } + mLocationClient = new AMapLocationClient( context.getApplicationContext() ); + mLocationClient.setLocationListener( mInternalLocationListener ); + } + + private void setLocationOptions( long locateInterval ) { + AMapLocationClientOption option = new AMapLocationClientOption(); + option.setLocationMode( AMapLocationClientOption.AMapLocationMode.Hight_Accuracy ); + option.setNeedAddress( true ); + option.setInterval( locateInterval ); + if ( mLocationClient != null ) { + mLocationClient.setLocationOption( option ); + } + } + + public synchronized void start() { + start( 2000L ); + } + + public synchronized void start( long locateInterval ) { + if ( mLocationClient != null && mLocationClient.isStarted() ) { + stop(); + } + setLocationOptions( locateInterval ); + mLocationClient.startLocation(); + Log.d( TAG, "start location, location interval is " + locateInterval ); + } + + public synchronized void stop() { + if ( mLocationClient != null ) { + mLocationClient.stopLocation(); + } + Log.d( TAG, "stop location" ); + } + + public static AMapLocation getAMapLastKnowLocation() { + return sLastKnowLocation; + } + + public static LatLng getLastKnowPoint() { + final AMapLocation location = getAMapLastKnowLocation(); + if ( location != null ) { + return new LatLng( location.getLatitude(), location.getLongitude() ); + } + return null; + } + + public void addLocationListener( AMapLocationListener listener ) { + if ( listener != null ) { + synchronized ( mLocationChangeListeners ) { + mLocationChangeListeners.add( listener ); + } + } + } + + public void removeLocationListener( AMapLocationListener listener ) { + synchronized ( mLocationChangeListeners ) { + mLocationChangeListeners.remove( listener ); + } + } + + /** + * 定位SDK监听函数 + */ + private static class InternalLocationListener implements AMapLocationListener { + @Override + public void onLocationChanged( AMapLocation aMapLocation ) { + if ( aMapLocation == null || + aMapLocation.getLatitude() == 0.0D || + aMapLocation.getLongitude() == 0.0D ) { + return; + } + sLastKnowLocation = aMapLocation.clone(); + synchronized ( mLocationChangeListeners ) { + Iterator iterator = mLocationChangeListeners.iterator(); + while ( iterator.hasNext() ) { + AMapLocationListener listener = ( AMapLocationListener ) iterator.next(); + listener.onLocationChanged( sLastKnowLocation ); + } + } + } + } +} \ No newline at end of file diff --git a/modules/mogo-module-map/src/main/java/com/mogo/module/map/location/LocationUtils.java b/modules/mogo-module-map/src/main/java/com/mogo/module/map/location/LocationUtils.java new file mode 100644 index 0000000000..f989358fa4 --- /dev/null +++ b/modules/mogo-module-map/src/main/java/com/mogo/module/map/location/LocationUtils.java @@ -0,0 +1,29 @@ +package com.mogo.module.map.location; + +/** + * @author congtaowang + * @since 2019-09-27 + *
+ * 描述 + */ +public class LocationUtils { + + public static float bearing( double lat1, double lon1, double lat2, double lon2 ) { + + double longitude1 = lon1; + double longitude2 = lon2; + double latitude1 = Math.toRadians( lat1 ); + double latitude2 = Math.toRadians( lat2 ); + double longDiff = Math.toRadians( longitude2 - longitude1 ); + double y = Math.sin( longDiff ) * Math.cos( latitude2 ); + double x = Math.cos( latitude1 ) * Math.sin( latitude2 ) - Math.sin( latitude1 ) * Math.cos( latitude2 ) * Math + .cos( longDiff ); + + double result = ( Math.toDegrees( Math.atan2( y, x ) ) + 360 ) % 360; + if ( ( ( int ) result ) == ( ( int ) ( result + 0.5 ) ) ) { + return ( ( int ) result ); + } else { + return ( ( int ) result ) + 0.5f; + } + } +} diff --git a/modules/mogo-module-map/src/main/java/com/mogo/module/map/location/MyLocationUtils.java b/modules/mogo-module-map/src/main/java/com/mogo/module/map/location/MyLocationUtils.java new file mode 100644 index 0000000000..51118e107c --- /dev/null +++ b/modules/mogo-module-map/src/main/java/com/mogo/module/map/location/MyLocationUtils.java @@ -0,0 +1,53 @@ +package com.mogo.module.map.location; + +import com.amap.api.maps.model.MyLocationStyle; + +/** + * @author congtaowang + * @since 2019-10-17 + *
+ * 描述 + */ +public class MyLocationUtils { + + public static final long INTERVAL_FAST_SPEED = 2_000L; + public static final long INTERVAL_MIDDLE_SPEED = 2_000L; + public static final long INTERVAL_SLOW_SPEED = 10_000L; + + /** + * 前台快速定位 + * + * @return + */ + public static MyLocationStyle wrapperAsFast( MyLocationStyle style ) { + if ( style != null ) { + style.interval( INTERVAL_FAST_SPEED ); + } + return style; + } + + /** + * 后台慢速定位 + * + * @return + */ + public static MyLocationStyle wrapperAsMiddleSpeed( MyLocationStyle style ) { + if ( style != null ) { + style.interval( INTERVAL_MIDDLE_SPEED ); + } + return style; + } + + /** + * 后台慢速定位 + * + * @return + */ + public static MyLocationStyle wrapperAsSlow( MyLocationStyle style ) { + if ( style != null ) { + style.interval( INTERVAL_SLOW_SPEED ); + } + return style; + } + +} diff --git a/modules/mogo-module-navi/build.gradle b/modules/mogo-module-navi/build.gradle index dd4d1204fa..315cd98809 100644 --- a/modules/mogo-module-navi/build.gradle +++ b/modules/mogo-module-navi/build.gradle @@ -43,8 +43,13 @@ dependencies { implementation rootProject.ext.dependencies.room annotationProcessor rootProject.ext.dependencies.roomAnnotationProcessor implementation rootProject.ext.dependencies.roomRxjava + implementation rootProject.ext.dependencies.androidxrecyclerview annotationProcessor rootProject.ext.dependencies.aroutercompiler implementation rootProject.ext.dependencies.jetbrainsannotationsjava5 + implementation rootProject.ext.dependencies.rxandroid +// api project(path: ':modules:mogo-module-common') +// api project(path: ':foudations:mogo-utils') +// api project(path: ':modules:mogo-module-map') if( Boolean.valueOf(RELEASE) ){ implementation rootProject.ext.dependencies.mogomap @@ -60,7 +65,7 @@ dependencies { implementation project(":foudations:mogo-utils") api project(":foudations:mogo-commons") api project(':services:mogo-service-api') - implementation project(':modules:mogo-module-common') + api project(':modules:mogo-module-common') implementation project(':modules:mogo-module-map') } } diff --git a/modules/mogo-module-navi/src/main/java/com/mogo/module/navi/bean/EntityConvertUtils.java b/modules/mogo-module-navi/src/main/java/com/mogo/module/navi/bean/EntityConvertUtils.java new file mode 100644 index 0000000000..6254ab5068 --- /dev/null +++ b/modules/mogo-module-navi/src/main/java/com/mogo/module/navi/bean/EntityConvertUtils.java @@ -0,0 +1,95 @@ +package com.mogo.module.navi.bean; + +import com.amap.api.location.AMapLocation; +import com.amap.api.maps.model.CameraPosition; +import com.amap.api.services.core.LatLonPoint; +import com.amap.api.services.geocoder.RegeocodeAddress; +import com.amap.api.services.help.Tip; +import java.util.ArrayList; +import java.util.List; + +/** + * @author congtaowang + * @since 2019-10-02 + *
+ * 实体类操作工具 + */ +public class EntityConvertUtils { + + public static List< Tip > pois2Tips( List< SearchPoi > datums ) { + final List< Tip > output = new ArrayList<>(); + if ( datums == null || datums.isEmpty() ) { + return output; + } + for ( SearchPoi poi : datums ) { + Tip tip = poi2Tip( poi ); + if ( tip != null ) { + output.add( tip ); + } + } + return output; + } + + public static Tip poi2Tip( SearchPoi poi ) { + if ( poi == null ) { + return null; + } + Tip tip = new Tip(); + tip.setID( poi.pId ); + tip.setAdcode( poi.getAdCode() ); + tip.setAddress( poi.getAddress() ); + tip.setDistrict( poi.getDistrict() ); + tip.setName( poi.getName() ); + tip.setTypeCode( poi.getTypeCode() ); + tip.setPostion( new LatLonPoint( poi.getLat(), poi.getLng() ) ); + return tip; + } + + public static SearchPoi tipToPoi( Tip tip ) { + if ( tip == null ) { + return null; + } + double lat = 0.0; + double lng = 0.0; + if ( tip.getPoint() != null ) { + lat = tip.getPoint().getLatitude(); + lng = tip.getPoint().getLongitude(); + } + return new SearchPoi( tip.getPoiID(), + tip.getName(), + tip.getAddress(), + lat, + lng, + tip.getDistrict(), + tip.getAdcode(), + tip.getTypeCode() ); + } + + public static SearchPoi aMapLocation2Poi( AMapLocation location ) { + if ( location == null || location.getErrorCode() != AMapLocation.LOCATION_SUCCESS ) { + return null; + } + return new SearchPoi( System.currentTimeMillis() + "", + location.getPoiName(), + location.getAddress(), + location.getLatitude(), + location.getLongitude(), + location.getDistrict(), + location.getAdCode(), + location.getCoordType() ); + } + + public static SearchPoi geocodeAddress2Poi( RegeocodeAddress address, CameraPosition position ) { + if ( address == null || position == null ) { + return null; + } + return new SearchPoi( System.currentTimeMillis() + "", + address.getFormatAddress(), + address.getFormatAddress(), + position.target.latitude, + position.target.longitude, + address.getDistrict(), + address.getAdCode(), + "" ); + } +} diff --git a/modules/mogo-module-navi/src/main/java/com/mogo/module/navi/bean/POIInfo.java b/modules/mogo-module-navi/src/main/java/com/mogo/module/navi/bean/POIInfo.java deleted file mode 100644 index d2d3618410..0000000000 --- a/modules/mogo-module-navi/src/main/java/com/mogo/module/navi/bean/POIInfo.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.mogo.module.navi.bean; - -import androidx.room.Entity; -import androidx.room.PrimaryKey; - -import org.jetbrains.annotations.NotNull; - -/** - * @author zyz - * 2019-08-15. - */ -@Entity -public class POIInfo { - @PrimaryKey - @NotNull - public String pId; - private String name; - private String address; - private double lat; - private double lot; - - - public POIInfo(String pId, String name, String address, double lat, double lot) { - this.pId = pId; - this.name = name; - this.address = address; - this.lat = lat; - this.lot = lot; - } - - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getAddress() { - return address; - } - - public void setAddress(String address) { - this.address = address; - } - - public double getLat() { - return lat; - } - - public void setLat(double lat) { - this.lat = lat; - } - - public double getLot() { - return lot; - } - - public void setLot(double lot) { - this.lot = lot; - } - - -} diff --git a/modules/mogo-module-navi/src/main/java/com/mogo/module/navi/bean/SearchPoi.java b/modules/mogo-module-navi/src/main/java/com/mogo/module/navi/bean/SearchPoi.java new file mode 100644 index 0000000000..7226cbcc11 --- /dev/null +++ b/modules/mogo-module-navi/src/main/java/com/mogo/module/navi/bean/SearchPoi.java @@ -0,0 +1,236 @@ +package com.mogo.module.navi.bean; + +import android.os.Parcel; +import android.os.Parcelable; +import androidx.annotation.NonNull; +import androidx.room.Entity; +import androidx.room.PrimaryKey; +import com.mogo.module.navi.constants.DataConstants; + +/** + * @author congtaowang + * @since 2019-10-02 + *
+ * 搜索地址表数据结构 + */ +@Entity( tableName = DataConstants.T_SEARCH_POI ) +public class SearchPoi implements Parcelable { + + public static final SearchPoi NULL = new SearchPoi( null, + null, + null, + 0.0, + 0.0, + null, + null, + null ); + + @PrimaryKey + @NonNull + public String pId; + private String name; + private String address; + private double lat; + private double lng; + private String district; + private String adCode; + private String typeCode; + private String province; + private String city; + + + /** + * 插入poi数据类型 + *
+ * {@link DataConstants#TYPE_COMPANY_ADDRESS} + * {@link DataConstants#TYPE_HOME_ADDRESS} + * {@link DataConstants#TYPE_POI} + */ + private int type; + + /** + * 数据记录时间,自动赋值 + */ + private long time; + + public SearchPoi( String pId, + String name, + String address, + double lat, + double lng, + String district, + String adCode, + String typeCode ) { + this( pId, name, address, lat, lng, district, adCode, typeCode, "", "", DataConstants.TYPE_POI ); + } + + private SearchPoi( String pId, + String name, + String address, + double lat, + double lng, + String district, + String adCode, + String typeCode, + String province, + String city, + int type ) { + this.pId = pId; + this.name = name; + this.address = address; + this.lat = lat; + this.lng = lng; + this.district = district; + this.adCode = adCode; + this.typeCode = typeCode; + this.province = province; + this.city = city; + this.type = type; + this.time = System.currentTimeMillis(); + } + + @NonNull + public String getpId() { + return pId; + } + + public void setpId( @NonNull String pId ) { + this.pId = pId; + } + + public String getName() { + return name; + } + + public void setName( String name ) { + this.name = name; + } + + public String getAddress() { + return address; + } + + public void setAddress( String address ) { + this.address = address; + } + + public double getLat() { + return lat; + } + + public void setLat( double lat ) { + this.lat = lat; + } + + public double getLng() { + return lng; + } + + public void setLng( double lng ) { + this.lng = lng; + } + + public String getDistrict() { + return district; + } + + public void setDistrict( String district ) { + this.district = district; + } + + public String getAdCode() { + return adCode; + } + + public void setAdCode( String adCode ) { + this.adCode = adCode; + } + + public String getTypeCode() { + return typeCode; + } + + public void setTypeCode( String typeCode ) { + this.typeCode = typeCode; + } + + public String getProvince() { + return province; + } + + public void setProvince( String province ) { + this.province = province; + } + + public String getCity() { + return city; + } + + public void setCity( String city ) { + this.city = city; + } + + public int getType() { + return type; + } + + public void setType( int type ) { + this.type = type; + } + + public long getTime() { + return time; + } + + public void setTime( long time ) { + this.time = time; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel( Parcel dest, int flags ) { + dest.writeString( this.pId ); + dest.writeString( this.name ); + dest.writeString( this.address ); + dest.writeDouble( this.lat ); + dest.writeDouble( this.lng ); + dest.writeString( this.district ); + dest.writeString( this.adCode ); + dest.writeString( this.typeCode ); + dest.writeString( this.province ); + dest.writeString( this.city ); + dest.writeInt( this.type ); + dest.writeLong( this.time ); + } + + protected SearchPoi( Parcel in ) { + this.pId = in.readString(); + this.name = in.readString(); + this.address = in.readString(); + this.lat = in.readDouble(); + this.lng = in.readDouble(); + this.district = in.readString(); + this.adCode = in.readString(); + this.typeCode = in.readString(); + this.province = in.readString(); + this.city = in.readString(); + this.type = in.readInt(); + this.time = in.readLong(); + } + + public static final Creator< SearchPoi > CREATOR = new Creator< SearchPoi >() { + @Override + public SearchPoi createFromParcel( Parcel source ) { + return new SearchPoi( source ); + } + + @Override + public SearchPoi[] newArray( int size ) { + return new SearchPoi[size]; + } + }; +} diff --git a/modules/mogo-module-navi/src/main/java/com/mogo/module/navi/constants/AMapConstants.java b/modules/mogo-module-navi/src/main/java/com/mogo/module/navi/constants/AMapConstants.java new file mode 100644 index 0000000000..3b056b4c6c --- /dev/null +++ b/modules/mogo-module-navi/src/main/java/com/mogo/module/navi/constants/AMapConstants.java @@ -0,0 +1,29 @@ +package com.mogo.module.navi.constants; + +import com.amap.api.navi.enums.PathPlanningStrategy; + +/** + * @author congtaowang + * @since 2019-10-04 + *
+ * 地图基本参数配置 + */ +public class AMapConstants { + + /** + * 初始化地图缩放级别 + */ + public static final float AMAP_ZOOM_COMMON_LEVEL = 15.0f; + + /** + * 点击当前位置按钮的地图缩放级别 + */ + public static final float AMAP_ZOOM_CURRENT_LOCATION_LEVEL = AMAP_ZOOM_COMMON_LEVEL; + + public static final float AMPA_BEARING = 0.0f; + + public static final int DEFAULT_ROUTE_STRATEGY = PathPlanningStrategy.DRIVING_MULTIPLE_ROUTES_DEFAULT; + + public static final float AMAP_ROUTE_OVERLAY_TRANSPARENCY_SELECTED = 1f; + public static final float AMAP_ROUTE_OVERLAY_TRANSPARENCY_UNSELECTED = 0.3f; +} diff --git a/modules/mogo-module-navi/src/main/java/com/mogo/module/navi/constants/CustomMapStyle.java b/modules/mogo-module-navi/src/main/java/com/mogo/module/navi/constants/CustomMapStyle.java new file mode 100644 index 0000000000..d23454c140 --- /dev/null +++ b/modules/mogo-module-navi/src/main/java/com/mogo/module/navi/constants/CustomMapStyle.java @@ -0,0 +1,16 @@ +package com.mogo.module.navi.constants; + +/** + * @author congtaowang + * @since 2019-12-12 + *
+ * 自定义地图样式
+ */
+public class CustomMapStyle {
+
+ public static final String STYLE_ID = "e3e33a3423230b219494b40c4d71d93a";
+
+ public static final String ASSET_STYLE_DATA = "style.data";
+
+ public static final String ASSET_STYLE_EXTRA_DATA = "style_extra.data";
+}
diff --git a/modules/mogo-module-navi/src/main/java/com/mogo/module/navi/dao/POIDao.java b/modules/mogo-module-navi/src/main/java/com/mogo/module/navi/dao/POIDao.java
deleted file mode 100644
index c795afc872..0000000000
--- a/modules/mogo-module-navi/src/main/java/com/mogo/module/navi/dao/POIDao.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package com.mogo.module.navi.dao;
-
-import androidx.room.Dao;
-import androidx.room.Insert;
-import androidx.room.OnConflictStrategy;
-import androidx.room.Query;
-import com.mogo.module.navi.bean.POIInfo;
-import io.reactivex.Flowable;
-import java.util.List;
-
-/**
- * @author zyz
- * 2019-08-15.
- */
-@Dao
-public interface POIDao {
-
- /**
- * 插入地址信息
- * @param poiInfos GEO信息
- * @return
- */
- @Insert(onConflict = OnConflictStrategy.REPLACE)
- List
+ * 搜索页面数据操作
+ */
+@Dao
+public interface SearchPoiDao {
+
+ @Insert( onConflict = OnConflictStrategy.REPLACE )
+ List
+ * 描述
+ */
+public class MapUIController {
+
+ private static final String TAG = "MapUIController";
+
+ private static volatile MapUIController sInstance;
+ private int mLastZoomLevel;
+
+ private MapUIController() {
+ }
+
+ public static MapUIController getInstance() {
+ if ( sInstance == null ) {
+ synchronized ( MapUIController.class ) {
+ if ( sInstance == null ) {
+ sInstance = new MapUIController();
+ }
+ }
+ }
+ return sInstance;
+ }
+
+ public synchronized void release() {
+ mContext = null;
+ mMapView = null;
+ mAMap = null;
+ sInstance = null;
+ }
+
+ private Context mContext;
+ private AMapNaviView mMapView;
+ private AMap mAMap;
+
+ public synchronized void init( Context context, AMapNaviView mapView, AMap aMap ) {
+ this.mContext = context;
+ this.mMapView = mapView;
+ this.mAMap = aMap;
+ initMap();
+ changeMyLocationVisibility( true );
+ }
+
+ private boolean checkAMap() {
+ return mAMap != null;
+ }
+
+ private boolean checkAMapView() {
+ return mMapView != null;
+ }
+
+ /**
+ * 移除所有导航mapView的默认UI
+ */
+ private void initMap() {
+ if ( mMapView != null ) {
+ AMapNaviViewOptions options = mMapView.getViewOptions();
+ if ( options != null ) {
+ // 设置是否开启自动黑夜模式切换,默认为false,不自动切换
+ options.setAutoNaviViewNightMode( false );
+ // 设置6秒后是否自动锁车
+ options.setAutoLockCar( true );
+ // 设置路线上的摄像头气泡是否显示
+ options.setCameraBubbleShow( true );
+ // 设置路线相关的配置属性,如:路线的路况颜色,路线上是否显示摄像头气泡等。
+// options.setRouteOverlayOptions( MapStyleUtils.getRouteOverlayOptions() );
+ // 设置自车的图片对象
+ options.setCarBitmap( BitmapFactory.decodeResource( mContext.getResources(), R.drawable.ic_amap_navi_cursor ) );
+ // 设置指南针图标否在导航界面显示,默认显示。true,显示;false,隐藏。
+ options.setCompassEnabled( false );
+ //设置路况光柱条是否显示(只适用于驾车导航,需要联网)。
+ options.setTrafficBarEnabled( false );
+ // 设置[实时交通图层开关按钮]是否显示(只适用于驾车导航,需要联网)。
+ options.setTrafficLayerEnabled( false );
+ // 设置导航界面是否显示路线全览按钮。
+ options.setRouteListButtonShow( false );
+ // 设置起点位图,须在画路前设置
+ options.setStartPointBitmap( BitmapFactory.decodeResource( mContext.getResources(), R.drawable.ic_current_location_cursor ) );
+ // 设置终点位图,须在画路前设置
+ options.setEndPointBitmap( BitmapFactory.decodeResource( mContext.getResources(), R.drawable.ic_search_choice_point ) );
+ // 设置导航状态下屏幕是否一直开启。
+ options.setScreenAlwaysBright( true );
+ // 设置交通播报是否打开(只适用于驾车导航,需要联网)。
+ options.setTrafficInfoUpdateEnabled( true );
+ // 设置摄像头播报是否打开(只适用于驾车导航)。
+ options.setCameraInfoUpdateEnabled( true );
+ // 设置菜单按钮是否在导航界面显示。
+ options.setSettingMenuEnabled( false );
+ // 设置是否绘制显示交通路况的线路(彩虹线),拥堵-红色,畅通-绿色,缓慢-黄色,未知-蓝色。默认不绘制彩虹线。
+ options.setTrafficLine( true );
+ // 设置是否绘制牵引线(当前位置到目的地的指引线)。默认不绘制牵引线。
+ options.setLeaderLineEnabled( -1 );
+ // 设置导航界面UI是否显示。
+ options.setLayoutVisible( false );
+ // 设置是否自动画路
+ options.setAutoDrawRoute( false );
+ // 设置是否显示路口放大图(实景图)
+ options.setRealCrossDisplayShow( false );
+ // 设置是否显示路口放大图(路口模型图)
+ options.setModeCrossDisplayShow( false );
+ // 设置是否显示道路信息view
+ options.setLaneInfoShow( false );
+ // 设置是否自动改变缩放等级
+ options.setAutoChangeZoom( false );
+ // 设置是否自动全览模式,即在算路成功后自动进入全览模式
+ options.setAutoDisplayOverview( false );
+ // 设置路线转向箭头隐藏和显示
+ options.setNaviArrowVisible( false );
+ // 通过路线是否自动置灰,仅支持驾车导航
+ options.setAfterRouteAutoGray( true );
+ options.setPointToCenter( 0.5D, 0.5D );
+ mMapView.setViewOptions( options );
+ }
+ mMapView.setNaviMode( AMapNaviView.CAR_UP_MODE );
+ }
+
+ if ( mAMap != null ) {
+
+ mAMap.setTrafficEnabled( true );
+
+ UiSettings uiSettings = mAMap.getUiSettings();
+ if ( uiSettings != null ) {
+ //设置所有手势是否可用
+ uiSettings.setAllGesturesEnabled( true );
+ //设置指南针是否可见。
+ uiSettings.setCompassEnabled( false );
+ //设置是否以地图中心点缩放
+ uiSettings.setGestureScaleByMapCenter( true );
+ //设置室内地图楼层切换控件是否可见。
+ uiSettings.setIndoorSwitchEnabled( true );
+ //设置定位按钮是否可见。
+ uiSettings.setMyLocationButtonEnabled( false );
+ //设置旋转手势是否可用。
+ uiSettings.setRotateGesturesEnabled( false );
+ //设置比例尺控件是否可见
+ uiSettings.setScaleControlsEnabled( false );
+ //设置拖拽手势是否可用。
+ uiSettings.setScrollGesturesEnabled( true );
+ //设置倾斜手势是否可用。
+ uiSettings.setTiltGesturesEnabled( true );
+ //设置缩放按钮是否可见。
+ uiSettings.setZoomControlsEnabled( false );
+ //设置双指缩放手势是否可用。
+ uiSettings.setZoomGesturesEnabled( true );
+ }
+ mAMap.setCustomMapStyle( new CustomMapStyleOptions()
+ .setEnable( true )
+ .setStyleId( CustomMapStyle.STYLE_ID )
+ .setStyleData( AssetsUtils.read( mContext, CustomMapStyle.ASSET_STYLE_DATA ) )
+ .setStyleExtraData( AssetsUtils.read( mContext, CustomMapStyle.ASSET_STYLE_EXTRA_DATA ) )
+ );
+ }
+
+ }
+
+ /**
+ * 控制我的位置图层及定位回调能力
+ *
+ * @param visibility
+ */
+ public void changeMyLocationVisibility( boolean visibility ) {
+ if ( mAMap == null ) {
+ return;
+ }
+ mAMap.setMyLocationEnabled( visibility );
+ Log.d( TAG, visibility ? "开启定位" : "关闭定位" );
+ if ( visibility ) {
+ MyLocationStyle style = mAMap.getMyLocationStyle();
+ if ( style == null ) {
+ style = new MyLocationStyle();
+ }
+ style.myLocationType( MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE_NO_CENTER )
+ .strokeWidth( 0 )
+ .interval( 2_000L )
+ .showMyLocation( visibility )
+ .myLocationIcon( BitmapDescriptorFactory.fromResource( R.drawable.ic_current_location_cursor ) )
+ .radiusFillColor( Color.TRANSPARENT );
+ mAMap.setMyLocationStyle( style );
+ }
+ }
+
+ /**
+ * 导航模式:中心点偏下
+ */
+ public void showNaviUI() {
+ changeMyLocationVisibility( false );
+ changeCarOverlayVisibility( true );
+ changeRouteOverlayVisibility( false );
+ if ( mMapView != null ) {
+ mMapView.setNaviMode( AMapNaviView.CAR_UP_MODE );
+ mMapView.post( () -> {
+ AMapNaviViewOptions options = mMapView.getViewOptions();
+ if ( options != null ) {
+ Log.d( TAG, "中心点切换到页面偏下" );
+ options.setPointToCenter( 0.5D, 0.6666666666666666D );
+ mMapView.setViewOptions( options );
+ if ( checkAMap() ) {
+ mAMap.moveCamera( CameraUpdateFactory.zoomBy( 15 ) );
+ }
+ }
+ } );
+ }
+ }
+
+ /**
+ * 正常地图模式:中心点居中
+ */
+ public void showMapUI() {
+ changeMyLocationVisibility( true );
+ changeCarOverlayVisibility( false );
+ changeRouteOverlayVisibility( false );
+ if ( mMapView != null ) {
+ AMapNaviViewOptions options = mMapView.getViewOptions();
+ if ( options != null ) {
+ Log.d( TAG, "中心点切换到页面中心" );
+ options.setPointToCenter( 0.5D, 0.5D );
+ mMapView.setViewOptions( options );
+ }
+ }
+ }
+
+ /**
+ * 显示规划UI样式:中心点右移
+ */
+ public void showCalculateUI() {
+ changeMyLocationVisibility( false );
+ }
+
+ /**
+ * 控制自车marker
+ *
+ * @param visibility
+ */
+ public void changeCarOverlayVisibility( boolean visibility ) {
+ try {
+ mMapView.setCarOverlayVisible( visibility );
+ } catch ( Exception e ) {
+ }
+ }
+
+ /**
+ * 控制导航路线图层
+ *
+ * @param visibility
+ */
+ public void changeRouteOverlayVisibility( boolean visibility ) {
+ try {
+ mMapView.setRouteOverlayVisible( visibility );
+ } catch ( Exception e ) {
+ }
+ }
+
+
+ /**
+ * 将地图移动到中心点,正北方向
+ *
+ * @param latlng
+ */
+ public void moveCurrentPositionToCenter( LatLng latlng ) {
+ if ( checkAMap() ) {
+ mAMap.animateCamera( CameraUpdateFactory.newCameraPosition( new CameraPosition.Builder()
+ .tilt( mMapView.getLockTilt() )
+ .zoom( mMapView.getLockZoom() )
+ .target( latlng )
+ .bearing( AMapConstants.AMPA_BEARING )
+ .build() ) );
+ }
+ }
+
+ /**
+ * 改变地图缩放级别
+ *
+ * @param level
+ */
+ public void changeCameraZoomLevel( float level, boolean animate ) {
+ if ( checkAMap() ) {
+ if ( animate ) {
+ mAMap.animateCamera( CameraUpdateFactory.zoomTo( level ) );
+ } else {
+ mAMap.moveCamera( CameraUpdateFactory.zoomTo( level ) );
+ }
+ }
+ }
+
+ /**
+ * 添加marker
+ *
+ * @param options
+ * @return
+ */
+ public Marker addMarker( MarkerOptions options ) {
+ return mAMap.addMarker( options );
+ }
+
+ /**
+ * 缓存上次地图缩放级别
+ *
+ * @return
+ */
+ public boolean storeMapZoomLevel() {
+ if ( checkAMapView() ) {
+ final AMapNaviViewOptions options = mMapView.getViewOptions();
+ if ( options != null ) {
+ mLastZoomLevel = options.getZoom();
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * 还原上次的缩放级别
+ */
+ public void restoreMapZoomLevel() {
+ if ( checkAMapView() ) {
+ final AMapNaviViewOptions options = mMapView.getViewOptions();
+ if ( options != null ) {
+ options.setZoom( mLastZoomLevel );
+ mMapView.setViewOptions( options );
+ }
+ }
+ }
+
+ /**
+ * 交通态势开关
+ *
+ * @param enable
+ */
+ public void setTrafficEnabled( boolean enable ) {
+ if ( checkAMap() ) {
+ mAMap.setTrafficEnabled( enable );
+ }
+ }
+
+ /**
+ * 缩放地图
+ *
+ * @param zoomIn 放大
+ */
+ public void changeZoom( boolean zoomIn ) {
+ if ( checkAMapView() ) {
+ if ( zoomIn ) {
+ mMapView.zoomIn();
+ } else {
+ mMapView.zoomOut();
+ }
+ }
+ }
+
+ /**
+ * 设置地图类型
+ *
+ * @param type
+ */
+ public void setMapType( int type ) {
+ if ( checkAMap() ) {
+ mAMap.setMapType( type );
+ }
+ }
+
+ /**
+ * 导航样式:
+ *
+ * @param naviMode
+ */
+ public void setNaviMode( int naviMode ) {
+ if ( checkAMapView() ) {
+ mMapView.setNaviMode( naviMode );
+ }
+ }
+
+ /**
+ * 地图倾斜度
+ *
+ * @param tile
+ */
+ public void setTilt( int tile ) {
+ if ( checkAMapView() ) {
+ final AMapNaviViewOptions options = mMapView.getViewOptions();
+ if ( options != null ) {
+ options.setTilt( tile );
+ mMapView.setViewOptions( options );
+ }
+ }
+ }
+
+ /**
+ * 预览全程
+ */
+ public void displayOverview() {
+ if ( checkAMapView() ) {
+ mMapView.displayOverview();
+ }
+ }
+
+ /**
+ * 关闭全程预览
+ */
+ public void recoverLockMode() {
+ if ( checkAMapView() ) {
+ mMapView.recoverLockMode();
+ }
+ }
+}
diff --git a/modules/mogo-module-navi/src/main/java/com/mogo/module/navi/ui/search/SearchFragment.java b/modules/mogo-module-navi/src/main/java/com/mogo/module/navi/ui/search/SearchFragment.java
index 3b092841f5..8beea1b768 100644
--- a/modules/mogo-module-navi/src/main/java/com/mogo/module/navi/ui/search/SearchFragment.java
+++ b/modules/mogo-module-navi/src/main/java/com/mogo/module/navi/ui/search/SearchFragment.java
@@ -30,9 +30,13 @@ import com.amap.api.maps.model.animation.TranslateAnimation;
import com.amap.api.services.geocoder.RegeocodeAddress;
import com.amap.api.services.help.Tip;
+import com.mogo.module.map.location.AMapLocationManager;
import com.mogo.module.navi.R;
+import com.mogo.module.navi.bean.EntityConvertUtils;
+import com.mogo.module.navi.bean.SearchPoi;
import com.mogo.module.navi.ui.adapter.SearchPoiAdapter;
import com.mogo.module.navi.ui.base.BaseFragment;
+import com.mogo.module.navi.ui.base.MapUIController;
import com.mogo.module.navi.ui.base.UiController;
import com.mogo.utils.WindowUtils;
import io.reactivex.disposables.Disposable;
@@ -110,7 +114,7 @@ public class SearchFragment extends BaseFragment implements SearchView,
public void onActivityCreated( @Nullable Bundle savedInstanceState ) {
super.onActivityCreated( savedInstanceState );
initViews();
- getLifecycle().addObserver( mSearchPresenter = new com.mogo.module.navi.database.ui.search.SearchPresenter( this ) );
+ getLifecycle().addObserver( mSearchPresenter = new SearchPresenter( this ) );
}
private void initViews() {
@@ -241,7 +245,7 @@ public class SearchFragment extends BaseFragment implements SearchView,
mCurrentLocation.setVisibility( View.GONE );
mSearchResult.setVisibility( View.GONE );
mActionButton.setVisibility( View.VISIBLE );
- mActionButton.setText( com.mogo.module.navi.database.ui.search.SearchUtils.getSearchTypeActionName( mSearchType ) );
+ mActionButton.setText( SearchUtils.getSearchTypeActionName( mSearchType ) );
mSearchBox.setCompoundDrawables( null, null, null, null );
removeChoicePointMarker();
mSearchBox.setTag( null );
@@ -264,7 +268,7 @@ public class SearchFragment extends BaseFragment implements SearchView,
mCurrentLocation.setVisibility( View.GONE );
mSearchResult.setVisibility( View.GONE );
mActionButton.setVisibility( View.VISIBLE );
- mActionButton.setText( com.mogo.module.navi.database.ui.search.SearchUtils.getSearchTypeActionName( mSearchType ) );
+ mActionButton.setText( SearchUtils.getSearchTypeActionName( mSearchType ) );
mSearchBox.setCompoundDrawables( null, null, null, null );
showChoicePointMarker();
mSearchBox.setTag( null );
@@ -313,18 +317,18 @@ public class SearchFragment extends BaseFragment implements SearchView,
@Override
public void onLocationChanged( AMapLocation aMapLocation ) {
- final String checkMsg = AMapUtils.getAMapLocationErrorMsg( aMapLocation );
- if ( AMapUtils.LOC_SUCCESS.equals( checkMsg ) ) {
- mLastAMapLocation = aMapLocation;
- MapUIController.getInstance().moveCurrentPositionToCenter( new LatLng( aMapLocation.getLatitude(), aMapLocation.getLongitude() ) );
- if ( mUiMode == SearchConstants.UI_MODE_MULTI_MY_LOCATION ) {
- showMyLocationAddress( aMapLocation );
- } else if ( mUiMode == SearchConstants.UI_MODE_MULTI_CHOICE_POINT ) {
- showChoicePointAddress( aMapLocation );// 显示当前中心点地址
- }
- } else {
- Toast.makeText( mContext, checkMsg, Toast.LENGTH_SHORT ).show();
- }
+ //final String checkMsg = AMapUtils.getAMapLocationErrorMsg( aMapLocation );
+ //if ( AMapUtils.LOC_SUCCESS.equals( checkMsg ) ) {
+ // mLastAMapLocation = aMapLocation;
+ // MapUIController.getInstance().moveCurrentPositionToCenter( new LatLng( aMapLocation.getLatitude(), aMapLocation.getLongitude() ) );
+ // if ( mUiMode == SearchConstants.UI_MODE_MULTI_MY_LOCATION ) {
+ // showMyLocationAddress( aMapLocation );
+ // } else if ( mUiMode == SearchConstants.UI_MODE_MULTI_CHOICE_POINT ) {
+ // showChoicePointAddress( aMapLocation );// 显示当前中心点地址
+ // }
+ //} else {
+ // Toast.makeText( mContext, checkMsg, Toast.LENGTH_SHORT ).show();
+ //}
AMapLocationManager.getInstance( mContext ).removeLocationListener( this );
AMapLocationManager.getInstance( mContext ).stop();
}
@@ -390,8 +394,7 @@ public class SearchFragment extends BaseFragment implements SearchView,
}
if ( mPoiAdapter == null ) {
- mPoiAdapter = new SearchPoiAdapter( datums, com.mogo.module.navi.database.ui.search.SearchUtils
- .getSearchTypeActionName( mSearchType ) );
+ mPoiAdapter = new SearchPoiAdapter(getContext(), datums );
mPoiAdapter.setOnItemClickedListener( item -> {
if ( mSearchType == SearchConstants.SEARCH_TYPE_COMMON ) {
final Disposable disposable = mSearchPresenter.cacheSelectPoiItem( item ).subscribe( output -> {
@@ -443,15 +446,15 @@ public class SearchFragment extends BaseFragment implements SearchView,
mSearchBox.setText( address.getFormatAddress() );
}
- @Override
- public void renderErrorView() {
-
- }
-
- @Override
- public void renderContentView() {
-
- }
+ //@Override
+ //public void renderErrorView() {
+ //
+ //}
+ //
+ //@Override
+ //public void renderContentView() {
+ //
+ //}
// view interface end
@@ -502,7 +505,7 @@ public class SearchFragment extends BaseFragment implements SearchView,
Toast.makeText( mContext, "未设置", Toast.LENGTH_SHORT ).show();
return;
}
- SearchPoiLiveData.getInstance().postValue( searchPoi );
+ //SearchPoiLiveData.getInstance().postValue( searchPoi );
exitSearch();
}
diff --git a/modules/mogo-module-navi/src/main/java/com/mogo/module/navi/ui/search/SearchPresenter.java b/modules/mogo-module-navi/src/main/java/com/mogo/module/navi/ui/search/SearchPresenter.java
index 50690be5f6..717f37044f 100644
--- a/modules/mogo-module-navi/src/main/java/com/mogo/module/navi/ui/search/SearchPresenter.java
+++ b/modules/mogo-module-navi/src/main/java/com/mogo/module/navi/ui/search/SearchPresenter.java
@@ -19,9 +19,14 @@ import com.amap.api.services.help.Inputtips;
import com.amap.api.services.help.InputtipsQuery;
import com.amap.api.services.help.Tip;
import com.mogo.commons.mvp.Presenter;
+import com.mogo.module.common.TextWatcherAdapter;
+import com.mogo.module.navi.bean.EntityConvertUtils;
+import com.mogo.module.navi.bean.SearchPoi;
import com.mogo.module.navi.constants.DataConstants;
+import com.mogo.module.navi.database.AppDataBase;
import io.reactivex.Single;
import io.reactivex.SingleEmitter;
+import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
@@ -124,7 +129,7 @@ public class SearchPresenter extends Presenter< SearchView >
return Single.create( emitter -> {
SearchPoi poi = EntityConvertUtils.tipToPoi( tip );
//ignore insert result
- final List> load();
-}
diff --git a/modules/mogo-module-navi/src/main/java/com/mogo/module/navi/dao/SearchPoiDao.java b/modules/mogo-module-navi/src/main/java/com/mogo/module/navi/dao/SearchPoiDao.java
new file mode 100644
index 0000000000..56a799272c
--- /dev/null
+++ b/modules/mogo-module-navi/src/main/java/com/mogo/module/navi/dao/SearchPoiDao.java
@@ -0,0 +1,42 @@
+package com.mogo.module.navi.dao;
+
+import androidx.room.Dao;
+import androidx.room.Delete;
+import androidx.room.Insert;
+import androidx.room.OnConflictStrategy;
+import androidx.room.Query;
+import com.mogo.module.navi.bean.SearchPoi;
+import com.mogo.module.navi.constants.DataConstants;
+import io.reactivex.Single;
+import java.util.List;
+
+/**
+ * @author congtaowang
+ * @since 2019-10-02
+ *
> getLastN(int limit);
+
+ @Query( "SELECT * FROM " + DataConstants.T_SEARCH_POI + " WHERE type=" + DataConstants.TYPE_POI )
+ Single
> getAll();
+
+ @Query( "SELECT * FROM " + DataConstants.T_SEARCH_POI + " WHERE type=" + DataConstants.TYPE_HOME_ADDRESS )
+ Single
> getHomeAddress();
+
+ @Query( "SELECT * FROM " + DataConstants.T_SEARCH_POI + " WHERE type=" + DataConstants.TYPE_COMPANY_ADDRESS )
+ Single
> getCompanyAddress();
+
+ @Delete
+ int delete(SearchPoi poi);
+
+ @Delete
+ int deleteAll(List
> emitter, SearchPoi poi ) {
String poiId = null;
- switch ( view.getSearchType() ) {
+ switch ( mView.getSearchType() ) {
case SearchConstants.SEARCH_TYPE_MULTI_HOME:
poiId = DataConstants.POI_ID_HOME;
break;
@@ -228,20 +233,20 @@ public class SearchPresenter extends Presenter< SearchView >
return;
}
poi.setpId( poiId );
- poi.setType( view.getSearchType() );
+ poi.setType( mView.getSearchType() );
//ignore insert result
- final List