+ * sp 公共缓存区域 + */ +public class SpStorage { + + public static String getTicket() { + return SharedPrefsMgr.getInstance( AbsMogoApplication.getApp() ).getString( "ticket" ); + } + + public static void setTicket( String ticket ) { + SharedPrefsMgr.getInstance( AbsMogoApplication.getApp() ).putString( "ticket", ticket ); + } +} diff --git a/foudations/mogo-utils/src/main/java/com/mogo/utils/network/RetrofitFactory.java b/foudations/mogo-utils/src/main/java/com/mogo/utils/network/RetrofitFactory.java index 575c6bb8ea..4d079a013b 100644 --- a/foudations/mogo-utils/src/main/java/com/mogo/utils/network/RetrofitFactory.java +++ b/foudations/mogo-utils/src/main/java/com/mogo/utils/network/RetrofitFactory.java @@ -6,7 +6,7 @@ import androidx.collection.ArrayMap; import java.util.Map; import retrofit2.Retrofit; -import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory; +import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; import retrofit2.converter.gson.GsonConverterFactory; public final class RetrofitFactory { @@ -21,7 +21,7 @@ public final class RetrofitFactory { target = new Retrofit.Builder(). client(OkHttpFactory.getInstance()). baseUrl(baseUrl). - addCallAdapterFactory(RxJavaCallAdapterFactory.create()). + addCallAdapterFactory( RxJava2CallAdapterFactory.create()). addConverterFactory(GsonConverterFactory.create()). build(); sRpcServiceMap.put(baseUrl,target); diff --git a/foudations/mogo-utils/src/main/java/com/mogo/utils/network/SubscriberEx.java b/foudations/mogo-utils/src/main/java/com/mogo/utils/network/SubscriberEx.java deleted file mode 100644 index 158c431852..0000000000 --- a/foudations/mogo-utils/src/main/java/com/mogo/utils/network/SubscriberEx.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.mogo.utils.network; - - -import androidx.annotation.CallSuper; - - -import com.mogo.utils.network.ui.ProgressDialog; -import com.mogo.utils.network.utils.Util; - -import rx.Subscriber; - - -/** - *
- * Extension of {@link Subscriber}. For better extension and customization, client can extend this - * class to override the default behaviours such as loading appearance on each lifecycle method - * of network callback.
- */ - -public abstract class SubscriberEx< T > extends Subscriber< T > { - protected final RequestOptions mRequestOptions; - private ProgressDialog mProgressDialog; - - public SubscriberEx( RequestOptions requestOptions ) { - if ( requestOptions == null ) { - throw new IllegalArgumentException( "RequestOptions cannot be null" ); - } - this.mRequestOptions = requestOptions; - if ( mRequestOptions.isLoading() ) { - this.mProgressDialog = new ProgressDialog(); - } - } - - /** - * This method must be called if you want to use the default loading dialog in case of override. - * Otherwise you can ignore it. - */ - @Override - @CallSuper - public void onStart() { - super.onStart(); - if ( !Util.checkAlive( mRequestOptions.getCaller() ) ) { - unsubscribe(); - return; - } - if ( mRequestOptions.isLoading() && mProgressDialog != null ) { - mProgressDialog.showLoadingDialog( mRequestOptions.getContext(), mRequestOptions.getLoadingMessage(), mRequestOptions.isCancelable(), mRequestOptions.isCancelableOnTouchOutside() ); - } - } - - /** - * This method must be called if you want to use the default loading dialog in case of override. - * Otherwise you can ignore it. - */ - private void onFinish() { - if ( mRequestOptions.isLoading() && mProgressDialog != null ) { - mProgressDialog.removeLoadingDialog(); - mProgressDialog = null; - } - if ( !Util.checkAlive( mRequestOptions.getCaller() ) ) { - unsubscribe(); - } - } - - /** - * This method must be called if you want to use the default loading dialog in case of override. - * Otherwise you can ignore it. - */ - @Override - @CallSuper - public void onCompleted() { - onFinish(); - } - - /** - * This method must be called if you want to use the default loading dialog in case of override. - * Otherwise you can ignore it. - */ - @Override - @CallSuper - public void onError( Throwable e ) { - onFinish(); - } - - /** - * This method must be override if you care about the result of request. - * - * @param o The result of network request - */ - @Override - @CallSuper - public void onNext( T o ) { - } - -} diff --git a/gradle.properties b/gradle.properties index 20ac63bf28..832da15ccb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -43,4 +43,5 @@ MOGO_MODULE_APPS_VERSION=1.0.0-SNAPSHOT MOGO_CONNECTION_VERSION=1.0.0-SNAPSHOT MOGO_MODULE_NAVI_VERSION=1.0.0-SNAPSHOT MOGO_MODULE_SERVICE_VERSION=1.0.0-SNAPSHOT +MOGO_MODULE_EXTENSIONS_VERSION=1.0.0-SNAPSHOT diff --git a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapNaviViewWrapper.java b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapNaviViewWrapper.java index 2d1ad1fcd4..829c6338e5 100644 --- a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapNaviViewWrapper.java +++ b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapNaviViewWrapper.java @@ -38,7 +38,8 @@ import com.mogo.utils.logger.Logger; *
* 代理高德导航地图
*/
-public class AMapNaviViewWrapper implements IMogoMapView, IMogoMapUIController,
+public class AMapNaviViewWrapper implements IMogoMapView,
+ IMogoMapUIController,
AMap.OnMarkerClickListener,
AMap.OnMapLoadedListener,
AMap.OnMapTouchListener,
@@ -138,10 +139,13 @@ public class AMapNaviViewWrapper implements IMogoMapView, IMogoMapUIController,
mMapView.setOnMapTouchListener( this );
mMapView.setOnPolylineClickListener( this );
mMapView.setAMapNaviViewListener( this );
- if ( mMapView.getMap() != null ) {
- mMapView.getMap().setOnPOIClickListener( this );
- mMapView.getMap().setOnMapClickListener( this );
- mMapView.getMap().setOnCameraChangeListener( this );
+ mMapView.setOnCameraChangeListener( this );
+
+ final AMap aMap = mMapView.getMap();
+ if ( aMap != null ) {
+ aMap.setOnPOIClickListener( this );
+ aMap.setOnMapClickListener( this );
+ aMap.setOnCameraChangeListener( this );
}
AMapMessageManager.getInstance().registerAMapMessageListener( this );
}
@@ -428,6 +432,11 @@ public class AMapNaviViewWrapper implements IMogoMapView, IMogoMapUIController,
return getMap().getScalePerPixel();
}
+ @Override
+ public float getZoomLevel() {
+ return getMap().getZoomLevel();
+ }
+
@Override
public void onNaviStarted() {
if ( checkAMapView() ) {
@@ -449,7 +458,6 @@ public class AMapNaviViewWrapper implements IMogoMapView, IMogoMapUIController,
@Override
public void onCameraChange( CameraPosition cameraPosition ) {
-
}
@Override
@@ -458,4 +466,24 @@ public class AMapNaviViewWrapper implements IMogoMapView, IMogoMapUIController,
MogoMapListenerHandler.getInstance().onMapChanged( ObjectUtils.fromAMap( cameraPosition.target ), cameraPosition.zoom, cameraPosition.tilt, cameraPosition.bearing );
}
}
+
+ @Override
+ public MogoLatLng getCameraNorthEastPosition() {
+ try {
+ return ObjectUtils.fromAMap( mMapView.getMap().getProjection().getVisibleRegion().latLngBounds.northeast );
+ } catch ( Exception e ) {
+
+ }
+ return null;
+ }
+
+ @Override
+ public MogoLatLng getCameraSouthWestPosition() {
+ try {
+ return ObjectUtils.fromAMap( mMapView.getMap().getProjection().getVisibleRegion().latLngBounds.southwest );
+ } catch ( Exception e ) {
+
+ }
+ return null;
+ }
}
diff --git a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapWrapper.java b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapWrapper.java
index 24479dcd0c..9b73bf10ab 100644
--- a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapWrapper.java
+++ b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapWrapper.java
@@ -11,6 +11,7 @@ import com.mogo.map.IMogoMap;
import com.mogo.map.IMogoUiSettings;
import com.mogo.map.impl.amap.marker.AMapInfoWindowAdapter;
import com.mogo.map.impl.amap.marker.AMapMarkerWrapper;
+import com.mogo.map.impl.amap.uicontroller.AMapUIController;
import com.mogo.map.impl.amap.utils.ObjectUtils;
import com.mogo.map.marker.IMogoMarker;
import com.mogo.map.marker.MogoMarkerOptions;
@@ -43,6 +44,7 @@ public class AMapWrapper implements IMogoMap {
mUIcontroller = controller;
// 设置实现自定义 info window
mAMap.setInfoWindowAdapter( new AMapInfoWindowAdapter() );
+ AMapUIController.getInstance().initClient( mUIcontroller );
}
public static AMap getAMap() {
@@ -205,6 +207,18 @@ public class AMapWrapper implements IMogoMap {
}
}
+ @Override
+ public float getZoomLevel() {
+ if ( checkAMap() ) {
+ try {
+ return mAMap.getCameraPosition().zoom;
+ } catch ( Exception e ) {
+
+ }
+ }
+ return 0;
+ }
+
private boolean checkAMap() {
if ( mAMap == null ) {
Logger.e( TAG, "高德map实例为空,请检查" );
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 c6ab59eb1c..aaba68efe3 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
@@ -21,11 +21,6 @@ public class AMapUIController implements IMogoMapUIController {
private IMogoMapUIController mClient;
private AMapUIController() {
- try {
- mClient = MogoMap.getInstance().getMogoMap().getUIController();
- } catch ( Exception e ) {
- Logger.e( TAG, "获取UI控制实例失败", e );
- }
}
public static AMapUIController getInstance() {
@@ -39,6 +34,10 @@ public class AMapUIController implements IMogoMapUIController {
return sInstance;
}
+ public void initClient( IMogoMapUIController client ) {
+ this.mClient = client;
+ }
+
public synchronized void release() {
sInstance = null;
}
@@ -74,7 +73,7 @@ public class AMapUIController implements IMogoMapUIController {
@Override
public void moveToCenter( MogoLatLng latLng ) {
if ( mClient != null ) {
- mClient.moveToCenter(latLng);
+ mClient.moveToCenter( latLng );
}
}
@@ -106,4 +105,28 @@ public class AMapUIController implements IMogoMapUIController {
}
return 0;
}
+
+ @Override
+ public float getZoomLevel() {
+ if ( mClient != null ) {
+ return mClient.getZoomLevel();
+ }
+ return 0;
+ }
+
+ @Override
+ public MogoLatLng getCameraNorthEastPosition() {
+ if ( mClient != null ) {
+ return mClient.getCameraNorthEastPosition();
+ }
+ return null;
+ }
+
+ @Override
+ public MogoLatLng getCameraSouthWestPosition() {
+ if ( mClient != null ) {
+ return mClient.getCameraSouthWestPosition();
+ }
+ return null;
+ }
}
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 224c3db20c..f306f0f4cb 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
@@ -114,5 +114,17 @@ public interface IMogoMap {
*/
float getScalePerPixel();
- void changeZoom(float zoom);
+ /**
+ * 改变地图缩放级别
+ *
+ * @param zoom
+ */
+ void changeZoom( float zoom );
+
+ /**
+ * 获取缩放比例
+ *
+ * @return
+ */
+ float getZoomLevel();
}
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 ba4a89ff28..e0f5e57790 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
@@ -66,4 +66,25 @@ public interface IMogoMapUIController {
* @return 当前缩放级别下,地图上1像素点对应的长度,单位米
*/
float getScalePerPixel();
+
+ /**
+ * 获取缩放比例
+ *
+ * @return
+ */
+ float getZoomLevel();
+
+ /**
+ * 获取视图东北角坐标
+ *
+ * @return
+ */
+ MogoLatLng getCameraNorthEastPosition();
+
+ /**
+ * 获取视图西南角坐标
+ *
+ * @return
+ */
+ MogoLatLng getCameraSouthWestPosition();
}
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 b45c6a4086..3c58121cd9 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
@@ -98,4 +98,28 @@ public class MogoMapUIController implements IMogoMapUIController {
}
return 0;
}
+
+ @Override
+ public float getZoomLevel() {
+ if ( mDelegate != null ) {
+ return mDelegate.getZoomLevel();
+ }
+ return 0;
+ }
+
+ @Override
+ public MogoLatLng getCameraNorthEastPosition() {
+ if ( mDelegate != null ) {
+ return mDelegate.getCameraNorthEastPosition();
+ }
+ return null;
+ }
+
+ @Override
+ public MogoLatLng getCameraSouthWestPosition() {
+ if ( mDelegate != null ) {
+ return mDelegate.getCameraSouthWestPosition();
+ }
+ return null;
+ }
}
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
index d719cea766..03e8970e62 100644
--- 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
@@ -14,6 +14,7 @@ import com.mogo.map.navi.IMogoNaviListener;
import com.mogo.module.common.MogoModulePaths;
import com.mogo.service.module.IMogoModuleLifecycle;
import com.mogo.service.module.IMogoModuleProvider;
+import com.mogo.service.module.ModuleType;
/**
* @author congtaowang
@@ -57,7 +58,7 @@ public class AppsFragmentProvider implements IMogoModuleProvider {
@Override
public int getType() {
- return IMogoModuleProvider.TYPE_FRAGMENT;
+ return ModuleType.TYPE_APP_LIST;
}
@Override
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
index 59a55b2827..416758e038 100644
--- 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
@@ -9,6 +9,6 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
app:behavior_hideable="false"
- app:behavior_peekHeight="50dp"
+ app:behavior_peekHeight="92dp"
app:layout_behavior="@string/bottom_sheet_behavior" />
\ No newline at end of file
diff --git a/modules/mogo-module-apps/src/main/res/layout/module_apps_item_app.xml b/modules/mogo-module-apps/src/main/res/layout/module_apps_item_app.xml
index 9434eb0e3a..3f995c1085 100644
--- a/modules/mogo-module-apps/src/main/res/layout/module_apps_item_app.xml
+++ b/modules/mogo-module-apps/src/main/res/layout/module_apps_item_app.xml
@@ -7,8 +7,8 @@
+ * 描述
+ */
+public class ExtensionsFragment extends MvpFragment< ExtensionsView, ExtensionsPresenter > implements ExtensionsView {
+
+ private View mVoiceIcon;
+ private View mVoiceMsg;
+
+ private TextView mTime;
+ private TextView mDate;
+
+ private View mWeatherContainer;
+ private ImageView mWeatherIcon;
+ private TextView mWeatherTemp;
+ private TextView mWeatherDesc;
+
+ private View mMsgContainer;
+ private TextView mMsgCounter;
+
+ @Override
+ protected int getLayoutId() {
+ return R.layout.module_ext_layout_extensions;
+ }
+
+ @Override
+ protected void initViews() {
+ mVoiceIcon = findViewById( R.id.module_ext_id_voice );
+ mVoiceMsg = findViewById( R.id.module_ext_id_voice_msg );
+
+ mVoiceIcon.setOnClickListener( new View.OnClickListener() {
+ @Override
+ public void onClick( View v ) {
+ mVoiceMsg.performClick();
+ }
+ } );
+ mVoiceMsg.setOnClickListener( new View.OnClickListener() {
+ @Override
+ public void onClick( View v ) {
+
+ }
+ } );
+
+ mTime = findViewById( R.id.module_ext_id_time );
+ mDate = findViewById( R.id.module_ext_id_date );
+
+ mWeatherContainer = findViewById( R.id.module_ext_id_weather_container );
+ mWeatherIcon = findViewById( R.id.module_ext_id_weather_icon );
+ mWeatherTemp = findViewById( R.id.module_ext_id_weather_temp );
+ mWeatherDesc = findViewById( R.id.module_ext_id_weather_desc );
+
+ mMsgContainer = findViewById( R.id.module_ext_id_msg );
+ mMsgCounter = findViewById( R.id.module_ext_id_msg_counter );
+ }
+
+ @NonNull
+ @Override
+ protected ExtensionsPresenter createPresenter() {
+ return new ExtensionsPresenter( this );
+ }
+
+ @Override
+ public void onActivityCreated( @Nullable Bundle savedInstanceState ) {
+ super.onActivityCreated( savedInstanceState );
+
+ }
+
+ @Override
+ public void renderTime( String date, String time ) {
+ mDate.setText( date );
+ mTime.setText( time );
+ }
+
+ @Override
+ public void renderWeatherInfo( String temp, String desc, int iconId ) {
+ if ( iconId != 0 ) {
+ mWeatherIcon.setImageResource( iconId );
+ mWeatherIcon.setVisibility( View.VISIBLE );
+ } else {
+ mWeatherIcon.setVisibility( View.GONE );
+ }
+ mWeatherTemp.setText( temp );
+ mWeatherDesc.setText( desc );
+ }
+}
diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/ExtensionsModuleConst.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/ExtensionsModuleConst.java
new file mode 100644
index 0000000000..7cf63d02b0
--- /dev/null
+++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/ExtensionsModuleConst.java
@@ -0,0 +1,16 @@
+package com.mogo.module.extensions;
+
+/**
+ * @author congtaowang
+ * @since 2020-01-05
+ *
+ * 描述
+ */
+public class ExtensionsModuleConst {
+
+ public static final String PATH_EXTENSION = "/extension/ui";
+
+
+ public static final String TYPE = "extension";
+
+}
diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/ExtensionsModuleProvider.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/ExtensionsModuleProvider.java
new file mode 100644
index 0000000000..2a9ff20faf
--- /dev/null
+++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/ExtensionsModuleProvider.java
@@ -0,0 +1,74 @@
+package com.mogo.module.extensions;
+
+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.service.module.IMogoModuleLifecycle;
+import com.mogo.service.module.IMogoModuleProvider;
+import com.mogo.service.module.ModuleType;
+
+/**
+ * @author congtaowang
+ * @since 2020-01-05
+ *
+ * 描述
+ */
+@Route( path = ExtensionsModuleConst.PATH_EXTENSION )
+public class ExtensionsModuleProvider implements IMogoModuleProvider {
+
+ @Override
+ public Fragment createFragment( Context context, Bundle data ) {
+ ExtensionsFragment fragment = new ExtensionsFragment();
+ fragment.setArguments( data );
+ return fragment;
+ }
+
+ @Override
+ public View createView( Context context ) {
+ return null;
+ }
+
+ @NonNull
+ @Override
+ public String getModuleName() {
+ return ExtensionsModuleConst.TYPE;
+ }
+
+ @Override
+ public IMogoModuleLifecycle getCardLifecycle() {
+ return null;
+ }
+
+ @Override
+ public IMogoMapListener getMapListener() {
+ return null;
+ }
+
+ @Override
+ public int getType() {
+ return ModuleType.TYPE_EXTENSION;
+ }
+
+ @Override
+ public IMogoNaviListener getNaviListener() {
+ return null;
+ }
+
+ @Override
+ public IMogoLocationListener getLocationListener() {
+ return null;
+ }
+
+ @Override
+ public void init( Context context ) {
+
+ }
+}
diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/ExtensionsPresenter.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/ExtensionsPresenter.java
new file mode 100644
index 0000000000..000dce6d4b
--- /dev/null
+++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/ExtensionsPresenter.java
@@ -0,0 +1,111 @@
+package com.mogo.module.extensions;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+
+import androidx.annotation.NonNull;
+import androidx.lifecycle.LifecycleOwner;
+
+import com.mogo.commons.mvp.Presenter;
+import com.mogo.module.extensions.weather.Phenomena;
+import com.mogo.module.extensions.weather.WeatherCallback;
+import com.mogo.module.extensions.weather.WeatherInfo;
+import com.mogo.module.extensions.weather.WeatherModel;
+import com.mogo.utils.logger.Logger;
+
+import java.util.Calendar;
+
+
+/**
+ * @author congtaowang
+ * @since 2020-01-05
+ *
+ * 描述
+ */
+public class ExtensionsPresenter extends Presenter< ExtensionsView > implements WeatherCallback {
+
+ private static final String TAG = "ExtensionsPresenter";
+
+ private String[] mWeeks;
+
+ private WeatherModel mWeatherModel;
+
+ /**
+ * 接收时间变化的广播
+ */
+ private BroadcastReceiver mReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive( Context context, Intent intent ) {
+ try {
+ refreshTimeAndDate();
+ } catch ( Exception e ) {
+ Logger.e( TAG, "error. ", e );
+ }
+ }
+ };
+
+
+ public ExtensionsPresenter( ExtensionsView view ) {
+ super( view );
+ mWeeks = getContext().getResources().getStringArray( R.array.module_ext_str_arr_week );
+ mWeatherModel = new WeatherModel( getContext() );
+ }
+
+ @Override
+ public void onCreate( @NonNull LifecycleOwner owner ) {
+ super.onCreate( owner );
+ registerTimerReceiver();
+ mWeatherModel.init( this );
+ mWeatherModel.queryWeatherInformation();
+ refreshTimeAndDate();
+ }
+
+ /**
+ * 注册时间变化监听
+ */
+ private void registerTimerReceiver() {
+ IntentFilter filter = new IntentFilter();
+ filter.addAction( Intent.ACTION_TIME_TICK );
+ filter.addAction( Intent.ACTION_TIME_CHANGED );
+ filter.addAction( Intent.ACTION_TIMEZONE_CHANGED );
+ filter.addAction( Intent.ACTION_CONFIGURATION_CHANGED );
+ getContext().registerReceiver( mReceiver, filter );
+ }
+
+ private void refreshTimeAndDate() {
+ Calendar calendar = Calendar.getInstance();
+ int hour = calendar.get( Calendar.HOUR_OF_DAY );
+ int minute = calendar.get( Calendar.MINUTE );
+
+ int month = calendar.get( Calendar.MONTH );
+ int day = calendar.get( Calendar.DAY_OF_MONTH );
+ int week = calendar.get( Calendar.DAY_OF_WEEK );
+
+ String timeStr = getContext().getResources().getString( R.string.module_ext_str_time_format, hour, minute );
+ String dateStr = getContext().getResources().getString( R.string.module_ext_str_date_format, month + 1, day, mWeeks[week - 1] );
+ mView.renderTime( dateStr, timeStr );
+ }
+
+ @Override
+ public void onWeatherLoaded( WeatherInfo weatherInfo ) {
+ if ( weatherInfo == null ) {
+ return;
+ }
+ String temp = getContext().getResources().getString( R.string.module_ext_str_weather_temp_format, weatherInfo.getTemperature() );
+ Phenomena phenomena = Phenomena.getById( weatherInfo.getPhenomena() );
+ String desc = phenomena == null ? "" : phenomena.nameCn;
+ int resId = 0;
+ mView.renderWeatherInfo( temp, desc, resId );
+ }
+
+ @Override
+ public void onDestroy( @NonNull LifecycleOwner owner ) {
+ super.onDestroy( owner );
+ if ( mWeatherModel != null ) {
+ mWeatherModel.destroy();
+ }
+
+ }
+}
diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/ExtensionsView.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/ExtensionsView.java
new file mode 100644
index 0000000000..fc1c71fb22
--- /dev/null
+++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/ExtensionsView.java
@@ -0,0 +1,30 @@
+package com.mogo.module.extensions;
+
+import com.mogo.commons.mvp.IView;
+import com.mogo.module.extensions.weather.WeatherInfo;
+
+/**
+ * @author congtaowang
+ * @since 2020-01-05
+ *
+ * 描述
+ */
+public interface ExtensionsView extends IView {
+
+ /**
+ * 刷新日期、时间
+ *
+ * @param date 日期
+ * @param time 时间
+ */
+ void renderTime( String date, String time );
+
+ /**
+ * 天气信息
+ *
+ * @param desc 天气描述:晴转多云
+ * @param temp 温度
+ * @param iconId 图标
+ */
+ void renderWeatherInfo( String temp, String desc, int iconId );
+}
diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/weather/Phenomena.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/weather/Phenomena.java
new file mode 100644
index 0000000000..fd39a92327
--- /dev/null
+++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/weather/Phenomena.java
@@ -0,0 +1,97 @@
+package com.mogo.module.extensions.weather;
+
+import android.text.TextUtils;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author Lzq
+ */
+public enum Phenomena {
+ Sunny( "00", "晴", "Sunny" ),
+ Cloudy( "01", "多云", "Cloudy" ),
+ Overcast( "02", "阴", "Overcast" ),
+
+ Shower( "03", "阵雨", "Shower" ),
+ Thundershower( "04", "雷阵雨", "Thundershower" ),
+ ThundershowerWithHail( "05", "雷阵雨伴有冰雹", "Thundershower with hail" ),
+ Sleet( "06", "雨夹雪", "Sleet" ),
+ LightRain( "07", "小雨", "Light rain" ),
+ ModerateRain( "08", "中雨", "Moderate rain" ),
+ HeavyRain( "09", "大雨", "Heavy rain" ),
+ Storm( "10", "暴雨", "Storm" ),
+ HeavyStorm( "11", "大暴雨", "Heavy storm" ),
+ SevereStorm( "12", "特大暴雨", "Severe storm" ),
+
+ SnowFlurry( "13", "阵雪", "Snow flurry" ),
+ LightSnow( "14", "小雪", "Light snow" ),
+ ModerateSnow( "15", "中雪", "Moderate snow" ),
+ HeavySnow( "16", "大雪", "Heavy snow" ),
+ Snowstorm( "17", "暴雪", "Snowstorm" ),
+
+ Foggy( "18", "雾", "Foggy" ),
+ IceRain( "19", "冻雨", "Ice rain" ),
+ Duststorm( "20", "沙尘暴", "Duststorm" ),
+
+ LightToModerateRain( "21", "小到中雨", "Light to moderate rain" ),
+ ModerateToHeavyRain( "22", "中到大雨", "Moderate to heavy rain" ),
+ HeavyRainToStorm( "23", "大到大雨", "Heavy rain to storm" ),
+ StormToHeavyStorm( "24", "暴雨到大暴雨", "Storm to heavy storm" ),
+ HeavyToSevereStorm( "25", "大暴雨到特大暴雨", "Heavy to severe storm" ),
+
+ LightToModerateSnow( "26", "小到中雪", "Light to moderate snow" ),
+ ModerateToHeavySnow( "27", "中到大雪", "Moderate to heavy snow" ),
+ HeavySnowToSnowStorm( "28", "大到暴雪", "Heavy snow to snowstorm" ),
+
+ Dust( "29", "浮尘", "Dust" ),
+ Sand( "30", "扬沙", "Sand" ),
+ SandStorm( "31", "强沙尘暴", "Sandstorm" ),
+
+ Densefog( "32", "浓雾", "Dense fog" ),
+ StrongFog( "49", "强浓雾", "Strong fog" ),
+ DenseFog( "57", "大雾", "Dense fog" ),
+ ExtraHeavyFog( "58", "特强浓雾", "Extra heavy fog" ),
+
+ Haze( "53", "霾", "Haze" ),
+ ModerateHaze( "54", "中度霾", "Moderate haze" ),
+ Severehaze( "55", "重度霾", "Severe haze" ),
+ SevereHaze( "56", "严重霾", "Severe haze" ),
+
+ Unknown( "99", "无", "Unknown" ),
+
+ Rain( "301", "雨", "rain" ),
+ Snow( "302", "雪", "snow" );
+
+ public final String id;
+ public final String nameCn;
+ public final String nameEn;
+
+ Phenomena( String id, String nameCn, String nameEn ) {
+ this.id = id;
+ this.nameCn = nameCn;
+ this.nameEn = nameEn;
+ }
+
+ static Map< String, Phenomena > mPhenomenas;
+
+ static {
+ if ( mPhenomenas == null ) {
+ synchronized ( Phenomena.class ) {
+ if ( mPhenomenas == null ) {
+ mPhenomenas = new HashMap<>();
+ for ( Phenomena weather : Phenomena.values() ) {
+ mPhenomenas.put( weather.id, weather );
+ }
+ }
+ }
+ }
+ }
+
+ public static synchronized Phenomena getById( String id ) {
+ if ( TextUtils.isEmpty( id ) ) {
+ return null;
+ }
+ return mPhenomenas.get( id );
+ }
+}
diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/weather/WeatherCallback.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/weather/WeatherCallback.java
new file mode 100644
index 0000000000..38b7d1d521
--- /dev/null
+++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/weather/WeatherCallback.java
@@ -0,0 +1,5 @@
+package com.mogo.module.extensions.weather;
+
+public interface WeatherCallback {
+ void onWeatherLoaded( WeatherInfo weatherInfo );
+}
\ No newline at end of file
diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/weather/WeatherConstants.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/weather/WeatherConstants.java
new file mode 100644
index 0000000000..6e2376bd34
--- /dev/null
+++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/weather/WeatherConstants.java
@@ -0,0 +1,32 @@
+package com.mogo.module.extensions.weather;
+
+/**
+ * 天气
+ */
+public class WeatherConstants {
+
+ public final static String WEATHER_URI = "content://com.zhidao.weather/weatherinfo";
+
+ /**
+ * 天气
+ */
+ public static final String TEMPERATURE = "observetemperature";
+ /**
+ * 气象
+ */
+ public static final String PHENOMENA = "observephenomena";
+ /**
+ * 风向
+ */
+ public static final String WIND_DIRECTION = "observewinddirection";
+ /**
+ * 风力
+ */
+ public static final String WIND_FORCE = "observewindforce";
+
+ /**
+ * 天气消息加载完毕
+ */
+ public static final int MSG_WEATHER_LOADED = 0x1000;
+}
+
diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/weather/WeatherInfo.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/weather/WeatherInfo.java
new file mode 100644
index 0000000000..d5afeb8d23
--- /dev/null
+++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/weather/WeatherInfo.java
@@ -0,0 +1,142 @@
+package com.mogo.module.extensions.weather;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.text.TextUtils;
+
+import java.util.Objects;
+
+/**
+ * 天气
+ */
+public class WeatherInfo implements Parcelable {
+ /**
+ * 温度
+ */
+ private String temperature;
+
+ /**
+ * 描述信息
+ */
+ private String phenomena;
+
+ /**
+ * 风向
+ */
+ private String windDirection;
+
+ /**
+ * 风力
+ */
+ private String windForce;
+
+ @Override
+ public String toString() {
+ return "WeatherInfo{" +
+ "temperature='" + temperature + '\'' +
+ ", phenomena='" + phenomena + '\'' +
+ ", windDirection='" + windDirection + '\'' +
+ ", windForce='" + windForce + '\'' +
+ '}';
+ }
+
+ @Override
+ public boolean equals( Object o ) {
+ if ( this == o ) {
+ return true;
+ }
+ if ( !( o instanceof WeatherInfo ) ) {
+ return false;
+ }
+ WeatherInfo that = ( WeatherInfo ) o;
+ return Objects.equals( temperature, that.temperature ) &&
+ Objects.equals( phenomena, that.phenomena ) &&
+ Objects.equals( windDirection, that.windDirection ) &&
+ Objects.equals( windForce, that.windForce );
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash( temperature, phenomena, windDirection, windForce );
+ }
+
+ public WeatherInfo() {
+ }
+
+ public WeatherInfo( String temperature, String phenomena, String windDirection, String windForce ) {
+ this.temperature = temperature;
+ this.phenomena = phenomena;
+ this.windDirection = windDirection;
+ this.windForce = windForce;
+ }
+
+ public String getTemperature() {
+ return temperature;
+ }
+
+ public void setTemperature( String temperature ) {
+ this.temperature = temperature;
+ }
+
+ public String getPhenomena() {
+ return phenomena;
+ }
+
+ public void setPhenomena( String phenomena ) {
+ this.phenomena = phenomena;
+ }
+
+ public String getWindDirection() {
+ return windDirection;
+ }
+
+ public void setWindDirection( String windDirection ) {
+ this.windDirection = windDirection;
+ }
+
+ public String getWindForce() {
+ return windForce;
+ }
+
+ public void setWindForce( String windForce ) {
+ this.windForce = windForce;
+ }
+
+ public boolean isLegal() {
+ return !TextUtils.isEmpty( phenomena )
+ && !TextUtils.isEmpty( temperature );
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel( Parcel dest, int flags ) {
+ dest.writeString( this.temperature );
+ dest.writeString( this.phenomena );
+ dest.writeString( this.windDirection );
+ dest.writeString( this.windForce );
+ }
+
+ protected WeatherInfo( Parcel in ) {
+ this.temperature = in.readString();
+ this.phenomena = in.readString();
+ this.windDirection = in.readString();
+ this.windForce = in.readString();
+ }
+
+ public static final Creator< WeatherInfo > CREATOR = new Creator< WeatherInfo >() {
+ @Override
+ public WeatherInfo createFromParcel( Parcel source ) {
+ return new WeatherInfo( source );
+ }
+
+ @Override
+ public WeatherInfo[] newArray( int size ) {
+ return new WeatherInfo[size];
+ }
+ };
+}
+
diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/weather/WeatherModel.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/weather/WeatherModel.java
new file mode 100644
index 0000000000..c67331f031
--- /dev/null
+++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/weather/WeatherModel.java
@@ -0,0 +1,127 @@
+package com.mogo.module.extensions.weather;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.database.ContentObserver;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+
+import androidx.annotation.NonNull;
+
+import com.mogo.utils.ThreadPoolService;
+import com.mogo.utils.logger.Logger;
+
+/**
+ * @author congtaowang
+ * @since 2020-01-05
+ *
+ * 描述
+ */
+public class WeatherModel {
+
+ private static final String TAG = "WeatherModel";
+
+ private Context mContext;
+
+ private Uri mWeatherUri;
+ private Handler mHandler;
+ private ContentResolver mContentResolver;
+ private ContentObserver mContentObserver;
+ private WeatherCallback mCallback;
+
+ public WeatherModel( Context context ) {
+ this.mContext = context;
+ }
+
+ public void init( WeatherCallback callback ) {
+ mCallback = callback;
+ mWeatherUri = Uri.parse( WeatherConstants.WEATHER_URI );
+ mContentResolver = mContext.getContentResolver();
+ mHandler = new Handler( Looper.getMainLooper() ) {
+ @Override
+ public void handleMessage( @NonNull Message msg ) {
+ if ( msg.what == WeatherConstants.MSG_WEATHER_LOADED ) {
+ if ( mCallback != null ) {
+ mCallback.onWeatherLoaded( ( ( WeatherInfo ) msg.obj ) );
+ }
+ }
+ }
+ };
+ mContentObserver = new ContentObserver( mHandler ) {
+ @Override
+ public void onChange( boolean selfChange, Uri uri ) {
+ super.onChange( selfChange, uri );
+ try {
+ queryWeatherInformation();
+ } catch ( Exception e ) {
+ Logger.e( TAG, "error. ", e );
+ }
+ }
+ };
+ mContentResolver.registerContentObserver( mWeatherUri, false, mContentObserver );
+ }
+
+ public void queryWeatherInformation() {
+
+ if ( mCallback == null ) {
+ Logger.e( TAG, "WeatherModel#init should invoked " );
+ return;
+ }
+ startNewThreadToQuery();
+ }
+
+
+ private void startNewThreadToQuery() {
+ ThreadPoolService.execute( new Runnable() {
+ @Override
+ public void run() {
+ if ( mContentResolver == null ) {
+ return;
+ }
+ Cursor cursor = mContentResolver.query( mWeatherUri, null, null, null, null, null );
+ if ( cursor == null ) {
+ return;
+ }
+ WeatherInfo weatherInfo = new WeatherInfo();
+ if ( cursor.moveToFirst() ) {
+ int index = cursor.getColumnIndex( WeatherConstants.TEMPERATURE );
+ if ( index != -1 ) {
+ weatherInfo.setTemperature( cursor.getString( index ) );
+ }
+ index = cursor.getColumnIndex( WeatherConstants.PHENOMENA );
+ if ( index != -1 ) {
+ weatherInfo.setPhenomena( cursor.getString( index ) );
+ }
+ index = cursor.getColumnIndex( WeatherConstants.WIND_DIRECTION );
+ if ( index != -1 ) {
+ weatherInfo.setWindDirection( cursor.getString( index ) );
+ }
+ index = cursor.getColumnIndex( WeatherConstants.WIND_FORCE );
+ if ( index != -1 ) {
+ weatherInfo.setWindForce( cursor.getString( index ) );
+ }
+ Message msg = Message.obtain();
+ msg.obj = weatherInfo;
+ msg.what = WeatherConstants.MSG_WEATHER_LOADED;
+ mHandler.sendMessage( msg );
+ }
+ cursor.close();
+ }
+ } );
+ }
+
+ public void destroy() {
+ if ( mContentResolver != null && mContentObserver != null ) {
+ mContentResolver.unregisterContentObserver( mContentObserver );
+ }
+ mContext = null;
+ mWeatherUri = null;
+ mHandler = null;
+ mContentResolver = null;
+ mContentObserver = null;
+ mCallback = null;
+ }
+}
diff --git a/modules/mogo-module-extensions/src/main/res/drawable-xhdpi/module_ext_ic_message.png b/modules/mogo-module-extensions/src/main/res/drawable-xhdpi/module_ext_ic_message.png
new file mode 100644
index 0000000000..ec0f007df5
Binary files /dev/null and b/modules/mogo-module-extensions/src/main/res/drawable-xhdpi/module_ext_ic_message.png differ
diff --git a/modules/mogo-module-extensions/src/main/res/drawable-xhdpi/module_ext_ic_voice.png b/modules/mogo-module-extensions/src/main/res/drawable-xhdpi/module_ext_ic_voice.png
new file mode 100644
index 0000000000..6e46c49e70
Binary files /dev/null and b/modules/mogo-module-extensions/src/main/res/drawable-xhdpi/module_ext_ic_voice.png differ
diff --git a/modules/mogo-module-extensions/src/main/res/drawable/module_ext_drawable_msg_bkg.xml b/modules/mogo-module-extensions/src/main/res/drawable/module_ext_drawable_msg_bkg.xml
new file mode 100644
index 0000000000..58d86caa09
--- /dev/null
+++ b/modules/mogo-module-extensions/src/main/res/drawable/module_ext_drawable_msg_bkg.xml
@@ -0,0 +1,9 @@
+
+
+ * 自动刷新策略
+ */
+public class AutoRefreshStrategy {
+
+ public static final long ONE_MINUTE = 5 * 1_000L;
+
+ /**
+ * 距离(米)
+ */
+ private int distance = 2_000;
+
+ /**
+ * 时间间距(s)
+ */
+ private long interval = 3 * ONE_MINUTE;
+
+ /**
+ * 用户打断后的延时(s)
+ */
+ private long interruptInterval = 1 * ONE_MINUTE;
+
+ /**
+ * 距离(米)
+ */
+ public int getDistance() {
+ return distance;
+ }
+
+ /**
+ * 时间间距(s)
+ */
+ public long getInterval() {
+ return interval;
+ }
+
+ /**
+ * 用户打断后的延时
+ */
+ public long getInterruptInterval() {
+ return interruptInterval;
+ }
+}
diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/CustomRefreshStrategy.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/CustomRefreshStrategy.java
new file mode 100644
index 0000000000..90005b3c5d
--- /dev/null
+++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/CustomRefreshStrategy.java
@@ -0,0 +1,19 @@
+package com.mogo.module.service;
+
+/**
+ * @author congtaowang
+ * @since 2020-01-03
+ *
+ * 手动刷新策略
+ */
+public class CustomRefreshStrategy {
+
+ /**
+ * 缩小倍数
+ */
+ private float zoomOutLevel = 2;
+
+ public float getZoomOutLevel() {
+ return zoomOutLevel;
+ }
+}
diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoRefreshStrategyProvider.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoRefreshStrategyProvider.java
deleted file mode 100644
index 7bbf4a167c..0000000000
--- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoRefreshStrategyProvider.java
+++ /dev/null
@@ -1,148 +0,0 @@
-package com.mogo.module.service;
-
-
-import android.app.Service;
-import android.content.Context;
-import android.os.Bundle;
-import android.view.MotionEvent;
-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.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.service.module.IMogoModuleLifecycle;
-import com.mogo.service.module.IMogoModuleProvider;
-import com.mogo.utils.logger.Logger;
-
-/**
- * @author congtaowang
- * @since 2020-01-03
- *
- * 数据刷新策略
- */
-@Route( path = ServiceConst.PATH_REFRESH_STRATEGY )
-public class MogoRefreshStrategyProvider implements IMogoModuleProvider, IMogoMapListener, IMogoLocationListener, IMogoNaviListener {
-
- private static final String TAG = "MogoRefreshStrategyProvider";
-
- @Override
- public final Fragment createFragment( Context context, Bundle data ) {
- return null;
- }
-
- @Override
- public final View createView( Context context ) {
- return null;
- }
-
- @Override
- public final IMogoModuleLifecycle getCardLifecycle() {
- return null;
- }
-
- @Override
- public IMogoMapListener getMapListener() {
- return this;
- }
-
- @Override
- public int getType() {
- return TYPE_SERVICE;
- }
-
- @Override
- public IMogoNaviListener getNaviListener() {
- return this;
- }
-
- @Override
- public IMogoLocationListener getLocationListener() {
- return this;
- }
-
- @NonNull
- @Override
- public String getModuleName() {
- return ServiceConst.PATH_REFRESH_STRATEGY;
- }
-
- @Override
- public void init( Context context ) {
-
- }
-
-
- @Override
- public void onMapLoaded() {
-
- }
-
- @Override
- public void onTouch( MotionEvent motionEvent ) {
-
- }
-
- @Override
- public void onPOIClick( MogoPoi poi ) {
-
- }
-
- @Override
- public void onMapClick( MogoLatLng latLng ) {
-
- }
-
- @Override
- public void onLockMap( boolean isLock ) {
-
- }
-
- @Override
- public void onMapModeChanged( EnumMapUI ui ) {
-
- }
-
- @Override
- public void onMapChanged( MogoLatLng latLng, float zoom, float tilt, float bearing ) {
- Logger.d( TAG, "current map status: %s, zoom = %f, tilt = %f, bearing = %f", latLng, zoom, tilt, bearing );
- }
-
- @Override
- public void onLocationChanged( MogoLocation location ) {
-
- }
-
- @Override
- public void onInitNaviFailure() {
-
- }
-
- @Override
- public void onInitNaviSuccess() {
-
- }
-
- @Override
- public void onNaviInfoUpdate( MogoNaviInfo naviinfo ) {
-
- }
-
- @Override
- public void onStartNavi() {
-
- }
-
- @Override
- public void onStopNavi() {
-
- }
-}
diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServiceProvider.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServiceProvider.java
new file mode 100644
index 0000000000..4f786c1ddd
--- /dev/null
+++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServiceProvider.java
@@ -0,0 +1,431 @@
+package com.mogo.module.service;
+
+
+import android.content.Context;
+import android.graphics.BitmapFactory;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.view.MotionEvent;
+import android.view.View;
+
+import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
+
+import com.alibaba.android.arouter.facade.annotation.Route;
+import com.alibaba.android.arouter.launcher.ARouter;
+import com.mogo.map.MogoLatLng;
+import com.mogo.map.listener.IMogoMapListener;
+import com.mogo.map.location.IMogoLocationListener;
+import com.mogo.map.location.MogoLocation;
+import com.mogo.map.marker.IMogoMarker;
+import com.mogo.map.marker.IMogoMarkerManager;
+import com.mogo.map.marker.MogoMarkerOptions;
+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.map.uicontroller.IMogoMapUIController;
+import com.mogo.module.service.network.RefreshCallback;
+import com.mogo.module.service.network.RefreshModel;
+import com.mogo.service.MogoServicePaths;
+import com.mogo.service.map.IMogoMapService;
+import com.mogo.service.module.IMogoModuleLifecycle;
+import com.mogo.service.module.IMogoModuleProvider;
+import com.mogo.service.module.ModuleType;
+import com.mogo.service.statusmanager.IMogoStatusChangedListener;
+import com.mogo.service.statusmanager.IMogoStatusManager;
+import com.mogo.service.statusmanager.StatusDescriptor;
+import com.mogo.utils.logger.Logger;
+
+/**
+ * @author congtaowang
+ * @since 2020-01-03
+ *
+ * 数据刷新策略
+ */
+@Route( path = ServiceConst.PATH_REFRESH_STRATEGY )
+public class MogoServiceProvider implements IMogoModuleProvider,
+ IMogoMapListener,
+ IMogoLocationListener,
+ IMogoNaviListener,
+ IMogoStatusChangedListener {
+
+ private static final String TAG = "MogoRefreshStrategyProvider";
+
+ /**
+ * 自动刷新策略
+ */
+ private AutoRefreshStrategy mAutoRefreshStrategy = new AutoRefreshStrategy();
+ private MogoLatLng mLastAutoRefreshLocation = null;
+ private long mLastRefreshTime = 0;
+
+ private IMogoMarkerManager mMarkerManager;
+ private IMogoMapUIController mUiController;
+
+ /**
+ * 是否已计算出地图显示状态
+ */
+ private boolean mIsMapStatusOk = false;
+
+ /**
+ * 地图显示是横屏还是竖屏:根据地图右上角和左下角坐标计算
+ */
+ boolean mIsVertical = false;
+
+ /**
+ * 手动刷新策略
+ */
+ private CustomRefreshStrategy mCustomRefreshStrategy = new CustomRefreshStrategy();
+ private float mLastZoomLevel = 0;
+ private RefreshModel mRefreshModel;
+ private long mRefreshRemainingTime = Long.MAX_VALUE;
+ // 上次手动操作的中心点坐标
+ private MogoLatLng mLastCustomRefreshCenterLocation;
+
+ private IMogoMapService mMogoMapService;
+ private IMogoMarker mCameraCenterMarker = null;
+ private IMogoStatusManager mStatusManager;
+
+ /**
+ * 地图视图初始化
+ */
+ private boolean mIsCameraInited = true;
+
+ private Handler mHandler = new Handler( Looper.getMainLooper() ) {
+ @Override
+ public void handleMessage( @NonNull Message msg ) {
+ super.handleMessage( msg );
+ switch ( msg.what ) {
+ case ServiceConst.MSG_TYPE_REFRESH_DECREASE:
+ mRefreshRemainingTime -= ServiceConst.DECREASE_INTERVAL;
+ if ( mRefreshRemainingTime == 0 ) {
+ notifyRefreshData( mAutoRefreshCallback );
+ } else {
+ mHandler.sendEmptyMessageDelayed( msg.what, ServiceConst.DECREASE_INTERVAL );
+ }
+ break;
+ }
+ }
+ };
+ private Context mContext;
+
+ /**
+ * 地图视图西南角坐标
+ */
+ private MogoLatLng mCameraSouthWestPosition;
+
+ /**
+ * 地图视图东北角坐标
+ */
+ private MogoLatLng mCameraNorthEastPosition;
+
+ /**
+ * 手动刷新回调
+ */
+ private RefreshCallback mCustomRefreshCallback = new RefreshCallback() {
+ @Override
+ public void onSuccess() {
+ // 用户手动操作地图刷新成功后,设置状态为 true,引发延时策略
+ mStatusManager.setUserInteractionStatus( ServiceConst.TYPE, true, true );
+ mStatusManager.setUserInteractionStatus( ServiceConst.TYPE, false, false );
+ }
+
+ @Override
+ public void onFail() {
+
+ }
+ };
+
+ /**
+ * 自动刷新回调
+ */
+ private RefreshCallback mAutoRefreshCallback = new RefreshCallback() {
+ @Override
+ public void onSuccess() {
+ invokeAutoRefreshStrategy();
+ }
+
+ @Override
+ public void onFail() {
+ invokeAutoRefreshStrategy();
+ }
+
+ private void invokeAutoRefreshStrategy() {
+ mRefreshRemainingTime = mAutoRefreshStrategy.getInterval();
+ mHandler.removeMessages( ServiceConst.MSG_TYPE_REFRESH_DECREASE );
+ mHandler.sendEmptyMessageDelayed( ServiceConst.MSG_TYPE_REFRESH_DECREASE, ServiceConst.DECREASE_INTERVAL );
+ }
+ };
+
+ @Override
+ public final Fragment createFragment( Context context, Bundle data ) {
+ return null;
+ }
+
+ @Override
+ public final View createView( Context context ) {
+ return null;
+ }
+
+ @Override
+ public final IMogoModuleLifecycle getCardLifecycle() {
+ return null;
+ }
+
+ @Override
+ public IMogoMapListener getMapListener() {
+ return this;
+ }
+
+ @Override
+ public int getType() {
+ return ModuleType.TYPE_SERVICE;
+ }
+
+ @Override
+ public IMogoNaviListener getNaviListener() {
+ return this;
+ }
+
+ @Override
+ public IMogoLocationListener getLocationListener() {
+ return this;
+ }
+
+ @NonNull
+ @Override
+ public String getModuleName() {
+ return ServiceConst.TYPE;
+ }
+
+ @Override
+ public void init( Context context ) {
+ mContext = context;
+ mRefreshModel = new RefreshModel( context );
+ mMogoMapService = ( IMogoMapService ) ARouter.getInstance().build( MogoServicePaths.PATH_SERVICES_MAP ).navigation( context );
+ mMarkerManager = mMogoMapService.getMarkerManager( context );
+ mUiController = mMogoMapService.getMapUIController();
+ mStatusManager = ( IMogoStatusManager ) ARouter.getInstance().build( MogoServicePaths.PATH_STATUS_MANAGER ).navigation( context );
+ mStatusManager.registerStatusChangedListener( ServiceConst.TYPE, StatusDescriptor.USER_INTERACTED, this );
+ }
+
+ @Override
+ public void onMapLoaded() {
+ refreshCameraPosition();
+ }
+
+ private void initMapStatus() {
+ if ( mIsMapStatusOk ) {
+ return;
+ }
+ try {
+ float width = getMapCameraFactWidth();
+ float height = getMapCameraFactHeight();
+ mIsVertical = width < height;
+ Logger.i( TAG, "map status is vertical : " + mIsVertical );
+ mIsMapStatusOk = true;
+ } catch ( Exception e ) {
+
+ }
+ }
+
+ /**
+ * 地图视图对应的实际宽度
+ *
+ * @return
+ */
+ private float getMapCameraFactWidth() {
+ return Utils.calculateLineDistance( mCameraNorthEastPosition, new MogoLatLng( mCameraNorthEastPosition.lat, mCameraSouthWestPosition.lng ) );
+ }
+
+ /**
+ * 地图视图对应的实际高度
+ *
+ * @return
+ */
+ private float getMapCameraFactHeight() {
+ return Utils.calculateLineDistance( mCameraSouthWestPosition, new MogoLatLng( mCameraNorthEastPosition.lat, mCameraSouthWestPosition.lng ) );
+ }
+
+ /**
+ * 刷新视图范围坐标
+ */
+ private void refreshCameraPosition() {
+ mCameraSouthWestPosition = mUiController.getCameraSouthWestPosition();
+ mCameraNorthEastPosition = mUiController.getCameraNorthEastPosition();
+
+ initMapStatus();
+
+ if ( mIsVertical ) {
+ float width = getMapCameraFactWidth();
+ Logger.i( TAG, "current zoom level width: %f m", width );
+ } else {
+ float height = getMapCameraFactHeight();
+ Logger.i( TAG, "current zoom level height: %f m", height );
+ }
+ }
+
+ @Override
+ public void onTouch( MotionEvent motionEvent ) {
+ switch ( motionEvent.getActionMasked() ) {
+ case MotionEvent.ACTION_DOWN:
+ if ( mLastZoomLevel == 0 ) {
+ mLastZoomLevel = mUiController.getZoomLevel();
+ Logger.i( TAG, "初始化缩放级别 为:%f", mLastZoomLevel );
+ }
+ break;
+ case MotionEvent.ACTION_UP:
+ break;
+ }
+ }
+
+ private void stopAutoRefreshStrategy() {
+ mHandler.removeMessages( ServiceConst.MSG_TYPE_REFRESH_DECREASE );
+ }
+
+ @Override
+ public void onPOIClick( MogoPoi poi ) {
+
+ }
+
+ @Override
+ public void onMapClick( MogoLatLng latLng ) {
+
+ }
+
+ @Override
+ public void onLockMap( boolean isLock ) {
+
+ }
+
+ @Override
+ public void onMapModeChanged( EnumMapUI ui ) {
+
+ }
+
+ @Override
+ public void onMapChanged( MogoLatLng latLng, float zoom, float tilt, float bearing ) {
+
+
+ if ( mIsCameraInited ) {
+ mLastCustomRefreshCenterLocation = latLng;
+ mIsCameraInited = false;
+ return;
+ }
+
+ if ( mCameraCenterMarker == null ) {
+ mCameraCenterMarker = mMarkerManager.addMarker( ServiceConst.TYPE,
+ new MogoMarkerOptions()
+ .icon( BitmapFactory.decodeResource( mContext.getResources(), R.drawable.ic_search_poi_location ) )
+ .latitude( latLng.lat )
+ .longitude( latLng.lng )
+ .owner( ServiceConst.TYPE )
+ );
+ } else {
+ mCameraCenterMarker.setPosition( latLng.lat, latLng.lng );
+ }
+
+ if ( mLastZoomLevel != zoom ) {
+ refreshCameraPosition();
+ }
+
+ // 手动刷新触发
+ if ( mLastZoomLevel - zoom > mCustomRefreshStrategy.getZoomOutLevel() ) {
+ // 缩放级别缩小
+ notifyRefreshData( mCustomRefreshCallback );
+ mLastCustomRefreshCenterLocation = latLng;
+ mLastZoomLevel = zoom;
+ } else if ( mLastZoomLevel == zoom ) {
+ // 手动平移
+ if ( invokeRefreshWhenTranslationByUser( latLng ) ) {
+ notifyRefreshData( mCustomRefreshCallback );
+ mLastCustomRefreshCenterLocation = latLng;
+ }
+ }
+ Logger.d( TAG, "current map status: %s, zoom = %f, tilt = %f, bearing = %f", latLng, zoom, tilt, bearing );
+ }
+
+ /**
+ * 平移地图刷新策略
+ *
+ * @return
+ */
+ private boolean invokeRefreshWhenTranslationByUser( MogoLatLng latLng ) {
+ try {
+ float factor = 0.0f;
+ if ( mIsVertical ) {
+ factor = getMapCameraFactWidth();
+ } else {
+ factor = getMapCameraFactHeight();
+ }
+ if ( factor == 0.0f ) {
+ return false;
+ }
+ float distance = Utils.calculateLineDistance( latLng, mLastCustomRefreshCenterLocation );
+ return distance > factor;
+ } catch ( Exception e ) {
+ Logger.w( TAG, "warming. ", e );
+ return false;
+ }
+ }
+
+ @Override
+ public void onLocationChanged( MogoLocation location ) {
+ if ( location == null ) {
+ return;
+ }
+ // 自动刷新触发
+ if ( mLastAutoRefreshLocation == null ) {
+ mLastAutoRefreshLocation = new MogoLatLng( location.getLatitude(), location.getLongitude() );
+ notifyRefreshData( mAutoRefreshCallback );
+ } else {
+ float distance = Utils.calculateLineDistance( mLastAutoRefreshLocation, new MogoLatLng( location.getLatitude(), location.getLongitude() ) );
+ if ( distance > mAutoRefreshStrategy.getDistance() ) {
+ notifyRefreshData( mAutoRefreshCallback );
+ }
+ }
+ }
+
+ /**
+ * 刷新数据
+ */
+ private void notifyRefreshData( RefreshCallback callback ) {
+ Logger.d( TAG, mAutoRefreshCallback == callback ? "触发自动刷新" : "触发手动刷新" );
+ mRefreshModel.refreshData( callback );
+ }
+
+ @Override
+ public void onInitNaviFailure() {
+
+ }
+
+ @Override
+ public void onInitNaviSuccess() {
+
+ }
+
+ @Override
+ public void onNaviInfoUpdate( MogoNaviInfo naviinfo ) {
+
+ }
+
+ @Override
+ public void onStartNavi() {
+
+ }
+
+ @Override
+ public void onStopNavi() {
+
+ }
+
+ @Override
+ public void onStatusChanged( StatusDescriptor descriptor, boolean isTrue ) {
+ if ( descriptor == StatusDescriptor.USER_INTERACTED && isTrue ) {
+ Logger.i( TAG, "用户状态改变,自动刷新时间延时" );
+ mRefreshRemainingTime += mAutoRefreshStrategy.getInterruptInterval();
+ }
+ }
+}
diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/ServiceConst.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/ServiceConst.java
index 639a087433..0d7d74b0b7 100644
--- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/ServiceConst.java
+++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/ServiceConst.java
@@ -8,8 +8,22 @@ package com.mogo.module.service;
*/
public class ServiceConst {
+ /**
+ * 类型
+ */
+ public static final String TYPE = "STRATEGY_REFRESH";
+
/**
* 刷新策略模块地址
*/
public static final String PATH_REFRESH_STRATEGY = "/strategy/refresh";
+
+ /**
+ * 倒计时消息
+ */
+ public static final int MSG_TYPE_REFRESH_DECREASE = 0x100;
+ /**
+ * 倒计时间隔
+ */
+ public static final int DECREASE_INTERVAL = 1_000;
}
diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/Utils.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/Utils.java
new file mode 100644
index 0000000000..cb47981c3f
--- /dev/null
+++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/Utils.java
@@ -0,0 +1,51 @@
+package com.mogo.module.service;
+
+import com.amap.api.maps.AMapException;
+import com.amap.api.maps.model.LatLng;
+import com.mogo.map.MogoLatLng;
+
+/**
+ * @author congtaowang
+ * @since 2020-01-03
+ *
+ * 描述
+ */
+public class Utils {
+
+ public static float calculateLineDistance( MogoLatLng point1, MogoLatLng point2 ) {
+ if ( point1 != null && point2 != null ) {
+ try {
+ double var2 = point1.lng;
+ double var4 = point1.lat;
+ double var6 = point2.lng;
+ double var8 = point2.lat;
+ var2 *= 0.01745329251994329D;
+ var4 *= 0.01745329251994329D;
+ var6 *= 0.01745329251994329D;
+ var8 *= 0.01745329251994329D;
+ double var10 = Math.sin( var2 );
+ double var12 = Math.sin( var4 );
+ double var14 = Math.cos( var2 );
+ double var16 = Math.cos( var4 );
+ double var18 = Math.sin( var6 );
+ double var20 = Math.sin( var8 );
+ double var22 = Math.cos( var6 );
+ double var24 = Math.cos( var8 );
+ double[] var28 = new double[3];
+ double[] var29 = new double[3];
+ var28[0] = var16 * var14;
+ var28[1] = var16 * var10;
+ var28[2] = var12;
+ var29[0] = var24 * var22;
+ var29[1] = var24 * var18;
+ var29[2] = var20;
+ return ( float ) ( Math.asin( Math.sqrt( ( var28[0] - var29[0] ) * ( var28[0] - var29[0] ) + ( var28[1] - var29[1] ) * ( var28[1] - var29[1] ) + ( var28[2] - var29[2] ) * ( var28[2] - var29[2] ) ) / 2.0D ) * 1.27420015798544E7D );
+ } catch ( Throwable var26 ) {
+ var26.printStackTrace();
+ return 0.0F;
+ }
+ } else {
+ return 0.0F;
+ }
+ }
+}
diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/network/RefreshApiService.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/network/RefreshApiService.java
new file mode 100644
index 0000000000..875fa04b98
--- /dev/null
+++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/network/RefreshApiService.java
@@ -0,0 +1,22 @@
+package com.mogo.module.service.network;
+
+import com.mogo.commons.data.BaseData;
+
+import java.util.Map;
+
+import io.reactivex.Observable;
+import io.reactivex.Single;
+import retrofit2.http.GET;
+import retrofit2.http.QueryMap;
+
+/**
+ * @author congtaowang
+ * @since 2020-01-03
+ *
+ * 接口描述
+ */
+public interface RefreshApiService {
+
+ @GET( "" )
+ Observable< BaseData > refreshData( @QueryMap Map< String, Object > params );
+}
diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/network/RefreshCallback.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/network/RefreshCallback.java
new file mode 100644
index 0000000000..64575bb66c
--- /dev/null
+++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/network/RefreshCallback.java
@@ -0,0 +1,14 @@
+package com.mogo.module.service.network;
+
+/**
+ * @author congtaowang
+ * @since 2020-01-03
+ *
+ * 刷新回调
+ */
+public interface RefreshCallback {
+
+ void onSuccess();
+
+ void onFail();
+}
diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/network/RefreshModel.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/network/RefreshModel.java
new file mode 100644
index 0000000000..5fdbce5600
--- /dev/null
+++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/network/RefreshModel.java
@@ -0,0 +1,65 @@
+package com.mogo.module.service.network;
+
+import android.content.Context;
+
+import com.alibaba.android.arouter.launcher.ARouter;
+import com.mogo.commons.data.BaseData;
+import com.mogo.commons.network.ParamsProvider;
+import com.mogo.commons.network.SubscribeImpl;
+import com.mogo.service.MogoServicePaths;
+import com.mogo.service.network.IMogoNetwork;
+import com.mogo.utils.network.RequestOptions;
+
+import java.util.Map;
+
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.schedulers.Schedulers;
+
+
+/**
+ * @author congtaowang
+ * @since 2020-01-03
+ *
+ * 刷新数据
+ */
+public class RefreshModel {
+
+ private final Context mContext;
+ private RefreshApiService mRefreshApiService;
+
+ public RefreshModel( Context context ) {
+ this.mContext = context;
+ IMogoNetwork network = ( IMogoNetwork ) ARouter.getInstance().build( MogoServicePaths.PATH_SERVICES_NETWORK ).navigation( context );
+ this.mRefreshApiService = network.create( RefreshApiService.class, "http://www.baidu.com/" );
+ }
+
+ public void refreshData( final RefreshCallback callback ) {
+ if ( callback != null ) {
+ callback.onSuccess();
+ return;
+ }
+ if ( mRefreshApiService != null ) {
+ final Map< String, Object > params = new ParamsProvider.Builder( mContext ).build();
+ mRefreshApiService.refreshData( params )
+ .subscribeOn( Schedulers.io() )
+ .observeOn( AndroidSchedulers.mainThread() )
+ .subscribe( new SubscribeImpl< BaseData >( RequestOptions.create( mContext ) ) {
+ @Override
+ public void onSuccess( BaseData o ) {
+ super.onSuccess( o );
+ if ( callback != null ) {
+ callback.onSuccess();
+ }
+ }
+
+ @Override
+ public void onError( String message, int code ) {
+ super.onError( message, code );
+ if ( callback != null ) {
+ callback.onFail();
+ }
+ }
+ } );
+ }
+ }
+}
diff --git a/modules/mogo-module-tanlu/src/main/java/com/mogo/tanlu/fragment/TanluCardViewProvider.java b/modules/mogo-module-tanlu/src/main/java/com/mogo/tanlu/fragment/TanluCardViewProvider.java
index 962c671af2..8710a2a56f 100644
--- a/modules/mogo-module-tanlu/src/main/java/com/mogo/tanlu/fragment/TanluCardViewProvider.java
+++ b/modules/mogo-module-tanlu/src/main/java/com/mogo/tanlu/fragment/TanluCardViewProvider.java
@@ -12,6 +12,7 @@ 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.service.module.ModuleType;
import com.mogo.tanlu.constant.TanluConstants;
import com.mogo.utils.logger.Logger;
@@ -63,7 +64,7 @@ public class TanluCardViewProvider implements IMogoModuleProvider {
@Override
public int getType() {
- return IMogoModuleProvider.TYPE_FRAGMENT;
+ return ModuleType.TYPE_CARD_FRAGMENT;
}
@Override
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 71edd74821..9c88e7ad3f 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
@@ -20,21 +20,6 @@ import com.mogo.map.navi.IMogoNaviListener;
*/
public interface IMogoModuleProvider extends IProvider {
- /**
- * 模块类型为fragment
- */
- int TYPE_FRAGMENT = 1;
-
- /**
- * 模块类型为view
- */
- int TYPE_VIEW = 2;
-
- /**
- * 服务模块
- */
- int TYPE_SERVICE = 3;
-
/**
* 创建卡片
*
@@ -76,8 +61,7 @@ public interface IMogoModuleProvider extends IProvider {
/**
* 是哪种类型的提供者
*
- * {@link #TYPE_FRAGMENT}
- * {@link #TYPE_VIEW}
+ * {@link ModuleType}
*
* @return
*/
diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/module/ModuleType.java b/services/mogo-service-api/src/main/java/com/mogo/service/module/ModuleType.java
new file mode 100644
index 0000000000..7ebd3a1079
--- /dev/null
+++ b/services/mogo-service-api/src/main/java/com/mogo/service/module/ModuleType.java
@@ -0,0 +1,51 @@
+package com.mogo.service.module;
+
+/**
+ * @author congtaowang
+ * @since 2020-01-03
+ *
+ * 模块类型
+ */
+public interface ModuleType {
+
+ /**
+ * 卡片类型 - fragment
+ */
+ int TYPE_CARD_FRAGMENT = 1;
+
+ /**
+ * 卡片类型 - view
+ */
+ @Deprecated
+ int TYPE_CARD_VIEW = 2;
+
+ /**
+ * 服务类型的模块
+ */
+ int TYPE_SERVICE = 3;
+
+ /**
+ * APP 列表模块
+ */
+ int TYPE_APP_LIST = 4;
+
+ /**
+ * 小智语音形象
+ */
+ int TYPE_VOICE = 5;
+
+ /**
+ * 地图模块
+ */
+ int TYPE_MAP = 6;
+
+ /**
+ * 导航模块
+ */
+ int TYPE_NAVI = 7;
+
+ /**
+ * 小智、天气、时间等
+ */
+ int TYPE_EXTENSION = 8;
+}
diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/statusmanager/IMogoStatusChangedListener.java b/services/mogo-service-api/src/main/java/com/mogo/service/statusmanager/IMogoStatusChangedListener.java
new file mode 100644
index 0000000000..908af22c34
--- /dev/null
+++ b/services/mogo-service-api/src/main/java/com/mogo/service/statusmanager/IMogoStatusChangedListener.java
@@ -0,0 +1,16 @@
+package com.mogo.service.statusmanager;
+
+/**
+ * @author congtaowang
+ * @since 2020-01-04
+ *
+ * 状态控制器监听
+ */
+public interface IMogoStatusChangedListener {
+
+ /**
+ * @param descriptor 状态类型
+ * @param isTrue true - accOn、adas ui show、voice ui show、push ui show、v2x ui show
+ */
+ void onStatusChanged( StatusDescriptor descriptor, boolean isTrue );
+}
diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/statusmanager/IMogoStatusManager.java b/services/mogo-service-api/src/main/java/com/mogo/service/statusmanager/IMogoStatusManager.java
index 27761788d9..03a7536373 100644
--- a/services/mogo-service-api/src/main/java/com/mogo/service/statusmanager/IMogoStatusManager.java
+++ b/services/mogo-service-api/src/main/java/com/mogo/service/statusmanager/IMogoStatusManager.java
@@ -38,31 +38,85 @@ public interface IMogoStatusManager extends IProvider {
*/
boolean isPushShow();
+ /**
+ * 是否开机
+ *
+ * @return true - 开机 false - 关机
+ */
+ boolean isAccOn();
+
+
+ /**
+ * 是否有用户交互
+ *
+ * @return
+ */
+ boolean isUserInteracted();
+
/**
* 设置小智语音UI状态
*
+ * @param tag 业务类型
* @param show true - 显示 false - 隐藏
*/
- void setVoiceUIShow( boolean show );
+ void setVoiceUIShow( String tag, boolean show );
/**
* 设置 ADAS UI 状态
*
+ * @param tag 业务类型
* @param show true - 显示 false - 隐藏
*/
- void setADASUIShow( boolean show );
+ void setADASUIShow( String tag, boolean show );
/**
* 设置 V2X UI 状态
*
+ * @param tag 业务类型
* @param show true - 显示 false - 隐藏
*/
- void setV2XUIShow( boolean show );
+ void setV2XUIShow( String tag, boolean show );
/**
* 设置 PUSH UI 状态
*
+ * @param tag 业务类型
* @param show true - 显示 false - 隐藏
*/
- void setPushUIShow( boolean show );
+ void setPushUIShow( String tag, boolean show );
+
+ /**
+ * 设置 acc 状态
+ *
+ * @param tag 业务类型
+ * @param isOn true - on, false - off
+ */
+ void setAccStatus( String tag, boolean isOn );
+
+ /**
+ * 设置用户交互状态:地图手势交互、语音控制
+ *
+ * @param tag 业务类型
+ * @param interrupt true - 用户在交互
+ * @param callback 是否引起回调
+ */
+ void setUserInteractionStatus( String tag, boolean interrupt, boolean callback );
+
+ /**
+ * 注册监听
+ *
+ * @param tag 业务类型
+ * @param descriptor 监听类型
+ * @param listener 监听回调
+ */
+ void registerStatusChangedListener( String tag, StatusDescriptor descriptor, IMogoStatusChangedListener listener );
+
+ /**
+ * 注销
+ *
+ * @param tag 业务类型
+ * @param descriptor 注销类型
+ * @param listener 注销回调
+ */
+ void unregisterStatusChangedListener( String tag, StatusDescriptor descriptor, IMogoStatusChangedListener listener );
}
diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/statusmanager/StatusDescriptor.java b/services/mogo-service-api/src/main/java/com/mogo/service/statusmanager/StatusDescriptor.java
new file mode 100644
index 0000000000..3481271897
--- /dev/null
+++ b/services/mogo-service-api/src/main/java/com/mogo/service/statusmanager/StatusDescriptor.java
@@ -0,0 +1,40 @@
+package com.mogo.service.statusmanager;
+
+/**
+ * @author congtaowang
+ * @since 2020-01-04
+ *
+ * 状态描述
+ */
+public enum StatusDescriptor {
+
+ /**
+ * adas UI
+ */
+ ADAS_UI,
+
+ /**
+ * 推送UI:弹窗
+ */
+ PUSH_UI,
+
+ /**
+ * v2x UI
+ */
+ V2X_UI,
+
+ /**
+ * 小智语音交互 UI
+ */
+ VOICE_UI,
+
+ /**
+ * 开机状态
+ */
+ ACC_STATUS,
+
+ /**
+ * 用户交互状态
+ */
+ USER_INTERACTED
+}
diff --git a/services/mogo-service/src/main/java/com/mogo/service/impl/network/MogoNetWorkService.java b/services/mogo-service/src/main/java/com/mogo/service/impl/network/MogoNetWorkService.java
index f25602ebf9..8682de95d8 100644
--- a/services/mogo-service/src/main/java/com/mogo/service/impl/network/MogoNetWorkService.java
+++ b/services/mogo-service/src/main/java/com/mogo/service/impl/network/MogoNetWorkService.java
@@ -37,7 +37,6 @@ import com.mogo.utils.network.RetrofitFactory;
@Route( path = MogoServicePaths.PATH_SERVICES_NETWORK)
public class MogoNetWorkService implements IMogoNetwork {
-
@Override
public void init( Context context ) {
MogoInitor.init( context );
diff --git a/services/mogo-service/src/main/java/com/mogo/service/impl/statusmanager/MogoStatusManager.java b/services/mogo-service/src/main/java/com/mogo/service/impl/statusmanager/MogoStatusManager.java
index 05afba0904..ae7cd5b6d8 100644
--- a/services/mogo-service/src/main/java/com/mogo/service/impl/statusmanager/MogoStatusManager.java
+++ b/services/mogo-service/src/main/java/com/mogo/service/impl/statusmanager/MogoStatusManager.java
@@ -5,8 +5,14 @@ import android.content.Context;
import com.alibaba.android.arouter.facade.annotation.Route;
import com.mogo.service.MogoServicePaths;
+import com.mogo.service.statusmanager.IMogoStatusChangedListener;
import com.mogo.service.statusmanager.IMogoStatusManager;
+import com.mogo.service.statusmanager.StatusDescriptor;
+import com.mogo.utils.logger.Logger;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@@ -20,69 +26,134 @@ import java.util.concurrent.ConcurrentHashMap;
public class MogoStatusManager implements IMogoStatusManager {
/**
- * 小智语音UI
+ * 状态记录
*/
- private static final int UI_VOICE = 1;
+ private static final Map< StatusDescriptor, Boolean > mStatus = new ConcurrentHashMap<>();
/**
- * ADAS UI
+ * 回调集合
*/
- private static final int UI_ADAS = 2;
+ private static final Map< StatusDescriptor, List< IMogoStatusChangedListener > > mListeners = new ConcurrentHashMap<>();
/**
- * V2X UI
+ * 状态类型修改记录
*/
- private static final int UI_V2X = 3;
-
- /**
- * PUSH UI
- */
- private static final int UI_PUSH = 4;
-
- private static final Map< Integer, Boolean > mStatus = new ConcurrentHashMap<>();
+ private static final Map< StatusDescriptor, String > mModifier = new ConcurrentHashMap<>();
@Override
public boolean isVoiceShow() {
- return mStatus.get( UI_VOICE );
+ return get_bool_val( StatusDescriptor.VOICE_UI );
}
@Override
public boolean isADASShow() {
- return mStatus.get( UI_ADAS );
+ return get_bool_val( StatusDescriptor.ADAS_UI );
}
@Override
public boolean isV2XShow() {
- return mStatus.get( UI_V2X );
+ return get_bool_val( StatusDescriptor.V2X_UI );
}
@Override
public boolean isPushShow() {
- return mStatus.get( UI_PUSH );
+ return get_bool_val( StatusDescriptor.PUSH_UI );
}
@Override
- public void setVoiceUIShow( boolean show ) {
- mStatus.put( UI_VOICE, show );
+ public boolean isAccOn() {
+ return get_bool_val( StatusDescriptor.ACC_STATUS );
}
@Override
- public void setADASUIShow( boolean show ) {
- mStatus.put( UI_ADAS, show );
+ public boolean isUserInteracted() {
+ return get_bool_val( StatusDescriptor.USER_INTERACTED );
+ }
+
+ private boolean get_bool_val( StatusDescriptor descriptor ) {
+ Boolean val = mStatus.get( descriptor );
+ return val == null ? false : val;
}
@Override
- public void setV2XUIShow( boolean show ) {
- mStatus.put( UI_V2X, show );
+ public void setVoiceUIShow( String tag, boolean show ) {
+ mStatus.put( StatusDescriptor.VOICE_UI, show );
+ invokeStatusChangedListener( StatusDescriptor.VOICE_UI, show );
+ recorderStatusModifier( tag, StatusDescriptor.VOICE_UI );
}
@Override
- public void setPushUIShow( boolean show ) {
- mStatus.put( UI_PUSH, show );
+ public void setADASUIShow( String tag, boolean show ) {
+ mStatus.put( StatusDescriptor.ADAS_UI, show );
+ invokeStatusChangedListener( StatusDescriptor.ADAS_UI, show );
+ recorderStatusModifier( tag, StatusDescriptor.ADAS_UI );
+ }
+
+ @Override
+ public void setV2XUIShow( String tag, boolean show ) {
+ mStatus.put( StatusDescriptor.V2X_UI, show );
+ invokeStatusChangedListener( StatusDescriptor.V2X_UI, show );
+ recorderStatusModifier( tag, StatusDescriptor.V2X_UI );
+ }
+
+ @Override
+ public void setPushUIShow( String tag, boolean show ) {
+ mStatus.put( StatusDescriptor.PUSH_UI, show );
+ invokeStatusChangedListener( StatusDescriptor.PUSH_UI, show );
+ recorderStatusModifier( tag, StatusDescriptor.PUSH_UI );
+ }
+
+ @Override
+ public void setAccStatus( String tag, boolean isOn ) {
+ mStatus.put( StatusDescriptor.ACC_STATUS, isOn );
+ invokeStatusChangedListener( StatusDescriptor.ACC_STATUS, isOn );
+ recorderStatusModifier( tag, StatusDescriptor.ACC_STATUS );
+ }
+
+ @Override
+ public void setUserInteractionStatus( String tag, boolean interrupt, boolean callback ) {
+ mStatus.put( StatusDescriptor.USER_INTERACTED, interrupt );
+ if ( callback ) {
+ invokeStatusChangedListener( StatusDescriptor.USER_INTERACTED, interrupt );
+ }
+ recorderStatusModifier( tag, StatusDescriptor.USER_INTERACTED );
+ }
+
+ private void invokeStatusChangedListener( StatusDescriptor descriptor, boolean status ) {
+ if ( mListeners.containsKey( descriptor ) ) {
+ Iterator< IMogoStatusChangedListener > iterator = mListeners.get( descriptor ).iterator();
+ while ( iterator.hasNext() ) {
+ IMogoStatusChangedListener listener = iterator.next();
+ if ( listener != null ) {
+ listener.onStatusChanged( descriptor, status );
+ }
+ }
+ }
+ }
+
+ private void recorderStatusModifier( String tag, StatusDescriptor descriptor ) {
+ mModifier.put( descriptor, tag );
+ }
+
+ @Override
+ public void registerStatusChangedListener( String tag, StatusDescriptor descriptor, IMogoStatusChangedListener listeners ) {
+ if ( listeners == null || descriptor == null ) {
+ return;
+ }
+ if ( !mListeners.containsKey( descriptor ) ) {
+ mListeners.put( descriptor, new ArrayList<>() );
+ }
+ mListeners.get( descriptor ).add( listeners );
+ }
+
+ @Override
+ public void unregisterStatusChangedListener( String tag, StatusDescriptor descriptor, IMogoStatusChangedListener listener ) {
+ if ( mListeners.get( descriptor ) != null ) {
+ mListeners.get( descriptor ).remove( listener );
+ }
}
@Override
public void init( Context context ) {
-
}
}
diff --git a/settings.gradle b/settings.gradle
index 1b8180286f..d98d79d1a8 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -15,4 +15,5 @@ include ':libraries:map-amap'
//include ':libraries:map-baidu'
include ':libraries:mogo-map-api'
include ':modules:mogo-module-apps'
+include ':modules:mogo-module-extensions'
include ':foudations:mogo-connection'