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 1ddd0337b9..e705ae6eac 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 @@ -488,4 +488,13 @@ public class AMapNaviViewWrapper implements IMogoMapView, } return null; } + + @Override + public void setPointToCenter( double mapCenterX, double mapCenterY ) { + if ( checkAMapView() ) { + AMapNaviViewOptions options = mMapView.getViewOptions(); + options.setPointToCenter( mapCenterX, mapCenterY ); + mMapView.setViewOptions( options ); + } + } } 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 aaba68efe3..26e98dee48 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 @@ -129,4 +129,11 @@ public class AMapUIController implements IMogoMapUIController { } return null; } + + @Override + public void setPointToCenter( double mapCenterX, double mapCenterY ) { + if ( mClient != null ) { + mClient.setPointToCenter( mapCenterX, mapCenterY ); + } + } } 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 e0f5e57790..a9968af5ec 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 @@ -87,4 +87,12 @@ public interface IMogoMapUIController { * @return */ MogoLatLng getCameraSouthWestPosition(); + + /** + * 设置地图中心点 + * + * @param mapCenterX x 点位置x值与地图宽度的比例 + * @param mapCenterY y 点位置x值与地图高度的比例 + */ + void setPointToCenter( double mapCenterX, double mapCenterY ); } diff --git a/libraries/mogo-map-api/src/main/res/drawable-xhdpi/map_api_ic_current_location.png b/libraries/mogo-map-api/src/main/res/drawable-xhdpi/map_api_ic_current_location.png index 58f3550408..65cecf9af2 100644 Binary files a/libraries/mogo-map-api/src/main/res/drawable-xhdpi/map_api_ic_current_location.png and b/libraries/mogo-map-api/src/main/res/drawable-xhdpi/map_api_ic_current_location.png differ 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 3c58121cd9..b6ab623020 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 @@ -122,4 +122,11 @@ public class MogoMapUIController implements IMogoMapUIController { } return null; } + + @Override + public void setPointToCenter( double mapCenterX, double mapCenterY ) { + if ( mDelegate != null ) { + mDelegate.setPointToCenter( mapCenterX, mapCenterY ); + } + } } 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 09a6a429e8..0a83e3b9d6 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 @@ -10,6 +10,7 @@ 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.marker.IMogoMarkerClickListener; import com.mogo.map.navi.IMogoNaviListener; import com.mogo.module.common.MogoModulePaths; import com.mogo.service.module.IMogoModuleLifecycle; @@ -75,4 +76,9 @@ public class AppsFragmentProvider implements IMogoModuleProvider { public void init( Context context ) { } + + @Override + public IMogoMarkerClickListener getMarkerClickListener() { + return null; + } } 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 index 2a9ff20faf..991ef5d737 100644 --- 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 @@ -10,6 +10,7 @@ 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.marker.IMogoMarkerClickListener; import com.mogo.map.navi.IMogoNaviListener; import com.mogo.service.module.IMogoModuleLifecycle; import com.mogo.service.module.IMogoModuleProvider; @@ -71,4 +72,9 @@ public class ExtensionsModuleProvider implements IMogoModuleProvider { public void init( Context context ) { } + + @Override + public IMogoMarkerClickListener getMarkerClickListener() { + return null; + } } diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceFragment.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceFragment.java index 336b8bf097..34d5cd812c 100644 --- a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceFragment.java +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceFragment.java @@ -1,7 +1,11 @@ package com.mogo.module.extensions.entrance; +import android.app.Activity; +import android.graphics.Color; +import android.graphics.drawable.ColorDrawable; import android.os.Bundle; import android.view.View; +import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -60,6 +64,11 @@ public class EntranceFragment extends MvpFragment< EntranceView, EntrancePresent mSearch = findViewById( R.id.module_map_id_search ); mSearch.setOnClickListener( view -> { + + ViewGroup group = ( ( Activity ) getContext() ).findViewById( android.R.id.content ); + final View child = new View(getContext()); + child.setBackground( new ColorDrawable( Color.RED ) ); + group.addView( child ); } ); mHome = findViewById( R.id.module_map_id_home ); diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceProvider.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceProvider.java index fdc5b86988..6e818b3d9c 100644 --- a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceProvider.java +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceProvider.java @@ -10,6 +10,7 @@ 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.marker.IMogoMarkerClickListener; import com.mogo.map.navi.IMogoNaviListener; import com.mogo.module.extensions.ExtensionsModuleConst; import com.mogo.service.module.IMogoModuleLifecycle; @@ -72,4 +73,9 @@ public class EntranceProvider implements IMogoModuleProvider { public void init( Context context ) { } + + @Override + public IMogoMarkerClickListener getMarkerClickListener() { + return null; + } } diff --git a/modules/mogo-module-main/src/main/java/com/mogo/module/main/MainActivity.java b/modules/mogo-module-main/src/main/java/com/mogo/module/main/MainActivity.java index 853740fe9e..897daa5f61 100644 --- a/modules/mogo-module-main/src/main/java/com/mogo/module/main/MainActivity.java +++ b/modules/mogo-module-main/src/main/java/com/mogo/module/main/MainActivity.java @@ -12,6 +12,7 @@ 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.uicontroller.IMogoMapUIController; import com.mogo.module.common.MogoModule; import com.mogo.module.common.MogoModulePaths; import com.mogo.module.extensions.ExtensionsModuleConst; @@ -21,6 +22,7 @@ import com.mogo.module.main.cards.MogoModulesManager; import com.mogo.module.main.cards.OnPageChangeListenerAdapter; import com.mogo.module.main.cards.OrientedViewPager; import com.mogo.module.main.cards.VerticalStackTransformer; +import com.mogo.module.main.fragmentmanager.FragmentStack; import com.mogo.module.service.MarkerServiceHandler; import com.mogo.module.service.ServiceConst; import com.mogo.service.MogoServicePaths; @@ -44,6 +46,7 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme private static final String TAG = "MainActivity"; private IMogoMapService mMogoMapService; + private IMogoMapUIController mMogoMapUIController; private MogoModulesHandler mMogoModuleHandler; private IMogoSocketManager mMogoSocketManager; @@ -79,6 +82,8 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme } } } ); + + FragmentStack.getInstance().init( this, R.id.module_main_id_search_fragment ); } @Override @@ -99,12 +104,16 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme mMogoMapService.getHostListenerRegister().registerMarkerClickListener( this ); } + mMogoMapUIController = mMogoMapService.getMapUIController(); + mMogoModuleHandler.loadModules(); mMogoModuleHandler.onMapLoadedCallback( new Runnable() { @Override public void run() { Logger.d( TAG, "map loaded." + Thread.currentThread().getName() ); loadModules(); + + mMogoMapUIController.setPointToCenter( 0.66145, 0.590688 ); } } ); // 加载地图,触发地图加载完毕回调,在初始化其他卡片模块,保证卡片模块可以正确获取地图相关服务。 @@ -163,6 +172,14 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme } } + @Override + public void onBackPressed() { + super.onBackPressed(); + if ( getSupportFragmentManager().getBackStackEntryCount() > 0 ) { + getSupportFragmentManager().popBackStack(); + } + } + @Override protected void onDestroy() { super.onDestroy(); diff --git a/modules/mogo-module-main/src/main/java/com/mogo/module/main/fragmentmanager/FragmentStack.java b/modules/mogo-module-main/src/main/java/com/mogo/module/main/fragmentmanager/FragmentStack.java new file mode 100644 index 0000000000..42d6b9c350 --- /dev/null +++ b/modules/mogo-module-main/src/main/java/com/mogo/module/main/fragmentmanager/FragmentStack.java @@ -0,0 +1,114 @@ +package com.mogo.module.main.fragmentmanager; + +import android.app.Activity; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentTransaction; + +import com.mogo.utils.logger.Logger; + +import java.util.Stack; + +/** + * @author congtaowang + * @since 2020-01-08 + *
+ * fragment 任务栈 + */ +public class FragmentStack { + + private static final String TAG = "FragmentStack"; + + private static volatile FragmentStack sInstance; + + private Stack< Fragment > mFragmentStack = new Stack<>(); + private FragmentManager mFragmentManager; + private FragmentTransaction mFragmentTransaction; + private int mContainerId; + private Activity mActivity; + private Fragment mCurrentFragment; + + private FragmentStackTransactionListener mFragmentStackTransactionListener; + + private FragmentStack() { + } + + public static FragmentStack getInstance() { + if ( sInstance == null ) { + synchronized ( FragmentStack.class ) { + if ( sInstance == null ) { + sInstance = new FragmentStack(); + } + } + } + return sInstance; + } + + public synchronized void release() { + sInstance = null; + } + + public void init( AppCompatActivity activity, int containerId ) { + mActivity = activity; + mFragmentManager = activity.getSupportFragmentManager(); + mContainerId = containerId; + mFragmentTransaction = mFragmentManager.beginTransaction(); + } + + public void push( Fragment fragment, String tag ) { + if ( fragment == null ) { + return; + } + if ( mFragmentStack.contains( fragment ) ) { + Logger.w( TAG, "fragment has already in stack." ); + return; + } + if ( mCurrentFragment != null ) { + mFragmentTransaction.hide( mCurrentFragment ); + } + mFragmentTransaction.add( mContainerId, fragment, tag ); + mFragmentTransaction.addToBackStack( null ); + mFragmentTransaction.commitAllowingStateLoss(); + mFragmentStack.push( fragment ); + mCurrentFragment = fragment; + + if ( getFragmentStackTransactionListener() != null ) { + getFragmentStackTransactionListener().onTransaction(); + } + } + + public void pop() { + if ( mCurrentFragment != null ) { + mFragmentTransaction.remove( mCurrentFragment ); + } + if ( mFragmentStack.isEmpty() ) { + mFragmentTransaction.commitAllowingStateLoss(); + mCurrentFragment = null; + } else { + Fragment fragment = mFragmentStack.pop(); + if ( fragment != null ) { + mFragmentTransaction.show( fragment ); + mFragmentTransaction.commitAllowingStateLoss(); + } + mCurrentFragment = fragment; + } + + if ( getFragmentStackTransactionListener() != null ) { + getFragmentStackTransactionListener().onTransaction(); + } + } + + public boolean isEmpty() { + return mFragmentStack.isEmpty(); + } + + public FragmentStackTransactionListener getFragmentStackTransactionListener() { + return mFragmentStackTransactionListener; + } + + public void setFragmentStackTransactionListener( FragmentStackTransactionListener fragmentStackTransactionListener ) { + this.mFragmentStackTransactionListener = fragmentStackTransactionListener; + } +} diff --git a/modules/mogo-module-main/src/main/java/com/mogo/module/main/fragmentmanager/FragmentStackTransactionListener.java b/modules/mogo-module-main/src/main/java/com/mogo/module/main/fragmentmanager/FragmentStackTransactionListener.java new file mode 100644 index 0000000000..628a6ec496 --- /dev/null +++ b/modules/mogo-module-main/src/main/java/com/mogo/module/main/fragmentmanager/FragmentStackTransactionListener.java @@ -0,0 +1,12 @@ +package com.mogo.module.main.fragmentmanager; + +/** + * @author congtaowang + * @since 2020-01-08 + *
+ * fragment 栈发生变化 + */ +public interface FragmentStackTransactionListener { + + void onTransaction(); +} diff --git a/modules/mogo-module-main/src/main/java/com/mogo/module/main/fragmentmanager/MogoFragmentManager.java b/modules/mogo-module-main/src/main/java/com/mogo/module/main/fragmentmanager/MogoFragmentManager.java new file mode 100644 index 0000000000..40a364fdb9 --- /dev/null +++ b/modules/mogo-module-main/src/main/java/com/mogo/module/main/fragmentmanager/MogoFragmentManager.java @@ -0,0 +1,34 @@ +package com.mogo.module.main.fragmentmanager; + +import android.content.Context; + +import androidx.fragment.app.Fragment; + +import com.alibaba.android.arouter.facade.annotation.Route; +import com.mogo.service.MogoServicePaths; +import com.mogo.service.fragmentmanager.IMogoFragmentManager; + +/** + * @author congtaowang + * @since 2020-01-08 + *
+ * 描述
+ */
+@Route( path = MogoServicePaths.PATH_FRAGMENT_MANAGER )
+public class MogoFragmentManager implements IMogoFragmentManager {
+
+ @Override
+ public void push( Fragment fragment, String tag ) {
+ FragmentStack.getInstance().push( fragment, tag );
+ }
+
+ @Override
+ public void pop() {
+ FragmentStack.getInstance().pop();
+ }
+
+ @Override
+ public void init( Context context ) {
+
+ }
+}
diff --git a/modules/mogo-module-main/src/main/res/layout/module_main_activity_main.xml b/modules/mogo-module-main/src/main/res/layout/module_main_activity_main.xml
index da46c8d320..5fa6036a70 100644
--- a/modules/mogo-module-main/src/main/res/layout/module_main_activity_main.xml
+++ b/modules/mogo-module-main/src/main/res/layout/module_main_activity_main.xml
@@ -56,4 +56,10 @@
+
+
+ * fragment 管理接口 + */ +public interface IMogoFragmentManager extends IProvider { + + /** + * 显示fragment并加入回退栈 + * + * @param fragment 需要显示的fragment + * @param tag fragment的tag + */ + void push( Fragment fragment, String tag ); + + /** + * 将当前 fragment 出栈 + */ + void pop(); +} 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 9c88e7ad3f..7e6ddc1b1b 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 @@ -10,6 +10,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.marker.IMogoMarkerClickListener; import com.mogo.map.navi.IMogoNaviListener; /** @@ -80,4 +81,11 @@ public interface IMogoModuleProvider extends IProvider { * @return */ IMogoLocationListener getLocationListener(); + + /** + * marker 点击回调 + * + * @return + */ + IMogoMarkerClickListener getMarkerClickListener(); }