This commit is contained in:
wangcongtao
2020-03-02 16:50:07 +08:00
parent 61fcda00ae
commit 135cced9d9
8 changed files with 826 additions and 696 deletions

View File

@@ -1,9 +1,6 @@
package com.mogo.module.main;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.FrameLayout;
@@ -30,20 +27,16 @@ 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.constants.MainConstants;
import com.mogo.module.main.windowview.WindowViewHandler;
import com.mogo.module.service.ServiceConst;
import com.mogo.service.MogoServicePaths;
import com.mogo.service.analytics.IMogoAnalytics;
import com.mogo.service.cardmanager.IMogoCardManager;
import com.mogo.service.fragmentmanager.IMogoFragmentManager;
import com.mogo.service.map.IMogoMapService;
import com.mogo.service.module.IMogoModuleProvider;
import com.mogo.utils.logger.Logger;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author congtaowang
@@ -64,7 +57,7 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme
private IMogoFragmentManager mMogoFragmentManager;
private OrientedViewPager mCardsContainer;
private VerticalStackTransformer transformer;
private VerticalStackTransformer mTransformer;
private CardModulesAdapter mCardModulesAdapter;
private View mHeader;
@@ -83,38 +76,6 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme
private IMogoLocationClient mLocationClient;
private int mCurrentPosition = 0;
private long mCardStartShowTime = 0;
// 埋点接口
private IMogoAnalytics mAnalytics;
private Handler mMsgHandler = new Handler( Looper.getMainLooper() ) {
@Override
public void handleMessage( Message msg ) {
super.handleMessage( msg );
switch ( msg.what ) {
case MainConstants.MSG_LOAD_CARD_MODULES:
loadCardModules();
mMsgHandler.sendEmptyMessageDelayed( MainConstants.MSG_LOAD_INVOKE_FIRST_CARD_PERFORM_EVENT, 1_000L );
break;
case MainConstants.MSG_LOAD_INVOKE_FIRST_CARD_PERFORM_EVENT:
if ( mOnPageChangeListener != null ) {
// 默认触发第一个卡片
mOnPageChangeListener.onPageSelected( 0 );
}
break;
case MainConstants.MSG_TRACK_LAST_CARD_DISPLAY_EVENT:
trackLastCardShowEvent( ( IMogoModuleProvider ) msg.obj );
break;
case MainConstants.MSG_TRACK_CARD_FLIP_EVENT:
trackCardFlipEvent(( IMogoModuleProvider ) msg.obj);
break;
case MainConstants.MSG_HIDE_MAP_COVER_FRAME:
mCoverUpLayout.setVisibility( View.GONE );
break;
}
}
};
private ViewPager.OnPageChangeListener mOnPageChangeListener;
@@ -127,7 +88,7 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme
protected void initViews() {
mCardsContainer = findViewById( R.id.module_main_id_cards_container );
mCardsContainer.setOrientation( OrientedViewPager.Orientation.VERTICAL );
transformer = new VerticalStackTransformer( this );
mTransformer = new VerticalStackTransformer( this );
mCardsContainer.setOnPageChangeListener( mOnPageChangeListener = new OnPageChangeListenerAdapter() {
private boolean mIsLast = true;
private boolean mCardFlipStatus = false;
@@ -137,11 +98,7 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme
final long start = System.currentTimeMillis();
try {
IMogoModuleProvider provider = mCardModulesAdapter.getProvider( mCurrentPosition );
Message msg = Message.obtain();
msg.what = MainConstants.MSG_TRACK_LAST_CARD_DISPLAY_EVENT;
msg.obj = provider;
mMsgHandler.sendMessage( msg );
mPresenter.postTrackLastCardShowEvent( provider );
mCurrentPosition = position;
provider = mCardModulesAdapter.getProvider( mCurrentPosition );
mMogoModuleHandler.setModuleEnable( provider.getModuleName() );
@@ -149,7 +106,7 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme
} catch ( Exception e ) {
e.printStackTrace();
}
Log.i( TAG, "onPageSelected cost " + ( System.currentTimeMillis() - start ) + "ms" );
Logger.i( TAG, "onPageSelected cost " + ( System.currentTimeMillis() - start ) + "ms" );
}
@Override
@@ -160,14 +117,11 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme
if ( !mCardFlipStatus ) {
mCardFlipStatus = true;
final IMogoModuleProvider provider = mCardModulesAdapter.getProvider( mCurrentPosition );
Message msg = Message.obtain();
msg.what = MainConstants.MSG_TRACK_CARD_FLIP_EVENT;
msg.obj = provider;
mMsgHandler.sendMessage( msg );
mPresenter.postTrackCardFlipEvent(provider);
}
} else if ( state == ViewPager.SCROLL_STATE_IDLE ) {
mCardFlipStatus = false;
transformer.resetOffsetScroll();
mTransformer.resetOffsetScroll();
}
int cardSize = mCardModulesAdapter.getCount();
@@ -184,26 +138,17 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme
} else {
mIsLast = true;
}
Log.i( TAG, "onPageScrollStateChanged cost " + ( System.currentTimeMillis() - start ) + "ms" );
Logger.i( TAG, "onPageScrollStateChanged cost " + ( System.currentTimeMillis() - start ) + "ms" );
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
super.onPageScrolled(position, positionOffset, positionOffsetPixels);
Logger.d(TAG,"pageScrolled : offset --- " + positionOffset);
transformer.offsetScrollChanged(positionOffset);
mTransformer.offsetScrollChanged(positionOffset);
}
} );
mMogoFragmentManager = ( IMogoFragmentManager ) ARouter.getInstance().build( MogoServicePaths.PATH_FRAGMENT_MANAGER ).navigation( this );
mMogoFragmentManager.init( this, R.id.module_main_id_search_fragment );
mMogoFragmentManager.registerMainFragmentStackTransactionListener( ( size ) -> {
if ( size == 0 ) {
showLayout();
} else if ( size == 1 ) {
hideLayout();
}
} );
mHeader = findViewById( R.id.module_main_id_header_fragment_container );
mCards = findViewById( R.id.module_main_id_cards_container );
mApps = findViewById( R.id.module_main_id_apps_fragment_container );
@@ -217,38 +162,6 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme
WindowViewHandler.init( mFloatingLayout );
}
/**
* 卡片展示时长埋点
*
* @param provider
*/
private void trackLastCardShowEvent( IMogoModuleProvider provider ) {
if ( provider == null ) {
return;
}
Map< String, Object > properties = new HashMap<>();
properties.put( "appname", provider.getAppName() );
properties.put( "packagename", provider.getAppPackage() );
properties.put( "activeTime", System.currentTimeMillis() - mCardStartShowTime );
properties.put( "type", provider.getModuleName() );
mAnalytics.track( "Launcher_Card_Show", properties );
mCardStartShowTime = System.currentTimeMillis();
}
/**
* 卡片滑动埋点WTF
*/
private void trackCardFlipEvent( IMogoModuleProvider provider ) {
if ( provider == null ) {
return;
}
Map< String, Object > properties = new HashMap<>();
properties.put( "appname", provider.getAppName() );
properties.put( "packagename", provider.getAppPackage() );
properties.put( "type", provider.getModuleName() );
mAnalytics.track( "Launcher_Card_Slide", properties );
}
// 隐藏布局
private void hideLayout() {
mHeader.setVisibility( View.GONE );
@@ -289,10 +202,9 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme
mMogoModuleHandler.setMapLoadedCallback( () -> {
Logger.d( TAG, "map loaded." + Thread.currentThread().getName() );
// 加载地图,触发地图加载完毕回调,在初始化其他卡片模块,保证卡片模块可以正确获取地图相关服务。
mMogoModuleHandler.loadModules();
loadContainerModules();
mMsgHandler.sendEmptyMessageDelayed( MainConstants.MSG_LOAD_CARD_MODULES, 5_000L );
mMsgHandler.sendEmptyMessageDelayed( MainConstants.MSG_HIDE_MAP_COVER_FRAME, 1_000L );
mMogoModuleHandler.loadModules();
mPresenter.delayOperations();
// 显示左边遮罩
mLeftShadowFrame.setVisibility( View.VISIBLE );
@@ -308,8 +220,16 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme
mMogoModuleHandler.loadMapModule( R.id.module_main_id_map_fragment_container );
mMogoCardManager = ( IMogoCardManager ) ARouter.getInstance().build( MogoServicePaths.PATH_CARD_MANAGER ).navigation( this );
mAnalytics = ( IMogoAnalytics ) ARouter.getInstance().build( MogoServicePaths.PATH_UTILS_ANALYTICS ).navigation( this );
mMogoFragmentManager = ( IMogoFragmentManager ) ARouter.getInstance().build( MogoServicePaths.PATH_FRAGMENT_MANAGER ).navigation( this );
mMogoFragmentManager.init( this, R.id.module_main_id_search_fragment );
mMogoFragmentManager.registerMainFragmentStackTransactionListener( ( size ) -> {
if ( size == 0 ) {
showLayout();
} else if ( size == 1 ) {
hideLayout();
}
} );
Log.i("timer", "cost " + (System.currentTimeMillis() - start) + "ms");
}
@@ -325,17 +245,29 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme
mMogoModuleHandler.loadEntrancesModule( R.id.module_main_id_entrance_fragment_container );
}
private void loadCardModules() {
@Override
public void postPickFirstCardEvent() {
if ( mOnPageChangeListener != null ) {
// 默认触发第一个卡片
mOnPageChangeListener.onPageSelected( 0 );
}
}
@Override
public void hideCoverUpLayout() {
mCoverUpLayout.setVisibility( View.GONE );
}
@Override
public void loadCardModules() {
List< IMogoModuleProvider > providers = mMogoModuleHandler.loadCardsModule();
mCardModulesAdapter = new CardModulesAdapter( this, providers );
mCardsContainer.setOffscreenPageLimit( providers.size() );
mCardsContainer.setPageTransformer( true, transformer );
mCardsContainer.setPageTransformer( true, mTransformer );
mCardsContainer.setAdapter( mCardModulesAdapter );
mCardCoverUpBottomLayout.setVisibility(View.VISIBLE);
mCardStartShowTime = System.currentTimeMillis();
}
@@ -354,7 +286,7 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme
@Override
public boolean onMarkerClicked( IMogoMarker marker ) {
switch2( marker.getOwner() );
switch2Card( marker.getOwner() );
if ( mMogoModuleHandler != null ) {
mMogoModuleHandler.onMarkerClicked( marker );
}
@@ -362,7 +294,7 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme
}
@Override
public void switch2( String cardType ) {
public void switch2Card( String cardType ) {
if ( mCardModulesAdapter != null ) {
int position = mCardModulesAdapter.getProviderPosition( cardType );

View File

@@ -1,13 +1,23 @@
package com.mogo.module.main;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.text.TextUtils;
import androidx.annotation.NonNull;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.Observer;
import com.alibaba.android.arouter.launcher.ARouter;
import com.mogo.commons.mvp.Presenter;
import com.mogo.module.main.constants.MainConstants;
import com.mogo.module.main.livedata.CardSwitchLiveData;
import com.mogo.service.MogoServicePaths;
import com.mogo.service.analytics.IMogoAnalytics;
import com.mogo.service.module.IMogoModuleProvider;
import java.util.HashMap;
import java.util.Map;
/**
* @author congtaowang
@@ -17,6 +27,36 @@ import com.mogo.module.main.livedata.CardSwitchLiveData;
*/
public class MainPresenter extends Presenter< MainView > {
// 埋点接口
private IMogoAnalytics mAnalytics;
private long mCardStartShowTime = 0;
private Handler mMsgHandler = new Handler( Looper.getMainLooper() ) {
@Override
public void handleMessage( Message msg ) {
super.handleMessage( msg );
switch ( msg.what ) {
case MainConstants.MSG_LOAD_CARD_MODULES:
mView.loadCardModules();
mMsgHandler.sendEmptyMessageDelayed( MainConstants.MSG_LOAD_INVOKE_FIRST_CARD_PERFORM_EVENT, 1_000L );
break;
case MainConstants.MSG_LOAD_INVOKE_FIRST_CARD_PERFORM_EVENT:
mView.postPickFirstCardEvent();
break;
case MainConstants.MSG_TRACK_LAST_CARD_DISPLAY_EVENT:
trackLastCardShowEvent( ( IMogoModuleProvider ) msg.obj );
break;
case MainConstants.MSG_TRACK_CARD_FLIP_EVENT:
trackCardFlipEvent( ( IMogoModuleProvider ) msg.obj );
break;
case MainConstants.MSG_HIDE_MAP_COVER_FRAME:
mView.hideCoverUpLayout();
break;
}
}
};
public MainPresenter( MainView view ) {
super( view );
}
@@ -28,9 +68,63 @@ public class MainPresenter extends Presenter< MainView > {
if ( TextUtils.isEmpty( to ) ) {
return;
}
mView.switch2( to );
mView.switch2Card( to );
} );
mAnalytics = ( IMogoAnalytics ) ARouter.getInstance().build( MogoServicePaths.PATH_UTILS_ANALYTICS ).navigation( getContext() );
mCardStartShowTime = System.currentTimeMillis();
}
/**
* 卡片展示时长埋点
*
* @param provider
*/
public void trackLastCardShowEvent( IMogoModuleProvider provider ) {
if ( provider == null ) {
return;
}
Map< String, Object > properties = new HashMap<>();
properties.put( "appname", provider.getAppName() );
properties.put( "packagename", provider.getAppPackage() );
properties.put( "activeTime", System.currentTimeMillis() - mCardStartShowTime );
properties.put( "type", provider.getModuleName() );
mAnalytics.track( "Launcher_Card_Show", properties );
mCardStartShowTime = System.currentTimeMillis();
}
/**
* 卡片滑动埋点WTF
*/
public void trackCardFlipEvent( IMogoModuleProvider provider ) {
if ( provider == null ) {
return;
}
Map< String, Object > properties = new HashMap<>();
properties.put( "appname", provider.getAppName() );
properties.put( "packagename", provider.getAppPackage() );
properties.put( "type", provider.getModuleName() );
mAnalytics.track( "Launcher_Card_Slide", properties );
}
/**
* 延时操作
*/
public void delayOperations() {
mMsgHandler.sendEmptyMessageDelayed( MainConstants.MSG_LOAD_CARD_MODULES, 1_000L );
mMsgHandler.sendEmptyMessageDelayed( MainConstants.MSG_HIDE_MAP_COVER_FRAME, 1_500L );
}
public void postTrackLastCardShowEvent( IMogoModuleProvider provider ) {
Message msg = Message.obtain();
msg.what = MainConstants.MSG_TRACK_LAST_CARD_DISPLAY_EVENT;
msg.obj = provider;
mMsgHandler.sendMessage( msg );
}
public void postTrackCardFlipEvent( IMogoModuleProvider provider ) {
Message msg = Message.obtain();
msg.what = MainConstants.MSG_TRACK_CARD_FLIP_EVENT;
msg.obj = provider;
mMsgHandler.sendMessage( msg );
}
}

View File

@@ -10,5 +10,25 @@ import com.mogo.commons.mvp.IView;
*/
public interface MainView extends IView {
void switch2( String cardType );
/**
* 切换卡片
*
* @param cardType
*/
void switch2Card( String cardType );
/**
* 加载卡片
*/
void loadCardModules();
/**
* 触发第一张卡片选中
*/
void postPickFirstCardEvent();
/**
* 隐藏背景
*/
void hideCoverUpLayout();
}