diff --git a/.idea/misc.xml b/.idea/misc.xml index 29bb4c57c1..8a8f75bfe2 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -5,7 +5,7 @@ - + diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000000..94a25f7f4c --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index f266ec223b..4f152b1faa 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,10 +10,35 @@ android { versionCode rootProject.ext.android.versionCode versionName rootProject.ext.android.versionName testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + + javaCompileOptions { + annotationProcessorOptions { + arguments = [AROUTER_MODULE_NAME: project.getName()] + } + } + externalNativeBuild { + ndk { + // 设置支持的SO库架构 + abiFilters 'armeabi' + } + } + } + signingConfigs { + release { + keyAlias = 'CarLauncher' + storeFile file('../keystore/car_launcher.jks') + storePassword 'ZDauto123456' + keyPassword 'ZDauto123456' + } } buildTypes { + debug { + signingConfig signingConfigs.release + debuggable = true + } release { minifyEnabled false + signingConfig signingConfigs.release proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } @@ -21,9 +46,11 @@ android { dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation rootProject.ext.dependencies.androidxappcompat - implementation rootProject.ext.dependencies.androidxconstraintlayout - testImplementation rootProject.ext.dependencies.junit - androidTestImplementation rootProject.ext.dependencies.androidxjunit - androidTestImplementation rootProject.ext.dependencies.androidxespressocore + + api rootProject.ext.dependencies.androidxappcompat + debugImplementation rootProject.ext.dependencies.leakcanary + testImplementation rootProject.ext.dependencies.leakcanary + releaseImplementation rootProject.ext.dependencies.leakcanarynoop + implementation project(':modules:mogo-module-main') + implementation project(':foudations:mogo-commons') } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a1d4aa5c1c..1c3cce9e33 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -11,6 +11,10 @@ android:supportsRtl="true" android:theme="@style/AppTheme.App"> + + \ No newline at end of file diff --git a/app/src/main/java/com/mogo/launcher/MogoApplication.java b/app/src/main/java/com/mogo/launcher/MogoApplication.java index 7a7ac48037..b079298cf4 100644 --- a/app/src/main/java/com/mogo/launcher/MogoApplication.java +++ b/app/src/main/java/com/mogo/launcher/MogoApplication.java @@ -2,13 +2,15 @@ package com.mogo.launcher; import android.app.Application; +import com.mogo.commons.AbsMogoApplication; + /** * @author congtaowang * @since 2019-12-18 *

* Launcher application */ -public class MogoApplication extends Application { +public class MogoApplication extends AbsMogoApplication { @Override public void onCreate() { diff --git a/build.gradle b/build.gradle index 53d9475dce..9d1ce53a72 100644 --- a/build.gradle +++ b/build.gradle @@ -18,7 +18,7 @@ buildscript { dependencies { classpath 'com.android.tools.build:gradle:3.5.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - + classpath "com.alibaba:arouter-register:1.0.2" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } diff --git a/config.gradle b/config.gradle index 5d361f9b3d..0fffb1fc4e 100644 --- a/config.gradle +++ b/config.gradle @@ -43,11 +43,17 @@ ext { 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", + + // leakcanary + leakcanary : 'com.squareup.leakcanary:leakcanary-android:1.5.4', + leakcanarynoop : 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.4', ] } \ No newline at end of file diff --git a/demo/demo-module-map/.gitignore b/demo/demo-module-map/.gitignore new file mode 100644 index 0000000000..796b96d1c4 --- /dev/null +++ b/demo/demo-module-map/.gitignore @@ -0,0 +1 @@ +/build diff --git a/demo/demo-module-map/build.gradle b/demo/demo-module-map/build.gradle new file mode 100644 index 0000000000..0290a16845 --- /dev/null +++ b/demo/demo-module-map/build.gradle @@ -0,0 +1,46 @@ +apply plugin: 'com.android.library' +apply plugin: 'com.alibaba.arouter' + +android { + compileSdkVersion 29 + buildToolsVersion "29.0.2" + + + defaultConfig { + minSdkVersion 19 + targetSdkVersion 29 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles 'consumer-rules.pro' + + javaCompileOptions { + annotationProcessorOptions { + arguments = [AROUTER_MODULE_NAME: project.getName()] + } + } + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + +} + +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') + implementation rootProject.ext.dependencies.androidxappcompat + implementation rootProject.ext.dependencies.androidxconstraintlayout + implementation rootProject.ext.dependencies.arouter + annotationProcessor rootProject.ext.dependencies.aroutercompiler +} diff --git a/demo/demo-module-map/consumer-rules.pro b/demo/demo-module-map/consumer-rules.pro new file mode 100644 index 0000000000..e69de29bb2 diff --git a/demo/demo-module-map/proguard-rules.pro b/demo/demo-module-map/proguard-rules.pro new file mode 100644 index 0000000000..f1b424510d --- /dev/null +++ b/demo/demo-module-map/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 name 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 name. +#-renamesourcefileattribute SourceFile diff --git a/demo/demo-module-map/src/main/AndroidManifest.xml b/demo/demo-module-map/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..b4ca7f3c79 --- /dev/null +++ b/demo/demo-module-map/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + 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 new file mode 100644 index 0000000000..e98266846c --- /dev/null +++ b/demo/demo-module-map/src/main/java/com/mogo/demo/module/map/DemoCardViewFragment.java @@ -0,0 +1,226 @@ +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.view.MotionEvent; +import android.view.View; +import android.widget.Button; +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.listener.IMogoMapListener; +import com.mogo.map.location.ILocationListener; +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.MogoMarkerOptions; +import com.mogo.map.model.MogoPoi; +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.service.MogoServicePaths; +import com.mogo.service.module.IMogoModuleLifecycle; +import com.mogo.service.map.IMogoMapService; +import com.mogo.utils.TipToast; +import com.mogo.utils.logger.Logger; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Random; + +/** + * @author congtaowang + * @since 2019-12-24 + *

+ * 描述 + */ + +public class DemoCardViewFragment extends MvpFragment< IView, Presenter< IView > > + implements IView, + IMogoMarkerClickListener, + IMogoModuleLifecycle, + IMogoMapListener, + IMogoPoiSearchListener, + ILocationListener { + + private static final String TAG = "demo.DemoCardViewProvider"; + + private Button mAddMarker; + private Button mAddMarkers; + + private Bitmap mMarkerIcon; + private Bitmap mClickedMarkerIcon; + private TextView mLoc; + + private IMogoMarker mLastClickedMarker; + + private IMogoMapService mMapService; + private IMogoPoiSearch mPoiSearch; + private IMogoLocationClient mLocationClient; + + @Override + protected int getLayoutId() { + return R.layout.demo_module_card_view; + } + + @Override + protected void initViews() { + + 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 ); + mLocationClient.start( 1_000L ); + + mLoc = findViewById( R.id.demo_module_id_loc ); + + mMarkerIcon = BitmapFactory.decodeResource( getResources(), R.drawable.ic_launcher ); + mClickedMarkerIcon = BitmapFactory.decodeResource( getResources(), R.drawable.ic_launcher_round ); + mAddMarker = findViewById( R.id.demo_module_id_add_marker ); + mAddMarker.setOnClickListener( new View.OnClickListener() { + @Override + public void onClick( View v ) { + IMogoMapService ims = ( IMogoMapService ) ARouter.getInstance().build( MogoServicePaths.PATH_SERVICES_MAP ).navigation(); + MogoMarkerOptions options = new MogoMarkerOptions() + .icon( mMarkerIcon ) + .latitude( 39.974525d ) + .longitude( 116.41733d ); + IMogoMarker marker = ims.addMarker( options ); + marker.setOnMarkerClickListener( DemoCardViewFragment.this ); + } + } ); + mAddMarkers = findViewById( R.id.demo_module_id_add_markers ); + mAddMarkers.setOnClickListener( new View.OnClickListener() { + @Override + public void onClick( View v ) { + IMogoMapService ims = ( IMogoMapService ) ARouter.getInstance().build( MogoServicePaths.PATH_SERVICES_MAP ).navigation(); + + for ( int i = 0; i < 10; i++ ) { + MogoMarkerOptions options = new MogoMarkerOptions() + .icon( mMarkerIcon ) + .latitude( 39.974525d + new Random().nextDouble() ) + .longitude( 116.41733d + new Random().nextDouble() ); + List< IMogoMarker > iMogoMarkers = ims.addMarkers( new ArrayList<>( Arrays.asList( options ) ), true ); + for ( IMogoMarker iMogoMarker : iMogoMarkers ) { + iMogoMarker.setOnMarkerClickListener( DemoCardViewFragment.this ); + } + } + + } + } ); + + } + + @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; + return true; + } + + @NonNull + @Override + protected Presenter createPresenter() { + return new Presenter( this ) { + }; + } + + @Override + public void onPerform() { + TipToast.shortTip( "卡片有效" ); + } + + @Override + public void onDisable() { + TipToast.shortTip( "卡片无效" ); + } + + + @Override + public void onMapLoaded() { + Logger.d( TAG, "地图加载事件" ); + } + + @Override + public void onTouch( MotionEvent motionEvent ) { + Logger.d( TAG, "地图触摸事件" ); + } + + @Override + public void onPOIClick( MogoPoi poi ) { + if ( poi != null ) { + TipToast.shortTip( poi.getName() ); + } + mPoiSearch.searchPOIIdAsyn( poi.getPoiId() ); + } + + @Override + public void onPoiSearched( MogoPoiResult result, int errorCode ) { + + } + + @Override + public void onPoiItemSearched( MogoPoiItem item, int errorCode ) { + if ( item == null ) { + return; + } + new AlertDialog.Builder( getContext() ) + .setTitle( item.getTitle() ) + .setMessage( + new StringBuilder() + .append( "adCode:" ).append( item.getAdCode() ).append( "\n" ) + .append( "cityCode:" ).append( item.getCityCode() ).append( "\n" ) + .append( "email:" ).append( item.getEmail() ).append( "\n" ) + .append( "tel:" ).append( item.getTel() ).append( "\n" ) + ) + .setNegativeButton( "知道了", new DialogInterface.OnClickListener() { + @Override + public void onClick( DialogInterface dialog, int which ) { + dialog.dismiss(); + } + } ) + .show(); + } + + @Override + public void onLocationChanged( MogoLocation location ) { + Logger.i( TAG, location.toString() ); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + getViewLifecycleOwner().getLifecycle().removeObserver( mPresenter ); + mLocationClient.removeLocationListener( this ); + if ( mLastClickedMarker != null ) { + mLastClickedMarker.destroy(); + mLastClickedMarker = null; + } + mMapService = null; + mPoiSearch = null; + mLocationClient = null; + } +} 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 new file mode 100644 index 0000000000..a9cc98d857 --- /dev/null +++ b/demo/demo-module-map/src/main/java/com/mogo/demo/module/map/DemoCardViewProvider.java @@ -0,0 +1,63 @@ +package com.mogo.demo.module.map; + +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.module.common.MogoModulePaths; +import com.mogo.service.module.IMogoModuleLifecycle; +import com.mogo.service.module.IMogoModuleProvider; + +/** + * @author congtaowang + * @since 2019-12-24 + *

+ * 描述 + */ +@Route( path = MogoModulePaths.PATH_MODULE_DEMO ) +public class DemoCardViewProvider implements IMogoModuleProvider { + + private DemoCardViewFragment fragment; + + @Override + public Fragment createFragment( Context context, Bundle data ) { + fragment = new DemoCardViewFragment(); + fragment.setArguments( data ); + return fragment; + } + + @Override + public void init( Context context ) { + + } + + @Override + public String getModuleName() { + return MogoModulePaths.PATH_MODULE_DEMO; + } + + @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; + } +} diff --git a/demo/demo-module-map/src/main/res/drawable/ic_launcher.png b/demo/demo-module-map/src/main/res/drawable/ic_launcher.png new file mode 100644 index 0000000000..898f3ed59a Binary files /dev/null and b/demo/demo-module-map/src/main/res/drawable/ic_launcher.png differ diff --git a/demo/demo-module-map/src/main/res/drawable/ic_launcher_round.png b/demo/demo-module-map/src/main/res/drawable/ic_launcher_round.png new file mode 100644 index 0000000000..dae5e08234 Binary files /dev/null and b/demo/demo-module-map/src/main/res/drawable/ic_launcher_round.png differ 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 new file mode 100644 index 0000000000..e0a6bb02ac --- /dev/null +++ b/demo/demo-module-map/src/main/res/layout/demo_module_card_view.xml @@ -0,0 +1,37 @@ + + + + + +