diff --git a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapNaviViewWrapper.java b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapNaviViewWrapper.java index 13f075f63f..5c62d54fd3 100644 --- a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapNaviViewWrapper.java +++ b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapNaviViewWrapper.java @@ -492,7 +492,7 @@ public class AMapNaviViewWrapper implements IMogoMapView, } @Override - public void moveToCenter( MogoLatLng latLng ) { + public void moveToCenter( MogoLatLng latLng, boolean animate ) { Logger.d( TAG, "move to center %s", latLng ); if ( latLng == null || latLng.lat == 0.0d || latLng.lng == 0.0d ) { Logger.e( TAG, "latlng = null or is illegal" ); @@ -502,7 +502,11 @@ public class AMapNaviViewWrapper implements IMogoMapView, Logger.d( TAG, Log.getStackTraceString( new Throwable() ) ); } loseLockMode(); - mMapView.getMap().moveCamera( CameraUpdateFactory.newLatLng( new LatLng( latLng.lat, latLng.lng ) ) ); + if ( animate ) { + mMapView.getMap().animateCamera( CameraUpdateFactory.newLatLng( new LatLng( latLng.lat, latLng.lng ) ) ); + } else { + mMapView.getMap().moveCamera( CameraUpdateFactory.newLatLng( new LatLng( latLng.lat, latLng.lng ) ) ); + } } @Override diff --git a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/uicontroller/AMapUIController.java b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/uicontroller/AMapUIController.java index 175a4e2529..2e874886ae 100644 --- a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/uicontroller/AMapUIController.java +++ b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/uicontroller/AMapUIController.java @@ -85,9 +85,9 @@ public class AMapUIController implements IMogoMapUIController { } @Override - public void moveToCenter(MogoLatLng latLng) { + public void moveToCenter(MogoLatLng latLng, boolean animate) { if (mClient != null) { - mClient.moveToCenter(latLng); + mClient.moveToCenter(latLng, animate); } } diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.java b/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.java index 73c3f244b1..419f4cc00a 100644 --- a/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.java +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.java @@ -50,7 +50,14 @@ public interface IMogoMapUIController { /** * 将地图移动至当前位置 */ - void moveToCenter( MogoLatLng latLng ); + default void moveToCenter( MogoLatLng latLng ){ + moveToCenter(latLng, false); + } + + /** + * 将地图移动至当前位置 + */ + void moveToCenter( MogoLatLng latLng, boolean animate ); /** * 显示我的位置 diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/MogoMapUIController.java b/libraries/mogo-map/src/main/java/com/mogo/map/MogoMapUIController.java index 89cdb35eb8..f4642f2440 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/MogoMapUIController.java +++ b/libraries/mogo-map/src/main/java/com/mogo/map/MogoMapUIController.java @@ -79,9 +79,9 @@ public class MogoMapUIController implements IMogoMapUIController { @Override - public void moveToCenter(MogoLatLng latLng) { + public void moveToCenter(MogoLatLng latLng, boolean animate) { if (mDelegate != null) { - mDelegate.moveToCenter(latLng); + mDelegate.moveToCenter(latLng, animate); } } diff --git a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/applaunch/AppLauncher.java b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/applaunch/AppLauncher.java index fe9e34b244..83ed40c2d8 100644 --- a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/applaunch/AppLauncher.java +++ b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/applaunch/AppLauncher.java @@ -22,7 +22,9 @@ public class AppLauncher extends BaseAppLauncher { @Override public void launch( Context context, AppInfo appInfo ) { try { - AppServiceHandler.getApis().getAdasControllerApi().closeADAS(); + if ( LaunchUtils.getLaunchIntentForPackage( context, appInfo.getPackageName() ) != null ) { + AppServiceHandler.getApis().getAdasControllerApi().closeADAS(); + } LaunchUtils.launchByPkg( context, appInfo.getPackageName() ); } catch ( Exception e ) { Logger.e( TAG, e, "error." ); 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 index fb0906f4c4..117dd06cb8 100644 --- 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 @@ -35,13 +35,8 @@ public class CardAppLauncher extends BaseAppLauncher { @Override public void launch( Context context, AppInfo appInfo ) { - if ( sCardApps.containsKey( appInfo.getPackageName() ) ) { - mCardManager.switch2( sCardApps.get( appInfo.getPackageName() ) ); - mAppsPresenter.exit(); - } else { - if ( getNext() != null ) { - getNext().launch( context, appInfo ); - } + if ( getNext() != null ) { + getNext().launch( context, appInfo ); } } diff --git a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/applaunch/GuideShowLauncher.java b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/applaunch/GuideShowLauncher.java index 88e5068c61..fea3414ea7 100644 --- a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/applaunch/GuideShowLauncher.java +++ b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/applaunch/GuideShowLauncher.java @@ -1,16 +1,9 @@ package com.mogo.module.apps.applaunch; -import android.app.Activity; import android.content.Context; -import com.mogo.commons.voice.AIAssist; import com.mogo.map.navi.IMogoNavi; -import com.mogo.module.apps.AppServiceHandler; -import com.mogo.module.apps.R; import com.mogo.module.apps.model.AppInfo; -import com.mogo.utils.logger.Logger; - -import kotlin.Unit; public class GuideShowLauncher extends BaseAppLauncher { @@ -25,19 +18,7 @@ public class GuideShowLauncher extends BaseAppLauncher { @Override public void launch(Context context, AppInfo appInfo) { - if (appInfo != null && APP_INFO_NAME_GUIDE_SHOW.equals(appInfo.getName())) { - if ( mNavi != null && !mNavi.isNaviing()) { - AppServiceHandler.getMogoGuideShow().playGuideVideo((Activity) context, (s) -> { - Logger.d(TAG, s); - return Unit.INSTANCE; - }); - } else { - AIAssist.getInstance(context).speakTTSVoice(context.getString(R.string.module_apps_str_guide_warning)); - processChain(context,appInfo); - } - } else { - processChain(context, appInfo); - } + processChain(context, appInfo); } private void processChain(Context context, AppInfo appInfo) { diff --git a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/utils/LaunchUtils.java b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/utils/LaunchUtils.java index b328070501..1e704842d2 100644 --- a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/utils/LaunchUtils.java +++ b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/utils/LaunchUtils.java @@ -20,9 +20,13 @@ public class LaunchUtils { * @param context * @param pkg 包名 */ - public static void launchByPkg( Context context, String pkg ) throws Exception{ - Intent intent = context.getPackageManager().getLaunchIntentForPackage( pkg ); + public static void launchByPkg( Context context, String pkg ) throws Exception { + Intent intent = getLaunchIntentForPackage( context, pkg ); intent.addFlags( Intent.FLAG_ACTIVITY_NEW_TASK ); context.startActivity( intent ); } + + public static Intent getLaunchIntentForPackage( Context context, String pkg ) { + return context.getPackageManager().getLaunchIntentForPackage( pkg ); + } } diff --git a/modules/mogo-module-back/src/main/java/com/mogo/module/back/BackToMainHomeManager.java b/modules/mogo-module-back/src/main/java/com/mogo/module/back/BackToMainHomeManager.java index 93a1eec5d3..feba1d3563 100644 --- a/modules/mogo-module-back/src/main/java/com/mogo/module/back/BackToMainHomeManager.java +++ b/modules/mogo-module-back/src/main/java/com/mogo/module/back/BackToMainHomeManager.java @@ -35,7 +35,7 @@ public class BackToMainHomeManager { public static void backToLauncher() { - if ( mFragmentManager != null ) { + if ( !mStatusManager.isSearchUIShow() ) { mFragmentManager.clearAll(); } diff --git a/modules/mogo-module-common/build.gradle b/modules/mogo-module-common/build.gradle index 6b8c0ae9c3..c3f39b9c50 100644 --- a/modules/mogo-module-common/build.gradle +++ b/modules/mogo-module-common/build.gradle @@ -31,7 +31,7 @@ dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation rootProject.ext.dependencies.androidxappcompat implementation rootProject.ext.dependencies.androidxrecyclerview - + implementation rootProject.ext.dependencies.androidxconstraintlayout if (Boolean.valueOf(RELEASE)) { api rootProject.ext.dependencies.mogomap api rootProject.ext.dependencies.mogomapapi diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/dialog/WMDialog.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/dialog/WMDialog.java new file mode 100644 index 0000000000..097330f871 --- /dev/null +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/dialog/WMDialog.java @@ -0,0 +1,198 @@ +package com.mogo.module.common.dialog; + +import android.content.Context; +import android.content.DialogInterface; +import android.graphics.PixelFormat; +import android.os.Build; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.WindowManager; +import android.widget.TextView; + +import androidx.annotation.StringRes; + +import com.mogo.module.common.R; +import com.mogo.module.common.utils.CarSeries; +import com.mogo.utils.WindowUtils; + +/** + * @author congtaowang + * @since 2020-04-24 + *

+ * 显示在最上层的对话框 + */ +public class WMDialog implements DialogInterface { + + private WMDialogParams mParams; + private WindowManager mWindowManager; + private boolean mIsShowing = false; + private View mContentView; + private WindowManager.LayoutParams mLayoutParams; + + private WMDialog( WMDialogParams params ) { + this.mParams = params; + } + + public void show() { + if ( mIsShowing ) { + return; + } + mIsShowing = true; + if ( mWindowManager == null ) { + mWindowManager = ( WindowManager ) mParams.mContext.getApplicationContext().getSystemService( Context.WINDOW_SERVICE ); + } + if ( mContentView == null ) { + mLayoutParams = new WindowManager.LayoutParams(); + if ( Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ) { + mLayoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; + } else { + mLayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; + } + mLayoutParams.format = PixelFormat.TRANSLUCENT; + mLayoutParams.gravity = Gravity.CENTER; + mLayoutParams.flags = WindowManager.LayoutParams.FLAG_DIM_BEHIND | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH; + + if ( CarSeries.getSeries() == CarSeries.CAR_SERIES_F80X ) { + mLayoutParams.width = 1920; + mLayoutParams.height = 1080; + } else { + mLayoutParams.width = WindowUtils.getScreenWidth( mParams.mContext ); + mLayoutParams.height = WindowUtils.getScreenHeight( mParams.mContext ); + } + mLayoutParams.dimAmount = 0.5f; + mLayoutParams.x = 0; + mLayoutParams.y = 0; + mContentView = initViews(); + } + mWindowManager.addView( mContentView, mLayoutParams ); + } + + private View initViews() { + View contentView = LayoutInflater.from( mParams.mContext ).inflate( R.layout.module_commons_layout_wm_dialog, null ); + TextView ok = contentView.findViewById( R.id.module_commons_wm_dialog_button_ok ); + TextView cancel = contentView.findViewById( R.id.module_commons_wm_dialog_button_cancel ); + TextView content = contentView.findViewById( R.id.module_commons_wm_dialog_content ); + + ok.setText( mParams.mOkButtonText ); + if ( mParams.mOnOkButtonClickListener != null ) { + ok.setOnClickListener( view -> { + if ( mParams.mOnOkButtonClickListener != null ) { + mParams.mOnOkButtonClickListener.onClick( WMDialog.this, DialogInterface.BUTTON_POSITIVE ); + } + } ); + } + cancel.setText( mParams.mCancelButtonText ); + if ( mParams.mOnCancelButtonClickListener != null ) { + cancel.setOnClickListener( view -> { + if ( mParams.mOnCancelButtonClickListener != null ) { + mParams.mOnCancelButtonClickListener.onClick( WMDialog.this, DialogInterface.BUTTON_NEGATIVE ); + } + } ); + } + + content.setText( mParams.mContent ); + return contentView; + } + + @Override + public void cancel() { + dismiss(); + } + + @Override + public void dismiss() { + if ( !mIsShowing ) { + return; + } + if ( mContentView != null ) { + mWindowManager.removeViewImmediate( mContentView ); + } + if ( mParams.mOnDialogDismissListener != null ) { + mParams.mOnDialogDismissListener.onDismiss( this ); + } + mIsShowing = false; + } + + public boolean isShowing() { + return mIsShowing; + } + + public static class Builder { + + private Context mContext; + private WMDialogParams mParams; + + public Builder( Context context ) { + this.mContext = context; + mParams = new WMDialogParams(); + mParams.mContext = context; + } + +// public Builder setTitle( CharSequence title ) { +// mParams.mTitle = title; +// return this; +// } +// +// public Builder setTitle( @StringRes int title ) { +// mParams.mTitle = mContext.getString( title ); +// return this; +// } + + public Builder setContent( CharSequence content ) { + mParams.mContent = content; + return this; + } + + public Builder setContent( @StringRes int content ) { + mParams.mContent = mContext.getString( content ); + return this; + } + + public Builder setOkButton( CharSequence buttonText, OnClickListener listener ) { + mParams.mOkButtonText = buttonText; + mParams.mOnOkButtonClickListener = listener; + return this; + } + + public Builder setOkButton( @StringRes int buttonText, OnClickListener listener ) { + mParams.mOkButtonText = mContext.getText( buttonText ); + mParams.mOnOkButtonClickListener = listener; + return this; + } + + public Builder setCancelButton( CharSequence buttonText, OnClickListener listener ) { + mParams.mCancelButtonText = buttonText; + mParams.mOnCancelButtonClickListener = listener; + return this; + } + + public Builder setCancelButton( @StringRes int buttonText, OnClickListener listener ) { + mParams.mCancelButtonText = mContext.getText( buttonText ); + mParams.mOnCancelButtonClickListener = listener; + return this; + } + + public Builder setOnDialogDismissListener( OnDismissListener onDialogDismissListener ) { + mParams.mOnDialogDismissListener = onDialogDismissListener; + return this; + } + + public WMDialog build() { + WMDialog dialog = new WMDialog( mParams ); + return dialog; + } + } + + public static class WMDialogParams { + + // public CharSequence mTitle; + public CharSequence mOkButtonText; + public CharSequence mCancelButtonText; + public CharSequence mContent; + public OnClickListener mOnOkButtonClickListener; + public OnClickListener mOnCancelButtonClickListener; + public OnDismissListener mOnDialogDismissListener; + public Context mContext; + } +} diff --git a/modules/mogo-module-common/src/main/java/com/yarolegovich/discretescrollview/DSVOrientation.java b/modules/mogo-module-common/src/main/java/com/yarolegovich/discretescrollview/DSVOrientation.java deleted file mode 100644 index ce167a9870..0000000000 --- a/modules/mogo-module-common/src/main/java/com/yarolegovich/discretescrollview/DSVOrientation.java +++ /dev/null @@ -1,220 +0,0 @@ -package com.yarolegovich.discretescrollview; - -import android.graphics.Point; -import android.view.View; - -/** - * Created by yarolegovich on 16.03.2017. - */ -public enum DSVOrientation { - - HORIZONTAL { - @Override - Helper createHelper() { - return new HorizontalHelper(); - } - }, - VERTICAL { - @Override - Helper createHelper() { - return new VerticalHelper(); - } - }; - - //Package private - abstract Helper createHelper(); - - interface Helper { - - int getViewEnd(int recyclerWidth, int recyclerHeight); - - int getDistanceToChangeCurrent(int childWidth, int childHeight); - - void setCurrentViewCenter(Point recyclerCenter, int scrolled, Point outPoint); - - void shiftViewCenter(Direction direction, int shiftAmount, Point outCenter); - - int getFlingVelocity(int velocityX, int velocityY); - - int getPendingDx(int pendingScroll); - - int getPendingDy(int pendingScroll); - - void offsetChildren(int amount, RecyclerViewProxy lm); - - float getDistanceFromCenter(Point center, int viewCenterX, int viewCenterY); - - boolean isViewVisible(Point center, int halfWidth, int halfHeight, int endBound, - int extraSpace); - - boolean hasNewBecomeVisible(DiscreteScrollLayoutManager lm); - - boolean canScrollVertically(); - - boolean canScrollHorizontally(); - } - - protected static class HorizontalHelper implements Helper { - - @Override - public int getViewEnd(int recyclerWidth, int recyclerHeight) { - return recyclerWidth; - } - - @Override - public int getDistanceToChangeCurrent(int childWidth, int childHeight) { - return childWidth; - } - - @Override - public void setCurrentViewCenter(Point recyclerCenter, int scrolled, Point outPoint) { - int newX = recyclerCenter.x - scrolled; - outPoint.set(newX, recyclerCenter.y); - } - - @Override - public void shiftViewCenter(Direction direction, int shiftAmount, Point outCenter) { - int newX = outCenter.x + direction.applyTo(shiftAmount); - outCenter.set(newX, outCenter.y); - } - - @Override - public boolean isViewVisible( - Point viewCenter, int halfWidth, int halfHeight, int endBound, - int extraSpace) { - int viewLeft = viewCenter.x - halfWidth; - int viewRight = viewCenter.x + halfWidth; - return viewLeft < (endBound + extraSpace) && viewRight > -extraSpace; - } - - @Override - public boolean hasNewBecomeVisible(DiscreteScrollLayoutManager lm) { - View firstChild = lm.getFirstChild(), lastChild = lm.getLastChild(); - int leftBound = -lm.getExtraLayoutSpace(); - int rightBound = lm.getWidth() + lm.getExtraLayoutSpace(); - boolean isNewVisibleFromLeft = lm.getDecoratedLeft(firstChild) > leftBound - && lm.getPosition(firstChild) > 0; - boolean isNewVisibleFromRight = lm.getDecoratedRight(lastChild) < rightBound - && lm.getPosition(lastChild) < lm.getItemCount() - 1; - return isNewVisibleFromLeft || isNewVisibleFromRight; - } - - @Override - public void offsetChildren(int amount, RecyclerViewProxy helper) { - helper.offsetChildrenHorizontal(amount); - } - - @Override - public float getDistanceFromCenter(Point center, int viewCenterX, int viewCenterY) { - return viewCenterX - center.x; - } - - @Override - public int getFlingVelocity(int velocityX, int velocityY) { - return velocityX; - } - - @Override - public boolean canScrollHorizontally() { - return true; - } - - @Override - public boolean canScrollVertically() { - return false; - } - - @Override - public int getPendingDx(int pendingScroll) { - return pendingScroll; - } - - @Override - public int getPendingDy(int pendingScroll) { - return 0; - } - } - - - protected static class VerticalHelper implements Helper { - - @Override - public int getViewEnd(int recyclerWidth, int recyclerHeight) { - return recyclerHeight; - } - - @Override - public int getDistanceToChangeCurrent(int childWidth, int childHeight) { - return childHeight; - } - - @Override - public void setCurrentViewCenter(Point recyclerCenter, int scrolled, Point outPoint) { - int newY = recyclerCenter.y - scrolled; - outPoint.set(recyclerCenter.x, newY); - } - - @Override - public void shiftViewCenter(Direction direction, int shiftAmount, Point outCenter) { - int newY = outCenter.y + direction.applyTo(shiftAmount); - outCenter.set(outCenter.x, newY); - } - - @Override - public void offsetChildren(int amount, RecyclerViewProxy helper) { - helper.offsetChildrenVertical(amount); - } - - @Override - public float getDistanceFromCenter(Point center, int viewCenterX, int viewCenterY) { - return viewCenterY - center.y; - } - - @Override - public boolean isViewVisible( - Point viewCenter, int halfWidth, int halfHeight, int endBound, - int extraSpace) { - int viewTop = viewCenter.y - halfHeight; - int viewBottom = viewCenter.y + halfHeight; - return viewTop < (endBound + extraSpace) && viewBottom > -extraSpace; - } - - @Override - public boolean hasNewBecomeVisible(DiscreteScrollLayoutManager lm) { - View firstChild = lm.getFirstChild(), lastChild = lm.getLastChild(); - int topBound = -lm.getExtraLayoutSpace(); - int bottomBound = lm.getHeight() + lm.getExtraLayoutSpace(); - boolean isNewVisibleFromTop = lm.getDecoratedTop(firstChild) > topBound - && lm.getPosition(firstChild) > 0; - boolean isNewVisibleFromBottom = lm.getDecoratedBottom(lastChild) < bottomBound - && lm.getPosition(lastChild) < lm.getItemCount() - 1; - return isNewVisibleFromTop || isNewVisibleFromBottom; - } - - @Override - public int getFlingVelocity(int velocityX, int velocityY) { - return velocityY; - } - - @Override - public boolean canScrollHorizontally() { - return false; - } - - @Override - public boolean canScrollVertically() { - return true; - } - - @Override - public int getPendingDx(int pendingScroll) { - return 0; - } - - @Override - public int getPendingDy(int pendingScroll) { - return pendingScroll; - } - } - -} diff --git a/modules/mogo-module-common/src/main/java/com/yarolegovich/discretescrollview/Direction.java b/modules/mogo-module-common/src/main/java/com/yarolegovich/discretescrollview/Direction.java deleted file mode 100644 index e4d1c386ce..0000000000 --- a/modules/mogo-module-common/src/main/java/com/yarolegovich/discretescrollview/Direction.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.yarolegovich.discretescrollview; - -/** - * Created by yarolegovich on 16.03.2017. - */ -enum Direction { - - START { - @Override - public int applyTo(int delta) { - return delta * -1; - } - - @Override - public boolean sameAs(int direction) { - return direction < 0; - } - }, - END { - @Override - public int applyTo(int delta) { - return delta; - } - - @Override - public boolean sameAs(int direction) { - return direction > 0; - } - }; - - public abstract int applyTo(int delta); - - public abstract boolean sameAs(int direction); - - public static Direction fromDelta(int delta) { - return delta > 0 ? END : START; - } -} diff --git a/modules/mogo-module-common/src/main/java/com/yarolegovich/discretescrollview/DiscreteScrollLayoutManager.java b/modules/mogo-module-common/src/main/java/com/yarolegovich/discretescrollview/DiscreteScrollLayoutManager.java deleted file mode 100644 index 777d950bed..0000000000 --- a/modules/mogo-module-common/src/main/java/com/yarolegovich/discretescrollview/DiscreteScrollLayoutManager.java +++ /dev/null @@ -1,836 +0,0 @@ -package com.yarolegovich.discretescrollview; - -import android.content.Context; -import android.graphics.Point; -import android.graphics.PointF; -import android.os.Bundle; -import android.os.Parcelable; -import android.util.DisplayMetrics; -import android.util.SparseArray; -import android.view.View; -import android.view.ViewGroup; -import android.view.accessibility.AccessibilityEvent; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.core.view.accessibility.AccessibilityEventCompat; -import androidx.core.view.accessibility.AccessibilityRecordCompat; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.LinearSmoothScroller; -import androidx.recyclerview.widget.RecyclerView; -import com.alibaba.idst.nls.internal.utils.L; -import com.mogo.utils.logger.Logger; -import com.yarolegovich.discretescrollview.transform.DiscreteScrollItemTransformer; - -import java.util.Locale; - -/** - * Created by yarolegovich on 17.02.2017. - */ -public class DiscreteScrollLayoutManager extends LinearLayoutManager { - - static final int NO_POSITION = -1; - - private static final String EXTRA_POSITION = "extra_position"; - private static final int DEFAULT_TIME_FOR_ITEM_SETTLE = 300; - private static final int DEFAULT_FLING_THRESHOLD = 2100; //Decrease to increase sensitivity. - private static final int DEFAULT_TRANSFORM_CLAMP_ITEM_COUNT = 1; - - protected static final float SCROLL_TO_SNAP_TO_ANOTHER_ITEM = 0.6f; - - //This field will take value of all visible view's center points during the fill phase - protected Point viewCenterIterator; - protected Point recyclerCenter; - protected Point currentViewCenter; - protected int childHalfWidth, childHalfHeight; - protected int extraLayoutSpace; - - //Max possible distance a view can travel during one scroll phase - protected int scrollToChangeCurrent; - protected int currentScrollState; - - protected int scrolled; - protected int pendingScroll; - protected int currentPosition; - protected int pendingPosition; - - protected SparseArray detachedCache; - - private DSVOrientation.Helper orientationHelper; - - protected boolean isFirstOrEmptyLayout; - - private Context context; - - private int timeForItemSettle; - private int offscreenItems; - private int transformClampItemCount; - - private boolean dataSetChangeShiftedPosition; - - private int flingThreshold; - private boolean shouldSlideOnFling; - - private int viewWidth, viewHeight; - - private float ratio=0.5F; - - private static final String TAG = "DiscreteScrollLayoutMan"; - @NonNull - private final ScrollStateListener scrollStateListener; - private DiscreteScrollItemTransformer itemTransformer; - - private RecyclerViewProxy recyclerViewProxy; - - public DiscreteScrollLayoutManager( - @NonNull Context c, - @NonNull ScrollStateListener scrollStateListener, - @NonNull DSVOrientation orientation) { - super(c); - this.context = c; - this.timeForItemSettle = DEFAULT_TIME_FOR_ITEM_SETTLE; - this.pendingPosition = NO_POSITION; - this.currentPosition = NO_POSITION; - this.flingThreshold = DEFAULT_FLING_THRESHOLD; - this.shouldSlideOnFling = false; - this.recyclerCenter = new Point(); - this.currentViewCenter = new Point(); - this.viewCenterIterator = new Point(); - this.detachedCache = new SparseArray<>(); - this.scrollStateListener = scrollStateListener; - this.orientationHelper = orientation.createHelper(); - this.recyclerViewProxy = new RecyclerViewProxy(this); - this.transformClampItemCount = DEFAULT_TRANSFORM_CLAMP_ITEM_COUNT; - } - - @Override - public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) { - if (state.getItemCount() == 0) { - recyclerViewProxy.removeAndRecycleAllViews(recycler); - currentPosition = pendingPosition = NO_POSITION; - scrolled = pendingScroll = 0; - return; - } - - ensureValidPosition(state); - - updateRecyclerDimensions(state); - - //onLayoutChildren may be called multiple times and this check is required so that the flag - //won't be cleared until onLayoutCompleted - if (!isFirstOrEmptyLayout) { - isFirstOrEmptyLayout = recyclerViewProxy.getChildCount() == 0; - if (isFirstOrEmptyLayout) { - initChildDimensions(recycler); - } - } - - recyclerViewProxy.detachAndScrapAttachedViews(recycler); - - fill(recycler); - - applyItemTransformToChildren(); - } - - private void ensureValidPosition(RecyclerView.State state) { - if (currentPosition == NO_POSITION || currentPosition >= state.getItemCount()) { - //currentPosition might have been assigned in onRestoreInstanceState() - //which can lead to a crash (position out of bounds) when data set - //is not persisted across rotations - currentPosition = 0; - } - } - - public void setRatio(float ratio) { - this.ratio = ratio; - } - - @Override - public void onLayoutCompleted(RecyclerView.State state) { - if (isFirstOrEmptyLayout) { - scrollStateListener.onCurrentViewFirstLayout(); - isFirstOrEmptyLayout = false; - } else if (dataSetChangeShiftedPosition) { - scrollStateListener.onDataSetChangeChangedPosition(); - dataSetChangeShiftedPosition = false; - } - } - - protected void initChildDimensions(RecyclerView.Recycler recycler) { - View viewToMeasure = recyclerViewProxy.getMeasuredChildForAdapterPosition(0, recycler); - - int childViewWidth = recyclerViewProxy.getMeasuredWidthWithMargin(viewToMeasure); - int childViewHeight = recyclerViewProxy.getMeasuredHeightWithMargin(viewToMeasure); - - childHalfWidth = childViewWidth / 2; - childHalfHeight = childViewHeight / 2; - - scrollToChangeCurrent = orientationHelper.getDistanceToChangeCurrent( - childViewWidth, - childViewHeight); - - extraLayoutSpace = scrollToChangeCurrent * offscreenItems; - - recyclerViewProxy.detachAndScrapView(viewToMeasure, recycler); - } - - protected void updateRecyclerDimensions(RecyclerView.State state) { - boolean dimensionsChanged = !state.isMeasuring() - && (recyclerViewProxy.getWidth() != viewWidth - || recyclerViewProxy.getHeight() != viewHeight); - if (dimensionsChanged) { - viewWidth = recyclerViewProxy.getWidth(); - viewHeight = recyclerViewProxy.getHeight(); - recyclerViewProxy.removeAllViews(); - } - recyclerCenter.set( - (int) (recyclerViewProxy.getWidth() * ratio), - recyclerViewProxy.getHeight() / 2); - } - - protected void fill(RecyclerView.Recycler recycler) { - cacheAndDetachAttachedViews(); - - orientationHelper.setCurrentViewCenter(recyclerCenter, scrolled, currentViewCenter); - - final int endBound = orientationHelper.getViewEnd( - recyclerViewProxy.getWidth(), - recyclerViewProxy.getHeight()); - - //Layout current - if (isViewVisible(currentViewCenter, endBound)) { - layoutView(recycler, currentPosition, currentViewCenter); - } - - //Layout items before the current item - layoutViews(recycler, Direction.START, endBound); - - //Layout items after the current item - layoutViews(recycler, Direction.END, endBound); - - recycleDetachedViewsAndClearCache(recycler); - } - - private void layoutViews(RecyclerView.Recycler recycler, Direction direction, int endBound) { - final int positionStep = direction.applyTo(1); - - //Predictive layout is required when we are doing smooth fast scroll towards pendingPosition - boolean noPredictiveLayoutRequired = pendingPosition == NO_POSITION - || !direction.sameAs(pendingPosition - currentPosition); - - viewCenterIterator.set(currentViewCenter.x, currentViewCenter.y); - for (int pos = currentPosition + positionStep; isInBounds(pos); pos += positionStep) { - if (pos == pendingPosition) { - noPredictiveLayoutRequired = true; - } - orientationHelper.shiftViewCenter(direction, scrollToChangeCurrent, viewCenterIterator); - if (isViewVisible(viewCenterIterator, endBound)) { - layoutView(recycler, pos, viewCenterIterator); - } else if (noPredictiveLayoutRequired) { - break; - } - } - } - - protected void layoutView(RecyclerView.Recycler recycler, int position, Point viewCenter) { - if (position < 0) return; - View v = detachedCache.get(position); - if (v == null) { - v = recyclerViewProxy.getMeasuredChildForAdapterPosition(position, recycler); - recyclerViewProxy.layoutDecoratedWithMargins(v, - viewCenter.x - childHalfWidth, viewCenter.y - childHalfHeight, - viewCenter.x + childHalfWidth, viewCenter.y + childHalfHeight); - } else { - recyclerViewProxy.attachView(v); - detachedCache.remove(position); - } - } - - protected void cacheAndDetachAttachedViews() { - detachedCache.clear(); - for (int i = 0; i < recyclerViewProxy.getChildCount(); i++) { - View child = recyclerViewProxy.getChildAt(i); - detachedCache.put(recyclerViewProxy.getPosition(child), child); - } - - for (int i = 0; i < detachedCache.size(); i++) { - recyclerViewProxy.detachView(detachedCache.valueAt(i)); - } - } - - protected void recycleDetachedViewsAndClearCache(RecyclerView.Recycler recycler) { - for (int i = 0; i < detachedCache.size(); i++) { - View viewToRemove = detachedCache.valueAt(i); - recyclerViewProxy.recycleView(viewToRemove, recycler); - } - detachedCache.clear(); - } - - @Override - public void onItemsAdded(RecyclerView recyclerView, int positionStart, int itemCount) { - int newPosition = currentPosition; - if (currentPosition == NO_POSITION) { - newPosition = 0; - } else if (currentPosition >= positionStart) { - newPosition = Math.min(currentPosition + itemCount, recyclerViewProxy.getItemCount() - 1); - } - onNewPosition(newPosition); - } - - @Override - public void onItemsRemoved(RecyclerView recyclerView, int positionStart, int itemCount) { - int newPosition = currentPosition; - if (recyclerViewProxy.getItemCount() == 0) { - newPosition = NO_POSITION; - } else if (currentPosition >= positionStart) { - if (currentPosition < positionStart + itemCount) { - //If currentPosition is in the removed items, then the new item became current - currentPosition = NO_POSITION; - } - newPosition = Math.max(0, currentPosition - itemCount); - } - onNewPosition(newPosition); - } - - @Override - public void onItemsChanged(RecyclerView recyclerView) { - //notifyDataSetChanged() was called. We need to ensure that currentPosition is not out of bounds - currentPosition = Math.min(Math.max(0, currentPosition), recyclerViewProxy.getItemCount() - 1); - dataSetChangeShiftedPosition = true; - } - - private void onNewPosition(int position) { - if (currentPosition != position) { - currentPosition = position; - dataSetChangeShiftedPosition = true; - } - } - - @Override - public int scrollHorizontallyBy(int dx, RecyclerView.Recycler recycler, RecyclerView.State state) { - return scrollBy(dx, recycler); - } - - @Override - public int scrollVerticallyBy(int dy, RecyclerView.Recycler recycler, RecyclerView.State state) { - return scrollBy(dy, recycler); - } - - protected int scrollBy(int amount, RecyclerView.Recycler recycler) { - if (recyclerViewProxy.getChildCount() == 0) { - return 0; - } - - Direction direction = Direction.fromDelta(amount); - int leftToScroll = calculateAllowedScrollIn(direction); - if (leftToScroll <= 0) { - return 0; - } - int delta = direction.applyTo(Math.min(leftToScroll, Math.abs(amount))); - Logger.d(TAG,"leftToScroll--》"+leftToScroll+"---amount--》"+amount); - - scrolled += delta; - if (pendingScroll != 0) { - pendingScroll -= delta; - } - - orientationHelper.offsetChildren(-delta, recyclerViewProxy); - - if (orientationHelper.hasNewBecomeVisible(this)) { - fill(recycler); - } - - notifyScroll(); - - applyItemTransformToChildren(); - - return delta; - } - - protected void applyItemTransformToChildren() { - if (itemTransformer != null) { - int clampAfterDistance = scrollToChangeCurrent * transformClampItemCount; - for (int i = 0; i < recyclerViewProxy.getChildCount(); i++) { - View child = recyclerViewProxy.getChildAt(i); - - //RecyclerView.ViewHolder childViewHolder = recyclerView.getChildViewHolder(child); - float position = getCenterRelativePositionOf(child, clampAfterDistance); - itemTransformer.transformItem(child,null, position); - } - } - } - - @Override - public void scrollToPosition(int position) { - if (currentPosition == position) { - return; - } - - currentPosition = position; - recyclerViewProxy.requestLayout(); - } - - //@Override - //public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) { - // if (currentPosition == position || pendingPosition != NO_POSITION) { - // return; - // } - // checkTargetPosition(state, position); - // if (currentPosition == NO_POSITION) { - // //Layout not happened yet - // currentPosition = position; - // } else { - // startSmoothPendingScroll(position); - // } - //} - - - @Override - public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) { - LinearSmoothScroller smoothScroller = - new LinearSmoothScroller(recyclerView.getContext()) { - @Override - protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) { - // 返回:滑过1px时经历的时间(ms)。 - return 10f / displayMetrics.densityDpi; - } - - @Override - public int calculateDtToFit(int viewStart, int viewEnd, int boxStart, int boxEnd, int snapPreference) { - return boxStart - viewStart; - } - }; - - smoothScroller.setTargetPosition(position); - startSmoothScroll(smoothScroller); - } - - @Override - public boolean canScrollHorizontally() { - return orientationHelper.canScrollHorizontally(); - } - - @Override - public boolean canScrollVertically() { - return orientationHelper.canScrollVertically(); - } - - @Override - public void onScrollStateChanged(int state) { - if (currentScrollState == RecyclerView.SCROLL_STATE_IDLE && currentScrollState != state) { - scrollStateListener.onScrollStart(); - } - - if (state == RecyclerView.SCROLL_STATE_IDLE) { - //Scroll is not finished until current view is centered - boolean isScrollEnded = onScrollEnd(); - if (isScrollEnded) { - scrollStateListener.onScrollEnd(); - } else { - //Scroll continues and we don't want to set currentScrollState to STATE_IDLE, - //because this will then trigger .scrollStateListener.onScrollStart() - return; - } - } else if (state == RecyclerView.SCROLL_STATE_DRAGGING) { - onDragStart(); - } - currentScrollState = state; - } - - /** - * @return true if scroll is ended and we don't need to settle items - */ - private boolean onScrollEnd() { - if (pendingPosition != NO_POSITION) { - currentPosition = pendingPosition; - pendingPosition = NO_POSITION; - scrolled = 0; - } - - Direction scrollDirection = Direction.fromDelta(scrolled); - if (Math.abs(scrolled) == scrollToChangeCurrent) { - currentPosition += scrollDirection.applyTo(1); - scrolled = 0; - } - - if (isAnotherItemCloserThanCurrent()) { - pendingScroll = getHowMuchIsLeftToScroll(scrolled); - } else { - pendingScroll = -scrolled; - } - - if (pendingScroll == 0) { - return true; - } else { - startSmoothPendingScroll(); - return false; - } - } - - private void onDragStart() { - //Here we need to: - //1. Stop any pending scroll - //2. Set currentPosition to position of the item that is closest to the center - boolean isScrollingThroughMultiplePositions = Math.abs(scrolled) > scrollToChangeCurrent; - if (isScrollingThroughMultiplePositions) { - int scrolledPositions = scrolled / scrollToChangeCurrent; - currentPosition += scrolledPositions; - scrolled -= scrolledPositions * scrollToChangeCurrent; - } - if (isAnotherItemCloserThanCurrent()) { - Direction direction = Direction.fromDelta(scrolled); - currentPosition += direction.applyTo(1); - scrolled = -getHowMuchIsLeftToScroll(scrolled); - } - pendingPosition = NO_POSITION; - pendingScroll = 0; - } - - public void onFling(int velocityX, int velocityY) { - int velocity = orientationHelper.getFlingVelocity(velocityX, velocityY); - int throttleValue = shouldSlideOnFling ? Math.abs(velocity / flingThreshold) : 1; - int newPosition = currentPosition + Direction.fromDelta(velocity).applyTo(throttleValue); - newPosition = checkNewOnFlingPositionIsInBounds(newPosition); - boolean isInScrollDirection = velocity * scrolled >= 0; - boolean canFling = isInScrollDirection && isInBounds(newPosition); - if (canFling) { - startSmoothPendingScroll(newPosition); - } else { - returnToCurrentPosition(); - } - - Logger.d(TAG,"onFling"+newPosition); - } - - public void returnToCurrentPosition() { - pendingScroll = -scrolled; - if (pendingScroll != 0) { - startSmoothPendingScroll(); - } - } - - protected int calculateAllowedScrollIn(Direction direction) { - if (pendingScroll != 0) { - return Math.abs(pendingScroll); - } - int allowedScroll; - boolean isBoundReached; - boolean isScrollDirectionAsBefore = direction.applyTo(scrolled) > 0; - if (direction == Direction.START && currentPosition == 0) { - //We can scroll to the left when currentPosition == 0 only if we scrolled to the right before - isBoundReached = scrolled == 0; - allowedScroll = isBoundReached ? 0 : Math.abs(scrolled); - } else if (direction == Direction.END && currentPosition == recyclerViewProxy.getItemCount() - 1) { - //We can scroll to the right when currentPosition == last only if we scrolled to the left before - isBoundReached = scrolled == 0; - allowedScroll = isBoundReached ? 0 : Math.abs(scrolled); - } else { - isBoundReached = false; - allowedScroll = isScrollDirectionAsBefore ? - scrollToChangeCurrent - Math.abs(scrolled) : - scrollToChangeCurrent + Math.abs(scrolled); - } - scrollStateListener.onIsBoundReachedFlagChange(isBoundReached); - return allowedScroll; - } - - private void startSmoothPendingScroll() { - LinearSmoothScroller scroller = new DiscreteLinearSmoothScroller(context); - scroller.setTargetPosition(currentPosition); - recyclerViewProxy.startSmoothScroll(scroller); - } - - public void startSmoothPendingScroll(int position) { - if (currentPosition == position) return; - pendingScroll = -scrolled; - Direction direction = Direction.fromDelta(position - currentPosition); - int distanceToScroll = Math.abs(position - currentPosition) * scrollToChangeCurrent; - pendingScroll += direction.applyTo(distanceToScroll); - pendingPosition = position; - startSmoothPendingScroll(); - } - - - - - @Override - public boolean isAutoMeasureEnabled() { - return true; - } - - @Override - public int computeVerticalScrollRange(RecyclerView.State state) { - return computeScrollRange(state); - } - - @Override - public int computeVerticalScrollOffset(RecyclerView.State state) { - return computeScrollOffset(state); - } - - @Override - public int computeVerticalScrollExtent(RecyclerView.State state) { - return computeScrollExtent(state); - } - - @Override - public int computeHorizontalScrollRange(RecyclerView.State state) { - return computeScrollRange(state); - } - - @Override - public int computeHorizontalScrollOffset(RecyclerView.State state) { - return computeScrollOffset(state); - } - - @Override - public int computeHorizontalScrollExtent(RecyclerView.State state) { - return computeScrollExtent(state); - } - - private int computeScrollOffset(RecyclerView.State state) { - int scrollbarSize = computeScrollExtent(state); - int offset = (int) ((scrolled / (float) scrollToChangeCurrent) * scrollbarSize); - return (currentPosition * scrollbarSize) + offset; - } - - private int computeScrollExtent(RecyclerView.State state) { - if (getItemCount() == 0) { - return 0; - } else { - return (int) (computeScrollRange(state) / (float) getItemCount()); - } - } - - private int computeScrollRange(RecyclerView.State state) { - if (getItemCount() == 0) { - return 0; - } else { - return scrollToChangeCurrent * (getItemCount() - 1); - } - } - - @Override - public void onAdapterChanged(RecyclerView.Adapter oldAdapter, RecyclerView.Adapter newAdapter) { - pendingPosition = NO_POSITION; - scrolled = pendingScroll = 0; - if (newAdapter instanceof InitialPositionProvider) { - currentPosition = ((InitialPositionProvider) newAdapter).getInitialPosition(); - } else { - currentPosition = 0; - } - recyclerViewProxy.removeAllViews(); - } - - @Override - public Parcelable onSaveInstanceState() { - Bundle bundle = new Bundle(); - if (pendingPosition != NO_POSITION) { - currentPosition = pendingPosition; - } - bundle.putInt(EXTRA_POSITION, currentPosition); - return bundle; - } - - @Override - public void onRestoreInstanceState(Parcelable state) { - Bundle bundle = (Bundle) state; - currentPosition = bundle.getInt(EXTRA_POSITION); - } - - @Override - public RecyclerView.LayoutParams generateDefaultLayoutParams() { - return new RecyclerView.LayoutParams( - ViewGroup.LayoutParams.WRAP_CONTENT, - ViewGroup.LayoutParams.WRAP_CONTENT); - } - - public int getNextPosition() { - if (scrolled == 0) { - return currentPosition; - } else if (pendingPosition != NO_POSITION) { - return pendingPosition; - } else { - return currentPosition + Direction.fromDelta(scrolled).applyTo(1); - } - } - - public void setItemTransformer(DiscreteScrollItemTransformer itemTransformer) { - this.itemTransformer = itemTransformer; - } - - public void setTimeForItemSettle(int timeForItemSettle) { - this.timeForItemSettle = timeForItemSettle; - } - - public void setOffscreenItems(int offscreenItems) { - this.offscreenItems = offscreenItems; - extraLayoutSpace = scrollToChangeCurrent * offscreenItems; - recyclerViewProxy.requestLayout(); - } - - public void setTransformClampItemCount(int transformClampItemCount) { - this.transformClampItemCount = transformClampItemCount; - applyItemTransformToChildren(); - } - - public void setOrientation(DSVOrientation orientation) { - orientationHelper = orientation.createHelper(); - recyclerViewProxy.removeAllViews(); - recyclerViewProxy.requestLayout(); - } - - public void setShouldSlideOnFling(boolean result) { - shouldSlideOnFling = result; - } - - public void setSlideOnFlingThreshold(int threshold) { - flingThreshold = threshold; - } - - public int getCurrentPosition() { - return currentPosition; - } - - @Override - public void onInitializeAccessibilityEvent(AccessibilityEvent event) { - super.onInitializeAccessibilityEvent(event); - if (recyclerViewProxy.getChildCount() > 0) { - final AccessibilityRecordCompat record = AccessibilityEventCompat.asRecord(event); - record.setFromIndex(getPosition(getFirstChild())); - record.setToIndex(getPosition(getLastChild())); - } - } - - private float getCenterRelativePositionOf(View v, int maxDistance) { - float distanceFromCenter = orientationHelper.getDistanceFromCenter(recyclerCenter, - getDecoratedLeft(v) + childHalfWidth, - getDecoratedTop(v) + childHalfHeight); - return Math.min(Math.max(-1f, distanceFromCenter / maxDistance), 1f); - } - - private int checkNewOnFlingPositionIsInBounds(int position) { - final int itemCount = recyclerViewProxy.getItemCount(); - //The check is required in case slide through multiple items is turned on - if (currentPosition != 0 && position < 0) { - //If currentPosition == 0 && position < 0 we forbid scroll to the left, - //but if currentPosition != 0 we can slide to the first item - return 0; - } else if (currentPosition != itemCount - 1 && position >= itemCount) { - return itemCount - 1; - } - return position; - } - - private int getHowMuchIsLeftToScroll(int dx) { - return Direction.fromDelta(dx).applyTo(scrollToChangeCurrent - Math.abs(scrolled)); - } - - private boolean isAnotherItemCloserThanCurrent() { - return Math.abs(scrolled) >= scrollToChangeCurrent * SCROLL_TO_SNAP_TO_ANOTHER_ITEM; - } - - public View getFirstChild() { - return recyclerViewProxy.getChildAt(0); - } - - public View getLastChild() { - return recyclerViewProxy.getChildAt(recyclerViewProxy.getChildCount() - 1); - } - - public int getExtraLayoutSpace() { - return extraLayoutSpace; - } - - private void notifyScroll() { - float amountToScroll = pendingPosition != NO_POSITION ? - Math.abs(scrolled + pendingScroll) : - scrollToChangeCurrent; - float position = -Math.min(Math.max(-1f, scrolled / amountToScroll), 1f); - scrollStateListener.onScroll(position); - } - - private boolean isInBounds(int itemPosition) { - return itemPosition >= 0 && itemPosition < recyclerViewProxy.getItemCount(); - } - - private boolean isViewVisible(Point viewCenter, int endBound) { - return orientationHelper.isViewVisible( - viewCenter, childHalfWidth, childHalfHeight, - endBound, extraLayoutSpace); - } - - - public void setPendingScroll(int pendingScroll){ - this.pendingScroll=pendingScroll; - } - - private void checkTargetPosition(RecyclerView.State state, int targetPosition) { - if (targetPosition < 0 || targetPosition >= state.getItemCount()) { - throw new IllegalArgumentException(String.format(Locale.US, - "target position out of bounds: position=%d, itemCount=%d", - targetPosition, state.getItemCount())); - } - } - - protected void setRecyclerViewProxy(RecyclerViewProxy recyclerViewProxy) { - this.recyclerViewProxy = recyclerViewProxy; - } - - protected void setOrientationHelper(DSVOrientation.Helper orientationHelper) { - this.orientationHelper = orientationHelper; - } - - private class DiscreteLinearSmoothScroller extends LinearSmoothScroller { - - public DiscreteLinearSmoothScroller(Context context) { - super(context); - } - - @Override - public int calculateDxToMakeVisible(View view, int snapPreference) { - return orientationHelper.getPendingDx(-pendingScroll); - } - - @Override - public int calculateDyToMakeVisible(View view, int snapPreference) { - return orientationHelper.getPendingDy(-pendingScroll); - } - - @Override - protected int calculateTimeForScrolling(int dx) { - float dist = Math.min(Math.abs(dx), scrollToChangeCurrent); - return (int) (Math.max(0.01f, dist / scrollToChangeCurrent) * timeForItemSettle); - } - - @Nullable - @Override - public PointF computeScrollVectorForPosition(int targetPosition) { - return new PointF( - orientationHelper.getPendingDx(pendingScroll), - orientationHelper.getPendingDy(pendingScroll)); - } - - @Override protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) { - return 10f / displayMetrics.densityDpi; - } - } - - public interface ScrollStateListener { - void onIsBoundReachedFlagChange(boolean isBoundReached); - - void onScrollStart(); - - void onScrollEnd(); - - void onScroll(float currentViewPosition); - - void onCurrentViewFirstLayout(); - - void onDataSetChangeChangedPosition(); - } - - public interface InitialPositionProvider { - int getInitialPosition(); - } -} diff --git a/modules/mogo-module-common/src/main/java/com/yarolegovich/discretescrollview/DiscreteScrollView.java b/modules/mogo-module-common/src/main/java/com/yarolegovich/discretescrollview/DiscreteScrollView.java deleted file mode 100644 index bf37a87cd7..0000000000 --- a/modules/mogo-module-common/src/main/java/com/yarolegovich/discretescrollview/DiscreteScrollView.java +++ /dev/null @@ -1,302 +0,0 @@ -package com.yarolegovich.discretescrollview; - -import android.content.Context; -import android.content.res.TypedArray; -import android.util.AttributeSet; -import android.view.View; - -import androidx.annotation.IntRange; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.recyclerview.widget.RecyclerView; -import com.mogo.module.common.R; -import com.yarolegovich.discretescrollview.transform.DiscreteScrollItemTransformer; -import com.yarolegovich.discretescrollview.util.ScrollListenerAdapter; - -import java.util.ArrayList; -import java.util.List; - -/** - * Created by yarolegovich on 18.02.2017. - */ -@SuppressWarnings("unchecked") -public class DiscreteScrollView extends RecyclerView { - - public static final int NO_POSITION = DiscreteScrollLayoutManager.NO_POSITION; - - private static final int DEFAULT_ORIENTATION = DSVOrientation.HORIZONTAL.ordinal(); - - private DiscreteScrollLayoutManager layoutManager; - - private List scrollStateChangeListeners; - private List onItemChangedListeners; - - private boolean isOverScrollEnabled; - - public DiscreteScrollView(Context context) { - super(context); - init(null); - } - - public DiscreteScrollView(Context context, AttributeSet attrs) { - super(context, attrs); - init(attrs); - } - - public DiscreteScrollView(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - init(attrs); - } - - private void init(AttributeSet attrs) { - scrollStateChangeListeners = new ArrayList<>(); - onItemChangedListeners = new ArrayList<>(); - - int orientation = DEFAULT_ORIENTATION; - if (attrs != null) { - TypedArray ta = getContext().obtainStyledAttributes(attrs, R.styleable.DiscreteScrollView); - orientation = ta.getInt(R.styleable.DiscreteScrollView_dsv_orientation, DEFAULT_ORIENTATION); - ta.recycle(); - } - - isOverScrollEnabled = getOverScrollMode() != OVER_SCROLL_NEVER; - - layoutManager = new DiscreteScrollLayoutManager( - getContext(), new ScrollStateListener(), - DSVOrientation.values()[orientation]); - setLayoutManager(layoutManager); - } - - public void setRatio(float ratio){ - layoutManager.setRatio(ratio); - } - - @Override - public void setLayoutManager(LayoutManager layout) { - if (layout instanceof DiscreteScrollLayoutManager) { - super.setLayoutManager(layout); - } else { - throw new IllegalArgumentException(getContext().getString(R.string.dsv_ex_msg_dont_set_lm)); - } - } - - - @Override - public boolean fling(int velocityX, int velocityY) { - boolean isFling = super.fling(velocityX, velocityY); - if (isFling) { - layoutManager.onFling(velocityX, velocityY); - } else { - layoutManager.returnToCurrentPosition(); - } - return isFling; - } - - @Nullable - public ViewHolder getViewHolder(int position) { - View view = layoutManager.findViewByPosition(position); - return view != null ? getChildViewHolder(view) : null; - } - - /** - * @return adapter position of the current item or -1 if nothing is selected - */ - public int getCurrentItem() { - return layoutManager.getCurrentPosition(); - } - - public void setItemTransformer(DiscreteScrollItemTransformer transformer) { - layoutManager.setItemTransformer(transformer); - } - - public void setItemTransitionTimeMillis(@IntRange(from = 10) int millis) { - layoutManager.setTimeForItemSettle(millis); - } - - public void setSlideOnFling(boolean result){ - layoutManager.setShouldSlideOnFling(result); - } - - public void setSlideOnFlingThreshold(int threshold){ - layoutManager.setSlideOnFlingThreshold(threshold); - } - - public void setOrientation(DSVOrientation orientation) { - layoutManager.setOrientation(orientation); - } - - public void setOffscreenItems(int items) { - layoutManager.setOffscreenItems(items); - } - - public void setClampTransformProgressAfter(@IntRange(from = 1) int itemCount) { - if (itemCount <= 1) { - throw new IllegalArgumentException("must be >= 1"); - } - layoutManager.setTransformClampItemCount(itemCount); - } - - public void setOverScrollEnabled(boolean overScrollEnabled) { - isOverScrollEnabled = overScrollEnabled; - setOverScrollMode(OVER_SCROLL_NEVER); - } - - public void addScrollStateChangeListener(@NonNull ScrollStateChangeListener scrollStateChangeListener) { - scrollStateChangeListeners.add(scrollStateChangeListener); - } - - public void addScrollListener(@NonNull ScrollListener scrollListener) { - addScrollStateChangeListener(new ScrollListenerAdapter(scrollListener)); - } - - public void addOnItemChangedListener(@NonNull OnItemChangedListener onItemChangedListener) { - onItemChangedListeners.add(onItemChangedListener); - } - - public void removeScrollStateChangeListener(@NonNull ScrollStateChangeListener scrollStateChangeListener) { - scrollStateChangeListeners.remove(scrollStateChangeListener); - } - - public void removeScrollListener(@NonNull ScrollListener scrollListener) { - removeScrollStateChangeListener(new ScrollListenerAdapter<>(scrollListener)); - } - - public void removeItemChangedListener(@NonNull OnItemChangedListener onItemChangedListener) { - onItemChangedListeners.remove(onItemChangedListener); - } - - private void notifyScrollStart(ViewHolder holder, int current) { - for (ScrollStateChangeListener listener : scrollStateChangeListeners) { - listener.onScrollStart(holder, current); - } - } - - private void notifyScrollEnd(ViewHolder holder, int current) { - for (ScrollStateChangeListener listener : scrollStateChangeListeners) { - listener.onScrollEnd(holder, current); - } - } - - private void notifyScroll(float position, - int currentIndex, int newIndex, - ViewHolder currentHolder, ViewHolder newHolder) { - for (ScrollStateChangeListener listener : scrollStateChangeListeners) { - listener.onScroll(position, currentIndex, newIndex, - currentHolder, - newHolder); - } - } - - private void notifyCurrentItemChanged(ViewHolder holder, int current) { - for (OnItemChangedListener listener : onItemChangedListeners) { - listener.onCurrentItemChanged(holder, current); - } - } - - private void notifyCurrentItemChanged() { - if (onItemChangedListeners.isEmpty()) { - return; - } - int current = layoutManager.getCurrentPosition(); - ViewHolder currentHolder = getViewHolder(current); - notifyCurrentItemChanged(currentHolder, current); - } - - public void setPendingScroll(int PendingScroll ) { - layoutManager.setPendingScroll(PendingScroll); - } - - private class ScrollStateListener implements DiscreteScrollLayoutManager.ScrollStateListener { - - @Override - public void onIsBoundReachedFlagChange(boolean isBoundReached) { - if (isOverScrollEnabled) { - setOverScrollMode(isBoundReached ? OVER_SCROLL_ALWAYS : OVER_SCROLL_NEVER); - } - } - - @Override - public void onScrollStart() { - if (scrollStateChangeListeners.isEmpty()) { - return; - } - int current = layoutManager.getCurrentPosition(); - ViewHolder holder = getViewHolder(current); - if (holder != null) { - notifyScrollStart(holder, current); - } - } - - @Override - public void onScrollEnd() { - if (onItemChangedListeners.isEmpty() && scrollStateChangeListeners.isEmpty()) { - return; - } - int current = layoutManager.getCurrentPosition(); - ViewHolder holder = getViewHolder(current); - if (holder != null) { - notifyScrollEnd(holder, current); - notifyCurrentItemChanged(holder, current); - } - } - - @Override - public void onScroll(float currentViewPosition) { - if (scrollStateChangeListeners.isEmpty()) { - return; - } - int currentIndex = getCurrentItem(); - int newIndex = layoutManager.getNextPosition(); - if (currentIndex != newIndex) { - notifyScroll(currentViewPosition, - currentIndex, newIndex, - getViewHolder(currentIndex), - getViewHolder(newIndex)); - } - } - - @Override - public void onCurrentViewFirstLayout() { - post(new Runnable() { - @Override - public void run() { - notifyCurrentItemChanged(); - } - }); - } - - @Override - public void onDataSetChangeChangedPosition() { - notifyCurrentItemChanged(); - } - } - - public interface ScrollStateChangeListener { - - void onScrollStart(@NonNull T currentItemHolder, int adapterPosition); - - void onScrollEnd(@NonNull T currentItemHolder, int adapterPosition); - - void onScroll(float scrollPosition, - int currentPosition, - int newPosition, - @Nullable T currentHolder, - @Nullable T newCurrent); - } - - public interface ScrollListener { - - void onScroll(float scrollPosition, - int currentPosition, int newPosition, - @Nullable T currentHolder, - @Nullable T newCurrent); - } - - public interface OnItemChangedListener { - /* - * This method will be also triggered when view appears on the screen for the first time. - * If data set is empty, viewHolder will be null and adapterPosition will be NO_POSITION - */ - void onCurrentItemChanged(@Nullable T viewHolder, int adapterPosition); - } -} diff --git a/modules/mogo-module-common/src/main/java/com/yarolegovich/discretescrollview/InfiniteScrollAdapter.java b/modules/mogo-module-common/src/main/java/com/yarolegovich/discretescrollview/InfiniteScrollAdapter.java deleted file mode 100644 index 36fb35c94d..0000000000 --- a/modules/mogo-module-common/src/main/java/com/yarolegovich/discretescrollview/InfiniteScrollAdapter.java +++ /dev/null @@ -1,179 +0,0 @@ -package com.yarolegovich.discretescrollview; - -import android.view.ViewGroup; - -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.RecyclerView; -import com.mogo.module.common.R; -import java.util.Locale; - -/** - * Created by yarolegovich on 28-Apr-17. - */ - -public class InfiniteScrollAdapter extends RecyclerView.Adapter - implements DiscreteScrollLayoutManager.InitialPositionProvider { - - private static final int CENTER = Integer.MAX_VALUE / 2; - private static final int RESET_BOUND = 100; - - public static InfiniteScrollAdapter wrap( - @NonNull RecyclerView.Adapter adapter) { - return new InfiniteScrollAdapter<>(adapter); - } - - private RecyclerView.Adapter wrapped; - private DiscreteScrollLayoutManager layoutManager; - - public InfiniteScrollAdapter(@NonNull RecyclerView.Adapter wrapped) { - this.wrapped = wrapped; - this.wrapped.registerAdapterDataObserver(new DataSetChangeDelegate()); - } - - @Override - public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) { - wrapped.onAttachedToRecyclerView(recyclerView); - if (recyclerView instanceof DiscreteScrollView) { - layoutManager = (DiscreteScrollLayoutManager) recyclerView.getLayoutManager(); - } else { - String msg = recyclerView.getContext().getString(R.string.dsv_ex_msg_adapter_wrong_recycler); - throw new RuntimeException(msg); - } - } - - @Override - public void onDetachedFromRecyclerView(@NonNull RecyclerView recyclerView) { - wrapped.onDetachedFromRecyclerView(recyclerView); - layoutManager = null; - } - - @Override - public @NonNull T onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - return wrapped.onCreateViewHolder(parent, viewType); - } - - @Override - public void onBindViewHolder(@NonNull T holder, int position) { - if (isResetRequired(position)) { - int resetPosition = CENTER + mapPositionToReal(layoutManager.getCurrentPosition()); - setPosition(resetPosition); - return; - } - wrapped.onBindViewHolder(holder, mapPositionToReal(position)); - } - - @Override - public int getItemViewType(int position) { - return wrapped.getItemViewType(mapPositionToReal(position)); - } - - @Override - public int getItemCount() { - return isInfinite() ? Integer.MAX_VALUE : wrapped.getItemCount(); - } - - public int getRealItemCount() { - return wrapped.getItemCount(); - } - - public int getRealCurrentPosition() { - return getRealPosition(layoutManager.getCurrentPosition()); - } - - public int getRealPosition(int position) { - return mapPositionToReal(position); - } - - public int getClosestPosition(int position) { - ensureValidPosition(position); - int adapterCurrent = layoutManager.getCurrentPosition(); - int current = mapPositionToReal(adapterCurrent); - if (position == current) { - return adapterCurrent; - } - int delta = position - current; - int target = adapterCurrent + delta; - int wraparoundTarget = adapterCurrent + (position > current ? - delta - wrapped.getItemCount() : - wrapped.getItemCount() + delta); - int distance = Math.abs(adapterCurrent - target); - int wraparoundDistance = Math.abs(adapterCurrent - wraparoundTarget); - if (distance == wraparoundDistance) { - //Scroll to the right feels more natural, so prefer it - return target > adapterCurrent ? target : wraparoundTarget; - } else { - return distance < wraparoundDistance ? target : wraparoundTarget; - } - } - - private int mapPositionToReal(int position) { - if (position < CENTER) { - int rem = (CENTER - position) % wrapped.getItemCount(); - return rem == 0 ? 0 : wrapped.getItemCount() - rem; - } else { - return (position - CENTER) % wrapped.getItemCount(); - } - } - - private boolean isResetRequired(int requestedPosition) { - return isInfinite() - && (requestedPosition <= RESET_BOUND - || requestedPosition >= (Integer.MAX_VALUE - RESET_BOUND)); - } - - private void ensureValidPosition(int position) { - if (position >= wrapped.getItemCount()) { - throw new IndexOutOfBoundsException(String.format(Locale.US, - "requested position is outside adapter's bounds: position=%d, size=%d", - position, wrapped.getItemCount())); - } - } - - private boolean isInfinite() { - return wrapped.getItemCount() > 1; - } - - @Override - public int getInitialPosition() { - return isInfinite() ? CENTER : 0; - } - - private void setPosition(int position) { - layoutManager.scrollToPosition(position); - } - - //TODO: handle proper data set change notifications - private class DataSetChangeDelegate extends RecyclerView.AdapterDataObserver { - - @Override - public void onChanged() { - setPosition(getInitialPosition()); - notifyDataSetChanged(); - } - - @Override - public void onItemRangeRemoved(int positionStart, int itemCount) { - onChanged(); - } - - @Override - public void onItemRangeInserted(int positionStart, int itemCount) { - onChanged(); - } - - @Override - public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) { - onChanged(); - } - - @Override - public void onItemRangeChanged(int positionStart, int itemCount) { - notifyItemRangeChanged(0, getItemCount()); - } - - @Override - public void onItemRangeChanged(int positionStart, int itemCount, Object payload) { - notifyItemRangeChanged(0, getItemCount(), payload); - } - } -} \ No newline at end of file diff --git a/modules/mogo-module-common/src/main/java/com/yarolegovich/discretescrollview/RecyclerViewProxy.java b/modules/mogo-module-common/src/main/java/com/yarolegovich/discretescrollview/RecyclerViewProxy.java deleted file mode 100644 index cbafbf4f6b..0000000000 --- a/modules/mogo-module-common/src/main/java/com/yarolegovich/discretescrollview/RecyclerViewProxy.java +++ /dev/null @@ -1,107 +0,0 @@ -package com.yarolegovich.discretescrollview; - -import android.view.View; -import android.view.ViewGroup; -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.RecyclerView; - -/** - * Created by yarolegovich on 10/25/17. - */ -public class RecyclerViewProxy { - - private RecyclerView.LayoutManager layoutManager; - - public RecyclerViewProxy(@NonNull RecyclerView.LayoutManager layoutManager) { - this.layoutManager = layoutManager; - } - - public void attachView(View view) { - layoutManager.attachView(view); - } - - public void detachView(View view) { - layoutManager.detachView(view); - } - - public void detachAndScrapView(View view, RecyclerView.Recycler recycler) { - layoutManager.detachAndScrapView(view, recycler); - } - - public void detachAndScrapAttachedViews(RecyclerView.Recycler recycler) { - layoutManager.detachAndScrapAttachedViews(recycler); - } - - public void recycleView(View view, RecyclerView.Recycler recycler) { - recycler.recycleView(view); - } - - public void removeAndRecycleAllViews(RecyclerView.Recycler recycler) { - layoutManager.removeAndRecycleAllViews(recycler); - } - - public int getChildCount() { - return layoutManager.getChildCount(); - } - - public int getItemCount() { - return layoutManager.getItemCount(); - } - - public View getMeasuredChildForAdapterPosition(int position, RecyclerView.Recycler recycler) { - View view = recycler.getViewForPosition(position); - layoutManager.addView(view); - layoutManager.measureChildWithMargins(view, 0, 0); - return view; - } - - public void layoutDecoratedWithMargins(View v, int left, int top, int right, int bottom) { - layoutManager.layoutDecoratedWithMargins(v, left, top, right, bottom); - } - - public View getChildAt(int index) { - return layoutManager.getChildAt(index); - } - - public int getPosition(View view) { - return layoutManager.getPosition(view); - } - - public int getMeasuredWidthWithMargin(View child) { - ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) child.getLayoutParams(); - return layoutManager.getDecoratedMeasuredWidth(child) + lp.leftMargin + lp.rightMargin; - } - - public int getMeasuredHeightWithMargin(View child) { - ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) child.getLayoutParams(); - return layoutManager.getDecoratedMeasuredHeight(child) + lp.topMargin + lp.bottomMargin; - } - - public int getWidth() { - return layoutManager.getWidth(); - } - - public int getHeight() { - return layoutManager.getHeight(); - } - - public void offsetChildrenHorizontal(int amount) { - layoutManager.offsetChildrenHorizontal(amount); - } - - public void offsetChildrenVertical(int amount) { - layoutManager.offsetChildrenVertical(amount); - } - - public void requestLayout() { - layoutManager.requestLayout(); - } - - public void startSmoothScroll(RecyclerView.SmoothScroller smoothScroller) { - layoutManager.startSmoothScroll(smoothScroller); - } - - public void removeAllViews() { - layoutManager.removeAllViews(); - } -} diff --git a/modules/mogo-module-common/src/main/java/com/yarolegovich/discretescrollview/transform/DiscreteScrollItemTransformer.java b/modules/mogo-module-common/src/main/java/com/yarolegovich/discretescrollview/transform/DiscreteScrollItemTransformer.java deleted file mode 100644 index 5be48cd737..0000000000 --- a/modules/mogo-module-common/src/main/java/com/yarolegovich/discretescrollview/transform/DiscreteScrollItemTransformer.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.yarolegovich.discretescrollview.transform; - -import android.view.View; -import androidx.recyclerview.widget.RecyclerView; - -/** - * Created by yarolegovich on 02.03.2017. - */ - -public interface DiscreteScrollItemTransformer { - void transformItem(View item, RecyclerView.ViewHolder childViewHolder,float position); -} diff --git a/modules/mogo-module-common/src/main/java/com/yarolegovich/discretescrollview/transform/Pivot.java b/modules/mogo-module-common/src/main/java/com/yarolegovich/discretescrollview/transform/Pivot.java deleted file mode 100644 index fc5fcd11d2..0000000000 --- a/modules/mogo-module-common/src/main/java/com/yarolegovich/discretescrollview/transform/Pivot.java +++ /dev/null @@ -1,116 +0,0 @@ -package com.yarolegovich.discretescrollview.transform; - -import android.view.View; - -import androidx.annotation.IntDef; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -/** - * Created by yarolegovich on 03.03.2017. - */ - -public class Pivot { - - public static final int AXIS_X = 0; - public static final int AXIS_Y = 1; - - private static final int PIVOT_CENTER = -1; - private static final int PIVOT_MAX = -2; - - private int axis; - private int pivotPoint; - - public Pivot(@Axis int axis, int pivotPoint) { - this.axis = axis; - this.pivotPoint = pivotPoint; - } - - public void setOn(View view) { - if (axis == AXIS_X) { - switch (pivotPoint) { - case PIVOT_CENTER: - view.setPivotX(view.getWidth() * 0.5f); - break; - case PIVOT_MAX: - view.setPivotX(view.getWidth()); - break; - default: - view.setPivotX(pivotPoint); - break; - } - return; - } - - if (axis == AXIS_Y) { - switch (pivotPoint) { - case PIVOT_CENTER: - view.setPivotY(view.getHeight() * 0.5f); - break; - case PIVOT_MAX: - view.setPivotY(view.getHeight()); - break; - default: - view.setPivotY(pivotPoint); - break; - } - } - } - - @Axis - public int getAxis() { - return axis; - } - - public enum X { - LEFT { - @Override - public Pivot create() { - return new Pivot(AXIS_X, 0); - } - }, - CENTER { - @Override - public Pivot create() { - return new Pivot(AXIS_X, PIVOT_CENTER); - } - }, - RIGHT { - @Override - public Pivot create() { - return new Pivot(AXIS_X, PIVOT_MAX); - } - }; - - public abstract Pivot create(); - } - - public enum Y { - TOP { - @Override - public Pivot create() { - return new Pivot(AXIS_Y, 0); - } - }, - CENTER { - @Override - public Pivot create() { - return new Pivot(AXIS_Y, PIVOT_CENTER); - } - }, - BOTTOM { - @Override - public Pivot create() { - return new Pivot(AXIS_Y, PIVOT_MAX); - } - }; - - public abstract Pivot create(); - } - - @IntDef({AXIS_X, AXIS_Y}) - @Retention(RetentionPolicy.SOURCE) - public @interface Axis{ - } -} - diff --git a/modules/mogo-module-common/src/main/java/com/yarolegovich/discretescrollview/transform/ScaleTransformer.java b/modules/mogo-module-common/src/main/java/com/yarolegovich/discretescrollview/transform/ScaleTransformer.java deleted file mode 100644 index 89ec6c9b34..0000000000 --- a/modules/mogo-module-common/src/main/java/com/yarolegovich/discretescrollview/transform/ScaleTransformer.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.yarolegovich.discretescrollview.transform; - -import android.view.View; -import androidx.annotation.FloatRange; -import androidx.recyclerview.widget.RecyclerView; - -/** - * Created by yarolegovich on 03.03.2017. - */ -public class ScaleTransformer implements DiscreteScrollItemTransformer { - - private Pivot pivotX; - private Pivot pivotY; - private float minScale; - private float maxMinDiff; - - public ScaleTransformer() { - pivotX = Pivot.X.CENTER.create(); - pivotY = Pivot.Y.CENTER.create(); - minScale = 0.8f; - maxMinDiff = 0.2f; - } - - @Override - public void transformItem(View item, RecyclerView.ViewHolder childViewHolder, float position) { - pivotX.setOn(item); - pivotY.setOn(item); - float closenessToCenter = 1f - Math.abs(position); - float scale = minScale + maxMinDiff * closenessToCenter; - item.setScaleX(scale); - item.setScaleY(scale); - } - - public static class Builder { - - private ScaleTransformer transformer; - private float maxScale; - - public Builder() { - transformer = new ScaleTransformer(); - maxScale = 1f; - } - - public Builder setMinScale(@FloatRange(from = 0.01) float scale) { - transformer.minScale = scale; - return this; - } - - public Builder setMaxScale(@FloatRange(from = 0.01) float scale) { - maxScale = scale; - return this; - } - - public Builder setPivotX(Pivot.X pivotX) { - return setPivotX(pivotX.create()); - } - - public Builder setPivotX(Pivot pivot) { - assertAxis(pivot, Pivot.AXIS_X); - transformer.pivotX = pivot; - return this; - } - - public Builder setPivotY(Pivot.Y pivotY) { - return setPivotY(pivotY.create()); - } - - public Builder setPivotY(Pivot pivot) { - assertAxis(pivot, Pivot.AXIS_Y); - transformer.pivotY = pivot; - return this; - } - - public ScaleTransformer build() { - transformer.maxMinDiff = maxScale - transformer.minScale; - return transformer; - } - - private void assertAxis(Pivot pivot, @Pivot.Axis int axis) { - if (pivot.getAxis() != axis) { - throw new IllegalArgumentException("You passed a Pivot for wrong axis."); - } - } - } -} diff --git a/modules/mogo-module-common/src/main/java/com/yarolegovich/discretescrollview/util/ScrollListenerAdapter.java b/modules/mogo-module-common/src/main/java/com/yarolegovich/discretescrollview/util/ScrollListenerAdapter.java deleted file mode 100644 index 7611c52a18..0000000000 --- a/modules/mogo-module-common/src/main/java/com/yarolegovich/discretescrollview/util/ScrollListenerAdapter.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.yarolegovich.discretescrollview.util; - - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.recyclerview.widget.RecyclerView; -import com.yarolegovich.discretescrollview.DiscreteScrollView; - -/** - * Created by yarolegovich on 16.03.2017. - */ -public class ScrollListenerAdapter implements DiscreteScrollView.ScrollStateChangeListener { - - private DiscreteScrollView.ScrollListener adaptee; - - public ScrollListenerAdapter(@NonNull DiscreteScrollView.ScrollListener adaptee) { - this.adaptee = adaptee; - } - - @Override - public void onScrollStart(@NonNull T currentItemHolder, int adapterPosition) { - - } - - @Override - public void onScrollEnd(@NonNull T currentItemHolder, int adapterPosition) { - - } - - @Override - public void onScroll(float scrollPosition, - int currentIndex, int newIndex, - @Nullable T currentHolder, @Nullable T newCurrentHolder) { - adaptee.onScroll(scrollPosition, currentIndex, newIndex, currentHolder, newCurrentHolder); - } - - @Override - public boolean equals(Object obj) { - if (obj instanceof ScrollListenerAdapter) { - return adaptee.equals(((ScrollListenerAdapter) obj).adaptee); - } else { - return super.equals(obj); - } - } -} diff --git a/modules/mogo-module-common/src/main/res/drawable/moddule_commons_shape_react_blue_grident.xml b/modules/mogo-module-common/src/main/res/drawable/moddule_commons_shape_react_blue_grident.xml new file mode 100644 index 0000000000..3c91cb81a9 --- /dev/null +++ b/modules/mogo-module-common/src/main/res/drawable/moddule_commons_shape_react_blue_grident.xml @@ -0,0 +1,14 @@ + + + + + + + + diff --git a/modules/mogo-module-common/src/main/res/drawable/module_commons_shape_react_gray_grident.xml b/modules/mogo-module-common/src/main/res/drawable/module_commons_shape_react_gray_grident.xml new file mode 100644 index 0000000000..5d90ff43e3 --- /dev/null +++ b/modules/mogo-module-common/src/main/res/drawable/module_commons_shape_react_gray_grident.xml @@ -0,0 +1,11 @@ + + + + + + + + diff --git a/modules/mogo-module-common/src/main/res/drawable/module_commons_shape_round_gray.xml b/modules/mogo-module-common/src/main/res/drawable/module_commons_shape_round_gray.xml new file mode 100644 index 0000000000..37f8498d8c --- /dev/null +++ b/modules/mogo-module-common/src/main/res/drawable/module_commons_shape_round_gray.xml @@ -0,0 +1,7 @@ + + + + + + diff --git a/modules/mogo-module-common/src/main/res/layout/module_commons_layout_wm_dialog.xml b/modules/mogo-module-common/src/main/res/layout/module_commons_layout_wm_dialog.xml new file mode 100644 index 0000000000..ae4839f484 --- /dev/null +++ b/modules/mogo-module-common/src/main/res/layout/module_commons_layout_wm_dialog.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/mogo-module-common/src/main/res/values/strings.xml b/modules/mogo-module-common/src/main/res/values/strings.xml index f6affe31b5..74f2951c89 100644 --- a/modules/mogo-module-common/src/main/res/values/strings.xml +++ b/modules/mogo-module-common/src/main/res/values/strings.xml @@ -1,5 +1,6 @@ mogo-module-common - You should not set LayoutManager on DiscreteScrollView.class instance. Library uses a special one. Just don\'t call the method. - InfiniteScrollAdapter is supposed to work only with DiscreteScrollView + 确认 + 取消 + 是否退出导航? diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceFragment.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceFragment.java index 7d95097c3e..41275ad0cc 100644 --- a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceFragment.java +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceFragment.java @@ -34,6 +34,7 @@ import com.mogo.map.uicontroller.IMogoMapUIController; import com.mogo.module.authorize.authprovider.invoke.AuthorizeConstant; import com.mogo.module.authorize.authprovider.module.IMogoAcquireAuthorizeListener; import com.mogo.module.authorize.authprovider.module.IMogoAuthorizeModuleManager; +import com.mogo.module.common.dialog.WMDialog; import com.mogo.module.common.map.MapCenterPointStrategy; import com.mogo.module.common.map.Scene; import com.mogo.module.extensions.ExtensionsModuleConst; @@ -97,7 +98,6 @@ public class EntranceFragment extends MvpFragment< EntranceView, EntrancePresent private IMogoLocationClient mMogoLocationClient; private IMogoNavi mMogoNavi; private IMogoFragmentManager mMogoFragmentManager; - private IMogoAddressManager mMogoAddressManager; private IMogoMarkerManager mMogoMarkerManager; private IMogoRegisterCenter mMogoRegisterCenter; @@ -178,7 +178,6 @@ public class EntranceFragment extends MvpFragment< EntranceView, EntrancePresent mEntrancePresenter = new EntrancePresenter( getContext(), this, mIMogoAuthorizeModuleManager ); mMogoFragmentManager = mApis.getFragmentManagerApi(); - mMogoAddressManager = mApis.getAddressManagerApi(); mStatusManager = mApis.getStatusManagerApi(); @@ -217,8 +216,16 @@ public class EntranceFragment extends MvpFragment< EntranceView, EntrancePresent mExitNavi.setOnClickListener( view -> { if ( mMogoNavi != null ) { if ( mIsLock ) { - NaviNoticeDialog naviNoticeDialog = new NaviNoticeDialog( getContext() ); - naviNoticeDialog.show(); + new WMDialog.Builder( getContext() ) + .setOkButton( R.string.module_commons_button_ok, ( dlg, which ) -> { + mMogoNavi.stopNavi(); + } ) + .setCancelButton( R.string.module_commons_button_cancel, ( dlg, which ) -> { + dlg.dismiss(); + } ) + .setContent( R.string.module_commons_exit_navi_content ) + .build() + .show(); } else { MapCenterPointStrategy.setMapCenterPointByScene( mMApUIController, Scene.NAVI ); mMApUIController.recoverLockMode(); @@ -466,10 +473,10 @@ public class EntranceFragment extends MvpFragment< EntranceView, EntrancePresent if ( mCurrentUploadFrame == mUploadingFrameRes.length ) { mCurrentUploadFrame = 12; } - mUploading.setImageResource( mUploadingFrameRes[mCurrentUploadFrame++%mUploadingFrameRes.length] ); + mUploading.setImageResource( mUploadingFrameRes[mCurrentUploadFrame++ % mUploadingFrameRes.length] ); } mUploadFrameAnimHandler.sendEmptyMessageDelayed( MSG_FRAME_ANIM, TIME_FRAME_INTERVAL_TIME ); - } else if( msg.what == MSG_STOP_ANIM ){ + } else if ( msg.what == MSG_STOP_ANIM ) { mStatusManager.setUploadingStatus( TAG, false ); } } diff --git a/modules/mogo-module-main/src/main/java/com/mogo/module/main/MainActivity.java b/modules/mogo-module-main/src/main/java/com/mogo/module/main/MainActivity.java index debafa9007..b46e8c7656 100644 --- a/modules/mogo-module-main/src/main/java/com/mogo/module/main/MainActivity.java +++ b/modules/mogo-module-main/src/main/java/com/mogo/module/main/MainActivity.java @@ -246,7 +246,7 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme protected void onResume() { super.onResume(); mMogoStatusManager.setMainPageResumeStatus( TAG, true ); - if ( mCoverUpLayout.getVisibility() == View.VISIBLE ) { + if ( mCoverUpLayout.getVisibility() != View.VISIBLE ) { mServiceApis.getAdasControllerApi().showADAS(); } } 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 81185341b8..14ec2be9ab 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 @@ -125,7 +125,7 @@ public class SchemeIntent implements IMogoStatusChangedListener { if ( mApis.getMapServiceApi().getNavi( mContext ).isNaviing() ) { mApis.getMapServiceApi().getNavi( mContext ).naviTo( new MogoLatLng( dlat, dlon ) ); } else { - mApis.getAddressManagerApi().calculatePath( new MogoLatLng( dlat, dlon ) ); + mApis.getSearchManagerApi().calculatePath( new MogoLatLng( dlat, dlon ) ); } } catch ( Exception e ) { TipToast.shortTip( "目的地异常,不能导航" ); diff --git a/modules/mogo-module-map/src/main/java/com/mogo/module/map/MapPresenter.java b/modules/mogo-module-map/src/main/java/com/mogo/module/map/MapPresenter.java index a1cec4be2c..4b740e501a 100644 --- a/modules/mogo-module-map/src/main/java/com/mogo/module/map/MapPresenter.java +++ b/modules/mogo-module-map/src/main/java/com/mogo/module/map/MapPresenter.java @@ -28,9 +28,9 @@ import com.mogo.service.intent.IMogoIntentListener; import com.mogo.service.intent.IMogoIntentManager; import com.mogo.service.launcher.IMogoLauncher; import com.mogo.service.map.IMogoMapService; -import com.mogo.service.module.IMogoAddressManager; import com.mogo.service.module.IMogoRegisterCenter; import com.mogo.service.module.IMogoSearchManager; +import com.mogo.service.module.IMogoSettingManager; import com.mogo.service.statusmanager.IMogoStatusManager; import com.mogo.service.strategy.IMogoRefreshStrategyController; import com.mogo.utils.ResourcesHelper; @@ -59,7 +59,8 @@ public class MapPresenter extends Presenter< MapView > implements private IMogoStatusManager mStatusManager; private IMogoRegisterCenter mRegisterCenter; private IMogoLauncher mLauncher; - private IMogoAddressManager mMogoAddressManager; + private IMogoSearchManager mMogoSearchManager; + private IMogoSettingManager mSettingManager; private Rect mDisplayOverviewBounds; public MapPresenter( MapView view ) { @@ -208,7 +209,7 @@ public class MapPresenter extends Presenter< MapView > implements lon = intent.getDoubleExtra( "LON", 0.0 ); } - mMogoAddressManager.calculatePath( new MogoLatLng( lat, lon ) ); + mMogoSearchManager.calculatePath( new MogoLatLng( lat, lon ) ); } /** @@ -287,7 +288,7 @@ public class MapPresenter extends Presenter< MapView > implements private void onOpenNavi() { mLauncher.backToLauncher( getContext() ); if ( !mMogoMapService.getNavi( getContext() ).isNaviing() && !mStatusManager.isSearchUIShow() ) { - mMogoAddressManager.goSearch(); + mSearchManager.showSearch(); } AIAssist.getInstance( getContext() ).speakTTSVoice( "已打开" ); } @@ -305,7 +306,8 @@ public class MapPresenter extends Presenter< MapView > implements mRegisterCenter = apis.getRegisterCenterApi(); mRegisterCenter.registerMogoNaviListener( TAG, this ); mLauncher = apis.getLauncherApi(); - mMogoAddressManager = apis.getAddressManagerApi(); + mMogoSearchManager = apis.getSearchManagerApi(); + mSettingManager = apis.getSettingManagerApi(); IMogoNavi mogoNavi = mMogoMapService.getNavi( getContext() ); mogoNavi.setCalculatePathDisplayBounds( new Rect( @@ -418,7 +420,7 @@ public class MapPresenter extends Presenter< MapView > implements break; case VoiceConstants.CMD_MAP_STOP_NAVI_MODE_UN_WAKEUP: case VoiceConstants.CMD_MAP_STOP_NAVI_MODE: - mSearchManager.showMain(); + mLauncher.backToLauncher( getContext() ); break; case VoiceConstants.CMD_MAP_NIGHT_MODE_UN_WAKEUP: case VoiceConstants.CMD_MAP_NIGHT_MODE: @@ -443,12 +445,12 @@ public class MapPresenter extends Presenter< MapView > implements break; case VoiceConstants.CMD_MAP_SPEAK_DRAFT_MODE: case VoiceConstants.CMD_MAP_SPEAK_DRAFT_MODE_UN_WAKEUP: - mSearchManager.speakDraft(); + mSettingManager.speakDraft(); AIAssist.getInstance( getContext() ).speakTTSVoice( "已切换", null ); break; case VoiceConstants.CMD_MAP_SPEAK_DETAIL_MODE: case VoiceConstants.CMD_MAP_SPEAK_DETAIL_MODE_UN_WAKEUP: - mSearchManager.speakDetail(); + mSettingManager.speakDetail(); AIAssist.getInstance( getContext() ).speakTTSVoice( "已切换", null ); break; case VoiceConstants.CMD_MAP_SPEAK_REMAIN: diff --git a/modules/mogo-module-search/src/main/AndroidManifest.xml b/modules/mogo-module-search/src/main/AndroidManifest.xml index 2d0a21723d..99b0239918 100644 --- a/modules/mogo-module-search/src/main/AndroidManifest.xml +++ b/modules/mogo-module-search/src/main/AndroidManifest.xml @@ -6,7 +6,6 @@ - + * 描述 + */ +public class SearchApisHolder { + + private static IMogoServiceApis sApis; + private static IMogoMapService sMapServiceApis; + private static IMogoMapUIController sUiControllerApis; + private static IMogoNavi sNaviApis; + private static IMogoMarkerManager sMarkerManagerApis; + private static IMogoFragmentManager sFragmentManagerApis; + private static IMogoAnalytics sAnalyticsApis; + private static IMogoLocationClient sLocationClientApis; + private static IMogoStatusManager sStatusManager; + private static IMogoRegisterCenter sRegisterCenterApis; + private static IMogoIntentManager sIntentManager; + private static IGuideShowProvider sGuideShowApis; + private static IMogoSettingManager sSettingManager; + private static IMogoGpsSimulatorManager sGpsSimulatorManager; + private static IMogoSearchManager sSearchManager; + + static { + sApis = ARouter.getInstance().navigation( IMogoServiceApis.class ); + sMapServiceApis = sApis.getMapServiceApi(); + sUiControllerApis = sMapServiceApis.getMapUIController(); + sNaviApis = sMapServiceApis.getNavi( AbsMogoApplication.getApp() ); + sMarkerManagerApis = sMapServiceApis.getMarkerManager( AbsMogoApplication.getApp() ); + sFragmentManagerApis = sApis.getFragmentManagerApi(); + sAnalyticsApis = sApis.getAnalyticsApi(); + sLocationClientApis = sMapServiceApis.getSingletonLocationClient( AbsMogoApplication.getApp() ); + sStatusManager = sApis.getStatusManagerApi(); + sRegisterCenterApis = sApis.getRegisterCenterApi(); + sIntentManager = sApis.getIntentManagerApi(); + sSettingManager = sApis.getSettingManagerApi(); + sSearchManager = sApis.getSearchManagerApi(); + sGpsSimulatorManager = ARouter.getInstance().navigation( IMogoGpsSimulatorManager.class); + sGuideShowApis = ARouter.getInstance().navigation( IGuideShowProvider.class ); + } + + public static IMogoServiceApis getApis() { + return sApis; + } + + public static IMogoMapService getMapServiceApis() { + return sMapServiceApis; + } + + public static IMogoMapUIController getUiControllerApis() { + return sUiControllerApis; + } + + public static IMogoNavi getNaviApis() { + return sNaviApis; + } + + public static IMogoMarkerManager getMarkerManager() { + return sMarkerManagerApis; + } + + public static IMogoFragmentManager getFragmentManager() { + return sFragmentManagerApis; + } + + public static IMogoAnalytics getAnalyticsApis() { + return sAnalyticsApis; + } + + public static IMogoLocationClient getLocationClientApis() { + return sLocationClientApis; + } + + public static IMogoStatusManager getStatusManager() { + return sStatusManager; + } + + public static IMogoRegisterCenter getRegisterCenterApis() { + return sRegisterCenterApis; + } + + public static IMogoIntentManager getIntentManager() { + return sIntentManager; + } + + public static IGuideShowProvider getGuideShowApis() { + return sGuideShowApis; + } + + public static IMogoSettingManager getSettingManager() { + return sSettingManager; + } + + public static IMogoGpsSimulatorManager getGpsSimulatorManager() { + return sGpsSimulatorManager; + } + + public static IMogoSearchManager getSearchManager() { + return sSearchManager; + } +} diff --git a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/constants/SearchServiceHolder.kt b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/constants/SearchServiceHolder.kt deleted file mode 100644 index ace72751bb..0000000000 --- a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/constants/SearchServiceHolder.kt +++ /dev/null @@ -1,83 +0,0 @@ -package com.mogo.module.navi.constants - -import android.annotation.SuppressLint -import android.content.Context -import androidx.fragment.app.Fragment -import com.alibaba.android.arouter.launcher.ARouter -import com.mogo.map.location.IMogoLocationClient -import com.mogo.map.marker.IMogoMarkerManager -import com.mogo.map.navi.IMogoNavi -import com.mogo.map.search.geo.IMogoGeoSearch -import com.mogo.map.uicontroller.IMogoMapUIController -import com.mogo.module.common.MogoModulePaths -import com.mogo.module.gps.simulator.GpsSimulatorConstants -import com.mogo.module.gps.simulator.IMogoGpsSimulatorManager -import com.mogo.module.guideshow.provider.GuideShowProviderConstant -import com.mogo.module.guideshow.provider.IGuideShowProvider -import com.mogo.service.IMogoServiceApis -import com.mogo.service.MogoServicePaths -import com.mogo.service.analytics.IMogoAnalytics -import com.mogo.service.fragmentmanager.FragmentDescriptor -import com.mogo.service.fragmentmanager.IMogoFragmentManager -import com.mogo.service.intent.IMogoIntentManager -import com.mogo.service.launcher.IMogoLauncher -import com.mogo.service.map.IMogoMapService -import com.mogo.service.module.IMogoRegisterCenter -import com.mogo.service.statusmanager.IMogoStatusManager - -/** - *@author zyz - * 2020-01-08. - */ -@SuppressLint("StaticFieldLeak") -object SearchServiceHolder { - // 单例对象,要使用Application Context - private lateinit var context: Context - - val fragmentManager: IMogoFragmentManager = ARouter.getInstance().build(MogoServicePaths.PATH_FRAGMENT_MANAGER).navigation() as IMogoFragmentManager - val mapService: IMogoMapService = ARouter.getInstance().build(MogoServicePaths.PATH_SERVICES_MAP).navigation() as IMogoMapService - val listenerCenter: IMogoRegisterCenter = ARouter.getInstance().build(MogoServicePaths.PATH_REGISTER_CENTER).navigation() as IMogoRegisterCenter - val statusManager: IMogoStatusManager = ARouter.getInstance().build(MogoServicePaths.PATH_STATUS_MANAGER).navigation() as IMogoStatusManager - val analyticsManager: IMogoAnalytics = ARouter.getInstance().build(MogoServicePaths.PATH_UTILS_ANALYTICS).navigation() as IMogoAnalytics - val guideShowProvider: IGuideShowProvider = ARouter.getInstance().build(GuideShowProviderConstant.GUIDE_SHOW_PROVIDER).navigation() as IGuideShowProvider - val mogoLauncher: IMogoLauncher = ARouter.getInstance().build(MogoServicePaths.PATH_LAUNCHER_API).navigation() as IMogoLauncher - val gpsSimulator = ARouter.getInstance().build(GpsSimulatorConstants.API_PATH).navigation() as IMogoGpsSimulatorManager - val intentManager = ARouter.getInstance().build(MogoServicePaths.PATH_INTENT_MANAGER).navigation() as IMogoIntentManager - val apis = ARouter.getInstance().navigation(IMogoServiceApis::class.java) - var geoSearch: IMogoGeoSearch? = null - fun init(context: Context) { - this.context = context - - } - - fun push(fragment: Fragment, tag: String) { - val builder = FragmentDescriptor.Builder() - builder.fragment(fragment) - val build = builder.tag(tag).build() - fragmentManager.push(build) - } - - fun getNavi(): IMogoNavi { - return mapService.getNavi(context) - } - - fun getLocationClient(): IMogoLocationClient { - return mapService.getLocationClient(context) - } - - fun getMapUIController(): IMogoMapUIController { - return mapService.mapUIController - } - - fun getMarkerManger(): IMogoMarkerManager { - return mapService.getMarkerManager(context) - } - - fun getGeoSearcher(): IMogoGeoSearch { - if (geoSearch == null) { - geoSearch = mapService.getGeoSearch(context) - } - return geoSearch!! - } - -} \ No newline at end of file diff --git a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/manager/AddressManager.kt b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/manager/AddressManager.kt index 1817c3163b..85ec044c4a 100644 --- a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/manager/AddressManager.kt +++ b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/manager/AddressManager.kt @@ -2,15 +2,15 @@ package com.mogo.module.navi.manager import android.annotation.SuppressLint import android.content.Context +import androidx.fragment.app.Fragment import com.mogo.map.MogoLatLng -import com.mogo.module.common.MogoModulePaths import com.mogo.module.common.map.MapCenterPointStrategy import com.mogo.module.common.map.Scene import com.mogo.module.navi.bean.EntityConvertUtils import com.mogo.module.navi.bean.SearchPoi import com.mogo.module.navi.constants.AMapConstants import com.mogo.module.navi.constants.DataConstants -import com.mogo.module.navi.constants.SearchServiceHolder +import com.mogo.module.navi.constants.SearchApisHolder import com.mogo.module.navi.cp.AddressHelper import com.mogo.module.navi.dao.SearchPoiDao import com.mogo.module.navi.database.AppDataBase @@ -47,14 +47,6 @@ object AddressManager { return companyAddress != null } - private fun choosePoint(type: Int){ - MapCenterPointStrategy.setMapCenterPointByScene(SearchServiceHolder.getMapUIController(), Scene.CHOOSE_POINT) - val builder = FragmentDescriptor.Builder() - builder.fragment(SettingAddressFragment.newInstance(type)) - val build = builder.tag(AMapConstants.PATH_FRAGMENT_SETTING_HOME).build() - SearchServiceHolder.fragmentManager.push(build) - } - private lateinit var context: Context @SuppressLint("CheckResult") fun init(context: Context) { @@ -64,7 +56,7 @@ object AddressManager { poiDao.companyAddress .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .subscribe { t1, t2 -> + .subscribe { t1, _ -> if (t1.size > 0) { companyAddress = t1[0] } @@ -73,7 +65,7 @@ object AddressManager { poiDao.homeAddress .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .subscribe { t1, t2 -> + .subscribe { t1, _ -> if (t1.size > 0) { homeAddress = t1[0] } @@ -90,7 +82,7 @@ object AddressManager { } } - fun deleteHome(context: Context) { + fun deleteHome() { Observable.create( ObservableOnSubscribe { poiDao.delete(homeAddress) @@ -105,7 +97,7 @@ object AddressManager { } - fun deleteCompany(context: Context) { + fun deleteCompany() { Observable.create( ObservableOnSubscribe { poiDao.delete(companyAddress) @@ -122,8 +114,6 @@ object AddressManager { * 回家 */ fun goHome() { - closeADAS() - SearchServiceHolder.statusManager.setSearchUIShow(TAG, true) if (homeAddress == null) { choosePoint(DataConstants.TYPE_HOME_ADDRESS) } else { @@ -131,14 +121,18 @@ object AddressManager { } } + private fun choosePoint(type: Int) { + beforePushFragment() + MapCenterPointStrategy.setMapCenterPointByScene(SearchApisHolder.getUiControllerApis(), Scene.CHOOSE_POINT) + pushFragment(SettingAddressFragment.newInstance(type), AMapConstants.PATH_FRAGMENT_SETTING_HOME, true) + } + /** * 去公司 */ fun goCompany() { - closeADAS() - SearchServiceHolder.statusManager.setSearchUIShow(TAG, true) if (companyAddress == null) { - choosePoint( DataConstants.TYPE_COMPANY_ADDRESS) + choosePoint(DataConstants.TYPE_COMPANY_ADDRESS) } else { calculatePath(EntityConvertUtils.poi2MogoTip(companyAddress).point) } @@ -148,14 +142,8 @@ object AddressManager { * 搜索 */ fun goSearch() { - closeADAS() - SearchServiceHolder.statusManager.setSearchUIShow(TAG, true) - SearchServiceHolder.fragmentManager.push( - FragmentDescriptor.Builder().fragment(SearchFragment()) - .tag(AMapConstants.PATH_FRAGMENT_SEARCH) - .notifyMainModule(true) - .build() - ) + beforePushFragment() + pushFragment(SearchFragment(), AMapConstants.PATH_FRAGMENT_SEARCH, true) } /** @@ -163,34 +151,43 @@ object AddressManager { */ fun calculatePath(destination: MogoLatLng?) { destination?.let { - closeADAS() - var newInstance = ChoosePathFragment.newInstance(destination) - SearchServiceHolder.push(newInstance, AMapConstants.PATH_FRAGMENT_CHOOSE_PATH) + beforePushFragment() + MapCenterPointStrategy.setMapCenterPointByScene(SearchApisHolder.getUiControllerApis(), Scene.CALCULATE_PATH) + pushFragment(ChoosePathFragment.newInstance(destination), AMapConstants.PATH_FRAGMENT_CHOOSE_PATH, true) } } - fun categorySearch(category: String){ - closeADAS() - val searchFragment = CategorySearchFragment.newInstance(category) - SearchServiceHolder.fragmentManager.push(FragmentDescriptor.Builder().fragment(searchFragment) - .tag(AMapConstants.PATH_FRAGMENT_SEARCH_CATEGORY) - .notifyMainModule(true) - .build()) + fun categorySearch(category: String) { + beforePushFragment() + pushFragment(CategorySearchFragment.newInstance(category), AMapConstants.PATH_FRAGMENT_SEARCH_CATEGORY, true) } - fun goSettings(){ + fun goSettings() { + beforePushFragment() + pushFragment(NaviSettingFragment(), AMapConstants.PATH_FRAGMENT_NAVI_SETTING, true) + } + + private fun beforePushFragment() { closeADAS() - val naviSettingFragment = NaviSettingFragment() - SearchServiceHolder.fragmentManager.push(FragmentDescriptor.Builder().fragment(naviSettingFragment) - .tag(AMapConstants.PATH_FRAGMENT_NAVI_SETTING) - .notifyMainModule(true) - .build()) + if (!SearchApisHolder.getStatusManager().isSearchUIShow) { + SearchApisHolder.getStatusManager().setSearchUIShow(TAG, true) + } + } + + private fun pushFragment(fragment: Fragment, tag: String, notifyMain: Boolean) { + SearchApisHolder.getFragmentManager().push( + FragmentDescriptor.Builder() + .fragment(fragment) + .tag(tag) + .notifyMainModule(notifyMain) + .build() + ) } private fun closeADAS() { try { - SearchServiceHolder.apis.adasControllerApi.closeADAS() + SearchApisHolder.getApis().adasControllerApi.closeADAS() } catch (e: Exception) { e.printStackTrace() } diff --git a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/manager/MogoAddressManager.java b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/manager/MogoAddressManager.java index 8c2204f9f8..e5b4c314f6 100644 --- a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/manager/MogoAddressManager.java +++ b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/manager/MogoAddressManager.java @@ -4,51 +4,56 @@ import android.content.Context; import com.alibaba.android.arouter.facade.annotation.Route; import com.mogo.map.MogoLatLng; -import com.mogo.module.navi.constants.SearchServiceHolder; import com.mogo.service.MogoServicePaths; import com.mogo.service.module.IMogoAddressManager; +import com.mogo.service.module.IMogoSearchManager; +import com.mogo.utils.logger.Logger; /** * @author zyz * 2020-01-12. + *

+ * Deprecated, use {@link IMogoSearchManager} instead. */ + +@Deprecated @Route( path = MogoServicePaths.PATH_ADDRESS_MANAGER ) public class MogoAddressManager implements IMogoAddressManager { + private static final String TAG = "MogoAddressManager"; + @Override public void goHome() { - AddressManager.INSTANCE.goHome(); + Logger.w( TAG, "Deprecated, use IMogoSearchManager instead." ); } @Override public void goCompany() { - AddressManager.INSTANCE.goCompany(); + Logger.w( TAG, "Deprecated, use IMogoSearchManager instead." ); } @Override public void goSearch() { - AddressManager.INSTANCE.goSearch(); + Logger.w( TAG, "Deprecated, use IMogoSearchManager instead." ); } @Override public void calculatePath( MogoLatLng destination ) { - AddressManager.INSTANCE.calculatePath( destination ); + Logger.w( TAG, "Deprecated, use IMogoSearchManager instead." ); } @Override public void categorySearch( String category ) { - AddressManager.INSTANCE.categorySearch( category ); + Logger.w( TAG, "Deprecated, use IMogoSearchManager instead." ); } @Override public void goSettings() { - AddressManager.INSTANCE.goSettings(); + Logger.w( TAG, "Deprecated, use IMogoSearchManager instead." ); } @Override public void init( Context context ) { - AddressManager.INSTANCE.init( context ); - SearchServiceHolder.INSTANCE.init( context ); - SettingManager.INSTANCE.init( context ); + Logger.w( TAG, "Deprecated, use IMogoSearchManager instead." ); } } diff --git a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/manager/MogoSearchManager.java b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/manager/MogoSearchManager.java index 75a749ba67..db988b10af 100644 --- a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/manager/MogoSearchManager.java +++ b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/manager/MogoSearchManager.java @@ -1,53 +1,55 @@ package com.mogo.module.navi.manager; import android.content.Context; -import androidx.fragment.app.Fragment; + import com.alibaba.android.arouter.facade.annotation.Route; -import com.mogo.map.constants.BroadcastMode; -import com.mogo.module.common.MogoModulePaths; -import com.mogo.module.navi.constants.AMapConstants; -import com.mogo.module.navi.constants.SearchServiceHolder; -import com.mogo.module.navi.ui.search.CategorySearchFragment; -import com.mogo.module.navi.ui.search.SearchFragment; +import com.mogo.map.MogoLatLng; +import com.mogo.module.navi.constants.SearchApisHolder; import com.mogo.service.MogoServicePaths; -import com.mogo.service.fragmentmanager.FragmentDescriptor; import com.mogo.service.module.IMogoSearchManager; /** * @author zyz * 2020-01-13. */ -@Route(path = MogoServicePaths.PATH_SEARCH_MANAGER) +@Route( path = MogoServicePaths.PATH_SEARCH_MANAGER ) public class MogoSearchManager implements IMogoSearchManager { - @Override public void goHome() { + @Override + public void goHome() { AddressManager.INSTANCE.goHome(); } - @Override public void goCompany() { + @Override + public void goCompany() { AddressManager.INSTANCE.goCompany(); } - @Override public void showSearch() { + @Override + public void showSearch() { + if ( SearchApisHolder.getNaviApis().isNaviing() ) { + return; + } AddressManager.INSTANCE.goSearch(); } - @Override public void showMain() { - SearchServiceHolder.INSTANCE.getFragmentManager().clearAll(); - } - - @Override public void speakDraft() { - SearchServiceHolder.INSTANCE.getNavi().setBroadcastMode(BroadcastMode.CONCISE); - } - - @Override public void speakDetail() { - SearchServiceHolder.INSTANCE.getNavi().setBroadcastMode(BroadcastMode.DETAIL); - } - - @Override public void showCategory(String keyword) { + @Override + public void categorySearch( String keyword ) { AddressManager.INSTANCE.categorySearch( keyword ); } - @Override public void init(Context context) { + @Override + public void calculatePath( MogoLatLng destination ) { + AddressManager.INSTANCE.calculatePath( destination ); + } + @Override + public void goSettings() { + AddressManager.INSTANCE.goSettings(); + } + + @Override + public void init( Context context ) { + AddressManager.INSTANCE.init( context ); + SettingManager.INSTANCE.init( context ); } } diff --git a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/manager/MogoSettingManager.java b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/manager/MogoSettingManager.java index c5272a9e4e..89e2199d60 100644 --- a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/manager/MogoSettingManager.java +++ b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/manager/MogoSettingManager.java @@ -1,7 +1,7 @@ package com.mogo.module.navi.manager; import android.content.Context; -import android.content.SharedPreferences; + import com.alibaba.android.arouter.facade.annotation.Route; import com.mogo.service.MogoServicePaths; import com.mogo.service.module.IMogoSettingManager; @@ -14,23 +14,49 @@ import com.mogo.service.module.IMogoSettingManager; @Route( path = MogoServicePaths.PATH_SETTING_MANAGER ) public class MogoSettingManager implements IMogoSettingManager { - @Override public int getPathPrefer() { + @Override + public int getPathPrefer() { return SettingManager.INSTANCE.getPathPrefer(); } - @Override public int getVolume() { + @Override + public int getVolume() { return SettingManager.INSTANCE.getVolume(); } - @Override public int getVoiceStyle() { + @Override + public int getVoiceStyle() { return SettingManager.INSTANCE.getVoiceStyle(); } - @Override public int getMapType() { + @Override + public int getMapType() { return SettingManager.INSTANCE.getMapType(); } - @Override public void init(Context context) { - SettingManager.INSTANCE.init(context); + @Override + public void init( Context context ) { + SettingManager.INSTANCE.init( context ); + } + + + @Override + public void speakDraft() { + SettingManager.INSTANCE.speakDraft(); + } + + @Override + public void speakDetail() { + SettingManager.INSTANCE.speakDetail(); + } + + @Override + public void openAimlessMode() { + SettingManager.INSTANCE.openAimlessMode(); + } + + @Override + public void closeAimlessMode() { + SettingManager.INSTANCE.closeAimlessMode(); } } diff --git a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/manager/SettingManager.kt b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/manager/SettingManager.kt index 4237428e43..064460aa8c 100644 --- a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/manager/SettingManager.kt +++ b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/manager/SettingManager.kt @@ -2,9 +2,9 @@ package com.mogo.module.navi.manager import android.content.Context import android.content.SharedPreferences -import com.mogo.map.navi.MogoNaviConfig +import com.mogo.map.constants.BroadcastMode import com.mogo.module.navi.R -import com.mogo.module.navi.constants.SearchServiceHolder +import com.mogo.module.navi.constants.SearchApisHolder import com.mogo.service.module.IMogoSettingManager /** @@ -187,7 +187,7 @@ object SettingManager : IMogoSettingManager { } private fun updateConfig() { - SearchServiceHolder.getNavi() + SearchApisHolder.getNaviApis() .naviConfig .cost(cost) .avoidSpeed(avoidSpeed) @@ -195,12 +195,31 @@ object SettingManager : IMogoSettingManager { .congestion(congestion) } - fun setAimlessMode(type: Int){ + fun setAimlessMode(type: Int) { settings.edit().putInt(KEY_AIMLESS_MODE_TYPE, type).apply() } - fun getAimlessMode():Int { + fun getAimlessMode(): Int { return settings.getInt(KEY_AIMLESS_MODE_TYPE, R.id.aimlessModeClose) } + override fun speakDraft() { + voiceStyle = R.id.rb_navi_draft + SearchApisHolder.getNaviApis().setBroadcastMode(BroadcastMode.CONCISE) + } + + override fun speakDetail() { + voiceStyle = R.id.rb_navi_detail + SearchApisHolder.getNaviApis().setBroadcastMode(BroadcastMode.DETAIL) + } + + override fun openAimlessMode() { + setAimlessMode(R.id.aimlessModeOpen) + SearchApisHolder.getNaviApis().setAimlessModeStatus(true) + } + + override fun closeAimlessMode() { + setAimlessMode(R.id.aimlessModeClose) + SearchApisHolder.getNaviApis().setAimlessModeStatus(false) + } } diff --git a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/NaviActivity.kt b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/NaviActivity.kt deleted file mode 100644 index 70eb32f28f..0000000000 --- a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/NaviActivity.kt +++ /dev/null @@ -1,20 +0,0 @@ -package com.mogo.module.navi.ui - -import android.os.Bundle -import androidx.fragment.app.Fragment -import com.alibaba.android.arouter.launcher.ARouter -import com.mogo.module.navi.R -import com.mogo.module.navi.ui.base.BaseActivity - -class NaviActivity : BaseActivity() { - - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_navi) - var fragment = ARouter.getInstance() - .build("/navi/search") - .navigation() as Fragment - supportFragmentManager.beginTransaction().replace(R.id.fl_container,fragment).commitNow() - } -} diff --git a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/base/BaseFragment.java b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/base/BaseFragment.java index 73b329da13..4843914c4a 100644 --- a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/base/BaseFragment.java +++ b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/base/BaseFragment.java @@ -6,12 +6,12 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Toast; + import androidx.annotation.IdRes; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; -import com.mogo.module.common.MogoModulePaths; -import com.mogo.module.navi.constants.SearchServiceHolder; + import com.mogo.utils.NetworkUtils; /** diff --git a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/search/BaseSearchFragment.java b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/search/BaseSearchFragment.java index a1651a052a..59be513933 100644 --- a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/search/BaseSearchFragment.java +++ b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/search/BaseSearchFragment.java @@ -101,10 +101,6 @@ public abstract class BaseSearchFragment extends BaseFragment implements SearchV return mSearchType; } - @Override public void startJumpAnimation() { - - } - //@Override //public void renderChoicePointResult( RegeocodeAddress address ) { // if ( address == null ) { diff --git a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/search/CategoryPresenter.java b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/search/CategoryPresenter.java index 4dc1c77384..13ca942301 100644 --- a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/search/CategoryPresenter.java +++ b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/search/CategoryPresenter.java @@ -1,41 +1,17 @@ package com.mogo.module.navi.ui.search; -import android.app.AlertDialog; -import android.text.Editable; -import android.text.TextUtils; -import android.widget.EditText; import androidx.annotation.NonNull; import androidx.lifecycle.LifecycleOwner; -import com.alibaba.android.arouter.launcher.ARouter; + import com.mogo.commons.mvp.Presenter; import com.mogo.map.search.geo.MogoPoiItem; -import com.mogo.map.search.inputtips.IMogoInputtipsListener; -import com.mogo.map.search.inputtips.IMogoInputtipsSearch; -import com.mogo.map.search.inputtips.MogoTip; -import com.mogo.map.search.inputtips.query.MogoInputtipsQuery; import com.mogo.map.search.poisearch.IMogoPoiSearch; import com.mogo.map.search.poisearch.IMogoPoiSearchListener; import com.mogo.map.search.poisearch.MogoPoiResult; import com.mogo.map.search.poisearch.query.MogoPoiSearchQuery; -import com.mogo.module.common.TextWatcherAdapter; -import com.mogo.module.navi.bean.EntityConvertUtils; -import com.mogo.module.navi.bean.SearchPoi; -import com.mogo.module.navi.constants.DataConstants; -import com.mogo.module.navi.constants.SearchServiceHolder; -import com.mogo.module.navi.database.AppDataBase; -import com.mogo.service.MogoServicePaths; -import com.mogo.service.map.IMogoMapService; -import io.reactivex.Observable; -import io.reactivex.ObservableEmitter; -import io.reactivex.ObservableOnSubscribe; -import io.reactivex.Single; -import io.reactivex.SingleEmitter; -import io.reactivex.android.schedulers.AndroidSchedulers; +import com.mogo.module.navi.constants.SearchApisHolder; + import io.reactivex.disposables.CompositeDisposable; -import io.reactivex.disposables.Disposable; -import io.reactivex.functions.Consumer; -import io.reactivex.schedulers.Schedulers; -import java.util.List; /** * @author congtaowang @@ -43,55 +19,50 @@ import java.util.List; *

* 搜搜页逻辑处理 */ -public class CategoryPresenter extends Presenter { +public class CategoryPresenter extends Presenter< CategoryView > { private CompositeDisposable mCompositeDisposable; - private IMogoMapService mMapService; - public CategoryPresenter(CategoryView view) { - super(view); + public CategoryPresenter( CategoryView view ) { + super( view ); mCompositeDisposable = new CompositeDisposable(); } @Override - public void onCreate(@NonNull LifecycleOwner owner) { - super.onCreate(owner); - mMapService = (IMogoMapService) ARouter.getInstance() - .build(MogoServicePaths.PATH_SERVICES_MAP) - .navigation(getContext()); + public void onCreate( @NonNull LifecycleOwner owner ) { + super.onCreate( owner ); } - public void startSearchLocalPoiByInput(String keyword) { - MogoPoiSearchQuery mogoInputtipsQuery = new MogoPoiSearchQuery(keyword, keyword); - mogoInputtipsQuery.setPageSize(10); - mogoInputtipsQuery.setLocation( - SearchServiceHolder.INSTANCE.getMapUIController().getWindowCenterLocation()); - IMogoPoiSearch inputtipsSearch = - mMapService.getPoiSearch(getContext(), mogoInputtipsQuery); + public void startSearchLocalPoiByInput( String keyword ) { - inputtipsSearch.setPoiSearchListener(new IMogoPoiSearchListener() { - @Override public void onPoiSearched(MogoPoiResult result, int errorCode) { + MogoPoiSearchQuery poiSearchQuery = new MogoPoiSearchQuery( keyword, keyword ); + poiSearchQuery.setPageSize( 10 ); + poiSearchQuery.setLocation( SearchApisHolder.getUiControllerApis().getWindowCenterLocation() ); + IMogoPoiSearch poiSearch = SearchApisHolder.getMapServiceApis().getPoiSearch( getContext(), poiSearchQuery ); + + poiSearch.setPoiSearchListener( new IMogoPoiSearchListener() { + @Override + public void onPoiSearched( MogoPoiResult result, int errorCode ) { if ( result != null ) { - mView.renderSearchPoiResult(result.getPois()); + mView.renderSearchPoiResult( result.getPois() ); } } - @Override public void onPoiItemSearched(MogoPoiItem item, int errorCode) { + @Override + public void onPoiItemSearched( MogoPoiItem item, int errorCode ) { } - }); - inputtipsSearch.searchPOIAsyn(); + } ); + poiSearch.searchPOIAsyn(); } - @Override - public void onDestroy(@NonNull LifecycleOwner owner) { - super.onDestroy(owner); - if (mCompositeDisposable != null && !mCompositeDisposable.isDisposed()) { + public void onDestroy( @NonNull LifecycleOwner owner ) { + super.onDestroy( owner ); + if ( mCompositeDisposable != null && !mCompositeDisposable.isDisposed() ) { mCompositeDisposable.dispose(); mCompositeDisposable = null; } - //CameraChangedLiveData.getInstance().removeAllObserver(); } } diff --git a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/search/CategorySearchFragment.kt b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/search/CategorySearchFragment.kt index 3fbb093871..1d5fc1d0af 100644 --- a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/search/CategorySearchFragment.kt +++ b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/search/CategorySearchFragment.kt @@ -4,7 +4,6 @@ import android.graphics.Bitmap import android.graphics.BitmapFactory import android.graphics.Rect import android.os.Bundle -import android.text.TextUtils import android.view.View import androidx.fragment.app.Fragment import androidx.recyclerview.widget.LinearLayoutManager @@ -15,26 +14,16 @@ import com.mogo.map.marker.IMogoMarker import com.mogo.map.marker.IMogoMarkerClickListener import com.mogo.map.marker.MogoMarkerOptions import com.mogo.map.search.geo.MogoPoiItem -import com.mogo.map.search.inputtips.MogoTip -import com.mogo.module.common.MogoModulePaths import com.mogo.module.common.map.MapCenterPointStrategy import com.mogo.module.common.map.Scene import com.mogo.module.navi.R -import com.mogo.module.navi.bean.SearchPoi -import com.mogo.module.navi.constants.AMapConstants -import com.mogo.module.navi.constants.SearchServiceHolder +import com.mogo.module.navi.constants.SearchApisHolder import com.mogo.module.navi.manager.AddressManager import com.mogo.module.navi.ui.adapter.SearchCategoryAdapter import com.mogo.module.navi.ui.base.BaseFragment import com.mogo.module.navi.uitls.BitmapUtils import com.mogo.module.navi.uitls.StringUtils -import com.mogo.utils.UiThreadHandler -import kotlinx.android.synthetic.main.fragment_search_category.cv_search_result -import kotlinx.android.synthetic.main.fragment_search_category.et_navi_search -import kotlinx.android.synthetic.main.fragment_search_category.iv_navi_back -import kotlinx.android.synthetic.main.fragment_search_category.pb_path -import kotlinx.android.synthetic.main.fragment_search_category.rv_search_result -import kotlinx.android.synthetic.main.fragment_search_category.tv_navi_navi +import kotlinx.android.synthetic.main.fragment_search_category.* /** * @author zyz @@ -112,7 +101,7 @@ class CategorySearchFragment : BaseFragment(), CategoryView, IMogoVoiceCmdCallBa private fun addMarkers() { addMarkers.clear() var marginBounder = resources.getDimensionPixelSize(R.dimen.dp_60) * 2 - SearchServiceHolder.getMapUIController().showBounds(TAG, + SearchApisHolder.getUiControllerApis().showBounds(TAG, null, locationList, Rect(cv_search_result.width + marginBounder, marginBounder, marginBounder, marginBounder), @@ -120,7 +109,7 @@ class CategorySearchFragment : BaseFragment(), CategoryView, IMogoVoiceCmdCallBa ) for (options in arrayList) { - var addMarker = SearchServiceHolder.getMarkerManger().addMarker(TAG, options) + var addMarker = SearchApisHolder.getMarkerManager().addMarker(TAG, options) addMarker.onMarkerClickListener = this addMarkers.add(addMarker) } @@ -180,7 +169,7 @@ class CategorySearchFragment : BaseFragment(), CategoryView, IMogoVoiceCmdCallBa iv_navi_back.setOnClickListener { - SearchServiceHolder.fragmentManager.pop() + SearchApisHolder.getFragmentManager().pop() } tv_navi_navi.setOnClickListener { @@ -210,8 +199,8 @@ class CategorySearchFragment : BaseFragment(), CategoryView, IMogoVoiceCmdCallBa arrayList.get(mAdapter.lastPosition).icon(getMarkerIcon(mAdapter.lastPosition)) arrayList.get(mAdapter.current).icon(getMarkerIcon(mAdapter.current)) if (moveToCenter) { - SearchServiceHolder.statusManager.setUserInteractionStatus(TAG, true, false) - SearchServiceHolder.getMapUIController().moveToCenter(current.position) + SearchApisHolder.getStatusManager().setUserInteractionStatus(TAG, true, false) + SearchApisHolder.getUiControllerApis().moveToCenter(current.position, true) } } @@ -236,7 +225,7 @@ class CategorySearchFragment : BaseFragment(), CategoryView, IMogoVoiceCmdCallBa super.onDestroyView() mSearchPresenter.onDestroy(viewLifecycleOwner) lifecycle.removeObserver(mSearchPresenter) - SearchServiceHolder.getMarkerManger().removeMarkers(TAG) + SearchApisHolder.getMarkerManager().removeMarkers(TAG) unRegisterVoice() } @@ -253,7 +242,7 @@ class CategorySearchFragment : BaseFragment(), CategoryView, IMogoVoiceCmdCallBa companion object { fun newInstance(category: String): Fragment { - MapCenterPointStrategy.setMapCenterPointByScene(SearchServiceHolder.getMapUIController(), Scene.CATEGORY_SEARCH) + MapCenterPointStrategy.setMapCenterPointByScene(SearchApisHolder.getUiControllerApis(), Scene.CATEGORY_SEARCH) var bundle = Bundle() bundle.putString("category", category) var categorySerachFragment = CategorySearchFragment() diff --git a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/search/ChoosePathFragment.kt b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/search/ChoosePathFragment.kt index 0abd48fc46..c3d8767760 100644 --- a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/search/ChoosePathFragment.kt +++ b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/search/ChoosePathFragment.kt @@ -11,13 +11,10 @@ import com.mogo.commons.voice.IMogoVoiceCmdCallBack import com.mogo.map.MogoLatLng import com.mogo.map.navi.IMogoNaviListener import com.mogo.map.navi.MogoCalculatePath -import com.mogo.map.navi.MogoNaviConfig -import com.mogo.module.common.map.MapCenterPointStrategy -import com.mogo.module.common.map.Scene import com.mogo.module.navi.R import com.mogo.module.navi.constants.AMapConstants import com.mogo.module.navi.constants.DataConstants -import com.mogo.module.navi.constants.SearchServiceHolder +import com.mogo.module.navi.constants.SearchApisHolder import com.mogo.module.navi.manager.SettingManager import com.mogo.module.navi.ui.adapter.CalculatePathAdapter import com.mogo.module.navi.ui.base.BaseFragment @@ -72,7 +69,7 @@ class ChoosePathFragment : BaseFragment(), IMogoNaviListener, IMogoVoiceCmdCallB retry() } "cancel" -> { - SearchServiceHolder.fragmentManager.clearAll() + SearchApisHolder.getFragmentManager().clearAll() } } } @@ -84,7 +81,7 @@ class ChoosePathFragment : BaseFragment(), IMogoNaviListener, IMogoVoiceCmdCallB } override fun onCalculateSuccess() { - var calculatedStrategies = SearchServiceHolder.getNavi().calculatedStrategies + var calculatedStrategies = SearchApisHolder.getNaviApis().calculatedStrategies if (calculatedStrategies != null && calculatedStrategies.size > 0) { mAdapter.setDatas(calculatedStrategies) mAdapter.selectTag = calculatedStrategies[0].tagId @@ -95,7 +92,9 @@ class ChoosePathFragment : BaseFragment(), IMogoNaviListener, IMogoVoiceCmdCallB if (calculatedStrategies.isNullOrEmpty()) { return@postDelayed } - SearchServiceHolder.getNavi().itemClickInteraction.onItemClicked(calculatedStrategies[0].tagId) + if (SearchApisHolder.getNaviApis().itemClickInteraction != null) { + SearchApisHolder.getNaviApis().itemClickInteraction.onItemClicked(calculatedStrategies[0].tagId) + } if (calculatedStrategies.size == 1) { // 一条路线,自动开启导航 @@ -157,16 +156,16 @@ class ChoosePathFragment : BaseFragment(), IMogoNaviListener, IMogoVoiceCmdCallB super.onViewCreated(view, savedInstanceState) iv_navi_back.setOnClickListener { - SearchServiceHolder.fragmentManager.pop() + SearchApisHolder.getFragmentManager().pop() } tv_navi_navi.text = getString(R.string.start_navi) et_navi_search.setText(getString(R.string.choose_path)) et_navi_search.isEnabled = false - SearchServiceHolder.getNavi().naviTo(mogoTip) + SearchApisHolder.getNaviApis().naviTo(mogoTip) - SearchServiceHolder.listenerCenter.registerMogoNaviListener(AMapConstants.PATH_FRAGMENT_CHOOSE_PATH, this) + SearchApisHolder.getRegisterCenterApis().registerMogoNaviListener(AMapConstants.PATH_FRAGMENT_CHOOSE_PATH, this) var arrayList = ArrayList() mAdapter = CalculatePathAdapter(activity, arrayList) @@ -181,7 +180,7 @@ class ChoosePathFragment : BaseFragment(), IMogoNaviListener, IMogoVoiceCmdCallB } } - SearchServiceHolder.getNavi().setLineClickInteraction { + SearchApisHolder.getNaviApis().setLineClickInteraction { mAdapter.selectTag = it } @@ -190,7 +189,7 @@ class ChoosePathFragment : BaseFragment(), IMogoNaviListener, IMogoVoiceCmdCallB selectPath(item) } - SearchServiceHolder.getMarkerManger().removeMarkers() + SearchApisHolder.getMarkerManager().removeMarkers() DataConstants.sCmds.entries.filter { it != null && !TextUtils.isEmpty(it.key) && (it.value?.isNotEmpty() ?: false) @@ -198,8 +197,8 @@ class ChoosePathFragment : BaseFragment(), IMogoNaviListener, IMogoVoiceCmdCallB AIAssist.getInstance(mContext).registerUnWakeupCommand(it.key, it.value, this@ChoosePathFragment) } - SearchServiceHolder.intentManager.registerIntentListener(AMapConstants.COMMAND_START_NAVI, this) - SearchServiceHolder.intentManager.registerIntentListener(AMapConstants.COMMAND_CHOOSE_PATH, this) + SearchApisHolder.getIntentManager().registerIntentListener(AMapConstants.COMMAND_START_NAVI, this) + SearchApisHolder.getIntentManager().registerIntentListener(AMapConstants.COMMAND_CHOOSE_PATH, this) } private fun registerRetryVoice() { @@ -211,7 +210,7 @@ class ChoosePathFragment : BaseFragment(), IMogoNaviListener, IMogoVoiceCmdCallB } private fun retry() { - SearchServiceHolder.getNavi().naviTo(mogoTip) + SearchApisHolder.getNaviApis().naviTo(mogoTip) pb_path.visibility = View.VISIBLE group_path.visibility = View.GONE } @@ -221,28 +220,30 @@ class ChoosePathFragment : BaseFragment(), IMogoNaviListener, IMogoVoiceCmdCallB return } - SearchServiceHolder.getNavi().startNavi(!SettingManager.isMonitor()) - SearchServiceHolder.getMapUIController().recoverLockMode() + SearchApisHolder.getNaviApis().startNavi(!SettingManager.isMonitor()) + SearchApisHolder.getUiControllerApis().recoverLockMode() - if (SearchServiceHolder.guideShowProvider.isPlayingVideo()) { - SearchServiceHolder.guideShowProvider.closeGuideShowView() + if (SearchApisHolder.getGuideShowApis().isPlayingVideo()) { + SearchApisHolder.getGuideShowApis().closeGuideShowView() } isStartedNavi = true - SearchServiceHolder.fragmentManager.clearAll() + SearchApisHolder.getFragmentManager().clearAll() } private fun selectPath(item: MogoCalculatePath?) { item?.let { mAdapter.setSelectTag(item.tagId) - SearchServiceHolder.getNavi().itemClickInteraction.onItemClicked(item.tagId) + if (SearchApisHolder.getNaviApis().itemClickInteraction != null) { + SearchApisHolder.getNaviApis().itemClickInteraction.onItemClicked(item.tagId) + } } } override fun onDestroyView() { super.onDestroyView() - SearchServiceHolder.listenerCenter.unregisterMogoNaviListener(AMapConstants.PATH_FRAGMENT_CHOOSE_PATH) + SearchApisHolder.getRegisterCenterApis().unregisterMogoNaviListener(AMapConstants.PATH_FRAGMENT_CHOOSE_PATH) if (!isStartedNavi) { - SearchServiceHolder.getNavi().clearCalculatePaths() + SearchApisHolder.getNaviApis().clearCalculatePaths() } DataConstants.sCmds.entries.filter { @@ -251,8 +252,8 @@ class ChoosePathFragment : BaseFragment(), IMogoNaviListener, IMogoVoiceCmdCallB AIAssist.getInstance(mContext).unregisterUnWakeupCommand(it.key) } - SearchServiceHolder.intentManager.unregisterIntentListener(AMapConstants.COMMAND_START_NAVI, this) - SearchServiceHolder.intentManager.unregisterIntentListener(AMapConstants.COMMAND_CHOOSE_PATH, this) + SearchApisHolder.getIntentManager().unregisterIntentListener(AMapConstants.COMMAND_START_NAVI, this) + SearchApisHolder.getIntentManager().unregisterIntentListener(AMapConstants.COMMAND_CHOOSE_PATH, this) } override fun onIntentReceived(intentStr: String?, intent: Intent?) { @@ -294,7 +295,6 @@ class ChoosePathFragment : BaseFragment(), IMogoNaviListener, IMogoVoiceCmdCallB val TAG: String = "ChoosePathFragment" fun newInstance(searchPoi: MogoLatLng): Fragment { - MapCenterPointStrategy.setMapCenterPointByScene(SearchServiceHolder.getMapUIController(), Scene.CALCULATE_PATH) var bundle = Bundle() bundle.putParcelable(AMapConstants.KEY_PARCELABLE, searchPoi) var choosePathFragment = ChoosePathFragment() diff --git a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/search/SearchFragment.java b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/search/SearchFragment.java index 00a7321047..6e2d965b2f 100644 --- a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/search/SearchFragment.java +++ b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/search/SearchFragment.java @@ -2,34 +2,29 @@ package com.mogo.module.navi.ui.search; import android.content.Context; import android.os.Bundle; -import android.os.health.ServiceHealthStats; import android.text.TextUtils; import android.view.View; import android.widget.TextView; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; -import com.alibaba.android.arouter.facade.annotation.Route; -import com.mogo.commons.analytics.AnalyticsUtils; + import com.mogo.commons.voice.AIAssist; import com.mogo.commons.voice.IMogoVoiceCmdCallBack; import com.mogo.map.search.inputtips.MogoTip; -import com.mogo.module.common.MogoModulePaths; import com.mogo.module.navi.R; import com.mogo.module.navi.bean.EntityConvertUtils; import com.mogo.module.navi.bean.SearchPoi; -import com.mogo.module.navi.constants.AMapConstants; +import com.mogo.module.navi.constants.SearchApisHolder; import com.mogo.module.navi.manager.AddressManager; -import com.mogo.module.navi.constants.SearchServiceHolder; import com.mogo.module.navi.ui.adapter.HistoryPoiAdapter; import com.mogo.module.navi.ui.adapter.SearchPoiAdapter; import com.mogo.module.navi.ui.base.UiController; -import com.mogo.module.navi.ui.setting.NaviSettingFragment; import com.mogo.module.navi.uitls.StringUtils; -import com.mogo.service.fragmentmanager.FragmentDescriptor; import com.mogo.service.fragmentmanager.FragmentStackTransactionListener; + import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -45,8 +40,8 @@ import java.util.List; * {@link SearchConstants#SEARCH_TYPE_MULTI_HOME} */ public class SearchFragment extends BaseSearchFragment - implements SearchView, View.OnClickListener, IMogoVoiceCmdCallBack, - FragmentStackTransactionListener { + implements SearchView, View.OnClickListener, IMogoVoiceCmdCallBack, + FragmentStackTransactionListener { public static final String TAG = "search"; @@ -72,14 +67,15 @@ public class SearchFragment extends BaseSearchFragment private TextView tvEmpty; @Override - public void onAttach(Context context) { - super.onAttach(context); - if (context instanceof UiController) { + public void onAttach( Context context ) { + super.onAttach( context ); + if ( context instanceof UiController ) { } } - @Override public void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); + @Override + public void onCreate( @Nullable Bundle savedInstanceState ) { + super.onCreate( savedInstanceState ); } @Override @@ -88,114 +84,117 @@ public class SearchFragment extends BaseSearchFragment } @Override - public void onActivityCreated(@Nullable Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - SearchServiceHolder.INSTANCE.getMarkerManger().removeMarkers(); - SearchServiceHolder.INSTANCE.getMapUIController().showMyLocation(false); + public void onActivityCreated( @Nullable Bundle savedInstanceState ) { + super.onActivityCreated( savedInstanceState ); + SearchApisHolder.getMarkerManager().removeMarkers(); + SearchApisHolder.getUiControllerApis().showMyLocation( false ); } - @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - mSearchResult = view.findViewById(R.id.rv_navi_search); - rvHistory = view.findViewById(R.id.rv_navi_history); - rlHistory = view.findViewById(R.id.rl_navi_history); + @Override + public void onViewCreated( @NonNull View view, @Nullable Bundle savedInstanceState ) { + super.onViewCreated( view, savedInstanceState ); + mSearchResult = view.findViewById( R.id.rv_navi_search ); + rvHistory = view.findViewById( R.id.rv_navi_history ); + rlHistory = view.findViewById( R.id.rl_navi_history ); LinearLayoutManager linearManager = - new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false); + new LinearLayoutManager( getActivity(), LinearLayoutManager.VERTICAL, false ); - rvHistory.setLayoutManager(linearManager); + rvHistory.setLayoutManager( linearManager ); LinearLayoutManager linearLayoutManager = - new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false); - mSearchResult.setLayoutManager(linearLayoutManager); + new LinearLayoutManager( getActivity(), LinearLayoutManager.VERTICAL, false ); + mSearchResult.setLayoutManager( linearLayoutManager ); - mPoiAdapter = new SearchPoiAdapter(getActivity(), new ArrayList<>()); - mSearchResult.setAdapter(mPoiAdapter); + mPoiAdapter = new SearchPoiAdapter( getActivity(), new ArrayList<>() ); + mSearchResult.setAdapter( mPoiAdapter ); - mHistoryAdapter = new HistoryPoiAdapter(getActivity(), new ArrayList<>()); - rvHistory.setAdapter(mHistoryAdapter); + mHistoryAdapter = new HistoryPoiAdapter( getActivity(), new ArrayList<>() ); + rvHistory.setAdapter( mHistoryAdapter ); - tvEmpty = findViewById(R.id.tv_navi_list_empty); + tvEmpty = findViewById( R.id.tv_navi_list_empty ); - findViewById(R.id.iv_navi_back).setOnClickListener(new View.OnClickListener() { - @Override public void onClick(View v) { - SearchServiceHolder.INSTANCE.getFragmentManager().pop(); + findViewById( R.id.iv_navi_back ).setOnClickListener( v -> { + SearchApisHolder.getFragmentManager().pop(); + } ); + + mHistoryAdapter.setOnClickListener( new View.OnClickListener() { + @Override + public void onClick( View v ) { + SearchApisHolder.getAnalyticsApis().track( "Navigation_History_destination", new HashMap< String, Object >() ); + SearchPoi item = ( SearchPoi ) v.getTag( R.id.tag_item ); + goHistory( item ); } - }); + } ); - mHistoryAdapter.setOnClickListener(new View.OnClickListener() { - @Override public void onClick(View v) { - SearchServiceHolder.INSTANCE.getAnalyticsManager() - .track("Navigation_History_destination", new HashMap()); - SearchPoi item = (SearchPoi) v.getTag(R.id.tag_item); - goHistory(item); + mPoiAdapter.setOnClickListener( new View.OnClickListener() { + @Override + public void onClick( View v ) { + MogoTip tag = ( MogoTip ) v.getTag( R.id.tag_position ); + goResult( tag ); } - }); + } ); - mPoiAdapter.setOnClickListener(new View.OnClickListener() { - @Override public void onClick(View v) { - MogoTip tag = (MogoTip) v.getTag(R.id.tag_position); - goResult(tag); - } - }); - - findViewById(R.id.tv_navi_history_clear).setOnClickListener(new View.OnClickListener() { - @Override public void onClick(View v) { + findViewById( R.id.tv_navi_history_clear ).setOnClickListener( new View.OnClickListener() { + @Override + public void onClick( View v ) { mSearchPresenter.deleteAllCachedPoi(); } - }); + } ); - findViewById(R.id.tv_navi_setting).setOnClickListener(new View.OnClickListener() { - @Override public void onClick(View v) { + findViewById( R.id.tv_navi_setting ).setOnClickListener( new View.OnClickListener() { + @Override + public void onClick( View v ) { goSetting(); } - }); + } ); - findViewById(R.id.tv_navi_company).setOnClickListener(new View.OnClickListener() { - @Override public void onClick(View v) { + findViewById( R.id.tv_navi_company ).setOnClickListener( new View.OnClickListener() { + @Override + public void onClick( View v ) { AddressManager.INSTANCE.goCompany(); } - }); + } ); - findViewById(R.id.tv_navi_home).setOnClickListener(new View.OnClickListener() { - @Override public void onClick(View v) { + findViewById( R.id.tv_navi_home ).setOnClickListener( new View.OnClickListener() { + @Override + public void onClick( View v ) { AddressManager.INSTANCE.goHome(); } - }); + } ); - findViewById(R.id.tv_navi_wash).setOnClickListener(this); - findViewById(R.id.tv_navi_toilet).setOnClickListener(this); - findViewById(R.id.tv_navi_gas).setOnClickListener(this); - findViewById(R.id.tv_navi_restaurant).setOnClickListener(this); - findViewById(R.id.tv_navi_park).setOnClickListener(this); + findViewById( R.id.tv_navi_wash ).setOnClickListener( this ); + findViewById( R.id.tv_navi_toilet ).setOnClickListener( this ); + findViewById( R.id.tv_navi_gas ).setOnClickListener( this ); + findViewById( R.id.tv_navi_restaurant ).setOnClickListener( this ); + findViewById( R.id.tv_navi_park ).setOnClickListener( this ); - findViewById(R.id.tv_navi_search).setOnClickListener(new View.OnClickListener() { - @Override public void onClick(View v) { - SearchServiceHolder.INSTANCE.getAnalyticsManager() - .track("Navigation_button_search", new HashMap()); - - mSearchPresenter.startSearchPoiByInput(mSearchBox.getText().toString()); + findViewById( R.id.tv_navi_search ).setOnClickListener( new View.OnClickListener() { + @Override + public void onClick( View v ) { + SearchApisHolder.getAnalyticsApis().track( "Navigation_button_search", new HashMap< String, Object >() ); + mSearchPresenter.startSearchPoiByInput( mSearchBox.getText().toString() ); } - }); + } ); - registerVoidCmd(); + registerVoidCmd(); } - private void goResult(MogoTip tag) { - SearchPoi searchPoi = EntityConvertUtils.tipToPoi(tag); - if (tag.getPoint() == null) { - goCategory(tag.getName()); + private void goResult( MogoTip tag ) { + SearchPoi searchPoi = EntityConvertUtils.tipToPoi( tag ); + if ( tag.getPoint() == null ) { + goCategory( tag.getName() ); } else { - mSearchPresenter.insert(searchPoi); + mSearchPresenter.insert( searchPoi ); AddressManager.INSTANCE.calculatePath( tag.getPoint() ); } } private void goSetting() { - SearchServiceHolder.INSTANCE.getAnalyticsManager().track("Navigation_button_setting", new HashMap()); + SearchApisHolder.getAnalyticsApis().track( "Navigation_button_setting", new HashMap< String, Object >() ); AddressManager.INSTANCE.goSettings(); } - private void goHistory(SearchPoi item) { - MogoTip mogoTip = EntityConvertUtils.poi2MogoTip(item); + private void goHistory( SearchPoi item ) { + MogoTip mogoTip = EntityConvertUtils.poi2MogoTip( item ); AddressManager.INSTANCE.calculatePath( mogoTip.getPoint() ); } @@ -211,99 +210,95 @@ public class SearchFragment extends BaseSearchFragment private void registerVoidCmd() { - AIAssist.getInstance(getContext()) - .registerUnWakeupCommand(GO_HOME_CMD, new String[] { "回家" }, this); - AIAssist.getInstance(getContext()) - .registerUnWakeupCommand(GO_COMPANY_CMD, new String[] { "去公司" }, this); - AIAssist.getInstance(getContext()) - .registerUnWakeupCommand(GAS_CMD, new String[] { "加油站" }, this); - AIAssist.getInstance(getContext()) - .registerUnWakeupCommand(RESTAURANT_CMD, new String[] { "餐馆" }, this); - AIAssist.getInstance(getContext()) - .registerUnWakeupCommand(TOILET_CMD, new String[] { "卫生间", "厕所" }, this); - AIAssist.getInstance(getContext()) - .registerUnWakeupCommand(PARK_CMD, new String[] { "停车场" }, this); - AIAssist.getInstance(getContext()) - .registerUnWakeupCommand(NAVI_SETTING_CMD, new String[] { "导航设置" }, this); - AIAssist.getInstance(getContext()) - .registerUnWakeupCommand(CLEAN_CMD, new String[] { "清空历史目的地" }, this); - AIAssist.getInstance(getContext()) - .registerUnWakeupCommand(WASH_CMD, new String[] { "洗车" }, this); + AIAssist.getInstance( getContext() ) + .registerUnWakeupCommand( GO_HOME_CMD, new String[]{"回家"}, this ); + AIAssist.getInstance( getContext() ) + .registerUnWakeupCommand( GO_COMPANY_CMD, new String[]{"去公司"}, this ); + AIAssist.getInstance( getContext() ) + .registerUnWakeupCommand( GAS_CMD, new String[]{"加油站"}, this ); + AIAssist.getInstance( getContext() ) + .registerUnWakeupCommand( RESTAURANT_CMD, new String[]{"餐馆"}, this ); + AIAssist.getInstance( getContext() ) + .registerUnWakeupCommand( TOILET_CMD, new String[]{"卫生间", "厕所"}, this ); + AIAssist.getInstance( getContext() ) + .registerUnWakeupCommand( PARK_CMD, new String[]{"停车场"}, this ); + AIAssist.getInstance( getContext() ) + .registerUnWakeupCommand( NAVI_SETTING_CMD, new String[]{"导航设置"}, this ); + AIAssist.getInstance( getContext() ) + .registerUnWakeupCommand( CLEAN_CMD, new String[]{"清空历史目的地"}, this ); + AIAssist.getInstance( getContext() ) + .registerUnWakeupCommand( WASH_CMD, new String[]{"洗车"}, this ); } @Override - public void renderSearchPoiResult(List datums, boolean showDelete) { - if (datums == null || datums.isEmpty()) { - showEmpty(getString(R.string.search_empty)); + public void renderSearchPoiResult( List< MogoTip > datums, boolean showDelete ) { + if ( datums == null || datums.isEmpty() ) { + showEmpty( getString( R.string.search_empty ) ); return; } showResult(); - mPoiAdapter.setDatas(datums); + mPoiAdapter.setDatas( datums ); registerResult(); } - @Override public void showHistory(List datums) { + @Override + public void showHistory( List< SearchPoi > datums ) { - if (datums == null || datums.isEmpty()) { - showEmpty(getString(R.string.history_empty)); + if ( datums == null || datums.isEmpty() ) { + showEmpty( getString( R.string.history_empty ) ); return; } showHistory(); - mHistoryAdapter.setDatas(datums); + mHistoryAdapter.setDatas( datums ); registerHistory(); } private void registerHistory() { - List datums = mHistoryAdapter.getList(); - for (int i = 0; i < datums.size(); i++) { - String s = StringUtils.int2String(i + 1); - AIAssist.getInstance(getContext()) - .registerUnWakeupCommand("history" + i, - new String[] { "第" + s + "个", "第" + s + "条" }, this); - if (cmds.contains("history" + i)) { + List< SearchPoi > datums = mHistoryAdapter.getList(); + for ( int i = 0; i < datums.size(); i++ ) { + String s = StringUtils.int2String( i + 1 ); + AIAssist.getInstance( getContext() ) + .registerUnWakeupCommand( "history" + i, + new String[]{"第" + s + "个", "第" + s + "条"}, this ); + if ( cmds.contains( "history" + i ) ) { continue; } - cmds.add("history" + i); + cmds.add( "history" + i ); } } private void registerResult() { - List datums = mPoiAdapter.getList(); - for (int i = 0; i < datums.size(); i++) { - String s = StringUtils.int2String(i + 1); - AIAssist.getInstance(getContext()) - .registerUnWakeupCommand("history" + i, - new String[] { "第" + s + "个", "第" + s + "条" }, this); - if (cmds.contains("history" + i)) { + List< MogoTip > datums = mPoiAdapter.getList(); + for ( int i = 0; i < datums.size(); i++ ) { + String s = StringUtils.int2String( i + 1 ); + AIAssist.getInstance( getContext() ) + .registerUnWakeupCommand( "history" + i, + new String[]{"第" + s + "个", "第" + s + "条"}, this ); + if ( cmds.contains( "history" + i ) ) { continue; } - cmds.add("history" + i); + cmds.add( "history" + i ); } } - private List cmds = new ArrayList(); + private List< String > cmds = new ArrayList< String >(); @Override public int getSearchType() { return mSearchType; } - @Override public void startJumpAnimation() { - - } - - /** * 退出搜索,进行清理 */ private void exitSearch() { - switch (mSearchType) { + switch ( mSearchType ) { case SearchConstants.SEARCH_TYPE_COMMON: try { - } catch (Exception e) { + } catch ( Exception e ) { e.printStackTrace(); } break; @@ -313,97 +308,79 @@ public class SearchFragment extends BaseSearchFragment } private void showResult() { - rlHistory.setVisibility(View.GONE); - mSearchResult.setVisibility(View.VISIBLE); - tvEmpty.setVisibility(View.GONE); + rlHistory.setVisibility( View.GONE ); + mSearchResult.setVisibility( View.VISIBLE ); + tvEmpty.setVisibility( View.GONE ); } private void showHistory() { - rlHistory.setVisibility(View.VISIBLE); - mSearchResult.setVisibility(View.GONE); - tvEmpty.setVisibility(View.GONE); + rlHistory.setVisibility( View.VISIBLE ); + mSearchResult.setVisibility( View.GONE ); + tvEmpty.setVisibility( View.GONE ); } - private void showEmpty(String str) { - rlHistory.setVisibility(View.GONE); - tvEmpty.setText(str); - mSearchResult.setVisibility(View.GONE); - tvEmpty.setVisibility(View.VISIBLE); + private void showEmpty( String str ) { + rlHistory.setVisibility( View.GONE ); + tvEmpty.setText( str ); + mSearchResult.setVisibility( View.GONE ); + tvEmpty.setVisibility( View.VISIBLE ); } - private boolean isHistory(){ - return rlHistory.getVisibility()==View.VISIBLE; + private boolean isHistory() { + return rlHistory.getVisibility() == View.VISIBLE; } /** * 类别 */ - @Override public void onClick(View v) { - TextView category = (TextView) v; + @Override + public void onClick( View v ) { + TextView category = ( TextView ) v; String text = category.getText().toString(); - goCategory(text); + goCategory( text ); } - private void goCategory(String text) { + private void goCategory( String text ) { AddressManager.INSTANCE.categorySearch( text ); } - @Override public void onResume() { + @Override + public void onResume() { super.onResume(); } - @Override public void onPause() { + @Override + public void onPause() { super.onPause(); } @Override public void onDestroyView() { super.onDestroyView(); - SearchServiceHolder.INSTANCE.getMapUIController().showMyLocation(true); -// moveMapToRight(); + SearchApisHolder.getUiControllerApis().showMyLocation( true ); unRegisterVoice(); } private void unRegisterVoice() { - //private static final String GO_HOME_CMD="goHome"; - //private static final String GO_COMPANY_CMD="goCompany"; - //private static final String GAS_CMD="gas"; - //private static final String RESTAURANT_CMD="restaurant"; - //private static final String TOILET_CMD="toilet"; - //private static final String PARK_CMD="park"; - //private static final String WASH_CMD="wash"; - //private static final String NAVI_SETTING_CMD="setting"; - //private static final String CLEAN_CMD="clean"; - //private static final String BACK_CMD="back"; - AIAssist.getInstance(getContext()).unregisterUnWakeupCommand(GO_HOME_CMD); - AIAssist.getInstance(getContext()).unregisterUnWakeupCommand(GO_COMPANY_CMD); - AIAssist.getInstance(getContext()).unregisterUnWakeupCommand(GAS_CMD); - AIAssist.getInstance(getContext()).unregisterUnWakeupCommand(RESTAURANT_CMD); - AIAssist.getInstance(getContext()).unregisterUnWakeupCommand(TOILET_CMD); - AIAssist.getInstance(getContext()).unregisterUnWakeupCommand(PARK_CMD); - AIAssist.getInstance(getContext()).unregisterUnWakeupCommand(WASH_CMD); - AIAssist.getInstance(getContext()).unregisterUnWakeupCommand(NAVI_SETTING_CMD); - AIAssist.getInstance(getContext()).unregisterUnWakeupCommand(CLEAN_CMD); - for (String cmd : cmds) { - AIAssist.getInstance(getContext()).unregisterUnWakeupCommand(cmd); + AIAssist.getInstance( getContext() ).unregisterUnWakeupCommand( GO_HOME_CMD ); + AIAssist.getInstance( getContext() ).unregisterUnWakeupCommand( GO_COMPANY_CMD ); + AIAssist.getInstance( getContext() ).unregisterUnWakeupCommand( GAS_CMD ); + AIAssist.getInstance( getContext() ).unregisterUnWakeupCommand( RESTAURANT_CMD ); + AIAssist.getInstance( getContext() ).unregisterUnWakeupCommand( TOILET_CMD ); + AIAssist.getInstance( getContext() ).unregisterUnWakeupCommand( PARK_CMD ); + AIAssist.getInstance( getContext() ).unregisterUnWakeupCommand( WASH_CMD ); + AIAssist.getInstance( getContext() ).unregisterUnWakeupCommand( NAVI_SETTING_CMD ); + AIAssist.getInstance( getContext() ).unregisterUnWakeupCommand( CLEAN_CMD ); + for ( String cmd : cmds ) { + AIAssist.getInstance( getContext() ).unregisterUnWakeupCommand( cmd ); } } - //@Override public void onPause() { - // super.onPause(); - // unRegisterVoice(); - //} - // - //@Override public void onResume() { - // super.onResume(); - // registerVoidCmd(); - // registerHistory(); - //} - - @Override public void onHiddenChanged(boolean hidden) { - super.onHiddenChanged(hidden); - if (hidden) { + @Override + public void onHiddenChanged( boolean hidden ) { + super.onHiddenChanged( hidden ); + if ( hidden ) { unRegisterVoice(); } else { registerVoidCmd(); @@ -411,36 +388,37 @@ public class SearchFragment extends BaseSearchFragment } } - @Override public void onCmdSelected(String cmd) { - if (!TextUtils.isEmpty(cmd) && cmd.startsWith("history")) { - String index = cmd.substring(7); - Integer integer = Integer.valueOf(index); - if (isHistory()){ - if (integer < mHistoryAdapter.getItemCount()) { - SearchPoi item = mHistoryAdapter.getItem(integer); - goHistory(item); - } - }else { - if (integer < mPoiAdapter.getItemCount()) { - MogoTip item = mPoiAdapter.getItem(integer); - goResult(item); + @Override + public void onCmdSelected( String cmd ) { + if ( !TextUtils.isEmpty( cmd ) && cmd.startsWith( "history" ) ) { + String index = cmd.substring( 7 ); + Integer integer = Integer.valueOf( index ); + if ( isHistory() ) { + if ( integer < mHistoryAdapter.getItemCount() ) { + SearchPoi item = mHistoryAdapter.getItem( integer ); + goHistory( item ); + } + } else { + if ( integer < mPoiAdapter.getItemCount() ) { + MogoTip item = mPoiAdapter.getItem( integer ); + goResult( item ); } } return; } - switch (cmd) { + switch ( cmd ) { case CLEAN_CMD: mSearchPresenter.deleteAllCachedPoi(); - AIAssist.getInstance(getContext()) - .speakQAndACmd(getString(R.string.notice_clean_history), - new String[] { "确定","立即清空" }, new String[] { "取消" }, this); + AIAssist.getInstance( getContext() ) + .speakQAndACmd( getString( R.string.notice_clean_history ), + new String[]{"确定", "立即清空"}, new String[]{"取消"}, this ); break; case GAS_CMD: - goCategory(getString(R.string.navi_gas)); + goCategory( getString( R.string.navi_gas ) ); break; case GO_COMPANY_CMD: @@ -455,20 +433,20 @@ public class SearchFragment extends BaseSearchFragment break; case PARK_CMD: - goCategory(getString(R.string.navi_park)); + goCategory( getString( R.string.navi_park ) ); break; case RESTAURANT_CMD: - goCategory(getString(R.string.navi_restrant)); + goCategory( getString( R.string.navi_restrant ) ); break; case TOILET_CMD: - goCategory(getString(R.string.navi_toilet)); + goCategory( getString( R.string.navi_toilet ) ); break; case WASH_CMD: - goCategory(getString(R.string.navi_wash)); + goCategory( getString( R.string.navi_wash ) ); break; @@ -477,26 +455,31 @@ public class SearchFragment extends BaseSearchFragment } } - @Override public void onCmdAction(String speakText) { + @Override + public void onCmdAction( String speakText ) { mSearchPresenter.hideDialog(); mSearchPresenter.deleteAllCachedPoiImpl(); } - @Override public void onCmdCancel(String speakText) { + @Override + public void onCmdCancel( String speakText ) { mSearchPresenter.hideDialog(); } - @Override public void onSpeakEnd(String speakText) { + @Override + public void onSpeakEnd( String speakText ) { } - @Override public void onSpeakSelectTimeOut(String speakText) { + @Override + public void onSpeakSelectTimeOut( String speakText ) { } - @Override public void onTransaction(int size) { + @Override + public void onTransaction( int size ) { } } diff --git a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/search/SearchPresenter.java b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/search/SearchPresenter.java index c50fde48ec..d6ebbb5cfc 100644 --- a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/search/SearchPresenter.java +++ b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/search/SearchPresenter.java @@ -1,39 +1,36 @@ package com.mogo.module.navi.ui.search; -import android.app.AlertDialog; import android.text.Editable; import android.text.TextUtils; import android.view.View; import android.widget.EditText; + import androidx.annotation.NonNull; import androidx.lifecycle.LifecycleOwner; + import com.alibaba.android.arouter.launcher.ARouter; import com.mogo.commons.mvp.Presenter; import com.mogo.map.location.MogoLocation; -import com.mogo.map.search.geo.MogoPoiItem; import com.mogo.map.search.inputtips.IMogoInputtipsListener; import com.mogo.map.search.inputtips.IMogoInputtipsSearch; import com.mogo.map.search.inputtips.MogoTip; import com.mogo.map.search.inputtips.query.MogoInputtipsQuery; -import com.mogo.map.search.poisearch.IMogoPoiSearch; -import com.mogo.map.search.poisearch.IMogoPoiSearchListener; -import com.mogo.map.search.poisearch.MogoPoiResult; -import com.mogo.map.search.poisearch.query.MogoPoiSearchQuery; import com.mogo.module.common.TextWatcherAdapter; import com.mogo.module.navi.R; import com.mogo.module.navi.bean.EntityConvertUtils; import com.mogo.module.navi.bean.SearchPoi; import com.mogo.module.navi.constants.DataConstants; -import com.mogo.module.navi.constants.SearchServiceHolder; +import com.mogo.module.navi.constants.SearchApisHolder; import com.mogo.module.navi.database.AppDataBase; import com.mogo.module.navi.dialog.NoticeDialog; import com.mogo.service.MogoServicePaths; import com.mogo.service.map.IMogoMapService; + +import java.util.List; + import io.reactivex.Observable; import io.reactivex.ObservableEmitter; import io.reactivex.ObservableOnSubscribe; -import io.reactivex.Observer; -import io.reactivex.Scheduler; import io.reactivex.Single; import io.reactivex.SingleEmitter; import io.reactivex.android.schedulers.AndroidSchedulers; @@ -41,7 +38,6 @@ import io.reactivex.disposables.CompositeDisposable; import io.reactivex.disposables.Disposable; import io.reactivex.functions.Consumer; import io.reactivex.schedulers.Schedulers; -import java.util.List; /** * @author congtaowang @@ -105,8 +101,7 @@ public class SearchPresenter extends Presenter { MogoInputtipsQuery mogoInputtipsQuery = new MogoInputtipsQuery(); mogoInputtipsQuery.setKeyword(keyword); - MogoLocation lastKnowLocation = - SearchServiceHolder.INSTANCE.getLocationClient().getLastKnowLocation(); + MogoLocation lastKnowLocation = SearchApisHolder.getLocationClientApis().getLastKnowLocation(); mogoInputtipsQuery.setCity(lastKnowLocation.getCityName()); mogoInputtipsQuery.setCityLimit(true); IMogoInputtipsSearch inputtipsSearch = diff --git a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/search/SearchUtils.java b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/search/SearchUtils.java deleted file mode 100644 index 976a5e209e..0000000000 --- a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/search/SearchUtils.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.mogo.module.navi.ui.search; - -/** - * @author congtaowang - * @since 2019-12-08 - *

- * 搜索工具类 - */ -public class SearchUtils { - - /** - * @param searchType - * @return - */ - public static int checkAndResetSearchType( int searchType ) { - switch ( searchType ) { - case SearchConstants.SEARCH_TYPE_COMMON: - case SearchConstants.SEARCH_TYPE_MULTI_HOME: - case SearchConstants.SEARCH_TYPE_MULTI_COMPANY: - break; - default: - searchType = SearchConstants.SEARCH_TYPE_COMMON; - break; - } - return searchType; - } - - public static String getSearchTypeActionName( int searchType ) { - switch ( searchType ) { - case SearchConstants.SEARCH_TYPE_COMMON: - return null; - case SearchConstants.SEARCH_TYPE_MULTI_HOME: - return "设为家"; - case SearchConstants.SEARCH_TYPE_MULTI_COMPANY: - return "设为公司"; - } - return null; - } -} diff --git a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/search/SearchView.java b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/search/SearchView.java index 633435465e..0153a600ef 100644 --- a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/search/SearchView.java +++ b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/search/SearchView.java @@ -1,9 +1,11 @@ package com.mogo.module.navi.ui.search; import android.widget.EditText; + import com.mogo.commons.mvp.IView; import com.mogo.map.search.inputtips.MogoTip; import com.mogo.module.navi.bean.SearchPoi; + import java.util.List; /** @@ -20,25 +22,11 @@ public interface SearchView extends IView { * @param datums * @param showDelete 是否显示清空历史记录项 */ - void renderSearchPoiResult(List datums, boolean showDelete); + void renderSearchPoiResult( List< MogoTip > datums, boolean showDelete ); - void showHistory(List datums); + void showHistory( List< SearchPoi > datums ); int getSearchType(); - - - ///** - // * 显示逆地理位置编码结果 - // * - // * @param address - // */ - //void renderChoicePointResult(RegeocodeAddress address); - - /** - * 选点完毕后marker动画 - */ - void startJumpAnimation(); - } diff --git a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/setting/NaviSettingFragment.kt b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/setting/NaviSettingFragment.kt index ac06e82a34..1c2ccc322d 100644 --- a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/setting/NaviSettingFragment.kt +++ b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/setting/NaviSettingFragment.kt @@ -4,25 +4,19 @@ import android.os.Bundle import android.view.View import android.widget.CompoundButton import android.widget.CompoundButton.OnCheckedChangeListener -import android.widget.CompoundButton.VISIBLE import android.widget.SeekBar import android.widget.SeekBar.OnSeekBarChangeListener -import com.alibaba.android.arouter.facade.annotation.Route import com.mogo.commons.debug.DebugConfig import com.mogo.commons.voice.AIAssist -import com.mogo.map.constants.BroadcastMode import com.mogo.map.uicontroller.EnumMapUI -import com.mogo.module.common.MogoModulePaths import com.mogo.module.navi.R import com.mogo.module.navi.bean.SearchPoi import com.mogo.module.navi.constants.DataConstants -import com.mogo.module.navi.constants.SearchServiceHolder -import com.mogo.module.navi.cp.AddressHelper +import com.mogo.module.navi.constants.SearchApisHolder import com.mogo.module.navi.manager.AddressManager import com.mogo.module.navi.manager.SettingManager import com.mogo.module.navi.manager.VolumeManager import com.mogo.module.navi.ui.base.BaseFragment -import com.mogo.utils.UiThreadHandler import kotlinx.android.synthetic.main.fragment_navi_setting.* import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe @@ -66,7 +60,7 @@ class NaviSettingFragment : BaseFragment(), OnCheckedChangeListener { } if (isChecked) { - SearchServiceHolder.analyticsManager.track("Navigation_preference", mapOf("type" to type)) + SearchApisHolder.getAnalyticsApis().track("Navigation_preference", mapOf("type" to type)) } } @@ -109,7 +103,7 @@ class NaviSettingFragment : BaseFragment(), OnCheckedChangeListener { private fun initEvent() { rl_navi_setting_title.setOnClickListener { - SearchServiceHolder.fragmentManager.pop() + SearchApisHolder.getFragmentManager().pop() } iv_sound_plus.setOnClickListener { VolumeManager.getInstance(context).incVolume() @@ -134,8 +128,7 @@ class NaviSettingFragment : BaseFragment(), OnCheckedChangeListener { sb_navi_volume_progress.setOnSeekBarChangeListener(object : OnSeekBarChangeListener { override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { if (fromUser) { - VolumeManager.getInstance(context) - .setSysVolume(progress) + VolumeManager.getInstance(context).setSysVolume(progress) SettingManager.volume = sb_navi_volume_progress.progress } @@ -156,39 +149,37 @@ class NaviSettingFragment : BaseFragment(), OnCheckedChangeListener { SettingManager.mapType = checkedId when (checkedId) { R.id.rb_navi_day -> { - SearchServiceHolder.getMapUIController().changeMapMode(EnumMapUI.Type_Light) + SearchApisHolder.getUiControllerApis().changeMapMode(EnumMapUI.Type_Light) } R.id.rb_navi_night -> { - SearchServiceHolder.getMapUIController().changeMapMode(EnumMapUI.Type_Night) + SearchApisHolder.getUiControllerApis().changeMapMode(EnumMapUI.Type_Night) } R.id.rb_navi_auto -> { - SearchServiceHolder.getMapUIController().changeMapMode(EnumMapUI.Type_AUTO_LIGHT_Night) + SearchApisHolder.getUiControllerApis().changeMapMode(EnumMapUI.Type_AUTO_LIGHT_Night) } } } rg_navi_sound_type.setOnCheckedChangeListener { group, checkedId -> - SettingManager.voiceStyle = checkedId - SearchServiceHolder.getNavi().setBroadcastMode( - if (checkedId == R.id.rb_navi_detail) BroadcastMode.DETAIL else BroadcastMode.CONCISE - ) - - if (checkedId == R.id.rb_navi_detail) { - SearchServiceHolder.analyticsManager.track("Navigation_guide_type", mapOf("type" to 1)) - } else { - SearchServiceHolder.analyticsManager.track("Navigation_guide_type", mapOf("type" to 2)) + when (checkedId) { + R.id.rb_navi_detail -> { + SearchApisHolder.getSettingManager().speakDetail() + SearchApisHolder.getAnalyticsApis().track("Navigation_guide_type", mapOf("type" to 1)) + } + R.id.rb_navi_draft -> { + SearchApisHolder.getSettingManager().speakDraft() + SearchApisHolder.getAnalyticsApis().track("Navigation_guide_type", mapOf("type" to 2)) + } } } aimlessModeGroup.setOnCheckedChangeListener { group, checkedId -> - - SettingManager.setAimlessMode(checkedId) - when (checkedId){ + when (checkedId) { R.id.aimlessModeClose -> { - SearchServiceHolder.getNavi().setAimlessModeStatus(false) + SearchApisHolder.getSettingManager().closeAimlessMode() AIAssist.getInstance(mContext).speakTTSVoice("已为您关闭巡航模式") } R.id.aimlessModeOpen -> { - SearchServiceHolder.getNavi().setAimlessModeStatus(true) + SearchApisHolder.getSettingManager().openAimlessMode() AIAssist.getInstance(mContext).speakTTSVoice("已为您开启巡航模式") } } @@ -196,24 +187,24 @@ class NaviSettingFragment : BaseFragment(), OnCheckedChangeListener { tv_navi_clear_home_address.setOnClickListener { - AddressManager.deleteHome(context!!) + AddressManager.deleteHome() clearHome() } tv_navi_clear_company_address.setOnClickListener { - AddressManager.deleteCompany(context!!) + AddressManager.deleteCompany() clearCompany() } tv_navi_company_address.setOnClickListener { if (!AddressManager.hasCompany()) { - AddressManager.goCompany() + SearchApisHolder.getSearchManager().goCompany() } } tv_navi_home_address.setOnClickListener { if (!AddressManager.hasHome()) { - AddressManager.goHome() + SearchApisHolder.getSearchManager().goHome() } } @@ -231,9 +222,9 @@ class NaviSettingFragment : BaseFragment(), OnCheckedChangeListener { SettingManager.setGpsSimulator(isChecked) if (isChecked) { - SearchServiceHolder.gpsSimulator.open() + SearchApisHolder.getGpsSimulatorManager().open() } else { - SearchServiceHolder.gpsSimulator.close() + SearchApisHolder.getGpsSimulatorManager().close() } } tb_navi.isChecked = SettingManager.isMonitor() diff --git a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/setting/SettingAddressFragment.kt b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/setting/SettingAddressFragment.kt index 099248bac1..b6eb204bd9 100644 --- a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/setting/SettingAddressFragment.kt +++ b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/setting/SettingAddressFragment.kt @@ -9,6 +9,7 @@ import com.mogo.map.MogoLatLng import com.mogo.map.listener.IMogoMapListener import com.mogo.map.marker.IMogoMarker import com.mogo.map.marker.MogoMarkerOptions +import com.mogo.map.search.geo.IMogoGeoSearch import com.mogo.map.search.geo.IMogoGeoSearchListener import com.mogo.map.search.geo.MogoGeocodeResult import com.mogo.map.search.geo.MogoRegeocodeResult @@ -20,7 +21,7 @@ import com.mogo.module.navi.bean.EntityConvertUtils import com.mogo.module.navi.bean.SearchPoi import com.mogo.module.navi.constants.AMapConstants import com.mogo.module.navi.constants.DataConstants -import com.mogo.module.navi.constants.SearchServiceHolder +import com.mogo.module.navi.constants.SearchApisHolder import com.mogo.module.navi.cp.AddressHelper import com.mogo.module.navi.database.AppDataBase import com.mogo.module.navi.manager.AddressManager @@ -37,6 +38,8 @@ import kotlinx.android.synthetic.main.fragment_setting_address.* * 2020-01-07. */ class SettingAddressFragment : BaseFragment(), IMogoGeoSearchListener { + + override fun onRegeocodeSearched(regeocodeResult: MogoRegeocodeResult?) { et_navi_search.setText(regeocodeResult?.regeocodeAddress?.formatAddress) var formatAddress = regeocodeResult?.regeocodeAddress?.formatAddress @@ -58,6 +61,8 @@ class SettingAddressFragment : BaseFragment(), IMogoGeoSearchListener { private var style: Int = DataConstants.TYPE_HOME_ADDRESS var addMarker: IMogoMarker? = null + private lateinit var mGeoSearch: IMogoGeoSearch + private var selectPoi: SearchPoi? = null private var mapListener: IMogoMapListener = object : MogoMapListenerAdapter() { override fun onMapChanged( @@ -69,7 +74,7 @@ class SettingAddressFragment : BaseFragment(), IMogoGeoSearchListener { selectPoi = EntityConvertUtils.geoToPoi(latLng?.lat ?: 0.0, latLng?.lng ?: 0.0, style) var mogoRegeocodeQuery = MogoRegeocodeQuery() mogoRegeocodeQuery.point = latLng - SearchServiceHolder.getGeoSearcher().getFromLocationAsyn(mogoRegeocodeQuery) + mGeoSearch.getFromLocationAsyn(mogoRegeocodeQuery) addMarker?.startJumpAnimation( 150f, 600, @@ -86,12 +91,13 @@ class SettingAddressFragment : BaseFragment(), IMogoGeoSearchListener { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - style = arguments?.getInt(AMapConstants.KEY_SET_HOME_COMPONY) - ?: DataConstants.TYPE_HOME_ADDRESS - SearchServiceHolder.listenerCenter.registerMogoMapListener(AMapConstants.PATH_FRAGMENT_SETTING_HOME, mapListener) - SearchServiceHolder.getMapUIController().showMyLocation(false) - SearchServiceHolder.getGeoSearcher().setGeoSearchListener(this) - SearchServiceHolder.getMarkerManger().removeMarkers() + style = arguments?.getInt(AMapConstants.KEY_SET_HOME_COMPONY) ?: DataConstants.TYPE_HOME_ADDRESS + SearchApisHolder.getRegisterCenterApis().registerMogoMapListener(AMapConstants.PATH_FRAGMENT_SETTING_HOME, mapListener) + SearchApisHolder.getUiControllerApis().showMyLocation(false) + SearchApisHolder.getMarkerManager().removeMarkers() + + mGeoSearch = SearchApisHolder.getMapServiceApis().getGeoSearch(context) + mGeoSearch.setGeoSearchListener(this) } override fun getLayoutId(): Int { @@ -119,7 +125,7 @@ class SettingAddressFragment : BaseFragment(), IMogoGeoSearchListener { } iv_navi_back.setOnClickListener { - SearchServiceHolder.fragmentManager.pop() + SearchApisHolder.getFragmentManager().pop() } tv_set_as_home.setOnClickListener { if (selectPoi == null) { @@ -127,12 +133,12 @@ class SettingAddressFragment : BaseFragment(), IMogoGeoSearchListener { return@setOnClickListener } insert(selectPoi!!) - SearchServiceHolder.fragmentManager.pop() + SearchApisHolder.getFragmentManager().pop() } et_navi_search.isEnabled = false et_navi_search.setText(getString(string.drag_map_to_choose)) - var location = SearchServiceHolder.getMapUIController().windowCenterLocation + var location = SearchApisHolder.getUiControllerApis().windowCenterLocation UiThreadHandler.postDelayed({ if (!isAdded) { @@ -145,10 +151,9 @@ class SettingAddressFragment : BaseFragment(), IMogoGeoSearchListener { .owner(TAG) .anchor(0.5f, 1f) .longitude(location?.lng ?: 0.0) - addMarker = SearchServiceHolder.getMarkerManger() - .addMarker(AMapConstants.PATH_FRAGMENT_SETTING_HOME, options) + addMarker = SearchApisHolder.getMarkerManager().addMarker(AMapConstants.PATH_FRAGMENT_SETTING_HOME, options) - var locationPointInScreen = SearchServiceHolder.getMapUIController().getLocationPointInScreen(location) + var locationPointInScreen = SearchApisHolder.getUiControllerApis().getLocationPointInScreen(location) addMarker?.setPositionByPixels(locationPointInScreen) }, 500L) } @@ -169,9 +174,7 @@ class SettingAddressFragment : BaseFragment(), IMogoGeoSearchListener { override fun onDestroyView() { super.onDestroyView() - SearchServiceHolder.listenerCenter.unregisterMogoMapListener( - AMapConstants.PATH_FRAGMENT_SETTING_HOME - ) + SearchApisHolder.getRegisterCenterApis().unregisterMogoMapListener(AMapConstants.PATH_FRAGMENT_SETTING_HOME) addMarker?.destroy() } diff --git a/modules/mogo-module-search/src/main/res/layout/activity_navi.xml b/modules/mogo-module-search/src/main/res/layout/activity_navi.xml deleted file mode 100644 index dbec94d82e..0000000000 --- a/modules/mogo-module-search/src/main/res/layout/activity_navi.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - \ No newline at end of file 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 a1774a2d4a..b2f2391ff6 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 @@ -26,6 +26,7 @@ import com.mogo.service.map.IMogoMapService; import com.mogo.service.module.IMogoActionManager; import com.mogo.service.module.IMogoRegisterCenter; import com.mogo.service.statusmanager.IMogoStatusManager; +import com.mogo.utils.logger.Logger; import com.zhidao.carchattingprovider.CallChattingProviderConstant; /** @@ -195,11 +196,9 @@ public class MarkerServiceHandler { /** * 对指定类型高亮处理 * 建议使用 - * - * @see MapMarkerManager#highlightedMarker(String, boolean) */ @Deprecated public static void highlightedMarker( String typeTag ) { - getMapMarkerManager().highlightedMarker( typeTag, false ); + Logger.w( TAG, "do not invoke this method any more." ); } } 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 88f0bf02e7..cf67cd97c5 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 @@ -493,6 +493,7 @@ public class MogoServices implements IMogoMapListener, if ( mStatusManager.isUserInteracted() ) { mLastCustomRefreshCenterLocation = latLng; mLastZoomLevel = zoom; + Logger.d( TAG, "user interacted" ); return; } @@ -500,6 +501,7 @@ public class MogoServices implements IMogoMapListener, if ( mStatusManager.isV2XShow() ) { mLastCustomRefreshCenterLocation = latLng; mLastZoomLevel = zoom; + Logger.d( TAG, "user v2x show" ); return; } @@ -507,6 +509,7 @@ public class MogoServices implements IMogoMapListener, if ( mStatusManager.isSearchUIShow() ) { mLastCustomRefreshCenterLocation = latLng; mLastZoomLevel = zoom; + Logger.d( TAG, "user search Ui show" ); return; } @@ -555,7 +558,7 @@ public class MogoServices implements IMogoMapListener, } float distance = Utils.calculateLineDistance( latLng, mLastCustomRefreshCenterLocation ); Logger.d( TAG, "move distance = %s, factor = %s", distance, factor ); - return distance > factor; + return distance > factor / 2; } catch ( Exception e ) { Logger.e( TAG, e, "warming. " ); return false; @@ -684,8 +687,6 @@ public class MogoServices implements IMogoMapListener, private void onAdasOn() { // ADAS 时,不在自动刷新打点策略 stopAutoRefreshStrategy(); - // 清除所有的打点信息记录 - MarkerServiceHandler.getMapMarkerManager().alreadySmallMarker.clear(); } private void onAdasClosed() { diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/intent/MockIntentHandler.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/intent/MockIntentHandler.java index 108ba2ec75..972aa61212 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/intent/MockIntentHandler.java +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/intent/MockIntentHandler.java @@ -9,9 +9,20 @@ import android.view.View; import android.widget.TextView; import com.mogo.commons.debug.DebugConfig; +import com.mogo.map.MogoLatLng; +import com.mogo.map.search.geo.IMogoGeoSearch; +import com.mogo.map.search.geo.IMogoGeoSearchListener; +import com.mogo.map.search.geo.MogoGeocodeResult; +import com.mogo.map.search.geo.MogoRegeocodeResult; +import com.mogo.map.search.geo.query.MogoRegeocodeQuery; +import com.mogo.module.common.dialog.WMDialog; import com.mogo.module.service.MarkerServiceHandler; +import com.mogo.module.service.MogoServiceProvider; +import com.mogo.module.service.R; import com.mogo.service.entrance.ButtonIndex; import com.mogo.utils.TipToast; +import com.mogo.utils.logger.Logger; +import com.mogo.utils.network.utils.GsonUtil; /** * @author congtaowang @@ -71,10 +82,10 @@ public class MockIntentHandler implements IntentHandler { button11.setVisibility( View.VISIBLE ); button11.setBackgroundColor( Color.RED ); button11.setOnClickListener( view -> { - Intent intent1 = new Intent( ); + Intent intent1 = new Intent(); intent1.setAction( Intent.ACTION_VIEW ); intent1.addFlags( Intent.FLAG_ACTIVITY_NEW_TASK ); - intent1.setData( Uri.parse("wechathelper://com.zhidao.wechathelper/main/transform?type=navi&lon=116.327007&lat=39.977639&from=os2.0") ); + intent1.setData( Uri.parse( "wechathelper://com.zhidao.wechathelper/main/transform?type=navi&lon=116.327007&lat=39.977639&from=os2.0" ) ); try { view.setOnClickListener( null ); view.getContext().startActivity( intent1 ); @@ -89,6 +100,37 @@ public class MockIntentHandler implements IntentHandler { float bearing = intent.getFloatExtra( "bearing", 0 ); MarkerServiceHandler.getMapUIController().changeBearing( bearing ); break; + case 9: + new WMDialog.Builder( context ) + .setOkButton( "确认", ( dlg, which ) -> { + dlg.dismiss(); + } ) + .setCancelButton( "取消", ( dlg, which ) -> { + dlg.dismiss(); + } ) + .setContent( "内容内容内容内容内容内容内容内容" ) + .build() + .show(); + break; + case 10: + IMogoGeoSearch geoSearch = MarkerServiceHandler.getMapService().getGeoSearch( context ); + geoSearch.setGeoSearchListener( new IMogoGeoSearchListener() { + @Override + public void onRegeocodeSearched( MogoRegeocodeResult regeocodeResult ) { + Logger.d( TAG, GsonUtil.jsonFromObject( regeocodeResult ) ); + } + + @Override + public void onGeocodeSearched( MogoGeocodeResult geocodeResult ) { + + } + } ); + MogoRegeocodeQuery query = new MogoRegeocodeQuery(); + query.setLatlngType( "autonavi" ); + query.setPoint( new MogoLatLng( intent.getFloatExtra( "lat", 39.917366f ), intent.getFloatExtra( "lon", 116.39962f ) ) ); + query.setRadius( 1000 ); + geoSearch.getFromLocationAsyn( query ); + break; } } } diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/marker/MapMarkerManager.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/marker/MapMarkerManager.java index 806a4d37a8..b8a97d8206 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/marker/MapMarkerManager.java +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/marker/MapMarkerManager.java @@ -1,19 +1,13 @@ package com.mogo.module.service.marker; import android.content.Context; -import android.content.Intent; import android.text.TextUtils; -import android.util.Log; -import android.view.animation.BounceInterpolator; -import android.view.animation.OvershootInterpolator; import com.mogo.map.MogoLatLng; -import com.mogo.map.location.MogoLocation; import com.mogo.map.marker.IMogoMarker; import com.mogo.map.marker.IMogoMarkerClickListener; import com.mogo.map.marker.IMogoMarkerManager; import com.mogo.map.marker.MogoMarkerOptions; -import com.mogo.map.marker.MogoMarkersHandler; import com.mogo.module.common.ModuleNames; import com.mogo.module.common.entity.MarkerCarPois; import com.mogo.module.common.entity.MarkerCardResult; @@ -30,7 +24,6 @@ import com.mogo.module.service.Utils; import com.mogo.module.service.network.RefreshCallback; import com.mogo.module.service.network.RefreshModel; import com.mogo.module.service.utils.ViewUtils; -import com.mogo.service.cardmanager.IMogoCardChangedListener; import com.mogo.service.connection.IMogoOnMessageListener; import com.mogo.service.module.IMogoBizActionDoneListener; import com.mogo.utils.ThreadPoolService; @@ -54,28 +47,18 @@ import java.util.Map; * version: 1.0 */ public class MapMarkerManager implements IMogoMarkerClickListener, - IMogoOnMessageListener< MarkerResponse >, IMogoCardChangedListener, + IMogoOnMessageListener< MarkerResponse >, IMogoBizActionDoneListener { private static final String TAG = "MapMarkerManager"; - // 是否选中在线卡片及气泡,语音搜索触发 - private boolean mIsAISearchOnlineData = false; private Context mContext; // 最后一次选中的气泡 private IMogoMarker mLastCheckMarker; private static MapMarkerManager mMarkerManager; - private String mCurrentModuleName = ServiceConst.CARD_TYPE_BUSINESS_OPERATION; - // 记录其它已经缩小的Marker - public ArrayList< String > alreadySmallMarker = new ArrayList<>(); - // 存储所有汽车marker -// public ArrayList carMarkers = new ArrayList<>(); - // 距离用户最近的Marker - private IMogoMarker mNearlyMarker = null; // 记录上次请求数据,切换卡片时做数据处理 private MarkerCardResult mLastDataResult; - private boolean mIsMarkerClicked = false; private RefreshModel mRefreshModel; private MogoLatLng mCarLatLng; // 平滑移动事件间隔(单位:秒) @@ -105,7 +88,6 @@ public class MapMarkerManager implements IMogoMarkerClickListener, // 长连接 MarkerServiceHandler.getMogoSocketManager().registerOnMessageListener( 401001, this ); - MarkerServiceHandler.getMogoCardManager().registerCardChangedListener( TAG, this ); MarkerServiceHandler.getActionManager().registerBizActionDoneListener( this ); } @@ -115,30 +97,11 @@ public class MapMarkerManager implements IMogoMarkerClickListener, Logger.e( TAG, "do not invoke anymore." ); } - @Override - public void onSwitched( int position, String moduleName ) { - Logger.d( TAG, "当前C位卡片:" + moduleName ); - if ( ( TextUtils.isEmpty( mCurrentModuleName ) || TextUtils.equals( mCurrentModuleName, - ServiceConst.CARD_TYPE_BUSINESS_OPERATION ) ) && mIsMarkerClicked ) { - mIsMarkerClicked = false; - // 在广告位(默认位置)点击marker造成卡片切换的,还是现实全部marker 【需求:os2.0.2-2.5-4】 - highlightedMarker( moduleName, false ); - mCurrentModuleName = moduleName; - } else { - mCurrentModuleName = moduleName; - runOnTargetThread( () -> { - MarkerServiceHandler.getMarkerManager().removeMarkersExcept( ModuleNames.CARD_TYPE_USER_DATA ); - drawMarkerByCurrentType( mLastDataResult ); - } ); - } - } - /** * 地图上的Marker点击回调 */ @Override public boolean onMarkerClicked( IMogoMarker marker ) { - mIsMarkerClicked = true; Logger.d( TAG, "onMarkerClicked 点击了大而全中的Marker:" + marker ); try { boolean result = switchMarkerOpenStatus( marker ); @@ -173,90 +136,6 @@ public class MapMarkerManager implements IMogoMarkerClickListener, return true; } - - // 对指定类型高亮处理 - public synchronized void highlightedMarker( final String typeTag ) { - highlightedMarker( typeTag, false ); - } - - public synchronized void highlightedMarker( final String typeTag, final boolean netDataRefresh ) { - try { - Logger.e( TAG, "上一次选中的卡片类型:mCurrentModuleName==" + mCurrentModuleName ); - if ( !TextUtils.isEmpty( mCurrentModuleName ) && TextUtils.equals( mCurrentModuleName, - typeTag ) && !netDataRefresh ) { - return; - } - // 从已经缩小的记录删除 - alreadySmallMarker.remove( typeTag ); - List< IMogoMarker > currentHighLightList = - MarkerServiceHandler.getMarkerManager().getMarkers( typeTag ); - - if ( currentHighLightList == null || currentHighLightList.size() == 0 ) { - alreadySmallMarker.clear(); - // 放大所有的气泡 - Map< String, List< IMogoMarker > > lastHighLightList = - MarkerServiceHandler.getMarkerManager().getAllMarkers(); - for ( String markerName : lastHighLightList.keySet() ) { - setMarkersBig( lastHighLightList.get( markerName ) ); - } - } else { - // 缩小其他的气泡 - Map< String, List< IMogoMarker > > lastHighLightList = - MarkerServiceHandler.getMarkerManager().getAllMarkers(); - for ( String markerName : lastHighLightList.keySet() ) { - if ( !markerName.equals( typeTag ) ) { - if ( !alreadySmallMarker.contains( markerName ) ) { - alreadySmallMarker.add( markerName ); - setMarkersSmall( lastHighLightList.get( markerName ) ); - } - } - } - - // 将当前卡片选中的气泡放大 - setMarkersBig( currentHighLightList ); - } - - } catch ( Exception e ) { - e.printStackTrace(); - } - } - - private static void setMarkersBig( List< IMogoMarker > markers ) { - if ( markers == null || markers.isEmpty() ) { - return; - } - for ( IMogoMarker mogoMarker : markers ) { - if ( mogoMarker == null || mogoMarker.isDestroyed() ) { - continue; - } - try { - mogoMarker.startScaleAnimation( 0.6f, 1f, 0.6f, 1f, 1000, new BounceInterpolator() ); - } catch ( Exception e ) { - Logger.e( TAG, e, "error." ); - } - } - } - - private static void setMarkersSmall( List< IMogoMarker > markers ) { - if ( markers == null || markers.isEmpty() ) { - return; - } - for ( IMogoMarker mogoMarker : markers ) { - smallMarker( mogoMarker ); - } - } - - private static void smallMarker( IMogoMarker mogoMarker ) { - if ( mogoMarker == null || mogoMarker.isDestroyed() ) { - return; - } - try { - mogoMarker.startScaleAnimation( 1f, 0.6f, 1f, 0.6f, 300, new OvershootInterpolator() ); - } catch ( Exception e ) { - Logger.e( TAG, e, "error." ); - } - } - // 展开气泡 private void openMarker( IMogoMarker mogoMarker ) { if ( mogoMarker == null ) { @@ -339,21 +218,7 @@ public class MapMarkerManager implements IMogoMarkerClickListener, dispatchDataToBiz(); } ); - // 语音触发的在线车辆搜索,采用增量的形式绘制 - if ( mIsAISearchOnlineData = isOnlineCarDataOnly( mLastDataResult ) ) { - MarkerServiceHandler.getMarkerManager().removeMarkers( ServiceConst.CARD_TYPE_USER_DATA ); - MarkerServiceHandler.getMogoCardManager().switch2( ServiceConst.CARD_TYPE_USER_DATA ); - } else { - mLastCheckMarker = null; - // 清空所有地图上绘制的Marker - MarkerServiceHandler.getMarkerManager().removeMarkersExcept( ModuleNames.CARD_TYPE_USER_DATA ); - } - drawMarkerByCurrentType( mLastDataResult ); - // 同步新绘制的气泡状态 - alreadySmallMarker.clear(); -// highlightedMarker( mCurrentModuleName, true ); - trackData( mLastDataResult ); } @@ -385,11 +250,6 @@ public class MapMarkerManager implements IMogoMarkerClickListener, return; } - if ( TextUtils.isEmpty( mCurrentModuleName ) ) { - // 默认大而全 - mCurrentModuleName = ServiceConst.CARD_TYPE_BUSINESS_OPERATION; - } - drawAllMarker( markerCardResult ); } @@ -399,14 +259,12 @@ public class MapMarkerManager implements IMogoMarkerClickListener, * @param markerCardResult */ private void drawAllMarker( MarkerCardResult markerCardResult ) { -// List onlineCarList = markerCardResult.getOnlineCar(); List< MarkerExploreWay > exploreWayList = markerCardResult.getExploreWay(); - List< MarkerShareMusic > shareMusicList = markerCardResult.getShareMusic(); +// List< MarkerShareMusic > shareMusicList = markerCardResult.getShareMusic(); List< MarkerNoveltyInfo > noveltyInfoList = markerCardResult.getNoveltyInfo(); -// drawOnlineCarMarkers(onlineCarList, ServiceConst.MAX_AMOUNT_ALL); drawRoadConditionMarker( exploreWayList, ServiceConst.MAX_AMOUNT_ALL ); - drawShareMusicMarker( shareMusicList, ServiceConst.MAX_AMOUNT_ALL ); +// drawShareMusicMarker( shareMusicList, ServiceConst.MAX_AMOUNT_ALL ); drawNoveltyMarker( noveltyInfoList, ServiceConst.MAX_AMOUNT_ALL ); } @@ -421,10 +279,9 @@ public class MapMarkerManager implements IMogoMarkerClickListener, return; } - double nearlyDistance = Float.MAX_VALUE; int size = getAppropriateSize( maxAmount, onlineCarList ); - Map< String, IMogoMarker > existCarMap = purgeCarsData( onlineCarList ); + Map< String, IMogoMarker > existCarMap = purgeMarkerData( onlineCarList, ModuleNames.CARD_TYPE_USER_DATA ); for ( int i = 0; i < size; i++ ) { MarkerOnlineCar markerOnlineCar = onlineCarList.get( i ); @@ -439,119 +296,13 @@ public class MapMarkerManager implements IMogoMarkerClickListener, markerShowEntity.setIconUrl( markerOnlineCar.getUserInfo().getUserHead() ); } - if ( markerOnlineCar.getUserInfo() == null || TextUtils.isEmpty( markerOnlineCar.getUserInfo().getSn() ) ) { - continue; - } - IMogoMarker mogoMarker = existCarMap.get( markerOnlineCar.getUserInfo().getSn() ); + String sn = getCarSnFromEntity( markerOnlineCar ); + IMogoMarker mogoMarker = existCarMap.get( sn ); if ( mogoMarker == null ) { - Logger.d( TAG, "car [%s] need be create.", markerOnlineCar.getUserInfo().getSn() ); mogoMarker = drawMapMarker( markerShowEntity ); } startSmooth( mogoMarker, markerOnlineCar, markerLocation ); - - // 计算在线车辆距离当前车辆的距离,每次都与最后一次距离最近的进行比较,保留距离最近的车辆,进行卡片展示 - try { - // 当前车辆的位置 - MogoLocation currentLocation = MarkerServiceHandler.getMogoLocationClient().getLastKnowLocation(); - - // 计算车辆距离指定气泡的距离 - float calculateDistance = - Utils.calculateLineDistance( new MogoLatLng( markerLocation.getLat(), - markerLocation.getLon() ), - new MogoLatLng( currentLocation.getLatitude(), - currentLocation.getLongitude() ) ); - - // 进行比较,保留最近的一个数据 - if ( calculateDistance < nearlyDistance ) { - nearlyDistance = calculateDistance; - mNearlyMarker = mogoMarker; - } - - } catch ( Exception e ) { - e.printStackTrace(); - } } - Logger.d( TAG, "距离当前车辆位置最近的距离为:" + nearlyDistance ); - - try { - // 在ACC on 之后第一次获取到了在线车辆数据,选中最近的一个Marker - if ( !mIsAISearchOnlineData ) { - return; - } - if ( mNearlyMarker == null ) { - return; - } - Logger.d( TAG, "语音搜索触发,默认选中最近的在线车辆:" + mNearlyMarker ); - // 移动地图到指定位置 - MarkerServiceHandler.getMogoStatusManager().setUserInteractionStatus( ServiceConst.TYPE, true, false ); - MarkerServiceHandler.getMapUIController().moveToCenter( mNearlyMarker.getPosition() ); - onMarkerClicked( mNearlyMarker ); - MogoMarkersHandler.getInstance().onMarkerClicked( mNearlyMarker ); - mIsAISearchOnlineData = false; - - } catch ( Exception e ) { - e.printStackTrace(); - } - } - - /** - * 根据新的在线车辆列表,选出已存在的在线车辆,并从视图和内存中移除不存在的在线车辆 - * - * @param newCarsList - * @return - */ - private Map< String, IMogoMarker > purgeCarsData( List< MarkerOnlineCar > newCarsList ) { - - final long start = System.currentTimeMillis(); - Map< String, IMogoMarker > existCarsMap = new HashMap<>(); - List< IMogoMarker > allCarsList = MarkerServiceHandler.getMarkerManager().getMarkers( ModuleNames.CARD_TYPE_USER_DATA ); - if ( allCarsList == null || allCarsList.isEmpty() ) { - return existCarsMap; - } - if ( newCarsList == null || newCarsList.isEmpty() ) { - return existCarsMap; - } - - Map< String, IMogoMarker > allCarsMap = new HashMap<>(); - for ( IMogoMarker marker : allCarsList ) { - String sn = getCarSnFromMarker( marker ); - Logger.d( TAG, "sn = [%s]", sn ); - allCarsMap.put( sn, marker ); - } - for ( MarkerOnlineCar markerOnlineCar : newCarsList ) { - String sn = markerOnlineCar.getUserInfo().getSn(); - if ( allCarsMap.containsKey( sn ) ) { - Logger.d( TAG, " car [%s] is cached.", sn ); - existCarsMap.put( sn, allCarsMap.get( sn ) ); - } - } - for ( String sn : allCarsMap.keySet() ) { - if ( !existCarsMap.containsKey( sn ) ) { - IMogoMarker dirtyMarker = allCarsMap.get( sn ); - allCarsList.remove( dirtyMarker ); - dirtyMarker.destroy(); - Logger.d( TAG, " car [%s] is destroy.", sn ); - } - } - allCarsMap.clear(); - Logger.i( "timer", "purge data cost " + ( System.currentTimeMillis() - start ) + "ms" ); - return existCarsMap; - } - - private String getCarSnFromMarker( IMogoMarker marker ) { - if ( marker == null || marker.getObject() == null || marker.isDestroyed() ) { - return null; - } - if ( !( marker.getObject() instanceof MarkerShowEntity ) ) { - return null; - } - if ( !( ( ( MarkerShowEntity ) marker.getObject() ).getBindObj() instanceof MarkerOnlineCar ) ) { - return null; - } - if ( ( ( MarkerOnlineCar ) ( ( MarkerShowEntity ) marker.getObject() ).getBindObj() ).getUserInfo() == null ) { - return null; - } - return ( ( MarkerOnlineCar ) ( ( MarkerShowEntity ) marker.getObject() ).getBindObj() ).getUserInfo().getSn(); } /** @@ -562,9 +313,11 @@ public class MapMarkerManager implements IMogoMarkerClickListener, private void drawRoadConditionMarker( List< MarkerExploreWay > exploreWayList, int maxAmount ) { // 将数据同步给探路,避免探路每次 perform 的时候去拉取,造成消耗 if ( exploreWayList == null || exploreWayList.isEmpty() ) { + MarkerServiceHandler.getMarkerManager().removeMarkers( ModuleNames.CARD_TYPE_ROAD_CONDITION ); return; } int size = getAppropriateSize( maxAmount, exploreWayList ); + Map< String, IMogoMarker > existCarMap = purgeMarkerData( exploreWayList, ModuleNames.CARD_TYPE_ROAD_CONDITION ); for ( int i = 0; i < size; i++ ) { MarkerExploreWay markerExploreWay = exploreWayList.get( i ); if ( !markerExploreWay.getCanLive() ) { @@ -576,21 +329,28 @@ public class MapMarkerManager implements IMogoMarkerClickListener, markerShowEntity.setMarkerType( markerExploreWay.getType() ); markerShowEntity.setTextContent( markerExploreWay.getAddr() ); - drawMapMarker( markerShowEntity ); + String sn = getCarSnFromEntity( markerExploreWay ); + IMogoMarker mogoMarker = existCarMap.get( sn ); + if ( mogoMarker == null ) { + drawMapMarker( markerShowEntity ); + } } } } + /** * 共享音乐 * * @param shareMusicList */ private void drawShareMusicMarker( List< MarkerShareMusic > shareMusicList, int maxAmount ) { - if ( shareMusicList == null ) { + if ( shareMusicList == null || shareMusicList.isEmpty() ) { + MarkerServiceHandler.getMarkerManager().removeMarkers( ModuleNames.CARD_TYPE_SHARE_MUSIC ); return; } int size = getAppropriateSize( maxAmount, shareMusicList ); + Map< String, IMogoMarker > existCarMap = purgeMarkerData( shareMusicList, ModuleNames.CARD_TYPE_SHARE_MUSIC ); for ( int i = 0; i < size; i++ ) { MarkerShareMusic markerShareMusic = shareMusicList.get( i ); MarkerLocation markerLocation = markerShareMusic.getLocation(); @@ -601,7 +361,11 @@ public class MapMarkerManager implements IMogoMarkerClickListener, markerShowEntity.setTextContent( markerShareMusic.getMediaName() ); markerShowEntity.setIconUrl( markerShareMusic.getMediaImg() ); - drawMapMarker( markerShowEntity ); + String sn = getCarSnFromEntity( markerShareMusic ); + IMogoMarker mogoMarker = existCarMap.get( sn ); + if ( mogoMarker == null ) { + drawMapMarker( markerShowEntity ); + } } } @@ -611,10 +375,12 @@ public class MapMarkerManager implements IMogoMarkerClickListener, * @param noveltyInfoList */ private void drawNoveltyMarker( List< MarkerNoveltyInfo > noveltyInfoList, int maxAmount ) { - if ( noveltyInfoList == null ) { + if ( noveltyInfoList == null || noveltyInfoList.isEmpty() ) { + MarkerServiceHandler.getMarkerManager().removeMarkers( ModuleNames.CARD_TYPE_NOVELTY ); return; } int size = getAppropriateSize( maxAmount, noveltyInfoList ); + Map< String, IMogoMarker > existCarMap = purgeMarkerData( noveltyInfoList, ModuleNames.CARD_TYPE_NOVELTY ); for ( int i = 0; i < size; i++ ) { MarkerNoveltyInfo noveltyInfo = noveltyInfoList.get( i ); MarkerLocation markerLocation = noveltyInfo.getLocation(); @@ -628,10 +394,83 @@ public class MapMarkerManager implements IMogoMarkerClickListener, } else { markerShowEntity.setTextContent( noveltyInfo.getContentData().getTitle() ); } - drawMapMarker( markerShowEntity ); + String sn = getCarSnFromEntity( noveltyInfo ); + IMogoMarker mogoMarker = existCarMap.get( sn ); + if ( mogoMarker == null ) { + drawMapMarker( markerShowEntity ); + } } } + /** + * S = (A ∩ B) ∪ B + * (A ∩ B)作为旧列表需要保留的部分 + * + * @param newList + * @return + */ + private Map< String, IMogoMarker > purgeMarkerData( List newList, String markerType ) { + + final long start = System.currentTimeMillis(); + Map< String, IMogoMarker > existMap = new HashMap<>(); + List< IMogoMarker > allCarsList = MarkerServiceHandler.getMarkerManager().getMarkers( markerType ); + if ( allCarsList == null || allCarsList.isEmpty() ) { + return existMap; + } + if ( newList == null || newList.isEmpty() ) { + return existMap; + } + + Map< String, IMogoMarker > allMap = new HashMap<>(); + for ( IMogoMarker marker : allCarsList ) { + String sn = getCarSnFromMarker( marker ); + allMap.put( sn, marker ); + } + for ( Object entity : newList ) { + String sn = getCarSnFromEntity( entity ); + if ( allMap.containsKey( sn ) ) { + existMap.put( sn, allMap.get( sn ) ); + } + } + for ( String sn : allMap.keySet() ) { + if ( !existMap.containsKey( sn ) ) { + IMogoMarker dirtyMarker = allMap.get( sn ); + allCarsList.remove( dirtyMarker ); + dirtyMarker.destroy(); + } + } + allMap.clear(); + Logger.i( "timer", "purge data cost " + ( System.currentTimeMillis() - start ) + "ms" ); + return existMap; + } + + private String getCarSnFromEntity( Object entity ) { + try { + if ( entity instanceof MarkerOnlineCar ) { + return ( ( MarkerOnlineCar ) entity ).getUserInfo().getSn(); + } else if ( entity instanceof MarkerShareMusic ) { + return ( ( MarkerShareMusic ) entity ).getUserInfo().getSn(); + } else if ( entity instanceof MarkerNoveltyInfo ) { + return ( ( MarkerNoveltyInfo ) entity ).getSn(); + } else if ( entity instanceof MarkerExploreWay ) { + return ( ( MarkerExploreWay ) entity ).getUserInfo().getSn(); + } + } catch ( Exception e ) { + + } + return ""; + } + + private String getCarSnFromMarker( IMogoMarker marker ) { + if ( marker == null || marker.getObject() == null || marker.isDestroyed() ) { + return null; + } + if ( !( marker.getObject() instanceof MarkerShowEntity ) ) { + return null; + } + return getCarSnFromEntity( ( ( MarkerShowEntity ) marker.getObject() ).getBindObj() ); + } + /** * @param maxAmount 展示的最大数量 * @param list @@ -811,18 +650,14 @@ public class MapMarkerManager implements IMogoMarkerClickListener, */ public synchronized IMogoMarker drawMapMarker( MarkerShowEntity markerShowEntity ) { try { - return drawMapMarker( markerShowEntity, isSmallType() ); + return drawMapMarkerImpl( markerShowEntity ); } catch ( Exception e ) { e.printStackTrace(); return null; } } - private boolean isSmallType() { - return !TextUtils.isEmpty( mCurrentModuleName ) && mLastCheckMarker != null && !mLastCheckMarker.isDestroyed() && TextUtils.equals( mCurrentModuleName, mLastCheckMarker.getOwner() ); - } - - private IMogoMarker drawMapMarker( MarkerShowEntity markerShowEntity, boolean isSmall ) { + private IMogoMarker drawMapMarkerImpl( MarkerShowEntity markerShowEntity ) { if ( markerShowEntity == null || markerShowEntity.getMarkerLocation() == null ) { return null; } @@ -843,12 +678,6 @@ public class MapMarkerManager implements IMogoMarkerClickListener, marker.setOwner( markerShowEntity.getMarkerType() ); markerView.setMarker( marker ); marker.setOnMarkerClickListener( this ); - - if ( isSmall ) { - List< IMogoMarker > markers = new ArrayList<>(); - markers.add( marker ); - setMarkersSmall( markers ); - } markerShowEntity.setMarker( marker ); return marker; } @@ -906,9 +735,6 @@ public class MapMarkerManager implements IMogoMarkerClickListener, } List< MarkerOnlineCar > onlineCarList = result.getOnlineCar(); - if ( !MarkerServiceHandler.getMogoStatusManager().isADASShow() ) { - dispatchDataToBis( ServiceConst.CARD_TYPE_USER_DATA, onlineCarList == null ? new ArrayList<>() : onlineCarList ); - } if ( MarkerServiceHandler.getMogoStatusManager().isSearchUIShow() ) { return; } @@ -933,15 +759,7 @@ public class MapMarkerManager implements IMogoMarkerClickListener, if ( MarkerServiceHandler.getMogoStatusManager().isSearchUIShow() ) { return true; } - if ( MarkerServiceHandler.getMogoStatusManager().isADASShow() ) { - return false; - } - if ( TextUtils.equals( ServiceConst.CARD_TYPE_USER_DATA, mCurrentModuleName ) - || TextUtils.equals( ServiceConst.CARD_TYPE_BUSINESS_OPERATION, mCurrentModuleName ) - || TextUtils.equals( ServiceConst.CARD_TYPE_CARS_CHATTING, mCurrentModuleName ) ) { - return false; - } - return true; + return false; } private void removeCarMarkers() { @@ -1016,7 +834,7 @@ public class MapMarkerManager implements IMogoMarkerClickListener, } public String getCurrentModuleName() { - return mCurrentModuleName; + return ""; } @Override 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 b2c827db12..346667562f 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 @@ -160,9 +160,11 @@ public interface IMogoServiceApis extends IProvider { /** * 地址操作 + * Deprecated, use {@link IMogoSearchManager} instead. * * @return */ + @Deprecated IMogoAddressManager getAddressManagerApi(); /** diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/map/IMogoMapService.java b/services/mogo-service-api/src/main/java/com/mogo/service/map/IMogoMapService.java index d4a794ea16..dce52487ec 100644 --- a/services/mogo-service-api/src/main/java/com/mogo/service/map/IMogoMapService.java +++ b/services/mogo-service-api/src/main/java/com/mogo/service/map/IMogoMapService.java @@ -41,6 +41,7 @@ public interface IMogoMapService extends IProvider { * @param context * @return 定位实例 */ + @Deprecated IMogoLocationClient getLocationClient( Context context ); /** diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/module/IMogoAddressManager.java b/services/mogo-service-api/src/main/java/com/mogo/service/module/IMogoAddressManager.java index 617023ea53..cd83a54470 100644 --- a/services/mogo-service-api/src/main/java/com/mogo/service/module/IMogoAddressManager.java +++ b/services/mogo-service-api/src/main/java/com/mogo/service/module/IMogoAddressManager.java @@ -6,22 +6,28 @@ import com.mogo.map.MogoLatLng; /** * @author zyz * 2020-01-12. + *

+ * Deprecated, use {@link IMogoSearchManager} instead." */ +@Deprecated public interface IMogoAddressManager extends IProvider { /** * 回家 */ + @Deprecated void goHome(); /** * 去公司 */ + @Deprecated void goCompany(); /** * 打开搜索 */ + @Deprecated void goSearch(); /** @@ -29,12 +35,15 @@ public interface IMogoAddressManager extends IProvider { * * @param destination 目的地 */ + @Deprecated void calculatePath( MogoLatLng destination ); /** * 分类搜索 */ - void categorySearch(String category); + @Deprecated + void categorySearch( String category ); + @Deprecated void goSettings(); } diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/module/IMogoSearchManager.java b/services/mogo-service-api/src/main/java/com/mogo/service/module/IMogoSearchManager.java index c477e5ecf0..92b1fe5067 100644 --- a/services/mogo-service-api/src/main/java/com/mogo/service/module/IMogoSearchManager.java +++ b/services/mogo-service-api/src/main/java/com/mogo/service/module/IMogoSearchManager.java @@ -1,6 +1,7 @@ package com.mogo.service.module; import com.alibaba.android.arouter.facade.template.IProvider; +import com.mogo.map.MogoLatLng; /** * @author zyz @@ -8,11 +9,35 @@ import com.alibaba.android.arouter.facade.template.IProvider; */ public interface IMogoSearchManager extends IProvider { + /** + * 回家 + */ void goHome(); + + /** + * 去公司 + */ void goCompany(); + + /** + * 打开搜索 + */ void showSearch(); - void showMain(); - void speakDraft(); - void speakDetail(); - void showCategory(String keyword); + + /** + * 规划路线 + * + * @param destination 目的地 + */ + void calculatePath( MogoLatLng destination ); + + /** + * 分类搜索 + */ + void categorySearch( String keyword ); + + /** + * 打开导航设置 + */ + void goSettings(); } diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/module/IMogoSettingManager.java b/services/mogo-service-api/src/main/java/com/mogo/service/module/IMogoSettingManager.java index 5c7bacd731..f043179468 100644 --- a/services/mogo-service-api/src/main/java/com/mogo/service/module/IMogoSettingManager.java +++ b/services/mogo-service-api/src/main/java/com/mogo/service/module/IMogoSettingManager.java @@ -8,8 +8,51 @@ import com.alibaba.android.arouter.facade.template.IProvider; */ public interface IMogoSettingManager extends IProvider { + /** + * 路线偏好 + * + * @return + */ int getPathPrefer(); + + /** + * 音量 + * + * @return + */ int getVolume(); + + /** + * 获取播报模式 + * + * @return + */ int getVoiceStyle(); + + /** + * 日夜墨水 + * + * @return + */ int getMapType(); + + /** + * 简洁播报 + */ + void speakDraft(); + + /** + * 详细播报 + */ + void speakDetail(); + + /** + * 打开巡航模式 + */ + void openAimlessMode(); + + /** + * 关闭巡航模式 + */ + void closeAimlessMode(); }