From cc12287acf19728990d9b8a1d14ff7825c915ea3 Mon Sep 17 00:00:00 2001 From: Roman Romanov Date: Wed, 28 Dec 2016 10:59:40 +0400 Subject: [PATCH] [android] Review fixes --- ...ion.xml => fragment_search_categories.xml} | 2 +- .../src/com/mapswithme/maps/MwmActivity.java | 15 ++- .../NavigationButtonsAnimationController.java | 103 +++++++++++------- .../maps/routing/RoutingController.java | 14 +-- .../maps/routing/RoutingPlanController.java | 42 ++++++- .../mapswithme/maps/routing/SlotFrame.java | 18 ++- .../maps/search/SearchActivity.java | 9 +- .../maps/search/SearchCategoriesFragment.java | 2 +- .../src/com/mapswithme/util/Animations.java | 42 ++++--- 9 files changed, 163 insertions(+), 84 deletions(-) rename android/res/layout/{fragment_recycler_no_elevation.xml => fragment_search_categories.xml} (94%) diff --git a/android/res/layout/fragment_recycler_no_elevation.xml b/android/res/layout/fragment_search_categories.xml similarity index 94% rename from android/res/layout/fragment_recycler_no_elevation.xml rename to android/res/layout/fragment_search_categories.xml index 8690ded633..37244008d4 100644 --- a/android/res/layout/fragment_recycler_no_elevation.xml +++ b/android/res/layout/fragment_search_categories.xml @@ -6,4 +6,4 @@ android:layout_height="match_parent"> - \ No newline at end of file + diff --git a/android/src/com/mapswithme/maps/MwmActivity.java b/android/src/com/mapswithme/maps/MwmActivity.java index d25354117d..5b81acce93 100644 --- a/android/src/com/mapswithme/maps/MwmActivity.java +++ b/android/src/com/mapswithme/maps/MwmActivity.java @@ -106,6 +106,7 @@ public class MwmActivity extends BaseMwmFragmentActivity RoutingController.Container, LocationHelper.UiCallback, RoutingPlanController.OnToggleListener, + RoutingPlanController.SearchPoiTransitionListener, FloatingSearchToolbarController.VisibilityListener { public static final String EXTRA_TASK = "map_task"; @@ -455,6 +456,7 @@ public class MwmActivity extends BaseMwmFragmentActivity { mRoutingPlanInplaceController = new RoutingPlanInplaceController(this); mRoutingPlanInplaceController.setOnToggleListener(this); + mRoutingPlanInplaceController.setPoiTransitionListener(this); removeCurrentFragment(false); } @@ -549,7 +551,8 @@ public class MwmActivity extends BaseMwmFragmentActivity ImageButton traffic = (ImageButton) frame.findViewById(R.id.traffic); mTraffic = new TrafficButton(this, traffic); mTrafficButtonController = new TrafficButtonController(mTraffic, this); - mNavAnimationController = new NavigationButtonsAnimationController(zoomIn, zoomOut, myPosition); + mNavAnimationController = new NavigationButtonsAnimationController( + zoomIn, zoomOut, myPosition, getWindow().getDecorView().getRootView()); } public boolean closePlacePage() @@ -1385,7 +1388,6 @@ public class MwmActivity extends BaseMwmFragmentActivity private void adjustMenuLineFrameVisibility() { final RoutingController controller = RoutingController.get(); - final int menuHeight = getCurrentMenu().getFrame().getHeight(); if (controller.isBuilt() || controller.isUberRequestHandled()) { @@ -1394,7 +1396,6 @@ public class MwmActivity extends BaseMwmFragmentActivity @Override public void run() { - adjustCompass(0); adjustRuler(0, 0); } }); @@ -1408,7 +1409,7 @@ public class MwmActivity extends BaseMwmFragmentActivity @Override public void run() { - adjustCompass(menuHeight); + final int menuHeight = getCurrentMenu().getFrame().getHeight(); adjustRuler(0, menuHeight); } }); @@ -1420,7 +1421,6 @@ public class MwmActivity extends BaseMwmFragmentActivity @Override public void run() { - adjustCompass(0); adjustRuler(0, 0); } }); @@ -1439,7 +1439,10 @@ public class MwmActivity extends BaseMwmFragmentActivity public void showRoutePlan(boolean show, @Nullable Runnable completionListener) { if (mNavAnimationController != null && !mIsFragmentContainer) - mNavAnimationController.slide(show); + { + mNavAnimationController.setBottomLimit(show ? 0 : getCurrentMenu().getFrame().getHeight()); + mNavAnimationController.slide(show, getCurrentMenu().getFrame().getHeight()); + } if (show) { mSearchController.hide(); diff --git a/android/src/com/mapswithme/maps/NavigationButtonsAnimationController.java b/android/src/com/mapswithme/maps/NavigationButtonsAnimationController.java index 4af215217c..a02931e3c3 100644 --- a/android/src/com/mapswithme/maps/NavigationButtonsAnimationController.java +++ b/android/src/com/mapswithme/maps/NavigationButtonsAnimationController.java @@ -23,17 +23,20 @@ class NavigationButtonsAnimationController private final View mMyPosition; private final float mMargin; - private float mBottom; - private float mTop; + private float mContentHeight; + private float mMyPositionBottom; - private boolean mIsZoomAnimate; - private boolean mIsMyPosAnimate; - private boolean mIsSlideDown; + private boolean mZoomAnimate; + private boolean mMyPosAnimate; + private boolean mSlideDown; - private final float mMenuHeight; + private float mTopLimit; + private float mBottomLimit; + + private float mCurrentOffset; NavigationButtonsAnimationController(@NonNull View zoomIn, @NonNull View zoomOut, - @NonNull View myPosition) + @NonNull View myPosition, @NonNull final View contentView) { mZoomIn = zoomIn; mZoomOut = zoomOut; @@ -41,20 +44,30 @@ class NavigationButtonsAnimationController mMyPosition = myPosition; Resources res = mZoomIn.getResources(); mMargin = res.getDimension(R.dimen.margin_base_plus); - mMenuHeight = res.getDimension(R.dimen.menu_line_height); + mBottomLimit = res.getDimension(R.dimen.menu_line_height); calculateLimitTranslations(); + contentView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() + { + @Override + public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, + int oldTop, int oldRight, int oldBottom) + { + mContentHeight = bottom - top; + contentView.removeOnLayoutChangeListener(this); + } + }); } private void calculateLimitTranslations() { - mTop = mMargin; + mTopLimit = mMargin; mMyPosition.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { @Override public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { - mBottom = bottom + mMargin; + mMyPositionBottom = bottom; mMyPosition.removeOnLayoutChangeListener(this); } }); @@ -62,22 +75,29 @@ class NavigationButtonsAnimationController void setTopLimit(float limit) { - mTop = limit + mMargin; + mTopLimit = limit + mMargin; + update(); + } + + void setBottomLimit(float limit) + { + mBottomLimit = limit; update(); } private void fadeOutZoom() { - if (mIsSlideDown) + if (mSlideDown) return; - mIsZoomAnimate = true; + + mZoomAnimate = true; Animations.fadeOutView(mZoomIn, new Runnable() { @Override public void run() { mZoomIn.setVisibility(View.INVISIBLE); - mIsZoomAnimate = false; + mZoomAnimate = false; } }); Animations.fadeOutView(mZoomOut, new Runnable() @@ -92,7 +112,7 @@ class NavigationButtonsAnimationController private void fadeInZoom() { - mIsZoomAnimate = true; + mZoomAnimate = true; mZoomIn.setVisibility(View.VISIBLE); mZoomOut.setVisibility(View.VISIBLE); Animations.fadeInView(mZoomIn, new Runnable() @@ -100,7 +120,7 @@ class NavigationButtonsAnimationController @Override public void run() { - mIsZoomAnimate = false; + mZoomAnimate = false; } }); Animations.fadeInView(mZoomOut, null); @@ -108,43 +128,43 @@ class NavigationButtonsAnimationController private void fadeOutMyPosition() { - if (mIsSlideDown) + if (mSlideDown) return; - mIsMyPosAnimate = true; + mMyPosAnimate = true; Animations.fadeOutView(mMyPosition, new Runnable() { @Override public void run() { UiUtils.invisible(mMyPosition); - mIsMyPosAnimate = false; + mMyPosAnimate = false; } }); } private void fadeInMyPosition() { - mIsMyPosAnimate = true; + mMyPosAnimate = true; mMyPosition.setVisibility(View.VISIBLE); Animations.fadeInView(mMyPosition, new Runnable() { @Override public void run() { - mIsMyPosAnimate = false; + mMyPosAnimate = false; } }); } void onPlacePageMoved(float translationY) { - if (UiUtils.isLandscape(mMyPosition.getContext()) || mBottom == 0) + if (UiUtils.isLandscape(mMyPosition.getContext()) || mMyPositionBottom == 0 || mContentHeight == 0) return; - final float amount = mZoomIn.getTranslationY() > 0 ? mMenuHeight : 0; - final float translation = translationY - mBottom; - update(translation <= amount ? translation : amount); + final float amount = mCurrentOffset > 0 ? mMargin : -mMargin; + final float translation = translationY - (mMyPositionBottom - mCurrentOffset + amount); + update(translation <= mCurrentOffset ? translation : mCurrentOffset); } private void update() @@ -157,35 +177,33 @@ class NavigationButtonsAnimationController mMyPosition.setTranslationY(translation); mZoomOut.setTranslationY(translation); mZoomIn.setTranslationY(translation); - if (!mIsZoomAnimate && isOverTopLimit(mZoomIn)) + if (!mZoomAnimate && mZoomIn.getVisibility() == View.VISIBLE + && !isViewInsideLimits(mZoomIn)) { fadeOutZoom(); } - else if (!mIsZoomAnimate && satisfyTopLimit(mZoomIn)) + else if (!mZoomAnimate && mZoomIn.getVisibility() == View.INVISIBLE + && isViewInsideLimits(mZoomIn)) { fadeInZoom(); } - if (!shouldBeHidden() && !mIsMyPosAnimate - && isOverTopLimit(mMyPosition)) + if (!shouldBeHidden() && !mMyPosAnimate + && mMyPosition.getVisibility() == View.VISIBLE && !isViewInsideLimits(mMyPosition)) { fadeOutMyPosition(); } - else if (!shouldBeHidden() && !mIsMyPosAnimate - && satisfyTopLimit(mMyPosition)) + else if (!shouldBeHidden() && !mMyPosAnimate + && mMyPosition.getVisibility() == View.INVISIBLE && isViewInsideLimits(mMyPosition)) { fadeInMyPosition(); } } - private boolean isOverTopLimit(@NonNull View view) + private boolean isViewInsideLimits(@NonNull View view) { - return view.getVisibility() == View.VISIBLE && view.getY() <= mTop; - } - - private boolean satisfyTopLimit(@NonNull View view) - { - return view.getVisibility() == View.INVISIBLE && view.getY() >= mTop; + return view.getY() >= mTopLimit && + view.getBottom() + view.getTranslationY() <= mContentHeight - mBottomLimit; } private boolean shouldBeHidden() @@ -194,15 +212,16 @@ class NavigationButtonsAnimationController && (RoutingController.get().isPlanning() || RoutingController.get().isNavigating()); } - void slide(boolean isDown) + void slide(boolean isDown, float distance) { if (UiUtils.isLandscape(mMyPosition.getContext()) || (!isDown && mZoomIn.getTranslationY() <= 0)) return; - mIsSlideDown = isDown; + mSlideDown = isDown; + mCurrentOffset = isDown ? distance : 0; - ValueAnimator animator = ValueAnimator.ofFloat(isDown ? 0 : mMenuHeight, isDown ? mMenuHeight : 0); + ValueAnimator animator = ValueAnimator.ofFloat(isDown ? 0 : distance, isDown ? distance : 0); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override @@ -217,7 +236,7 @@ class NavigationButtonsAnimationController @Override public void onAnimationEnd(Animator animation) { - mIsSlideDown = false; + mSlideDown = false; update(); } }); diff --git a/android/src/com/mapswithme/maps/routing/RoutingController.java b/android/src/com/mapswithme/maps/routing/RoutingController.java index 850ce6f0a4..dd96affceb 100644 --- a/android/src/com/mapswithme/maps/routing/RoutingController.java +++ b/android/src/com/mapswithme/maps/routing/RoutingController.java @@ -75,8 +75,6 @@ public class RoutingController * @param progress progress to be displayed. * */ void updateBuildProgress(@IntRange(from = 0, to = 100) int progress, @Framework.RouterType int router); - - void animateSearchPoiTransition(@NonNull Rect startRect, @Nullable Runnable runnable); } private static final RoutingController sInstance = new RoutingController(); @@ -754,7 +752,7 @@ public class RoutingController build(); } - void searchPoi(int slotId, @NonNull Rect startRect) + void searchPoi(int slotId) { mLogger.d("searchPoi: " + slotId); Statistics.INSTANCE.trackEvent(Statistics.EventName.ROUTING_SEARCH_POINT); @@ -762,14 +760,8 @@ public class RoutingController mWaitingPoiPickSlot = slotId; if (mContainer != null) { - mContainer.animateSearchPoiTransition(startRect, new Runnable() { - @Override - public void run() - { - mContainer.showSearch(); - mContainer.updateMenu(); - } - }); + mContainer.showSearch(); + mContainer.updateMenu(); } } diff --git a/android/src/com/mapswithme/maps/routing/RoutingPlanController.java b/android/src/com/mapswithme/maps/routing/RoutingPlanController.java index fa624fb6e0..a40563fe32 100644 --- a/android/src/com/mapswithme/maps/routing/RoutingPlanController.java +++ b/android/src/com/mapswithme/maps/routing/RoutingPlanController.java @@ -4,6 +4,7 @@ import android.animation.Animator; import android.animation.ValueAnimator; import android.app.Activity; import android.graphics.Bitmap; +import android.graphics.Rect; import android.location.Location; import android.os.Bundle; import android.support.annotation.DrawableRes; @@ -42,7 +43,7 @@ import com.mapswithme.util.Utils; import com.mapswithme.util.statistics.AlohaHelper; import com.mapswithme.util.statistics.Statistics; -public class RoutingPlanController extends ToolbarController +public class RoutingPlanController extends ToolbarController implements SlotFrame.SlotClickListener { static final int ANIM_TOGGLE = MwmApplication.get().getResources().getInteger(R.integer.anim_slots_toggle); private static final String STATE_ALTITUDE_CHART_SHOWN = "altitude_chart_shown"; @@ -62,7 +63,7 @@ public class RoutingPlanController extends ToolbarController private final View mUberFrame; private final RotateDrawable mToggleImage = new RotateDrawable(R.drawable.ic_down); - protected int mFrameHeight; + int mFrameHeight; private int mToolbarHeight; private boolean mOpen; @Nullable @@ -74,11 +75,20 @@ public class RoutingPlanController extends ToolbarController @Nullable private OnToggleListener mToggleListener; + @Nullable + private SearchPoiTransitionListener mPoiTransitionListener; + public interface OnToggleListener { void onToggle(boolean state); } + public interface SearchPoiTransitionListener + { + void animateSearchPoiTransition(@NonNull final Rect startRect, + @Nullable final Runnable runnable); + } + private RadioButton setupRouterButton(@IdRes int buttonId, final @DrawableRes int iconRes, View.OnClickListener clickListener) { CompoundButton.OnCheckedChangeListener listener = new CompoundButton.OnCheckedChangeListener() @@ -109,6 +119,7 @@ public class RoutingPlanController extends ToolbarController mToggle = (ImageView) mToolbar.findViewById(R.id.toggle); mSlotFrame = (SlotFrame) root.findViewById(R.id.slots); + mSlotFrame.setSlotClickListener(this); mRouterTypes = (RadioGroup) mToolbar.findViewById(R.id.route_type); setupRouterButton(R.id.vehicle, R.drawable.ic_car, new View.OnClickListener() @@ -186,7 +197,32 @@ public class RoutingPlanController extends ToolbarController RoutingController.get().cancelPlanning(); } - protected boolean checkFrameHeight() + @Override + public void onSlotClicked(final int order, @NonNull Rect rect) + { + if (mPoiTransitionListener != null) + { + mPoiTransitionListener.animateSearchPoiTransition(rect, new Runnable() + { + @Override + public void run() + { + RoutingController.get().searchPoi(order); + } + }); + } + else + { + RoutingController.get().searchPoi(order); + } + } + + public void setPoiTransitionListener(@Nullable SearchPoiTransitionListener poiTransitionListener) + { + mPoiTransitionListener = poiTransitionListener; + } + + boolean checkFrameHeight() { if (mFrameHeight > 0) return true; diff --git a/android/src/com/mapswithme/maps/routing/SlotFrame.java b/android/src/com/mapswithme/maps/routing/SlotFrame.java index b8f250e714..d6246ded54 100644 --- a/android/src/com/mapswithme/maps/routing/SlotFrame.java +++ b/android/src/com/mapswithme/maps/routing/SlotFrame.java @@ -7,6 +7,7 @@ import android.graphics.Rect; import android.os.Build; import android.support.annotation.IdRes; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.text.TextUtils; import android.util.AttributeSet; import android.view.MotionEvent; @@ -35,6 +36,14 @@ public class SlotFrame extends LinearLayout private int mTextColor; private int mHintColor; + interface SlotClickListener + { + void onSlotClicked(int order, @NonNull Rect rect); + } + + @Nullable + private SlotClickListener mSlotClickListener; + private class Slot { private final View mFrame; @@ -76,7 +85,9 @@ public class SlotFrame extends LinearLayout { Rect rect = new Rect(); mFrame.getGlobalVisibleRect(rect); - RoutingController.get().searchPoi(mOrder, rect); + if (mSlotClickListener != null) + mSlotClickListener.onSlotClicked(mOrder, rect); + //RoutingController.get().searchPoi(mOrder, rect); } }); @@ -336,6 +347,11 @@ public class SlotFrame extends LinearLayout super(context, attrs, defStyleAttr); } + public void setSlotClickListener(@Nullable SlotClickListener slotClickListener) + { + mSlotClickListener = slotClickListener; + } + public void update() { mSlotFrom.setMapObject(RoutingController.get().getStartPoint()); diff --git a/android/src/com/mapswithme/maps/search/SearchActivity.java b/android/src/com/mapswithme/maps/search/SearchActivity.java index 73234dcd9f..010212c088 100644 --- a/android/src/com/mapswithme/maps/search/SearchActivity.java +++ b/android/src/com/mapswithme/maps/search/SearchActivity.java @@ -18,13 +18,12 @@ public class SearchActivity extends BaseMwmFragmentActivity implements CustomNav { public static final String EXTRA_QUERY = "search_query"; - public static void start(Context context, String query) + public static void start(@NonNull Activity activity, String query) { - final Intent i = new Intent(context, SearchActivity.class); + final Intent i = new Intent(activity, SearchActivity.class); i.putExtra(EXTRA_QUERY, query); - context.startActivity(i); - if (context instanceof Activity) - ((Activity) context).overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out); + activity.startActivity(i); + activity.overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out); } @Override diff --git a/android/src/com/mapswithme/maps/search/SearchCategoriesFragment.java b/android/src/com/mapswithme/maps/search/SearchCategoriesFragment.java index 77155d2c74..e0a546e062 100644 --- a/android/src/com/mapswithme/maps/search/SearchCategoriesFragment.java +++ b/android/src/com/mapswithme/maps/search/SearchCategoriesFragment.java @@ -19,7 +19,7 @@ public class SearchCategoriesFragment extends BaseMwmRecyclerFragment @Override protected int getLayoutRes() { - return R.layout.fragment_recycler_no_elevation; + return R.layout.fragment_search_categories; } @Override diff --git a/android/src/com/mapswithme/util/Animations.java b/android/src/com/mapswithme/util/Animations.java index bb41b87079..dfdfeeb25b 100644 --- a/android/src/com/mapswithme/util/Animations.java +++ b/android/src/com/mapswithme/util/Animations.java @@ -143,23 +143,12 @@ public final class Animations }); } - public static void riseTransition(@NonNull ViewGroup rootView, @NonNull final Rect startRect, + public static void riseTransition(@NonNull final ViewGroup rootView, @NonNull final Rect startRect, @Nullable final Runnable runnable) { - Context context = rootView.getContext(); + final Context context = rootView.getContext(); final View view = new View(context); - TypedArray a = null; - try - { - a = context.obtainStyledAttributes(new int[] { R.attr.cardBackgroundColor }); - int color = a.getColor(0, ContextCompat.getColor(context, R.color.bg_cards)); - view.setBackgroundColor(color); - } - finally - { - if (a != null) - a.recycle(); - } + setCardBackgroundColor(view); DisplayMetrics dm = context.getResources().getDisplayMetrics(); final float screenWidth = dm.widthPixels; @@ -202,9 +191,34 @@ public final class Animations { if (runnable != null) runnable.run(); + rootView.postDelayed(new Runnable() + { + @Override + public void run() + { + rootView.removeView(view); + } + }, context.getResources().getInteger(android.R.integer.config_longAnimTime)); } }); animator.setDuration(DURATION_MENU); animator.start(); } + + private static void setCardBackgroundColor(@NonNull View view) + { + Context context = view.getContext(); + TypedArray a = null; + try + { + a = context.obtainStyledAttributes(new int[] { R.attr.cardBackgroundColor }); + int color = a.getColor(0, ContextCompat.getColor(context, R.color.bg_cards)); + view.setBackgroundColor(color); + } + finally + { + if (a != null) + a.recycle(); + } + } }