From 3b2072dff2688cb619f19f810076a887ee4695bb Mon Sep 17 00:00:00 2001 From: Dmitry Yunitsky Date: Fri, 23 Oct 2015 17:00:21 +0300 Subject: [PATCH] [android] Added fullscreen mode. --- android/res/anim/slide_appear_down.xml | 10 -- android/res/anim/slide_disappear_up.xml | 10 -- .../src/com/mapswithme/maps/MapFragment.java | 24 +++- .../src/com/mapswithme/maps/MwmActivity.java | 80 ++++++++++--- .../com/mapswithme/maps/PanelAnimator.java | 4 +- .../FloatingSearchToolbarController.java | 8 +- .../maps/widget/WebViewShadowController.java | 2 +- .../PlacePageBottomAnimationController.java | 4 +- .../PlacePageLeftAnimationController.java | 4 +- .../src/com/mapswithme/util/Animations.java | 112 ++++++++++++++++++ android/src/com/mapswithme/util/UiUtils.java | 7 +- map/framework.cpp | 38 +++--- 12 files changed, 225 insertions(+), 78 deletions(-) delete mode 100644 android/res/anim/slide_appear_down.xml delete mode 100644 android/res/anim/slide_disappear_up.xml create mode 100644 android/src/com/mapswithme/util/Animations.java diff --git a/android/res/anim/slide_appear_down.xml b/android/res/anim/slide_appear_down.xml deleted file mode 100644 index 3c4502cb29..0000000000 --- a/android/res/anim/slide_appear_down.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/android/res/anim/slide_disappear_up.xml b/android/res/anim/slide_disappear_up.xml deleted file mode 100644 index fbe4136682..0000000000 --- a/android/res/anim/slide_disappear_up.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/android/src/com/mapswithme/maps/MapFragment.java b/android/src/com/mapswithme/maps/MapFragment.java index 5cc0cb23bb..26f9da5f31 100644 --- a/android/src/com/mapswithme/maps/MapFragment.java +++ b/android/src/com/mapswithme/maps/MapFragment.java @@ -45,6 +45,7 @@ public class MapFragment extends BaseMwmFragment private static final int INVALID_TOUCH_ID = -1; private int mHeight; + private int mWidth; private boolean mRequireResize; private boolean mEngineCreated; @@ -58,14 +59,15 @@ public class MapFragment extends BaseMwmFragment private void setupWidgets(int width, int height) { mHeight = height; + mWidth = width; nativeSetupWidget(WIDGET_RULER, - width - UiUtils.dimen(R.dimen.margin_ruler_right), + mWidth - UiUtils.dimen(R.dimen.margin_ruler_right), mHeight - UiUtils.dimen(R.dimen.margin_ruler_bottom), ANCHOR_RIGHT_BOTTOM); nativeSetupWidget(WIDGET_COPYRIGHT, - width / 2, + mWidth / 2, UiUtils.dimen(R.dimen.margin_base), ANCHOR_TOP); @@ -77,19 +79,29 @@ public class MapFragment extends BaseMwmFragment ANCHOR_LEFT_TOP); } - setupCompass(0, false); + setupCompass(0, 0, false); } - void setupCompass(int offset, boolean forceRedraw) + void setupCompass(int offsetX, int offsetY, boolean forceRedraw) { nativeSetupWidget(WIDGET_COMPASS, - UiUtils.dimen(R.dimen.margin_compass_left) + offset, - mHeight - UiUtils.dimen(R.dimen.margin_compass_bottom), + UiUtils.dimen(R.dimen.margin_compass_left) + offsetX, + mHeight - UiUtils.dimen(R.dimen.margin_compass_bottom) + offsetY, ANCHOR_CENTER); if (forceRedraw) nativeApplyWidgets(); } + void setupRuler(int offsetX, int offsetY, boolean forceRedraw) + { + nativeSetupWidget(WIDGET_RULER, + mWidth - UiUtils.dimen(R.dimen.margin_ruler_right) + offsetX, + mHeight - UiUtils.dimen(R.dimen.margin_ruler_bottom) + offsetY, + ANCHOR_RIGHT_BOTTOM); + if (forceRedraw) + nativeApplyWidgets(); + } + private void onRenderingInitialized() { final Activity activity = getActivity(); diff --git a/android/src/com/mapswithme/maps/MwmActivity.java b/android/src/com/mapswithme/maps/MwmActivity.java index 9a0240d794..da73a00eb5 100644 --- a/android/src/com/mapswithme/maps/MwmActivity.java +++ b/android/src/com/mapswithme/maps/MwmActivity.java @@ -121,6 +121,7 @@ public class MwmActivity extends BaseMwmFragmentActivity private ImageButton mBtnZoomOut; private boolean mIsFragmentContainer; + private boolean mIsFullscreen; private LocationPredictor mLocationPredictor; private FloatingSearchToolbarController mSearchController; @@ -833,14 +834,14 @@ public class MwmActivity extends BaseMwmFragmentActivity switch (newMode) { - case LocationState.UNKNOWN_POSITION: - pauseLocation(); - break; - case LocationState.PENDING_POSITION: - resumeLocation(); - break; - default: - break; + case LocationState.UNKNOWN_POSITION: + pauseLocation(); + break; + case LocationState.PENDING_POSITION: + resumeLocation(); + break; + default: + break; } } @@ -1007,6 +1008,7 @@ public class MwmActivity extends BaseMwmFragmentActivity private void activateMapObject(MapObject object) { + setFullscreen(false); if (!mPlacePage.hasMapObject(object)) { mPlacePage.setMapObject(object); @@ -1022,6 +1024,48 @@ public class MwmActivity extends BaseMwmFragmentActivity { if (!mPlacePage.hasMapObject(null)) mPlacePage.hide(); + else + { + if ((mPanelAnimator != null && mPanelAnimator.isVisible()) || + UiUtils.isVisible(mSearchController.getToolbar())) + return; + + setFullscreen(!mIsFullscreen); + } + } + + private void setFullscreen(boolean isFullscreen) + { + mIsFullscreen = isFullscreen; + if (isFullscreen) + { + Animations.disappearSliding(mMainMenu.getFrame(), Animations.BOTTOM, new Runnable() + { + @Override + public void run() + { + final int menuHeight = mMainMenu.getFrame().getHeight(); + adjustCompass(0, menuHeight); + adjustRuler(0, menuHeight); + } + }); + Animations.disappearSliding(mBtnZoomOut, Animations.RIGHT, null); + Animations.disappearSliding(mBtnZoomIn, Animations.RIGHT, null); + } + else + { + Animations.appearSliding(mMainMenu.getFrame(), Animations.BOTTOM, new Runnable() + { + @Override + public void run() + { + adjustCompass(0, 0); + adjustRuler(0, 0); + } + }); + Animations.appearSliding(mBtnZoomOut, Animations.RIGHT, null); + Animations.appearSliding(mBtnZoomIn, Animations.RIGHT, null); + } } @Override @@ -1121,29 +1165,31 @@ public class MwmActivity extends BaseMwmFragmentActivity public boolean run(MwmActivity target) { if (mDoAutoDownload) - { Framework.downloadCountry(mIndex); - // set zoom level so that download process is visible - Framework.nativeShowCountry(mIndex, true); - } - else - Framework.nativeShowCountry(mIndex, false); - + Framework.nativeShowCountry(mIndex, mDoAutoDownload); return true; } } - public void adjustCompass(int offset) + public void adjustCompass(int offsetX, int offsetY) { if (mMapFragment == null || !mMapFragment.isAdded()) return; - mMapFragment.setupCompass(mPanelAnimator.isVisible() ? offset : 0, true /* forceRedraw */); + mMapFragment.setupCompass((mPanelAnimator != null && mPanelAnimator.isVisible()) ? offsetX : 0, offsetY, true); if (mLastCompassData != null) MapFragment.nativeCompassUpdated(mLastCompassData.magneticNorth, mLastCompassData.trueNorth, true); } + public void adjustRuler(int offsetX, int offsetY) + { + if (mMapFragment == null || !mMapFragment.isAdded()) + return; + + mMapFragment.setupRuler(offsetX, offsetY, true); + } + @Override public void onCategoryChanged(int bookmarkId, int newCategoryId) { diff --git a/android/src/com/mapswithme/maps/PanelAnimator.java b/android/src/com/mapswithme/maps/PanelAnimator.java index bd5382f04a..5413737ced 100644 --- a/android/src/com/mapswithme/maps/PanelAnimator.java +++ b/android/src/com/mapswithme/maps/PanelAnimator.java @@ -82,7 +82,7 @@ class PanelAnimator public void onAnimationEnd(Animator animation) { mAnimationTrackListener.onTrackFinished(true); - mActivity.adjustCompass(WIDTH); + mActivity.adjustCompass(WIDTH, 0); } }); @@ -118,7 +118,7 @@ class PanelAnimator { UiUtils.hide(mPanel); mAnimationTrackListener.onTrackFinished(false); - mActivity.adjustCompass(0); + mActivity.adjustCompass(0, 0); if (completionListener != null) completionListener.run(); diff --git a/android/src/com/mapswithme/maps/search/FloatingSearchToolbarController.java b/android/src/com/mapswithme/maps/search/FloatingSearchToolbarController.java index e1031b659b..e054ebdee2 100644 --- a/android/src/com/mapswithme/maps/search/FloatingSearchToolbarController.java +++ b/android/src/com/mapswithme/maps/search/FloatingSearchToolbarController.java @@ -5,7 +5,7 @@ import android.text.TextUtils; import com.mapswithme.maps.MwmActivity; import com.mapswithme.maps.api.ParsedMwmRequest; import com.mapswithme.maps.widget.SearchToolbarController; -import com.mapswithme.util.UiUtils; +import com.mapswithme.util.Animations; public class FloatingSearchToolbarController extends SearchToolbarController { @@ -42,12 +42,12 @@ public class FloatingSearchToolbarController extends SearchToolbarController if (ParsedMwmRequest.hasRequest()) { - UiUtils.appearSlidingDown(mToolbar, null); + Animations.appearSliding(mToolbar, Animations.TOP, null); setQuery(ParsedMwmRequest.getCurrentRequest().getTitle()); } else if (!TextUtils.isEmpty(SearchEngine.getQuery())) { - UiUtils.appearSlidingDown(mToolbar, null); + Animations.appearSliding(mToolbar, Animations.TOP, null); setQuery(SearchEngine.getQuery()); } else @@ -73,7 +73,7 @@ public class FloatingSearchToolbarController extends SearchToolbarController if (!UiUtils.isVisible(mToolbar)) return false; - UiUtils.disappearSlidingUp(mToolbar, null); + Animations.disappearSliding(mToolbar, Animations.TOP, null); return true; } } diff --git a/android/src/com/mapswithme/maps/widget/WebViewShadowController.java b/android/src/com/mapswithme/maps/widget/WebViewShadowController.java index f2431d8bc7..99cb0f82e4 100644 --- a/android/src/com/mapswithme/maps/widget/WebViewShadowController.java +++ b/android/src/com/mapswithme/maps/widget/WebViewShadowController.java @@ -18,7 +18,7 @@ public class WebViewShadowController extends BaseShadowController 0); case BOTTOM: - return (mList.getScrollY() + mList.getHeight() < UiUtils.dp(mList.getContentHeight() - 1)); + return (mList.getScrollY() + mList.getHeight() < UiUtils.toPx(mList.getContentHeight() - 1)); default: throw new IllegalArgumentException("Invalid shadow id: " + id); diff --git a/android/src/com/mapswithme/maps/widget/placepage/PlacePageBottomAnimationController.java b/android/src/com/mapswithme/maps/widget/placepage/PlacePageBottomAnimationController.java index 7558f35f39..a6262043e9 100644 --- a/android/src/com/mapswithme/maps/widget/placepage/PlacePageBottomAnimationController.java +++ b/android/src/com/mapswithme/maps/widget/placepage/PlacePageBottomAnimationController.java @@ -103,8 +103,8 @@ class PlacePageBottomAnimationController extends BasePlacePageAnimationControlle { mGestureDetector = new GestureDetectorCompat(mPlacePage.getContext(), new GestureDetector.SimpleOnGestureListener() { - private final int Y_MIN = UiUtils.dp(10); - private final int Y_MAX = UiUtils.dp(50); + private final int Y_MIN = UiUtils.toPx(10); + private final int Y_MAX = UiUtils.toPx(50); private static final int X_TO_Y_SCROLL_RATIO = 2; @Override diff --git a/android/src/com/mapswithme/maps/widget/placepage/PlacePageLeftAnimationController.java b/android/src/com/mapswithme/maps/widget/placepage/PlacePageLeftAnimationController.java index c5eb40949f..1ff768bb20 100644 --- a/android/src/com/mapswithme/maps/widget/placepage/PlacePageLeftAnimationController.java +++ b/android/src/com/mapswithme/maps/widget/placepage/PlacePageLeftAnimationController.java @@ -61,8 +61,8 @@ class PlacePageLeftAnimationController extends BasePlacePageAnimationController { mGestureDetector = new GestureDetectorCompat(mPlacePage.getContext(), new GestureDetector.SimpleOnGestureListener() { - private final int X_MIN = UiUtils.dp(30); - private final int X_MAX = UiUtils.dp(100); + private final int X_MIN = UiUtils.toPx(30); + private final int X_MAX = UiUtils.toPx(100); private static final int X_TO_Y_SCROLL_RATIO = 2; @Override diff --git a/android/src/com/mapswithme/util/Animations.java b/android/src/com/mapswithme/util/Animations.java new file mode 100644 index 0000000000..5b241c8ad4 --- /dev/null +++ b/android/src/com/mapswithme/util/Animations.java @@ -0,0 +1,112 @@ +package com.mapswithme.util; + +import android.animation.Animator; +import android.support.annotation.IntDef; +import android.support.annotation.Nullable; +import android.view.View; +import android.view.ViewPropertyAnimator; + +import com.mapswithme.maps.MwmApplication; +import com.mapswithme.maps.R; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +public final class Animations +{ + private Animations() {} + + @IntDef({LEFT, RIGHT, TOP, BOTTOM}) + @Retention(RetentionPolicy.SOURCE) + public @interface AnimationDirection {} + public static final int LEFT = 0; + public static final int RIGHT = 1; + public static final int TOP = 2; + public static final int BOTTOM = 3; + + private static final int DURATION_DEFAULT = MwmApplication.get().getResources().getInteger(R.integer.anim_default); + + public static void appearSliding(final View view, @AnimationDirection int appearFrom, @Nullable final Runnable completionListener) + { + if (UiUtils.isVisible(view)) + { + if (completionListener != null) + completionListener.run(); + return; + } + + final ViewPropertyAnimator animator = view.animate().setDuration(DURATION_DEFAULT).alpha(1).setListener(new UiUtils.SimpleAnimatorListener() + { + @Override + public void onAnimationEnd(Animator animation) + { + if (completionListener != null) + completionListener.run(); + } + }); + + switch (appearFrom) + { + case LEFT: + case RIGHT: + animator.translationX(0); + break; + case TOP: + case BOTTOM: + animator.translationY(0); + break; + } + + UiUtils.show(view); + } + + public static void disappearSliding(final View view, @AnimationDirection int disappearTo, @Nullable final Runnable completionListener) + { + if (!UiUtils.isVisible(view)) + { + if (completionListener != null) + completionListener.run(); + return; + } + + final ViewPropertyAnimator animator = view.animate().setDuration(DURATION_DEFAULT).alpha(0).setListener(new UiUtils.SimpleAnimatorListener() + { + @Override + public void onAnimationEnd(Animator animation) + { + UiUtils.hide(view); + if (completionListener != null) + completionListener.run(); + } + }); + + switch (disappearTo) + { + case RIGHT: + animator.translationX(view.getWidth()); + break; + case LEFT: + animator.translationX(-view.getWidth()); + break; + case BOTTOM: + animator.translationY(view.getHeight()); + break; + case TOP: + animator.translationY(-view.getHeight()); + break; + } + } + + public static void exchangeViews(final View viewToHide, final @AnimationDirection int disappearTo, + final View viewToShow, final @AnimationDirection int appearFrom, @Nullable final Runnable completionListener) + { + disappearSliding(viewToHide, disappearTo, new Runnable() + { + @Override + public void run() + { + appearSliding(viewToShow, appearFrom, completionListener); + } + }); + } +} diff --git a/android/src/com/mapswithme/util/UiUtils.java b/android/src/com/mapswithme/util/UiUtils.java index 5eed8d2304..8560c005b4 100644 --- a/android/src/com/mapswithme/util/UiUtils.java +++ b/android/src/com/mapswithme/util/UiUtils.java @@ -10,7 +10,6 @@ import android.provider.Settings; import android.support.annotation.DimenRes; import android.support.annotation.IdRes; import android.support.annotation.NonNull; -import android.support.annotation.Nullable; import android.support.v7.app.AlertDialog; import android.support.v7.widget.Toolbar; import android.text.TextUtils; @@ -19,7 +18,6 @@ import android.view.View; import android.view.ViewTreeObserver; import android.view.animation.Animation; import android.view.animation.Animation.AnimationListener; -import android.view.animation.AnimationUtils; import android.widget.TextView; import com.mapswithme.maps.MwmApplication; @@ -29,7 +27,6 @@ public final class UiUtils { private static float sScreenDensity; - public static class SimpleAnimationListener implements AnimationListener { @Override @@ -385,12 +382,12 @@ public final class UiUtils return MwmApplication.get().getResources().getDimensionPixelSize(id); } - public static int dp(int v) + public static int toPx(int dp) { if (sScreenDensity == 0) sScreenDensity = MwmApplication.get().getResources().getDisplayMetrics().density; - return (int) (v * sScreenDensity + 0.5); + return (int) (dp * sScreenDensity + 0.5); } // utility class diff --git a/map/framework.cpp b/map/framework.cpp index 0ab7056cb6..b371e4ed10 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -1559,26 +1559,26 @@ PoiMarkPoint * Framework::GetAddressMark(m2::PointD const & globalPoint) const void Framework::ActivateUserMark(UserMark const * mark, bool needAnim) { - if (m_activateUserMarkFn) - { - if (mark) - { - m_activateUserMarkFn(mark->Copy()); - m2::PointD pt = mark->GetPivot(); - df::SelectionShape::ESelectedObject object = df::SelectionShape::OBJECT_USER_MARK; - UserMark::Type type = mark->GetMarkType(); - if (type == UserMark::Type::MY_POSITION) - object = df::SelectionShape::OBJECT_MY_POSITION; - else if (type == UserMark::Type::POI) - object = df::SelectionShape::OBJECT_POI; + if (!m_activateUserMarkFn) + return; - CallDrapeFunction(bind(&df::DrapeEngine::SelectObject, _1, object, pt, needAnim)); - } - else - { - m_activateUserMarkFn(nullptr); - CallDrapeFunction(bind(&df::DrapeEngine::DeselectObject, _1)); - } + if (mark) + { + m_activateUserMarkFn(mark->Copy()); + m2::PointD pt = mark->GetPivot(); + df::SelectionShape::ESelectedObject object = df::SelectionShape::OBJECT_USER_MARK; + UserMark::Type type = mark->GetMarkType(); + if (type == UserMark::Type::MY_POSITION) + object = df::SelectionShape::OBJECT_MY_POSITION; + else if (type == UserMark::Type::POI) + object = df::SelectionShape::OBJECT_POI; + + CallDrapeFunction(bind(&df::DrapeEngine::SelectObject, _1, object, pt, needAnim)); + } + else + { + m_activateUserMarkFn(nullptr); + CallDrapeFunction(bind(&df::DrapeEngine::DeselectObject, _1)); } }