diff --git a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapViewWrapper.java b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapViewWrapper.java index 7cca05598b..766e1d8f0b 100644 --- a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapViewWrapper.java +++ b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapViewWrapper.java @@ -557,7 +557,6 @@ public class AMapViewWrapper implements IMogoMapView, Logger.d( TAG, Log.getStackTraceString( new Throwable() ) ); } Logger.d( TAG, "Zoom锁定锁车比例尺 %s", var1 ); - // TODO: 2020/8/27 设置锁车比例尺 // mMapView.setLockZoom( var1 ); } } 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 ed8d6d9ca8..6d31751c17 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 @@ -6,14 +6,12 @@ import androidx.lifecycle.LifecycleOwner; import com.mogo.commons.mvp.Presenter; import com.mogo.module.apps.applaunch.AppLaunchFilter; import com.mogo.module.apps.applaunch.AppLauncher; -import com.mogo.module.apps.applaunch.CardAppLauncher; import com.mogo.module.apps.applaunch.GuideShowLauncher; import com.mogo.module.apps.applaunch.InternalFunctionLauncher; import com.mogo.module.apps.model.AppInfo; import com.mogo.module.apps.model.AppsModel; import com.mogo.module.apps.model.UnScannedApps; import com.mogo.service.analytics.IMogoAnalytics; -import com.mogo.service.cardmanager.IMogoCardManager; import com.mogo.utils.ThreadPoolService; import com.mogo.utils.UiThreadHandler; import com.mogo.utils.logger.Logger; @@ -38,16 +36,11 @@ public class AppsPresenter extends Presenter< AppsView > { private IMogoAnalytics mAnalytics; private AppLaunchFilter mLauncher; - private IMogoCardManager mCardManager; - public AppsPresenter( AppsView view ) { super( view ); - mCardManager = AppServiceHandler.getApis().getCardManagerApi(); InternalFunctionLauncher internalFunctionLauncher = new InternalFunctionLauncher( getContext() ); - CardAppLauncher cardAppLauncher = new CardAppLauncher( this, mCardManager ); GuideShowLauncher guideShowLauncher = new GuideShowLauncher( AppServiceHandler.getApis().getMapServiceApi().getNavi( getContext() ) ); - internalFunctionLauncher.setNext( cardAppLauncher ); - cardAppLauncher.setNext( guideShowLauncher ); + internalFunctionLauncher.setNext( guideShowLauncher ); guideShowLauncher.setNext( new AppLauncher() ); mLauncher = internalFunctionLauncher; } @@ -217,7 +210,6 @@ public class AppsPresenter extends Presenter< AppsView > { mView = null; mLauncher.destroy(); mAnalytics = null; - mCardManager = null; if ( mLauncher != null ) { mLauncher.destroy(); } diff --git a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/applaunch/CardAppLauncher.java b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/applaunch/CardAppLauncher.java deleted file mode 100644 index 117dd06cb8..0000000000 --- a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/applaunch/CardAppLauncher.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.mogo.module.apps.applaunch; - -import android.content.Context; - -import com.mogo.module.apps.AppsPresenter; -import com.mogo.module.apps.model.AppInfo; -import com.mogo.service.cardmanager.IMogoCardManager; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author congtaowang - * @since 2020-02-09 - *

