diff --git a/app/build.gradle b/app/build.gradle
index 4d3fc0e9b1..11fb01ca5c 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -4,11 +4,11 @@ android {
compileSdkVersion rootProject.ext.android.compileSdkVersion
buildToolsVersion rootProject.ext.android.buildToolsVersion
defaultConfig {
- applicationId rootProject.ext.android.applicationId
minSdkVersion rootProject.ext.android.minSdkVersion
targetSdkVersion rootProject.ext.android.targetSdkVersion
versionCode rootProject.ext.android.versionCode
versionName rootProject.ext.android.versionName
+ applicationId rootProject.ext.android.applicationId
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
javaCompileOptions {
@@ -54,6 +54,16 @@ dependencies {
testImplementation rootProject.ext.dependencies.leakcanary
releaseImplementation rootProject.ext.dependencies.leakcanarynoop
releaseImplementation rootProject.ext.dependencies.androidxmultidex
- implementation project(':modules:mogo-module-main')
- implementation project(':foudations:mogo-commons')
+
+ if (Boolean.valueOf(RELEASE)) {
+ api rootProject.ext.dependencies.modulemain
+ api rootProject.ext.dependencies.mogocommons
+ implementation rootProject.ext.dependencies.moduledemo
+ implementation rootProject.ext.dependencies.moduledemo2
+ } else {
+ implementation project(':modules:mogo-module-main')
+ implementation project(':foudations:mogo-commons')
+ implementation project(':demo:demo-module-map')
+ implementation project(':demo:demo-module-map2')
+ }
}
diff --git a/build.gradle b/build.gradle
index f672c71300..51e13205f9 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,5 +1,6 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
apply from: "config.gradle"
+apply from: "javadoc.gradle"
buildscript {
ext.kotlin_version = '1.3.61+'
repositories {
@@ -38,14 +39,51 @@ allprojects {
google()
jcenter()
// flatDir {
- // 由于Library module中引用了 youkuplayer 库的 aar,在多 module 的情况下,
- // 其他的module编译会报错,所以需要在所有工程的repositories
- // 下把Library module中的libs目录添加到依赖关系中
+ // 由于Library module中引用了 youkuplayer 库的 aar,在多 module 的情况下,
+ // 其他的module编译会报错,所以需要在所有工程的repositories
+ // 下把Library module中的libs目录添加到依赖关系中
// dirs project(':libraries:map-baidu').file('libs')
// }
}
+
}
task clean(type: Delete) {
delete rootProject.buildDir
}
+
+def getValueFromRootProperties(String key) {
+ File file = rootProject.file('gradle.properties')
+ String value = "";
+ if (file.exists()) {
+ //加载资源
+ InputStream inputStream = file.newDataInputStream();
+ Properties properties = new Properties()
+ properties.load(inputStream)
+
+ if (properties.containsKey(key)) {
+ value = properties.getProperty(key)
+ }
+ }
+ return value
+}
+
+afterEvaluate {
+ rootProject.subprojects { project ->
+ project.afterEvaluate {
+ dependencies{
+ components {
+ all { ComponentMetadataDetails details ->
+ if (details.toString().endsWith("-SNAPSHOT")) {
+ details.changing = true
+ }
+ }
+ }
+ }
+ it.configurations.all {
+ resolutionStrategy.cacheChangingModulesFor 0, 'minutes'
+ }
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/config.gradle b/config.gradle
index a1ee099928..62dedc2903 100644
--- a/config.gradle
+++ b/config.gradle
@@ -14,6 +14,8 @@ ext {
androidxappcompat : "androidx.appcompat:appcompat:1.0.2",
androidxconstraintlayout: "androidx.constraintlayout:constraintlayout:1.1.3",
androidxmultidex : "androidx.multidex:multidex:2.0.1",
+ androidxviewpager2 : "androidx.viewpager2:viewpager2:1.0.0",
+ androidxrecyclerview : "androidx.recyclerview:recyclerview:1.1.0",
// 测试
junit : "junit:junit:4.12",
androidxjunit : "androidx.test.ext:junit:1.1.0",
@@ -56,5 +58,24 @@ ext {
// leakcanary
leakcanary : 'com.squareup.leakcanary:leakcanary-android:1.5.4',
leakcanarynoop : 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.4',
+
+ // material
+ material : 'com.google.android.material:material:1.0.0',
+
+
+ // modules
+ moduledemo : "com.mogo.module:module-demo:${DEMO_MODULE_MAP_VERSION}",
+ moduledemo2 : "com.mogo.module:module-demo:${DEMO_MODULE_MAP2_VERSION}",
+ mogocommons : "com.mogo.commons:mogo-commons:${MOGO_COMMONS_VERSION}",
+ mogoutils : "com.mogo.commons:mogo-utils:${MOGO_UTILS_VERSION}",
+ mapamap : "com.mogo.map:map-amap:${MAP_AMAP_VERSION}",
+ mogomap : "com.mogo.map:mogo-map:${MOGO_MAP_VERSION}",
+ mogomapapi : "com.mogo.map:mogo-map-api:${MOGO_MAP_API_VERSION}",
+ modulecommon : "com.mogo.module:module-common:${MOGO_MODULE_COMMON_VERSION}",
+ modulemain : "com.mogo.module:module-main:${MOGO_MODULE_MAIN_VERSION}",
+ modulemap : "com.mogo.module:module-map:${MOGO_MODULE_MAP_VERSION}",
+ mogoservice : "com.mogo.service:mogo-service:${MOGO_SERVICE_VERSION}",
+ mogoserviceapi : "com.mogo.service:mogo-service-api:${MOGO_SERVICE_API_VERSION}",
+ moduleapps : "com.mogo.module:module-apps:${MOGO_MODULE_APPS_VERSION}",
]
}
\ No newline at end of file
diff --git a/demo/demo-module-map/build.gradle b/demo/demo-module-map/build.gradle
index 0290a16845..4cdc37ad48 100644
--- a/demo/demo-module-map/build.gradle
+++ b/demo/demo-module-map/build.gradle
@@ -2,15 +2,13 @@ apply plugin: 'com.android.library'
apply plugin: 'com.alibaba.arouter'
android {
- compileSdkVersion 29
- buildToolsVersion "29.0.2"
-
-
+ compileSdkVersion rootProject.ext.android.compileSdkVersion
+ buildToolsVersion rootProject.ext.android.buildToolsVersion
defaultConfig {
- minSdkVersion 19
- targetSdkVersion 29
- versionCode 1
- versionName "1.0"
+ minSdkVersion rootProject.ext.android.minSdkVersion
+ targetSdkVersion rootProject.ext.android.targetSdkVersion
+ versionCode Integer.valueOf(VERSION_CODE)
+ versionName getValueFromRootProperties("${project.name.replace("-", "_").toUpperCase()}_VERSION")
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles 'consumer-rules.pro'
@@ -34,13 +32,22 @@ android {
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
- implementation project(":libraries:mogo-map")
- implementation project(":foudations:mogo-utils")
- api project(":foudations:mogo-commons")
- implementation project(':services:mogo-service-api')
- implementation project(':modules:mogo-module-common')
+ if (Boolean.valueOf(RELEASE)) {
+ implementation rootProject.ext.dependencies.mogomap
+ implementation rootProject.ext.dependencies.mogoutils
+ implementation rootProject.ext.dependencies.mogocommons
+ implementation rootProject.ext.dependencies.mogoserviceapi
+ implementation rootProject.ext.dependencies.modulecommon
+ } else {
+ implementation project(":libraries:mogo-map")
+ implementation project(":foudations:mogo-utils")
+ api project(":foudations:mogo-commons")
+ implementation project(':services:mogo-service-api')
+ implementation project(':modules:mogo-module-common')
+ }
implementation rootProject.ext.dependencies.androidxappcompat
implementation rootProject.ext.dependencies.androidxconstraintlayout
implementation rootProject.ext.dependencies.arouter
annotationProcessor rootProject.ext.dependencies.aroutercompiler
}
+apply from: new File(rootProject.rootDir, "gradle/upload.gradle").toString()
diff --git a/demo/demo-module-map/gradle.properties b/demo/demo-module-map/gradle.properties
new file mode 100644
index 0000000000..cc80da2676
--- /dev/null
+++ b/demo/demo-module-map/gradle.properties
@@ -0,0 +1,3 @@
+GROUP=com.mogo.module
+POM_ARTIFACT_ID=module-demo
+VERSION_CODE=1
diff --git a/demo/demo-module-map/src/main/java/com/mogo/demo/module/map/DemoCardViewFragment.java b/demo/demo-module-map/src/main/java/com/mogo/demo/module/map/DemoCardViewFragment.java
index 5845a754b9..25c2a73663 100644
--- a/demo/demo-module-map/src/main/java/com/mogo/demo/module/map/DemoCardViewFragment.java
+++ b/demo/demo-module-map/src/main/java/com/mogo/demo/module/map/DemoCardViewFragment.java
@@ -1,11 +1,8 @@
package com.mogo.demo.module.map;
-import android.app.AlertDialog;
-import android.content.DialogInterface;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
-import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
@@ -38,6 +35,7 @@ import com.mogo.map.search.poisearch.query.MogoPoiSearchQuery;
import com.mogo.map.uicontroller.EnumMapUI;
import com.mogo.map.uicontroller.IMogoMapUIController;
import com.mogo.service.MogoServicePaths;
+import com.mogo.service.imageloader.IMogoImageloader;
import com.mogo.service.map.IMogoMapService;
import com.mogo.service.module.IMogoModuleLifecycle;
import com.mogo.utils.TipToast;
@@ -84,6 +82,9 @@ public class DemoCardViewFragment extends MvpFragment< IView, Presenter< IView >
private IMogoMapUIController mMapUIController;
private DemoInfoWindowAdapter mDemoInfoWindowAdapter;
+ private MogoLocation mLocation;
+
+ private IMogoImageloader mImageloader;
@Override
protected int getLayoutId() {
@@ -96,10 +97,11 @@ public class DemoCardViewFragment extends MvpFragment< IView, Presenter< IView >
mNaviMode = findViewById( R.id.demo_module_id_navi_mode );
mMapService = ( IMogoMapService ) ARouter.getInstance().build( MogoServicePaths.PATH_SERVICES_MAP ).navigation( getContext() );
+ mImageloader = ( IMogoImageloader ) ARouter.getInstance().build( MogoServicePaths.PATH_UTILS_IMAGE_LOADER ).navigation( getContext() );
mPoiSearch = mMapService.getPoiSearch( getContext(), new MogoPoiSearchQuery() );
mPoiSearch.setPoiSearchListener( this );
- mLocationClient = mMapService.getSingletonLocationClient( getContext() );
- mLocationClient.addLocationListener( this );
+ mLocationClient = mMapService.getLocationClient( getContext() );
+ mLocation = mLocationClient.getLastKnowLocation();
mMarkerManager = mMapService.getMarkerManager( getContext() );
mNavi = mMapService.getNavi( getContext() );
mMapUIController = mMapService.getMapUIController();
@@ -112,12 +114,12 @@ public class DemoCardViewFragment extends MvpFragment< IView, Presenter< IView >
new View.OnClickListener() {
@Override
public void onClick( View v ) {
- mLocationClient.start( 1_000L );
+ mLocationClient.start( 4_000L );
}
}
);
- mDemoInfoWindowAdapter = new DemoInfoWindowAdapter( getContext(), mNavi );
+ mDemoInfoWindowAdapter = new DemoInfoWindowAdapter( getContext(), mNavi, mImageloader );
mMarkerIcon = BitmapFactory.decodeResource( getResources(), R.drawable.ic_search_poi_location );
mClickedMarkerIcon = BitmapFactory.decodeResource( getResources(), R.drawable.ic_search_choice_point );
@@ -128,6 +130,7 @@ public class DemoCardViewFragment extends MvpFragment< IView, Presenter< IView >
MogoMarkerOptions options = new MogoMarkerOptions()
.icon( mMarkerIcon )
.latitude( 39.974525d )
+ .owner( DemoConstants.TAG )
.longitude( 116.41733d );
IMogoMarker marker = mMarkerManager.addMarker( DemoConstants.TAG, options );
marker.setInfoWindowAdapter( mDemoInfoWindowAdapter );
@@ -142,9 +145,14 @@ public class DemoCardViewFragment extends MvpFragment< IView, Presenter< IView >
ArrayList< MogoMarkerOptions > optionsList = new ArrayList<>();
for ( int i = 0; i < 10; i++ ) {
MogoMarkerOptions options = new MogoMarkerOptions()
- .icon( mMarkerIcon )
+ .owner( DemoConstants.TAG )
.latitude( 39.974525d + new Random().nextDouble() )
.longitude( 116.41733d + new Random().nextDouble() );
+ if ( i % 2 == 0 ) {
+ options.icon( mMarkerIcon );
+ } else {
+ options.icon( mDemoInfoWindowAdapter.getMarkerView( options ) );
+ }
optionsList.add( options );
}
List< IMogoMarker > iMogoMarkers = mMarkerManager.addMarkers( DemoConstants.TAG, optionsList, true );
@@ -176,7 +184,7 @@ public class DemoCardViewFragment extends MvpFragment< IView, Presenter< IView >
findViewById( R.id.demo_module_id_current ).setOnClickListener( new View.OnClickListener() {
@Override
public void onClick( View v ) {
- mMapUIController.moveToCurrentLocation();
+ mMapUIController.moveToCenter( new MogoLatLng( mLocation.getLatitude(), mLocation.getLongitude() ) );
}
} );
@@ -251,6 +259,14 @@ public class DemoCardViewFragment extends MvpFragment< IView, Presenter< IView >
mMapUIController.recoverLockMode();
}
} );
+
+ mLocationClient.addLocationListener( new IMogoLocationListener() {
+ @Override
+ public void onLocationChanged( MogoLocation location ) {
+ mLocation = location;
+ Logger.d( TAG, "demo模块定位,定位间隔4s" );
+ }
+ } );
}
@Override
@@ -261,13 +277,13 @@ public class DemoCardViewFragment extends MvpFragment< IView, Presenter< IView >
@Override
public boolean onMarkerClicked( IMogoMarker marker ) {
- if ( mLastClickedMarker != null ) {
- mLastClickedMarker.setIcon( this.mMarkerIcon );
- }
- marker.setIcon( mClickedMarkerIcon );
- mLastClickedMarker = marker;
+// if ( mLastClickedMarker != null ) {
+// mLastClickedMarker.setIcon( this.mMarkerIcon );
+// }
+// marker.setIcon( mClickedMarkerIcon );
+// mLastClickedMarker = marker;
- marker.showInfoWindow();
+// marker.showInfoWindow();
return true;
}
@@ -280,12 +296,12 @@ public class DemoCardViewFragment extends MvpFragment< IView, Presenter< IView >
@Override
public void onPerform() {
- TipToast.shortTip( "卡片有效" );
+ Logger.d( TAG, "卡片demo有效" );
}
@Override
public void onDisable() {
- TipToast.shortTip( "卡片无效" );
+ Logger.d( TAG, "卡片demo无效" );
}
@@ -335,8 +351,8 @@ public class DemoCardViewFragment extends MvpFragment< IView, Presenter< IView >
@Override
public void onLocationChanged( MogoLocation location ) {
- mLocationClient.stop();
- Logger.i( TAG, location.toString() );
+ mLocation = location;
+ Logger.i( TAG, "接受到的地图模块定位信息" );
if ( mLocInfo != null ) {
if ( location.getErrCode() == 0 ) {
mLocInfo.setText( "当前位置:" + location.getAddress() );
@@ -363,6 +379,7 @@ public class DemoCardViewFragment extends MvpFragment< IView, Presenter< IView >
@Override
public void onDestroyView() {
+ Logger.w( TAG, "onDestroyView" );
super.onDestroyView();
getViewLifecycleOwner().getLifecycle().removeObserver( mPresenter );
mLocationClient.removeLocationListener( this );
diff --git a/demo/demo-module-map/src/main/java/com/mogo/demo/module/map/DemoCardViewProvider.java b/demo/demo-module-map/src/main/java/com/mogo/demo/module/map/DemoCardViewProvider.java
index 4c6f0c0c55..bc5287e8dc 100644
--- a/demo/demo-module-map/src/main/java/com/mogo/demo/module/map/DemoCardViewProvider.java
+++ b/demo/demo-module-map/src/main/java/com/mogo/demo/module/map/DemoCardViewProvider.java
@@ -2,16 +2,28 @@ package com.mogo.demo.module.map;
import android.content.Context;
import android.os.Bundle;
+import android.view.MotionEvent;
import android.view.View;
import androidx.fragment.app.Fragment;
import com.alibaba.android.arouter.facade.annotation.Route;
+import com.mogo.map.MogoLatLng;
import com.mogo.map.listener.IMogoMapListener;
+import com.mogo.map.location.IMogoLocationListener;
+import com.mogo.map.location.MogoLocation;
+import com.mogo.map.marker.IMogoMarker;
+import com.mogo.map.marker.IMogoMarkerClickListener;
+import com.mogo.map.model.MogoPoi;
import com.mogo.map.navi.IMogoNaviListener;
+import com.mogo.map.search.geo.MogoPoiItem;
+import com.mogo.map.search.poisearch.IMogoPoiSearchListener;
+import com.mogo.map.search.poisearch.MogoPoiResult;
+import com.mogo.map.uicontroller.EnumMapUI;
import com.mogo.module.common.MogoModulePaths;
import com.mogo.service.module.IMogoModuleLifecycle;
import com.mogo.service.module.IMogoModuleProvider;
+import com.mogo.utils.logger.Logger;
/**
* @author congtaowang
@@ -22,12 +34,15 @@ import com.mogo.service.module.IMogoModuleProvider;
@Route( path = MogoModulePaths.PATH_MODULE_DEMO )
public class DemoCardViewProvider implements IMogoModuleProvider {
+ private static final String TAG = "DemoCardViewProvider";
+
private DemoCardViewFragment fragment;
@Override
public Fragment createFragment( Context context, Bundle data ) {
fragment = new DemoCardViewFragment();
fragment.setArguments( data );
+ Logger.i( TAG, "createFragment" );
return fragment;
}
@@ -41,22 +56,12 @@ public class DemoCardViewProvider implements IMogoModuleProvider {
return DemoConstants.TAG;
}
- @Override
- public IMogoModuleLifecycle getCardLifecycle() {
- return fragment;
- }
-
@Override
public View createView( Context context ) {
// don't
return null;
}
- @Override
- public IMogoMapListener getMapListener() {
- return fragment;
- }
-
@Override
public int getType() {
return IMogoModuleProvider.TYPE_FRAGMENT;
@@ -66,4 +71,20 @@ public class DemoCardViewProvider implements IMogoModuleProvider {
public IMogoNaviListener getNaviListener() {
return null;
}
+
+
+ @Override
+ public IMogoModuleLifecycle getCardLifecycle() {
+ return fragment;
+ }
+
+ @Override
+ public IMogoMapListener getMapListener() {
+ return fragment;
+ }
+
+ @Override
+ public IMogoLocationListener getLocationListener() {
+ return fragment;
+ }
}
diff --git a/demo/demo-module-map/src/main/java/com/mogo/demo/module/map/DemoInfoWindowAdapter.java b/demo/demo-module-map/src/main/java/com/mogo/demo/module/map/DemoInfoWindowAdapter.java
index f0fb866a28..e5e0dc8043 100644
--- a/demo/demo-module-map/src/main/java/com/mogo/demo/module/map/DemoInfoWindowAdapter.java
+++ b/demo/demo-module-map/src/main/java/com/mogo/demo/module/map/DemoInfoWindowAdapter.java
@@ -1,6 +1,7 @@
package com.mogo.demo.module.map;
import android.content.Context;
+import android.graphics.Bitmap;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
@@ -8,9 +9,16 @@ import android.widget.TextView;
import com.mogo.map.marker.IMogoInfoWindowAdapter;
import com.mogo.map.marker.IMogoMarker;
+import com.mogo.map.marker.MogoMarkerOptions;
import com.mogo.map.navi.IMogoNavi;
import com.mogo.map.navi.MogoNaviConfig;
import com.mogo.map.search.geo.MogoPoiItem;
+import com.mogo.service.imageloader.IMogoImageLoaderListener;
+import com.mogo.service.imageloader.IMogoImageloader;
+import com.mogo.service.imageloader.MogoImageView;
+import com.mogo.utils.WindowUtils;
+import com.mogo.utils.logger.Logger;
+import com.mogo.utils.network.utils.Util;
import java.text.SimpleDateFormat;
import java.util.Date;
@@ -23,12 +31,16 @@ import java.util.Date;
*/
public class DemoInfoWindowAdapter implements IMogoInfoWindowAdapter {
+ private static final String TAG = "DemoInfoWindowAdapter";
+
private Context mContext;
private IMogoNavi mNavi;
+ private IMogoImageloader mImageloader;
- public DemoInfoWindowAdapter( Context mContext, IMogoNavi mNavi ) {
+ public DemoInfoWindowAdapter( Context mContext, IMogoNavi mNavi, IMogoImageloader iMogoImageloader ) {
this.mContext = mContext;
this.mNavi = mNavi;
+ this.mImageloader = iMogoImageloader;
}
@Override
@@ -90,5 +102,31 @@ public class DemoInfoWindowAdapter implements IMogoInfoWindowAdapter {
}
} );
}
+
+ public View getMarkerView( final MogoMarkerOptions options ) {
+ final View view = LayoutInflater.from( mContext ).inflate( R.layout.demo_module_demo_bubble_marker, null );
+ final MogoImageView icon = view.findViewById( R.id.icon );
+ mImageloader.displayImage( "http://imgnews.gmw.cn/attachement/jpg/site2/20191229/00d86176ed0b1f71f4580f.jpg", icon, WindowUtils.dip2px( mContext, 50 ), WindowUtils.dip2px( mContext, 50 ),
+ new IMogoImageLoaderListener() {
+ @Override
+ public void onStart() {
+
+ }
+
+ @Override
+ public void onCompleted( Bitmap bitmap ) {
+ // 刷新图标
+ Logger.d( TAG, "loaded." );
+ options.icon( view );
+ options.notifyObservers();
+ }
+
+ @Override
+ public void onFailure( Exception e ) {
+
+ }
+ } );
+ return view;
+ }
}
diff --git a/demo/demo-module-map/src/main/res/layout/demo_module_card_view.xml b/demo/demo-module-map/src/main/res/layout/demo_module_card_view.xml
index 75efba6ac9..3a5cf150c4 100644
--- a/demo/demo-module-map/src/main/res/layout/demo_module_card_view.xml
+++ b/demo/demo-module-map/src/main/res/layout/demo_module_card_view.xml
@@ -1,159 +1,152 @@
-
+ * 描述:demo测试各种接口 + */ + +public class Demo2CardViewFragment extends MvpFragment< IView, Presenter< IView > > + implements IView, + IMogoMarkerClickListener, + IMogoModuleLifecycle, + IMogoMapListener, + IMogoPoiSearchListener, + IMogoLocationListener { + + private static final String TAG = "demo.Demo2CardViewProvider"; + + private Button mAddMarker; + private Button mAddMarkers; + + private Bitmap mMarkerIcon; + private Bitmap mClickedMarkerIcon; + private TextView mLocInfo; + private TextView mLoc; + private Button m2D3D; + private CheckBox mNaviMode; + + private IMogoMarker mLastClickedMarker; + + private IMogoMapService mMapService; + private IMogoPoiSearch mPoiSearch; + private IMogoLocationClient mLocationClient; + private IMogoMarkerManager mMarkerManager; + private IMogoNavi mNavi; + private IMogoMapUIController mMapUIController; + + private Demo2InfoWindowAdapter mDemoInfoWindowAdapter; + private MogoLocation mLocation; + + private IMogoImageloader mImageloader; + + @Override + protected int getLayoutId() { + return R.layout.demo2_module_card_view; + } + + @Override + protected void initViews() { + + mNaviMode = findViewById( R.id.demo_module_id_navi_mode ); + + mMapService = ( IMogoMapService ) ARouter.getInstance().build( MogoServicePaths.PATH_SERVICES_MAP ).navigation( getContext() ); + mImageloader = ( IMogoImageloader ) ARouter.getInstance().build( MogoServicePaths.PATH_UTILS_IMAGE_LOADER ).navigation( getContext() ); + mPoiSearch = mMapService.getPoiSearch( getContext(), new MogoPoiSearchQuery() ); + mPoiSearch.setPoiSearchListener( this ); + mLocationClient = mMapService.getLocationClient( getContext() ); + mLocation = mLocationClient.getLastKnowLocation(); + mMarkerManager = mMapService.getMarkerManager( getContext() ); + mNavi = mMapService.getNavi( getContext() ); + mMapUIController = mMapService.getMapUIController(); + + m2D3D = findViewById( R.id.demo_module_id_2d3d ); + + mLocInfo = findViewById( R.id.demo_module_id_loc_info ); + mLoc = findViewById( R.id.demo_module_id_loc ); + mLoc.setOnClickListener( + new View.OnClickListener() { + @Override + public void onClick( View v ) { + mLocationClient.start( 4_000L ); + } + } + ); + + mDemoInfoWindowAdapter = new Demo2InfoWindowAdapter( getContext(), mNavi, mImageloader ); + + mMarkerIcon = BitmapFactory.decodeResource( getResources(), R.drawable.ic_search_poi_location ); + mClickedMarkerIcon = BitmapFactory.decodeResource( getResources(), R.drawable.ic_search_choice_point ); + mAddMarker = findViewById( R.id.demo_module_id_add_marker ); + mAddMarker.setOnClickListener( new View.OnClickListener() { + @Override + public void onClick( View v ) { + MogoMarkerOptions options = new MogoMarkerOptions() + .icon( mMarkerIcon ) + .latitude( 39.974525d ) + .owner( Demo2Constants.TAG ) + .longitude( 116.41733d ); + IMogoMarker marker = mMarkerManager.addMarker( Demo2Constants.TAG, options ); + marker.setInfoWindowAdapter( mDemoInfoWindowAdapter ); + marker.setOnMarkerClickListener( Demo2CardViewFragment.this ); + } + } ); + mAddMarkers = findViewById( R.id.demo_module_id_add_markers ); + mAddMarkers.setOnClickListener( new View.OnClickListener() { + @Override + public void onClick( View v ) { + + ArrayList< MogoMarkerOptions > optionsList = new ArrayList<>(); + for ( int i = 0; i < 10; i++ ) { + MogoMarkerOptions options = new MogoMarkerOptions() + .owner( Demo2Constants.TAG ) + .latitude( 39.974525d + new Random().nextDouble() ) + .longitude( 116.41733d + new Random().nextDouble() ); + if ( i % 2 == 0 ) { + options.icon( mMarkerIcon ); + } else { + options.icon( mDemoInfoWindowAdapter.getMarkerView( options ) ); + } + optionsList.add( options ); + } + List< IMogoMarker > iMogoMarkers = mMarkerManager.addMarkers( Demo2Constants.TAG, optionsList, true ); + for ( IMogoMarker iMogoMarker : iMogoMarkers ) { + iMogoMarker.setInfoWindowAdapter( mDemoInfoWindowAdapter ); + iMogoMarker.setOnMarkerClickListener( Demo2CardViewFragment.this ); + } + } + } ); + + findViewById( R.id.demo_module_id_clear ).setOnClickListener( new View.OnClickListener() { + @Override + public void onClick( View v ) { + mMarkerManager.removeMarkers( Demo2Constants.TAG ); + } + } ); + + m2D3D.setOnClickListener( new View.OnClickListener() { + + private EnumMapUI ui = EnumMapUI.NorthUP_2D; + + @Override + public void onClick( View v ) { + mMapUIController.changeMapMode( ui = ui.next() ); + m2D3D.setText( ui.toString() ); + } + } ); + + findViewById( R.id.demo_module_id_current ).setOnClickListener( new View.OnClickListener() { + @Override + public void onClick( View v ) { + mMapUIController.moveToCenter( new MogoLatLng( mLocation.getLatitude(), mLocation.getLongitude() ) ); + } + } ); + + findViewById( R.id.demo_module_id_start_navi ).setOnClickListener( new View.OnClickListener() { + @Override + public void onClick( View v ) { + mNavi.startNavi( !mNaviMode.isChecked() ); + } + } ); + + findViewById( R.id.demo_module_id_stop_navi ).setOnClickListener( new View.OnClickListener() { + @Override + public void onClick( View v ) { + mNavi.stopNavi(); + } + } ); + + findViewById( R.id.demo_module_id_traffic ).setOnClickListener( new View.OnClickListener() { + + private boolean enable = true; + + @Override + public void onClick( View v ) { + mMapUIController.setTrafficEnabled( enable = !enable ); + } + } ); + + findViewById( R.id.demo_module_id_zoom_in ).setOnClickListener( new View.OnClickListener() { + + @Override + public void onClick( View v ) { + mMapUIController.changeZoom( true ); + } + } ); + + findViewById( R.id.demo_module_id_zoom_out ).setOnClickListener( new View.OnClickListener() { + + @Override + public void onClick( View v ) { + mMapUIController.changeZoom( false ); + } + } ); + + findViewById( R.id.demo_module_id_day_light ).setOnClickListener( new View.OnClickListener() { + + @Override + public void onClick( View v ) { + mMapUIController.changeMapMode( EnumMapUI.Type_Light ); + } + } ); + + findViewById( R.id.demo_module_id_day_night ).setOnClickListener( new View.OnClickListener() { + + @Override + public void onClick( View v ) { + mMapUIController.changeMapMode( EnumMapUI.Type_Night ); + } + } ); + + findViewById( R.id.demo_module_id_display_overlay ).setOnClickListener( new View.OnClickListener() { + + @Override + public void onClick( View v ) { + mMapUIController.displayOverview(); + } + } ); + + findViewById( R.id.demo_module_id_reverse_lock ).setOnClickListener( new View.OnClickListener() { + + @Override + public void onClick( View v ) { + mMapUIController.recoverLockMode(); + } + } ); + + mLocationClient.addLocationListener( new IMogoLocationListener() { + @Override + public void onLocationChanged( MogoLocation location ) { + mLocation = location; + Logger.d( TAG, "demo模块定位,定位间隔4s" ); + } + } ); + } + + @Override + public void onActivityCreated( @Nullable Bundle savedInstanceState ) { + super.onActivityCreated( savedInstanceState ); + getViewLifecycleOwner().getLifecycle().addObserver( mPresenter ); + } + + @Override + public boolean onMarkerClicked( IMogoMarker marker ) { +// if ( mLastClickedMarker != null ) { +// mLastClickedMarker.setIcon( this.mMarkerIcon ); +// } +// marker.setIcon( mClickedMarkerIcon ); +// mLastClickedMarker = marker; + +// marker.showInfoWindow(); + return true; + } + + @NonNull + @Override + protected Presenter createPresenter() { + return new Presenter( this ) { + }; + } + + @Override + public void onPerform() { + Logger.d( TAG, "卡片2有效" ); + } + + @Override + public void onDisable() { + Logger.d( TAG, "卡片2无效" ); + } + + + @Override + public void onMapLoaded() { + Logger.d( TAG, "地图加载事件" ); + } + + @Override + public void onTouch( MotionEvent motionEvent ) { +// Logger.d( TAG, "地图触摸事件" ); + } + + @Override + public void onPOIClick( MogoPoi poi ) { + if ( poi != null ) { + TipToast.shortTip( poi.getName() ); + } + mPoiSearch.searchPOIIdAsyn( poi.getPoiId() ); + } + + @Override + public void onPoiSearched( MogoPoiResult result, int errorCode ) { + + } + + private IMogoMarker mPoiMarker; + + @Override + public void onPoiItemSearched( MogoPoiItem item, int errorCode ) { + if ( item == null ) { + return; + } + if ( mPoiMarker != null ) { + mPoiMarker.destroy(); + } + mPoiMarker = mMarkerManager.addMarker( Demo2Constants.TAG, new MogoMarkerOptions() + .longitude( item.getPoint().lng ) + .latitude( item.getPoint().lat ) + .icon( mMarkerIcon ) ); + if ( mPoiMarker != null ) { + mPoiMarker.setInfoWindowAdapter( mDemoInfoWindowAdapter ); + mPoiMarker.setObject( item ); + mPoiMarker.showInfoWindow(); + } + } + + @Override + public void onLocationChanged( MogoLocation location ) { + mLocation = location; + Logger.i( TAG, "接受到的地图模块定位信息" ); + if ( mLocInfo != null ) { + if ( location.getErrCode() == 0 ) { + mLocInfo.setText( "当前位置:" + location.getAddress() ); + } else { + mLocInfo.setText( location.getErrInfo() ); + } + } + } + + @Override + public void onMapClick( MogoLatLng latLng ) { + + } + + @Override + public void onLockMap( boolean isLock ) { + + } + + @Override + public void onMapModeChanged( EnumMapUI ui ) { + Logger.d( TAG, ui.name() ); + } + + @Override + public void onDestroyView() { + Logger.w( TAG, "onDestroyView" ); + super.onDestroyView(); + getViewLifecycleOwner().getLifecycle().removeObserver( mPresenter ); + mLocationClient.removeLocationListener( this ); + if ( mLastClickedMarker != null ) { + mLastClickedMarker.destroy(); + mLastClickedMarker = null; + } + if ( mPoiSearch != null ) { + mPoiSearch.destroy(); + } + mMapService = null; + mPoiSearch = null; + mLocationClient = null; + } +} diff --git a/demo/demo-module-map2/src/main/java/com/mogo/demo/module/map2/Demo2CardViewProvider.java b/demo/demo-module-map2/src/main/java/com/mogo/demo/module/map2/Demo2CardViewProvider.java new file mode 100644 index 0000000000..d479c116dd --- /dev/null +++ b/demo/demo-module-map2/src/main/java/com/mogo/demo/module/map2/Demo2CardViewProvider.java @@ -0,0 +1,80 @@ +package com.mogo.demo.module.map2; + +import android.content.Context; +import android.os.Bundle; +import android.view.View; + +import androidx.fragment.app.Fragment; + +import com.alibaba.android.arouter.facade.annotation.Route; +import com.mogo.map.listener.IMogoMapListener; +import com.mogo.map.location.IMogoLocationListener; +import com.mogo.map.navi.IMogoNaviListener; +import com.mogo.module.common.MogoModulePaths; +import com.mogo.service.module.IMogoModuleLifecycle; +import com.mogo.service.module.IMogoModuleProvider; +import com.mogo.utils.logger.Logger; + +/** + * @author congtaowang + * @since 2019-12-24 + *
+ * 描述 + */ +@Route( path = MogoModulePaths.PATH_MODULE_DEMO2 ) +public class Demo2CardViewProvider implements IMogoModuleProvider { + + private static final String TAG = "Demo2CardViewProvider"; + + private Demo2CardViewFragment fragment; + + @Override + public Fragment createFragment( Context context, Bundle data ) { + fragment = new Demo2CardViewFragment(); + fragment.setArguments( data ); + Logger.i( TAG, "createFragment" ); + return fragment; + } + + @Override + public void init( Context context ) { + + } + + @Override + public String getModuleName() { + return Demo2Constants.TAG; + } + + @Override + public IMogoModuleLifecycle getCardLifecycle() { + return fragment; + } + + @Override + public View createView( Context context ) { + // don't + return null; + } + + @Override + public IMogoMapListener getMapListener() { + return fragment; + } + + @Override + public int getType() { + return IMogoModuleProvider.TYPE_FRAGMENT; + } + + @Override + public IMogoNaviListener getNaviListener() { + return null; + } + + @Override + public IMogoLocationListener getLocationListener() { + return fragment; + } + +} diff --git a/demo/demo-module-map2/src/main/java/com/mogo/demo/module/map2/Demo2Constants.java b/demo/demo-module-map2/src/main/java/com/mogo/demo/module/map2/Demo2Constants.java new file mode 100644 index 0000000000..1c61c1f7be --- /dev/null +++ b/demo/demo-module-map2/src/main/java/com/mogo/demo/module/map2/Demo2Constants.java @@ -0,0 +1,14 @@ +package com.mogo.demo.module.map2; + +import com.mogo.module.common.MogoModulePaths; + +/** + * @author congtaowang + * @since 2019-12-24 + *
+ * 描述 + */ +public class Demo2Constants { + + public static final String TAG = MogoModulePaths.PATH_MODULE_DEMO2; +} diff --git a/demo/demo-module-map2/src/main/java/com/mogo/demo/module/map2/Demo2InfoWindowAdapter.java b/demo/demo-module-map2/src/main/java/com/mogo/demo/module/map2/Demo2InfoWindowAdapter.java new file mode 100644 index 0000000000..e01f05746c --- /dev/null +++ b/demo/demo-module-map2/src/main/java/com/mogo/demo/module/map2/Demo2InfoWindowAdapter.java @@ -0,0 +1,131 @@ +package com.mogo.demo.module.map2; + +import android.content.Context; +import android.graphics.Bitmap; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.Button; +import android.widget.TextView; + +import com.mogo.map.marker.IMogoInfoWindowAdapter; +import com.mogo.map.marker.IMogoMarker; +import com.mogo.map.marker.MogoMarkerOptions; +import com.mogo.map.navi.IMogoNavi; +import com.mogo.map.navi.MogoNaviConfig; +import com.mogo.map.search.geo.MogoPoiItem; +import com.mogo.service.imageloader.IMogoImageLoaderListener; +import com.mogo.service.imageloader.IMogoImageloader; +import com.mogo.service.imageloader.MogoImageView; +import com.mogo.utils.WindowUtils; +import com.mogo.utils.logger.Logger; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * @author congtaowang + * @since 2019-12-24 + *
+ * 描述
+ */
+public class Demo2InfoWindowAdapter implements IMogoInfoWindowAdapter {
+
+ private static final String TAG = "DemoInfoWindowAdapter";
+
+ private Context mContext;
+ private IMogoNavi mNavi;
+ private IMogoImageloader mImageloader;
+
+ public Demo2InfoWindowAdapter( Context mContext, IMogoNavi mNavi, IMogoImageloader iMogoImageloader ) {
+ this.mContext = mContext;
+ this.mNavi = mNavi;
+ this.mImageloader = iMogoImageloader;
+ }
+
+ @Override
+ public View getInfoWindow( IMogoMarker marker ) {
+ if ( marker.getObject() instanceof MogoPoiItem ) {
+ View view = LayoutInflater.from( mContext ).inflate( R.layout.demo2_module_demo_poi_info_window, null );
+ renderPoiVew( view, marker, ( ( MogoPoiItem ) marker.getObject() ) );
+ return view;
+ } else {
+ View view = LayoutInflater.from( mContext ).inflate( R.layout.demo2_module_demo_info_window, null );
+ renderView( view, marker );
+ return view;
+ }
+
+ }
+
+ private void renderView( View view, final IMogoMarker marker ) {
+ final TextView time = view.findViewById( R.id.demo_module_id_iw_time );
+ Button refresh = view.findViewById( R.id.demo_module_id_iw_refresh );
+ time.setText( new SimpleDateFormat( "yyyyMMdd HHMMSS" ).format( new Date() ) );
+ refresh.setOnClickListener( new View.OnClickListener() {
+ @Override
+ public void onClick( View v ) {
+ marker.showInfoWindow();
+ }
+ } );
+ Button navi2 = view.findViewById( R.id.demo_module_id_iw_navito );
+ navi2.setOnClickListener( new View.OnClickListener() {
+ @Override
+ public void onClick( View v ) {
+ if ( mNavi != null ) {
+ mNavi.naviTo( marker.getPosition(), new MogoNaviConfig() );
+ }
+ }
+ } );
+ Button stopNavi = view.findViewById( R.id.demo_module_id_iw_navi_stop );
+ stopNavi.setOnClickListener( new View.OnClickListener() {
+ @Override
+ public void onClick( View v ) {
+ if ( mNavi != null ) {
+ mNavi.stopNavi();
+ }
+ }
+ } );
+ }
+
+ private void renderPoiVew( View view, final IMogoMarker marker, MogoPoiItem item ) {
+ final TextView time = view.findViewById( R.id.demo_module_id_iw_poi_title );
+ time.setText( item.getTitle() );
+ Button navi2 = view.findViewById( R.id.demo_module_id_iw_poi_navito );
+ navi2.setOnClickListener( new View.OnClickListener() {
+ @Override
+ public void onClick( View v ) {
+ if ( mNavi != null ) {
+ mNavi.naviTo( marker.getPosition(), new MogoNaviConfig() );
+ }
+ marker.hideInfoWindow();
+ marker.remove();
+ }
+ } );
+ }
+
+ public View getMarkerView( final MogoMarkerOptions options ) {
+ final View view = LayoutInflater.from( mContext ).inflate( R.layout.demo2_module_demo_bubble_marker, null );
+ final MogoImageView icon = view.findViewById( R.id.icon );
+ mImageloader.displayImage( "http://imgnews.gmw.cn/attachement/jpg/site2/20191229/00d86176ed0b1f71f4580f.jpg", icon, WindowUtils.dip2px( mContext, 50 ), WindowUtils.dip2px( mContext, 50 ),
+ new IMogoImageLoaderListener() {
+ @Override
+ public void onStart() {
+
+ }
+
+ @Override
+ public void onCompleted( Bitmap bitmap ) {
+ // 刷新图标
+ Logger.d( TAG, "loaded." );
+ options.icon( view );
+ options.notifyObservers();
+ }
+
+ @Override
+ public void onFailure( Exception e ) {
+
+ }
+ } );
+ return view;
+ }
+}
+
diff --git a/demo/demo-module-map2/src/main/res/layout/demo2_module_card_view.xml b/demo/demo-module-map2/src/main/res/layout/demo2_module_card_view.xml
new file mode 100644
index 0000000000..31f325ab23
--- /dev/null
+++ b/demo/demo-module-map2/src/main/res/layout/demo2_module_card_view.xml
@@ -0,0 +1,159 @@
+
+
+
- * 各个莫快递调试信息控制接口
+ * 各个模块递调试信息控制接口
*/
public class DebugConfig {
private static boolean sDebug = true;
+ /**
+ * 是否为调试模式
+ *
+ * @return true - 调试模式 false - 非调试模式
+ */
public static boolean isDebug() {
return sDebug;
}
+ /**
+ * 设置调试模式
+ *
+ * @param sDebug true - 调试模式 false - 非调试模式
+ */
public static void setDebug( boolean sDebug ) {
DebugConfig.sDebug = sDebug;
}
diff --git a/foudations/mogo-commons/src/main/java/com/mogo/commons/mvp/IView.java b/foudations/mogo-commons/src/main/java/com/mogo/commons/mvp/IView.java
index 0947bedd03..f536b95f88 100644
--- a/foudations/mogo-commons/src/main/java/com/mogo/commons/mvp/IView.java
+++ b/foudations/mogo-commons/src/main/java/com/mogo/commons/mvp/IView.java
@@ -10,5 +10,10 @@ import android.content.Context;
*/
public interface IView {
+ /**
+ * 获取上下文
+ *
+ * @return
+ */
Context getContext();
}
diff --git a/foudations/mogo-commons/src/main/java/com/mogo/commons/mvp/MvpActivity.java b/foudations/mogo-commons/src/main/java/com/mogo/commons/mvp/MvpActivity.java
index 8dfe19d974..e2a4538d34 100644
--- a/foudations/mogo-commons/src/main/java/com/mogo/commons/mvp/MvpActivity.java
+++ b/foudations/mogo-commons/src/main/java/com/mogo/commons/mvp/MvpActivity.java
@@ -30,7 +30,7 @@ public abstract class MvpActivity< V extends IView, P extends Presenter< V > >
/**
* 布局资源
*
- * @return
+ * @return 布局资源 id
*/
protected abstract int getLayoutId();
diff --git a/foudations/mogo-commons/src/main/java/com/mogo/commons/mvp/Presenter.java b/foudations/mogo-commons/src/main/java/com/mogo/commons/mvp/Presenter.java
index a39b549037..a4942158e5 100644
--- a/foudations/mogo-commons/src/main/java/com/mogo/commons/mvp/Presenter.java
+++ b/foudations/mogo-commons/src/main/java/com/mogo/commons/mvp/Presenter.java
@@ -1,6 +1,14 @@
package com.mogo.commons.mvp;
+import android.app.Activity;
+import android.app.Dialog;
+import android.content.Context;
+import android.os.Build;
+import android.view.View;
+import android.widget.PopupWindow;
+
import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.LifecycleOwner;
@@ -14,7 +22,8 @@ import androidx.lifecycle.OnLifecycleEvent;
*/
public abstract class Presenter< V extends IView > implements LifecycleObserver {
- private V mView;
+ protected V mView;
+ private Context mContext;
public Presenter( V view ) {
this.mView = view;
@@ -49,4 +58,35 @@ public abstract class Presenter< V extends IView > implements LifecycleObserver
@NonNull LifecycleOwner owner,
@NonNull Lifecycle.Event event ) {
}
+
+ protected Context getContext() {
+ if ( mContext != null ) {
+ return mContext;
+ }
+ if ( mView instanceof Activity ) {
+ mContext = ( ( Activity ) mView );
+ }
+ if ( mView instanceof Fragment ) {
+ mContext = ( ( Fragment ) mView ).getContext();
+ }
+ if ( mView instanceof android.app.Fragment ) {
+ if ( Build.VERSION.SDK_INT >= Build.VERSION_CODES.M ) {
+ mContext = ( ( android.app.Fragment ) mView ).getContext();
+ } else {
+ mContext = ( ( android.app.Fragment ) mView ).getActivity();
+ }
+ }
+ if ( mView instanceof Dialog ) {
+ mContext = ( ( Dialog ) mView ).getContext();
+ }
+ if ( mView instanceof PopupWindow ) {
+ if ( ( ( PopupWindow ) mView ).getContentView() != null ) {
+ mContext = ( ( PopupWindow ) mView ).getContentView().getContext();
+ }
+ }
+ if ( mView instanceof View ) {
+ mContext = ( ( View ) mView ).getContext();
+ }
+ return mContext;
+ }
}
diff --git a/foudations/mogo-utils/build.gradle b/foudations/mogo-utils/build.gradle
index 11eb8bcdca..d4d19b5d03 100644
--- a/foudations/mogo-utils/build.gradle
+++ b/foudations/mogo-utils/build.gradle
@@ -1,15 +1,13 @@
apply plugin: 'com.android.library'
android {
- compileSdkVersion 29
- buildToolsVersion "29.0.2"
-
-
+ compileSdkVersion rootProject.ext.android.compileSdkVersion
+ buildToolsVersion rootProject.ext.android.buildToolsVersion
defaultConfig {
- minSdkVersion 19
- targetSdkVersion 29
- versionCode 1
- versionName "1.0"
+ minSdkVersion rootProject.ext.android.minSdkVersion
+ targetSdkVersion rootProject.ext.android.targetSdkVersion
+ versionCode Integer.valueOf(VERSION_CODE)
+ versionName getValueFromRootProperties("${project.name.replace("-", "_").toUpperCase()}_VERSION")
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles 'consumer-rules.pro'
@@ -37,4 +35,11 @@ dependencies {
api rootProject.ext.dependencies.retrofitconvertergson
api rootProject.ext.dependencies.retrofitconverterscalars
implementation rootProject.ext.dependencies.androidxappcompat
+ if (Boolean.valueOf(RELEASE)) {
+
+ } else {
+
+ }
}
+
+apply from: new File(rootProject.rootDir, "gradle/upload.gradle").toString()
diff --git a/foudations/mogo-utils/gradle.properties b/foudations/mogo-utils/gradle.properties
new file mode 100644
index 0000000000..914f308c6e
--- /dev/null
+++ b/foudations/mogo-utils/gradle.properties
@@ -0,0 +1,3 @@
+GROUP=com.mogo.commons
+POM_ARTIFACT_ID=mogo-utils
+VERSION_CODE=1
diff --git a/gradle.properties b/gradle.properties
index 199d16ede3..a327dda72f 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -17,4 +17,24 @@ org.gradle.jvmargs=-Xmx1536m
android.useAndroidX=true
# Automatically convert third-party libraries to use AndroidX
android.enableJetifier=true
+RELEASE_REPOSITORY_URL=http://nexus.zhidaoauto.com/repository/maven-releases/
+SNAPSHOT_REPOSITORY_URL=http://nexus.zhidaoauto.com/repository/maven-snapshots/
+USERNAME=xintai
+PASSWORD=xintai2018
+# 编译模式: false - 依赖本地版本, true - 依赖 maven 版本
+RELEASE=false
+# 模块版本
+DEMO_MODULE_MAP_VERSION=1.0.0-SNAPSHOT
+DEMO_MODULE_MAP2_VERSION=1.0.0-SNAPSHOT
+MOGO_COMMONS_VERSION=1.0.0-SNAPSHOT
+MOGO_UTILS_VERSION=1.0.0-SNAPSHOT
+MAP_AMAP_VERSION=1.0.0-SNAPSHOT
+MOGO_MAP_VERSION=1.0.0-SNAPSHOT
+MOGO_MAP_API_VERSION=1.0.0-SNAPSHOT
+MOGO_MODULE_COMMON_VERSION=1.0.0-SNAPSHOT
+MOGO_MODULE_MAIN_VERSION=1.0.0-SNAPSHOT
+MOGO_MODULE_MAP_VERSION=1.0.0-SNAPSHOT
+MOGO_SERVICE_VERSION=1.0.0-SNAPSHOT
+MOGO_SERVICE_API_VERSION=1.0.0-SNAPSHOT
+MOGO_MODULE_APPS_VERSION=1.0.0-SNAPSHOT
diff --git a/gradle/upload.gradle b/gradle/upload.gradle
new file mode 100644
index 0000000000..a7ffd9f026
--- /dev/null
+++ b/gradle/upload.gradle
@@ -0,0 +1,68 @@
+apply plugin: 'maven'
+apply plugin: 'maven-publish'
+
+task loggerSourcesJar(type: Jar) {
+ classifier = 'sources'
+ if (plugins.hasPlugin("java-library")) {
+ from sourceSets.main.java.srcDirs
+ } else if (plugins.hasPlugin("com.android.library")) {
+ from android.sourceSets.main.java.sourceFiles
+ } else if (plugins.hasPlugin('groovy')) {
+ from sourceSets.main.groovy.srcDirs
+ }
+}
+
+artifacts {
+ archives loggerSourcesJar
+}
+
+task loggerUpload(dependsOn: [uploadArchives, loggerSourcesJar]) {
+}
+
+uploadArchives {
+ repositories {
+ mavenDeployer {
+
+ println project.name
+
+ String versionNameKey = "${project.name.replace("-", "_").toUpperCase()}_VERSION"
+ String versionName = getVersionNameValue(versionNameKey)
+ println versionName
+
+ if (versionName == null || versionName.equals("")) {
+ project.logger.error("undefined versionName in root gradle.properties by ${versionNameKey}")
+ }
+
+ pom.project {
+ packaging = 'aar'
+ groupId = GROUP
+ artifactId = POM_ARTIFACT_ID
+ version = versionName
+ }
+
+ repository(url: rootProject.RELEASE_REPOSITORY_URL) {
+ authentication(userName: rootProject.USERNAME, password: rootProject.PASSWORD)
+ }
+
+ snapshotRepository(url: rootProject.SNAPSHOT_REPOSITORY_URL) {
+ authentication(userName: rootProject.USERNAME, password: rootProject.PASSWORD)
+ }
+ }
+ }
+}
+
+def getVersionNameValue(String key) {
+ File file = rootProject.file('gradle.properties')
+ String value = "";
+ if (file.exists()) {
+ //加载资源
+ InputStream inputStream = file.newDataInputStream();
+ Properties properties = new Properties()
+ properties.load(inputStream)
+
+ if (properties.containsKey(key)) {
+ value = properties.getProperty(key)
+ }
+ }
+ return value
+}
diff --git a/javadoc.gradle b/javadoc.gradle
new file mode 100644
index 0000000000..839fea4005
--- /dev/null
+++ b/javadoc.gradle
@@ -0,0 +1,25 @@
+afterEvaluate {
+ rootProject.subprojects { project ->
+ println project.name
+ project.task("generateApiDoc", {
+ group "javadoc"
+ def rootProjectPath = rootProject.buildDir.absolutePath
+ def projectPath = new File("").absolutePath
+ def apiPackageFile = new File(projectPath, "apipackage.txt")
+ def sourcePath = new File(projectPath, "src/main/java")
+ def outputDocPath = new File(rootProjectPath, "javadoc/${project.name}")
+ doFirst {
+ println "javadoc -sourcepath ${sourcePath} -d ${outputDocPath} @${apiPackageFile}"
+ if (!apiPackageFile.exists()) {
+ throw new Exception("不是api模块")
+ }
+ }
+ doLast {
+ exec {
+ commandLine "javadoc", "-sourcepath", sourcePath, "-d", outputDocPath, "-encoding", "UTF-8", "@${apiPackageFile}"
+ }
+ }
+ })
+ }
+}
+
diff --git a/libraries/map-amap/build.gradle b/libraries/map-amap/build.gradle
index 8435a429af..ae38f90032 100644
--- a/libraries/map-amap/build.gradle
+++ b/libraries/map-amap/build.gradle
@@ -1,15 +1,13 @@
apply plugin: 'com.android.library'
android {
- compileSdkVersion 29
- buildToolsVersion "29.0.2"
-
-
+ compileSdkVersion rootProject.ext.android.compileSdkVersion
+ buildToolsVersion rootProject.ext.android.buildToolsVersion
defaultConfig {
- minSdkVersion 19
- targetSdkVersion 29
- versionCode 1
- versionName "1.0"
+ minSdkVersion rootProject.ext.android.minSdkVersion
+ targetSdkVersion rootProject.ext.android.targetSdkVersion
+ versionCode Integer.valueOf(VERSION_CODE)
+ versionName getValueFromRootProperties("${project.name.replace("-", "_").toUpperCase()}_VERSION")
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles 'consumer-rules.pro'
@@ -32,6 +30,13 @@ dependencies {
implementation rootProject.ext.dependencies.amapsearch
implementation rootProject.ext.dependencies.amaplocation
- implementation project(':foudations:mogo-utils')
- implementation project(':libraries:mogo-map-api')
+ if (Boolean.valueOf(RELEASE)) {
+ implementation rootProject.ext.dependencies.mogoutils
+ implementation rootProject.ext.dependencies.mogomapapi
+ } else {
+ implementation project(':foudations:mogo-utils')
+ implementation project(':libraries:mogo-map-api')
+ }
}
+
+apply from: new File(rootProject.rootDir, "gradle/upload.gradle").toString()
diff --git a/libraries/map-amap/gradle.properties b/libraries/map-amap/gradle.properties
new file mode 100644
index 0000000000..bc8dabb558
--- /dev/null
+++ b/libraries/map-amap/gradle.properties
@@ -0,0 +1,3 @@
+GROUP=com.mogo.map
+POM_ARTIFACT_ID=map-amap
+VERSION_CODE=1
\ No newline at end of file
diff --git a/libraries/map-amap/src/main/AndroidManifest.xml b/libraries/map-amap/src/main/AndroidManifest.xml
index f141757b37..eee3849ff2 100644
--- a/libraries/map-amap/src/main/AndroidManifest.xml
+++ b/libraries/map-amap/src/main/AndroidManifest.xml
@@ -6,5 +6,7 @@
* 高德marker */ -public class AMapMarkerWrapper implements IMogoMarker { +public class AMapMarkerWrapper implements IMogoMarker, Observer { private Marker mMarker; private Object mObject; @@ -31,16 +35,33 @@ public class AMapMarkerWrapper implements IMogoMarker { private boolean mIsDestroy = false; - public AMapMarkerWrapper( Marker marker ) { + private MogoMarkerOptions mMogoMarkerOptions; + private String mOwner; + + public AMapMarkerWrapper( Marker marker, MogoMarkerOptions mogoMarkerOptions ) { this.mMarker = marker; if ( marker != null ) { // 设置高德 marker 的object对象为 IMogoMarker 实例。!!!! marker.setObject( this ); } + this.mMogoMarkerOptions = mogoMarkerOptions; + mMogoMarkerOptions.addObserver( this ); + } + + @Override + public void update( Observable o, Object arg ) { + if ( isDestroyed() ) { + return; + } + setMarkerOptions( mMogoMarkerOptions ); } @Override public void destroy() { + if ( mMogoMarkerOptions != null ) { + mMogoMarkerOptions.deleteObservers(); + mMogoMarkerOptions = null; + } if ( mMarker != null ) { mMarker.destroy(); mMarker.setObject( null ); @@ -236,8 +257,28 @@ public class AMapMarkerWrapper implements IMogoMarker { return mMogoInfoWindowAdapter; } + @Override + public void setMarkerIconView( IMogoMarkerIconViewCreator creator ) { + if ( creator != null ) { + View iconView = creator.createView( this ); + if ( iconView != null ) { + mMarker.setIcon( BitmapDescriptorFactory.fromView( iconView ) ); + } + } + } + @Override public boolean isDestroyed() { return mIsDestroy; } + + @Override + public void setOwner( String mOwner ) { + this.mOwner = mOwner; + } + + @Override + public String getOwner() { + return this.mOwner == null ? mMogoMarkerOptions.getOwner() : mOwner; + } } diff --git a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/message/AMapMessageConsts.java b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/message/AMapMessageConsts.java new file mode 100644 index 0000000000..fc2c3c7a5a --- /dev/null +++ b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/message/AMapMessageConsts.java @@ -0,0 +1,26 @@ +package com.mogo.map.impl.amap.message; + +import android.os.Handler; +import android.os.Looper; +import android.os.Message; + +import androidx.annotation.NonNull; + +/** + * @author congtaowang + * @since 2019-12-28 + *
+ * 描述 + */ +public class AMapMessageConsts { + + /** + * 导航开始 + */ + public static final int MSG_NAVI_START = 1000; + /** + * 取消导航 + */ + public static final int MSG_NAVI_STOP = 1001; + +} diff --git a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/message/AMapMessageListener.java b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/message/AMapMessageListener.java new file mode 100644 index 0000000000..cac4fa5a8a --- /dev/null +++ b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/message/AMapMessageListener.java @@ -0,0 +1,18 @@ +package com.mogo.map.impl.amap.message; + +import com.amap.api.navi.model.NaviInfo; + +/** + * @author congtaowang + * @since 2019-12-28 + *
+ * 消息回调 + */ +public interface AMapMessageListener { + + void onNaviStarted(); + + void onNaviStopped(); + + void onNaviInfoUpdat( NaviInfo naviInfo ); +} diff --git a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/message/AMapMessageManager.java b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/message/AMapMessageManager.java new file mode 100644 index 0000000000..1083f5a520 --- /dev/null +++ b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/message/AMapMessageManager.java @@ -0,0 +1,118 @@ +package com.mogo.map.impl.amap.message; + +import android.os.Handler; +import android.os.Looper; +import android.os.Message; + +import androidx.annotation.NonNull; + +import com.amap.api.navi.model.NaviInfo; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author congtaowang + * @since 2019-12-28 + *
+ * 描述 + */ +public class AMapMessageManager { + + private static volatile AMapMessageManager sInstance; + + private List< AMapMessageListener > mListeners = new ArrayList<>(); + + private AMapMessageManager() { + } + + public static AMapMessageManager getInstance() { + if ( sInstance == null ) { + synchronized ( AMapMessageManager.class ) { + if ( sInstance == null ) { + sInstance = new AMapMessageManager(); + } + } + } + return sInstance; + } + + public synchronized void release() { + sInstance = null; + } + + public synchronized void registerAMapMessageListener( AMapMessageListener listener ) { + if ( !mListeners.contains( listener ) ) { + mListeners.add( listener ); + } + } + + public synchronized void unregisterAMapMessageListener( AMapMessageListener listener ) { + mListeners.remove( listener ); + } + + private Handler mHandler = new Handler( Looper.getMainLooper() ) { + @Override + public void handleMessage( @NonNull Message msg ) { + super.handleMessage( msg ); + AMapMessageManager.this.handleMessage( msg ); + } + }; + + public void sendMessage( Message msg ) { + if ( msg != null ) { + mHandler.sendMessage( msg ); + } + } + + public void sendMessage( int what ) { + sendMessage( what, null ); + } + + public void sendMessage( int what, Object obj ) { + Message msg = Message.obtain(); + msg.what = what; + msg.obj = obj; + sendMessage( msg ); + } + + public void postNaviStarted() { + sendMessage( AMapMessageConsts.MSG_NAVI_START ); + } + + public void postNaviStopped() { + sendMessage( AMapMessageConsts.MSG_NAVI_STOP ); + } + + private synchronized void handleMessage( Message msg ) { + if ( msg == null ) { + return; + } + switch ( msg.what ) { + case AMapMessageConsts.MSG_NAVI_START: + handleNaviStartedMsg(); + break; + case AMapMessageConsts.MSG_NAVI_STOP: + handleNaviStoppedMsg(); + break; + } + } + + private void handleNaviStartedMsg() { + if ( mListeners == null ) { + return; + } + for ( AMapMessageListener listener : mListeners ) { + listener.onNaviStarted(); + } + } + + private void handleNaviStoppedMsg() { + if ( mListeners == null ) { + return; + } + for ( AMapMessageListener listener : mListeners ) { + listener.onNaviStopped(); + } + } +} 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 5a42d8dc32..ffeec9b2b6 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 @@ -6,8 +6,11 @@ import com.amap.api.maps.model.Polyline; import com.amap.api.navi.AMapNavi; import com.amap.api.navi.enums.NaviType; import com.amap.api.navi.model.AMapCalcRouteResult; +import com.amap.api.navi.model.AMapNaviInfo; +import com.amap.api.navi.model.AMapNaviLocation; import com.amap.api.navi.model.NaviInfo; import com.mogo.map.impl.amap.AMapWrapper; +import com.mogo.map.impl.amap.message.AMapMessageManager; import com.mogo.map.impl.amap.utils.ObjectUtils; import com.mogo.map.navi.MogoNaviListenerHandler; import com.mogo.utils.logger.Logger; @@ -85,6 +88,7 @@ public class NaviListenerAdapter extends AMapNaviListenerAdapter { mAMapNavi.startSpeak(); } MogoNaviListenerHandler.getInstance().onStartNavi(); + AMapMessageManager.getInstance().postNaviStarted(); } @Override @@ -92,6 +96,7 @@ public class NaviListenerAdapter extends AMapNaviListenerAdapter { setNaviing( false ); setStopped( true ); MogoNaviListenerHandler.getInstance().onStopNavi(); + AMapMessageManager.getInstance().postNaviStopped(); } @Override @@ -99,11 +104,13 @@ public class NaviListenerAdapter extends AMapNaviListenerAdapter { setNaviing( false ); setStopped( true ); MogoNaviListenerHandler.getInstance().onStopNavi(); + AMapMessageManager.getInstance().postNaviStopped(); } @Override public void onNaviInfoUpdate( NaviInfo naviInfo ) { MogoNaviListenerHandler.getInstance().onNaviInfoUpdate( ObjectUtils.fromAMap( naviInfo ) ); + mNaviOverlayHelper.handleNaviInfoUpdate( naviInfo ); } @Override @@ -121,17 +128,24 @@ public class NaviListenerAdapter extends AMapNaviListenerAdapter { mNaviOverlayHelper.showCalculatedPaths(); } + @Override + public void onLocationChange( AMapNaviLocation aMapNaviLocation ) { + super.onLocationChange( aMapNaviLocation ); + mNaviOverlayHelper.handlePassedLocation( aMapNaviLocation ); + } + public void stopNavi() { setStopped( true ); setNaviing( false ); mAMapNavi.stopNavi(); MogoNaviListenerHandler.getInstance().onStopNavi(); + AMapMessageManager.getInstance().postNaviStopped(); mNaviOverlayHelper.clearCalculatedOverlay(); } public void handleClickedPolyline( Polyline polyline ) { if ( mNaviOverlayHelper != null ) { - mNaviOverlayHelper.handleClickedPolyline( polyline ); + mNaviOverlayHelper.handleClickedPolyline( polyline, isNaviing() ); if ( isNaviing() ) { mAMapNavi.stopNavi(); mAMapNavi.selectRouteId( mNaviOverlayHelper.getSelectedPathId() ); diff --git a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/NaviOverlayHelper.java b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/NaviOverlayHelper.java index c80928fc49..eeace7d2d1 100644 --- a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/NaviOverlayHelper.java +++ b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/NaviOverlayHelper.java @@ -9,7 +9,9 @@ import com.amap.api.maps.CameraUpdateFactory; import com.amap.api.maps.model.LatLngBounds; import com.amap.api.maps.model.Polyline; import com.amap.api.navi.AMapNavi; +import com.amap.api.navi.model.AMapNaviLocation; import com.amap.api.navi.model.AMapNaviPath; +import com.amap.api.navi.model.NaviInfo; import com.mogo.map.impl.amap.R; import com.mogo.map.impl.amap.overlay.RouteOverLayWrapper; import com.mogo.utils.WindowUtils; @@ -50,6 +52,7 @@ public class NaviOverlayHelper { private List< CalculatePathItem > mCalculatePathItems; private int mSelectedPathId; + private CalculatePathItem mSelectedCalculatePathItem; public NaviOverlayHelper( AMapNavi mAMapNavi, AMap mAMap, Context mContext ) { this.mAMapNavi = mAMapNavi; @@ -138,7 +141,9 @@ public class NaviOverlayHelper { wrapper.setTrafficLightsVisible( false ); // 默认选中第一个 if ( i == 0 ) { - wrapper.setStartBitmap( R.drawable.ic_amap_navi_cursor ).setEndBitmap( R.drawable.ic_search_choice_point ); + mSelectedPathId = item.getId(); + mSelectedCalculatePathItem = item; + wrapper.setStartBitmap( R.drawable.ic_search_poi_location ).setEndBitmap( R.drawable.ic_search_choice_point ); mAMapNavi.selectRouteId( item.getId() ); } wrapper.addToMap(); @@ -167,16 +172,17 @@ public class NaviOverlayHelper { * @param polyline 选中的线 * @return */ - public boolean handleClickedPolyline( Polyline polyline ) { + public boolean handleClickedPolyline( Polyline polyline, boolean isNaviing ) { if ( polyline == null ) { return false; } + Logger.i( TAG, "polyline id = " + polyline.getId() ); - CalculatePathItem calculatePathItem = isCalculatePolyline( polyline ); - if ( calculatePathItem == null ) { + mSelectedCalculatePathItem = isCalculatePolyline( polyline ); + if ( mSelectedCalculatePathItem == null ) { return false; } - mSelectedPathId = calculatePathItem.getId(); + mSelectedPathId = mSelectedCalculatePathItem.getId(); if ( mCalculatePathItems != null ) { for ( CalculatePathItem item : mCalculatePathItems ) { final RouteOverLayWrapper wrapper = item.getOverLazWrapper( false ); @@ -184,7 +190,7 @@ public class NaviOverlayHelper { continue; } wrapper.setTransparency( - item == calculatePathItem + item == mSelectedCalculatePathItem ? AMAP_ROUTE_OVERLAY_TRANSPARENCY_SELECTED : AMAP_ROUTE_OVERLAY_TRANSPARENCY_UNSELECTED ); @@ -220,4 +226,27 @@ public class NaviOverlayHelper { public int getSelectedPathId() { return mSelectedPathId; } + + /** + * 车辆拐弯时绘制转向箭头 + * + * @param naviInfo + */ + public void handleNaviInfoUpdate( NaviInfo naviInfo ) { + if ( mSelectedCalculatePathItem != null ) { + RouteOverLayWrapper wrapper = mSelectedCalculatePathItem.getOverLazWrapper( false ); + if ( wrapper != null ) { + wrapper.drawArrow( naviInfo ); + } + } + } + + public void handlePassedLocation( AMapNaviLocation location ) { + if ( mSelectedCalculatePathItem != null ) { + RouteOverLayWrapper wrapper = mSelectedCalculatePathItem.getOverLazWrapper( false ); + if ( wrapper != null ) { + wrapper.updatePolyline( location ); + } + } + } } diff --git a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/uicontroller/AMapUIController.java b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/uicontroller/AMapUIController.java index 4632e15bc0..c6ab59eb1c 100644 --- a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/uicontroller/AMapUIController.java +++ b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/uicontroller/AMapUIController.java @@ -1,5 +1,6 @@ package com.mogo.map.impl.amap.uicontroller; +import com.mogo.map.MogoLatLng; import com.mogo.map.MogoMap; import com.mogo.map.uicontroller.EnumMapUI; import com.mogo.map.uicontroller.IMogoMapUIController; @@ -56,6 +57,13 @@ public class AMapUIController implements IMogoMapUIController { } } + @Override + public void changeZoom( float zoom ) { + if ( mClient != null ) { + mClient.changeZoom( zoom ); + } + } + @Override public void changeMapMode( EnumMapUI mode ) { if ( mClient != null ) { @@ -64,9 +72,9 @@ public class AMapUIController implements IMogoMapUIController { } @Override - public void moveToCurrentLocation() { + public void moveToCenter( MogoLatLng latLng ) { if ( mClient != null ) { - mClient.moveToCurrentLocation(); + mClient.moveToCenter(latLng); } } @@ -90,4 +98,12 @@ public class AMapUIController implements IMogoMapUIController { mClient.displayOverview(); } } + + @Override + public float getScalePerPixel() { + if ( mClient != null ) { + return mClient.getScalePerPixel(); + } + return 0; + } } 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 74bdf52b23..943899af3e 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 @@ -1,6 +1,7 @@ package com.mogo.map.impl.amap.utils; import android.graphics.Bitmap; +import android.view.View; import com.amap.api.location.AMapLocation; import com.amap.api.maps.model.BitmapDescriptor; @@ -33,6 +34,7 @@ import com.amap.api.services.poisearch.SubPoiItem; import com.amap.api.services.road.Crossroad; import com.mogo.map.MogoLatLng; import com.mogo.map.location.MogoLocation; +import com.mogo.map.marker.IMogoMarkerIconViewCreator; import com.mogo.map.marker.MogoMarkerOptions; import com.mogo.map.model.MogoPoi; import com.mogo.map.navi.MogoNaviInfo; @@ -81,15 +83,19 @@ public class ObjectUtils { if ( icon == null || icon.isRecycled() ) { continue; } + descriptors.add( BitmapDescriptorFactory.fromBitmap( icon ) ); } } + BitmapDescriptor descriptor = getBitmapDescriptorFromMogo( opt ); + return new MarkerOptions() .position( new LatLng( opt.getLatitude(), opt.getLongitude() ) ) .title( opt.getTitle() ) .snippet( opt.getSnippet() ) - .icon( BitmapDescriptorFactory.fromBitmap( opt.getIcon() ) ) + .icon( descriptor ) + .anchor( opt.getU(), opt.getV() ) .icons( descriptors ) .period( opt.getPeriod() ) .rotateAngle( opt.getRotate() ) @@ -104,6 +110,21 @@ public class ObjectUtils { .zIndex( opt.getzIndex() ); } + private static BitmapDescriptor getBitmapDescriptorFromMogo( MogoMarkerOptions options ) { + if ( options == null ) { + return null; + } + Bitmap icon = options.getIcon(); + if ( icon != null ) { + return BitmapDescriptorFactory.fromBitmap( icon ); + } + View view = options.getIconView(); + if ( view != null ) { + return BitmapDescriptorFactory.fromView( view ); + } + return null; + } + public static MogoLocation fromAMap( AMapLocation aLocation ) { if ( aLocation == null ) { diff --git a/libraries/map-baidu/build.gradle b/libraries/map-baidu/build.gradle index e2cd749112..132d753ede 100644 --- a/libraries/map-baidu/build.gradle +++ b/libraries/map-baidu/build.gradle @@ -1,15 +1,13 @@ apply plugin: 'com.android.library' android { - compileSdkVersion 29 - buildToolsVersion "29.0.2" - - + compileSdkVersion rootProject.ext.android.compileSdkVersion + buildToolsVersion rootProject.ext.android.buildToolsVersion defaultConfig { - minSdkVersion 19 - targetSdkVersion 29 - versionCode 1 - versionName "1.0" + minSdkVersion rootProject.ext.android.minSdkVersion + targetSdkVersion rootProject.ext.android.targetSdkVersion + versionCode Integer.valueOf(VERSION_CODE) + versionName getValueFromRootProperties("${project.name.replace("-", "_").toUpperCase()}_VERSION") testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles 'consumer-rules.pro' @@ -56,3 +54,5 @@ dependencies { transitive = true } } + +apply from: new File(rootProject.rootDir, "gradle/upload.gradle").toString() diff --git a/libraries/map-baidu/gradle.properties b/libraries/map-baidu/gradle.properties new file mode 100644 index 0000000000..f118c1b688 --- /dev/null +++ b/libraries/map-baidu/gradle.properties @@ -0,0 +1,3 @@ +GROUP=com.mogo.map +POM_ARTIFACT_ID=map-baidu +VERSION_CODE=1 diff --git a/libraries/mogo-map-api/apipackage.txt b/libraries/mogo-map-api/apipackage.txt new file mode 100644 index 0000000000..fb450f44da --- /dev/null +++ b/libraries/mogo-map-api/apipackage.txt @@ -0,0 +1,15 @@ +com.mogo.map.uicontroller +com.mogo.map.search.poisearch +com.mogo.map.search.poisearch.query +com.mogo.map.search.inputtips +com.mogo.map.search.inputtips.query +com.mogo.map.search.geo.query +com.mogo.map.search.geo +com.mogo.map.search +com.mogo.map.navi +com.mogo.map.marker +com.mogo.map.model +com.mogo.map.location +com.mogo.map.listener +com.mogo.map.exception +com.mogo.map \ No newline at end of file diff --git a/libraries/mogo-map-api/build.gradle b/libraries/mogo-map-api/build.gradle index 4db0f72f17..5c38883e28 100644 --- a/libraries/mogo-map-api/build.gradle +++ b/libraries/mogo-map-api/build.gradle @@ -1,15 +1,13 @@ apply plugin: 'com.android.library' android { - compileSdkVersion 29 - buildToolsVersion "29.0.2" - - + compileSdkVersion rootProject.ext.android.compileSdkVersion + buildToolsVersion rootProject.ext.android.buildToolsVersion defaultConfig { - minSdkVersion 19 - targetSdkVersion 29 - versionCode 1 - versionName "1.0" + minSdkVersion rootProject.ext.android.minSdkVersion + targetSdkVersion rootProject.ext.android.targetSdkVersion + versionCode Integer.valueOf(VERSION_CODE) + versionName getValueFromRootProperties("${project.name.replace("-", "_").toUpperCase()}_VERSION") testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles 'consumer-rules.pro' @@ -28,5 +26,11 @@ dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation rootProject.ext.dependencies.androidxappcompat - implementation project(':foudations:mogo-utils') + if (Boolean.valueOf(RELEASE)) { + implementation rootProject.ext.dependencies.mogoutils + } else { + implementation project(':foudations:mogo-utils') + } } + +apply from: new File(rootProject.rootDir, "gradle/upload.gradle").toString() diff --git a/libraries/mogo-map-api/gradle.properties b/libraries/mogo-map-api/gradle.properties new file mode 100644 index 0000000000..5d79dcb2d0 --- /dev/null +++ b/libraries/mogo-map-api/gradle.properties @@ -0,0 +1,3 @@ +GROUP=com.mogo.map +POM_ARTIFACT_ID=mogo-map-api +VERSION_CODE=1 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 76e105dd11..224c3db20c 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 @@ -106,4 +106,13 @@ public interface IMogoMap { * 停止当前执行的改变地图状态的动画。 */ void stopAnimation(); + + /** + * 获取比例尺 + * + * @return 当前缩放级别下,地图上1像素点对应的长度,单位米 + */ + float getScalePerPixel(); + + void changeZoom(float zoom); } diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/listener/IMogoHosListenerRegister.java b/libraries/mogo-map-api/src/main/java/com/mogo/map/listener/IMogoHosListenerRegister.java new file mode 100644 index 0000000000..9c1717affb --- /dev/null +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/listener/IMogoHosListenerRegister.java @@ -0,0 +1,16 @@ +package com.mogo.map.listener; + +import com.mogo.map.marker.IMogoMarkerClickListener; +import com.mogo.map.marker.IMogoMarkerClickListenerRegister; +import com.mogo.map.navi.IMogoNaviListenerRegister; + +/** + * @author congtaowang + * @since 2019-12-29 + *
+ * 主模块需要注册监听的事件 + */ +public interface IMogoHosListenerRegister extends IMogoNaviListenerRegister, + IMogoMapListenerRegister, + IMogoMarkerClickListenerRegister { +} diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/listener/IMogoMapListenerRegister.java b/libraries/mogo-map-api/src/main/java/com/mogo/map/listener/IMogoMapListenerRegister.java index eddec6c6d4..f5c4fbca6b 100644 --- a/libraries/mogo-map-api/src/main/java/com/mogo/map/listener/IMogoMapListenerRegister.java +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/listener/IMogoMapListenerRegister.java @@ -1,7 +1,5 @@ package com.mogo.map.listener; -import com.mogo.map.exception.MogoMapException; - /** * @author congtaowang * @since 2019-12-23 diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/listener/MogoHosListenerRegister.java b/libraries/mogo-map-api/src/main/java/com/mogo/map/listener/MogoHosListenerRegister.java new file mode 100644 index 0000000000..e7202971b3 --- /dev/null +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/listener/MogoHosListenerRegister.java @@ -0,0 +1,66 @@ +package com.mogo.map.listener; + +import com.mogo.map.marker.IMogoMarkerClickListener; +import com.mogo.map.marker.MogoMarkersHandler; +import com.mogo.map.navi.IMogoNaviListener; +import com.mogo.map.navi.MogoNaviListenerHandler; + +/** + * @author congtaowang + * @since 2019-12-29 + *
+ * 描述 + */ +public class MogoHosListenerRegister implements IMogoHosListenerRegister { + + private static volatile MogoHosListenerRegister sInstance; + + private MogoHosListenerRegister() { + } + + public static MogoHosListenerRegister getInstance() { + if ( sInstance == null ) { + synchronized ( MogoHosListenerRegister.class ) { + if ( sInstance == null ) { + sInstance = new MogoHosListenerRegister(); + } + } + } + return sInstance; + } + + public synchronized void release() { + sInstance = null; + } + + + @Override + public void registerHostMapListener( IMogoMapListener listener ) { + MogoMapListenerHandler.getInstance().registerHostMapListener( listener ); + } + + @Override + public void unregisterHostMapListener() { + MogoMapListenerHandler.getInstance().unregisterHostMapListener(); + } + + @Override + public void registerHostNaviListener( IMogoNaviListener listener ) { + MogoNaviListenerHandler.getInstance().registerHostNaviListener( listener ); + } + + @Override + public void unregisterHostNaviListener() { + MogoNaviListenerHandler.getInstance().unregisterHostNaviListener(); + } + + @Override + public void registerMarkerClickListener( IMogoMarkerClickListener listener ) { + MogoMarkersHandler.getInstance().registerMarkerClickListener( listener ); + } + + @Override + public void unregisterMarkerClickListener() { + MogoMarkersHandler.getInstance().unregisterMarkerClickListener(); + } +} diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/location/IMogoLocationClient.java b/libraries/mogo-map-api/src/main/java/com/mogo/map/location/IMogoLocationClient.java index ad81b5a9ab..3dd0406c2a 100644 --- a/libraries/mogo-map-api/src/main/java/com/mogo/map/location/IMogoLocationClient.java +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/location/IMogoLocationClient.java @@ -40,4 +40,6 @@ public interface IMogoLocationClient { void removeLocationListener( IMogoLocationListener listener ); MogoLocation getLastKnowLocation(); + + void destroy(); } diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/marker/IMogoInfoWindowAdapter.java b/libraries/mogo-map-api/src/main/java/com/mogo/map/marker/IMogoInfoWindowAdapter.java index 0567375e0f..0d0786991f 100644 --- a/libraries/mogo-map-api/src/main/java/com/mogo/map/marker/IMogoInfoWindowAdapter.java +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/marker/IMogoInfoWindowAdapter.java @@ -10,5 +10,11 @@ import android.view.View; */ public interface IMogoInfoWindowAdapter { + /** + * 获取infowindow的布局 + * + * @param marker + * @return + */ View getInfoWindow( IMogoMarker marker ); } diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/marker/IMogoMarker.java b/libraries/mogo-map-api/src/main/java/com/mogo/map/marker/IMogoMarker.java index f0a5f57bab..5589a8c39a 100644 --- a/libraries/mogo-map-api/src/main/java/com/mogo/map/marker/IMogoMarker.java +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/marker/IMogoMarker.java @@ -3,7 +3,6 @@ package com.mogo.map.marker; import android.graphics.Bitmap; import com.mogo.map.MogoLatLng; -import com.mogo.map.location.IMogoLocationClient; import java.util.ArrayList; @@ -168,7 +167,38 @@ public interface IMogoMarker { */ void setInfoWindowAdapter( IMogoInfoWindowAdapter adapter ); + /** + * 自定义 infowindow 样式接口 + * + * @return + */ IMogoInfoWindowAdapter getInfoWindowAdapter(); + /** + * 自定义marker样式 + * + * @return + */ + void setMarkerIconView( IMogoMarkerIconViewCreator creator ); + + /** + * 是否被销毁 + * + * @return + */ boolean isDestroyed(); + + /** + * 设置marker的归属模块 + * + * @param mOwner + */ + void setOwner( String mOwner ); + + /** + * 获取marker的归属模块 + * + * @return + */ + String getOwner(); } diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/marker/IMogoMarkerClickListenerRegister.java b/libraries/mogo-map-api/src/main/java/com/mogo/map/marker/IMogoMarkerClickListenerRegister.java new file mode 100644 index 0000000000..9ae5f8aa77 --- /dev/null +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/marker/IMogoMarkerClickListenerRegister.java @@ -0,0 +1,23 @@ +package com.mogo.map.marker; + +/** + * @author congtaowang + * @since 2019-12-23 + *
+ * 地图操作回调 + */ +public interface IMogoMarkerClickListenerRegister { + + /** + * 注册marker回调,各业务模块不用关注 + * + * @param listener + */ + void registerMarkerClickListener( IMogoMarkerClickListener listener ); + + + /** + * 注销marker回调,各业务模块不需要关注 + */ + void unregisterMarkerClickListener(); +} diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/marker/IMogoMarkerIconViewCreator.java b/libraries/mogo-map-api/src/main/java/com/mogo/map/marker/IMogoMarkerIconViewCreator.java new file mode 100644 index 0000000000..50089cb15b --- /dev/null +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/marker/IMogoMarkerIconViewCreator.java @@ -0,0 +1,20 @@ +package com.mogo.map.marker; + +import android.view.View; + +/** + * @author congtaowang + * @since 2019-12-29 + *
+ * 动态变换 marker 样式接口 + */ +public interface IMogoMarkerIconViewCreator { + + /** + * 返回自定义marker样式 + * + * @param marker marker 的数据 + * @return + */ + View createView( IMogoMarker marker ); +} diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/marker/MogoMarkerOptions.java b/libraries/mogo-map-api/src/main/java/com/mogo/map/marker/MogoMarkerOptions.java index 30771de9bd..2f4b6e4152 100644 --- a/libraries/mogo-map-api/src/main/java/com/mogo/map/marker/MogoMarkerOptions.java +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/marker/MogoMarkerOptions.java @@ -1,8 +1,10 @@ package com.mogo.map.marker; import android.graphics.Bitmap; +import android.view.View; import java.util.ArrayList; +import java.util.Observable; /** * @author congtaowang @@ -10,7 +12,7 @@ import java.util.ArrayList; *
* 地图marker */ -public class MogoMarkerOptions { +public class MogoMarkerOptions extends Observable { private double latitude; private double longitude; @@ -41,7 +43,7 @@ public class MogoMarkerOptions { // Marker覆盖物锚点在水平范围的比例。 private float u = 0.5f; // Marker覆盖物锚点垂直范围的比例。 - private float v = 0.5f; + private float v = 1f; // 设置Marker覆盖物是否可拖拽。 private boolean draggable = false; @@ -53,6 +55,10 @@ public class MogoMarkerOptions { // 设置Marker覆盖物 zIndex。 private int zIndex = 0; + // 自定义样式 + private View mIconView; + // marker 归属模块 + private String mOwner; public MogoMarkerOptions latitude( double latitude ) { this.latitude = latitude; @@ -74,6 +80,12 @@ public class MogoMarkerOptions { return this; } + /** + * 优先使用icon作为marker资源 + * + * @param icon + * @return + */ public MogoMarkerOptions icon( Bitmap icon ) { this.icon = icon; return this; @@ -144,6 +156,22 @@ public class MogoMarkerOptions { return this; } + /** + * 自定义marker图层样式,优先使用 icon {@link #icon(Bitmap)}作为marker资源 + * + * @param iconView + * @return + */ + public MogoMarkerOptions icon( View iconView ) { + this.mIconView = iconView; + return this; + } + + public MogoMarkerOptions owner( String owner ) { + this.mOwner = owner; + return this; + } + public double getLatitude() { return latitude; } @@ -219,4 +247,12 @@ public class MogoMarkerOptions { public int getzIndex() { return zIndex; } + + public View getIconView() { + return mIconView; + } + + public String getOwner() { + return mOwner; + } } diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/marker/MogoMarkersHandler.java b/libraries/mogo-map-api/src/main/java/com/mogo/map/marker/MogoMarkersHandler.java index b113bc0409..ac427b3929 100644 --- a/libraries/mogo-map-api/src/main/java/com/mogo/map/marker/MogoMarkersHandler.java +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/marker/MogoMarkersHandler.java @@ -1,5 +1,8 @@ package com.mogo.map.marker; +import com.mogo.map.listener.IMogoMapListener; +import com.mogo.map.listener.IMogoMapListenerRegister; + import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -12,9 +15,10 @@ import java.util.Map; *
* 管理地图上的所有marker
*/
-public class MogoMarkersHandler {
+public class MogoMarkersHandler implements IMogoMarkerClickListener, IMogoMarkerClickListenerRegister {
private static volatile MogoMarkersHandler sInstance;
+ private IMogoMarkerClickListener mDelegate;
public static MogoMarkersHandler getInstance() {
if ( sInstance == null ) {
@@ -86,4 +90,22 @@ public class MogoMarkersHandler {
}
mServicesMarkers.get( tag ).addAll( markers );
}
+
+ @Override
+ public void registerMarkerClickListener( IMogoMarkerClickListener listener ) {
+ mDelegate = listener;
+ }
+
+ @Override
+ public void unregisterMarkerClickListener() {
+ mDelegate = null;
+ }
+
+ @Override
+ public boolean onMarkerClicked( IMogoMarker marker ) {
+ if ( mDelegate != null ) {
+ return mDelegate.onMarkerClicked( marker );
+ }
+ return false;
+ }
}
diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.java b/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.java
index f9b5c35bd8..ba4a89ff28 100644
--- a/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.java
+++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.java
@@ -1,5 +1,7 @@
package com.mogo.map.uicontroller;
+import com.mogo.map.MogoLatLng;
+
/**
* @author congtaowang
* @since 2019-12-26
@@ -22,6 +24,13 @@ public interface IMogoMapUIController {
*/
void changeZoom( boolean zoomIn );
+ /**
+ * 修改缩放级别
+ *
+ * @param zoom
+ */
+ void changeZoom( float zoom );
+
/**
* 切换2D/3D模式
*
@@ -32,7 +41,7 @@ public interface IMogoMapUIController {
/**
* 将地图移动至当前位置
*/
- void moveToCurrentLocation();
+ void moveToCenter( MogoLatLng latLng );
/**
* 显示我的位置
@@ -50,4 +59,11 @@ public interface IMogoMapUIController {
* 预览全程
*/
void displayOverview();
+
+ /**
+ * 获取比例尺数据
+ *
+ * @return 当前缩放级别下,地图上1像素点对应的长度,单位米
+ */
+ float getScalePerPixel();
}
diff --git a/libraries/mogo-map/build.gradle b/libraries/mogo-map/build.gradle
index c5bcc829a2..3dfd2a8589 100644
--- a/libraries/mogo-map/build.gradle
+++ b/libraries/mogo-map/build.gradle
@@ -1,15 +1,13 @@
apply plugin: 'com.android.library'
android {
- compileSdkVersion 29
- buildToolsVersion "29.0.2"
-
-
+ compileSdkVersion rootProject.ext.android.compileSdkVersion
+ buildToolsVersion rootProject.ext.android.buildToolsVersion
defaultConfig {
- minSdkVersion 19
- targetSdkVersion 29
- versionCode 1
- versionName "1.0"
+ minSdkVersion rootProject.ext.android.minSdkVersion
+ targetSdkVersion rootProject.ext.android.targetSdkVersion
+ versionCode Integer.valueOf(VERSION_CODE)
+ versionName getValueFromRootProperties("${project.name.replace("-", "_").toUpperCase()}_VERSION")
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles 'consumer-rules.pro'
@@ -27,7 +25,15 @@ dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation rootProject.ext.dependencies.androidxappcompat
- implementation project(':foudations:mogo-utils')
- implementation project(':libraries:mogo-map-api')
- api project(':libraries:map-amap')
+ if (Boolean.valueOf(RELEASE)) {
+ implementation rootProject.ext.dependencies.mogoutils
+ implementation rootProject.ext.dependencies.mogomapapi
+ api rootProject.ext.dependencies.mapamap
+ } else {
+ implementation project(':foudations:mogo-utils')
+ implementation project(':libraries:mogo-map-api')
+ api project(':libraries:map-amap')
+ }
}
+
+apply from: new File(rootProject.rootDir, "gradle/upload.gradle").toString()
diff --git a/libraries/mogo-map/gradle.properties b/libraries/mogo-map/gradle.properties
new file mode 100644
index 0000000000..6c52acbe41
--- /dev/null
+++ b/libraries/mogo-map/gradle.properties
@@ -0,0 +1,3 @@
+GROUP=com.mogo.map
+POM_ARTIFACT_ID=mogo-map
+VERSION_CODE=1
diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/MogoLocationClient.java b/libraries/mogo-map/src/main/java/com/mogo/map/MogoLocationClient.java
index e1d7c6ebdc..1ea53c59c2 100644
--- a/libraries/mogo-map/src/main/java/com/mogo/map/MogoLocationClient.java
+++ b/libraries/mogo-map/src/main/java/com/mogo/map/MogoLocationClient.java
@@ -3,8 +3,8 @@ package com.mogo.map;
import android.content.Context;
import com.mogo.map.impl.amap.location.ALocationClient;
-import com.mogo.map.location.IMogoLocationListener;
import com.mogo.map.location.IMogoLocationClient;
+import com.mogo.map.location.IMogoLocationListener;
import com.mogo.map.location.MogoLocation;
/**
@@ -16,8 +16,8 @@ public class MogoLocationClient implements IMogoLocationClient {
private static volatile MogoLocationClient sInstance;
- private MogoLocationClient( Context context ) {
- mDelegate = ALocationClient.getInstance( context );
+ public MogoLocationClient( Context context ) {
+ mDelegate = new ALocationClient( context );
}
public static MogoLocationClient getInstance( Context context ) {
@@ -75,4 +75,11 @@ public class MogoLocationClient implements IMogoLocationClient {
}
return null;
}
+
+ @Override
+ public void destroy() {
+ if ( mDelegate != null ) {
+ mDelegate.destroy();
+ }
+ }
}
diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/MogoMapUIController.java b/libraries/mogo-map/src/main/java/com/mogo/map/MogoMapUIController.java
index 6e1ebfd46b..b45c6a4086 100644
--- a/libraries/mogo-map/src/main/java/com/mogo/map/MogoMapUIController.java
+++ b/libraries/mogo-map/src/main/java/com/mogo/map/MogoMapUIController.java
@@ -49,6 +49,13 @@ public class MogoMapUIController implements IMogoMapUIController {
}
}
+ @Override
+ public void changeZoom( float zoom ) {
+ if ( mDelegate != null ) {
+ mDelegate.changeZoom( zoom );
+ }
+ }
+
@Override
public void changeMapMode( EnumMapUI mode ) {
if ( mDelegate != null ) {
@@ -57,9 +64,9 @@ public class MogoMapUIController implements IMogoMapUIController {
}
@Override
- public void moveToCurrentLocation() {
+ public void moveToCenter( MogoLatLng latLng ) {
if ( mDelegate != null ) {
- mDelegate.moveToCurrentLocation();
+ mDelegate.moveToCenter( latLng );
}
}
@@ -83,4 +90,12 @@ public class MogoMapUIController implements IMogoMapUIController {
mDelegate.displayOverview();
}
}
+
+ @Override
+ public float getScalePerPixel() {
+ if ( mDelegate != null ) {
+ return mDelegate.getScalePerPixel();
+ }
+ return 0;
+ }
}
diff --git a/modules/mogo-module-apps/.gitignore b/modules/mogo-module-apps/.gitignore
new file mode 100644
index 0000000000..796b96d1c4
--- /dev/null
+++ b/modules/mogo-module-apps/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/modules/mogo-module-apps/build.gradle b/modules/mogo-module-apps/build.gradle
new file mode 100644
index 0000000000..dde252e48c
--- /dev/null
+++ b/modules/mogo-module-apps/build.gradle
@@ -0,0 +1,59 @@
+apply plugin: 'com.android.library'
+apply plugin: 'com.alibaba.arouter'
+
+android {
+ compileSdkVersion rootProject.ext.android.compileSdkVersion
+ buildToolsVersion rootProject.ext.android.buildToolsVersion
+ defaultConfig {
+ minSdkVersion rootProject.ext.android.minSdkVersion
+ targetSdkVersion rootProject.ext.android.targetSdkVersion
+ versionCode Integer.valueOf(VERSION_CODE)
+ versionName getValueFromRootProperties("${project.name.replace("-", "_").toUpperCase()}_VERSION")
+
+ javaCompileOptions {
+ annotationProcessorOptions {
+ arguments = [AROUTER_MODULE_NAME: project.getName()]
+ }
+ }
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ consumerProguardFiles 'consumer-rules.pro'
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+
+}
+
+dependencies {
+ implementation fileTree(dir: 'libs', include: ['*.jar'])
+
+ implementation rootProject.ext.dependencies.androidxappcompat
+ implementation rootProject.ext.dependencies.androidxconstraintlayout
+ implementation rootProject.ext.dependencies.arouter
+ 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.mogoutils
+ api rootProject.ext.dependencies.mogocommons
+ api rootProject.ext.dependencies.mogoserviceapi
+ implementation rootProject.ext.dependencies.modulecommon
+ } else {
+ implementation project(":libraries:mogo-map")
+ implementation project(":libraries:mogo-map-api")
+ implementation project(":foudations:mogo-utils")
+ api project(":foudations:mogo-commons")
+ api project(':services:mogo-service-api')
+ implementation project(':modules:mogo-module-common')
+ }
+}
+
+apply from: new File(rootProject.rootDir, "gradle/upload.gradle").toString()
diff --git a/modules/mogo-module-apps/consumer-rules.pro b/modules/mogo-module-apps/consumer-rules.pro
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/modules/mogo-module-apps/gradle.properties b/modules/mogo-module-apps/gradle.properties
new file mode 100644
index 0000000000..8f81a71358
--- /dev/null
+++ b/modules/mogo-module-apps/gradle.properties
@@ -0,0 +1,3 @@
+GROUP=com.mogo.module
+POM_ARTIFACT_ID=module-apps
+VERSION_CODE=1
diff --git a/modules/mogo-module-apps/proguard-rules.pro b/modules/mogo-module-apps/proguard-rules.pro
new file mode 100644
index 0000000000..8100159367
--- /dev/null
+++ b/modules/mogo-module-apps/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class mName to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file mName.
+#-renamesourcefileattribute SourceFile
diff --git a/modules/mogo-module-apps/src/androidTest/java/com/mogo/mogo/module/apps/ExampleInstrumentedTest.java b/modules/mogo-module-apps/src/androidTest/java/com/mogo/mogo/module/apps/ExampleInstrumentedTest.java
new file mode 100644
index 0000000000..ded34c927b
--- /dev/null
+++ b/modules/mogo-module-apps/src/androidTest/java/com/mogo/mogo/module/apps/ExampleInstrumentedTest.java
@@ -0,0 +1,27 @@
+package com.mogo.mogo.module.apps;
+
+import android.content.Context;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see Testing documentation
+ */
+@RunWith( AndroidJUnit4.class )
+public class ExampleInstrumentedTest {
+ @Test
+ public void useAppContext() {
+ // Context of the app under test.
+ Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+
+ assertEquals( "com.mogo.mogo.module.apps.test", appContext.getPackageName() );
+ }
+}
diff --git a/modules/mogo-module-apps/src/main/AndroidManifest.xml b/modules/mogo-module-apps/src/main/AndroidManifest.xml
new file mode 100644
index 0000000000..bd29ee0033
--- /dev/null
+++ b/modules/mogo-module-apps/src/main/AndroidManifest.xml
@@ -0,0 +1,26 @@
+
+ * 描述 + */ +public class AppsAdapter extends RecyclerView.Adapter< AppsAdapter.AppsViewHolder > { + + private List< AppInfo > mAppInfos; + + public AppsAdapter( List< AppInfo > appInfos ) { + this.mAppInfos = appInfos; + } + + public void refreshAppInfos( List< AppInfo > mAppInfos ) { + this.mAppInfos = mAppInfos; + notifyDataSetChanged(); + } + + @NonNull + @Override + public AppsViewHolder onCreateViewHolder( @NonNull ViewGroup parent, int viewType ) { + return new AppsViewHolder( LayoutInflater.from( parent.getContext() ).inflate( R.layout.module_apps_item_app, null ) ); + } + + @Override + public void onBindViewHolder( @NonNull AppsViewHolder holder, int position ) { + final AppInfo appInfo = mAppInfos.get( position ); + holder.mIcon.setImageDrawable( appInfo.getIcon() ); + holder.mName.setText( appInfo.getName() ); + } + + @Override + public int getItemCount() { + return mAppInfos == null ? 0 : mAppInfos.size(); + } + + public static class AppsViewHolder extends RecyclerView.ViewHolder { + + public ImageView mIcon; + public TextView mName; + + public AppsViewHolder( @NonNull View itemView ) { + super( itemView ); + mIcon = itemView.findViewById( R.id.module_apps_id_app_icon ); + mName = itemView.findViewById( R.id.module_apps_id_app_name ); + } + } +} diff --git a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppsFragment.java b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppsFragment.java new file mode 100644 index 0000000000..51f42a88ae --- /dev/null +++ b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppsFragment.java @@ -0,0 +1,76 @@ +package com.mogo.module.apps; + +import android.os.Bundle; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.google.android.material.bottomsheet.BottomSheetBehavior; +import com.mogo.commons.mvp.MvpFragment; +import com.mogo.module.apps.model.AppInfo; + +import java.util.List; + +/** + * @author congtaowang + * @since 2019-12-30 + *
+ * 描述 + */ +public class AppsFragment extends MvpFragment< AppsView, AppsPresenter > implements AppsView { + + private BottomSheetBehavior mBottomSheetBehavior; + private RecyclerView mAppsList; + private AppsAdapter mAppsAdapter; + + @Override + protected int getLayoutId() { + return R.layout.module_apps_fragment_apps; + } + + @Override + protected void initViews() { + mAppsList = findViewById( R.id.module_apps_id_apps ); + mAppsList.setLayoutManager( new GridLayoutManager( getContext(), 3 ) ); + + mBottomSheetBehavior = BottomSheetBehavior.from( mAppsList ); + mBottomSheetBehavior.setSkipCollapsed( true ); + mBottomSheetBehavior.setBottomSheetCallback( new BottomSheetBehavior.BottomSheetCallback() { + @Override + public void onStateChanged( @NonNull View bottomSheet, int newState ) { + + } + + @Override + public void onSlide( @NonNull View bottomSheet, float slideOffset ) { + + } + } ); + mBottomSheetBehavior.setState( BottomSheetBehavior.STATE_COLLAPSED ); + } + + @NonNull + @Override + protected AppsPresenter createPresenter() { + return new AppsPresenter( this ); + } + + @Override + public void onActivityCreated( @Nullable Bundle savedInstanceState ) { + super.onActivityCreated( savedInstanceState ); + } + + @Override + public void renderApps( List< AppInfo > appInfos ) { + if ( mAppsAdapter == null ) { + mAppsAdapter = new AppsAdapter( appInfos ); + mAppsList.setAdapter( mAppsAdapter ); + } else { + mAppsAdapter.refreshAppInfos( appInfos ); + } + } +} diff --git a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppsFragmentProvider.java b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppsFragmentProvider.java new file mode 100644 index 0000000000..d719cea766 --- /dev/null +++ b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppsFragmentProvider.java @@ -0,0 +1,77 @@ +package com.mogo.module.apps; + +import android.content.Context; +import android.os.Bundle; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; + +import com.alibaba.android.arouter.facade.annotation.Route; +import com.mogo.map.listener.IMogoMapListener; +import com.mogo.map.location.IMogoLocationListener; +import com.mogo.map.navi.IMogoNaviListener; +import com.mogo.module.common.MogoModulePaths; +import com.mogo.service.module.IMogoModuleLifecycle; +import com.mogo.service.module.IMogoModuleProvider; + +/** + * @author congtaowang + * @since 2019-12-30 + *
+ * 描述 + */ + +@Route( path = MogoModulePaths.PATH_MODULE_APPS ) +public class AppsFragmentProvider implements IMogoModuleProvider { + + private AppsFragment mAppsFragment; + + @Override + public Fragment createFragment( Context context, Bundle data ) { + mAppsFragment = new AppsFragment(); + mAppsFragment.setArguments( data ); + return mAppsFragment; + } + + @Override + public View createView( Context context ) { + return null; + } + + @NonNull + @Override + public String getModuleName() { + return MogoModulePaths.PATH_MODULE_APPS; + } + + @Override + public IMogoModuleLifecycle getCardLifecycle() { + return null; + } + + @Override + public IMogoMapListener getMapListener() { + return null; + } + + @Override + public int getType() { + return IMogoModuleProvider.TYPE_FRAGMENT; + } + + @Override + public IMogoNaviListener getNaviListener() { + return null; + } + + @Override + public IMogoLocationListener getLocationListener() { + return null; + } + + @Override + public void init( Context context ) { + + } +} diff --git a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppsPresenter.java b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppsPresenter.java new file mode 100644 index 0000000000..99995c942e --- /dev/null +++ b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppsPresenter.java @@ -0,0 +1,86 @@ +package com.mogo.module.apps; + +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.graphics.drawable.Drawable; + +import androidx.annotation.NonNull; +import androidx.lifecycle.LifecycleOwner; +import androidx.lifecycle.Observer; + +import com.mogo.commons.mvp.Presenter; +import com.mogo.module.apps.model.AppInfo; +import com.mogo.utils.ThreadPoolService; +import com.mogo.utils.UiThreadHandler; +import com.mogo.utils.logger.Logger; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author congtaowang + * @since 2019-12-30 + *
+ * 描述 + */ +public class AppsPresenter extends Presenter< AppsView > { + + private static final String TAG = "AppsPresenter"; + + public AppsPresenter( AppsView view ) { + super( view ); + RefreshAppsListLiveData.getInstance().observeForever( new Observer< String >() { + @Override + public void onChanged( String s ) { + renderAppsList(); + } + } ); + } + + @Override + public void onCreate( @NonNull LifecycleOwner owner ) { + super.onCreate( owner ); + renderAppsList(); + } + + private void renderAppsList() { + ThreadPoolService.execute( new Runnable() { + @Override + public void run() { + final List< AppInfo > appInfoList = loadAppsList(); + UiThreadHandler.post( new Runnable() { + @Override + public void run() { + if ( mView != null ) { + mView.renderApps( appInfoList ); + } + } + } ); + + } + } ); + } + + private List< AppInfo > loadAppsList() { + Logger.i( TAG, "load apps list." ); + final List< AppInfo > appInfos = new ArrayList<>(); + final PackageManager packageManager = getContext().getPackageManager(); + List< PackageInfo > packages = packageManager.getInstalledPackages( 0 ); + for ( int i = 0; i < packages.size(); ++i ) { + PackageInfo packageInfo = packages.get( i ); + //获取非系统应用 + if ( ( packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM ) == 0 ) { + String appName = packageInfo.applicationInfo.loadLabel( packageManager ).toString(); + String packageName = packageInfo.packageName; + String versionName = packageInfo.versionName; + int versionCode = packageInfo.versionCode; + Drawable appIcon = packageInfo.applicationInfo.loadIcon( packageManager ); + AppInfo appInfo = new AppInfo( appName, packageName, versionName, versionCode, appIcon ); + appInfos.add( appInfo ); + } + } + return appInfos; + } + +} diff --git a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppsView.java b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppsView.java new file mode 100644 index 0000000000..bb66995def --- /dev/null +++ b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppsView.java @@ -0,0 +1,22 @@ +package com.mogo.module.apps; + +import com.mogo.commons.mvp.IView; +import com.mogo.module.apps.model.AppInfo; + +import java.util.List; + +/** + * @author congtaowang + * @since 2019-12-30 + *
+ * 描述 + */ +public interface AppsView extends IView { + + /** + * 显示加载的app列表 + * + * @param appInfos + */ + void renderApps( List< AppInfo > appInfos ); +} diff --git a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/RefreshAppsListLiveData.java b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/RefreshAppsListLiveData.java new file mode 100644 index 0000000000..47ca92529a --- /dev/null +++ b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/RefreshAppsListLiveData.java @@ -0,0 +1,32 @@ +package com.mogo.module.apps; + +import androidx.lifecycle.MutableLiveData; + +/** + * @author congtaowang + * @since 2019-12-30 + *
+ * 刷新app列表 + */ +public class RefreshAppsListLiveData extends MutableLiveData< String > { + + private static volatile RefreshAppsListLiveData sInstance; + + private RefreshAppsListLiveData() { + } + + public static RefreshAppsListLiveData getInstance() { + if ( sInstance == null ) { + synchronized ( RefreshAppsListLiveData.class ) { + if ( sInstance == null ) { + sInstance = new RefreshAppsListLiveData(); + } + } + } + return sInstance; + } + + public synchronized void release() { + sInstance = null; + } +} diff --git a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/model/AppInfo.java b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/model/AppInfo.java new file mode 100644 index 0000000000..f1c3fe5aa9 --- /dev/null +++ b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/model/AppInfo.java @@ -0,0 +1,46 @@ +package com.mogo.module.apps.model; + +import android.graphics.drawable.Drawable; + +/** + * @author congtaowang + * @since 2019-12-30 + *
+ * app 信息
+ */
+public class AppInfo {
+
+ private final String mName;
+ private final String mPackageName;
+ private final String mVersionName;
+ private final int mVersionCode;
+ private final Drawable mIcon;
+
+ public AppInfo( String name, String mPackageName, String mVersionName, int versionCode, Drawable icon ) {
+ this.mName = name;
+ this.mPackageName = mPackageName;
+ this.mVersionName = mVersionName;
+ this.mVersionCode = versionCode;
+ this.mIcon = icon;
+ }
+
+ public String getName() {
+ return mName;
+ }
+
+ public String getPackageName() {
+ return mPackageName;
+ }
+
+ public String getVersionName() {
+ return mVersionName;
+ }
+
+ public int getVersionCode() {
+ return mVersionCode;
+ }
+
+ public Drawable getIcon() {
+ return mIcon;
+ }
+}
diff --git a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/receiver/AppInstallReceiver.java b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/receiver/AppInstallReceiver.java
new file mode 100644
index 0000000000..a75f52ee00
--- /dev/null
+++ b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/receiver/AppInstallReceiver.java
@@ -0,0 +1,42 @@
+
+package com.mogo.module.apps.receiver;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+
+public class AppInstallReceiver extends BroadcastReceiver {
+
+ @Override
+ public void onReceive( Context context, Intent intent ) {
+ if ( intent.getAction().equals( Intent.ACTION_PACKAGE_ADDED ) ) {
+ String packageName = intent.getData().getSchemeSpecificPart();
+ notifyRefreshAppsList( packageName );
+ }
+ if ( intent.getAction().equals( Intent.ACTION_PACKAGE_REMOVED ) ) {
+ String packageName = intent.getData().getSchemeSpecificPart();
+ notifyRefreshAppsList( packageName );
+ }
+ if ( intent.getAction().equals( Intent.ACTION_PACKAGE_REPLACED ) ) {
+ String packageName = intent.getData().getSchemeSpecificPart();
+ notifyRefreshAppsList( packageName );
+ }
+ if ( intent.getAction().equals( Intent.ACTION_PACKAGE_CHANGED ) ) {
+ String packageName = intent.getData().getSchemeSpecificPart();
+ notifyRefreshAppsList( packageName );
+ }
+ if ( intent.getAction().equals( Intent.ACTION_PACKAGE_RESTARTED ) ) {
+ String packageName = intent.getData().getSchemeSpecificPart();
+ notifyRefreshAppsList( packageName );
+ }
+ if ( intent.getAction().equals( Intent.ACTION_PACKAGE_DATA_CLEARED ) ) {
+ String packageName = intent.getData().getSchemeSpecificPart();
+ notifyRefreshAppsList( packageName );
+ }
+ }
+
+ private void notifyRefreshAppsList( String packageName ) {
+
+ }
+}
\ No newline at end of file
diff --git a/modules/mogo-module-apps/src/main/res/layout/module_apps_fragment_apps.xml b/modules/mogo-module-apps/src/main/res/layout/module_apps_fragment_apps.xml
new file mode 100644
index 0000000000..59a55b2827
--- /dev/null
+++ b/modules/mogo-module-apps/src/main/res/layout/module_apps_fragment_apps.xml
@@ -0,0 +1,14 @@
+
+
* 描述 */ -public class MainActivity extends MvpActivity< MainView, MainPresenter > implements MainView { +public class MainActivity extends MvpActivity< MainView, MainPresenter > implements MainView, + IMogoLocationListener { - IMogoMapService mMogoMapService; - MogoModulesHandler mMogoModuleHandler; + private IMogoMapService mMogoMapService; + private MogoModulesHandler mMogoModuleHandler; + + private OrientedViewPager mCardsContainer; + private CardModulesAdapter mCardModulesAdapter; + + /** + * 主模块管控定位,可以向各个模块发送统一定位信息 + */ + private IMogoLocationClient mLocationClient; @Override protected int getLayoutId() { @@ -31,30 +49,57 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme @Override protected void initViews() { + mCardsContainer = findViewById( R.id.module_main_id_cards_container ); + mCardsContainer.setOrientation( OrientedViewPager.Orientation.VERTICAL ); + mCardsContainer.setOnPageChangeListener( new ViewPager.OnPageChangeListener() { + + @Override + public void onPageScrolled( int position, float positionOffset, int positionOffsetPixels ) { + + } + + @Override + public void onPageSelected( int position ) { + try { + mMogoModuleHandler.setEnable( mCardModulesAdapter.getProvider( position ).getModuleName() ); + } catch ( Exception e ) { + e.printStackTrace(); + } + } + + @Override + public void onPageScrollStateChanged( int state ) { + if ( state == ViewPager.SCROLL_STATE_IDLE ) { + } + } + } ); + } + + @Override + protected void onCreate( @Nullable Bundle savedInstanceState ) { + super.onCreate( savedInstanceState ); mMogoModuleHandler = new MogoModulesManager( this ); mMogoMapService = ( IMogoMapService ) ARouter.getInstance().build( MogoServicePaths.PATH_SERVICES_MAP ).navigation(); if ( mMogoMapService != null ) { - mMogoMapService.registerHostMapListener( mMogoModuleHandler ); - mMogoMapService.registerHostNaviListener( mMogoModuleHandler ); + mMogoMapService.getHostListenerRegister().registerHostMapListener( mMogoModuleHandler ); + mMogoMapService.getHostListenerRegister().registerHostNaviListener( mMogoModuleHandler ); + mMogoMapService.getHostListenerRegister().registerMarkerClickListener( mMogoModuleHandler ); } - mMogoModuleHandler.loadMap( R.id.module_main_id_map_fragment_container ); - Collection< IMogoModuleProvider > providers = mMogoModuleHandler.loadCards(); - for ( IMogoModuleProvider provider : providers ) { - if ( provider == null ) { - continue; - } - if ( provider.getType() == IMogoModuleProvider.TYPE_FRAGMENT ) { - final Fragment fragment = provider.createFragment( this, null ); - if ( fragment != null ) { - getSupportFragmentManager().beginTransaction() - .add( R.id.module_main_id_fragment_container, fragment ) - .commitAllowingStateLoss(); - } - } - } - mMogoModuleHandler.setEnable( providers.iterator().next().getModuleName() ); + mMogoModuleHandler.loadMap( R.id.module_main_id_map_fragment_container ); + mMogoModuleHandler.loadAppsList( R.id.module_main_id_fragment_container ); + + mLocationClient = mMogoMapService.getSingletonLocationClient( getApplicationContext() ); + mLocationClient.addLocationListener( this ); + mLocationClient.start(); + + List< IMogoModuleProvider > providers = mMogoModuleHandler.loadCards(); + mCardModulesAdapter = new CardModulesAdapter( this, providers ); + mCardsContainer.setOffscreenPageLimit( providers.size() ); + mCardsContainer.setPageTransformer( true, new VerticalStackTransformer( this ) ); + mCardsContainer.setAdapter( mCardModulesAdapter ); + mCardsContainer.setCurrentItem( 0 ); } @NonNull @@ -62,4 +107,26 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme protected MainPresenter createPresenter() { return new MainPresenter( this ); } + + @Override + public void onLocationChanged( MogoLocation location ) { + if ( mMogoModuleHandler != null ) { + mMogoModuleHandler.onLocationChanged( location ); + } + } + + @Override + protected void onDestroy() { + super.onDestroy(); + if ( mLocationClient != null ) { + mLocationClient.removeLocationListener( this ); + mLocationClient.destroy(); + } + mLocationClient = null; + mMogoMapService = null; + if ( mMogoModuleHandler != null ) { + mMogoModuleHandler.destroy(); + mMogoModuleHandler = null; + } + } } diff --git a/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/CardModulesAdapter.java b/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/CardModulesAdapter.java new file mode 100644 index 0000000000..e8c590a1d8 --- /dev/null +++ b/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/CardModulesAdapter.java @@ -0,0 +1,60 @@ +package com.mogo.module.main.cards; + +import android.util.Log; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentActivity; +import androidx.fragment.app.FragmentStatePagerAdapter; + +import com.mogo.service.module.IMogoModuleProvider; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author congtaowang + * @since 2019-12-30 + *
+ * 描述 + */ +public class CardModulesAdapter extends FragmentStatePagerAdapter { + + private static final String TAG = "CardModulesAdapter"; + + private final FragmentActivity mActivity; + private List< IMogoModuleProvider > mProviders; + + @NonNull + @Override + public Fragment getItem( int position ) { + int factPosition = getFactPosition( position ); + Log.i( TAG, "factPosition=" + factPosition ); + return mProviders.get( factPosition ).createFragment( mActivity, null ); + } + + @Override + public int getCount() { + return Integer.MAX_VALUE; + } + + public CardModulesAdapter( @NonNull FragmentActivity fragmentActivity, List< IMogoModuleProvider > providers ) { + super( fragmentActivity.getSupportFragmentManager() ); + mActivity = fragmentActivity; + this.mProviders = providers; + } + + public IMogoModuleProvider getProvider( int position ) { + return mProviders.get( getFactPosition( position ) ); + } + + public int getFactPosition( int position ) { + return position % mProviders.size(); + } + + @Override + public int getItemPosition( Object object ) { + return POSITION_NONE; + } + +} diff --git a/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/MogoModulesHandler.java b/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/MogoModulesHandler.java index 75b3a462a9..5315def15d 100644 --- a/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/MogoModulesHandler.java +++ b/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/MogoModulesHandler.java @@ -1,10 +1,14 @@ package com.mogo.module.main.cards; import com.mogo.map.listener.IMogoMapListener; +import com.mogo.map.location.IMogoLocationClient; +import com.mogo.map.location.IMogoLocationListener; +import com.mogo.map.marker.IMogoMarkerClickListener; import com.mogo.map.navi.IMogoNaviListener; import com.mogo.service.module.IMogoModuleProvider; import java.util.Collection; +import java.util.List; /** * @author congtaowang @@ -12,14 +16,15 @@ import java.util.Collection; *
* 卡片管理
*/
-public interface MogoModulesHandler extends IMogoMapListener, IMogoNaviListener {
+public interface MogoModulesHandler extends IMogoMapListener,
+ IMogoNaviListener, IMogoLocationListener, IMogoMarkerClickListener {
/**
* 加载卡片
*
* @return
*/
- Collection< IMogoModuleProvider > loadCards();
+ List< IMogoModuleProvider > loadCards();
/**
* 加载小智语音
@@ -42,10 +47,19 @@ public interface MogoModulesHandler extends IMogoMapListener, IMogoNaviListener
*/
void loadMap( int containerId );
+ /**
+ * 加载所有应用
+ *
+ * @param containerId 容器id
+ */
+ void loadAppsList( int containerId );
+
/**
* 设置某一个module可用
*
* @param module
*/
void setEnable( String module );
+
+ void destroy();
}
diff --git a/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/MogoModulesManager.java b/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/MogoModulesManager.java
index 7ca2624f99..56aaec6a78 100644
--- a/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/MogoModulesManager.java
+++ b/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/MogoModulesManager.java
@@ -9,18 +9,23 @@ import androidx.fragment.app.Fragment;
import com.alibaba.android.arouter.launcher.ARouter;
import com.mogo.map.MogoLatLng;
import com.mogo.map.listener.IMogoMapListener;
+import com.mogo.map.location.IMogoLocationListener;
+import com.mogo.map.location.MogoLocation;
+import com.mogo.map.marker.IMogoMarker;
import com.mogo.map.model.MogoPoi;
import com.mogo.map.navi.IMogoNaviListener;
import com.mogo.map.navi.MogoNaviInfo;
import com.mogo.map.uicontroller.EnumMapUI;
import com.mogo.module.common.MogoModulePaths;
import com.mogo.module.main.MainActivity;
+import com.mogo.service.module.IMogoModuleLifecycle;
import com.mogo.service.module.IMogoModuleProvider;
import com.mogo.utils.ResourcesHelper;
import com.mogo.utils.logger.Logger;
-import java.util.Collection;
+import java.util.ArrayList;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -31,13 +36,16 @@ import java.util.Set;
* 卡片加载
*/
public class MogoModulesManager implements MogoModulesHandler,
- IMogoMapListener, IMogoNaviListener {
+ IMogoMapListener,
+ IMogoNaviListener,
+ IMogoLocationListener {
private static final String TAG = "MogoModulesManager";
private MainActivity mActivity;
private final Map< String, IMogoModuleProvider > mCardProviders = new HashMap<>();
private IMogoModuleProvider mMapProvider;
+ private IMogoModuleProvider mAppsListProvider;
private String mEnableModuleName = null;
public MogoModulesManager( MainActivity activity ) {
@@ -56,10 +64,12 @@ public class MogoModulesManager implements MogoModulesHandler,
}
@Override
- public Collection< IMogoModuleProvider > loadCards() {
+ public List< IMogoModuleProvider > loadCards() {
IMogoModuleProvider demo = load( MogoModulePaths.PATH_MODULE_DEMO );
+ IMogoModuleProvider demo2 = load( MogoModulePaths.PATH_MODULE_DEMO2 );
mCardProviders.put( demo.getModuleName(), demo );
- return mCardProviders.values();
+ mCardProviders.put( demo2.getModuleName(), demo2 );
+ return new ArrayList<>( mCardProviders.values() );
}
@Override
@@ -82,6 +92,12 @@ public class MogoModulesManager implements MogoModulesHandler,
addFragment( mMapProvider, containerId );
}
+ @Override
+ public void loadAppsList( int containerId ) {
+ mAppsListProvider = load( MogoModulePaths.PATH_MODULE_APPS );
+ addFragment( mAppsListProvider, containerId );
+ }
+
private IMogoModuleProvider load( String path ) {
return ( IMogoModuleProvider ) ARouter.getInstance().build( path ).navigation( getContext() );
}
@@ -109,11 +125,15 @@ public class MogoModulesManager implements MogoModulesHandler,
for ( Map.Entry< String, IMogoModuleProvider > entry : entries ) {
final String key = entry.getKey();
final IMogoModuleProvider provider = entry.getValue();
- if ( TextUtils.equals( key, module ) ) {
- provider.getCardLifecycle().onPerform();
- } else {
- provider.getCardLifecycle().onDisable();
+ final IMogoModuleLifecycle lifecycle = provider.getCardLifecycle();
+ if ( lifecycle != null ) {
+ if ( TextUtils.equals( key, mEnableModuleName ) ) {
+ lifecycle.onPerform();
+ } else {
+ lifecycle.onDisable();
+ }
}
+
}
}
}
@@ -122,7 +142,7 @@ public class MogoModulesManager implements MogoModulesHandler,
public void onMapLoaded() {
if ( mEnableModuleName != null ) {
IMogoModuleProvider provider = getModuleProvider( mEnableModuleName );
- if ( provider != null ) {
+ if ( provider != null && provider.getMapListener() != null ) {
provider.getMapListener().onMapLoaded();
}
}
@@ -132,7 +152,7 @@ public class MogoModulesManager implements MogoModulesHandler,
public void onTouch( MotionEvent motionEvent ) {
if ( mEnableModuleName != null ) {
IMogoModuleProvider provider = getModuleProvider( mEnableModuleName );
- if ( provider != null ) {
+ if ( provider != null && provider.getMapListener() != null ) {
provider.getMapListener().onTouch( motionEvent );
}
}
@@ -142,7 +162,7 @@ public class MogoModulesManager implements MogoModulesHandler,
public void onPOIClick( MogoPoi poi ) {
if ( mEnableModuleName != null ) {
IMogoModuleProvider provider = getModuleProvider( mEnableModuleName );
- if ( provider != null ) {
+ if ( provider != null && provider.getMapListener() != null ) {
provider.getMapListener().onPOIClick( poi );
}
}
@@ -152,7 +172,7 @@ public class MogoModulesManager implements MogoModulesHandler,
public void onMapClick( MogoLatLng latLng ) {
if ( mEnableModuleName != null ) {
IMogoModuleProvider provider = getModuleProvider( mEnableModuleName );
- if ( provider != null ) {
+ if ( provider != null && provider.getMapListener() != null ) {
provider.getMapListener().onMapClick( latLng );
}
}
@@ -162,7 +182,7 @@ public class MogoModulesManager implements MogoModulesHandler,
public void onLockMap( boolean isLock ) {
if ( mEnableModuleName != null ) {
IMogoModuleProvider provider = getModuleProvider( mEnableModuleName );
- if ( provider != null ) {
+ if ( provider != null && provider.getMapListener() != null ) {
provider.getMapListener().onLockMap( isLock );
}
}
@@ -172,7 +192,7 @@ public class MogoModulesManager implements MogoModulesHandler,
public void onMapModeChanged( EnumMapUI ui ) {
if ( mEnableModuleName != null ) {
IMogoModuleProvider provider = getModuleProvider( mEnableModuleName );
- if ( provider != null ) {
+ if ( provider != null && provider.getMapListener() != null ) {
provider.getMapListener().onMapModeChanged( ui );
}
}
@@ -229,4 +249,25 @@ public class MogoModulesManager implements MogoModulesHandler,
}
}
}
+
+ @Override
+ public void onLocationChanged( MogoLocation location ) {
+ if ( mEnableModuleName != null ) {
+ IMogoModuleProvider provider = getModuleProvider( mEnableModuleName );
+ if ( provider != null && provider.getLocationListener() != null ) {
+ provider.getLocationListener().onLocationChanged( location );
+ }
+ }
+ }
+
+ @Override
+ public boolean onMarkerClicked( IMogoMarker marker ) {
+ marker.setAlpha( 0.5f );
+ return false;
+ }
+
+ @Override
+ public void destroy() {
+
+ }
}
diff --git a/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/OrientedViewPager.java b/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/OrientedViewPager.java
new file mode 100644
index 0000000000..6add107e86
--- /dev/null
+++ b/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/OrientedViewPager.java
@@ -0,0 +1,3384 @@
+package com.mogo.module.main.cards;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.database.DataSetObserver;
+import android.graphics.Canvas;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.os.SystemClock;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.FocusFinder;
+import android.view.Gravity;
+import android.view.KeyEvent;
+import android.view.MotionEvent;
+import android.view.SoundEffectConstants;
+import android.view.VelocityTracker;
+import android.view.View;
+import android.view.ViewConfiguration;
+import android.view.ViewGroup;
+import android.view.ViewParent;
+import android.view.accessibility.AccessibilityEvent;
+import android.view.animation.Interpolator;
+import android.widget.Scroller;
+
+import androidx.core.view.AccessibilityDelegateCompat;
+import androidx.core.view.MotionEventCompat;
+import androidx.core.view.VelocityTrackerCompat;
+import androidx.core.view.ViewCompat;
+import androidx.core.view.ViewConfigurationCompat;
+import androidx.core.view.accessibility.AccessibilityEventCompat;
+import androidx.core.view.accessibility.AccessibilityNodeInfoCompat;
+import androidx.core.view.accessibility.AccessibilityRecordCompat;
+import androidx.core.widget.EdgeEffectCompat;
+import androidx.viewpager.widget.PagerAdapter;
+import androidx.viewpager.widget.ViewPager;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+
+public class OrientedViewPager extends ViewGroup {
+
+ public enum Orientation {
+ VERTICAL, HORIZONTAL
+ }
+
+ private static final String TAG = "ViewPager";
+ private static final boolean DEBUG = false;
+
+ private static final boolean USE_CACHE = false;
+
+ private static final int DEFAULT_OFFSCREEN_PAGES = 1;
+ private static final int MAX_SETTLE_DURATION = 600; // ms
+ private static final int MIN_DISTANCE_FOR_FLING = 25; // dips
+
+ private static final int DEFAULT_GUTTER_SIZE = 16; // dips
+
+ private static final int MIN_FLING_VELOCITY = 400; // dips
+
+ private static final int[] LAYOUT_ATTRS = new int[] {
+ android.R.attr.layout_gravity
+ };
+
+ /**
+ * Used to track what the expected number of items in the adapter should be.
+ * If the app changes this when we don't expect it, we'll throw a big obnoxious exception.
+ */
+ private int mExpectedAdapterCount;
+
+ private static class ItemInfo {
+ Object object;
+ int position;
+ boolean scrolling;
+ float sizeFactor;
+ float offset;
+ }
+
+ private static final Comparator Note: Prior to Android 3.0 the property animation APIs did not exist.
+ * As a result, setting a PageTransformer prior to Android 3.0 (API 11) will have no effect. This is offered as an optimization. If you know in advance the number
+ * of pages you will need to support or have lazy-loading mechanisms in place
+ * on your pages, tweaking this setting can have benefits in perceived smoothness
+ * of paging animations and interaction. If you have a small number of pages (3-4)
+ * that you can keep active all at once, less time will be spent in layout for
+ * newly created view subtrees as the user pages back and forth. You should keep this limit low, especially if your pages have complex layouts.
+ * This setting defaults to 1. A fake drag can be useful if you want to synchronize the motion of the ViewPager
+ * with the touch scrolling of another view, while still letting the ViewPager
+ * control the snapping motion and fling behavior. (e.g. parallax-scrolling tabs.)
+ * Call {@link #fakeDragBy(float)} to simulate the actual drag motion. Call
+ * {@link #endFakeDrag()} to complete the fake drag and fling as necessary.
+ * During a fake drag the ViewPager will ignore all touch events. If a real drag
+ * is already in progress, this method will return false.
+ *
+ * @return true if the fake drag began successfully, false if it could not be started.
+ * @see #fakeDragBy(float)
+ * @see #endFakeDrag()
+ */
+ public boolean beginFakeDrag() {
+ if (mIsBeingDragged) {
+ return false;
+ }
+ mFakeDragging = true;
+ setScrollState(SCROLL_STATE_DRAGGING);
+ if (mOrientation == Orientation.VERTICAL) {
+ mInitialMotionY = mLastMotionY = 0;
+ } else {
+ mInitialMotionX = mLastMotionX = 0;
+ }
+ if (mVelocityTracker == null) {
+ mVelocityTracker = VelocityTracker.obtain();
+ } else {
+ mVelocityTracker.clear();
+ }
+ final long time = SystemClock.uptimeMillis();
+ final MotionEvent ev = MotionEvent.obtain(time, time, MotionEvent.ACTION_DOWN, 0, 0, 0);
+ mVelocityTracker.addMovement(ev);
+ ev.recycle();
+ mFakeDragBeginTime = time;
+ return true;
+ }
+
+ /**
+ * End a fake drag of the pager.
+ *
+ * @see #beginFakeDrag()
+ * @see #fakeDragBy(float)
+ */
+ public void endFakeDrag() {
+ if (!mFakeDragging) {
+ throw new IllegalStateException("No fake drag in progress. Call beginFakeDrag first.");
+ }
+
+ final VelocityTracker velocityTracker = mVelocityTracker;
+ velocityTracker.computeCurrentVelocity(1000, mMaximumVelocity);
+ if (mOrientation == Orientation.VERTICAL) {
+ int initialVelocity = (int) VelocityTrackerCompat.getYVelocity(
+ velocityTracker, mActivePointerId);
+ mPopulatePending = true;
+ final int size = getClientSize();
+ final int scrollY = getScrollY();
+ final ItemInfo ii = infoForCurrentScrollPosition();
+ final int currentPage = ii.position;
+ final float pageOffset = (((float) scrollY / size) - ii.offset) / ii.sizeFactor;
+ final int totalDelta = (int) (mLastMotionY - mInitialMotionY);
+
+ int nextPage = determineTargetPage(currentPage, pageOffset, initialVelocity,
+ totalDelta);
+ setCurrentItemInternal(nextPage, true, true, initialVelocity);
+ } else {
+ int initialVelocity = (int) VelocityTrackerCompat.getXVelocity(
+ velocityTracker, mActivePointerId);
+ mPopulatePending = true;
+ final int size = getClientSize();
+ final int scrollX = getScrollX();
+ final ItemInfo ii = infoForCurrentScrollPosition();
+ final int currentPage = ii.position;
+ final float pageOffset = (((float) scrollX / size) - ii.offset) / ii.sizeFactor;
+ final int totalDelta = (int) (mLastMotionX - mInitialMotionX);
+ int nextPage = determineTargetPage(currentPage, pageOffset, initialVelocity,
+ totalDelta);
+ setCurrentItemInternal(nextPage, true, true, initialVelocity);
+ }
+ endDrag();
+
+ mFakeDragging = false;
+ }
+
+ /**
+ * Fake drag by an offset in pixels. You must have called {@link #beginFakeDrag()} first.
+ *
+ * @param offset Offset in pixels to drag by.
+ * @see #beginFakeDrag()
+ * @see #endFakeDrag()
+ */
+ public void fakeDragBy(float offset) {
+ if (!mFakeDragging) {
+ throw new IllegalStateException("No fake drag in progress. Call beginFakeDrag first.");
+ }
+
+ if (mOrientation == Orientation.VERTICAL) {
+ mLastMotionY += offset;
+
+ float oldScrollY = getScrollY();
+ float scrollY = oldScrollY - offset;
+ final int height = getClientSize();
+
+ float topBound = height * mFirstOffset;
+ float bottomBound = height * mLastOffset;
+
+ final ItemInfo firstItem = mItems.get(0);
+ final ItemInfo lastItem = mItems.get(mItems.size() - 1);
+ if (firstItem.position != 0) {
+ topBound = firstItem.offset * height;
+ }
+ if (lastItem.position != mAdapter.getCount() - 1) {
+ bottomBound = lastItem.offset * height;
+ }
+
+ if (scrollY < topBound) {
+ scrollY = topBound;
+ } else if (scrollY > bottomBound) {
+ scrollY = bottomBound;
+ }
+ // Don't lose the rounded component
+ mLastMotionY += scrollY - (int) scrollY;
+ scrollTo(getScrollX(), (int) scrollY);
+ pageScrolled((int) scrollY);
+
+ // Synthesize an event for the VelocityTracker.
+ final long time = SystemClock.uptimeMillis();
+ final MotionEvent ev = MotionEvent.obtain(mFakeDragBeginTime, time, MotionEvent.ACTION_MOVE,
+ 0, mLastMotionY, 0);
+ mVelocityTracker.addMovement(ev);
+ ev.recycle();
+ } else {
+ mLastMotionX += offset;
+
+ float oldScrollX = getScrollX();
+ float scrollX = oldScrollX - offset;
+ final int width = getClientSize();
+
+ float leftBound = width * mFirstOffset;
+ float rightBound = width * mLastOffset;
+
+ final ItemInfo firstItem = mItems.get(0);
+ final ItemInfo lastItem = mItems.get(mItems.size() - 1);
+ if (firstItem.position != 0) {
+ leftBound = firstItem.offset * width;
+ }
+ if (lastItem.position != mAdapter.getCount() - 1) {
+ rightBound = lastItem.offset * width;
+ }
+
+ if (scrollX < leftBound) {
+ scrollX = leftBound;
+ } else if (scrollX > rightBound) {
+ scrollX = rightBound;
+ }
+ // Don't lose the rounded component
+ mLastMotionX += scrollX - (int) scrollX;
+ scrollTo((int) scrollX, getScrollY());
+ pageScrolled((int) scrollX);
+
+ // Synthesize an event for the VelocityTracker.
+ final long time = SystemClock.uptimeMillis();
+ final MotionEvent ev = MotionEvent.obtain(mFakeDragBeginTime, time, MotionEvent.ACTION_MOVE,
+ mLastMotionX, 0, 0);
+ mVelocityTracker.addMovement(ev);
+ ev.recycle();
+ }
+ }
+
+ /**
+ * Returns true if a fake drag is in progress.
+ *
+ * @return true if currently in a fake drag, false otherwise.
+ * @see #beginFakeDrag()
+ * @see #fakeDragBy(float)
+ * @see #endFakeDrag()
+ */
+ public boolean isFakeDragging() {
+ return mFakeDragging;
+ }
+
+ private void onSecondaryPointerUp(MotionEvent ev) {
+ final int pointerIndex = MotionEventCompat.getActionIndex(ev);
+ final int pointerId = MotionEventCompat.getPointerId(ev, pointerIndex);
+ if (pointerId == mActivePointerId) {
+ // This was our active pointer going up. Choose a new
+ // active pointer and adjust accordingly.
+ final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
+ if (mOrientation == Orientation.VERTICAL) {
+ mLastMotionY = MotionEventCompat.getY(ev, newPointerIndex);
+ } else {
+ mLastMotionX = MotionEventCompat.getX(ev, newPointerIndex);
+ }
+ mActivePointerId = MotionEventCompat.getPointerId(ev, newPointerIndex);
+ if (mVelocityTracker != null) {
+ mVelocityTracker.clear();
+ }
+ }
+ }
+
+ private void endDrag() {
+ mIsBeingDragged = false;
+ mIsUnableToDrag = false;
+
+ if (mVelocityTracker != null) {
+ mVelocityTracker.recycle();
+ mVelocityTracker = null;
+ }
+ }
+
+ private void setScrollingCacheEnabled(boolean enabled) {
+ if (mScrollingCacheEnabled != enabled) {
+ mScrollingCacheEnabled = enabled;
+ if (USE_CACHE) {
+ final int size = getChildCount();
+ for (int i = 0; i < size; ++i) {
+ final View child = getChildAt(i);
+ if (child.getVisibility() != GONE) {
+ child.setDrawingCacheEnabled(enabled);
+ }
+ }
+ }
+ }
+ }
+
+ public boolean internalCanScrollVertically(int direction) {
+ if (mAdapter == null) {
+ return false;
+ }
+
+ final int size = getClientSize();
+ final int scroll = (mOrientation == Orientation.VERTICAL) ? getScrollY() : getScrollX();
+ if (direction < 0) {
+ return (scroll > (int) (size * mFirstOffset));
+ } else if (direction > 0) {
+ return (scroll < (int) (size * mLastOffset));
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * Tests scrollability within child views of v given a delta of dx.
+ *
+ * @param v View to test for horizontal scrollability
+ * @param checkV Whether the view v passed should itself be checked for scrollability (true),
+ * or just its children (false).
+ * @param delta Delta scrolled in pixels
+ * @param x X coordinate of the active touch point
+ * @param y Y coordinate of the active touch point
+ * @return true if child views of v can be scrolled by delta of dx.
+ */
+ protected boolean canScroll(View v, boolean checkV, int delta, int x, int y) {
+ if (v instanceof ViewGroup) {
+ final ViewGroup group = (ViewGroup) v;
+ final int scrollX = v.getScrollX();
+ final int scrollY = v.getScrollY();
+ final int count = group.getChildCount();
+ // Count backwards - let topmost views consume scroll distance first.
+ for (int i = count - 1; i >= 0; i--) {
+ // TODO: Add versioned support here for transformed views.
+ // This will not work for transformed views in Honeycomb+
+ final View child = group.getChildAt(i);
+ if (mOrientation == Orientation.VERTICAL) {
+ if (y + scrollY >= child.getTop() && y + scrollY < child.getBottom() &&
+ x + scrollX >= child.getLeft() && x + scrollX < child.getRight() &&
+ canScroll(child, true, delta, x + scrollX - child.getLeft(),
+ y + scrollY - child.getTop())) {
+ return true;
+ }
+ } else {
+ if (x + scrollX >= child.getLeft() && x + scrollX < child.getRight() &&
+ y + scrollY >= child.getTop() && y + scrollY < child.getBottom() &&
+ canScroll(child, true, delta, x + scrollX - child.getLeft(),
+ y + scrollY - child.getTop())) {
+ return true;
+ }
+ }
+ }
+ }
+
+ return checkV && ViewCompat.canScrollVertically(v, -delta);
+ }
+
+ @Override
+ public boolean dispatchKeyEvent( KeyEvent event) {
+ // Let the focused view and/or our descendants get the key first
+ return super.dispatchKeyEvent(event) || executeKeyEvent(event);
+ }
+
+ /**
+ * You can call this function yourself to have the scroll view perform
+ * scrolling from a key event, just as if the event had been dispatched to
+ * it by the view hierarchy.
+ *
+ * @param event The key event to execute.
+ * @return Return true if the event was handled, else false.
+ */
+ public boolean executeKeyEvent(KeyEvent event) {
+ boolean handled = false;
+ if (event.getAction() == KeyEvent.ACTION_DOWN) {
+ switch (event.getKeyCode()) {
+ case KeyEvent.KEYCODE_DPAD_LEFT:
+ handled = arrowScroll(FOCUS_LEFT);
+ break;
+ case KeyEvent.KEYCODE_DPAD_RIGHT:
+ handled = arrowScroll(FOCUS_RIGHT);
+ break;
+ case KeyEvent.KEYCODE_TAB:
+ if (Build.VERSION.SDK_INT >= 11) {
+ // The focus finder had a bug handling FOCUS_FORWARD and FOCUS_BACKWARD
+ // before Android 3.0. Ignore the tab key on those devices.
+ if (event.hasNoModifiers()) {
+ handled = arrowScroll(FOCUS_FORWARD);
+ } else if (event.hasModifiers(KeyEvent.META_SHIFT_ON)) {
+ handled = arrowScroll(FOCUS_BACKWARD);
+ }
+ }
+ break;
+ }
+ }
+ return handled;
+ }
+
+ public boolean arrowScroll(int direction) {
+ View currentFocused = findFocus();
+ if (currentFocused == this) {
+ currentFocused = null;
+ } else if (currentFocused != null) {
+ boolean isChild = false;
+ for (ViewParent parent = currentFocused.getParent(); parent instanceof ViewGroup;
+ parent = parent.getParent()) {
+ if (parent == this) {
+ isChild = true;
+ break;
+ }
+ }
+ if (!isChild) {
+ // This would cause the focus search down below to fail in fun ways.
+ final StringBuilder sb = new StringBuilder();
+ sb.append(currentFocused.getClass().getSimpleName());
+ for (ViewParent parent = currentFocused.getParent(); parent instanceof ViewGroup;
+ parent = parent.getParent()) {
+ sb.append(" => ").append(parent.getClass().getSimpleName());
+ }
+ Log.e(TAG, "arrowScroll tried to find focus based on non-child " +
+ "current focused view " + sb.toString());
+ currentFocused = null;
+ }
+ }
+
+ boolean handled = false;
+
+ View nextFocused = FocusFinder.getInstance().findNextFocus(this, currentFocused,
+ direction);
+ if (nextFocused != null && nextFocused != currentFocused) {
+ if (direction == View.FOCUS_UP) {
+ // If there is nothing to the left, or this is causing us to
+ // jump to the right, then what we really want to do is page left.
+ if (mOrientation == Orientation.VERTICAL) {
+ final int nextTop = getChildRectInPagerCoordinates(mTempRect, nextFocused).top;
+ final int currTop = getChildRectInPagerCoordinates(mTempRect, currentFocused).top;
+ if (currentFocused != null && nextTop >= currTop) {
+ handled = pageBack();
+ } else {
+ handled = nextFocused.requestFocus();
+ }
+ } else {
+ final int nextLeft = getChildRectInPagerCoordinates(mTempRect, nextFocused).left;
+ final int currLeft = getChildRectInPagerCoordinates(mTempRect, currentFocused).left;
+ if (currentFocused != null && nextLeft >= currLeft) {
+ handled = pageBack();
+ } else {
+ handled = nextFocused.requestFocus();
+ }
+ }
+ } else if (direction == View.FOCUS_DOWN) {
+ // If there is nothing to the right, or this is causing us to
+ // jump to the left, then what we really want to do is page right.
+ if (mOrientation == Orientation.VERTICAL) {
+ final int nextDown = getChildRectInPagerCoordinates(mTempRect, nextFocused).bottom;
+ final int currDown = getChildRectInPagerCoordinates(mTempRect, currentFocused).bottom;
+ if (currentFocused != null && nextDown <= currDown) {
+ handled = pageForward();
+ } else {
+ handled = nextFocused.requestFocus();
+ }
+ } else {
+ final int nextLeft = getChildRectInPagerCoordinates(mTempRect, nextFocused).left;
+ final int currLeft = getChildRectInPagerCoordinates(mTempRect, currentFocused).left;
+ if (currentFocused != null && nextLeft <= currLeft) {
+ handled = pageForward();
+ } else {
+ handled = nextFocused.requestFocus();
+ }
+ }
+ }
+ } else if (direction == FOCUS_UP || direction == FOCUS_BACKWARD) {
+ // Trying to move left and nothing there; try to page.
+ handled = pageBack();
+ } else if (direction == FOCUS_DOWN || direction == FOCUS_FORWARD) {
+ // Trying to move right and nothing there; try to page.
+ handled = pageForward();
+ }
+ if (handled) {
+ playSoundEffect( SoundEffectConstants.getContantForFocusDirection(direction));
+ }
+ return handled;
+ }
+
+ private Rect getChildRectInPagerCoordinates(Rect outRect, View child) {
+ if (outRect == null) {
+ outRect = new Rect();
+ }
+ if (child == null) {
+ outRect.set(0, 0, 0, 0);
+ return outRect;
+ }
+ outRect.left = child.getLeft();
+ outRect.right = child.getRight();
+ outRect.top = child.getTop();
+ outRect.bottom = child.getBottom();
+
+ ViewParent parent = child.getParent();
+ while (parent instanceof ViewGroup && parent != this) {
+ final ViewGroup group = (ViewGroup) parent;
+ outRect.left += group.getLeft();
+ outRect.right += group.getRight();
+ outRect.top += group.getTop();
+ outRect.bottom += group.getBottom();
+
+ parent = group.getParent();
+ }
+ return outRect;
+ }
+
+ boolean pageBack() {
+ if (mCurItem > 0) {
+ setCurrentItem(mCurItem - 1, true);
+ return true;
+ }
+ return false;
+ }
+
+ boolean pageForward() {
+ if (mAdapter != null && mCurItem < (mAdapter.getCount() - 1)) {
+ setCurrentItem(mCurItem + 1, true);
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * We only want the current page that is being shown to be focusable.
+ */
+ @Override
+ public void addFocusables(ArrayList
- * 描述
+ * 埋点业务接口
*/
@Keep
public interface IMogoAnalytics extends IProvider {
diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/imageloader/IMogoImageLoaderListener.java b/services/mogo-service-api/src/main/java/com/mogo/service/imageloader/IMogoImageLoaderListener.java
index 4424ae0c62..3841dab2f3 100644
--- a/services/mogo-service-api/src/main/java/com/mogo/service/imageloader/IMogoImageLoaderListener.java
+++ b/services/mogo-service-api/src/main/java/com/mogo/service/imageloader/IMogoImageLoaderListener.java
@@ -8,18 +8,28 @@ import androidx.annotation.Keep;
* @author congtaowang
* @since 2019-12-23
*
- * 图片下载接口
+ * 图片加载接口
*/
@Keep
public interface IMogoImageLoaderListener {
+ /**
+ * 开始加载
+ */
@Keep
void onStart();
// void onProcess( int completedSize, int totalSize );
+
+ /**
+ * 加载完成
+ */
@Keep
void onCompleted( Bitmap bitmap );
+ /**
+ * 加载失败
+ */
@Keep
void onFailure( Exception e );
}
\ No newline at end of file
diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/imageloader/IMogoImageloader.java b/services/mogo-service-api/src/main/java/com/mogo/service/imageloader/IMogoImageloader.java
index ed4b0b81e5..494cb542ba 100644
--- a/services/mogo-service-api/src/main/java/com/mogo/service/imageloader/IMogoImageloader.java
+++ b/services/mogo-service-api/src/main/java/com/mogo/service/imageloader/IMogoImageloader.java
@@ -10,29 +10,66 @@ import com.alibaba.android.arouter.facade.template.IProvider;
* @author congtaowang
* @since 2019-12-23
*
- * 图片接口
+ * 图片接口,使用
*/
@Keep
public interface IMogoImageloader extends IProvider {
- @Keep
- void init( Context context );
-
+ /**
+ * 加载图片
+ *
+ * @param url 图片地址
+ * @param imageView 特定的图片控件
+ */
@Keep
void displayImage( String url, MogoImageView imageView );
+ /**
+ * 加载图片
+ *
+ * @param url 图片地址
+ * @param imageView 图片控件
+ * @param width 图片宽度
+ * @param height 图片高度
+ */
@Keep
void displayImage( String url, MogoImageView imageView, int width, int height );
+ /**
+ * 加载图片
+ *
+ * @param url 图片地址
+ * @param imageView 图片控件
+ * @param width 图片宽度
+ * @param height 图片高度
+ * @param listener 加载回调
+ */
@Keep
void displayImage( String url, MogoImageView imageView, int width, int height, final IMogoImageLoaderListener listener );
+ /**
+ * 加载图片
+ *
+ * @param url 图片地址
+ * @param imageView 图片控件
+ * @param listener 加载回调
+ */
@Keep
void displayImage( String url, MogoImageView imageView, final IMogoImageLoaderListener listener );
+ /**
+ * 下载图片
+ *
+ * @param context
+ * @param url 图片地址
+ * @param listener 下载回调
+ */
@Keep
void downloadImage( Context context, String url, IMogoImageLoaderListener listener );
+ /**
+ * 请勿调用
+ */
@Keep
void destroy();
}
diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/map/IMogoMapService.java b/services/mogo-service-api/src/main/java/com/mogo/service/map/IMogoMapService.java
index 53e452cb68..1cce47013f 100644
--- a/services/mogo-service-api/src/main/java/com/mogo/service/map/IMogoMapService.java
+++ b/services/mogo-service-api/src/main/java/com/mogo/service/map/IMogoMapService.java
@@ -3,6 +3,7 @@ package com.mogo.service.map;
import android.content.Context;
import com.alibaba.android.arouter.facade.template.IProvider;
+import com.mogo.map.listener.IMogoHosListenerRegister;
import com.mogo.map.listener.IMogoMapListener;
import com.mogo.map.listener.IMogoMapListenerRegister;
import com.mogo.map.location.IMogoLocationClient;
@@ -21,9 +22,9 @@ import com.mogo.map.uicontroller.IMogoMapUIController;
* @author congtaowang
* @since 2019-12-18
*
- * 地图对外地接口
+ * 地图对外接口
*/
-public interface IMogoMapService extends IProvider, IMogoMapListenerRegister, IMogoNaviListenerRegister {
+public interface IMogoMapService extends IProvider {
/**
* 获取定位服务实例,全局唯一
@@ -33,6 +34,14 @@ public interface IMogoMapService extends IProvider, IMogoMapListenerRegister, IM
*/
IMogoLocationClient getSingletonLocationClient( Context context );
+ /**
+ * 获取定位服务实例
+ *
+ * @param context
+ * @return 定位实例
+ */
+ IMogoLocationClient getLocationClient( Context context );
+
/**
* 获取关键字搜索地址服务
*
@@ -50,30 +59,6 @@ public interface IMogoMapService extends IProvider, IMogoMapListenerRegister, IM
*/
IMogoGeoSearch getGeoSearch( Context context );
- /**
- * 注册地图事件,各业务模块不用关注
- *
- * @param listener 回调事件
- */
- void registerHostMapListener( IMogoMapListener listener );
-
- /**
- * 反注册注册地图事件,各业务模块不用关注
- */
- void unregisterHostMapListener();
-
- /**
- * 注册导航回调,各业务模块不用关注
- *
- * @param listener 回调函数
- */
- void registerHostNaviListener( IMogoNaviListener listener );
-
- /**
- * 注销导航回调,各业务模块不用关注
- */
- void unregisterHostNaviListener();
-
/**
* poi搜索服务
*
@@ -104,4 +89,11 @@ public interface IMogoMapService extends IProvider, IMogoMapListenerRegister, IM
* @return
*/
IMogoMapUIController getMapUIController();
+
+ /**
+ * 主模块监听注册
+ *
+ * @return
+ */
+ IMogoHosListenerRegister getHostListenerRegister();
}
diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/module/IMogoModuleLifecycle.java b/services/mogo-service-api/src/main/java/com/mogo/service/module/IMogoModuleLifecycle.java
index 66abf375ac..eaad44faa9 100644
--- a/services/mogo-service-api/src/main/java/com/mogo/service/module/IMogoModuleLifecycle.java
+++ b/services/mogo-service-api/src/main/java/com/mogo/service/module/IMogoModuleLifecycle.java
@@ -9,7 +9,7 @@ package com.mogo.service.module;
public interface IMogoModuleLifecycle {
/**
- * 卡片在最前面,可操作地图
+ * 当前显示的卡片
*/
void onPerform();
diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/module/IMogoModuleProvider.java b/services/mogo-service-api/src/main/java/com/mogo/service/module/IMogoModuleProvider.java
index 6587787850..9ecd75fce0 100644
--- a/services/mogo-service-api/src/main/java/com/mogo/service/module/IMogoModuleProvider.java
+++ b/services/mogo-service-api/src/main/java/com/mogo/service/module/IMogoModuleProvider.java
@@ -9,6 +9,7 @@ import androidx.fragment.app.Fragment;
import com.alibaba.android.arouter.facade.template.IProvider;
import com.mogo.map.listener.IMogoMapListener;
+import com.mogo.map.location.IMogoLocationListener;
import com.mogo.map.navi.IMogoNaviListener;
/**
@@ -20,12 +21,12 @@ import com.mogo.map.navi.IMogoNaviListener;
public interface IMogoModuleProvider extends IProvider {
/**
- * fragment 提供者
+ * 模块类型为fragment
*/
int TYPE_FRAGMENT = 1;
/**
- * view 提供者
+ * 模块类型为view
*/
int TYPE_VIEW = 2;
@@ -46,7 +47,7 @@ public interface IMogoModuleProvider extends IProvider {
View createView( Context context );
/**
- * 唯一标识
+ * 模块唯一标识
*
* @return
*/
@@ -83,4 +84,11 @@ public interface IMogoModuleProvider extends IProvider {
* @return
*/
IMogoNaviListener getNaviListener();
+
+ /**
+ * 定位变化监听:此接口接受地图定位信息
+ *
+ * @return
+ */
+ IMogoLocationListener getLocationListener();
}
diff --git a/services/mogo-service/build.gradle b/services/mogo-service/build.gradle
index fe2fd5cbaa..908e35385b 100644
--- a/services/mogo-service/build.gradle
+++ b/services/mogo-service/build.gradle
@@ -2,15 +2,13 @@ apply plugin: 'com.android.library'
apply plugin: 'com.alibaba.arouter'
android {
- compileSdkVersion 29
- buildToolsVersion "29.0.2"
-
-
+ compileSdkVersion rootProject.ext.android.compileSdkVersion
+ buildToolsVersion rootProject.ext.android.buildToolsVersion
defaultConfig {
- minSdkVersion 19
- targetSdkVersion 29
- versionCode 1
- versionName "1.0"
+ minSdkVersion rootProject.ext.android.minSdkVersion
+ targetSdkVersion rootProject.ext.android.targetSdkVersion
+ versionCode Integer.valueOf(VERSION_CODE)
+ versionName getValueFromRootProperties("${project.name.replace("-", "_").toUpperCase()}_VERSION")
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles 'consumer-rules.pro'
@@ -40,11 +38,21 @@ android {
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
- api project(":libraries:mogo-map")
- implementation project(":libraries:mogo-map-api")
- implementation project(":foudations:mogo-utils")
- implementation project(":foudations:mogo-commons")
- implementation project(':services:mogo-service-api')
implementation rootProject.ext.dependencies.arouter
annotationProcessor rootProject.ext.dependencies.aroutercompiler
+ if (Boolean.valueOf(RELEASE)) {
+ api rootProject.ext.dependencies.mogomap
+ implementation rootProject.ext.dependencies.mogomapapi
+ implementation rootProject.ext.dependencies.mogoutils
+ implementation rootProject.ext.dependencies.mogocommons
+ implementation rootProject.ext.dependencies.mogoserviceapi
+ } else {
+ api project(":libraries:mogo-map")
+ implementation project(":libraries:mogo-map-api")
+ implementation project(":foudations:mogo-utils")
+ implementation project(":foudations:mogo-commons")
+ implementation project(':services:mogo-service-api')
+ }
}
+
+apply from: new File(rootProject.rootDir, "gradle/upload.gradle").toString()
diff --git a/services/mogo-service/gradle.properties b/services/mogo-service/gradle.properties
new file mode 100644
index 0000000000..48b922dac7
--- /dev/null
+++ b/services/mogo-service/gradle.properties
@@ -0,0 +1,3 @@
+GROUP=com.mogo.service
+POM_ARTIFACT_ID=mogo-service
+VERSION_CODE=1
diff --git a/services/mogo-service/src/main/java/com/mogo/service/impl/map/MogoMapService.java b/services/mogo-service/src/main/java/com/mogo/service/impl/map/MogoMapService.java
index f189f3f55e..b3bdbffbea 100644
--- a/services/mogo-service/src/main/java/com/mogo/service/impl/map/MogoMapService.java
+++ b/services/mogo-service/src/main/java/com/mogo/service/impl/map/MogoMapService.java
@@ -11,13 +11,11 @@ import com.mogo.map.MogoMapUIController;
import com.mogo.map.MogoMarkerManager;
import com.mogo.map.MogoNavi;
import com.mogo.map.MogoPoiSearch;
-import com.mogo.map.listener.IMogoMapListener;
-import com.mogo.map.listener.MogoMapListenerHandler;
+import com.mogo.map.listener.IMogoHosListenerRegister;
+import com.mogo.map.listener.MogoHosListenerRegister;
import com.mogo.map.location.IMogoLocationClient;
import com.mogo.map.marker.IMogoMarkerManager;
import com.mogo.map.navi.IMogoNavi;
-import com.mogo.map.navi.IMogoNaviListener;
-import com.mogo.map.navi.MogoNaviListenerHandler;
import com.mogo.map.search.geo.IMogoGeoSearch;
import com.mogo.map.search.inputtips.IMogoInputtipsSearch;
import com.mogo.map.search.inputtips.query.MogoInputtipsQuery;
@@ -41,6 +39,11 @@ public class MogoMapService implements IMogoMapService {
return MogoLocationClient.getInstance( context );
}
+ @Override
+ public IMogoLocationClient getLocationClient( Context context ) {
+ return new MogoLocationClient( context );
+ }
+
@Override
public IMogoInputtipsSearch getInputtipsSearch( Context context, MogoInputtipsQuery query ) {
return new MogoInputtipsSearch( context, query );
@@ -51,16 +54,6 @@ public class MogoMapService implements IMogoMapService {
return new MogoGeoSearch( context );
}
- @Override
- public void registerHostMapListener( IMogoMapListener listener ) {
- MogoMapListenerHandler.getInstance().registerHostMapListener( listener );
- }
-
- @Override
- public void unregisterHostMapListener() {
- MogoMapListenerHandler.getInstance().unregisterHostMapListener();
- }
-
@Override
public IMogoPoiSearch getPoiSearch( Context context, MogoPoiSearchQuery query ) {
return new MogoPoiSearch( context, query );
@@ -72,8 +65,8 @@ public class MogoMapService implements IMogoMapService {
}
@Override
- public IMogoMarkerManager getMarkerManager(Context context) {
- return MogoMarkerManager.getInstance(context);
+ public IMogoMarkerManager getMarkerManager( Context context ) {
+ return MogoMarkerManager.getInstance( context );
}
@Override
@@ -82,13 +75,8 @@ public class MogoMapService implements IMogoMapService {
}
@Override
- public void registerHostNaviListener( IMogoNaviListener listener ) {
- MogoNaviListenerHandler.getInstance().registerHostNaviListener( listener );
- }
-
- @Override
- public void unregisterHostNaviListener() {
- MogoNaviListenerHandler.getInstance().unregisterHostNaviListener();
+ public IMogoHosListenerRegister getHostListenerRegister() {
+ return MogoHosListenerRegister.getInstance();
}
@Override
diff --git a/settings.gradle b/settings.gradle
index a95ecf51ee..13ad5e7faf 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -9,6 +9,8 @@ include ':modules:mogo-module-map'
include ':modules:mogo-module-common'
include ':modules:mogo-module-main'
include ':demo:demo-module-map'
+include ':demo:demo-module-map2'
include ':libraries:map-amap'
//include ':libraries:map-baidu'
include ':libraries:mogo-map-api'
+include ':modules:mogo-module-apps'
diff --git a/upload.sh b/upload.sh
new file mode 100755
index 0000000000..a9403fc7d3
--- /dev/null
+++ b/upload.sh
@@ -0,0 +1,14 @@
+#!/bin/bash
+
+./gradlew :foudations:mogo-utils:clean :foudations:mogo-utils:uploadArchives
+./gradlew :foudations:mogo-commons:clean :foudations:mogo-commons:uploadArchives
+./gradlew :libraries:mogo-map-api:clean :libraries:mogo-map-api:uploadArchives
+./gradlew :services:mogo-service-api:clean :services:mogo-service-api:uploadArchives
+./gradlew :libraries:map-amap:clean :libraries:map-amap:uploadArchives
+./gradlew :libraries:mogo-map:clean :libraries:mogo-map:uploadArchives
+./gradlew :services:mogo-service:clean :services:mogo-service:uploadArchives
+./gradlew :modules:mogo-module-common:clean :modules:mogo-module-common:uploadArchives
+./gradlew :modules:mogo-module-map:clean :modules:mogo-module-map:uploadArchives
+./gradlew :demo:demo-module-map:clean :demo:demo-module-map:uploadArchives
+./gradlew :modules:mogo-module-apps:clean :modules:mogo-module-apps:uploadArchives
+./gradlew :modules:mogo-module-main:clean :modules:mogo-module-main:uploadArchives
\ No newline at end of file