diff --git a/app/build.gradle b/app/build.gradle index 4d3fc0e9b1..afb298b173 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,18 @@ 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 + implementation rootProject.ext.dependencies.modulecommon + } else { + implementation project(':modules:mogo-module-main') + implementation project(':foudations:mogo-commons') + implementation project(':modules:mogo-module-common') + implementation project(':demo:demo-module-map') + implementation project(':demo:demo-module-map2') + } } diff --git a/app/src/main/java/com/mogo/launcher/MogoApplication.java b/app/src/main/java/com/mogo/launcher/MogoApplication.java index 906b5259e6..2754e27346 100644 --- a/app/src/main/java/com/mogo/launcher/MogoApplication.java +++ b/app/src/main/java/com/mogo/launcher/MogoApplication.java @@ -1,11 +1,13 @@ package com.mogo.launcher; -import android.app.Application; import android.content.Context; import androidx.multidex.MultiDex; import com.mogo.commons.AbsMogoApplication; +import com.mogo.demo.module.map.DemoConstants; +import com.mogo.demo.module.map2.Demo2Constants; +import com.mogo.module.common.MogoModulePaths; /** * @author congtaowang @@ -24,5 +26,7 @@ public class MogoApplication extends AbsMogoApplication { protected void attachBaseContext( Context base ) { super.attachBaseContext( base ); MultiDex.install( base ); + MogoModulePaths.addModule( DemoConstants.TAG ); + MogoModulePaths.addModule( Demo2Constants.TAG ); } } 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 1282f4dd36..0bffaa2dd2 100644 --- a/config.gradle +++ b/config.gradle @@ -1,57 +1,57 @@ ext { - android = [ - applicationId: "com.mogo.launcher", - compileSdkVersion: 29, - buildToolsVersion: "29.0.2", - minSdkVersion: 19, - targetSdkVersion: 22, - versionCode: 1, - versionName: "1.0.0", - ] + android = [ + applicationId : "com.mogo.launcher", + compileSdkVersion: 29, + buildToolsVersion: "29.0.2", + minSdkVersion : 19, + targetSdkVersion : 22, + versionCode : 1, + versionName : "1.0.0", + ] - dependencies = [ - // androidx - androidxappcompat: "androidx.appcompat:appcompat:1.0.2", - androidxconstraintlayout: "androidx.constraintlayout:constraintlayout:1.1.3", - androidxmultidex: "androidx.multidex:multidex:2.0.1", - // 测试 - junit: "junit:junit:4.12", - androidxjunit: "androidx.test.ext:junit:1.1.0", - androidxespressocore: "androidx.test.espresso:espresso-core:3.1.1", - // 地图 - amapnavi3dmap: "com.amap.api:navi-3dmap:latest.integration", - amapsearch: "com.amap.api:search:latest.integration", - amaplocation: "com.amap.api:location:latest.integration", - // json 转换 - gson: "com.google.code.gson:gson:2.8.4", - // 内存泄漏检测 - debugleakcanary: "com.squareup.leakcanary:leakcanary-android:1.6.1", - releaseleakcanary: "com.squareup.leakcanary:leakcanary-android-no-op:1.6.1", - testleakcanary: "com.squareup.leakcanary:leakcanary-android-no-op:1.6.1", - //rxJava - rxjava: "io.reactivex.rxjava2:rxjava:2.2.2", - rxandroid: "io.reactivex.rxjava2:rxandroid:2.1.0", - // arouter - arouter: "com.alibaba:arouter-api:1.5.0", - aroutercompiler: "com.alibaba:arouter-compiler:1.2.2", - // glide - glide: 'com.github.bumptech.glide:glide:4.8.0', - glideokhttp3: 'com.github.bumptech.glide:okhttp3-integration:4.8.0', - glideanno: 'com.github.bumptech.glide:annotations:4.8.0', - glidecompiler: 'com.github.bumptech.glide:compiler:4.8.0', - supportannos: "com.android.support:support-annotations:28.0.0", - // fresco - fresco: 'com.facebook.fresco:fresco:1.1.0', - // 公司服务 - 语音 - aiassist: "com.zhidaoauto.common:service:1.0.4", - // 公司服务 - 埋点 - analytics: "com.elegant.analytics:analytics:1.1.19", + dependencies = [ + // androidx + androidxappcompat : "androidx.appcompat:appcompat:1.0.2", + androidxconstraintlayout: "androidx.constraintlayout:constraintlayout:1.1.3", + androidxmultidex : "androidx.multidex:multidex:2.0.1", + // 测试 + junit : "junit:junit:4.12", + androidxjunit : "androidx.test.ext:junit:1.1.0", + androidxespressocore : "androidx.test.espresso:espresso-core:3.1.1", + // 地图 + amapnavi3dmap : "com.amap.api:navi-3dmap:latest.integration", + amapsearch : "com.amap.api:search:latest.integration", + amaplocation : "com.amap.api:location:latest.integration", + // json 转换 + gson : "com.google.code.gson:gson:2.8.4", + // 内存泄漏检测 + debugleakcanary : "com.squareup.leakcanary:leakcanary-android:1.6.1", + releaseleakcanary : "com.squareup.leakcanary:leakcanary-android-no-op:1.6.1", + testleakcanary : "com.squareup.leakcanary:leakcanary-android-no-op:1.6.1", + //rxJava + rxjava : "io.reactivex.rxjava2:rxjava:2.2.2", + rxandroid : "io.reactivex.rxjava2:rxandroid:2.1.0", + // arouter + arouter : "com.alibaba:arouter-api:1.5.0", + aroutercompiler : "com.alibaba:arouter-compiler:1.2.2", + // glide + glide : 'com.github.bumptech.glide:glide:4.8.0', + glideokhttp3 : 'com.github.bumptech.glide:okhttp3-integration:4.8.0', + glideanno : 'com.github.bumptech.glide:annotations:4.8.0', + glidecompiler : 'com.github.bumptech.glide:compiler:4.8.0', + supportannos : "com.android.support:support-annotations:28.0.0", + // fresco + fresco : 'com.facebook.fresco:fresco:1.1.0', + // 公司服务 - 语音 + aiassist : "com.zhidaoauto.common:service:1.0.4", + // 公司服务 - 埋点 + analytics : "com.elegant.analytics:analytics:1.1.19", - // retrofit - retrofit: "com.squareup.retrofit2:retrofit:2.3.0", - retrofitadapter: "com.squareup.retrofit2:adapter-rxjava:2.1.0", - retrofitconvertergson: "com.squareup.retrofit2:converter-gson:2.3.0", - retrofitconverterscalars: "com.squareup.retrofit2:converter-scalars:2.1.0", + // retrofit + retrofit : "com.squareup.retrofit2:retrofit:2.3.0", + retrofitadapter : "com.squareup.retrofit2:adapter-rxjava:2.1.0", + retrofitconvertergson : "com.squareup.retrofit2:converter-gson:2.3.0", + retrofitconverterscalars: "com.squareup.retrofit2:converter-scalars:2.1.0", // leakcanary leakcanary: 'com.squareup.leakcanary:leakcanary-android:1.5.4', @@ -62,7 +62,30 @@ ext { roomAnnotationProcessor: 'android.arch.persistence.room:compiler:1.1.1', // rxjava2 with room - roomRxjava: "android.arch.persistence.room:rxjava2:1.1.1" + roomRxjava: "android.arch.persistence.room:rxjava2:1.1.1", - ] + + // 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-demo2:${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..9f9da9fd52 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; @@ -15,30 +12,21 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import com.alibaba.android.arouter.launcher.ARouter; import com.mogo.commons.mvp.IView; import com.mogo.commons.mvp.MvpFragment; import com.mogo.commons.mvp.Presenter; import com.mogo.map.MogoLatLng; import com.mogo.map.listener.IMogoMapListener; import com.mogo.map.location.IMogoLocationListener; -import com.mogo.map.location.IMogoLocationClient; import com.mogo.map.location.MogoLocation; import com.mogo.map.marker.IMogoMarker; import com.mogo.map.marker.IMogoMarkerClickListener; -import com.mogo.map.marker.IMogoMarkerManager; import com.mogo.map.marker.MogoMarkerOptions; import com.mogo.map.model.MogoPoi; -import com.mogo.map.navi.IMogoNavi; import com.mogo.map.search.geo.MogoPoiItem; -import com.mogo.map.search.poisearch.IMogoPoiSearch; import com.mogo.map.search.poisearch.IMogoPoiSearchListener; import com.mogo.map.search.poisearch.MogoPoiResult; -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.map.IMogoMapService; import com.mogo.service.module.IMogoModuleLifecycle; import com.mogo.utils.TipToast; import com.mogo.utils.logger.Logger; @@ -67,6 +55,8 @@ public class DemoCardViewFragment extends MvpFragment< IView, Presenter< IView > private Button mAddMarker; private Button mAddMarkers; + private static IMogoMarker mLastClickedMarker; + private Bitmap mMarkerIcon; private Bitmap mClickedMarkerIcon; private TextView mLocInfo; @@ -74,16 +64,10 @@ public class DemoCardViewFragment extends MvpFragment< IView, Presenter< IView > 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 DemoInfoWindowAdapter mDemoInfoWindowAdapter; + private MogoLocation mLocation; + + private int position = -1; @Override protected int getLayoutId() { @@ -93,17 +77,12 @@ public class DemoCardViewFragment extends MvpFragment< IView, Presenter< IView > @Override protected void initViews() { + position = getArguments().getInt( "position" ); + mNaviMode = findViewById( R.id.demo_module_id_navi_mode ); - mMapService = ( IMogoMapService ) ARouter.getInstance().build( MogoServicePaths.PATH_SERVICES_MAP ).navigation( getContext() ); - mPoiSearch = mMapService.getPoiSearch( getContext(), new MogoPoiSearchQuery() ); - mPoiSearch.setPoiSearchListener( this ); - mLocationClient = mMapService.getSingletonLocationClient( getContext() ); - mLocationClient.addLocationListener( this ); - mMarkerManager = mMapService.getMarkerManager( getContext() ); - mNavi = mMapService.getNavi( getContext() ); - mMapUIController = mMapService.getMapUIController(); - + ServiceHandler.getPoiSearch().setPoiSearchListener( this ); + mLocation = ServiceHandler.getLocationClient().getLastKnowLocation(); m2D3D = findViewById( R.id.demo_module_id_2d3d ); mLocInfo = findViewById( R.id.demo_module_id_loc_info ); @@ -112,12 +91,12 @@ public class DemoCardViewFragment extends MvpFragment< IView, Presenter< IView > new View.OnClickListener() { @Override public void onClick( View v ) { - mLocationClient.start( 1_000L ); + ServiceHandler.getLocationClient().start( 4_000L ); } } ); - mDemoInfoWindowAdapter = new DemoInfoWindowAdapter( getContext(), mNavi ); + mDemoInfoWindowAdapter = new DemoInfoWindowAdapter( getContext(), ServiceHandler.getNavi(), ServiceHandler.getImageloader() ); mMarkerIcon = BitmapFactory.decodeResource( getResources(), R.drawable.ic_search_poi_location ); mClickedMarkerIcon = BitmapFactory.decodeResource( getResources(), R.drawable.ic_search_choice_point ); @@ -128,8 +107,9 @@ 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 ); + IMogoMarker marker = ServiceHandler.getMarkerManager().addMarker( DemoConstants.TAG, options ); marker.setInfoWindowAdapter( mDemoInfoWindowAdapter ); marker.setOnMarkerClickListener( DemoCardViewFragment.this ); } @@ -142,12 +122,17 @@ 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 ); + List< IMogoMarker > iMogoMarkers = ServiceHandler.getMarkerManager().addMarkers( DemoConstants.TAG, optionsList, true ); for ( IMogoMarker iMogoMarker : iMogoMarkers ) { iMogoMarker.setInfoWindowAdapter( mDemoInfoWindowAdapter ); iMogoMarker.setOnMarkerClickListener( DemoCardViewFragment.this ); @@ -158,7 +143,7 @@ public class DemoCardViewFragment extends MvpFragment< IView, Presenter< IView > findViewById( R.id.demo_module_id_clear ).setOnClickListener( new View.OnClickListener() { @Override public void onClick( View v ) { - mMarkerManager.removeMarkers( DemoConstants.TAG ); + ServiceHandler.getMarkerManager().removeMarkers( DemoConstants.TAG ); } } ); @@ -168,7 +153,7 @@ public class DemoCardViewFragment extends MvpFragment< IView, Presenter< IView > @Override public void onClick( View v ) { - mMapUIController.changeMapMode( ui = ui.next() ); + ServiceHandler.getMapUIController().changeMapMode( ui = ui.next() ); m2D3D.setText( ui.toString() ); } } ); @@ -176,21 +161,21 @@ 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(); + ServiceHandler.getMapUIController().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() ); + ServiceHandler.getNavi().startNavi( !mNaviMode.isChecked() ); } } ); findViewById( R.id.demo_module_id_stop_navi ).setOnClickListener( new View.OnClickListener() { @Override public void onClick( View v ) { - mNavi.stopNavi(); + ServiceHandler.getNavi().stopNavi(); } } ); @@ -200,7 +185,7 @@ public class DemoCardViewFragment extends MvpFragment< IView, Presenter< IView > @Override public void onClick( View v ) { - mMapUIController.setTrafficEnabled( enable = !enable ); + ServiceHandler.getMapUIController().setTrafficEnabled( enable = !enable ); } } ); @@ -208,7 +193,7 @@ public class DemoCardViewFragment extends MvpFragment< IView, Presenter< IView > @Override public void onClick( View v ) { - mMapUIController.changeZoom( true ); + ServiceHandler.getMapUIController().changeZoom( true ); } } ); @@ -216,7 +201,7 @@ public class DemoCardViewFragment extends MvpFragment< IView, Presenter< IView > @Override public void onClick( View v ) { - mMapUIController.changeZoom( false ); + ServiceHandler.getMapUIController().changeZoom( false ); } } ); @@ -224,7 +209,7 @@ public class DemoCardViewFragment extends MvpFragment< IView, Presenter< IView > @Override public void onClick( View v ) { - mMapUIController.changeMapMode( EnumMapUI.Type_Light ); + ServiceHandler.getMapUIController().changeMapMode( EnumMapUI.Type_Light ); } } ); @@ -232,7 +217,7 @@ public class DemoCardViewFragment extends MvpFragment< IView, Presenter< IView > @Override public void onClick( View v ) { - mMapUIController.changeMapMode( EnumMapUI.Type_Night ); + ServiceHandler.getMapUIController().changeMapMode( EnumMapUI.Type_Night ); } } ); @@ -240,7 +225,7 @@ public class DemoCardViewFragment extends MvpFragment< IView, Presenter< IView > @Override public void onClick( View v ) { - mMapUIController.displayOverview(); + ServiceHandler.getMapUIController().displayOverview(); } } ); @@ -248,7 +233,15 @@ public class DemoCardViewFragment extends MvpFragment< IView, Presenter< IView > @Override public void onClick( View v ) { - mMapUIController.recoverLockMode(); + ServiceHandler.getMapUIController().recoverLockMode(); + } + } ); + + ServiceHandler.getLocationClient().addLocationListener( new IMogoLocationListener() { + @Override + public void onLocationChanged( MogoLocation location ) { + mLocation = location; + Logger.d( TAG, "demo模块定位,定位间隔4s" ); } } ); } @@ -261,13 +254,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 +273,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无效" ); } @@ -304,7 +297,7 @@ public class DemoCardViewFragment extends MvpFragment< IView, Presenter< IView > if ( poi != null ) { TipToast.shortTip( poi.getName() ); } - mPoiSearch.searchPOIIdAsyn( poi.getPoiId() ); + ServiceHandler.getPoiSearch().searchPOIIdAsyn( poi.getPoiId() ); } @Override @@ -322,7 +315,7 @@ public class DemoCardViewFragment extends MvpFragment< IView, Presenter< IView > if ( mPoiMarker != null ) { mPoiMarker.destroy(); } - mPoiMarker = mMarkerManager.addMarker( DemoConstants.TAG, new MogoMarkerOptions() + mPoiMarker = ServiceHandler.getMarkerManager().addMarker( DemoConstants.TAG, new MogoMarkerOptions() .longitude( item.getPoint().lng ) .latitude( item.getPoint().lat ) .icon( mMarkerIcon ) ); @@ -335,8 +328,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,18 +356,9 @@ public class DemoCardViewFragment extends MvpFragment< IView, Presenter< IView > @Override public void onDestroyView() { + Logger.w( TAG, "onDestroyView position=" + position ); 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; + ServiceHandler.getLocationClient().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..12f06d2fea 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 @@ -19,21 +31,24 @@ import com.mogo.service.module.IMogoModuleProvider; *
* 描述 */ -@Route( path = MogoModulePaths.PATH_MODULE_DEMO ) +@Route( path = DemoConstants.TAG ) 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; } @Override public void init( Context context ) { - + ServiceHandler.init( context ); } @Override @@ -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/DemoConstants.java b/demo/demo-module-map/src/main/java/com/mogo/demo/module/map/DemoConstants.java index ab82c11c7f..3178029fde 100644 --- a/demo/demo-module-map/src/main/java/com/mogo/demo/module/map/DemoConstants.java +++ b/demo/demo-module-map/src/main/java/com/mogo/demo/module/map/DemoConstants.java @@ -10,5 +10,5 @@ import com.mogo.module.common.MogoModulePaths; */ public class DemoConstants { - public static final String TAG = MogoModulePaths.PATH_MODULE_DEMO; + public static final String TAG = "/demo/ui"; } 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/java/com/mogo/demo/module/map/ServiceHandler.java b/demo/demo-module-map/src/main/java/com/mogo/demo/module/map/ServiceHandler.java new file mode 100644 index 0000000000..3eff1914fb --- /dev/null +++ b/demo/demo-module-map/src/main/java/com/mogo/demo/module/map/ServiceHandler.java @@ -0,0 +1,73 @@ +package com.mogo.demo.module.map; + +import android.content.Context; + +import com.alibaba.android.arouter.launcher.ARouter; +import com.mogo.map.location.IMogoLocationClient; +import com.mogo.map.marker.IMogoMarker; +import com.mogo.map.marker.IMogoMarkerManager; +import com.mogo.map.navi.IMogoNavi; +import com.mogo.map.search.poisearch.IMogoPoiSearch; +import com.mogo.map.search.poisearch.query.MogoPoiSearchQuery; +import com.mogo.map.uicontroller.IMogoMapUIController; +import com.mogo.service.MogoServicePaths; +import com.mogo.service.imageloader.IMogoImageloader; +import com.mogo.service.map.IMogoMapService; + +/** + * @author congtaowang + * @since 2019-12-30 + *
+ * 持有服务接口实例
+ */
+public class ServiceHandler {
+
+ private static IMogoMapService mMapService;
+
+ private static IMogoPoiSearch mPoiSearch;
+ private static IMogoLocationClient mLocationClient;
+ private static IMogoMarkerManager mMarkerManager;
+ private static IMogoNavi mNavi;
+ private static IMogoMapUIController mMapUIController;
+
+ private static IMogoImageloader mImageloader;
+
+ public static void init( Context context ) {
+ mMapService = ( IMogoMapService ) ARouter.getInstance().build( MogoServicePaths.PATH_SERVICES_MAP ).navigation( context );
+ mMapService = ( IMogoMapService ) ARouter.getInstance().build( MogoServicePaths.PATH_SERVICES_MAP ).navigation( context );
+ mImageloader = ( IMogoImageloader ) ARouter.getInstance().build( MogoServicePaths.PATH_UTILS_IMAGE_LOADER ).navigation( context );
+ mPoiSearch = mMapService.getPoiSearch( context, new MogoPoiSearchQuery() );
+ mLocationClient = mMapService.getLocationClient( context );
+ mMarkerManager = mMapService.getMarkerManager( context );
+ mNavi = mMapService.getNavi( context );
+ mMapUIController = mMapService.getMapUIController();
+ }
+
+ public static IMogoMapService getMapService() {
+ return mMapService;
+ }
+
+ public static IMogoPoiSearch getPoiSearch() {
+ return mPoiSearch;
+ }
+
+ public static IMogoLocationClient getLocationClient() {
+ return mLocationClient;
+ }
+
+ public static IMogoMarkerManager getMarkerManager() {
+ return mMarkerManager;
+ }
+
+ public static IMogoNavi getNavi() {
+ return mNavi;
+ }
+
+ public static IMogoMapUIController getMapUIController() {
+ return mMapUIController;
+ }
+
+ public static IMogoImageloader getImageloader() {
+ return mImageloader;
+ }
+}
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 Demo2InfoWindowAdapter mDemoInfoWindowAdapter; + private MogoLocation mLocation; + + private int position = -1; + + @Override + protected int getLayoutId() { + return R.layout.demo2_module_card_view; + } + + @Override + protected void initViews() { + + position = getArguments().getInt( "position" ); + + mNaviMode = findViewById( R.id.demo_module_id_navi_mode ); + + Service2Handler.getPoiSearch().setPoiSearchListener( this ); + mLocation = Service2Handler.getLocationClient().getLastKnowLocation(); + + 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 ) { + Service2Handler.getLocationClient().start( 4_000L ); + } + } + ); + + mDemoInfoWindowAdapter = new Demo2InfoWindowAdapter( getContext(), Service2Handler.getNavi(), Service2Handler.getImageloader() ); + + 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 = Service2Handler.getMarkerManager().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 = Service2Handler.getMarkerManager().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 ) { + Service2Handler.getMarkerManager().removeMarkers( Demo2Constants.TAG ); + } + } ); + + m2D3D.setOnClickListener( new View.OnClickListener() { + + private EnumMapUI ui = EnumMapUI.NorthUP_2D; + + @Override + public void onClick( View v ) { + Service2Handler.getMapUIController().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 ) { + Service2Handler.getMapUIController().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 ) { + Service2Handler.getNavi().startNavi( !mNaviMode.isChecked() ); + } + } ); + + findViewById( R.id.demo_module_id_stop_navi ).setOnClickListener( new View.OnClickListener() { + @Override + public void onClick( View v ) { + Service2Handler.getNavi().stopNavi(); + } + } ); + + findViewById( R.id.demo_module_id_traffic ).setOnClickListener( new View.OnClickListener() { + + private boolean enable = true; + + @Override + public void onClick( View v ) { + Service2Handler.getMapUIController().setTrafficEnabled( enable = !enable ); + } + } ); + + findViewById( R.id.demo_module_id_zoom_in ).setOnClickListener( new View.OnClickListener() { + + @Override + public void onClick( View v ) { + Service2Handler.getMapUIController().changeZoom( true ); + } + } ); + + findViewById( R.id.demo_module_id_zoom_out ).setOnClickListener( new View.OnClickListener() { + + @Override + public void onClick( View v ) { + Service2Handler.getMapUIController().changeZoom( false ); + } + } ); + + findViewById( R.id.demo_module_id_day_light ).setOnClickListener( new View.OnClickListener() { + + @Override + public void onClick( View v ) { + Service2Handler.getMapUIController().changeMapMode( EnumMapUI.Type_Light ); + } + } ); + + findViewById( R.id.demo_module_id_day_night ).setOnClickListener( new View.OnClickListener() { + + @Override + public void onClick( View v ) { + Service2Handler.getMapUIController().changeMapMode( EnumMapUI.Type_Night ); + } + } ); + + findViewById( R.id.demo_module_id_display_overlay ).setOnClickListener( new View.OnClickListener() { + + @Override + public void onClick( View v ) { + Service2Handler.getMapUIController().displayOverview(); + } + } ); + + findViewById( R.id.demo_module_id_reverse_lock ).setOnClickListener( new View.OnClickListener() { + + @Override + public void onClick( View v ) { + Service2Handler.getMapUIController().recoverLockMode(); + } + } ); + + Service2Handler.getLocationClient().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() ); + } + Service2Handler.getPoiSearch().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 = Service2Handler.getMarkerManager().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 position=" + position ); + super.onDestroyView(); + getViewLifecycleOwner().getLifecycle().removeObserver( mPresenter ); + Service2Handler.getLocationClient().removeLocationListener( this ); + if ( mLastClickedMarker != null ) { + mLastClickedMarker.destroy(); + mLastClickedMarker = 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..720db4e029 --- /dev/null +++ b/demo/demo-module-map2/src/main/java/com/mogo/demo/module/map2/Demo2CardViewProvider.java @@ -0,0 +1,79 @@ +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.service.module.IMogoModuleLifecycle; +import com.mogo.service.module.IMogoModuleProvider; +import com.mogo.utils.logger.Logger; + +/** + * @author congtaowang + * @since 2019-12-24 + *
+ * 描述 + */ +@Route( path = Demo2Constants.TAG ) +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 ) { + Service2Handler.init( 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..27bf85a7eb --- /dev/null +++ b/demo/demo-module-map2/src/main/java/com/mogo/demo/module/map2/Demo2Constants.java @@ -0,0 +1,12 @@ +package com.mogo.demo.module.map2; + +/** + * @author congtaowang + * @since 2019-12-24 + *
+ * 描述 + */ +public class Demo2Constants { + + public static final String TAG = "/demo2/ui"; +} 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/java/com/mogo/demo/module/map2/Service2Handler.java b/demo/demo-module-map2/src/main/java/com/mogo/demo/module/map2/Service2Handler.java new file mode 100644 index 0000000000..3394c048dc --- /dev/null +++ b/demo/demo-module-map2/src/main/java/com/mogo/demo/module/map2/Service2Handler.java @@ -0,0 +1,72 @@ +package com.mogo.demo.module.map2; + +import android.content.Context; + +import com.alibaba.android.arouter.launcher.ARouter; +import com.mogo.map.location.IMogoLocationClient; +import com.mogo.map.marker.IMogoMarkerManager; +import com.mogo.map.navi.IMogoNavi; +import com.mogo.map.search.poisearch.IMogoPoiSearch; +import com.mogo.map.search.poisearch.query.MogoPoiSearchQuery; +import com.mogo.map.uicontroller.IMogoMapUIController; +import com.mogo.service.MogoServicePaths; +import com.mogo.service.imageloader.IMogoImageloader; +import com.mogo.service.map.IMogoMapService; + +/** + * @author congtaowang + * @since 2019-12-30 + *
+ * 持有服务接口实例
+ */
+public class Service2Handler {
+
+ private static IMogoMapService mMapService;
+
+ private static IMogoPoiSearch mPoiSearch;
+ private static IMogoLocationClient mLocationClient;
+ private static IMogoMarkerManager mMarkerManager;
+ private static IMogoNavi mNavi;
+ private static IMogoMapUIController mMapUIController;
+
+ private static IMogoImageloader mImageloader;
+
+ public static void init( Context context ) {
+ mMapService = ( IMogoMapService ) ARouter.getInstance().build( MogoServicePaths.PATH_SERVICES_MAP ).navigation( context );
+ mMapService = ( IMogoMapService ) ARouter.getInstance().build( MogoServicePaths.PATH_SERVICES_MAP ).navigation( context );
+ mImageloader = ( IMogoImageloader ) ARouter.getInstance().build( MogoServicePaths.PATH_UTILS_IMAGE_LOADER ).navigation( context );
+ mPoiSearch = mMapService.getPoiSearch( context, new MogoPoiSearchQuery() );
+ mLocationClient = mMapService.getLocationClient( context );
+ mMarkerManager = mMapService.getMarkerManager( context );
+ mNavi = mMapService.getNavi( context );
+ mMapUIController = mMapService.getMapUIController();
+ }
+
+ public static IMogoMapService getMapService() {
+ return mMapService;
+ }
+
+ public static IMogoPoiSearch getPoiSearch() {
+ return mPoiSearch;
+ }
+
+ public static IMogoLocationClient getLocationClient() {
+ return mLocationClient;
+ }
+
+ public static IMogoMarkerManager getMarkerManager() {
+ return mMarkerManager;
+ }
+
+ public static IMogoNavi getNavi() {
+ return mNavi;
+ }
+
+ public static IMogoMapUIController getMapUIController() {
+ return mMapUIController;
+ }
+
+ public static IMogoImageloader getImageloader() {
+ return mImageloader;
+ }
+}
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/MvpFragment.java b/foudations/mogo-commons/src/main/java/com/mogo/commons/mvp/MvpFragment.java
index 833bca9510..4d89489dd6 100644
--- a/foudations/mogo-commons/src/main/java/com/mogo/commons/mvp/MvpFragment.java
+++ b/foudations/mogo-commons/src/main/java/com/mogo/commons/mvp/MvpFragment.java
@@ -20,7 +20,7 @@ public abstract class MvpFragment< V extends IView, P extends Presenter< V > > e
private Context mContext;
protected P mPresenter;
- private View mRootView;
+ protected View mRootView;
@Override
public void onAttach( Context context ) {
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/javadoc.sh b/javadoc.sh
new file mode 100755
index 0000000000..b2b349fe7d
--- /dev/null
+++ b/javadoc.sh
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+
+
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/MogoMap.java b/libraries/mogo-map-api/src/main/java/com/mogo/map/MogoMap.java index 7571480782..b2c5986293 100644 --- a/libraries/mogo-map-api/src/main/java/com/mogo/map/MogoMap.java +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/MogoMap.java @@ -2,6 +2,8 @@ package com.mogo.map; import android.content.Context; +import com.mogo.utils.logger.Logger; + /** * @author congtaowang * @since 2019-12-20 @@ -9,6 +11,8 @@ import android.content.Context; * 描述 */ public class MogoMap { + + private static final String TAG = "MogoMap"; private IMogoMap mMap; private Context mContext; @@ -30,6 +34,7 @@ public class MogoMap { } public void init( Context context, IMogoMap map ) { + Logger.d( TAG, "init mogomap" ); this.mContext = context; this.mMap = map; } 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, + IMogoMarkerClickListener { - IMogoMapService mMogoMapService; - MogoModulesHandler mMogoModuleHandler; + private static final String TAG = "MainActivity"; + + private IMogoMapService mMogoMapService; + private MogoModulesHandler mMogoModuleHandler; + + private OrientedViewPager mCardsContainer; + private CardModulesAdapter mCardModulesAdapter; + + /** + * 主模块管控定位,可以向各个模块发送统一定位信息 + */ + private IMogoLocationClient mLocationClient; + + private int mCurrentPosition = 1; @Override protected int getLayoutId() { @@ -31,35 +58,129 @@ 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 ); - mMogoModuleHandler = new MogoModulesManager( this ); - mMogoMapService = ( IMogoMapService ) ARouter.getInstance().build( MogoServicePaths.PATH_SERVICES_MAP ).navigation(); - if ( mMogoMapService != null ) { - mMogoMapService.registerHostMapListener( mMogoModuleHandler ); - mMogoMapService.registerHostNaviListener( mMogoModuleHandler ); - } - mMogoModuleHandler.loadMap( R.id.module_main_id_map_fragment_container ); + mCardsContainer.setOnPageChangeListener( new ViewPager.OnPageChangeListener() { - 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(); + private int mLastPosition = -1; + + @Override + public void onPageScrolled( int position, float positionOffset, int positionOffsetPixels ) { + Logger.i( TAG, "position = " + position ); + if ( mLastPosition != position ) { + if ( mCardModulesAdapter != null ) { + mCardModulesAdapter.render( position ); + } + mLastPosition = position; } } - } - mMogoModuleHandler.setEnable( providers.iterator().next().getModuleName() ); + + @Override + public void onPageSelected( int position ) { + try { + mCurrentPosition = position; + mMogoModuleHandler.setEnable( mCardModulesAdapter.getProvider( position ).getModuleName() ); + } catch ( Exception e ) { + e.printStackTrace(); + } + } + + @Override + public void onPageScrollStateChanged( int state ) { + if ( state == ViewPager.SCROLL_STATE_IDLE ) { + if ( mCurrentPosition == 0 ) { + mCurrentPosition = mCardModulesAdapter.getCount() - 3; + mCardsContainer.setCurrentItem( mCurrentPosition, false ); + } else if ( mCurrentPosition == mCardModulesAdapter.getCount() - 2 ) { + mCurrentPosition = 1; + mCardsContainer.setCurrentItem( mCurrentPosition, false ); + } + } + } + } ); } + public int getCurrentPosition() { + return mCurrentPosition; + } + + public OrientedViewPager getCardsContainer() { + return mCardsContainer; + } + + @Override + protected void onCreate( @Nullable Bundle savedInstanceState ) { + super.onCreate( savedInstanceState ); + + mMogoModuleHandler = new MogoModulesManager( this ); + mMogoModuleHandler.onMapLoadedCallback( new Runnable() { + @Override + public void run() { + Logger.d( TAG, "map loaded." + Thread.currentThread().getName() ); + loadModules(); + } + } ); + + mMogoMapService = ( IMogoMapService ) ARouter.getInstance().build( MogoServicePaths.PATH_SERVICES_MAP ).navigation(); + if ( mMogoMapService != null ) { + mMogoMapService.getHostListenerRegister().registerHostMapListener( mMogoModuleHandler ); + mMogoMapService.getHostListenerRegister().registerHostNaviListener( mMogoModuleHandler ); + mMogoMapService.getHostListenerRegister().registerMarkerClickListener( this ); + } + // 加载地图,触发地图加载完毕回调,在初始化其他卡片模块,保证卡片模块可以正确获取地图相关服务。 + mMogoModuleHandler.loadMap( R.id.module_main_id_map_fragment_container ); + + mLocationClient = mMogoMapService.getSingletonLocationClient( getApplicationContext() ); + mLocationClient.addLocationListener( this ); + mLocationClient.start(); + + mMogoModuleHandler.loadAppsList( R.id.module_main_id_fragment_container ); + } + + private void loadModules() { + + List< IMogoModuleProvider > providers = mMogoModuleHandler.loadCards(); + mCardModulesAdapter = new CardModulesAdapter( this, providers ); + mCardsContainer.setOffscreenPageLimit( providers.size() + 2 ); + mCardsContainer.setPageTransformer( true, new VerticalStackTransformer( this ) ); + mCardsContainer.setAdapter( mCardModulesAdapter ); + mCardsContainer.setCurrentItem( mCurrentPosition ); + } + + @NonNull @Override protected MainPresenter createPresenter() { return new MainPresenter( this ); } + + @Override + public void onLocationChanged( MogoLocation location ) { + if ( mMogoModuleHandler != null ) { + mMogoModuleHandler.onLocationChanged( location ); + } + } + + @Override + public boolean onMarkerClicked( IMogoMarker marker ) { +// int mappedCardPosition = mCardModulesAdapter.getNextCardPosition( marker.getOwner(), mCurrentPosition ); +// mCardsContainer.setCurrentItem( mappedCardPosition, true ); + return false; + } + + @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..b572ee1ca1 --- /dev/null +++ b/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/CardModulesAdapter.java @@ -0,0 +1,128 @@ +package com.mogo.module.main.cards; + +import android.os.Bundle; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentStatePagerAdapter; + +import com.mogo.module.main.MainActivity; +import com.mogo.service.module.IMogoModuleProvider; +import com.mogo.utils.logger.Logger; + +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 MainActivity mActivity; + private List< IMogoModuleProvider > mProviders; + + private PlaceholderFragmentProvider mLastPH; + private PlaceholderFragmentProvider mFirstPH; + private PlaceholderFragmentProvider mPH; + + + public CardModulesAdapter( @NonNull MainActivity fragmentActivity, List< IMogoModuleProvider > providers ) { + super( fragmentActivity.getSupportFragmentManager() ); + mActivity = fragmentActivity; + this.mProviders = new ArrayList<>( providers ); + this.mProviders.add( 0, mLastPH = new PlaceholderFragmentProvider() ); + this.mProviders.add( mFirstPH = new PlaceholderFragmentProvider() ); + this.mProviders.add( mPH = new PlaceholderFragmentProvider() ); + } + + @NonNull + @Override + public Fragment getItem( int position ) { + int factPosition = getFactPosition( position ); + Bundle bundle = new Bundle(); + bundle.putInt( "position", factPosition ); + Logger.d( TAG, "here" ); + final Fragment f = mProviders.get( factPosition ).createFragment( mActivity, bundle ); + if ( position == 0 ) { + mLastPH.setCopyTarget( f ); + } else if ( position == getCount() - 2 ) { + mFirstPH.setCopyTarget( f ); + } + return f; + } + + @Override + public int getCount() { + return mProviders.size(); +// return Integer.MAX_VALUE; + } + + 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; + } + + /** + * marker、卡片、语音等通过 launcher 切换到其他卡片。 + * + * @param providerTag 卡片类型 + * @param currentPosition 当前卡片位置 + * @return 需要跳转到的卡片实际位置 + */ + public int getNextCardPosition( String providerTag, int currentPosition ) { + int position = 0; + int currentFactPosition = getFactPosition( currentPosition ); + for ( IMogoModuleProvider provider : mProviders ) { + if ( TextUtils.equals( providerTag, provider.getModuleName() ) ) { + break; + } + position++; + } + int offset = 0; + if ( currentFactPosition > position ) { + // 下一个卡片在当前卡片前面 + offset = position - mProviders.size(); + } else if ( currentFactPosition < position ) { + // 下一个卡片在当前卡片后面 + offset = mProviders.size() - position; + } + return currentPosition + offset; + } + + @Override + public void destroyItem( @NonNull ViewGroup container, int position, @NonNull Object object ) { +// super.destroyItem( container, position, object ); +// Logger.d( TAG, "destroy " + object ); + } + + + @Override + public void finishUpdate( @NonNull ViewGroup container ) { + super.finishUpdate( container ); + } + + public void render( int position ) { + if ( position == 1 ) { + mLastPH.renderTargetUI(); + } else if ( position == getCount() - 2 ) { + mFirstPH.renderTargetUI(); + } + } +} 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..a36e9b2dc3 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,16 @@ 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; + +import javax.security.auth.callback.Callback; /** * @author congtaowang @@ -12,14 +18,18 @@ import java.util.Collection; *
* 卡片管理
*/
-public interface MogoModulesHandler extends IMogoMapListener, IMogoNaviListener {
+public interface MogoModulesHandler extends IMogoMapListener,
+ IMogoNaviListener,
+ IMogoLocationListener {
+
+ void onMapLoadedCallback( Runnable callback );
/**
* 加载卡片
*
* @return
*/
- Collection< IMogoModuleProvider > loadCards();
+ List< IMogoModuleProvider > loadCards();
/**
* 加载小智语音
@@ -42,10 +52,22 @@ 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..a576dfa58b 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,22 @@ 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.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,14 +35,18 @@ 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;
+ private Runnable mMapLoadedCallback;
public MogoModulesManager( MainActivity activity ) {
if ( activity == null ) {
@@ -56,10 +64,22 @@ public class MogoModulesManager implements MogoModulesHandler,
}
@Override
- public Collection< IMogoModuleProvider > loadCards() {
- IMogoModuleProvider demo = load( MogoModulePaths.PATH_MODULE_DEMO );
- mCardProviders.put( demo.getModuleName(), demo );
- return mCardProviders.values();
+ public void onMapLoadedCallback( Runnable callback ) {
+ mMapLoadedCallback = callback;
+ }
+
+ @Override
+ public List< IMogoModuleProvider > loadCards() {
+ final List< String > modulePaths = MogoModulePaths.getModulesPath();
+ final ArrayList< IMogoModuleProvider > providers = new ArrayList<>();
+ if ( modulePaths != null && !modulePaths.isEmpty() ) {
+ for ( String modulePath : modulePaths ) {
+ IMogoModuleProvider provider = load( modulePath );
+ providers.add( provider );
+ mCardProviders.put( provider.getModuleName(), provider );
+ }
+ }
+ return providers;
}
@Override
@@ -82,6 +102,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,20 +135,30 @@ 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();
+ }
}
+
}
}
}
@Override
public void onMapLoaded() {
+
+ if ( mMapLoadedCallback != null ) {
+ mMapLoadedCallback.run();
+ mMapLoadedCallback = null;
+ }
+
if ( mEnableModuleName != null ) {
IMogoModuleProvider provider = getModuleProvider( mEnableModuleName );
- if ( provider != null ) {
+ if ( provider != null && provider.getMapListener() != null ) {
provider.getMapListener().onMapLoaded();
}
}
@@ -132,7 +168,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 +178,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 +188,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 +198,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 +208,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 +265,19 @@ 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 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
+ * 描述
+ */
+public class PlaceholderFragment extends UnDestroyedViewFragment {
+
+ @Override
+ protected int getLayoutId() {
+ return R.layout.module_main_fragement_placeholder;
+ }
+
+ @Override
+ public void onCreate( @Nullable Bundle savedInstanceState ) {
+ super.onCreate( savedInstanceState );
+ }
+}
diff --git a/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/PlaceholderFragmentProvider.java b/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/PlaceholderFragmentProvider.java
new file mode 100644
index 0000000000..11b4dcdfd3
--- /dev/null
+++ b/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/PlaceholderFragmentProvider.java
@@ -0,0 +1,100 @@
+package com.mogo.module.main.cards;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.drawable.BitmapDrawable;
+import android.os.Bundle;
+import android.view.View;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
+import com.mogo.commons.mvp.IView;
+import com.mogo.commons.mvp.MvpFragment;
+import com.mogo.commons.mvp.Presenter;
+import com.mogo.map.listener.IMogoMapListener;
+import com.mogo.map.location.IMogoLocationListener;
+import com.mogo.map.navi.IMogoNaviListener;
+import com.mogo.module.main.R;
+import com.mogo.service.module.IMogoModuleLifecycle;
+import com.mogo.service.module.IMogoModuleProvider;
+
+/**
+ * @author congtaowang
+ * @since 2019-12-31
+ *
+ * 描述
+ */
+public class PlaceholderFragmentProvider implements IMogoModuleProvider {
+
+ private Fragment mCopyTarget;
+ private PlaceholderFragment mUi;
+
+ public void setCopyTarget( Fragment mUICopyTarget ) {
+ this.mCopyTarget = mUICopyTarget;
+ }
+
+ public void renderTargetUI() {
+ if ( mCopyTarget == null ) {
+ return;
+ }
+ final View target = mCopyTarget.getView();
+ if ( target == null ) {
+ return;
+ }
+ target.setDrawingCacheEnabled( true );
+ Bitmap result = target.getDrawingCache();
+ result = target.getDrawingCache() != null ? result.copy( Bitmap.Config.ARGB_8888, false ) : null;
+ if ( mUi.getView() != null ) {
+ mUi.getView().setBackgroundDrawable( new BitmapDrawable( result ) );
+ }
+ }
+
+ @Override
+ public Fragment createFragment( Context context, Bundle data ) {
+ mUi = new PlaceholderFragment();
+ return mUi;
+ }
+
+ @Override
+ public View createView( Context context ) {
+ return null;
+ }
+
+ @NonNull
+ @Override
+ public String getModuleName() {
+ return "placeholder";
+ }
+
+ @Override
+ public IMogoModuleLifecycle getCardLifecycle() {
+ return null;
+ }
+
+ @Override
+ public IMogoMapListener getMapListener() {
+ return null;
+ }
+
+ @Override
+ public int getType() {
+ return 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-main/src/main/java/com/mogo/module/main/cards/UnDestroyedViewFragment.java b/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/UnDestroyedViewFragment.java
new file mode 100644
index 0000000000..29eb86e890
--- /dev/null
+++ b/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/UnDestroyedViewFragment.java
@@ -0,0 +1,44 @@
+package com.mogo.module.main.cards;
+
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import com.mogo.commons.mvp.IView;
+import com.mogo.commons.mvp.MvpFragment;
+import com.mogo.commons.mvp.Presenter;
+import com.mogo.module.main.R;
+
+/**
+ * @author congtaowang
+ * @since 2019-12-31
+ *
+ * 描述
+ */
+public abstract class UnDestroyedViewFragment extends MvpFragment< IView, Presenter< IView > > implements IView {
+
+ @Nullable
+ @Override
+ public View onCreateView( @NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState ) {
+ if ( mRootView == null ) {
+ return super.onCreateView( inflater, container, savedInstanceState );
+ }
+ return mRootView;
+ }
+
+ @Override
+ protected void initViews() {
+
+ }
+
+ @NonNull
+ @Override
+ protected Presenter< IView > createPresenter() {
+ return new Presenter< IView >( this ) {
+ };
+ }
+}
diff --git a/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/VerticalBaseTransformer.java b/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/VerticalBaseTransformer.java
new file mode 100644
index 0000000000..85d5de7933
--- /dev/null
+++ b/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/VerticalBaseTransformer.java
@@ -0,0 +1,108 @@
+
+package com.mogo.module.main.cards;
+
+import android.view.View;
+
+import androidx.viewpager.widget.ViewPager;
+
+public abstract class VerticalBaseTransformer implements ViewPager.PageTransformer {
+ /**
+ * Called each {@link #transformPage(View, float)}.
+ *
+ * @param page Apply the transformation to this page
+ * @param position Position of page relative to the current front-and-center position of the pager. 0 is front and
+ * center. 1 is one full page position to the right, and -1 is one page position to the left.
+ */
+ protected abstract void onTransform( View page, float position );
+
+ /**
+ * Apply a property transformation to the given page. For most use cases, this method should not be overridden.
+ * Instead use {@link #transformPage(View, float)} to perform typical transformations.
+ *
+ * @param page Apply the transformation to this page
+ * @param position Position of page relative to the current front-and-center position of the pager. 0 is front and
+ * center. 1 is one full page position to the right, and -1 is one page position to the left.
+ */
+ @Override
+ public void transformPage( View page, float position ) {
+ onPreTransform( page, position );
+ onTransform( page, position );
+ onPostTransform( page, position );
+ }
+
+ /**
+ * If the position offset of a fragment is less than negative one or greater than one, returning true will set the
+ * fragment alpha to 0f. Otherwise fragment alpha is always defaulted to 1f.
+ *
+ * @return
+ */
+ protected boolean hideOffscreenPages() {
+ return true;
+ }
+
+ /**
+ * Indicates if the default animations of the view pager should be used.
+ *
+ * @return
+ */
+ protected boolean isPagingEnabled() {
+ return false;
+ }
+
+ /**
+ * Called each {@link #transformPage(View, float)} before {{@link #onTransform(View, float)}.
+ *
- * 描述
+ * 埋点业务接口
*/
@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..38ec4f9548 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搜索服务
*
@@ -83,7 +68,7 @@ public interface IMogoMapService extends IProvider, IMogoMapListenerRegister, IM
*/
IMogoPoiSearch getPoiSearch( Context context, MogoPoiSearchQuery query );
- /**
+ /**f
* 获取导航操作实例
*
* @param context
@@ -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 aab1abb27e..188e4c3d70 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -10,6 +10,8 @@ include ':modules:mogo-module-common'
include ':modules:mogo-module-main'
include ':modules:mogo-module-navi'
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..6a98b2cf17
--- /dev/null
+++ b/upload.sh
@@ -0,0 +1,15 @@
+#!/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 :demo:demo-module-map2:clean :demo:demo-module-map2: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