- * 描述 - */ -public class CardAppLauncher extends BaseAppLauncher { - - private static Map< String, String > sCardApps = new HashMap<>(); - - static { - sCardApps.put( "com.zhidao.roadcondition.split", "CARD_TYPE_ROAD_CONDITION" ); - sCardApps.put( "com.zhidao.roadcondition", "CARD_TYPE_ROAD_CONDITION" ); - sCardApps.put( "com.zhidao.imdemo", "CARD_TYPE_CARS_CHATTING" ); - } - - private AppsPresenter mAppsPresenter; - private IMogoCardManager mCardManager; - - public CardAppLauncher( AppsPresenter mAppsPresenter, IMogoCardManager mCardManager ) { - this.mAppsPresenter = mAppsPresenter; - this.mCardManager = mCardManager; - } - - @Override - public void launch( Context context, AppInfo appInfo ) { - if ( getNext() != null ) { - getNext().launch( context, appInfo ); - } - } - - @Override - public void destroy() { - mAppsPresenter = null; - mCardManager = null; - if ( getNext() != null ) { - getNext().destroy(); - setNext( null ); - } - } -} diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/map/MapCenterPointStrategy.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/map/MapCenterPointStrategy.java index 1d4cdb1e0b..c117f81214 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/map/MapCenterPointStrategy.java +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/map/MapCenterPointStrategy.java @@ -1,7 +1,7 @@ package com.mogo.module.common.map; +import com.mogo.commons.debug.DebugConfig; import com.mogo.map.uicontroller.IMogoMapUIController; -import com.mogo.module.common.utils.CarSeries; import com.mogo.utils.UiThreadHandler; import com.mogo.utils.logger.Logger; @@ -18,112 +18,102 @@ public class MapCenterPointStrategy { private static final String TAG = "MapCenterPointStrategy"; - private static Map< Integer, Map< Integer, MapCenterPoint > > sStrategies = new HashMap<>(); + private static Map< Integer, Map< String, MapCenterPoint > > sStrategies = new HashMap<>(); public static final MapCenterPoint DEFAULT = new MapCenterPoint( 0.677734D, 0.5733333D ); - private static MapCenterPoint sLastPoint = DEFAULT; - public static void init() { { // 选点场景,定位中心点 - Map< Integer, MapCenterPoint > choosePoint = new HashMap<>(); - choosePoint.put( CarSeries.CAR_SERIES_D80X, new MapCenterPoint( 0.5D, 0.5D ) ); - choosePoint.put( CarSeries.CAR_SERIES_E84X, new MapCenterPoint( 0.5D, 0.5D ) ); - choosePoint.put( CarSeries.CAR_SERIES_E84XCD, new MapCenterPoint( 0.5D, 0.5D ) ); - choosePoint.put( CarSeries.CAR_SERIES_F80X, new MapCenterPoint( 0.5D, 0.5D ) ); + Map< String, MapCenterPoint > choosePoint = new HashMap<>(); + choosePoint.put( "d80x", new MapCenterPoint( 0.5D, 0.5D ) ); + choosePoint.put( "em4", new MapCenterPoint( 0.5D, 0.5D ) ); + choosePoint.put( "e8xx", new MapCenterPoint( 0.5D, 0.5D ) ); + choosePoint.put( "f80x", new MapCenterPoint( 0.5D, 0.5D ) ); + choosePoint.put( "f8xx", new MapCenterPoint( 0.5D, 0.5D ) ); sStrategies.put( Scene.CHOOSE_POINT, choosePoint ); } { // 导航场景,定位视图右下角偏下 - Map< Integer, MapCenterPoint > navi = new HashMap<>(); - navi.put( CarSeries.CAR_SERIES_D80X, new MapCenterPoint( 0.669444444444444, 0.573333333333D ) ); - navi.put( CarSeries.CAR_SERIES_E84X, new MapCenterPoint( 0.734375D, 0.573333333333D ) ); - navi.put( CarSeries.CAR_SERIES_E84XCD, new MapCenterPoint( 0.734375D, 0.573333333333D ) ); - navi.put( CarSeries.CAR_SERIES_F80X, new MapCenterPoint( 0.705208333D, 0.575D ) ); + Map< String, MapCenterPoint > navi = new HashMap<>(); + navi.put( "d80x", new MapCenterPoint( 0.669444444444444, 0.573333333333D ) ); + navi.put( "em4", new MapCenterPoint( 0.734375D, 0.573333333333D ) ); + navi.put( "e8xx", new MapCenterPoint( 0.734375D, 0.573333333333D ) ); + navi.put( "f80x", new MapCenterPoint( 0.705208333D, 0.575D ) ); + navi.put( "f8xx", new MapCenterPoint( 0.705208333D, 0.575D ) ); sStrategies.put( Scene.NAVI, navi ); } { // 导航场景 vs 道路事件展示场景,定位视图右下角偏下 - Map< Integer, MapCenterPoint > naviWithRoadEvent = new HashMap<>(); - naviWithRoadEvent.put( CarSeries.CAR_SERIES_D80X, new MapCenterPoint( 0.669444444444444, 0.73936170212766D ) ); - naviWithRoadEvent.put( CarSeries.CAR_SERIES_E84X, new MapCenterPoint( 0.734375D, 0.73936170212766D ) ); - naviWithRoadEvent.put( CarSeries.CAR_SERIES_E84XCD, new MapCenterPoint( 0.734375D, 0.73936170212766D ) ); - naviWithRoadEvent.put( CarSeries.CAR_SERIES_F80X, new MapCenterPoint( 0.705208333D, 0.683333333333D ) ); + Map< String, MapCenterPoint > naviWithRoadEvent = new HashMap<>(); + naviWithRoadEvent.put( "d80x", new MapCenterPoint( 0.669444444444444, 0.73936170212766D ) ); + naviWithRoadEvent.put( "em4", new MapCenterPoint( 0.734375D, 0.73936170212766D ) ); + naviWithRoadEvent.put( "e8xx", new MapCenterPoint( 0.734375D, 0.73936170212766D ) ); + naviWithRoadEvent.put( "f80x", new MapCenterPoint( 0.705208333D, 0.683333333333D ) ); + naviWithRoadEvent.put( "f8xx", new MapCenterPoint( 0.705208333D, 0.683333333333D ) ); sStrategies.put( Scene.NAVI_WITH_ROAD_EVENT, naviWithRoadEvent ); } { // 巡航场景 - Map< Integer, MapCenterPoint > aimless = new HashMap<>(); - aimless.put( CarSeries.CAR_SERIES_D80X, new MapCenterPoint( 0.669444444444444, 0.5D ) ); - aimless.put( CarSeries.CAR_SERIES_E84X, new MapCenterPoint( 0.734375D, 0.5D ) ); - aimless.put( CarSeries.CAR_SERIES_E84XCD, new MapCenterPoint( 0.734375D, 0.5D ) ); - aimless.put( CarSeries.CAR_SERIES_F80X, new MapCenterPoint( 0.705208333D, 0.5D ) ); + Map< String, MapCenterPoint > aimless = new HashMap<>(); + aimless.put( "d80x", new MapCenterPoint( 0.669444444444444, 0.5D ) ); + aimless.put( "em4", new MapCenterPoint( 0.734375D, 0.5D ) ); + aimless.put( "e8xx", new MapCenterPoint( 0.734375D, 0.5D ) ); + aimless.put( "f80x", new MapCenterPoint( 0.705208333D, 0.5D ) ); + aimless.put( "f8xx", new MapCenterPoint( 0.705208333D, 0.5D ) ); sStrategies.put( Scene.AIMLESS, aimless ); } { // 巡航场景 vs 道路事件展示场景 - Map< Integer, MapCenterPoint > aimlessWithRoadEvent = new HashMap<>(); - aimlessWithRoadEvent.put( CarSeries.CAR_SERIES_D80X, new MapCenterPoint( 0.669444444444444, 0.68617 ) ); - aimlessWithRoadEvent.put( CarSeries.CAR_SERIES_E84X, new MapCenterPoint( 0.734375D, 0.68617 ) ); - aimlessWithRoadEvent.put( CarSeries.CAR_SERIES_E84XCD, new MapCenterPoint( 0.734375D, 0.68617 ) ); - aimlessWithRoadEvent.put( CarSeries.CAR_SERIES_F80X, new MapCenterPoint( 0.705208333D, 0.599074074D ) ); + Map< String, MapCenterPoint > aimlessWithRoadEvent = new HashMap<>(); + aimlessWithRoadEvent.put( "d80x", new MapCenterPoint( 0.669444444444444, 0.68617 ) ); + aimlessWithRoadEvent.put( "em4", new MapCenterPoint( 0.734375D, 0.68617 ) ); + aimlessWithRoadEvent.put( "e8xx", new MapCenterPoint( 0.734375D, 0.68617 ) ); + aimlessWithRoadEvent.put( "f80x", new MapCenterPoint( 0.705208333D, 0.599074074D ) ); + aimlessWithRoadEvent.put( "f8xx", new MapCenterPoint( 0.705208333D, 0.599074074D ) ); sStrategies.put( Scene.AIMLESS_WITH_ROAD_EVENT, aimlessWithRoadEvent ); } { // 规划路线,定位视图右边 - Map< Integer, MapCenterPoint > calculatePath = new HashMap<>(); - calculatePath.put( CarSeries.CAR_SERIES_D80X, new MapCenterPoint( 0.733398D, 0.610833D ) ); - calculatePath.put( CarSeries.CAR_SERIES_E84X, new MapCenterPoint( 0.733398D, 0.610833D ) ); - calculatePath.put( CarSeries.CAR_SERIES_E84XCD, new MapCenterPoint( 0.733398D, 0.610833D ) ); - calculatePath.put( CarSeries.CAR_SERIES_F80X, new MapCenterPoint( 0.703125D, 0.6083333D ) ); + Map< String, MapCenterPoint > calculatePath = new HashMap<>(); + calculatePath.put( "d80x", new MapCenterPoint( 0.733398D, 0.610833D ) ); + calculatePath.put( "em4", new MapCenterPoint( 0.733398D, 0.610833D ) ); + calculatePath.put( "e8xx", new MapCenterPoint( 0.733398D, 0.610833D ) ); + calculatePath.put( "f80x", new MapCenterPoint( 0.703125D, 0.6083333D ) ); + calculatePath.put( "f8xx", new MapCenterPoint( 0.703125D, 0.6083333D ) ); sStrategies.put( Scene.CALCULATE_PATH, calculatePath ); } { // 分类搜索,定位视图右边 - Map< Integer, MapCenterPoint > categorySearch = new HashMap<>(); - categorySearch.put( CarSeries.CAR_SERIES_D80X, new MapCenterPoint( 0.733398D, 0.5D ) ); - categorySearch.put( CarSeries.CAR_SERIES_E84X, new MapCenterPoint( 0.733398D, 0.5D ) ); - categorySearch.put( CarSeries.CAR_SERIES_E84XCD, new MapCenterPoint( 0.733398D, 0.5D ) ); - categorySearch.put( CarSeries.CAR_SERIES_F80X, new MapCenterPoint( 0.733594D, 0.5D ) ); + Map< String, MapCenterPoint > categorySearch = new HashMap<>(); + categorySearch.put( "d80x", new MapCenterPoint( 0.733398D, 0.5D ) ); + categorySearch.put( "em4", new MapCenterPoint( 0.733398D, 0.5D ) ); + categorySearch.put( "e8xx", new MapCenterPoint( 0.733398D, 0.5D ) ); + categorySearch.put( "f80x", new MapCenterPoint( 0.733594D, 0.5D ) ); + categorySearch.put( "f8xx", new MapCenterPoint( 0.733594D, 0.5D ) ); sStrategies.put( Scene.CATEGORY_SEARCH, categorySearch ); } { // V2X,场景视图右边 - Map< Integer, MapCenterPoint > categoryV2XEvent = new HashMap<>(); - categoryV2XEvent.put( CarSeries.CAR_SERIES_D80X, new MapCenterPoint( 0.669444444444444, 0.7D ) ); - categoryV2XEvent.put( CarSeries.CAR_SERIES_E84X, new MapCenterPoint( 0.677734375D, 0.7D ) ); - categoryV2XEvent.put( CarSeries.CAR_SERIES_E84XCD, new MapCenterPoint( 0.677734375D, 0.7D ) ); - categoryV2XEvent.put( CarSeries.CAR_SERIES_F80X, new MapCenterPoint( 0.6963541D, 0.65D ) ); + Map< String, MapCenterPoint > categoryV2XEvent = new HashMap<>(); + categoryV2XEvent.put( "d80x", new MapCenterPoint( 0.669444444444444, 0.7D ) ); + categoryV2XEvent.put( "em4", new MapCenterPoint( 0.677734375D, 0.7D ) ); + categoryV2XEvent.put( "e8xx", new MapCenterPoint( 0.677734375D, 0.7D ) ); + categoryV2XEvent.put( "f80x", new MapCenterPoint( 0.6963541D, 0.65D ) ); + categoryV2XEvent.put( "f8xx", new MapCenterPoint( 0.6963541D, 0.65D ) ); sStrategies.put( Scene.CATEGORY_V2X_EVENT, categoryV2XEvent ); } - - try { - sLastPoint = sStrategies.get( Scene.AIMLESS ).get( CarSeries.getSeries() ); - } catch ( Exception e ) { - sLastPoint = DEFAULT; - } } - public static void restoreLastScene( IMogoMapUIController controller ) { - if ( sLastPoint == null ) { - return; - } - if ( controller == null ) { - return; - } - controller.setPointToCenter( sLastPoint.x, sLastPoint.y ); - } - - public static void addScene( int scene, Map< Integer, MapCenterPoint > config ) { + public static void addScene( int scene, Map< String, MapCenterPoint > config ) { if ( sStrategies.containsKey( scene ) ) { Logger.w( TAG, "scene has already defined, append config..." ); } @@ -147,25 +137,21 @@ public class MapCenterPointStrategy { if ( !sStrategies.containsKey( scene ) ) { Logger.w( TAG, "no strategy for scene: %s, use DEFAULT", scene ); controller.setPointToCenter( DEFAULT.x, DEFAULT.y ); - sLastPoint = DEFAULT; return; } - Map< Integer, MapCenterPoint > points = sStrategies.get( scene ); - int car = CarSeries.getSeries(); + Map< String, MapCenterPoint > points = sStrategies.get( scene ); + String car = DebugConfig.getProductFlavor(); if ( !points.containsKey( car ) ) { Logger.w( TAG, "no strategy for series: %s, use DEFAULT", scene ); controller.setPointToCenter( DEFAULT.x, DEFAULT.y ); - sLastPoint = DEFAULT; return; } MapCenterPoint point = points.get( car ); if ( point == null ) { Logger.w( TAG, "no strategy config for series: %s, use DEFAULT", scene ); controller.setPointToCenter( DEFAULT.x, DEFAULT.y ); - sLastPoint = DEFAULT; return; } - sLastPoint = point; controller.setPointToCenter( point.x, point.y ); } diff --git a/modules/mogo-module-main/README.md b/modules/mogo-module-main/README.md index e7ab07ca99..2b77272bbe 100644 --- a/modules/mogo-module-main/README.md +++ b/modules/mogo-module-main/README.md @@ -12,7 +12,5 @@ ## 应用内浮窗管理:车聊聊、音乐等 -## 顶部弹窗管理 - ## scheme 跳转管理 diff --git a/modules/mogo-module-main/consumer-rules.pro b/modules/mogo-module-main/consumer-rules.pro index e5fa092e14..88d79dd435 100644 --- a/modules/mogo-module-main/consumer-rules.pro +++ b/modules/mogo-module-main/consumer-rules.pro @@ -1,8 +1,5 @@ #-----MainModule----- --keep class com.mogo.module.main.cards.CardIntroduceConfig.*{*;} -keep class com.mogo.module.main.cards.MogoModulesHandler --keep class com.mogo.module.main.cards.HorizentalBaseTransformer --keep class com.mogo.module.main.cards.VerticalBaseTransformer -keep class com.mogo.module.main.constants.**{*;} -keep class com.mogo.module.main.livedata.**{*;} -keep class com.mogo.module.main.service.MogoMainService diff --git a/modules/mogo-module-main/proguard-rules.pro b/modules/mogo-module-main/proguard-rules.pro index 8cb438dc4b..2e4c54a15f 100644 --- a/modules/mogo-module-main/proguard-rules.pro +++ b/modules/mogo-module-main/proguard-rules.pro @@ -23,8 +23,6 @@ #-----MainModule----- -keep class com.mogo.module.main.cards.CardIntroduceConfig.*{*;} -keep class com.mogo.module.main.cards.MogoModulesHandler --keep class com.mogo.module.main.cards.HorizentalBaseTransformer --keep class com.mogo.module.main.cards.VerticalBaseTransformer -keep class com.mogo.module.main.constants.**{*;} -keep class com.mogo.module.main.livedata.**{*;} -keep class com.mogo.module.main.service.MogoMainService diff --git a/modules/mogo-module-main/src/main/java/com/mogo/module/main/MogoCardManager.java b/modules/mogo-module-main/src/main/java/com/mogo/module/main/MogoCardManager.java index 69b8c1bdd9..59f7d5a63c 100644 --- a/modules/mogo-module-main/src/main/java/com/mogo/module/main/MogoCardManager.java +++ b/modules/mogo-module-main/src/main/java/com/mogo/module/main/MogoCardManager.java @@ -3,15 +3,10 @@ package com.mogo.module.main; import android.content.Context; import com.alibaba.android.arouter.facade.annotation.Route; -import com.mogo.module.main.livedata.CardInfo; -import com.mogo.module.main.livedata.CardSwitchLiveData; import com.mogo.service.MogoServicePaths; import com.mogo.service.cardmanager.IMogoCardChangedListener; import com.mogo.service.cardmanager.IMogoCardManager; - -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; +import com.mogo.utils.logger.Logger; /** * @author congtaowang @@ -19,42 +14,35 @@ import java.util.Map; *

* 卡片控制 */ +@Deprecated @Route( path = MogoServicePaths.PATH_CARD_MANAGER ) public class MogoCardManager implements IMogoCardManager { - private static final Map< String, IMogoCardChangedListener > sListeners = new HashMap<>(); + private static final String TAG = "MogoCardManager"; @Override public void switch2( String cardType ) { - CardSwitchLiveData.getInstance().postValue( new CardInfo( cardType, false ) ); + Logger.w( TAG, "Useless, do not invoke anymore." ); } @Override public void registerCardChangedListener( String tag, IMogoCardChangedListener listener ) { - sListeners.put( tag, listener ); + Logger.w( TAG, "Useless, do not invoke anymore." ); } @Override public void unregisterCardChangedListener( String tag ) { - sListeners.remove( tag ); + Logger.w( TAG, "Useless, do not invoke anymore." ); } @Override public void invoke( int position, String moduleName ) { - if ( sListeners != null && !sListeners.isEmpty() ) { - Iterator< IMogoCardChangedListener > iterator = sListeners.values().iterator(); - while ( iterator.hasNext() ) { - IMogoCardChangedListener listener = iterator.next(); - if ( listener != null ) { - listener.onSwitched( position, moduleName ); - } - } - } + Logger.w( TAG, "Useless, do not invoke anymore." ); } @Override public void switch2( String cardType, boolean lockCar ) { - CardSwitchLiveData.getInstance().postValue( new CardInfo( cardType, lockCar ) ); + Logger.w( TAG, "Useless, do not invoke anymore." ); } @Override diff --git a/modules/mogo-module-main/src/main/java/com/mogo/module/main/SchemeIntent.java b/modules/mogo-module-main/src/main/java/com/mogo/module/main/SchemeIntent.java index 4280feba01..81d435746f 100644 --- a/modules/mogo-module-main/src/main/java/com/mogo/module/main/SchemeIntent.java +++ b/modules/mogo-module-main/src/main/java/com/mogo/module/main/SchemeIntent.java @@ -6,9 +6,6 @@ import android.net.Uri; import android.text.TextUtils; import com.mogo.map.MogoLatLng; -import com.mogo.module.common.ModuleNames; -import com.mogo.module.main.livedata.CardInfo; -import com.mogo.module.main.livedata.CardSwitchLiveData; import com.mogo.service.IMogoServiceApis; import com.mogo.service.statusmanager.IMogoStatusChangedListener; import com.mogo.service.statusmanager.StatusDescriptor; @@ -57,12 +54,13 @@ public class SchemeIntent implements IMogoStatusChangedListener { private static volatile SchemeIntent sInstance; - private SchemeIntent(){} + private SchemeIntent() { + } - public static SchemeIntent getInstance(){ - if( sInstance == null ){ - synchronized( SchemeIntent.class ) { - if( sInstance == null ){ + public static SchemeIntent getInstance() { + if ( sInstance == null ) { + synchronized ( SchemeIntent.class ) { + if ( sInstance == null ) { sInstance = new SchemeIntent(); } } @@ -70,7 +68,7 @@ public class SchemeIntent implements IMogoStatusChangedListener { return sInstance; } - public synchronized void release(){ + public synchronized void release() { sInstance = null; } @@ -80,7 +78,7 @@ public class SchemeIntent implements IMogoStatusChangedListener { mApis.getStatusManagerApi().registerStatusChangedListener( TAG, StatusDescriptor.MAIN_PAGE_RESUME, this ); } - public void clear(){ + public void clear() { mApis.getStatusManagerApi().unregisterStatusChangedListener( TAG, StatusDescriptor.MAIN_PAGE_RESUME, this ); mContext = null; mApis = null; @@ -141,14 +139,6 @@ public class SchemeIntent implements IMogoStatusChangedListener { return; } switch ( type ) { - case ModuleNames.CARD_TYPE_BUSINESS_OPERATION: - case ModuleNames.CARD_TYPE_CARS_CHATTING: - case ModuleNames.CARD_TYPE_NOVELTY: - case ModuleNames.CARD_TYPE_ROAD_CONDITION: - case ModuleNames.CARD_TYPE_SHARE_MUSIC: - case ModuleNames.CARD_TYPE_USER_DATA: - handleSwitchCardIntent( type ); - break; case TYPE_NAVI: handleNaviIntent( target ); break; @@ -175,10 +165,6 @@ public class SchemeIntent implements IMogoStatusChangedListener { target.getQueryParameter( "keywords" ) ); } - private void handleSwitchCardIntent( String type ) { - CardSwitchLiveData.getInstance().postValue( new CardInfo( type, true ) ); - } - private void handleNaviIntent( Uri naviUri ) { if ( mApis == null ) { return; diff --git a/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/CardIntroduceConfig.java b/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/CardIntroduceConfig.java deleted file mode 100644 index ef3b24ed50..0000000000 --- a/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/CardIntroduceConfig.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.mogo.module.main.cards; - -/** - * @author congtaowang - * @since 2020-03-27 - *

- * 卡片播报配置 - */ -public class CardIntroduceConfig { - - public String cardType; - public String broadcastWords; - public int broadcastAmount; - - public CardIntroduceConfig( String cardType, String broadcastWords, int broadcastAmount ) { - this.cardType = cardType; - this.broadcastWords = broadcastWords; - this.broadcastAmount = broadcastAmount; - } - - public CardIntroduceConfig() { - } -} diff --git a/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/CardIntroduceConfigs.java b/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/CardIntroduceConfigs.java deleted file mode 100644 index 6689415a06..0000000000 --- a/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/CardIntroduceConfigs.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.mogo.module.main.cards; - -import android.content.Context; - -import com.mogo.commons.voice.AIAssist; -import com.mogo.commons.voice.VoicePreemptType; -import com.mogo.map.navi.IMogoNavi; -import com.mogo.module.common.ModuleNames; -import com.mogo.service.IMogoServiceApis; -import com.mogo.service.statusmanager.IMogoStatusManager; -import com.mogo.utils.CommonUtils; -import com.mogo.utils.WorkThreadHandler; -import com.mogo.utils.logger.Logger; -import com.mogo.utils.network.utils.GsonUtil; -import com.mogo.utils.storage.SharedPrefsMgr; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author congtaowang - * @since 2020-03-27 - *

- * 卡片播报配置 - */ -public class CardIntroduceConfigs { - - private static final String TAG = "CardIntroduceConfigs"; - - public static final String KEY_VOICE_BROADCAST_CONFIG = "voice_broadcast_"; - public static String sBroadcastConfigKey; - - public static Map< String, CardIntroduceConfig > sConfigs = new HashMap<>(); - private static IMogoStatusManager sStatusManager; - private static IMogoNavi sNaiv; - - static { - sConfigs.put( ModuleNames.CARD_TYPE_BUSINESS_OPERATION, new CardIntroduceConfig( ModuleNames.CARD_TYPE_BUSINESS_OPERATION, "", 3 ) ); - sConfigs.put( ModuleNames.CARD_TYPE_SHARE_MUSIC, new CardIntroduceConfig( ModuleNames.CARD_TYPE_SHARE_MUSIC, "音乐新闻听书,海量资源随你选", 0 ) ); - sConfigs.put( ModuleNames.CARD_TYPE_CARS_CHATTING, new CardIntroduceConfig( ModuleNames.CARD_TYPE_CARS_CHATTING, "开车无聊,就用车聊聊", 0 ) ); - sConfigs.put( ModuleNames.CARD_TYPE_ROAD_CONDITION, new CardIntroduceConfig( ModuleNames.CARD_TYPE_ROAD_CONDITION, "随时查看路况,可以对我说某某地点堵不堵", 0 ) ); - sConfigs.put( ModuleNames.CARD_TYPE_USER_DATA, new CardIntroduceConfig( ModuleNames.CARD_TYPE_USER_DATA, "在线车辆,邀你在地图上发现万千有趣的车友", 0 ) ); - sConfigs.put( ModuleNames.CARD_TYPE_NOVELTY, new CardIntroduceConfig( ModuleNames.CARD_TYPE_NOVELTY, "新鲜事,邀你给同城车友分享沿途封路、拥堵消息", 0 ) ); - } - - public static void init( Context context, IMogoServiceApis apis ) { - sStatusManager = apis.getStatusManagerApi(); - sNaiv = apis.getMapServiceApi().getNavi( context ); - WorkThreadHandler.getInstance().post( () -> { - sBroadcastConfigKey = KEY_VOICE_BROADCAST_CONFIG + CommonUtils.getVersionCode( context ); - String configsStr = SharedPrefsMgr.getInstance( context ).getString( sBroadcastConfigKey ); - List< CardIntroduceConfig > configs = GsonUtil.arrayFromJson( configsStr, CardIntroduceConfig.class ); - if ( configs == null ) { - return; - } - for ( CardIntroduceConfig config : configs ) { - if ( config == null ) { - return; - } - sConfigs.put( config.cardType, config ); - } - } ); - } - - public static void broadcastCardIntroduce( Context context, String type ) { - if ( sConfigs.get( type ) == null ) { - Logger.d( TAG, "un support %s", type ); - return; - } - - if ( sConfigs.get( type ).broadcastAmount >= 3 ) { - Logger.d( TAG, "do not broadcastCardIntroduce %s cast amount = %s", type, type ); - return; - } - - if ( sStatusManager != null ) { - if ( !sStatusManager.isAIAssistReady() ) { - Logger.w( TAG, "ai assist not ready: %s", type ); - return; - } - } - - if ( sNaiv.isNaviing() ) { - Logger.d( TAG, "do not broadcastCardIntroduce cause naving" ); - return; - } - - CardIntroduceConfig config = sConfigs.get( type ); - config.broadcastAmount++; - - Logger.d( TAG, "speak card introduce: %s", config.broadcastWords ); - AIAssist.getInstance( context ).speakTTSVoice( config.broadcastWords, VoicePreemptType.PREEMPT_TYPE_IMMEADIATELY, null ); - } - - public static void flush( Context context ) { - if ( sBroadcastConfigKey == null || sConfigs.isEmpty() ) { - return; - } - WorkThreadHandler.getInstance().post( () -> { - synchronized ( sConfigs ) { - ArrayList configs = new ArrayList( sConfigs.entrySet() ); - SharedPrefsMgr.getInstance( context ).putString( sBroadcastConfigKey, GsonUtil.jsonFromObject( configs ) ); - } - } ); - } -} diff --git a/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/CardModulesAdapter.java b/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/CardModulesAdapter.java deleted file mode 100644 index c86fb39297..0000000000 --- a/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/CardModulesAdapter.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.mogo.module.main.cards; - -import android.os.Bundle; -import android.text.TextUtils; -import android.view.ViewGroup; - -import androidx.annotation.NonNull; -import androidx.fragment.app.Fragment; -import androidx.fragment.app.FragmentStatePagerAdapter; - -import com.mogo.module.main.MainActivity; -import com.mogo.service.module.IMogoModuleProvider; -import com.mogo.utils.logger.Logger; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author congtaowang - * @since 2019-12-30 - *

- * 描述 - */ -public class CardModulesAdapter extends FragmentStatePagerAdapter { - - private static final String TAG = "CardModulesAdapter"; - - private final MainActivity mActivity; - private List< IMogoModuleProvider > mProviders; - - public CardModulesAdapter( @NonNull MainActivity fragmentActivity, List< IMogoModuleProvider > providers ) { - super( fragmentActivity.getSupportFragmentManager() ); - mActivity = fragmentActivity; - this.mProviders = new ArrayList<>( providers ); - } - - @NonNull - @Override - public Fragment getItem( int position ) { - Logger.i( TAG, "current position: %d", position ); - int factPosition = getFactPosition( position ); - Bundle bundle = new Bundle(); - bundle.putInt( "position", factPosition ); - final Fragment f = mProviders.get( factPosition ).createFragment( mActivity, bundle ); - return f; - } - - @Override - public int getCount() { - return mProviders.size(); -// return Integer.MAX_VALUE; - } - - public IMogoModuleProvider getProvider( int position ) { - return mProviders.get( getFactPosition( position ) ); - } - - public int getFactPosition( int position ) { - return position % mProviders.size(); - } - - @Override - public int getItemPosition( Object object ) { - return POSITION_NONE; - } - - /** - * 获取对应卡片类型在列表中的位置 - * - * @param tag 卡片类型 - * @return 列表中的位置 - */ - public int getProviderPosition( String tag ) { - if ( mProviders != null ) { - for ( int i = 0; i < mProviders.size(); i++ ) { - IMogoModuleProvider provider = mProviders.get( i ); - if ( provider != null ) { - if ( TextUtils.equals( provider.getModuleName(), tag ) ) { - return i; - } - } - } - } - return -1; - } - -} diff --git a/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/HorizentalBaseTransformer.java b/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/HorizentalBaseTransformer.java deleted file mode 100644 index 3983ef6b56..0000000000 --- a/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/HorizentalBaseTransformer.java +++ /dev/null @@ -1,110 +0,0 @@ - -package com.mogo.module.main.cards; - -import android.view.View; -import androidx.viewpager.widget.ViewPager; - -/** - * Created by Nate on 2016/7/22. - */ -public abstract class HorizentalBaseTransformer implements ViewPager.PageTransformer { - /** - * Called each {@link #transformPage(View, float)}. - * - * @param page Apply the transformation to this page - * @param position Position of page relative to the current front-and-center position of the pager. 0 is front and - * center. 1 is one full page position to the right, and -1 is one page position to the left. - */ - protected abstract void onTransform(View page, float position); - - /** - * Apply a property transformation to the given page. For most use cases, this method should not be overridden. - * Instead use {@link #transformPage(View, float)} to perform typical transformations. - * - * @param page Apply the transformation to this page - * @param position Position of page relative to the current front-and-center position of the pager. 0 is front and - * center. 1 is one full page position to the right, and -1 is one page position to the left. - */ - @Override - public void transformPage(View page, float position) { - onPreTransform(page, position); - onTransform(page, position); - onPostTransform(page, position); - } - - /** - * If the position offset of a fragment is less than negative one or greater than one, returning true will set the - * fragment alpha to 0f. Otherwise fragment alpha is always defaulted to 1f. - * - * @return - */ - protected boolean hideOffscreenPages() { - return true; - } - - /** - * Indicates if the default animations of the view pager should be used. - * - * @return - */ - protected boolean isPagingEnabled() { - return false; - } - - /** - * Called each {@link #transformPage(View, float)} before {{@link #onTransform(View, float)}. - *

- * The default implementation attempts to reset all view properties. This is useful when toggling transforms that do - * not modify the same page properties. For instance changing from a transformation that applies rotation to a - * transformation that fades can inadvertently leave a fragment stuck with a rotation or with some degree of applied - * alpha. - * - * @param page Apply the transformation to this page - * @param position Position of page relative to the current front-and-center position of the pager. 0 is front and - * center. 1 is one full page position to the right, and -1 is one page position to the left. - */ - protected void onPreTransform(View page, float position) { - final float width = page.getWidth(); - //final float height = page.getHeight(); - - page.setRotationX(0); - page.setRotationY(0); - page.setRotation(0); - page.setScaleX(1); - page.setScaleY(1); - page.setPivotX(0); - page.setPivotY(0); - page.setTranslationY(0); - page.setTranslationX(isPagingEnabled() ? 0f : -width * position); - - if (hideOffscreenPages()) { - page.setAlpha(position <= -1f || position >= 1f ? 0f : 1f); - } else { - page.setAlpha(1f); - } - - /*final float normalizedposition = Math.abs(Math.abs(position) - 1); - page.setAlpha(normalizedposition);*/ - } - - /** - * Called each {@link #transformPage(View, float)} after {@link #onTransform(View, float)}. - * - * @param page Apply the transformation to this page - * @param position Position of page relative to the current front-and-center position of the pager. 0 is front and - * center. 1 is one full page position to the right, and -1 is one page position to the left. - */ - protected void onPostTransform(View page, float position) { - } - - /** - * Same as {@link Math#min(double, double)} without double casting, zero closest to infinity handling, or NaN support. - * - * @param val - * @param min - * @return - */ - protected static final float min(float val, float min) { - return val < min ? min : val; - } -} \ No newline at end of file diff --git a/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/HorizentalStackTransformer.java b/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/HorizentalStackTransformer.java deleted file mode 100644 index bec1449b7c..0000000000 --- a/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/HorizentalStackTransformer.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.mogo.module.main.cards; - -import android.content.Context; -import android.view.View; -import com.mogo.module.main.R; -import com.mogo.utils.logger.Logger; - -public class HorizentalStackTransformer extends HorizentalBaseTransformer { - - private Context context; - private int spaceBetweenFirAndSecWith;//第一张卡片和第二张卡片宽度差 - private int spaceBetweenFirAndSecHeight;//第一张卡片和第二张卡片高度差 - private float offsetScroll = 0.0f;//ViewPager滑动时变化幅度 - - public HorizentalStackTransformer( Context context ) { - this.context = context; - spaceBetweenFirAndSecHeight = 0; - spaceBetweenFirAndSecWith = context.getResources().getDimensionPixelSize( R.dimen.module_main_card_card_shadow_width_div ); - } - - public HorizentalStackTransformer( Context context, int spaceBetweenFirAndSecWith, int spaceBetweenFirAndSecHeight ) { - this.context = context; - this.spaceBetweenFirAndSecWith = spaceBetweenFirAndSecWith; - this.spaceBetweenFirAndSecHeight = spaceBetweenFirAndSecHeight; - } - - public void offsetScrollChanged(float offset){ - if(offset ==0){ - return; - } - offsetScroll = offset; - } - - public void resetOffsetScroll(){ - offsetScroll = 0.0f; - } - - @Override - protected void onTransform( View page, float position ) { - if ( position == 0.0f ) { - page.setAlpha( 1.0f ); - page.setTranslationX( 0f ); - //控制停止滑动切换的时候,只有最上面的一张卡片可以点击 - page.setClickable( true ); - } else if(position>0){ - float scale = ( float ) ( page.getWidth() - spaceBetweenFirAndSecWith * position ) / ( float ) ( page.getWidth() ); - Logger.d("VerticalStackTransformer","scale :" + scale); - //控制下面卡片的可见度 - page.setAlpha( 1.0f ); - //控制停止滑动切换的时候,只有最上面的一张卡片可以点击 - page.setClickable( false ); - page.setPivotX( page.getWidth() / 2f ); - page.setPivotY( page.getHeight() / 2f ); - page.setScaleX( scale ); - page.setScaleY( scale ); - page.setTranslationX( -page.getHeight() * position + ( page.getHeight() * 0.5f ) * ( 1 - scale ) + spaceBetweenFirAndSecHeight * position ); - }else{ - float currentPage; - if(offsetScroll > 0.1f){ - currentPage = 0.1f; - }else{ - currentPage = offsetScroll; - } - page.setAlpha( 1 ); - page.setScaleX(1-currentPage); - page.setScaleY(1-currentPage); - page.setPivotX( page.getWidth() / 2f ); - page.setPivotY( page.getHeight() / 2f ); - page.setTranslationX( 0f ); - page.setClickable( false ); - } - } -} \ No newline at end of file diff --git a/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/OnPageChangeListenerAdapter.java b/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/OnPageChangeListenerAdapter.java deleted file mode 100644 index f43f436c6e..0000000000 --- a/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/OnPageChangeListenerAdapter.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.mogo.module.main.cards; - -import androidx.viewpager.widget.ViewPager; - -/** - * @author congtaowang - * @since 2020-01-06 - *

- * 描述 - */ -public class OnPageChangeListenerAdapter implements ViewPager.OnPageChangeListener { - - @Override - public void onPageScrolled( int position, float positionOffset, int positionOffsetPixels ) { - - } - - @Override - public void onPageSelected( int position ) { - - } - - @Override - public void onPageScrollStateChanged( int state ) { - - } -} diff --git a/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/OrientedViewPager.java b/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/OrientedViewPager.java deleted file mode 100644 index 35680f3336..0000000000 --- a/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/OrientedViewPager.java +++ /dev/null @@ -1,3390 +0,0 @@ -package com.mogo.module.main.cards; - -import android.content.Context; -import android.content.res.Resources; -import android.content.res.TypedArray; -import android.database.DataSetObserver; -import android.graphics.Canvas; -import android.graphics.Rect; -import android.graphics.drawable.Drawable; -import android.os.Build; -import android.os.Bundle; -import android.os.Parcel; -import android.os.Parcelable; -import android.os.SystemClock; -import android.util.AttributeSet; -import android.util.Log; -import android.view.FocusFinder; -import android.view.Gravity; -import android.view.KeyEvent; -import android.view.MotionEvent; -import android.view.SoundEffectConstants; -import android.view.VelocityTracker; -import android.view.View; -import android.view.ViewConfiguration; -import android.view.ViewGroup; -import android.view.ViewParent; -import android.view.accessibility.AccessibilityEvent; -import android.view.animation.Interpolator; -import android.widget.Scroller; - -import androidx.core.view.AccessibilityDelegateCompat; -import androidx.core.view.MotionEventCompat; -import androidx.core.view.VelocityTrackerCompat; -import androidx.core.view.ViewCompat; -import androidx.core.view.ViewConfigurationCompat; -import androidx.core.view.accessibility.AccessibilityEventCompat; -import androidx.core.view.accessibility.AccessibilityNodeInfoCompat; -import androidx.core.view.accessibility.AccessibilityRecordCompat; -import androidx.core.widget.EdgeEffectCompat; -import androidx.viewpager.widget.PagerAdapter; -import androidx.viewpager.widget.ViewPager; - -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; - -/** - * Created by Bartosz Lipinski - * Based on castorflex's VerticalViewPager (https://github.com/castorflex/VerticalViewPager) - * - * 03.05.15 - */ -public class OrientedViewPager extends ViewGroup { - - public enum Orientation { - VERTICAL, HORIZONTAL - } - - private static final String TAG = "ViewPager"; - private static final boolean DEBUG = false; - - private static final boolean USE_CACHE = false; - - private static final int DEFAULT_OFFSCREEN_PAGES = 1; - private static final int MAX_SETTLE_DURATION = 600; // ms - private static final int MIN_DISTANCE_FOR_FLING = 25; // dips - - private static final int DEFAULT_GUTTER_SIZE = 16; // dips - - private static final int MIN_FLING_VELOCITY = 400; // dips - - private static final int[] LAYOUT_ATTRS = new int[] { - android.R.attr.layout_gravity - }; - - /** - * Used to track what the expected number of items in the adapter should be. - * If the app changes this when we don't expect it, we'll throw a big obnoxious exception. - */ - private int mExpectedAdapterCount; - - private static class ItemInfo { - Object object; - int position; - boolean scrolling; - float sizeFactor; - float offset; - } - - private static final Comparator COMPARATOR = new Comparator() { - @Override - public int compare(ItemInfo lhs, ItemInfo rhs) { - return lhs.position - rhs.position; - } - }; - - private static final Interpolator sInterpolator = new Interpolator() { - public float getInterpolation(float t) { - t -= 1.0f; - return t * t * t * t * t + 1.0f; - } - }; - - private final ArrayList mItems = new ArrayList(); - private final ItemInfo mTempItem = new ItemInfo(); - - private final Rect mTempRect = new Rect(); - - private Orientation mOrientation = Orientation.HORIZONTAL; - - private PagerAdapter mAdapter; - private int mCurItem; // Index of currently displayed page. - private int mRestoredCurItem = -1; - private Parcelable mRestoredAdapterState = null; - private ClassLoader mRestoredClassLoader = null; - private Scroller mScroller; - private PagerObserver mObserver; - - private int mPageMargin; - private Drawable mMarginDrawable; - private int mTopLeftPageBounds; - private int mBottomRightPageBounds; - - // Offsets of the first and last items, if known. - // Set during population, used to determine if we are at the beginning - // or end of the pager data set during touch scrolling. - private float mFirstOffset = -Float.MAX_VALUE; - private float mLastOffset = Float.MAX_VALUE; - - private int mChildWidthMeasureSpec; - private int mChildHeightMeasureSpec; - private boolean mInLayout; - - private boolean mScrollingCacheEnabled; - - private boolean mPopulatePending; - private int mOffscreenPageLimit = DEFAULT_OFFSCREEN_PAGES; - - private boolean mIsBeingDragged; - private boolean mIsUnableToDrag; - private boolean mIgnoreGutter; - private int mDefaultGutterSize; - private int mGutterSize; - private int mTouchSlop; - /** - * Position of the last motion event. - */ - private float mLastMotionX; - private float mLastMotionY; - private float mInitialMotionX; - private float mInitialMotionY; - /** - * ID of the active pointer. This is used to retain consistency during - * drags/flings if multiple pointers are used. - */ - private int mActivePointerId = INVALID_POINTER; - /** - * Sentinel value for no current active pointer. - * Used by {@link #mActivePointerId}. - */ - private static final int INVALID_POINTER = -1; - - /** - * Determines speed during touch scrolling - */ - private VelocityTracker mVelocityTracker; - private int mMinimumVelocity; - private int mMaximumVelocity; - private int mFlingDistance; - private int mCloseEnough; - - // If the pager is at least this close to its final position, complete the scroll - // on touch down and let the user interact with the content inside instead of - // "catching" the flinging pager. - private static final int CLOSE_ENOUGH = 2; // dp - - private boolean mFakeDragging; - private long mFakeDragBeginTime; - - private EdgeEffectCompat mTopLeftEdge; - private EdgeEffectCompat mRightBottomEdge; - - private boolean mFirstLayout = true; - private boolean mNeedCalculatePageOffsets = false; - private boolean mCalledSuper; - private int mDecorChildCount; - - private ViewPager.OnPageChangeListener mOnPageChangeListener; - private ViewPager.OnPageChangeListener mInternalPageChangeListener; - private OnAdapterChangeListener mAdapterChangeListener; - private ViewPager.PageTransformer mPageTransformer; - private Method mSetChildrenDrawingOrderEnabled; - - private static final int DRAW_ORDER_DEFAULT = 0; - private static final int DRAW_ORDER_FORWARD = 1; - private static final int DRAW_ORDER_REVERSE = 2; - private int mDrawingOrder; - private ArrayList mDrawingOrderedChildren; - private static final ViewPositionComparator sPositionComparator = new ViewPositionComparator(); - - /** - * Indicates that the pager is in an idle, settled state. The current page - * is fully in view and no animation is in progress. - */ - public static final int SCROLL_STATE_IDLE = 0; - - /** - * Indicates that the pager is currently being dragged by the user. - */ - public static final int SCROLL_STATE_DRAGGING = 1; - - /** - * Indicates that the pager is in the process of settling to a final position. - */ - public static final int SCROLL_STATE_SETTLING = 2; - - private final Runnable mEndScrollRunnable = new Runnable() { - public void run() { - setScrollState(SCROLL_STATE_IDLE); - populate(); - } - }; - - private int mScrollState = SCROLL_STATE_IDLE; - - /** - * Used internally to monitor when adapters are switched. - */ - interface OnAdapterChangeListener { - public void onAdapterChanged(PagerAdapter oldAdapter, PagerAdapter newAdapter); - } - - /** - * Used internally to mTag special types of child views that should be added as - * pager decorations by default. - */ - interface Decor { - } - - public OrientedViewPager(Context context) { - super(context); - initViewPager(); - } - - public OrientedViewPager(Context context, AttributeSet attrs) { - super(context, attrs); - initViewPager(); - } - - void initViewPager() { - setWillNotDraw(false); - setDescendantFocusability(FOCUS_AFTER_DESCENDANTS); - setFocusable(true); - final Context context = getContext(); - mScroller = new Scroller(context, sInterpolator); - final ViewConfiguration configuration = ViewConfiguration.get(context); - final float density = context.getResources().getDisplayMetrics().density; - - mTouchSlop = ViewConfigurationCompat.getScaledPagingTouchSlop(configuration); - mMinimumVelocity = (int) (MIN_FLING_VELOCITY * density); - mMaximumVelocity = configuration.getScaledMaximumFlingVelocity(); - mTopLeftEdge = new EdgeEffectCompat(context); - mRightBottomEdge = new EdgeEffectCompat(context); - - mFlingDistance = (int) (MIN_DISTANCE_FOR_FLING * density); - mCloseEnough = (int) (CLOSE_ENOUGH * density); - mDefaultGutterSize = (int) (DEFAULT_GUTTER_SIZE * density); - - ViewCompat.setAccessibilityDelegate(this, new MyAccessibilityDelegate()); - - if (ViewCompat.getImportantForAccessibility(this) - == ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_AUTO) { - ViewCompat.setImportantForAccessibility(this, - ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES); - } - } - - public void setOrientation(Orientation orientation) { - mOrientation = orientation; - } - - @Override - protected void onDetachedFromWindow() { - removeCallbacks(mEndScrollRunnable); - super.onDetachedFromWindow(); - } - - private void setScrollState(int newState) { - if (mScrollState == newState) { - return; - } - - mScrollState = newState; - if (mPageTransformer != null) { - // PageTransformers can do complex things that benefit from hardware layers. - enableLayers(newState != SCROLL_STATE_IDLE); - } - if (mOnPageChangeListener != null) { - mOnPageChangeListener.onPageScrollStateChanged(newState); - } - } - - /** - * Set a PagerAdapter that will supply views for this pager as needed. - * - * @param adapter Adapter to use - */ - public void setAdapter(PagerAdapter adapter) { - if (mAdapter != null) { - mAdapter.unregisterDataSetObserver(mObserver); - mAdapter.startUpdate(this); - for (int i = 0; i < mItems.size(); i++) { - final ItemInfo ii = mItems.get(i); - mAdapter.destroyItem(this, ii.position, ii.object); - } - mAdapter.finishUpdate(this); - mItems.clear(); - removeNonDecorViews(); - mCurItem = 0; - scrollTo(0, 0); - } - - final PagerAdapter oldAdapter = mAdapter; - mAdapter = adapter; - mExpectedAdapterCount = 0; - - if (mAdapter != null) { - if (mObserver == null) { - mObserver = new PagerObserver(); - } - mAdapter.registerDataSetObserver(mObserver); - mPopulatePending = false; - final boolean wasFirstLayout = mFirstLayout; - mFirstLayout = true; - mExpectedAdapterCount = mAdapter.getCount(); - if (mRestoredCurItem >= 0) { - mAdapter.restoreState(mRestoredAdapterState, mRestoredClassLoader); - setCurrentItemInternal(mRestoredCurItem, false, true); - mRestoredCurItem = -1; - mRestoredAdapterState = null; - mRestoredClassLoader = null; - } else if (!wasFirstLayout) { - populate(); - } else { - requestLayout(); - } - } - - if (mAdapterChangeListener != null && oldAdapter != adapter) { - mAdapterChangeListener.onAdapterChanged(oldAdapter, adapter); - } - } - - private void removeNonDecorViews() { - for (int i = 0; i < getChildCount(); i++) { - final View child = getChildAt(i); - final LayoutParams lp = (LayoutParams) child.getLayoutParams(); - if (!lp.isDecor) { - removeViewAt(i); - i--; - } - } - } - - /** - * Retrieve the current adapter supplying pages. - * - * @return The currently registered PagerAdapter - */ - public PagerAdapter getAdapter() { - return mAdapter; - } - - void setOnAdapterChangeListener(OnAdapterChangeListener listener) { - mAdapterChangeListener = listener; - } - - private int getClientSize() { - return (mOrientation == Orientation.VERTICAL) ? - getMeasuredHeight() - getPaddingTop() - getPaddingBottom() : - getMeasuredWidth() - getPaddingLeft() - getPaddingRight(); - } - - /** - * Set the currently selected page. If the ViewPager has already been through its first - * layout with its current adapter there will be a smooth animated transition between - * the current item and the specified item. - * - * @param item Item index to select - */ - public void setCurrentItem(int item) { - mPopulatePending = false; - setCurrentItemInternal(item, !mFirstLayout, false); - } - - /** - * Set the currently selected page. - * - * @param item Item index to select - * @param smoothScroll True to smoothly scroll to the new item, false to transition immediately - */ - public void setCurrentItem(int item, boolean smoothScroll) { - mPopulatePending = false; - setCurrentItemInternal(item, smoothScroll, false); - } - - public int getCurrentItem() { - return mCurItem; - } - - void setCurrentItemInternal(int item, boolean smoothScroll, boolean always) { - setCurrentItemInternal(item, smoothScroll, always, 0); - } - - void setCurrentItemInternal(int item, boolean smoothScroll, boolean always, int velocity) { - if (mAdapter == null || mAdapter.getCount() <= 0) { - setScrollingCacheEnabled(false); - return; - } - if (!always && mCurItem == item && mItems.size() != 0) { - setScrollingCacheEnabled(false); - return; - } - - if (item < 0) { - item = 0; - } else if (item >= mAdapter.getCount()) { - item = mAdapter.getCount() - 1; - } - final int pageLimit = mOffscreenPageLimit; - if (item > (mCurItem + pageLimit) || item < (mCurItem - pageLimit)) { - // We are doing a jump by more than one page. To avoid - // glitches, we want to keep all current pages in the view - // until the scroll ends. - for (int i = 0; i < mItems.size(); i++) { - mItems.get(i).scrolling = true; - } - } - final boolean dispatchSelected = mCurItem != item; - - if (mFirstLayout) { - // We don't have any idea how big we are yet and shouldn't have any pages either. - // Just set things up and let the pending layout handle things. - mCurItem = item; - if (dispatchSelected && mOnPageChangeListener != null) { - mOnPageChangeListener.onPageSelected(item); - } - if (dispatchSelected && mInternalPageChangeListener != null) { - mInternalPageChangeListener.onPageSelected(item); - } - requestLayout(); - } else { - populate(item); - scrollToItem(item, smoothScroll, velocity, dispatchSelected); - } - } - - private void scrollToItem(int item, boolean smoothScroll, int velocity, - boolean dispatchSelected) { - final ItemInfo curInfo = infoForPosition(item); - int dest = 0; - if (curInfo != null) { - final int size = getClientSize(); - dest = (int) (size * Math.max(mFirstOffset, - Math.min(curInfo.offset, mLastOffset))); - } - if (smoothScroll) { - if (mOrientation == Orientation.VERTICAL) { - smoothScrollTo(0, dest, velocity); - } else { - smoothScrollTo(dest, 0, velocity); - } - if (dispatchSelected && mOnPageChangeListener != null) { - mOnPageChangeListener.onPageSelected(item); - } - if (dispatchSelected && mInternalPageChangeListener != null) { - mInternalPageChangeListener.onPageSelected(item); - } - } else { - if (dispatchSelected && mOnPageChangeListener != null) { - mOnPageChangeListener.onPageSelected(item); - } - if (dispatchSelected && mInternalPageChangeListener != null) { - mInternalPageChangeListener.onPageSelected(item); - } - completeScroll(false); - if (mOrientation == Orientation.VERTICAL) { - scrollTo(0, dest); - } else { - scrollTo(dest, 0); - } - pageScrolled(dest); - } - } - - /** - * Set a listener that will be invoked whenever the page changes or is incrementally - * scrolled. See {@link androidx.viewpager.widget.ViewPager.OnPageChangeListener}. - * - * @param listener Listener to set - */ - public void setOnPageChangeListener(ViewPager.OnPageChangeListener listener) { - mOnPageChangeListener = listener; - } - - /** - * Set a {@link androidx.viewpager.widget.ViewPager.PageTransformer} that will be called for each - * attached page whenever - * the scroll position is changed. This allows the application to apply custom property - * transformations to each page, overriding the default sliding look and feel. - *

- *

Note: Prior to Android 3.0 the property animation APIs did not exist. - * As a result, setting a PageTransformer prior to Android 3.0 (API 11) will have no effect.

- * - * @param reverseDrawingOrder true if the supplied PageTransformer requires page views - * to be drawn from last to first instead of first to last. - * @param transformer PageTransformer that will modify each page's animation properties - */ - public void setPageTransformer(boolean reverseDrawingOrder, - ViewPager.PageTransformer transformer) { - if (Build.VERSION.SDK_INT >= 11) { - final boolean hasTransformer = transformer != null; - final boolean needsPopulate = hasTransformer != (mPageTransformer != null); - mPageTransformer = transformer; - setChildrenDrawingOrderEnabledCompat(hasTransformer); - if (hasTransformer) { - mDrawingOrder = reverseDrawingOrder ? DRAW_ORDER_REVERSE : DRAW_ORDER_FORWARD; - } else { - mDrawingOrder = DRAW_ORDER_DEFAULT; - } - if (needsPopulate) populate(); - } - } - - void setChildrenDrawingOrderEnabledCompat(boolean enable) { - if (Build.VERSION.SDK_INT >= 7) { - if (mSetChildrenDrawingOrderEnabled == null) { - try { - mSetChildrenDrawingOrderEnabled = ViewGroup.class.getDeclaredMethod( - "setChildrenDrawingOrderEnabled", new Class[] { Boolean.TYPE }); - } catch (NoSuchMethodException e) { - Log.e(TAG, "Can't find setChildrenDrawingOrderEnabled", e); - } - } - try { - mSetChildrenDrawingOrderEnabled.invoke(this, enable); - } catch (Exception e) { - Log.e(TAG, "Error changing children drawing order", e); - } - } - } - - @Override - protected int getChildDrawingOrder(int childCount, int i) { - final int index = mDrawingOrder == DRAW_ORDER_REVERSE ? childCount - 1 - i : i; - final int result = - ((LayoutParams) mDrawingOrderedChildren.get(index).getLayoutParams()).childIndex; - return result; - } - - /** - * Set a separate OnPageChangeListener for internal use by the support library. - * - * @param listener Listener to set - * @return The old listener that was set, if any. - */ - ViewPager.OnPageChangeListener setInternalPageChangeListener( - ViewPager.OnPageChangeListener listener) { - ViewPager.OnPageChangeListener oldListener = mInternalPageChangeListener; - mInternalPageChangeListener = listener; - return oldListener; - } - - /** - * Returns the number of pages that will be retained to either side of the - * current page in the view hierarchy in an idle state. Defaults to 1. - * - * @return How many pages will be kept offscreen on either side - * @see #setOffscreenPageLimit(int) - */ - public int getOffscreenPageLimit() { - return mOffscreenPageLimit; - } - - /** - * Set the number of pages that should be retained to either side of the - * current page in the view hierarchy in an idle state. Pages beyond this - * limit will be recreated from the adapter when needed. - *

- *

This is offered as an optimization. If you know in advance the number - * of pages you will need to support or have lazy-loading mechanisms in place - * on your pages, tweaking this setting can have benefits in perceived smoothness - * of paging animations and interaction. If you have a small number of pages (3-4) - * that you can keep active all at once, less time will be spent in layout for - * newly created view subtrees as the user pages back and forth.

- *

- *

You should keep this limit low, especially if your pages have complex layouts. - * This setting defaults to 1.

- * - * @param limit How many pages will be kept offscreen in an idle state. - */ - public void setOffscreenPageLimit(int limit) { - if (limit < DEFAULT_OFFSCREEN_PAGES) { - Log.w(TAG, "Requested offscreen page limit " + limit + " too small; defaulting to " + - DEFAULT_OFFSCREEN_PAGES); - limit = DEFAULT_OFFSCREEN_PAGES; - } - if (limit != mOffscreenPageLimit) { - mOffscreenPageLimit = limit; - populate(); - } - } - - /** - * Set the margin between pages. - * - * @param marginPixels Distance between adjacent pages in pixels - * @see #getPageMargin() - * @see #setPageMarginDrawable(Drawable) - * @see #setPageMarginDrawable(int) - */ - public void setPageMargin(int marginPixels) { - final int oldMargin = mPageMargin; - mPageMargin = marginPixels; - - final int size = (mOrientation == Orientation.VERTICAL) ? getHeight() : getWidth(); - recomputeScrollPosition(size, size, marginPixels, oldMargin); - - requestLayout(); - } - - /** - * Return the margin between pages. - * - * @return The size of the margin in pixels - */ - public int getPageMargin() { - return mPageMargin; - } - - /** - * Set a drawable that will be used to fill the margin between pages. - * - * @param d Drawable to display between pages - */ - public void setPageMarginDrawable(Drawable d) { - mMarginDrawable = d; - if (d != null) refreshDrawableState(); - setWillNotDraw(d == null); - invalidate(); - } - - /** - * Set a drawable that will be used to fill the margin between pages. - * - * @param resId Resource ID of a drawable to display between pages - */ - public void setPageMarginDrawable(int resId) { - setPageMarginDrawable(getContext().getResources().getDrawable(resId)); - } - - @Override - protected boolean verifyDrawable(Drawable who) { - return super.verifyDrawable(who) || who == mMarginDrawable; - } - - @Override - protected void drawableStateChanged() { - super.drawableStateChanged(); - final Drawable d = mMarginDrawable; - if (d != null && d.isStateful()) { - d.setState(getDrawableState()); - } - } - - // We want the duration of the page snap animation to be influenced by the distance that - // the screen has to travel, however, we don't want this duration to be effected in a - // purely linear fashion. Instead, we use this method to moderate the effect that the distance - // of travel has on the overall snap duration. - float distanceInfluenceForSnapDuration(float f) { - f -= 0.5f; // center the values about 0. - f *= 0.3f * Math.PI / 2.0f; - return (float) Math.sin(f); - } - - /** - * Like {@link View#scrollBy}, but scroll smoothly instead of immediately. - * - * @param x the number of pixels to scroll by on the X axis - * @param y the number of pixels to scroll by on the Y axis - */ - void smoothScrollTo(int x, int y) { - smoothScrollTo(x, y, 0); - } - - /** - * Like {@link View#scrollBy}, but scroll smoothly instead of immediately. - * - * @param x the number of pixels to scroll by on the X axis - * @param y the number of pixels to scroll by on the Y axis - * @param velocity the velocity associated with a fling, if applicable. (0 otherwise) - */ - void smoothScrollTo(int x, int y, int velocity) { - if (getChildCount() == 0) { - // Nothing to do. - setScrollingCacheEnabled(false); - return; - } - int sx = getScrollX(); - int sy = getScrollY(); - int dx = x - sx; - int dy = y - sy; - if (dx == 0 && dy == 0) { - completeScroll(false); - populate(); - setScrollState(SCROLL_STATE_IDLE); - return; - } - - setScrollingCacheEnabled(true); - setScrollState(SCROLL_STATE_SETTLING); - - final int size = getClientSize(); - final int halfSize = size / 2; - final float distanceRatio = Math.min(1f, 1.0f * Math.abs(dx) / size); - final float distance = halfSize + halfSize * - distanceInfluenceForSnapDuration(distanceRatio); - - int duration = 0; - velocity = Math.abs(velocity); - if (velocity > 0) { - duration = 4 * Math.round(1000 * Math.abs(distance / velocity)); - } else { - final float pageSize = size * mAdapter.getPageWidth(mCurItem); - final float pageDelta = (float) Math.abs(dx) / (pageSize + mPageMargin); - duration = (int) ((pageDelta + 1) * 100); - } - duration = Math.min(duration, MAX_SETTLE_DURATION); - - mScroller.startScroll(sx, sy, dx, dy, duration); - ViewCompat.postInvalidateOnAnimation(this); - } - - ItemInfo addNewItem(int position, int index) { - ItemInfo ii = new ItemInfo(); - ii.position = position; - ii.object = mAdapter.instantiateItem(this, position); - ii.sizeFactor = mAdapter.getPageWidth(position); - if (index < 0 || index >= mItems.size()) { - mItems.add(ii); - } else { - mItems.add(index, ii); - } - return ii; - } - - void dataSetChanged() { - // This method only gets called if our observer is attached, so mAdapter is non-null. - - final int adapterCount = mAdapter.getCount(); - mExpectedAdapterCount = adapterCount; - boolean needPopulate = mItems.size() < mOffscreenPageLimit * 2 + 1 && - mItems.size() < adapterCount; - int newCurrItem = mCurItem; - - boolean isUpdating = false; - for (int i = 0; i < mItems.size(); i++) { - final ItemInfo ii = mItems.get(i); - final int newPos = mAdapter.getItemPosition(ii.object); - - if (newPos == PagerAdapter.POSITION_UNCHANGED) { - continue; - } - - if (newPos == PagerAdapter.POSITION_NONE) { - mItems.remove(i); - i--; - - if (!isUpdating) { - mAdapter.startUpdate(this); - isUpdating = true; - } - - mAdapter.destroyItem(this, ii.position, ii.object); - needPopulate = true; - - if (mCurItem == ii.position) { - // Keep the current item in the valid range - newCurrItem = Math.max(0, Math.min(mCurItem, adapterCount - 1)); - needPopulate = true; - } - continue; - } - - if (ii.position != newPos) { - if (ii.position == mCurItem) { - // Our current item changed position. Follow it. - newCurrItem = newPos; - } - - ii.position = newPos; - needPopulate = true; - } - } - - if (isUpdating) { - mAdapter.finishUpdate(this); - } - - Collections.sort(mItems, COMPARATOR); - - if (needPopulate) { - // Reset our known page widths; populate will recompute them. - final int childCount = getChildCount(); - for (int i = 0; i < childCount; i++) { - final View child = getChildAt(i); - final LayoutParams lp = (LayoutParams) child.getLayoutParams(); - if (!lp.isDecor) { - lp.heightFactor = 0.f; - } - } - - setCurrentItemInternal(newCurrItem, false, true); - requestLayout(); - } - } - - void populate() { - populate(mCurItem); - } - - void populate(int newCurrentItem) { - ItemInfo oldCurInfo = null; - int focusDirection = View.FOCUS_FORWARD; - if (mCurItem != newCurrentItem) { - focusDirection = mCurItem < newCurrentItem ? View.FOCUS_DOWN : View.FOCUS_UP; - oldCurInfo = infoForPosition(mCurItem); - mCurItem = newCurrentItem; - } - - if (mAdapter == null) { - sortChildDrawingOrder(); - return; - } - - // Bail now if we are waiting to populate. This is to hold off - // on creating views from the time the user releases their finger to - // fling to a new position until we have finished the scroll to - // that position, avoiding glitches from happening at that point. - if (mPopulatePending) { - if (DEBUG) Log.i(TAG, "populate is pending, skipping for now..."); - sortChildDrawingOrder(); - return; - } - - // Also, don't populate until we are attached to a window. This is to - // avoid trying to populate before we have restored our view hierarchy - // state and conflicting with what is restored. - if (getWindowToken() == null) { - return; - } - - mAdapter.startUpdate(this); - - final int pageLimit = mOffscreenPageLimit; - final int startPos = Math.max(0, mCurItem - pageLimit); - final int N = mAdapter.getCount(); - final int endPos = Math.min(N - 1, mCurItem + pageLimit); - - if (N != mExpectedAdapterCount) { - String resName; - try { - resName = getResources().getResourceName(getId()); - } catch (Resources.NotFoundException e) { - resName = Integer.toHexString(getId()); - } - throw new IllegalStateException("The application's PagerAdapter changed the adapter's" + - " contents without calling PagerAdapter#notifyDataSetChanged!" + - " Expected adapter item count: " + mExpectedAdapterCount + ", found: " + N + - " Pager id: " + resName + - " Pager class: " + getClass() + - " Problematic adapter: " + mAdapter.getClass()); - } - - // Locate the currently focused item or add it if needed. - int curIndex = -1; - ItemInfo curItem = null; - for (curIndex = 0; curIndex < mItems.size(); curIndex++) { - final ItemInfo ii = mItems.get(curIndex); - if (ii.position >= mCurItem) { - if (ii.position == mCurItem) curItem = ii; - break; - } - } - - if (curItem == null && N > 0) { - curItem = addNewItem(mCurItem, curIndex); - } - - // Fill 3x the available width or up to the number of offscreen - // pages requested to either side, whichever is larger. - // If we have no current item we have no work to do. - if (curItem != null) { - float extraSizeTopLeft = 0.f; - int itemIndex = curIndex - 1; - ItemInfo ii = itemIndex >= 0 ? mItems.get(itemIndex) : null; - final int clientSize = getClientSize(); - final float topLeftSizeNeeded = clientSize <= 0 ? 0 : - 2.f - curItem.sizeFactor + (float) getPaddingLeft() / (float) clientSize; - for (int pos = mCurItem - 1; pos >= 0; pos--) { - if (extraSizeTopLeft >= topLeftSizeNeeded && pos < startPos) { - if (ii == null) { - break; - } - if (pos == ii.position && !ii.scrolling) { - mItems.remove(itemIndex); - mAdapter.destroyItem(this, pos, ii.object); - if (DEBUG) { - Log.i(TAG, "populate() - destroyItem() with pos: " + pos + - " view: " + ((View) ii.object)); - } - itemIndex--; - curIndex--; - ii = itemIndex >= 0 ? mItems.get(itemIndex) : null; - } - } else if (ii != null && pos == ii.position) { - extraSizeTopLeft += ii.sizeFactor; - itemIndex--; - ii = itemIndex >= 0 ? mItems.get(itemIndex) : null; - } else { - ii = addNewItem(pos, itemIndex + 1); - extraSizeTopLeft += ii.sizeFactor; - curIndex++; - ii = itemIndex >= 0 ? mItems.get(itemIndex) : null; - } - } - - float extraSizeBottomRight = curItem.sizeFactor; - itemIndex = curIndex + 1; - if (extraSizeBottomRight < 2.f) { - ii = itemIndex < mItems.size() ? mItems.get(itemIndex) : null; - final float bottomRightSizeNeeded = clientSize <= 0 ? 0 : - (float) getPaddingRight() / (float) clientSize + 2.f; - for (int pos = mCurItem + 1; pos < N; pos++) { - if (extraSizeBottomRight >= bottomRightSizeNeeded && pos > endPos) { - if (ii == null) { - break; - } - if (pos == ii.position && !ii.scrolling) { - mItems.remove(itemIndex); - mAdapter.destroyItem(this, pos, ii.object); - if (DEBUG) { - Log.i(TAG, "populate() - destroyItem() with pos: " + pos + - " view: " + ((View) ii.object)); - } - ii = itemIndex < mItems.size() ? mItems.get(itemIndex) : null; - } - } else if (ii != null && pos == ii.position) { - extraSizeBottomRight += ii.sizeFactor; - itemIndex++; - ii = itemIndex < mItems.size() ? mItems.get(itemIndex) : null; - } else { - ii = addNewItem(pos, itemIndex); - itemIndex++; - extraSizeBottomRight += ii.sizeFactor; - ii = itemIndex < mItems.size() ? mItems.get(itemIndex) : null; - } - } - } - - calculatePageOffsets(curItem, curIndex, oldCurInfo); - } - - if (DEBUG) { - Log.i(TAG, "Current page list:"); - for (int i = 0; i < mItems.size(); i++) { - Log.i(TAG, "#" + i + ": page " + mItems.get(i).position); - } - } - - mAdapter.setPrimaryItem(this, mCurItem, curItem != null ? curItem.object : null); - - mAdapter.finishUpdate(this); - - // Check width measurement of current pages and drawing sort order. - // Update LayoutParams as needed. - final int childCount = getChildCount(); - if (mOrientation == Orientation.VERTICAL) { - for (int i = 0; i < childCount; i++) { - final View child = getChildAt(i); - final LayoutParams lp = (LayoutParams) child.getLayoutParams(); - lp.childIndex = i; - if (!lp.isDecor && lp.heightFactor == 0.f) { - // 0 means requery the adapter for this, it doesn't have a valid width - // . - final ItemInfo ii = infoForChild(child); - if (ii != null) { - lp.heightFactor = ii.sizeFactor; - lp.position = ii.position; - } - } - } - } else { - for (int i = 0; i < childCount; i++) { - final View child = getChildAt(i); - final LayoutParams lp = (LayoutParams) child.getLayoutParams(); - lp.childIndex = i; - if (!lp.isDecor && lp.widthFactor == 0.f) { - // 0 means requery the adapter for this, it doesn't have a valid width. - final ItemInfo ii = infoForChild(child); - if (ii != null) { - lp.widthFactor = ii.sizeFactor; - lp.position = ii.position; - } - } - } - } - sortChildDrawingOrder(); - - if (hasFocus()) { - View currentFocused = findFocus(); - ItemInfo ii = currentFocused != null ? infoForAnyChild(currentFocused) : null; - if (ii == null || ii.position != mCurItem) { - for (int i = 0; i < getChildCount(); i++) { - View child = getChildAt(i); - ii = infoForChild(child); - if (ii != null && ii.position == mCurItem) { - if (child.requestFocus(focusDirection)) { - break; - } - } - } - } - } - } - - private void sortChildDrawingOrder() { - if (mDrawingOrder != DRAW_ORDER_DEFAULT) { - if (mDrawingOrderedChildren == null) { - mDrawingOrderedChildren = new ArrayList(); - } else { - mDrawingOrderedChildren.clear(); - } - final int childCount = getChildCount(); - for (int i = 0; i < childCount; i++) { - final View child = getChildAt(i); - mDrawingOrderedChildren.add(child); - } - Collections.sort(mDrawingOrderedChildren, sPositionComparator); - } - } - - private void calculatePageOffsets(ItemInfo curItem, int curIndex, ItemInfo oldCurInfo) { - final int N = mAdapter.getCount(); - final int size = getClientSize(); - final float marginOffset = size > 0 ? (float) mPageMargin / size : 0; - // Fix up offsets for later layout. - if (oldCurInfo != null) { - final int oldCurPosition = oldCurInfo.position; - // Base offsets off of oldCurInfo. - if (oldCurPosition < curItem.position) { - int itemIndex = 0; - ItemInfo ii = null; - float offset = oldCurInfo.offset + oldCurInfo.sizeFactor + marginOffset; - for (int pos = oldCurPosition + 1; - pos <= curItem.position && itemIndex < mItems.size(); pos++) { - ii = mItems.get(itemIndex); - while (pos > ii.position && itemIndex < mItems.size() - 1) { - itemIndex++; - ii = mItems.get(itemIndex); - } - while (pos < ii.position) { - // We don't have an item populated for this, - // ask the adapter for an offset. - offset += mAdapter.getPageWidth(pos) + marginOffset; - pos++; - } - ii.offset = offset; - offset += ii.sizeFactor + marginOffset; - } - } else if (oldCurPosition > curItem.position) { - int itemIndex = mItems.size() - 1; - ItemInfo ii = null; - float offset = oldCurInfo.offset; - for (int pos = oldCurPosition - 1; - pos >= curItem.position && itemIndex >= 0; pos--) { - ii = mItems.get(itemIndex); - while (pos < ii.position && itemIndex > 0) { - itemIndex--; - ii = mItems.get(itemIndex); - } - while (pos > ii.position) { - // We don't have an item populated for this, - // ask the adapter for an offset. - offset -= mAdapter.getPageWidth(pos) + marginOffset; - pos--; - } - offset -= ii.sizeFactor + marginOffset; - ii.offset = offset; - } - } - } - - // Base all offsets off of curItem. - final int itemCount = mItems.size(); - float offset = curItem.offset; - int pos = curItem.position - 1; - mFirstOffset = curItem.position == 0 ? curItem.offset : -Float.MAX_VALUE; - mLastOffset = curItem.position == N - 1 ? - curItem.offset + curItem.sizeFactor - 1 : Float.MAX_VALUE; - // Previous pages - for (int i = curIndex - 1; i >= 0; i--, pos--) { - final ItemInfo ii = mItems.get(i); - while (pos > ii.position) { - offset -= mAdapter.getPageWidth(pos--) + marginOffset; - } - offset -= ii.sizeFactor + marginOffset; - ii.offset = offset; - if (ii.position == 0) mFirstOffset = offset; - } - offset = curItem.offset + curItem.sizeFactor + marginOffset; - pos = curItem.position + 1; - // Next pages - for (int i = curIndex + 1; i < itemCount; i++, pos++) { - final ItemInfo ii = mItems.get(i); - while (pos < ii.position) { - offset += mAdapter.getPageWidth(pos++) + marginOffset; - } - if (ii.position == N - 1) { - mLastOffset = offset + ii.sizeFactor - 1; - } - ii.offset = offset; - offset += ii.sizeFactor + marginOffset; - } - - mNeedCalculatePageOffsets = false; - } - - /** - * This is the persistent state that is saved by ViewPager. Only needed - * if you are creating a sublass of ViewPager that must save its own - * state, in which case it should implement a subclass of this which - * contains that state. - */ - public static class ViewPagerSavedState extends BaseSavedState { - int position; - Parcelable adapterState; - ClassLoader loader; - - public ViewPagerSavedState(Parcelable superState) { - super(superState); - } - - @Override - public void writeToParcel(Parcel out, int flags) { - super.writeToParcel(out, flags); - out.writeInt(position); - out.writeParcelable(adapterState, flags); - } - - @Override - public String toString() { - return "FragmentPager.SavedState{" - + Integer.toHexString(System.identityHashCode(this)) - + " position=" + position + "}"; - } - - public static final Parcelable.Creator CREATOR - = ParcelableCompat.newCreator(new ParcelableCompatCreatorCallbacks() { - @Override - public ViewPagerSavedState createFromParcel(Parcel in, ClassLoader loader) { - return new ViewPagerSavedState(in, loader); - } - - @Override - public ViewPagerSavedState[] newArray(int size) { - return new ViewPagerSavedState[size]; - } - }); - - ViewPagerSavedState(Parcel in, ClassLoader loader) { - super(in); - if (loader == null) { - loader = getClass().getClassLoader(); - } - position = in.readInt(); - adapterState = in.readParcelable(loader); - this.loader = loader; - } - } - - @Override - public Parcelable onSaveInstanceState() { - Parcelable superState = super.onSaveInstanceState(); - ViewPagerSavedState ss = new ViewPagerSavedState(superState); - ss.position = mCurItem; - if (mAdapter != null) { - ss.adapterState = mAdapter.saveState(); - } - return ss; - } - - @Override - public void onRestoreInstanceState(Parcelable state) { - if (!(state instanceof ViewPagerSavedState)) { - super.onRestoreInstanceState(state); - return; - } - - ViewPagerSavedState ss = (ViewPagerSavedState) state; - super.onRestoreInstanceState(ss.getSuperState()); - - if (mAdapter != null) { - mAdapter.restoreState(ss.adapterState, ss.loader); - setCurrentItemInternal(ss.position, false, true); - } else { - mRestoredCurItem = ss.position; - mRestoredAdapterState = ss.adapterState; - mRestoredClassLoader = ss.loader; - } - } - - @Override - public void addView(View child, int index, ViewGroup.LayoutParams params) { - if (!checkLayoutParams(params)) { - params = generateLayoutParams(params); - } - final LayoutParams lp = (LayoutParams) params; - lp.isDecor |= child instanceof Decor; - if (mInLayout) { - if (lp != null && lp.isDecor) { - throw new IllegalStateException("Cannot add pager decor view during layout"); - } - lp.needsMeasure = true; - addViewInLayout(child, index, params); - } else { - super.addView(child, index, params); - } - - if (USE_CACHE) { - if (child.getVisibility() != GONE) { - child.setDrawingCacheEnabled(mScrollingCacheEnabled); - } else { - child.setDrawingCacheEnabled(false); - } - } - } - - @Override - public void removeView(View view) { - if (mInLayout) { - removeViewInLayout(view); - } else { - super.removeView(view); - } - } - - ItemInfo infoForChild(View child) { - for (int i = 0; i < mItems.size(); i++) { - ItemInfo ii = mItems.get(i); - if (mAdapter.isViewFromObject(child, ii.object)) { - return ii; - } - } - return null; - } - - ItemInfo infoForAnyChild(View child) { - ViewParent parent; - while ((parent = child.getParent()) != this) { - if (parent == null || !(parent instanceof View)) { - return null; - } - child = (View) parent; - } - return infoForChild(child); - } - - ItemInfo infoForPosition(int position) { - for (int i = 0; i < mItems.size(); i++) { - ItemInfo ii = mItems.get(i); - if (ii.position == position) { - return ii; - } - } - return null; - } - - @Override - protected void onAttachedToWindow() { - super.onAttachedToWindow(); - mFirstLayout = true; - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - // For simple implementation, our internal size is always 0. - // We depend on the container to specify the layout size of - // our view. We can't really know what it is since we will be - // adding and removing different arbitrary views and do not - // want the layout to change as this happens. - setMeasuredDimension(getDefaultSize(0, widthMeasureSpec), - getDefaultSize(0, heightMeasureSpec)); - - final int measuredSize = - (mOrientation == Orientation.VERTICAL) ? getMeasuredHeight() : getMeasuredWidth(); - final int maxGutterSize = measuredSize / 10; - mGutterSize = Math.min(maxGutterSize, mDefaultGutterSize); - - // Children are just made to fill our space. - int childWidthSize; - int childHeightSize; - - if (mOrientation == Orientation.VERTICAL) { - childWidthSize = getMeasuredWidth() - getPaddingLeft() - getPaddingRight(); - childHeightSize = measuredSize - getPaddingTop() - getPaddingBottom(); - } else { - childWidthSize = measuredSize - getPaddingLeft() - getPaddingRight(); - childHeightSize = getMeasuredHeight() - getPaddingTop() - getPaddingBottom(); - } - - /* - * Make sure all children have been properly measured. Decor views first. - * Right now we cheat and make this less complicated by assuming decor - * views won't intersect. We will pin to edges based on gravity. - */ - int size = getChildCount(); - for (int i = 0; i < size; ++i) { - final View child = getChildAt(i); - if (child.getVisibility() != GONE) { - final LayoutParams lp = (LayoutParams) child.getLayoutParams(); - if (lp != null && lp.isDecor) { - final int hgrav = lp.gravity & Gravity.HORIZONTAL_GRAVITY_MASK; - final int vgrav = lp.gravity & Gravity.VERTICAL_GRAVITY_MASK; - int widthMode = MeasureSpec.AT_MOST; - int heightMode = MeasureSpec.AT_MOST; - boolean consumeVertical = vgrav == Gravity.TOP || vgrav == Gravity.BOTTOM; - boolean consumeHorizontal = hgrav == Gravity.LEFT || hgrav == Gravity.RIGHT; - - if (consumeVertical) { - widthMode = MeasureSpec.EXACTLY; - } else if (consumeHorizontal) { - heightMode = MeasureSpec.EXACTLY; - } - - int widthSize = childWidthSize; - int heightSize = childHeightSize; - if (lp.width != LayoutParams.WRAP_CONTENT) { - widthMode = MeasureSpec.EXACTLY; - if (lp.width != LayoutParams.FILL_PARENT) { - widthSize = lp.width; - } - } - if (lp.height != LayoutParams.WRAP_CONTENT) { - heightMode = MeasureSpec.EXACTLY; - if (lp.height != LayoutParams.FILL_PARENT) { - heightSize = lp.height; - } - } - final int widthSpec = MeasureSpec.makeMeasureSpec(widthSize, widthMode); - final int heightSpec = MeasureSpec.makeMeasureSpec(heightSize, heightMode); - child.measure(widthSpec, heightSpec); - - if (consumeVertical) { - childHeightSize -= child.getMeasuredHeight(); - } else if (consumeHorizontal) { - childWidthSize -= child.getMeasuredWidth(); - } - } - } - } - - mChildWidthMeasureSpec = MeasureSpec.makeMeasureSpec(childWidthSize, MeasureSpec.EXACTLY); - mChildHeightMeasureSpec = MeasureSpec.makeMeasureSpec(childHeightSize, MeasureSpec.EXACTLY); - - // Make sure we have created all fragments that we need to have shown. - mInLayout = true; - populate(); - mInLayout = false; - - // Page views next. - size = getChildCount(); - for (int i = 0; i < size; ++i) { - final View child = getChildAt(i); - if (child.getVisibility() != GONE) { - if (DEBUG) { - Log.v(TAG, "Measuring #" + i + " " + child - + ": " + mChildWidthMeasureSpec); - } - - final LayoutParams lp = (LayoutParams) child.getLayoutParams(); - if (lp == null || !lp.isDecor) { - if (mOrientation == Orientation.VERTICAL) { - final int heightSpec = MeasureSpec.makeMeasureSpec( - (int) (childHeightSize * lp.heightFactor), MeasureSpec.EXACTLY); - child.measure(mChildWidthMeasureSpec, heightSpec); - } else { - - final int widthSpec = MeasureSpec.makeMeasureSpec( - (int) (childWidthSize * lp.widthFactor), MeasureSpec.EXACTLY); - child.measure(widthSpec, mChildHeightMeasureSpec); - } - } - } - } - } - - @Override - protected void onSizeChanged(int w, int h, int oldw, int oldh) { - super.onSizeChanged(w, h, oldw, oldh); - - // Make sure scroll position is set correctly. - if (mOrientation == Orientation.VERTICAL) { - if (h != oldh) { - recomputeScrollPosition(h, oldh, mPageMargin, mPageMargin); - } - } else { - if (w != oldw) { - recomputeScrollPosition(w, oldw, mPageMargin, mPageMargin); - } - } - } - - private void recomputeScrollPosition(int size, int oldSize, int margin, int oldMargin) { - if (mOrientation == Orientation.VERTICAL) { - if (oldSize > 0 && !mItems.isEmpty()) { - final int heightWithMargin = size - getPaddingTop() - getPaddingBottom() + margin; - final int oldHeightWithMargin = oldSize - getPaddingTop() - getPaddingBottom() - + oldMargin; - final int ypos = getScrollY(); - final float pageOffset = (float) ypos / oldHeightWithMargin; - final int newOffsetPixels = (int) (pageOffset * heightWithMargin); - - scrollTo(getScrollX(), newOffsetPixels); - if (!mScroller.isFinished()) { - // We now return to your regularly scheduled scroll, already in progress. - final int newDuration = mScroller.getDuration() - mScroller.timePassed(); - ItemInfo targetInfo = infoForPosition(mCurItem); - mScroller.startScroll(0, newOffsetPixels, - 0, (int) (targetInfo.offset * size), newDuration); - } - } else { - final ItemInfo ii = infoForPosition(mCurItem); - final float scrollOffset = ii != null ? Math.min(ii.offset, mLastOffset) : 0; - final int scrollPos = (int) (scrollOffset * - (size - getPaddingTop() - getPaddingBottom())); - if (scrollPos != getScrollY()) { - completeScroll(false); - scrollTo(getScrollX(), scrollPos); - } - } - } else { - if (oldSize > 0 && !mItems.isEmpty()) { - final int widthWithMargin = size - getPaddingLeft() - getPaddingRight() + margin; - final int oldWidthWithMargin = oldSize - getPaddingLeft() - getPaddingRight() - + oldMargin; - final int xpos = getScrollX(); - final float pageOffset = (float) xpos / oldWidthWithMargin; - final int newOffsetPixels = (int) (pageOffset * widthWithMargin); - - scrollTo(newOffsetPixels, getScrollY()); - if (!mScroller.isFinished()) { - // We now return to your regularly scheduled scroll, already in progress. - final int newDuration = mScroller.getDuration() - mScroller.timePassed(); - ItemInfo targetInfo = infoForPosition(mCurItem); - mScroller.startScroll(newOffsetPixels, 0, - (int) (targetInfo.offset * size), 0, newDuration); - } - } else { - final ItemInfo ii = infoForPosition(mCurItem); - final float scrollOffset = ii != null ? Math.min(ii.offset, mLastOffset) : 0; - final int scrollPos = (int) (scrollOffset * - (size - getPaddingLeft() - getPaddingRight())); - if (scrollPos != getScrollX()) { - completeScroll(false); - scrollTo(scrollPos, getScrollY()); - } - } - } - } - - @Override - protected void onLayout(boolean changed, int l, int t, int r, int b) { - final int count = getChildCount(); - int width = r - l; - int height = b - t; - int paddingLeft = getPaddingLeft(); - int paddingTop = getPaddingTop(); - int paddingRight = getPaddingRight(); - int paddingBottom = getPaddingBottom(); - final int scroll = (mOrientation == Orientation.VERTICAL) ? getScrollY() : getScrollX(); - - int decorCount = 0; - - // First pass - decor views. We need to do this in two passes so that - // we have the proper offsets for non-decor views later. - for (int i = 0; i < count; i++) { - final View child = getChildAt(i); - if (child.getVisibility() != GONE) { - final LayoutParams lp = (LayoutParams) child.getLayoutParams(); - int childLeft = 0; - int childTop = 0; - if (lp.isDecor) { - final int hgrav = lp.gravity & Gravity.HORIZONTAL_GRAVITY_MASK; - final int vgrav = lp.gravity & Gravity.VERTICAL_GRAVITY_MASK; - switch (hgrav) { - default: - childLeft = paddingLeft; - break; - case Gravity.LEFT: - childLeft = paddingLeft; - paddingLeft += child.getMeasuredWidth(); - break; - case Gravity.CENTER_HORIZONTAL: - childLeft = Math.max((width - child.getMeasuredWidth()) / 2, - paddingLeft); - break; - case Gravity.RIGHT: - childLeft = width - paddingRight - child.getMeasuredWidth(); - paddingRight += child.getMeasuredWidth(); - break; - } - switch (vgrav) { - default: - childTop = paddingTop; - break; - case Gravity.TOP: - childTop = paddingTop; - paddingTop += child.getMeasuredHeight(); - break; - case Gravity.CENTER_VERTICAL: - childTop = Math.max((height - child.getMeasuredHeight()) / 2, - paddingTop); - break; - case Gravity.BOTTOM: - childTop = height - paddingBottom - child.getMeasuredHeight(); - paddingBottom += child.getMeasuredHeight(); - break; - } - if (mOrientation == Orientation.VERTICAL) { - childTop += scroll; - } else { - childLeft += scroll; - } - child.layout(childLeft, childTop, - childLeft + child.getMeasuredWidth(), - childTop + child.getMeasuredHeight()); - decorCount++; - } - } - } - - final int childSize = - (mOrientation == Orientation.VERTICAL) ? height - paddingTop - paddingBottom - : width - paddingLeft - paddingRight; - // Page views. Do this once we have the right padding offsets from above. - for (int i = 0; i < count; i++) { - final View child = getChildAt(i); - if (child.getVisibility() != GONE) { - final LayoutParams lp = (LayoutParams) child.getLayoutParams(); - ItemInfo ii; - if (!lp.isDecor && (ii = infoForChild(child)) != null) { - int topLeftoff = (int) (childSize * ii.offset); - int childLeft; - int childTop; - if (mOrientation == Orientation.VERTICAL) { - childLeft = paddingLeft; - childTop = paddingTop + topLeftoff; - if (lp.needsMeasure) { - // This was added during layout and needs measurement. - // Do it now that we know what we're working with. - lp.needsMeasure = false; - final int widthSpec = MeasureSpec.makeMeasureSpec( - (int) (width - paddingLeft - paddingRight), - MeasureSpec.EXACTLY); - final int heightSpec = MeasureSpec.makeMeasureSpec( - (int) (childSize * lp.heightFactor), - MeasureSpec.EXACTLY); - child.measure(widthSpec, heightSpec); - } - } else { - childLeft = paddingLeft + topLeftoff; - childTop = paddingTop; - if (lp.needsMeasure) { - // This was added during layout and needs measurement. - // Do it now that we know what we're working with. - lp.needsMeasure = false; - final int widthSpec = MeasureSpec.makeMeasureSpec( - (int) (childSize * lp.widthFactor), - MeasureSpec.EXACTLY); - final int heightSpec = MeasureSpec.makeMeasureSpec( - (int) (height - paddingTop - paddingBottom), - MeasureSpec.EXACTLY); - child.measure(widthSpec, heightSpec); - } - } - if (DEBUG) { - Log.v(TAG, "Positioning #" + i + " " + child + " f=" + ii.object - + ":" + childLeft + "," + childTop + " " + child.getMeasuredWidth() - + "x" + child.getMeasuredHeight()); - } - child.layout(childLeft, childTop, - childLeft + child.getMeasuredWidth(), - childTop + child.getMeasuredHeight()); - } - } - } - mTopLeftPageBounds = (mOrientation == Orientation.VERTICAL) ? paddingLeft : paddingTop; - mBottomRightPageBounds = - (mOrientation == Orientation.VERTICAL) ? width - paddingRight : height - paddingBottom; - mDecorChildCount = decorCount; - - if (mFirstLayout) { - scrollToItem(mCurItem, false, 0, false); - } - mFirstLayout = false; - } - - @Override - public void computeScroll() { - if (!mScroller.isFinished() && mScroller.computeScrollOffset()) { - int oldX = getScrollX(); - int oldY = getScrollY(); - int x = mScroller.getCurrX(); - int y = mScroller.getCurrY(); - - if (oldX != x || oldY != y) { - scrollTo(x, y); - if (mOrientation == Orientation.VERTICAL) { - if (!pageScrolled(y)) { - mScroller.abortAnimation(); - scrollTo(x, 0); - } - } else { - if (!pageScrolled(x)) { - mScroller.abortAnimation(); - scrollTo(0, y); - } - } - } - - // Keep on drawing until the animation has finished. - ViewCompat.postInvalidateOnAnimation(this); - return; - } - - // Done with scroll, clean up state. - completeScroll(true); - } - - private boolean pageScrolled(int pos) { - if (mItems.size() == 0) { - mCalledSuper = false; - onPageScrolled(0, 0, 0); - if (!mCalledSuper) { - throw new IllegalStateException( - "onPageScrolled did not call superclass implementation"); - } - return false; - } - final ItemInfo ii = infoForCurrentScrollPosition(); - final int size = getClientSize(); - final int sizeWithMargin = size + mPageMargin; - final float marginOffset = (float) mPageMargin / size; - final int currentPage = ii.position; - final float pageOffset = (((float) pos / size) - ii.offset) / (ii.sizeFactor + marginOffset); - final int offsetPixels = (int) (pageOffset * sizeWithMargin); - - mCalledSuper = false; - onPageScrolled(currentPage, pageOffset, offsetPixels); - if (!mCalledSuper) { - throw new IllegalStateException( - "onPageScrolled did not call superclass implementation"); - } - return true; - } - - /** - * This method will be invoked when the current page is scrolled, either as part - * of a programmatically initiated smooth scroll or a user initiated touch scroll. - * If you override this method you must call through to the superclass implementation - * (e.g. super.onPageScrolled(position, offset, offsetPixels)) before onPageScrolled - * returns. - * - * @param position Position index of the first page currently being displayed. - * Page position+1 will be visible if positionOffset is nonzero. - * @param offset Value from [0, 1) indicating the offset from the page at position. - * @param offsetPixels Value in pixels indicating the offset from position. - */ - protected void onPageScrolled(int position, float offset, int offsetPixels) { - // Offset any decor views if needed - keep them on-screen at all times. - if (mDecorChildCount > 0) { - if (mOrientation == Orientation.VERTICAL) { - final int scrollY = getScrollY(); - int paddingTop = getPaddingTop(); - int paddingBottom = getPaddingBottom(); - final int height = getHeight(); - final int childCount = getChildCount(); - for (int i = 0; i < childCount; i++) { - final View child = getChildAt(i); - final LayoutParams lp = (LayoutParams) child.getLayoutParams(); - if (!lp.isDecor) continue; - - final int vgrav = lp.gravity & Gravity.VERTICAL_GRAVITY_MASK; - int childTop = 0; - switch (vgrav) { - default: - childTop = paddingTop; - break; - case Gravity.TOP: - childTop = paddingTop; - paddingTop += child.getHeight(); - break; - case Gravity.CENTER_VERTICAL: - childTop = Math.max((height - child.getMeasuredHeight()) / 2, - paddingTop); - break; - case Gravity.BOTTOM: - childTop = height - paddingBottom - child.getMeasuredHeight(); - paddingBottom += child.getMeasuredHeight(); - break; - } - childTop += scrollY; - - final int childOffset = childTop - child.getTop(); - if (childOffset != 0) { - child.offsetTopAndBottom(childOffset); - } - } - } else { - final int scrollX = getScrollX(); - int paddingLeft = getPaddingLeft(); - int paddingRight = getPaddingRight(); - final int width = getWidth(); - final int childCount = getChildCount(); - for (int i = 0; i < childCount; i++) { - final View child = getChildAt(i); - final LayoutParams lp = (LayoutParams) child.getLayoutParams(); - if (!lp.isDecor) continue; - - final int hgrav = lp.gravity & Gravity.HORIZONTAL_GRAVITY_MASK; - int childLeft = 0; - switch (hgrav) { - default: - childLeft = paddingLeft; - break; - case Gravity.LEFT: - childLeft = paddingLeft; - paddingLeft += child.getWidth(); - break; - case Gravity.CENTER_HORIZONTAL: - childLeft = Math.max((width - child.getMeasuredWidth()) / 2, - paddingLeft); - break; - case Gravity.RIGHT: - childLeft = width - paddingRight - child.getMeasuredWidth(); - paddingRight += child.getMeasuredWidth(); - break; - } - childLeft += scrollX; - - final int childOffset = childLeft - child.getLeft(); - if (childOffset != 0) { - child.offsetLeftAndRight(childOffset); - } - } - } - } - - if (mOnPageChangeListener != null) { - mOnPageChangeListener.onPageScrolled(position, offset, offsetPixels); - } - if (mInternalPageChangeListener != null) { - mInternalPageChangeListener.onPageScrolled(position, offset, offsetPixels); - } - - if (mPageTransformer != null) { - final int scroll = (mOrientation == Orientation.VERTICAL) ? getScrollY() : getScrollX(); - final int childCount = getChildCount(); - for (int i = 0; i < childCount; i++) { - final View child = getChildAt(i); - final LayoutParams lp = (LayoutParams) child.getLayoutParams(); - - if (lp.isDecor) continue; - - final float transformPos = - (float) (((mOrientation == Orientation.VERTICAL) ? child.getTop() : child.getLeft()) - - scroll) / getClientSize(); - mPageTransformer.transformPage(child, transformPos); - } - } - - mCalledSuper = true; - } - - private void completeScroll(boolean postEvents) { - boolean needPopulate = mScrollState == SCROLL_STATE_SETTLING; - if (needPopulate) { - // Done with scroll, no longer want to cache view drawing. - setScrollingCacheEnabled(false); - mScroller.abortAnimation(); - int oldX = getScrollX(); - int oldY = getScrollY(); - int x = mScroller.getCurrX(); - int y = mScroller.getCurrY(); - if (oldX != x || oldY != y) { - scrollTo(x, y); - } - } - mPopulatePending = false; - for (int i = 0; i < mItems.size(); i++) { - ItemInfo ii = mItems.get(i); - if (ii.scrolling) { - needPopulate = true; - ii.scrolling = false; - } - } - if (needPopulate) { - if (postEvents) { - ViewCompat.postOnAnimation(this, mEndScrollRunnable); - } else { - mEndScrollRunnable.run(); - } - } - } - - private boolean isGutterDrag(float axis, float dAxis) { - return (axis < mGutterSize && dAxis > 0) || (axis - > (mOrientation == Orientation.VERTICAL ? getHeight() : getWidth()) - mGutterSize - && dAxis < 0); - } - - private void enableLayers(boolean enable) { - final int childCount = getChildCount(); - for (int i = 0; i < childCount; i++) { - final int layerType = enable ? - ViewCompat.LAYER_TYPE_HARDWARE : ViewCompat.LAYER_TYPE_NONE; - ViewCompat.setLayerType(getChildAt(i), layerType, null); - } - } - - @Override - public boolean onInterceptTouchEvent(MotionEvent ev) { - /* - * This method JUST determines whether we want to intercept the motion. - * If we return true, onMotionEvent will be called and we do the actual - * scrolling there. - */ - - final int action = ev.getAction() & MotionEventCompat.ACTION_MASK; - - // Always take care of the touch gesture being complete. - if (action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) { - // Release the drag. - if (DEBUG) Log.v(TAG, "Intercept done!"); - mIsBeingDragged = false; - mIsUnableToDrag = false; - mActivePointerId = INVALID_POINTER; - if (mVelocityTracker != null) { - mVelocityTracker.recycle(); - mVelocityTracker = null; - } - return false; - } - - // Nothing more to do here if we have decided whether or not we - // are dragging. - if (action != MotionEvent.ACTION_DOWN) { - if (mIsBeingDragged) { - if (DEBUG) Log.v(TAG, "Intercept returning true!"); - return true; - } - if (mIsUnableToDrag) { - if (DEBUG) Log.v(TAG, "Intercept returning false!"); - return false; - } - } - - switch (action) { - case MotionEvent.ACTION_MOVE: { - /* - * mIsBeingDragged == false, otherwise the shortcut would have caught it. Check - * whether the user has moved far enough from his original down touch. - */ - - /* - * Locally do absolute value. mLastMotionY is set to the y value - * of the down event. - */ - final int activePointerId = mActivePointerId; - if (activePointerId == INVALID_POINTER) { - // If we don't have a valid id, the touch down wasn't on content. - break; - } - - final int pointerIndex = MotionEventCompat.findPointerIndex(ev, activePointerId); - if (mOrientation == Orientation.VERTICAL) { - final float y = MotionEventCompat.getY(ev, pointerIndex); - final float dy = y - mLastMotionY; - final float yDiff = Math.abs(dy); - final float x = MotionEventCompat.getX(ev, pointerIndex); - final float xDiff = Math.abs(x - mInitialMotionX); - if (DEBUG) { - Log.v(TAG, "Moved x to " + x + "," + y + " diff=" + xDiff + "," + yDiff); - } - - if (dy != 0 && !isGutterDrag(mLastMotionY, dy) && - canScroll(this, false, (int) dy, (int) x, (int) y)) { - // Nested view has scrollable area under this point. Let it be handled there. - mLastMotionX = x; - mLastMotionY = y; - mIsUnableToDrag = true; - return false; - } - if (yDiff > mTouchSlop && yDiff * 0.5f > xDiff) { - if (DEBUG) Log.v(TAG, "Starting drag!"); - mIsBeingDragged = true; - requestParentDisallowInterceptTouchEvent(true); - setScrollState(SCROLL_STATE_DRAGGING); - mLastMotionY = dy > 0 ? mInitialMotionY + mTouchSlop : - mInitialMotionY - mTouchSlop; - mLastMotionX = x; - setScrollingCacheEnabled(true); - } else if (xDiff > mTouchSlop) { - // The finger has moved enough in the vertical - // direction to be counted as a drag... abort - // any attempt to drag horizontally, to work correctly - // with children that have scrolling containers. - if (DEBUG) Log.v(TAG, "Starting unable to drag!"); - mIsUnableToDrag = true; - } - if (mIsBeingDragged) { - // Scroll to follow the motion event - if (performDrag(y)) { - ViewCompat.postInvalidateOnAnimation(this); - } - } - } else { - final float x = MotionEventCompat.getX(ev, pointerIndex); - final float dx = x - mLastMotionX; - final float xDiff = Math.abs(dx); - final float y = MotionEventCompat.getY(ev, pointerIndex); - final float yDiff = Math.abs(y - mInitialMotionY); - if (DEBUG) { - Log.v(TAG, "Moved x to " + x + "," + y + " diff=" + xDiff + "," + yDiff); - } - - //if (dx != 0 && !isGutterDrag(mLastMotionX, dx) && - // canScroll(this, false, (int) dx, (int) x, (int) y)) { - // // Nested view has scrollable area under this point. Let it be handled there. - // mLastMotionX = x; - // mLastMotionY = y; - // mIsUnableToDrag = true; - // return false; - //} - if (xDiff > mTouchSlop && xDiff * 0.5f > yDiff) { - if (DEBUG) Log.v(TAG, "Starting drag!"); - mIsBeingDragged = true; - requestParentDisallowInterceptTouchEvent(true); - setScrollState(SCROLL_STATE_DRAGGING); - mLastMotionX = dx > 0 ? mInitialMotionX + mTouchSlop : - mInitialMotionX - mTouchSlop; - mLastMotionY = y; - setScrollingCacheEnabled(true); - } else if (yDiff > mTouchSlop) { - // The finger has moved enough in the vertical - // direction to be counted as a drag... abort - // any attempt to drag horizontally, to work correctly - // with children that have scrolling containers. - if (DEBUG) Log.v(TAG, "Starting unable to drag!"); - mIsUnableToDrag = true; - } - if (mIsBeingDragged) { - // Scroll to follow the motion event - if (performDrag(x)) { - ViewCompat.postInvalidateOnAnimation(this); - } - } - } - break; - } - - case MotionEvent.ACTION_DOWN: { - /* - * Remember location of down touch. - * ACTION_DOWN always refers to pointer index 0. - */ - mLastMotionX = mInitialMotionX = ev.getX(); - mLastMotionY = mInitialMotionY = ev.getY(); - mActivePointerId = MotionEventCompat.getPointerId(ev, 0); - mIsUnableToDrag = false; - - mScroller.computeScrollOffset(); - if (mOrientation == Orientation.VERTICAL) { - if (mScrollState == SCROLL_STATE_SETTLING && - Math.abs(mScroller.getFinalY() - mScroller.getCurrY()) > mCloseEnough) { - // Let the user 'catch' the pager as it animates. - mScroller.abortAnimation(); - mPopulatePending = false; - populate(); - mIsBeingDragged = true; - requestParentDisallowInterceptTouchEvent(true); - setScrollState(SCROLL_STATE_DRAGGING); - } else { - completeScroll(false); - mIsBeingDragged = false; - } - } else { - if (mScrollState == SCROLL_STATE_SETTLING && - Math.abs(mScroller.getFinalX() - mScroller.getCurrX()) > mCloseEnough) { - // Let the user 'catch' the pager as it animates. - mScroller.abortAnimation(); - mPopulatePending = false; - populate(); - mIsBeingDragged = true; - requestParentDisallowInterceptTouchEvent(true); - setScrollState(SCROLL_STATE_DRAGGING); - } else { - completeScroll(false); - mIsBeingDragged = false; - } - } - - if (DEBUG) { - Log.v(TAG, "Down at " + mLastMotionX + "," + mLastMotionY - + " mIsBeingDragged=" + mIsBeingDragged - + "mIsUnableToDrag=" + mIsUnableToDrag); - } - break; - } - - case MotionEventCompat.ACTION_POINTER_UP: - onSecondaryPointerUp(ev); - break; - } - - if (mVelocityTracker == null) { - mVelocityTracker = VelocityTracker.obtain(); - } - mVelocityTracker.addMovement(ev); - - /* - * The only time we want to intercept motion events is if we are in the - * drag mode. - */ - return mIsBeingDragged; - } - - @Override - public boolean onTouchEvent(MotionEvent ev) { - if (mFakeDragging) { - // A fake drag is in progress already, ignore this real one - // but still eat the touch events. - // (It is likely that the user is multi-touching the screen.) - return true; - } - - if (ev.getAction() == MotionEvent.ACTION_DOWN && ev.getEdgeFlags() != 0) { - // Don't handle edge touches immediately -- they may actually belong to one of our - // descendants. - return false; - } - - if (mAdapter == null || mAdapter.getCount() == 0) { - // Nothing to present or scroll; nothing to touch. - return false; - } - - if (mVelocityTracker == null) { - mVelocityTracker = VelocityTracker.obtain(); - } - mVelocityTracker.addMovement(ev); - - final int action = ev.getAction(); - boolean needsInvalidate = false; - - switch (action & MotionEventCompat.ACTION_MASK) { - case MotionEvent.ACTION_DOWN: { - mScroller.abortAnimation(); - mPopulatePending = false; - populate(); - - // Remember where the motion event started - mLastMotionX = mInitialMotionX = ev.getX(); - mLastMotionY = mInitialMotionY = ev.getY(); - mActivePointerId = MotionEventCompat.getPointerId(ev, 0); - break; - } - case MotionEvent.ACTION_MOVE: - if (!mIsBeingDragged) { - final int pointerIndex = MotionEventCompat.findPointerIndex(ev, mActivePointerId); - final float y = MotionEventCompat.getY(ev, pointerIndex); - final float yDiff = Math.abs(y - mLastMotionY); - final float x = MotionEventCompat.getX(ev, pointerIndex); - final float xDiff = Math.abs(x - mLastMotionX); - if (DEBUG) { - Log.v(TAG, "Moved x to " + x + "," + y + " diff=" + xDiff + "," + yDiff); - } - if (mOrientation == Orientation.VERTICAL) { - if (yDiff > mTouchSlop && yDiff > xDiff) { - if (DEBUG) Log.v(TAG, "Starting drag!"); - mIsBeingDragged = true; - requestParentDisallowInterceptTouchEvent(true); - mLastMotionY = y - mInitialMotionY > 0 ? mInitialMotionY + mTouchSlop : - mInitialMotionY - mTouchSlop; - mLastMotionX = x; - setScrollState(SCROLL_STATE_DRAGGING); - setScrollingCacheEnabled(true); - - // Disallow Parent Intercept, just in case - ViewParent parent = getParent(); - if (parent != null) { - parent.requestDisallowInterceptTouchEvent(true); - } - } - } else { - if (xDiff > mTouchSlop && xDiff > yDiff) { - if (DEBUG) Log.v(TAG, "Starting drag!"); - mIsBeingDragged = true; - requestParentDisallowInterceptTouchEvent(true); - mLastMotionX = x - mInitialMotionX > 0 ? mInitialMotionX + mTouchSlop : - mInitialMotionX - mTouchSlop; - mLastMotionY = y; - setScrollState(SCROLL_STATE_DRAGGING); - setScrollingCacheEnabled(true); - - // Disallow Parent Intercept, just in case - ViewParent parent = getParent(); - if (parent != null) { - parent.requestDisallowInterceptTouchEvent(true); - } - } - } - } - // Not else! Note that mIsBeingDragged can be set above. - if (mIsBeingDragged) { - // Scroll to follow the motion event - final int activePointerIndex = MotionEventCompat.findPointerIndex( - ev, mActivePointerId); - if (mOrientation == Orientation.VERTICAL) { - final float y = MotionEventCompat.getY(ev, activePointerIndex); - needsInvalidate |= performDrag(y); - } else { - final float x = MotionEventCompat.getX(ev, activePointerIndex); - needsInvalidate |= performDrag(x); - } - } - break; - case MotionEvent.ACTION_UP: - if (mIsBeingDragged) { - int currentPage; - int initialVelocity; - int totalDelta; - float pageOffset; - if (mOrientation == Orientation.VERTICAL) { - final VelocityTracker velocityTracker = mVelocityTracker; - velocityTracker.computeCurrentVelocity(1000, mMaximumVelocity); - initialVelocity = (int) VelocityTrackerCompat.getYVelocity( - velocityTracker, mActivePointerId); - mPopulatePending = true; - final int height = getClientSize(); - final int scrollY = getScrollY(); - final ItemInfo ii = infoForCurrentScrollPosition(); - currentPage = ii.position; - pageOffset = (((float) scrollY / height) - ii.offset) / ii.sizeFactor; - final int activePointerIndex = - MotionEventCompat.findPointerIndex(ev, mActivePointerId); - final float y = MotionEventCompat.getY(ev, activePointerIndex); - totalDelta = (int) (y - mInitialMotionY); - } else { - final VelocityTracker velocityTracker = mVelocityTracker; - velocityTracker.computeCurrentVelocity(1000, mMaximumVelocity); - initialVelocity = (int) VelocityTrackerCompat.getXVelocity( - velocityTracker, mActivePointerId); - mPopulatePending = true; - final int width = getClientSize(); - final int scrollX = getScrollX(); - final ItemInfo ii = infoForCurrentScrollPosition(); - currentPage = ii.position; - pageOffset = (((float) scrollX / width) - ii.offset) / ii.sizeFactor; - final int activePointerIndex = - MotionEventCompat.findPointerIndex(ev, mActivePointerId); - final float x = MotionEventCompat.getX(ev, activePointerIndex); - totalDelta = (int) (x - mInitialMotionX); - } - int nextPage = determineTargetPage(currentPage, pageOffset, initialVelocity, - totalDelta); - setCurrentItemInternal(nextPage, true, true, initialVelocity); - - mActivePointerId = INVALID_POINTER; - endDrag(); - needsInvalidate = mTopLeftEdge.onRelease() | mRightBottomEdge.onRelease(); - } - break; - case MotionEvent.ACTION_CANCEL: - if (mIsBeingDragged) { - scrollToItem(mCurItem, true, 0, false); - mActivePointerId = INVALID_POINTER; - endDrag(); - needsInvalidate = mTopLeftEdge.onRelease() | mRightBottomEdge.onRelease(); - } - break; - case MotionEventCompat.ACTION_POINTER_DOWN: { - int index; - if (mOrientation == Orientation.VERTICAL) { - index = MotionEventCompat.getActionIndex(ev); - final float y = MotionEventCompat.getY(ev, index); - mLastMotionY = y; - } else { - index = MotionEventCompat.getActionIndex(ev); - final float x = MotionEventCompat.getX(ev, index); - mLastMotionX = x; - } - mActivePointerId = MotionEventCompat.getPointerId(ev, index); - break; - } - case MotionEventCompat.ACTION_POINTER_UP: - onSecondaryPointerUp(ev); - if (mOrientation == Orientation.VERTICAL) { - mLastMotionY = MotionEventCompat.getY(ev, - MotionEventCompat.findPointerIndex(ev, mActivePointerId)); - } else { - mLastMotionX = MotionEventCompat.getX(ev, - MotionEventCompat.findPointerIndex(ev, mActivePointerId)); - } - break; - } - if (needsInvalidate) { - ViewCompat.postInvalidateOnAnimation(this); - } - return true; - } - - private void requestParentDisallowInterceptTouchEvent(boolean disallowIntercept) { - final ViewParent parent = getParent(); - if (parent != null) { - parent.requestDisallowInterceptTouchEvent(disallowIntercept); - } - } - - private boolean performDrag(float dimen) { - boolean needsInvalidate = false; - - if (mOrientation == Orientation.VERTICAL) { - float y = dimen; - final float deltaY = mLastMotionY - y; - mLastMotionY = y; - - float oldScrollY = getScrollY(); - float scrollY = oldScrollY + deltaY; - final int height = getClientSize(); - - float topBound = height * mFirstOffset; - float bottomBound = height * mLastOffset; - boolean topAbsolute = true; - boolean bottomAbsolute = true; - - final ItemInfo firstItem = mItems.get(0); - final ItemInfo lastItem = mItems.get(mItems.size() - 1); - if (firstItem.position != 0) { - topAbsolute = false; - topBound = firstItem.offset * height; - } - if (lastItem.position != mAdapter.getCount() - 1) { - bottomAbsolute = false; - bottomBound = lastItem.offset * height; - } - - if (scrollY < topBound) { - if (topAbsolute) { - float over = topBound - scrollY; - needsInvalidate = mTopLeftEdge.onPull(Math.abs(over) / height); - } - scrollY = topBound; - } else if (scrollY > bottomBound) { - if (bottomAbsolute) { - float over = scrollY - bottomBound; - needsInvalidate = mRightBottomEdge.onPull(Math.abs(over) / height); - } - scrollY = bottomBound; - } - // Don't lose the rounded component - mLastMotionX += scrollY - (int) scrollY; - scrollTo(getScrollX(), (int) scrollY); - pageScrolled((int) scrollY); - } else { - float x = dimen; - - final float deltaX = mLastMotionX - x; - mLastMotionX = x; - - float oldScrollX = getScrollX(); - float scrollX = oldScrollX + deltaX; - final int width = getClientSize(); - - float leftBound = width * mFirstOffset; - float rightBound = width * mLastOffset; - boolean leftAbsolute = true; - boolean rightAbsolute = true; - - final ItemInfo firstItem = mItems.get(0); - final ItemInfo lastItem = mItems.get(mItems.size() - 1); - if (firstItem.position != 0) { - leftAbsolute = false; - leftBound = firstItem.offset * width; - } - if (lastItem.position != mAdapter.getCount() - 1) { - rightAbsolute = false; - rightBound = lastItem.offset * width; - } - - if (scrollX < leftBound) { - if (leftAbsolute) { - float over = leftBound - scrollX; - needsInvalidate = mTopLeftEdge.onPull(Math.abs(over) / width); - } - scrollX = leftBound; - } else if (scrollX > rightBound) { - if (rightAbsolute) { - float over = scrollX - rightBound; - needsInvalidate = mRightBottomEdge.onPull(Math.abs(over) / width); - } - scrollX = rightBound; - } - // Don't lose the rounded component - mLastMotionX += scrollX - (int) scrollX; - scrollTo((int) scrollX, getScrollY()); - pageScrolled((int) scrollX); - } - - return needsInvalidate; - } - - /** - * @return Info about the page at the current scroll position. - * This can be synthetic for a missing middle page; the 'object' field can be null. - */ - private ItemInfo infoForCurrentScrollPosition() { - final int size = getClientSize(); - final float scrollOffset = - size > 0 ? (float) ((mOrientation == Orientation.VERTICAL) ? getScrollY() : getScrollX()) - / size : 0; - final float marginOffset = size > 0 ? (float) mPageMargin / size : 0; - int lastPos = -1; - float lastOffset = 0.f; - float lastSize = 0.f; - boolean first = true; - - ItemInfo lastItem = null; - for (int i = 0; i < mItems.size(); i++) { - ItemInfo ii = mItems.get(i); - float offset; - if (!first && ii.position != lastPos + 1) { - // Create a synthetic item for a missing page. - ii = mTempItem; - ii.offset = lastOffset + lastSize + marginOffset; - ii.position = lastPos + 1; - ii.sizeFactor = mAdapter.getPageWidth(ii.position); - i--; - } - offset = ii.offset; - - final float topLeftBound = offset; - final float bottomRightBound = offset + ii.sizeFactor + marginOffset; - if (first || scrollOffset >= topLeftBound) { - if (scrollOffset < bottomRightBound || i == mItems.size() - 1) { - return ii; - } - } else { - return lastItem; - } - first = false; - lastPos = ii.position; - lastOffset = offset; - lastSize = ii.sizeFactor; - lastItem = ii; - } - - return lastItem; - } - - private int determineTargetPage(int currentPage, float pageOffset, int velocity, int deltaDimen) { - int targetPage; - if (Math.abs(deltaDimen) > mFlingDistance && Math.abs(velocity) > mMinimumVelocity) { - targetPage = velocity > 0 ? currentPage : currentPage + 1; - } else { - final float truncator = currentPage >= mCurItem ? 0.4f : 0.6f; - targetPage = (int) (currentPage + pageOffset + truncator); - } - - if (mItems.size() > 0) { - final ItemInfo firstItem = mItems.get(0); - final ItemInfo lastItem = mItems.get(mItems.size() - 1); - - // Only let the user target pages we have items for - targetPage = Math.max(firstItem.position, Math.min(targetPage, lastItem.position)); - } - - return targetPage; - } - - @Override - public void draw(Canvas canvas) { - super.draw(canvas); - boolean needsInvalidate = false; - - final int overScrollMode = ViewCompat.getOverScrollMode(this); - if (overScrollMode == ViewCompat.OVER_SCROLL_ALWAYS || - (overScrollMode == ViewCompat.OVER_SCROLL_IF_CONTENT_SCROLLS && - mAdapter != null && mAdapter.getCount() > 1)) { - if (mOrientation == Orientation.VERTICAL) { - if (!mTopLeftEdge.isFinished()) { - final int restoreCount = canvas.save(); - final int height = getHeight(); - final int width = getWidth() - getPaddingLeft() - getPaddingRight(); - - canvas.translate(getPaddingLeft(), mFirstOffset * height); - mTopLeftEdge.setSize(width, height); - needsInvalidate |= mTopLeftEdge.draw(canvas); - canvas.restoreToCount(restoreCount); - } - if (!mRightBottomEdge.isFinished()) { - final int restoreCount = canvas.save(); - final int height = getHeight(); - final int width = getWidth() - getPaddingLeft() - getPaddingRight(); - - canvas.rotate(180); - canvas.translate(-width - getPaddingLeft(), -(mLastOffset + 1) * height); - mRightBottomEdge.setSize(width, height); - needsInvalidate |= mRightBottomEdge.draw(canvas); - canvas.restoreToCount(restoreCount); - } - } else { - if (!mTopLeftEdge.isFinished()) { - final int restoreCount = canvas.save(); - final int height = getHeight() - getPaddingTop() - getPaddingBottom(); - final int width = getWidth(); - - canvas.rotate(270); - canvas.translate(-height + getPaddingTop(), mFirstOffset * width); - mTopLeftEdge.setSize(height, width); - needsInvalidate |= mTopLeftEdge.draw(canvas); - canvas.restoreToCount(restoreCount); - } - if (!mRightBottomEdge.isFinished()) { - final int restoreCount = canvas.save(); - final int width = getWidth(); - final int height = getHeight() - getPaddingTop() - getPaddingBottom(); - - canvas.rotate(90); - canvas.translate(-getPaddingTop(), -(mLastOffset + 1) * width); - mRightBottomEdge.setSize(height, width); - needsInvalidate |= mRightBottomEdge.draw(canvas); - canvas.restoreToCount(restoreCount); - } - } - } else { - mTopLeftEdge.finish(); - mRightBottomEdge.finish(); - } - - if (needsInvalidate) { - // Keep animating - ViewCompat.postInvalidateOnAnimation(this); - } - } - - @Override - protected void onDraw(Canvas canvas) { - super.onDraw(canvas); - - // Draw the margin drawable between pages if needed. - if (mPageMargin > 0 && mMarginDrawable != null && mItems.size() > 0 && mAdapter != null) { - if (mOrientation == Orientation.VERTICAL) { - final int scrollY = getScrollY(); - final int height = getHeight(); - - final float marginOffset = (float) mPageMargin / height; - int itemIndex = 0; - ItemInfo ii = mItems.get(0); - float offset = ii.offset; - final int itemCount = mItems.size(); - final int firstPos = ii.position; - final int lastPos = mItems.get(itemCount - 1).position; - for (int pos = firstPos; pos < lastPos; pos++) { - while (pos > ii.position && itemIndex < itemCount) { - ii = mItems.get(++itemIndex); - } - - float drawAt; - if (pos == ii.position) { - drawAt = (ii.offset + ii.sizeFactor) * height; - offset = ii.offset + ii.sizeFactor + marginOffset; - } else { - float heightFactor = mAdapter.getPageWidth(pos); - drawAt = (offset + heightFactor) * height; - offset += heightFactor + marginOffset; - } - - if (drawAt + mPageMargin > scrollY) { - mMarginDrawable.setBounds(mTopLeftPageBounds, (int) drawAt, - mBottomRightPageBounds, (int) (drawAt + mPageMargin + 0.5f)); - mMarginDrawable.draw(canvas); - } - - if (drawAt > scrollY + height) { - break; // No more visible, no sense in continuing - } - } - } else { - final int scrollX = getScrollX(); - final int width = getWidth(); - - final float marginOffset = (float) mPageMargin / width; - int itemIndex = 0; - ItemInfo ii = mItems.get(0); - float offset = ii.offset; - final int itemCount = mItems.size(); - final int firstPos = ii.position; - final int lastPos = mItems.get(itemCount - 1).position; - for (int pos = firstPos; pos < lastPos; pos++) { - while (pos > ii.position && itemIndex < itemCount) { - ii = mItems.get(++itemIndex); - } - - float drawAt; - if (pos == ii.position) { - drawAt = (ii.offset + ii.sizeFactor) * width; - offset = ii.offset + ii.sizeFactor + marginOffset; - } else { - float widthFactor = mAdapter.getPageWidth(pos); - drawAt = (offset + widthFactor) * width; - offset += widthFactor + marginOffset; - } - - if (drawAt + mPageMargin > scrollX) { - mMarginDrawable.setBounds((int) drawAt, mTopLeftPageBounds, - (int) (drawAt + mPageMargin + 0.5f), mBottomRightPageBounds); - mMarginDrawable.draw(canvas); - } - - if (drawAt > scrollX + width) { - break; // No more visible, no sense in continuing - } - } - } - } - } - - /** - * Start a fake drag of the pager. - *

- *

A fake drag can be useful if you want to synchronize the motion of the ViewPager - * with the touch scrolling of another view, while still letting the ViewPager - * control the snapping motion and fling behavior. (e.g. parallax-scrolling tabs.) - * Call {@link #fakeDragBy(float)} to simulate the actual drag motion. Call - * {@link #endFakeDrag()} to complete the fake drag and fling as necessary. - *

- *

During a fake drag the ViewPager will ignore all touch events. If a real drag - * is already in progress, this method will return false. - * - * @return true if the fake drag began successfully, false if it could not be started. - * @see #fakeDragBy(float) - * @see #endFakeDrag() - */ - public boolean beginFakeDrag() { - if (mIsBeingDragged) { - return false; - } - mFakeDragging = true; - setScrollState(SCROLL_STATE_DRAGGING); - if (mOrientation == Orientation.VERTICAL) { - mInitialMotionY = mLastMotionY = 0; - } else { - mInitialMotionX = mLastMotionX = 0; - } - if (mVelocityTracker == null) { - mVelocityTracker = VelocityTracker.obtain(); - } else { - mVelocityTracker.clear(); - } - final long time = SystemClock.uptimeMillis(); - final MotionEvent ev = MotionEvent.obtain(time, time, MotionEvent.ACTION_DOWN, 0, 0, 0); - mVelocityTracker.addMovement(ev); - ev.recycle(); - mFakeDragBeginTime = time; - return true; - } - - /** - * End a fake drag of the pager. - * - * @see #beginFakeDrag() - * @see #fakeDragBy(float) - */ - public void endFakeDrag() { - if (!mFakeDragging) { - throw new IllegalStateException("No fake drag in progress. Call beginFakeDrag first."); - } - - final VelocityTracker velocityTracker = mVelocityTracker; - velocityTracker.computeCurrentVelocity(1000, mMaximumVelocity); - if (mOrientation == Orientation.VERTICAL) { - int initialVelocity = (int) VelocityTrackerCompat.getYVelocity( - velocityTracker, mActivePointerId); - mPopulatePending = true; - final int size = getClientSize(); - final int scrollY = getScrollY(); - final ItemInfo ii = infoForCurrentScrollPosition(); - final int currentPage = ii.position; - final float pageOffset = (((float) scrollY / size) - ii.offset) / ii.sizeFactor; - final int totalDelta = (int) (mLastMotionY - mInitialMotionY); - - int nextPage = determineTargetPage(currentPage, pageOffset, initialVelocity, - totalDelta); - setCurrentItemInternal(nextPage, true, true, initialVelocity); - } else { - int initialVelocity = (int) VelocityTrackerCompat.getXVelocity( - velocityTracker, mActivePointerId); - mPopulatePending = true; - final int size = getClientSize(); - final int scrollX = getScrollX(); - final ItemInfo ii = infoForCurrentScrollPosition(); - final int currentPage = ii.position; - final float pageOffset = (((float) scrollX / size) - ii.offset) / ii.sizeFactor; - final int totalDelta = (int) (mLastMotionX - mInitialMotionX); - int nextPage = determineTargetPage(currentPage, pageOffset, initialVelocity, - totalDelta); - setCurrentItemInternal(nextPage, true, true, initialVelocity); - } - endDrag(); - - mFakeDragging = false; - } - - /** - * Fake drag by an offset in pixels. You must have called {@link #beginFakeDrag()} first. - * - * @param offset Offset in pixels to drag by. - * @see #beginFakeDrag() - * @see #endFakeDrag() - */ - public void fakeDragBy(float offset) { - if (!mFakeDragging) { - throw new IllegalStateException("No fake drag in progress. Call beginFakeDrag first."); - } - - if (mOrientation == Orientation.VERTICAL) { - mLastMotionY += offset; - - float oldScrollY = getScrollY(); - float scrollY = oldScrollY - offset; - final int height = getClientSize(); - - float topBound = height * mFirstOffset; - float bottomBound = height * mLastOffset; - - final ItemInfo firstItem = mItems.get(0); - final ItemInfo lastItem = mItems.get(mItems.size() - 1); - if (firstItem.position != 0) { - topBound = firstItem.offset * height; - } - if (lastItem.position != mAdapter.getCount() - 1) { - bottomBound = lastItem.offset * height; - } - - if (scrollY < topBound) { - scrollY = topBound; - } else if (scrollY > bottomBound) { - scrollY = bottomBound; - } - // Don't lose the rounded component - mLastMotionY += scrollY - (int) scrollY; - scrollTo(getScrollX(), (int) scrollY); - pageScrolled((int) scrollY); - - // Synthesize an event for the VelocityTracker. - final long time = SystemClock.uptimeMillis(); - final MotionEvent ev = MotionEvent.obtain(mFakeDragBeginTime, time, MotionEvent.ACTION_MOVE, - 0, mLastMotionY, 0); - mVelocityTracker.addMovement(ev); - ev.recycle(); - } else { - mLastMotionX += offset; - - float oldScrollX = getScrollX(); - float scrollX = oldScrollX - offset; - final int width = getClientSize(); - - float leftBound = width * mFirstOffset; - float rightBound = width * mLastOffset; - - final ItemInfo firstItem = mItems.get(0); - final ItemInfo lastItem = mItems.get(mItems.size() - 1); - if (firstItem.position != 0) { - leftBound = firstItem.offset * width; - } - if (lastItem.position != mAdapter.getCount() - 1) { - rightBound = lastItem.offset * width; - } - - if (scrollX < leftBound) { - scrollX = leftBound; - } else if (scrollX > rightBound) { - scrollX = rightBound; - } - // Don't lose the rounded component - mLastMotionX += scrollX - (int) scrollX; - scrollTo((int) scrollX, getScrollY()); - pageScrolled((int) scrollX); - - // Synthesize an event for the VelocityTracker. - final long time = SystemClock.uptimeMillis(); - final MotionEvent ev = MotionEvent.obtain(mFakeDragBeginTime, time, MotionEvent.ACTION_MOVE, - mLastMotionX, 0, 0); - mVelocityTracker.addMovement(ev); - ev.recycle(); - } - } - - /** - * Returns true if a fake drag is in progress. - * - * @return true if currently in a fake drag, false otherwise. - * @see #beginFakeDrag() - * @see #fakeDragBy(float) - * @see #endFakeDrag() - */ - public boolean isFakeDragging() { - return mFakeDragging; - } - - private void onSecondaryPointerUp(MotionEvent ev) { - final int pointerIndex = MotionEventCompat.getActionIndex(ev); - final int pointerId = MotionEventCompat.getPointerId(ev, pointerIndex); - if (pointerId == mActivePointerId) { - // This was our active pointer going up. Choose a new - // active pointer and adjust accordingly. - final int newPointerIndex = pointerIndex == 0 ? 1 : 0; - if (mOrientation == Orientation.VERTICAL) { - mLastMotionY = MotionEventCompat.getY(ev, newPointerIndex); - } else { - mLastMotionX = MotionEventCompat.getX(ev, newPointerIndex); - } - mActivePointerId = MotionEventCompat.getPointerId(ev, newPointerIndex); - if (mVelocityTracker != null) { - mVelocityTracker.clear(); - } - } - } - - private void endDrag() { - mIsBeingDragged = false; - mIsUnableToDrag = false; - - if (mVelocityTracker != null) { - mVelocityTracker.recycle(); - mVelocityTracker = null; - } - } - - private void setScrollingCacheEnabled(boolean enabled) { - if (mScrollingCacheEnabled != enabled) { - mScrollingCacheEnabled = enabled; - if (USE_CACHE) { - final int size = getChildCount(); - for (int i = 0; i < size; ++i) { - final View child = getChildAt(i); - if (child.getVisibility() != GONE) { - child.setDrawingCacheEnabled(enabled); - } - } - } - } - } - - public boolean internalCanScrollVertically(int direction) { - if (mAdapter == null) { - return false; - } - - final int size = getClientSize(); - final int scroll = (mOrientation == Orientation.VERTICAL) ? getScrollY() : getScrollX(); - if (direction < 0) { - return (scroll > (int) (size * mFirstOffset)); - } else if (direction > 0) { - return (scroll < (int) (size * mLastOffset)); - } else { - return false; - } - } - - /** - * Tests scrollability within child views of v given a delta of dx. - * - * @param v View to test for horizontal scrollability - * @param checkV Whether the view v passed should itself be checked for scrollability (true), - * or just its children (false). - * @param delta Delta scrolled in pixels - * @param x X coordinate of the active touch point - * @param y Y coordinate of the active touch point - * @return true if child views of v can be scrolled by delta of dx. - */ - protected boolean canScroll(View v, boolean checkV, int delta, int x, int y) { - if (v instanceof ViewGroup) { - final ViewGroup group = (ViewGroup) v; - final int scrollX = v.getScrollX(); - final int scrollY = v.getScrollY(); - final int count = group.getChildCount(); - // Count backwards - let topmost views consume scroll distance first. - for (int i = count - 1; i >= 0; i--) { - // TODO: Add versioned support here for transformed views. - // This will not work for transformed views in Honeycomb+ - final View child = group.getChildAt(i); - if (mOrientation == Orientation.VERTICAL) { - if (y + scrollY >= child.getTop() && y + scrollY < child.getBottom() && - x + scrollX >= child.getLeft() && x + scrollX < child.getRight() && - canScroll(child, true, delta, x + scrollX - child.getLeft(), - y + scrollY - child.getTop())) { - return true; - } - } else { - if (x + scrollX >= child.getLeft() && x + scrollX < child.getRight() && - y + scrollY >= child.getTop() && y + scrollY < child.getBottom() && - canScroll(child, true, delta, x + scrollX - child.getLeft(), - y + scrollY - child.getTop())) { - return true; - } - } - } - } - - return checkV && ViewCompat.canScrollVertically(v, -delta); - } - - @Override - public boolean dispatchKeyEvent(KeyEvent event) { - // Let the focused view and/or our descendants get the key first - return super.dispatchKeyEvent(event) || executeKeyEvent(event); - } - - /** - * You can call this function yourself to have the scroll view perform - * scrolling from a key event, just as if the event had been dispatched to - * it by the view hierarchy. - * - * @param event The key event to execute. - * @return Return true if the event was handled, else false. - */ - public boolean executeKeyEvent(KeyEvent event) { - boolean handled = false; - if (event.getAction() == KeyEvent.ACTION_DOWN) { - switch (event.getKeyCode()) { - case KeyEvent.KEYCODE_DPAD_LEFT: - handled = arrowScroll(FOCUS_LEFT); - break; - case KeyEvent.KEYCODE_DPAD_RIGHT: - handled = arrowScroll(FOCUS_RIGHT); - break; - case KeyEvent.KEYCODE_TAB: - if (Build.VERSION.SDK_INT >= 11) { - // The focus finder had a bug handling FOCUS_FORWARD and FOCUS_BACKWARD - // before Android 3.0. Ignore the tab key on those devices. - if (event.hasNoModifiers()) { - handled = arrowScroll(FOCUS_FORWARD); - } else if (event.hasModifiers(KeyEvent.META_SHIFT_ON)) { - handled = arrowScroll(FOCUS_BACKWARD); - } - } - break; - } - } - return handled; - } - - public boolean arrowScroll(int direction) { - View currentFocused = findFocus(); - if (currentFocused == this) { - currentFocused = null; - } else if (currentFocused != null) { - boolean isChild = false; - for (ViewParent parent = currentFocused.getParent(); parent instanceof ViewGroup; - parent = parent.getParent()) { - if (parent == this) { - isChild = true; - break; - } - } - if (!isChild) { - // This would cause the focus search down below to fail in fun ways. - final StringBuilder sb = new StringBuilder(); - sb.append(currentFocused.getClass().getSimpleName()); - for (ViewParent parent = currentFocused.getParent(); parent instanceof ViewGroup; - parent = parent.getParent()) { - sb.append(" => ").append(parent.getClass().getSimpleName()); - } - Log.e(TAG, "arrowScroll tried to find focus based on non-child " + - "current focused view " + sb.toString()); - currentFocused = null; - } - } - - boolean handled = false; - - View nextFocused = FocusFinder.getInstance().findNextFocus(this, currentFocused, - direction); - if (nextFocused != null && nextFocused != currentFocused) { - if (direction == View.FOCUS_UP) { - // If there is nothing to the left, or this is causing us to - // jump to the right, then what we really want to do is page left. - if (mOrientation == Orientation.VERTICAL) { - final int nextTop = getChildRectInPagerCoordinates(mTempRect, nextFocused).top; - final int currTop = getChildRectInPagerCoordinates(mTempRect, currentFocused).top; - if (currentFocused != null && nextTop >= currTop) { - handled = pageBack(); - } else { - handled = nextFocused.requestFocus(); - } - } else { - final int nextLeft = getChildRectInPagerCoordinates(mTempRect, nextFocused).left; - final int currLeft = getChildRectInPagerCoordinates(mTempRect, currentFocused).left; - if (currentFocused != null && nextLeft >= currLeft) { - handled = pageBack(); - } else { - handled = nextFocused.requestFocus(); - } - } - } else if (direction == View.FOCUS_DOWN) { - // If there is nothing to the right, or this is causing us to - // jump to the left, then what we really want to do is page right. - if (mOrientation == Orientation.VERTICAL) { - final int nextDown = getChildRectInPagerCoordinates(mTempRect, nextFocused).bottom; - final int currDown = getChildRectInPagerCoordinates(mTempRect, currentFocused).bottom; - if (currentFocused != null && nextDown <= currDown) { - handled = pageForward(); - } else { - handled = nextFocused.requestFocus(); - } - } else { - final int nextLeft = getChildRectInPagerCoordinates(mTempRect, nextFocused).left; - final int currLeft = getChildRectInPagerCoordinates(mTempRect, currentFocused).left; - if (currentFocused != null && nextLeft <= currLeft) { - handled = pageForward(); - } else { - handled = nextFocused.requestFocus(); - } - } - } - } else if (direction == FOCUS_UP || direction == FOCUS_BACKWARD) { - // Trying to move left and nothing there; try to page. - handled = pageBack(); - } else if (direction == FOCUS_DOWN || direction == FOCUS_FORWARD) { - // Trying to move right and nothing there; try to page. - handled = pageForward(); - } - if (handled) { - playSoundEffect(SoundEffectConstants.getContantForFocusDirection(direction)); - } - return handled; - } - - private Rect getChildRectInPagerCoordinates(Rect outRect, View child) { - if (outRect == null) { - outRect = new Rect(); - } - if (child == null) { - outRect.set(0, 0, 0, 0); - return outRect; - } - outRect.left = child.getLeft(); - outRect.right = child.getRight(); - outRect.top = child.getTop(); - outRect.bottom = child.getBottom(); - - ViewParent parent = child.getParent(); - while (parent instanceof ViewGroup && parent != this) { - final ViewGroup group = (ViewGroup) parent; - outRect.left += group.getLeft(); - outRect.right += group.getRight(); - outRect.top += group.getTop(); - outRect.bottom += group.getBottom(); - - parent = group.getParent(); - } - return outRect; - } - - boolean pageBack() { - if (mCurItem > 0) { - setCurrentItem(mCurItem - 1, true); - return true; - } - return false; - } - - boolean pageForward() { - if (mAdapter != null && mCurItem < (mAdapter.getCount() - 1)) { - setCurrentItem(mCurItem + 1, true); - return true; - } - return false; - } - - /** - * We only want the current page that is being shown to be focusable. - */ - @Override - public void addFocusables(ArrayList views, int direction, int focusableMode) { - final int focusableCount = views.size(); - - final int descendantFocusability = getDescendantFocusability(); - - if (descendantFocusability != FOCUS_BLOCK_DESCENDANTS) { - for (int i = 0; i < getChildCount(); i++) { - final View child = getChildAt(i); - if (child.getVisibility() == VISIBLE) { - ItemInfo ii = infoForChild(child); - if (ii != null && ii.position == mCurItem) { - child.addFocusables(views, direction, focusableMode); - } - } - } - } - - // we add ourselves (if focusable) in all cases except for when we are - // FOCUS_AFTER_DESCENDANTS and there are some descendants focusable. this is - // to avoid the focus search finding layouts when a more precise search - // among the focusable children would be more interesting. - if ( - descendantFocusability != FOCUS_AFTER_DESCENDANTS || - // No focusable descendants - (focusableCount == views.size())) { - // Note that we can't call the superclass here, because it will - // add all views in. So we need to do the same thing View does. - if (!isFocusable()) { - return; - } - if ((focusableMode & FOCUSABLES_TOUCH_MODE) == FOCUSABLES_TOUCH_MODE && - isInTouchMode() && !isFocusableInTouchMode()) { - return; - } - if (views != null) { - views.add(this); - } - } - } - - /** - * We only want the current page that is being shown to be touchable. - */ - @Override - public void addTouchables(ArrayList views) { - // Note that we don't call super.addTouchables(), which means that - // we don't call View.addTouchables(). This is okay because a ViewPager - // is itself not touchable. - for (int i = 0; i < getChildCount(); i++) { - final View child = getChildAt(i); - if (child.getVisibility() == VISIBLE) { - ItemInfo ii = infoForChild(child); - if (ii != null && ii.position == mCurItem) { - child.addTouchables(views); - } - } - } - } - - /** - * We only want the current page that is being shown to be focusable. - */ - @Override - protected boolean onRequestFocusInDescendants(int direction, - Rect previouslyFocusedRect) { - int index; - int increment; - int end; - int count = getChildCount(); - if ((direction & FOCUS_FORWARD) != 0) { - index = 0; - increment = 1; - end = count; - } else { - index = count - 1; - increment = -1; - end = -1; - } - for (int i = index; i != end; i += increment) { - View child = getChildAt(i); - if (child.getVisibility() == VISIBLE) { - ItemInfo ii = infoForChild(child); - if (ii != null && ii.position == mCurItem) { - if (child.requestFocus(direction, previouslyFocusedRect)) { - return true; - } - } - } - } - return false; - } - - @Override - public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { - // Dispatch scroll events from this ViewPager. - if (event.getEventType() == AccessibilityEventCompat.TYPE_VIEW_SCROLLED) { - return super.dispatchPopulateAccessibilityEvent(event); - } - - // Dispatch all other accessibility events from the current page. - final int childCount = getChildCount(); - for (int i = 0; i < childCount; i++) { - final View child = getChildAt(i); - if (child.getVisibility() == VISIBLE) { - final ItemInfo ii = infoForChild(child); - if (ii != null && ii.position == mCurItem && - child.dispatchPopulateAccessibilityEvent(event)) { - return true; - } - } - } - - return false; - } - - @Override - protected ViewGroup.LayoutParams generateDefaultLayoutParams() { - return new LayoutParams(); - } - - @Override - protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) { - return generateDefaultLayoutParams(); - } - - @Override - protected boolean checkLayoutParams(ViewGroup.LayoutParams p) { - return p instanceof LayoutParams && super.checkLayoutParams(p); - } - - @Override - public ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs) { - return new LayoutParams(getContext(), attrs); - } - - class MyAccessibilityDelegate extends AccessibilityDelegateCompat { - - @Override - public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) { - super.onInitializeAccessibilityEvent(host, event); - event.setClassName(ViewPager.class.getName()); - final AccessibilityRecordCompat recordCompat = AccessibilityRecordCompat.obtain(); - recordCompat.setScrollable(canScroll()); - if (event.getEventType() == AccessibilityEventCompat.TYPE_VIEW_SCROLLED - && mAdapter != null) { - recordCompat.setItemCount(mAdapter.getCount()); - recordCompat.setFromIndex(mCurItem); - recordCompat.setToIndex(mCurItem); - } - } - - @Override - public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) { - super.onInitializeAccessibilityNodeInfo(host, info); - info.setClassName(ViewPager.class.getName()); - info.setScrollable(canScroll()); - if (mOrientation == Orientation.VERTICAL) { - if (internalCanScrollVertically(1)) { - info.addAction(AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD); - } - if (internalCanScrollVertically(-1)) { - info.addAction(AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD); - } - } else { - if (canScrollHorizontally(1)) { - info.addAction(AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD); - } - if (canScrollHorizontally(-1)) { - info.addAction(AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD); - } - } - } - - @Override - public boolean performAccessibilityAction(View host, int action, Bundle args) { - if (super.performAccessibilityAction(host, action, args)) { - return true; - } - switch (action) { - case AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD: { - if ((mOrientation == Orientation.VERTICAL && internalCanScrollVertically(1)) - || (mOrientation == Orientation.HORIZONTAL && canScrollHorizontally(1))) { - setCurrentItem(mCurItem + 1); - return true; - } - } - return false; - case AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD: { - if ((mOrientation == Orientation.VERTICAL && internalCanScrollVertically(-1)) - || (mOrientation == Orientation.HORIZONTAL && canScrollHorizontally(-1))) { - setCurrentItem(mCurItem - 1); - return true; - } - } - return false; - } - return false; - } - - private boolean canScroll() { - return (mAdapter != null) && (mAdapter.getCount() > 1); - } - } - - private class PagerObserver extends DataSetObserver { - @Override - public void onChanged() { - dataSetChanged(); - } - - @Override - public void onInvalidated() { - dataSetChanged(); - } - } - - /** - * Layout parameters that should be supplied for views added to a - * ViewPager. - */ - public static class LayoutParams extends ViewGroup.LayoutParams { - /** - * true if this view is a decoration on the pager itself and not - * a view supplied by the adapter. - */ - public boolean isDecor; - - /** - * Gravity setting for use on decor views only: - * Where to position the view page within the overall ViewPager - * container; constants are defined in {@link android.view.Gravity}. - */ - public int gravity; - - /** - * Width as a 0-1 multiplier of the measured pager height - */ - float heightFactor = 0.f; - - /** - * Width as a 0-1 multiplier of the measured pager width - */ - float widthFactor = 0.f; - - /** - * true if this view was added during layout and needs to be measured - * before being positioned. - */ - boolean needsMeasure; - - /** - * Adapter position this view is for if !isDecor - */ - int position; - - /** - * Current child index within the ViewPager that this view occupies - */ - int childIndex; - - public LayoutParams() { - super(FILL_PARENT, FILL_PARENT); - } - - public LayoutParams(Context context, AttributeSet attrs) { - super(context, attrs); - - final TypedArray a = context.obtainStyledAttributes(attrs, LAYOUT_ATTRS); - gravity = a.getInteger(0, Gravity.TOP); - a.recycle(); - } - } - - static class ViewPositionComparator implements Comparator { - @Override - public int compare(View lhs, View rhs) { - final LayoutParams llp = (LayoutParams) lhs.getLayoutParams(); - final LayoutParams rlp = (LayoutParams) rhs.getLayoutParams(); - if (llp.isDecor != rlp.isDecor) { - return llp.isDecor ? 1 : -1; - } - return llp.position - rlp.position; - } - } - - // Following classes and the interface are needed for the Maven Central upload script to work properly. - // They are being introduced here, sort of temporarily (until I find a better solution for this issue). - - /** - * Callbacks a {@link Parcelable} creator should implement. - */ - public interface ParcelableCompatCreatorCallbacks { - - /** - * Create a new instance of the Parcelable class, instantiating it - * from the given Parcel whose data had previously been written by - * {@link Parcelable#writeToParcel Parcelable.writeToParcel()} and - * using the given ClassLoader. - * - * @param in The Parcel to read the object's data from. - * @param loader The ClassLoader that this object is being created in. - * @return Returns a new instance of the Parcelable class. - */ - public T createFromParcel(Parcel in, ClassLoader loader); - - /** - * Create a new array of the Parcelable class. - * - * @param size Size of the array. - * @return Returns an array of the Parcelable class, with every entry - * initialized to null. - */ - public T[] newArray(int size); - } - - /** - * Helper for accessing features in {@link android.os.Parcelable} - * introduced after API level 4 in a backwards compatible fashion. - */ - public static class ParcelableCompat { - - /** - * Factory method for {@link Parcelable.Creator}. - * - * @param callbacks Creator callbacks implementation. - * @return New creator. - */ - public static Parcelable.Creator newCreator( - OrientedViewPager.ParcelableCompatCreatorCallbacks callbacks) { - if (android.os.Build.VERSION.SDK_INT >= 13) { - return ParcelableCompatCreatorHoneycombMR2Stub.instantiate(callbacks); - } - return new CompatCreator(callbacks); - } - - public static class CompatCreator implements Parcelable.Creator { - final OrientedViewPager.ParcelableCompatCreatorCallbacks mCallbacks; - - public CompatCreator(OrientedViewPager.ParcelableCompatCreatorCallbacks callbacks) { - mCallbacks = callbacks; - } - - @Override - public T createFromParcel(Parcel source) { - return mCallbacks.createFromParcel(source, null); - } - - @Override - public T[] newArray(int size) { - return mCallbacks.newArray(size); - } - } - } - - static class ParcelableCompatCreatorHoneycombMR2Stub { - public static Parcelable.Creator instantiate( - OrientedViewPager.ParcelableCompatCreatorCallbacks callbacks) { - return new ParcelableCompatCreatorHoneycombMR2(callbacks); - } - } - - static class ParcelableCompatCreatorHoneycombMR2 implements Parcelable.ClassLoaderCreator { - private final OrientedViewPager.ParcelableCompatCreatorCallbacks mCallbacks; - - public ParcelableCompatCreatorHoneycombMR2( - OrientedViewPager.ParcelableCompatCreatorCallbacks callbacks) { - mCallbacks = callbacks; - } - - public T createFromParcel(Parcel in) { - return mCallbacks.createFromParcel(in, null); - } - - public T createFromParcel(Parcel in, ClassLoader loader) { - return mCallbacks.createFromParcel(in, loader); - } - - public T[] newArray(int size) { - return mCallbacks.newArray(size); - } - } -} \ No newline at end of file diff --git a/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/VerticalBaseTransformer.java b/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/VerticalBaseTransformer.java deleted file mode 100644 index 329d66a2b4..0000000000 --- a/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/VerticalBaseTransformer.java +++ /dev/null @@ -1,112 +0,0 @@ - -package com.mogo.module.main.cards; - -import android.view.View; - -import androidx.viewpager.widget.ViewPager; - - -/** - * Created by Nate on 2016/7/22. - */ -public abstract class VerticalBaseTransformer implements ViewPager.PageTransformer { - /** - * Called each {@link #transformPage(View, float)}. - * - * @param page Apply the transformation to this page - * @param position Position of page relative to the current front-and-center position of the pager. 0 is front and - * center. 1 is one full page position to the right, and -1 is one page position to the left. - */ - protected abstract void onTransform(View page, float position); - - /** - * Apply a property transformation to the given page. For most use cases, this method should not be overridden. - * Instead use {@link #transformPage(View, float)} to perform typical transformations. - * - * @param page Apply the transformation to this page - * @param position Position of page relative to the current front-and-center position of the pager. 0 is front and - * center. 1 is one full page position to the right, and -1 is one page position to the left. - */ - @Override - public void transformPage(View page, float position) { - onPreTransform(page, position); - onTransform(page, position); - onPostTransform(page, position); - } - - /** - * If the position offset of a fragment is less than negative one or greater than one, returning true will set the - * fragment alpha to 0f. Otherwise fragment alpha is always defaulted to 1f. - * - * @return - */ - protected boolean hideOffscreenPages() { - return true; - } - - /** - * Indicates if the default animations of the view pager should be used. - * - * @return - */ - protected boolean isPagingEnabled() { - return false; - } - - /** - * Called each {@link #transformPage(View, float)} before {{@link #onTransform(View, float)}. - *

- * The default implementation attempts to reset all view properties. This is useful when toggling transforms that do - * not modify the same page properties. For instance changing from a transformation that applies rotation to a - * transformation that fades can inadvertently leave a fragment stuck with a rotation or with some degree of applied - * alpha. - * - * @param page Apply the transformation to this page - * @param position Position of page relative to the current front-and-center position of the pager. 0 is front and - * center. 1 is one full page position to the right, and -1 is one page position to the left. - */ - protected void onPreTransform(View page, float position) { - final float width = page.getWidth(); - final float height = page.getHeight(); - - page.setRotationX(0); - page.setRotationY(0); - page.setRotation(0); - page.setScaleX(1); - page.setScaleY(1); - page.setPivotX(0); - page.setPivotY(0); - page.setTranslationX(0); - page.setTranslationY(isPagingEnabled() ? 0f : -height * position); - - if (hideOffscreenPages()) { - page.setAlpha(position <= -1f || position >= 1f ? 0f : 1f); - } else { - page.setAlpha(1f); - } - - /*final float normalizedposition = Math.abs(Math.abs(position) - 1); - page.setAlpha(normalizedposition);*/ - } - - /** - * Called each {@link #transformPage(View, float)} after {@link #onTransform(View, float)}. - * - * @param page Apply the transformation to this page - * @param position Position of page relative to the current front-and-center position of the pager. 0 is front and - * center. 1 is one full page position to the right, and -1 is one page position to the left. - */ - protected void onPostTransform(View page, float position) { - } - - /** - * Same as {@link Math#min(double, double)} without double casting, zero closest to infinity handling, or NaN support. - * - * @param val - * @param min - * @return - */ - protected static final float min(float val, float min) { - return val < min ? min : val; - } -} \ No newline at end of file diff --git a/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/VerticalStackTransformer.java b/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/VerticalStackTransformer.java deleted file mode 100644 index f7433ad2dc..0000000000 --- a/modules/mogo-module-main/src/main/java/com/mogo/module/main/cards/VerticalStackTransformer.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.mogo.module.main.cards; - -import android.content.Context; -import android.util.Log; -import android.view.View; - -import com.mogo.module.main.R; -import com.mogo.utils.WindowUtils; -import com.mogo.utils.logger.Logger; - -public class VerticalStackTransformer extends VerticalBaseTransformer { - - private Context context; - private int spaceBetweenFirAndSecWith;//第一张卡片和第二张卡片宽度差 - private int spaceBetweenFirAndSecHeight;//第一张卡片和第二张卡片高度差 - private float offsetScroll = 0.0f;//ViewPager滑动时变化幅度 - - public VerticalStackTransformer( Context context ) { - this.context = context; - spaceBetweenFirAndSecHeight = 0; - spaceBetweenFirAndSecWith = context.getResources().getDimensionPixelSize( R.dimen.module_main_card_card_shadow_width_div ); - } - - public VerticalStackTransformer( Context context, int spaceBetweenFirAndSecWith, int spaceBetweenFirAndSecHeight ) { - this.context = context; - this.spaceBetweenFirAndSecWith = spaceBetweenFirAndSecWith; - this.spaceBetweenFirAndSecHeight = spaceBetweenFirAndSecHeight; - } - - public void offsetScrollChanged(float offset){ - if(offset ==0){ - return; - } - offsetScroll = offset; - } - - public void resetOffsetScroll(){ - offsetScroll = 0.0f; - } - - @Override - protected void onTransform( View page, float position ) { - if ( position == 0.0f ) { - page.setAlpha( 1.0f ); - page.setTranslationY( 0f ); - //控制停止滑动切换的时候,只有最上面的一张卡片可以点击 - page.setClickable( true ); - } else if(position>0){ - float scale = ( float ) ( page.getWidth() - spaceBetweenFirAndSecWith * position ) / ( float ) ( page.getWidth() ); - Logger.d("VerticalStackTransformer","scale :" + scale); - //控制下面卡片的可见度 - page.setAlpha( 1.0f ); - //控制停止滑动切换的时候,只有最上面的一张卡片可以点击 - page.setClickable( false ); - page.setPivotX( page.getWidth() / 2f ); - page.setPivotY( page.getHeight() / 2f ); - page.setScaleX( scale ); - page.setScaleY( scale ); - page.setTranslationY( -page.getHeight() * position + ( page.getHeight() * 0.5f ) * ( 1 - scale ) + spaceBetweenFirAndSecHeight * position ); - }else{ - float currentPage; - if(offsetScroll > 0.2f){ - currentPage = 0.2f; - }else{ - currentPage = offsetScroll; - } - page.setAlpha( 1 ); - page.setScaleX(1-currentPage); - page.setScaleY(1-currentPage); - page.setPivotX( page.getWidth() / 2f ); - page.setPivotY( page.getHeight() / 2f ); - page.setTranslationY( 0f ); - page.setClickable( false ); - } - } -} \ No newline at end of file diff --git a/modules/mogo-module-main/src/main/java/com/mogo/module/main/constants/VoiceConstants.java b/modules/mogo-module-main/src/main/java/com/mogo/module/main/constants/VoiceConstants.java deleted file mode 100644 index d14b06381d..0000000000 --- a/modules/mogo-module-main/src/main/java/com/mogo/module/main/constants/VoiceConstants.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.mogo.module.main.constants; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author zyz - * 2020-03-02. - */ -public class VoiceConstants { - /** - * 切换上一张卡片 - */ - public static final String COMMAND_ZHIDAO_SWITCHCARD_PREVIOUS = "com.zhidao.desk.switchCard.previous"; - /** - * 切换下一张卡片 - */ - public static final String COMMAND_ZHIDAO_SWITCHCARD_NEXT = "com.zhidao.desk.switchCard.next"; - /** - * 查看多媒体卡片、探路卡片 - */ - public static final String COMMAND_ZHIDAO_SWITCHCARD = "com.zhidao.desk.switchCard"; - - - - public static ArrayList sCmds=new ArrayList<>(); - - static { - sCmds.add(COMMAND_ZHIDAO_SWITCHCARD_PREVIOUS); - sCmds.add(COMMAND_ZHIDAO_SWITCHCARD_NEXT); - sCmds.add(COMMAND_ZHIDAO_SWITCHCARD); - } -} diff --git a/modules/mogo-module-main/src/main/java/com/mogo/module/main/livedata/CardInfo.java b/modules/mogo-module-main/src/main/java/com/mogo/module/main/livedata/CardInfo.java deleted file mode 100644 index 08cee036af..0000000000 --- a/modules/mogo-module-main/src/main/java/com/mogo/module/main/livedata/CardInfo.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.mogo.module.main.livedata; - -import android.os.Parcel; -import android.os.Parcelable; - -/** - * @author congtaowang - * @since 2020-03-09 - *

- * 描述 - */ -public class CardInfo implements Parcelable { - - public String mCardName; - public boolean mLockCar; - - public CardInfo( String cardName, boolean lockCar ) { - this.mCardName = cardName; - this.mLockCar = lockCar; - } - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel( Parcel dest, int flags ) { - dest.writeString( this.mCardName ); - dest.writeByte( this.mLockCar ? ( byte ) 1 : ( byte ) 0 ); - } - - protected CardInfo( Parcel in ) { - this.mCardName = in.readString(); - this.mLockCar = in.readByte() != 0; - } - - public static final Parcelable.Creator< CardInfo > CREATOR = new Parcelable.Creator< CardInfo >() { - @Override - public CardInfo createFromParcel( Parcel source ) { - return new CardInfo( source ); - } - - @Override - public CardInfo[] newArray( int size ) { - return new CardInfo[size]; - } - }; -} diff --git a/modules/mogo-module-main/src/main/java/com/mogo/module/main/livedata/CardSwitchLiveData.java b/modules/mogo-module-main/src/main/java/com/mogo/module/main/livedata/CardSwitchLiveData.java deleted file mode 100644 index 0f078ce718..0000000000 --- a/modules/mogo-module-main/src/main/java/com/mogo/module/main/livedata/CardSwitchLiveData.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.mogo.module.main.livedata; - -import androidx.lifecycle.MutableLiveData; - -/** - * @author congtaowang - * @since 2020-01-06 - *

- * 切换卡片 - */ -public class CardSwitchLiveData extends MutableLiveData< CardInfo > { - - private CardSwitchLiveData() { - // private constructor - } - - private static final class InstanceHolder { - private static final CardSwitchLiveData INSTANCE = new CardSwitchLiveData(); - } - - public static CardSwitchLiveData getInstance() { - return InstanceHolder.INSTANCE; - } -} diff --git a/modules/mogo-module-main/src/main/java/com/mogo/module/main/windowview/TopViewHolder.java b/modules/mogo-module-main/src/main/java/com/mogo/module/main/windowview/TopViewHolder.java deleted file mode 100644 index 12bc772e07..0000000000 --- a/modules/mogo-module-main/src/main/java/com/mogo/module/main/windowview/TopViewHolder.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.mogo.module.main.windowview; - -import android.view.View; - -/** - * 用来处理主屏上方1/2屏的view - */ -public class TopViewHolder { - public void init(){ - - } - public void addView(View view) { - - } -} diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/MarkerServiceHandler.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/MarkerServiceHandler.java index 0e34398d47..199c972202 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/MarkerServiceHandler.java +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/MarkerServiceHandler.java @@ -17,7 +17,6 @@ import com.mogo.module.service.marker.MapMarkerManager; import com.mogo.service.IMogoServiceApis; import com.mogo.service.adas.IMogoADASController; import com.mogo.service.analytics.IMogoAnalytics; -import com.mogo.service.cardmanager.IMogoCardManager; import com.mogo.service.connection.IMogoSocketManager; import com.mogo.service.datamanager.IMogoDataManager; import com.mogo.service.fragmentmanager.IMogoFragmentManager; @@ -51,7 +50,6 @@ public class MarkerServiceHandler { private static IMogoStatusManager sMogoStatusManager; private static IMogoImageloader sImageloader; private static IMogoSocketManager sMogoSocketManager; - private static IMogoCardManager sMogoCardManager; private static IMogoAnalytics sMogoAnalytics; private static IMogoRegisterCenter sRegisterCenter; private static IMogoActionManager sActionManager; @@ -74,7 +72,6 @@ public class MarkerServiceHandler { sImageloader = sApis.getImageLoaderApi(); sMogoStatusManager = sApis.getStatusManagerApi(); sMogoSocketManager = sApis.getSocketManagerApi( context ); - sMogoCardManager = sApis.getCardManagerApi(); sMogoAnalytics = sApis.getAnalyticsApi(); sMarkerManager = sMapService.getMarkerManager( context ); sNavi = sMapService.getNavi( context ); @@ -127,10 +124,6 @@ public class MarkerServiceHandler { return sMogoStatusManager; } - public static IMogoCardManager getMogoCardManager() { - return sMogoCardManager; - } - public static IMogoAnalytics getMogoAnalytics() { return sMogoAnalytics; } diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServices.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServices.java index e2bdb45f37..03bdbd7dbd 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServices.java +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServices.java @@ -131,8 +131,6 @@ public class MogoServices implements IMogoMapListener, private IMogoMapUIController mUiController; - private IMogoCardManager mCardManager; - /** * 是否已计算出地图显示状态 */ @@ -416,7 +414,6 @@ public class MogoServices implements IMogoMapListener, mADASController = MarkerServiceHandler.getADASController(); mLauncher = MarkerServiceHandler.getLauncher(); mFragmentManager = MarkerServiceHandler.getFragmentManager(); - mCardManager = MarkerServiceHandler.getMogoCardManager(); mFragmentManager.addMainFragmentStackTransactionListener( this ); diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/intent/IntentHandlerFactory.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/intent/IntentHandlerFactory.java index 8139853b6e..2b440d9efe 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/intent/IntentHandlerFactory.java +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/intent/IntentHandlerFactory.java @@ -22,7 +22,6 @@ public class IntentHandlerFactory { private IntentHandlerFactory() { // private constructor mHandlers.put( MogoReceiver.ACTION_MOCK, new MockIntentHandler() ); - mHandlers.put( ServiceConst.COMMAND_SWITCH_CARD, new SwitchCardIntentHandler() ); mHandlers.put( ServiceConst.COMMAND_OPERATION, new AppOperationIntentHandler() ); mHandlers.put( ServiceConst.COMMAND_MY_LOCATION, new MyLocationHandler() ); mHandlers.put( ServiceConst.COMMAND_ZHIDAO_NEARBY_CAR_ONLINE, OnlineCarSearchIntentHandler.getInstance() ); diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/intent/SwitchCardIntentHandler.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/intent/SwitchCardIntentHandler.java deleted file mode 100644 index 1c3e56567a..0000000000 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/intent/SwitchCardIntentHandler.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.mogo.module.service.intent; - -import android.content.Context; -import android.content.Intent; -import android.text.TextUtils; - -import com.mogo.module.service.MarkerServiceHandler; -import com.mogo.module.service.ServiceConst; -import com.mogo.utils.AppUtils; -import com.mogo.utils.UiThreadHandler; - -import org.json.JSONException; -import org.json.JSONObject; - -/** - * @author congtaowang - * @since 2020-04-17 - *

- * 描述 - */ -public class SwitchCardIntentHandler implements IntentHandler { - - @Override - public void handle( Context context, Intent intent ) { - String data = intent.getStringExtra( "data" ); - try { - JSONObject jsonObject = new JSONObject( data ); - String card = jsonObject.getString( "card" ); - if ( TextUtils.equals( "多媒体卡片", card ) - || TextUtils.equals( "媒体中心卡片", card ) - || TextUtils.equals( "音乐卡片", card ) ) { - switchCard2( context, ServiceConst.CARD_TYPE_SHARE_MUSIC ); - } else if ( TextUtils.equals( "探路卡片", card ) ) { - switchCard2( context, ServiceConst.CARD_TYPE_ROAD_CONDITION ); - } else if ( TextUtils.equals( "在线车辆卡片", card ) ) { - switchCard2( context, ServiceConst.CARD_TYPE_USER_DATA ); - } else if ( TextUtils.equals( "新鲜事卡片", card ) ) { - switchCard2( context, ServiceConst.CARD_TYPE_NOVELTY ); - } - } catch ( JSONException e ) { - e.printStackTrace(); - } - } - - /** - * 切换卡片 - */ - public static void switchCard2( Context context, String card ) { - if ( AppUtils.isApplicationBroughtToBackground( context ) ) { - MarkerServiceHandler.getLauncher().backToLauncher( context ); - UiThreadHandler.postDelayed( () -> { - if ( MarkerServiceHandler.getMogoStatusManager().isADASShow() ) { - MarkerServiceHandler.getADASController().closeADAS(); - } - MarkerServiceHandler.getMogoCardManager().switch2( card, true ); - }, 2000L ); - } else { - MarkerServiceHandler.getFragmentManager().clearAll(); - if ( MarkerServiceHandler.getMogoStatusManager().isADASShow() ) { - MarkerServiceHandler.getADASController().closeADAS(); - } - MarkerServiceHandler.getMogoCardManager().switch2( card, true ); - } - } -} diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/IMogoServiceApis.java b/services/mogo-service-api/src/main/java/com/mogo/service/IMogoServiceApis.java index e119875657..9e8a1dc1d6 100644 --- a/services/mogo-service-api/src/main/java/com/mogo/service/IMogoServiceApis.java +++ b/services/mogo-service-api/src/main/java/com/mogo/service/IMogoServiceApis.java @@ -59,6 +59,7 @@ public interface IMogoServiceApis extends IProvider { * * @return */ + @Deprecated IMogoCardManager getCardManagerApi(); /** diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/cardmanager/IMogoCardManager.java b/services/mogo-service-api/src/main/java/com/mogo/service/cardmanager/IMogoCardManager.java index a2eab1d620..74ccb18ef6 100644 --- a/services/mogo-service-api/src/main/java/com/mogo/service/cardmanager/IMogoCardManager.java +++ b/services/mogo-service-api/src/main/java/com/mogo/service/cardmanager/IMogoCardManager.java @@ -8,6 +8,7 @@ import com.alibaba.android.arouter.facade.template.IProvider; *

* 卡片管理 */ +@Deprecated public interface IMogoCardManager extends IProvider { /** diff --git a/services/mogo-service/src/main/java/com/mogo/service/impl/MogoServiceApis.java b/services/mogo-service/src/main/java/com/mogo/service/impl/MogoServiceApis.java index f000760d41..a6cc6dd46d 100644 --- a/services/mogo-service/src/main/java/com/mogo/service/impl/MogoServiceApis.java +++ b/services/mogo-service/src/main/java/com/mogo/service/impl/MogoServiceApis.java @@ -113,6 +113,7 @@ public class MogoServiceApis implements IMogoServiceApis { } @Override + @Deprecated public synchronized IMogoCardManager getCardManagerApi() { return getApiInstance( IMogoCardManager.class, MogoServicePaths.PATH_CARD_MANAGER ); }