From 0b8f4c85fde2c2003b49757379b24ef9c8c9f3cb Mon Sep 17 00:00:00 2001 From: wangcongtao Date: Wed, 15 Jan 2020 15:23:47 +0800 Subject: [PATCH] add track --- .../module/apps/AppNavigatorFragment.java | 27 +++++- .../com/mogo/module/apps/AppsPresenter.java | 25 ++++++ .../module/extensions/ExtensionsFragment.java | 4 + .../com/mogo/module/main/MainActivity.java | 88 ++++++++++++++++--- .../com/mogo/module/main/MainPresenter.java | 2 + .../com/mogo/module/map/VoiceConstants.java | 6 +- .../service/analytics/IMogoAnalytics.java | 1 - 7 files changed, 133 insertions(+), 20 deletions(-) diff --git a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppNavigatorFragment.java b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppNavigatorFragment.java index 121bd860d6..249509325e 100644 --- a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppNavigatorFragment.java +++ b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppNavigatorFragment.java @@ -13,10 +13,14 @@ import com.mogo.commons.mvp.MvpFragment; import com.mogo.commons.mvp.Presenter; import com.mogo.module.common.MogoModulePaths; import com.mogo.service.MogoServicePaths; +import com.mogo.service.analytics.IMogoAnalytics; import com.mogo.service.fragmentmanager.FragmentDescriptor; import com.mogo.service.fragmentmanager.IMogoFragmentManager; import com.mogo.service.module.IMogoModuleProvider; +import java.util.HashMap; +import java.util.Map; + /** * @author congtaowang * @since 2020-01-06 @@ -38,6 +42,8 @@ public class AppNavigatorFragment extends MvpFragment< AppNavigatorView, AppNavi */ private IMogoModuleProvider mSearchProvider; + private IMogoAnalytics mMogoAnalytics; + @Override protected int getLayoutId() { return R.layout.module_apps_fragment_apps_navigator; @@ -53,16 +59,18 @@ public class AppNavigatorFragment extends MvpFragment< AppNavigatorView, AppNavi mCarSettings = findViewById( R.id.module_apps_ic_car_settings ); mApps = findViewById( R.id.module_apps_id_apps ); mNavigation.setOnClickListener( view -> { - mSearchProvider = ( IMogoModuleProvider ) ARouter.getInstance().build( MogoModulePaths.PATH_MODULE_SEARCH ).navigation(); - final Fragment fragment = mSearchProvider.createFragment( getContext(), null ); - mMogoFragmentManager.push( new FragmentDescriptor.Builder().fragment( fragment ).tag( MogoModulePaths.PATH_FRAGMENT_SEARCH ).notifyMainModule( true ).build() ); + openSearchPanel(); + trackNavigatorClickEvent( 1 ); } ); mMediaCenter.setOnClickListener( view -> { + trackNavigatorClickEvent( 2 ); } ); mCarSettings.setOnClickListener( view -> { + trackNavigatorClickEvent( 3 ); } ); mApps.setOnClickListener( view -> { openAppsPanel(); + trackNavigatorClickEvent( 4 ); } ); } @@ -72,10 +80,17 @@ public class AppNavigatorFragment extends MvpFragment< AppNavigatorView, AppNavi return new AppNavigatorPresenter( this ); } + private void openSearchPanel() { + mSearchProvider = ( IMogoModuleProvider ) ARouter.getInstance().build( MogoModulePaths.PATH_MODULE_SEARCH ).navigation(); + final Fragment fragment = mSearchProvider.createFragment( getContext(), null ); + mMogoFragmentManager.push( new FragmentDescriptor.Builder().fragment( fragment ).tag( MogoModulePaths.PATH_FRAGMENT_SEARCH ).notifyMainModule( true ).build() ); + } + @Override public void onActivityCreated( @Nullable Bundle savedInstanceState ) { super.onActivityCreated( savedInstanceState ); mMogoFragmentManager = ( IMogoFragmentManager ) ARouter.getInstance().build( MogoServicePaths.PATH_FRAGMENT_MANAGER ).navigation( getContext() ); + mMogoAnalytics = ( IMogoAnalytics ) ARouter.getInstance().build( MogoServicePaths.PATH_UTILS_ANALYTICS ).navigation( getContext() ); } @Override @@ -84,6 +99,12 @@ public class AppNavigatorFragment extends MvpFragment< AppNavigatorView, AppNavi mMogoFragmentManager.push( new FragmentDescriptor.Builder().hasTransition( true ).fragment( mAppsFragment ).tag( "apps" ).notifyMainModule( false ).build() ); } + private void trackNavigatorClickEvent( int type ) { + final Map< String, Object > properties = new HashMap<>(); + properties.put( "type", type ); + mMogoAnalytics.track( "Launcher_APP_Icon", properties ); + } + @Override public void closeAppsPanel() { if ( getActivity() != null ) { diff --git a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppsPresenter.java b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppsPresenter.java index 370543ed93..088d3b7ac7 100644 --- a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppsPresenter.java +++ b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppsPresenter.java @@ -5,13 +5,19 @@ import android.content.Intent; import androidx.annotation.NonNull; import androidx.lifecycle.LifecycleOwner; +import com.alibaba.android.arouter.launcher.ARouter; import com.mogo.commons.mvp.Presenter; import com.mogo.module.apps.model.AppInfo; import com.mogo.module.apps.model.AppsModel; +import com.mogo.service.MogoServicePaths; +import com.mogo.service.analytics.IMogoAnalytics; import com.mogo.utils.ThreadPoolService; import com.mogo.utils.TipToast; import com.mogo.utils.UiThreadHandler; +import java.util.HashMap; +import java.util.Map; + /** * @author congtaowang * @since 2019-12-30 @@ -22,6 +28,8 @@ public class AppsPresenter extends Presenter< AppsView > { private static final String TAG = "AppsPresenter"; + private IMogoAnalytics mAnalytics; + public AppsPresenter( AppsView view ) { super( view ); } @@ -35,6 +43,8 @@ public class AppsPresenter extends Presenter< AppsView > { renderAppsList(); } } ); + + mAnalytics = ( IMogoAnalytics ) ARouter.getInstance().build( MogoServicePaths.PATH_UTILS_ANALYTICS ).navigation( getContext() ); } private void renderAppsList() { @@ -55,6 +65,8 @@ public class AppsPresenter extends Presenter< AppsView > { return; } + trackAppClicked( appInfo ); + try { Intent intent = getContext().getPackageManager().getLaunchIntentForPackage( appInfo.getPackageName() ); intent.addFlags( Intent.FLAG_ACTIVITY_NEW_TASK ); @@ -64,6 +76,19 @@ public class AppsPresenter extends Presenter< AppsView > { } } + + private void trackAppClicked( AppInfo appInfo ) { + if ( appInfo == null ) { + return; + } + Map< String, Object > properties = new HashMap<>(); + properties.put( "appname", appInfo.getName() ); + properties.put( "packagename", appInfo.getPackageName() ); + properties.put( "appversion", appInfo.getVersionName() ); + properties.put( "from", 1 ); + mAnalytics.track( "appenterfront", properties ); + } + @Override public void onDestroy( @NonNull LifecycleOwner owner ) { super.onDestroy( owner ); diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/ExtensionsFragment.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/ExtensionsFragment.java index 63442e36c2..3395db70fd 100644 --- a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/ExtensionsFragment.java +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/ExtensionsFragment.java @@ -15,6 +15,7 @@ import com.mogo.commons.voice.AIAssist; import com.mogo.module.extensions.anim.AnimRes; import com.mogo.module.extensions.anim.JSurfaceView; import com.mogo.service.MogoServicePaths; +import com.mogo.service.analytics.IMogoAnalytics; import com.mogo.service.fragmentmanager.IMogoFragmentManager; import com.mogo.utils.UiThreadHandler; @@ -41,6 +42,7 @@ public class ExtensionsFragment extends MvpFragment< ExtensionsView, ExtensionsP private TextView mMsgCounter; private IMogoFragmentManager mMogoFragmentManager; + private IMogoAnalytics mAnalytics; @Override protected int getLayoutId() { @@ -57,6 +59,7 @@ public class ExtensionsFragment extends MvpFragment< ExtensionsView, ExtensionsP } ); mVoiceMsg.setOnClickListener( view -> { AIAssist.startAssistant( getContext() ); + mAnalytics.track( "Launcher_xiaozhi_Click", null ); } ); mTime = findViewById( R.id.module_ext_id_time ); @@ -94,6 +97,7 @@ public class ExtensionsFragment extends MvpFragment< ExtensionsView, ExtensionsP @Override public void onActivityCreated( @Nullable Bundle savedInstanceState ) { super.onActivityCreated( savedInstanceState ); + mAnalytics = ( IMogoAnalytics ) ARouter.getInstance().build( MogoServicePaths.PATH_UTILS_ANALYTICS ).navigation( getContext() ); mVoiceIcon.startAnim(); } 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 43a74ae16f..deb4f5b845 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 @@ -1,11 +1,13 @@ package com.mogo.module.main; import android.os.Bundle; +import android.os.SystemClock; import android.view.View; import android.widget.FrameLayout; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.viewpager.widget.ViewPager; import com.alibaba.android.arouter.launcher.ARouter; import com.mogo.commons.mvp.MvpActivity; @@ -27,6 +29,7 @@ import com.mogo.module.main.cards.VerticalStackTransformer; 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.impl.fragmentmanager.FragmentStack; @@ -34,7 +37,9 @@ 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 @@ -74,6 +79,10 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme // 是否是点击Marker进行的页面切换,false-不是,true-是 private boolean isClickMarker; + private long mCardStartShowTime = 0; + + private IMogoAnalytics mAnalytics; + @Override protected int getLayoutId() { return R.layout.module_main_activity_main; @@ -85,18 +94,71 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme mCardsContainer.setOrientation( OrientedViewPager.Orientation.VERTICAL ); mCardsContainer.setOnPageChangeListener( new OnPageChangeListenerAdapter() { + + private boolean mCardFlipStatus = false; + @Override public void onPageSelected( int position ) { try { mCurrentPosition = position; - mMogoModuleHandler.setEnable(mCardModulesAdapter.getProvider(position).getModuleName()); - if (!isClickMarker) { - mMogoCardManager.invoke(position, mMogoModuleHandler.getCurrentModuleName()); + final IMogoModuleProvider provider = mCardModulesAdapter.getProvider( position ); + mMogoModuleHandler.setEnable( provider.getModuleName() ); + if ( !isClickMarker ) { + mMogoCardManager.invoke( position, mMogoModuleHandler.getCurrentModuleName() ); } + trackCardSelectedEvent( provider ); } catch ( Exception e ) { e.printStackTrace(); } } + + @Override + public void onPageScrolled( int position, float positionOffset, int positionOffsetPixels ) { + super.onPageScrolled( position, positionOffset, positionOffsetPixels ); + } + + @Override + public void onPageScrollStateChanged( int state ) { + super.onPageScrollStateChanged( state ); + if ( state == ViewPager.SCROLL_STATE_DRAGGING ) { + if ( !mCardFlipStatus ) { + mCardFlipStatus = true; + final IMogoModuleProvider provider = mCardModulesAdapter.getProvider( mCurrentPosition ); + trackCardFlipEvent( provider ); + } + } else if ( state == ViewPager.SCROLL_STATE_IDLE ) { + mCardFlipStatus = false; + } + } + + /** + * 卡片展示时长埋点 + * @param provider + */ + private void trackCardSelectedEvent( 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 ); + 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() ); + mAnalytics.track( "Launcher_Card_Slide", properties ); + } } ); mMogoFragmentManager = ( IMogoFragmentManager ) ARouter.getInstance().build( MogoServicePaths.PATH_FRAGMENT_MANAGER ).navigation( this ); @@ -157,14 +219,11 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme mMogoMapUIController = mMogoMapService.getMapUIController(); mMogoModuleHandler.loadModules(); - mMogoModuleHandler.onMapLoadedCallback( new Runnable() { - @Override - public void run() { - Logger.d( TAG, "map loaded." + Thread.currentThread().getName() ); - loadModules(); - mShadowFrame.setVisibility( View.VISIBLE ); - mMogoMapUIController.setPointToCenter( 0.66145, 0.590688 ); - } + mMogoModuleHandler.onMapLoadedCallback( () -> { + Logger.d( TAG, "map loaded." + Thread.currentThread().getName() ); + loadModules(); + mShadowFrame.setVisibility( View.VISIBLE ); + mMogoMapUIController.setPointToCenter( 0.66145, 0.590688 ); } ); // 加载地图,触发地图加载完毕回调,在初始化其他卡片模块,保证卡片模块可以正确获取地图相关服务。 mMogoModuleHandler.loadMap( R.id.module_main_id_map_fragment_container ); @@ -177,6 +236,7 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme mLocationClient.start(); mMogoCardManager = ( IMogoCardManager ) ARouter.getInstance().build( MogoServicePaths.PATH_CARD_MANAGER ).navigation( this ); + mAnalytics = ( IMogoAnalytics ) ARouter.getInstance().build( MogoServicePaths.PATH_UTILS_ANALYTICS ).navigation( this ); } private void loadModules() { @@ -187,6 +247,8 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme mCardsContainer.setPageTransformer( true, new VerticalStackTransformer( this ) ); mCardsContainer.setAdapter( mCardModulesAdapter ); mCardsContainer.setCurrentItem( mCurrentPosition ); + + mCardStartShowTime = System.currentTimeMillis(); } @@ -220,8 +282,8 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme int position = mCardModulesAdapter.getProviderPosition( cardType ); if ( position != -1 ) { mCardsContainer.setCurrentItem( position, Math.abs( mCurrentPosition - position ) == 1 ); - if (!isClickMarker) { - mMogoCardManager.invoke(position, mMogoModuleHandler.getCurrentModuleName()); + if ( !isClickMarker ) { + mMogoCardManager.invoke( position, mMogoModuleHandler.getCurrentModuleName() ); } } else { Logger.e( TAG, "Can't find type of %s's position", cardType ); diff --git a/modules/mogo-module-main/src/main/java/com/mogo/module/main/MainPresenter.java b/modules/mogo-module-main/src/main/java/com/mogo/module/main/MainPresenter.java index fe0d3db3d4..0fe4ebc494 100644 --- a/modules/mogo-module-main/src/main/java/com/mogo/module/main/MainPresenter.java +++ b/modules/mogo-module-main/src/main/java/com/mogo/module/main/MainPresenter.java @@ -31,4 +31,6 @@ public class MainPresenter extends Presenter< MainView > { mView.switch2( to ); } ); } + + } diff --git a/modules/mogo-module-map/src/main/java/com/mogo/module/map/VoiceConstants.java b/modules/mogo-module-map/src/main/java/com/mogo/module/map/VoiceConstants.java index 6529e59de1..577b2bc2c4 100644 --- a/modules/mogo-module-map/src/main/java/com/mogo/module/map/VoiceConstants.java +++ b/modules/mogo-module-map/src/main/java/com/mogo/module/map/VoiceConstants.java @@ -118,20 +118,20 @@ public class VoiceConstants { */ public static final String CMD_MAP_STOP_NAVI_MODE = "com.ileja.navi.route.stop"; public static final String CMD_MAP_STOP_NAVI_MODE_UN_WAKEUP = "CMD_MAP_STOP_NAVI_MODE_UN_WAKEUP"; - public static final String[] CMD_MAP_STOP_NAVI_MODE_TRIGGER_WORDS = {"停止导航/结束导航/取消导航/放弃导航/退出导航/关闭导航"}; + public static final String[] CMD_MAP_STOP_NAVI_MODE_TRIGGER_WORDS = {"停止导航", "结束导航", "取消导航", "放弃导航", "退出导航", "关闭导航"}; /** * 车头朝上 */ - public static final String CMD_MAP_CAR_UP_MODE = "com.ileja.navi.mode.car_up"; + public static final String CMD_MAP_CAR_UP_MODE = "com.ileja.traffic.head.up"; public static final String CMD_MAP_CAR_UP_MODE_UN_WAKEUP = "CMD_MAP_CAR_UP_MODE_UN_WAKEUP"; public static final String[] CMD_MAP_CAR_UP_MODE_TRIGGER_WORDS = {"车头朝上"}; /** * 北朝上 */ - public static final String CMD_MAP_NORTH_UP_MODE = "com.ileja.navi.mode.north_up"; + public static final String CMD_MAP_NORTH_UP_MODE = "com.ileja.traffic.north.up"; public static final String CMD_MAP_NORTH_UP_MODE_UN_WAKEUP = "CMD_MAP_NORTH_UP_MODE_UN_WAKEUP"; public static final String[] CMD_MAP_NORTH_UP_MODE_TRIGGER_WORDS = {"北朝上"}; diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/analytics/IMogoAnalytics.java b/services/mogo-service-api/src/main/java/com/mogo/service/analytics/IMogoAnalytics.java index d3ef9f6bdb..e8fe14fe8b 100644 --- a/services/mogo-service-api/src/main/java/com/mogo/service/analytics/IMogoAnalytics.java +++ b/services/mogo-service-api/src/main/java/com/mogo/service/analytics/IMogoAnalytics.java @@ -15,7 +15,6 @@ import java.util.Map; @Keep public interface IMogoAnalytics extends IProvider { - /** * 埋点 *