diff --git a/android/res/layout-land/activity_map.xml b/android/res/layout-land/activity_map.xml
index ca25b13a35..75392ffb3e 100644
--- a/android/res/layout-land/activity_map.xml
+++ b/android/res/layout-land/activity_map.xml
@@ -44,8 +44,12 @@
android:background="@android:color/black"
android:visibility="gone"/>
-
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentBottom="true"
+ android:layout_alignParentRight="true"
+ android:padding="@dimen/margin_small"/>
\ No newline at end of file
diff --git a/android/res/layout-sw600dp-land/activity_map.xml b/android/res/layout-sw600dp-land/activity_map.xml
index e260e20aa9..e0c4808e29 100644
--- a/android/res/layout-sw600dp-land/activity_map.xml
+++ b/android/res/layout-sw600dp-land/activity_map.xml
@@ -52,8 +52,12 @@
android:layout_height="?attr/actionBarSize"
android:layout_margin="@dimen/margin_medium"/>
-
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentBottom="true"
+ android:layout_alignParentRight="true"
+ android:padding="@dimen/margin_small"/>
\ No newline at end of file
diff --git a/android/res/layout-sw600dp/activity_map.xml b/android/res/layout-sw600dp/activity_map.xml
index cfd6f43b61..e04efd0d51 100644
--- a/android/res/layout-sw600dp/activity_map.xml
+++ b/android/res/layout-sw600dp/activity_map.xml
@@ -52,8 +52,11 @@
android:layout_height="match_parent"
android:layout_margin="@dimen/margin_medium"/>
-
-
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentBottom="true"
+ android:layout_alignParentRight="true"
+ android:padding="@dimen/margin_small"/>
\ No newline at end of file
diff --git a/android/res/layout-sw720dp/activity_map.xml b/android/res/layout-sw720dp/activity_map.xml
index c45f4c3874..39ab64141b 100644
--- a/android/res/layout-sw720dp/activity_map.xml
+++ b/android/res/layout-sw720dp/activity_map.xml
@@ -51,8 +51,12 @@
android:layout_height="?attr/actionBarSize"
android:layout_margin="@dimen/margin_medium"/>
-
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentBottom="true"
+ android:layout_alignParentRight="true"
+ android:padding="@dimen/margin_small"/>
\ No newline at end of file
diff --git a/android/res/layout/activity_map.xml b/android/res/layout/activity_map.xml
index 6d85cd5f1c..469472c99c 100644
--- a/android/res/layout/activity_map.xml
+++ b/android/res/layout/activity_map.xml
@@ -51,7 +51,11 @@
android:background="@android:color/black"
android:visibility="gone"/>
-
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentBottom="true"
+ android:layout_alignParentRight="true"
+ android:padding="@dimen/margin_small"/>
\ No newline at end of file
diff --git a/android/res/layout/map_bottom_buttons.xml b/android/res/layout/map_bottom_buttons.xml
index a7713d832a..5f9c040432 100644
--- a/android/res/layout/map_bottom_buttons.xml
+++ b/android/res/layout/map_bottom_buttons.xml
@@ -1,10 +1,9 @@
-
-
+ android:layout_alignParentRight="true">
-
\ No newline at end of file
+
+
+
+
+
\ 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 5f485f070c..6c7d067fff 100644
--- a/android/src/com/mapswithme/maps/MWMActivity.java
+++ b/android/src/com/mapswithme/maps/MWMActivity.java
@@ -7,7 +7,6 @@ import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.Point;
-import android.graphics.drawable.AnimationDrawable;
import android.location.Location;
import android.os.Build;
import android.os.Bundle;
@@ -31,8 +30,6 @@ import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
-import android.view.animation.AccelerateInterpolator;
-import android.view.animation.LinearInterpolator;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ProgressBar;
@@ -69,6 +66,7 @@ import com.mapswithme.maps.settings.SettingsActivity;
import com.mapswithme.maps.settings.StoragePathManager;
import com.mapswithme.maps.settings.StoragePathManager.SetStoragePathListener;
import com.mapswithme.maps.settings.UnitLocale;
+import com.mapswithme.maps.widget.BottomButtonsLayout;
import com.mapswithme.maps.widget.FadeView;
import com.mapswithme.maps.widget.placepage.BasePlacePageAnimationController;
import com.mapswithme.maps.widget.placepage.PlacePageView;
@@ -83,9 +81,7 @@ import com.mapswithme.util.Yota;
import com.mapswithme.util.statistics.AlohaHelper;
import com.mapswithme.util.statistics.Statistics;
import com.nineoldandroids.animation.Animator;
-import com.nineoldandroids.animation.AnimatorSet;
import com.nineoldandroids.animation.ObjectAnimator;
-import com.nineoldandroids.animation.ValueAnimator;
import com.nineoldandroids.view.ViewHelper;
import java.io.Serializable;
@@ -114,6 +110,7 @@ public class MWMActivity extends BaseMwmFragmentActivity
private static final String STATE_PP_OPENED = "PpOpened";
private static final String STATE_MAP_OBJECT = "MapObject";
private static final String STATE_BUTTONS_OPENED = "ButtonsOpened";
+ private static final int BASE_ANIM_DURATION = 30;
// Map tasks that we run AFTER rendering initialized
private final Stack mTasks = new Stack<>();
private BroadcastReceiver mExternalStorageReceiver;
@@ -146,31 +143,6 @@ public class MWMActivity extends BaseMwmFragmentActivity
// but they shall not be reinitialized on screen orientation changing.
private static boolean mStorageAvailable = false;
private static boolean mStorageWritable = true;
- // Buttons
- private static final long BUTTONS_ANIM_DURATION = 30;
- private static final long BUTTONS_ANIM_DURATION_LONG = 35;
- private ViewGroup mBottomButtons;
- private ImageView mBtnBookmarks;
- private ImageView mBtnSearch;
- private ImageView mBtnDownloader;
- private ImageView mBtnShare;
- private ImageView mBtnSettings;
- private ImageButton mBtnMenu;
- private View mLlBookmarks;
- private View mLlSearch;
- private View mLlDownloader;
- private View mLlShare;
- private View mLlSettings;
- private TextView mTvOutdatedCount;
- private View mTvShare;
- private View mTvBookmarks;
- private View mTvDownloader;
- private View mTvSettings;
- private View mTvSearch;
-
- private AnimationDrawable mAnimMenu;
- private AnimationDrawable mAnimMenuReversed;
- private AnimatorSet mButtonsAnimation;
private FadeView mFadeView;
@@ -178,6 +150,7 @@ public class MWMActivity extends BaseMwmFragmentActivity
private View mToolbarSearch;
private ImageButton mBtnZoomIn;
private ImageButton mBtnZoomOut;
+ private BottomButtonsLayout mBottomButtons;
private static final String IS_KML_MOVED = "KmlBeenMoved";
private static final String IS_KITKAT_MIGRATION_COMPLETED = "KitKatMigrationCompleted";
@@ -264,7 +237,7 @@ public class MWMActivity extends BaseMwmFragmentActivity
{
final double lat = Double.parseDouble(intent.getStringExtra(EXTRA_LAT));
final double lon = Double.parseDouble(intent.getStringExtra(EXTRA_LON));
- mBottomButtons.getHandler().postDelayed(new Runnable()
+ mFadeView.getHandler().postDelayed(new Runnable()
{
@Override
public void run()
@@ -599,8 +572,8 @@ public class MWMActivity extends BaseMwmFragmentActivity
@Override
public void onFadeOut()
{
- if (areBottomButtonsVisible())
- toggleMenuButtons();
+ if (mBottomButtons.areButtonsVisible())
+ mBottomButtons.slideButtonsOut();
}
@Override
@@ -622,34 +595,14 @@ public class MWMActivity extends BaseMwmFragmentActivity
@SuppressWarnings("deprecation")
private void initNavigationButtons()
{
- mBottomButtons = (ViewGroup) findViewById(R.id.map_bottom_buttons);
- mBtnBookmarks = (ImageView) mBottomButtons.findViewById(R.id.btn__bookmarks);
- mLlBookmarks = mBottomButtons.findViewById(R.id.ll__bookmarks);
- mLlBookmarks.setOnClickListener(this);
- mTvBookmarks = mBottomButtons.findViewById(R.id.tv__bookmarks);
- mBtnSearch = (ImageView) mBottomButtons.findViewById(R.id.btn__search);
- mLlSearch = mBottomButtons.findViewById(R.id.ll__search);
- mLlSearch.setOnClickListener(this);
- mTvSearch = mBottomButtons.findViewById(R.id.tv__search);
- mLlDownloader = mBottomButtons.findViewById(R.id.ll__download_maps);
- mLlDownloader.setOnClickListener(this);
- mBtnDownloader = (ImageView) mBottomButtons.findViewById(R.id.btn__download_maps);
- mTvDownloader = mBottomButtons.findViewById(R.id.tv__download_maps);
- mTvOutdatedCount = (TextView) mBottomButtons.findViewById(R.id.tv__outdated_maps_counter);
- mBtnShare = (ImageView) mBottomButtons.findViewById(R.id.btn__share);
- mLlShare = mBottomButtons.findViewById(R.id.ll__share);
- mLlShare.setOnClickListener(this);
- mTvShare = mBottomButtons.findViewById(R.id.tv__share);
- mBtnSettings = (ImageView) mBottomButtons.findViewById(R.id.btn__settings);
- mLlSettings = mBottomButtons.findViewById(R.id.ll__settings);
- mLlSettings.setOnClickListener(this);
- mTvSettings = mBottomButtons.findViewById(R.id.tv__settings);
-
- mBtnMenu = (ImageButton) mBottomButtons.findViewById(R.id.btn__open_menu);
- mBtnMenu.setOnClickListener(this);
- mAnimMenu = (AnimationDrawable) getResources().getDrawable(R.drawable.anim_menu);
- mAnimMenuReversed = (AnimationDrawable) getResources().getDrawable(R.drawable.anim_menu_reversed);
- hideBottomButtons();
+ mBottomButtons = (BottomButtonsLayout) findViewById(R.id.map_bottom_buttons);
+ mBottomButtons.hideButtons();
+ mBottomButtons.findViewById(R.id.btn__open_menu).setOnClickListener(this);
+ mBottomButtons.findViewById(R.id.ll__share).setOnClickListener(this);
+ mBottomButtons.findViewById(R.id.ll__search).setOnClickListener(this);
+ mBottomButtons.findViewById(R.id.ll__download_maps).setOnClickListener(this);
+ mBottomButtons.findViewById(R.id.ll__bookmarks).setOnClickListener(this);
+ mBottomButtons.findViewById(R.id.ll__settings).setOnClickListener(this);
mNavigationButtons = (ViewGroup) findViewById(R.id.navigation_buttons);
mBtnZoomIn = (ImageButton) mNavigationButtons.findViewById(R.id.map_button_plus);
@@ -717,7 +670,7 @@ public class MWMActivity extends BaseMwmFragmentActivity
outState.putBoolean(STATE_PP_OPENED, true);
outState.putParcelable(STATE_MAP_OBJECT, mPlacePage.getMapObject());
}
- else if (areBottomButtonsVisible())
+ else if (mBottomButtons.areButtonsVisible())
outState.putBoolean(STATE_BUTTONS_OPENED, true);
super.onSaveInstanceState(outState);
@@ -736,31 +689,13 @@ public class MWMActivity extends BaseMwmFragmentActivity
if (savedInstanceState.getBoolean(STATE_BUTTONS_OPENED))
{
- mFadeView.fadeIn(false);
- showBottomButtons();
+ mFadeView.fadeInInstantly();
+ mBottomButtons.showButtons();
}
- else
- hideBottomButtons();
super.onRestoreInstanceState(savedInstanceState);
}
- private void showBottomButtons()
- {
- UiUtils.show(mLlBookmarks, mLlDownloader, mLlSettings, mLlShare, mLlSearch);
- refreshOutdatedMapsCounter();
- }
-
- private void hideBottomButtons()
- {
- UiUtils.hide(mLlBookmarks, mLlDownloader, mLlSettings, mLlShare, mLlSearch);
- // IMPORTANT views after alpha animations with 'setFillAfter' on 2.3 can't become GONE, until clearAnimation is called.
- UiUtils.hideAfterAlphaAnimation(mLlSearch, mLlBookmarks, mLlDownloader, mLlSettings, mLlShare);
- if (mButtonsAnimation != null && mButtonsAnimation.isRunning())
- mButtonsAnimation.end();
- mBtnMenu.setVisibility(View.VISIBLE);
- }
-
@Override
protected void onNewIntent(Intent intent)
{
@@ -1149,9 +1084,9 @@ public class MWMActivity extends BaseMwmFragmentActivity
hidePlacePage();
Framework.deactivatePopup();
}
- else if (areBottomButtonsVisible())
+ else if (mBottomButtons.areButtonsVisible())
{
- toggleMenuButtons();
+ mBottomButtons.toggle();
mFadeView.fadeOut(false);
}
else if (canFragmentInterceptBackPress())
@@ -1159,7 +1094,7 @@ public class MWMActivity extends BaseMwmFragmentActivity
return;
else if (popFragment())
{
- InputUtils.hideKeyboard(mBottomButtons);
+ InputUtils.hideKeyboard(mFadeView);
mFadeView.fadeOut(false);
}
else
@@ -1381,93 +1316,31 @@ public class MWMActivity extends BaseMwmFragmentActivity
return !(UiUtils.isBigTablet() || (UiUtils.isSmallTablet() && getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE));
}
- private void slideBottomButtonsIn()
- {
- mBtnMenu.setVisibility(View.GONE);
- refreshOutdatedMapsCounter();
- mButtonsAnimation = new AnimatorSet();
- mLlSearch.setVisibility(View.VISIBLE);
- final float baseY = ViewCompat.getY(mLlSearch);
- mButtonsAnimation.play(generateMenuAnimator(mLlBookmarks, baseY - ViewCompat.getY(mLlBookmarks)));
- mButtonsAnimation.play(generateMenuAnimator(mLlDownloader, baseY - ViewCompat.getY(mLlDownloader)));
- mButtonsAnimation.play(generateMenuAnimator(mLlSettings, baseY - ViewCompat.getY(mLlSettings)));
- mButtonsAnimation.play(generateMenuAnimator(mLlShare, baseY - ViewCompat.getY(mLlShare)));
- mButtonsAnimation.addListener(new UiUtils.SimpleNineoldAnimationListener()
- {
- @Override
- public void onAnimationEnd(Animator animation)
- {
- mBtnMenu.setVisibility(View.GONE);
- }
- });
- mButtonsAnimation.start();
- }
-
- private void slideBottomButtonsOut()
- {
- hideBottomButtons();
- }
-
- private Animator generateMenuAnimator(@NonNull final View layout, final float translationY)
- {
- final float durationMultiplier = translationY / layout.getHeight();
- final AnimatorSet result = new AnimatorSet();
- ValueAnimator animator = ObjectAnimator.ofFloat(layout, "translationY", translationY, 0);
- animator.addListener(new UiUtils.SimpleNineoldAnimationListener()
- {
- @Override
- public void onAnimationStart(Animator animation)
- {
- layout.setVisibility(View.VISIBLE);
- ViewCompat.setAlpha(layout, 0);
- }
- });
- animator.setInterpolator(new LinearInterpolator());
- animator.setDuration((long) (BUTTONS_ANIM_DURATION * durationMultiplier));
- result.play(animator);
-
- animator = ObjectAnimator.ofFloat(layout, "alpha", 0, 1);
- animator.setDuration((long) (BUTTONS_ANIM_DURATION_LONG * durationMultiplier));
- animator.setInterpolator(new AccelerateInterpolator());
- result.play(animator);
-
- return result;
- }
-
- private void refreshOutdatedMapsCounter()
- {
- final int count = ActiveCountryTree.getOutOfDateCount();
- if (count == 0)
- mTvOutdatedCount.setVisibility(View.GONE);
- else
- UiUtils.setTextAndShow(mTvOutdatedCount, String.valueOf(count));
- }
-
@Override
public void onClick(View v)
{
switch (v.getId())
{
- case R.id.btn__share:
case R.id.ll__share:
AlohaHelper.logClick(AlohaHelper.MENU_SHARE);
shareMyLocation();
- hideBottomButtons();
- UiUtils.hideAfterAlphaAnimation(mFadeView);
+ mBottomButtons.hideButtons();
+ UiUtils.hide(mFadeView);
+ UiUtils.clearAnimationAfterAlpha(mFadeView);
break;
- case R.id.btn__settings:
case R.id.ll__settings:
AlohaHelper.logClick(AlohaHelper.MENU_SETTINGS);
startActivity(new Intent(this, SettingsActivity.class));
- hideBottomButtons();
- UiUtils.hideAfterAlphaAnimation(mFadeView);
+ mBottomButtons.hideButtons();
+ UiUtils.hide(mFadeView);
+ UiUtils.clearAnimationAfterAlpha(mFadeView);
break;
- case R.id.btn__download_maps:
case R.id.ll__download_maps:
AlohaHelper.logClick(AlohaHelper.MENU_DOWNLOADER);
showDownloader(false);
- hideBottomButtons();
- UiUtils.hideAfterAlphaAnimation(mFadeView);
+ mBottomButtons.hideButtons();
+ UiUtils.hide(mFadeView);
+ UiUtils.clearAnimationAfterAlpha(mFadeView);
break;
case R.id.rl__route:
AlohaHelper.logClick(AlohaHelper.PP_ROUTE);
@@ -1496,21 +1369,21 @@ public class MWMActivity extends BaseMwmFragmentActivity
case R.id.btn__open_menu:
AlohaHelper.logClick(AlohaHelper.TOOLBAR_MENU);
mFadeView.fadeIn(false);
- toggleMenuButtons();
+ mBottomButtons.toggle();
break;
- case R.id.btn__search:
case R.id.ll__search:
AlohaHelper.logClick(AlohaHelper.TOOLBAR_SEARCH);
showSearchIfUpdated();
- hideBottomButtons();
- UiUtils.hideAfterAlphaAnimation(mFadeView);
+ mBottomButtons.hideButtons();
+ UiUtils.hide(mFadeView);
+ UiUtils.clearAnimationAfterAlpha(mFadeView);
break;
- case R.id.btn__bookmarks:
case R.id.ll__bookmarks:
AlohaHelper.logClick(AlohaHelper.TOOLBAR_BOOKMARKS);
showBookmarks();
- hideBottomButtons();
- UiUtils.hideAfterAlphaAnimation(mFadeView);
+ mBottomButtons.hideButtons();
+ UiUtils.hide(mFadeView);
+ UiUtils.clearAnimationAfterAlpha(mFadeView);
break;
case R.id.btn__myposition:
switchNextLocationState();
@@ -1533,27 +1406,6 @@ public class MWMActivity extends BaseMwmFragmentActivity
}
}
- private void toggleMenuButtons()
- {
- if (areBottomButtonsVisible())
- {
- mBtnMenu.setImageDrawable(mAnimMenuReversed);
- mAnimMenuReversed.start();
- slideBottomButtonsOut();
- }
- else
- {
- mBtnSearch.setImageDrawable(mAnimMenu);
- mAnimMenu.start();
- slideBottomButtonsIn();
- }
- }
-
- private boolean areBottomButtonsVisible()
- {
- return mLlSearch.getVisibility() == View.VISIBLE;
- }
-
private void followRoute()
{
Framework.nativeFollowRoute();
@@ -1656,11 +1508,11 @@ public class MWMActivity extends BaseMwmFragmentActivity
{
if (keyCode == KeyEvent.KEYCODE_MENU)
{
- if (areBottomButtonsVisible())
+ if (mBottomButtons.areButtonsVisible())
mFadeView.fadeOut(false);
else
mFadeView.fadeIn(false);
- toggleMenuButtons();
+ mBottomButtons.toggle();
return true;
}
return super.onKeyUp(keyCode, event);
@@ -1701,7 +1553,7 @@ public class MWMActivity extends BaseMwmFragmentActivity
mLayoutRoutingGo.setVisibility(View.VISIBLE);
Animator animator = ObjectAnimator.ofFloat(mRlRoutingBox, "alpha", 0, 1);
- animator.setDuration(BUTTONS_ANIM_DURATION);
+ animator.setDuration(BASE_ANIM_DURATION);
animator.start();
mRlRoutingBox.setVisibility(View.VISIBLE);
diff --git a/android/src/com/mapswithme/maps/widget/BottomButtonsLayout.java b/android/src/com/mapswithme/maps/widget/BottomButtonsLayout.java
new file mode 100644
index 0000000000..2ea16284d9
--- /dev/null
+++ b/android/src/com/mapswithme/maps/widget/BottomButtonsLayout.java
@@ -0,0 +1,209 @@
+package com.mapswithme.maps.widget;
+
+import android.content.Context;
+import android.graphics.drawable.AnimationDrawable;
+import android.support.annotation.NonNull;
+import android.support.v4.view.ViewCompat;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.animation.AccelerateInterpolator;
+import android.view.animation.LinearInterpolator;
+import android.widget.ImageButton;
+import android.widget.ImageView;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+
+import com.mapswithme.country.ActiveCountryTree;
+import com.mapswithme.maps.R;
+import com.mapswithme.util.UiUtils;
+import com.nineoldandroids.animation.Animator;
+import com.nineoldandroids.animation.AnimatorSet;
+import com.nineoldandroids.animation.ObjectAnimator;
+import com.nineoldandroids.animation.ValueAnimator;
+
+/**
+ * Layout for bottom menu button & sliding menu(search, settings, etc)
+ */
+public class BottomButtonsLayout extends RelativeLayout
+{
+ private static final long BUTTONS_ANIM_DURATION = 30;
+ private static final long BUTTONS_ANIM_DURATION_LONG = 35;
+ private ImageView mBtnSearch;
+ private ImageButton mBtnMenu;
+ private View mLlBookmarks;
+ private View mLlSearch;
+ private View mLlDownloader;
+ private View mLlShare;
+ private View mLlSettings;
+ private TextView mTvOutdatedCount;
+
+ private AnimationDrawable mAnimMenu;
+ private AnimationDrawable mAnimMenuReversed;
+ private AnimatorSet mButtonsAnimation;
+
+ public BottomButtonsLayout(Context context)
+ {
+ this(context, null, 0);
+ }
+
+ public BottomButtonsLayout(Context context, AttributeSet attrs)
+ {
+ this(context, attrs, 0);
+ }
+
+ public BottomButtonsLayout(Context context, AttributeSet attrs, int defStyleAttr)
+ {
+ super(context, attrs, defStyleAttr);
+ LayoutInflater.from(getContext()).inflate(R.layout.map_bottom_buttons, this);
+ initButtons();
+ }
+
+ @SuppressWarnings("deprecation")
+ private void initButtons()
+ {
+ ViewGroup root = (ViewGroup) findViewById(R.id.map_bottom_buttons);
+ mLlBookmarks = root.findViewById(R.id.ll__bookmarks);
+ mBtnSearch = (ImageView) root.findViewById(R.id.btn__search);
+ mLlSearch = root.findViewById(R.id.ll__search);
+ mLlDownloader = root.findViewById(R.id.ll__download_maps);
+ mTvOutdatedCount = (TextView) root.findViewById(R.id.tv__outdated_maps_counter);
+ mLlShare = root.findViewById(R.id.ll__share);
+ mLlSettings = root.findViewById(R.id.ll__settings);
+ mBtnMenu = (ImageButton) root.findViewById(R.id.btn__open_menu);
+
+ mAnimMenu = (AnimationDrawable) getResources().getDrawable(R.drawable.anim_menu);
+ mAnimMenuReversed = (AnimationDrawable) getResources().getDrawable(R.drawable.anim_menu_reversed);
+ }
+
+ /**
+ * Toggles state of layout - ie shows, if buttons are hidden and hides otherwise
+ */
+ public void toggle()
+ {
+ if (areButtonsVisible())
+ slideButtonsOut();
+ else
+ slideButtonsIn();
+ }
+
+ /**
+ * @return true, if buttons are opened
+ */
+ public boolean areButtonsVisible()
+ {
+ return mLlSearch.getVisibility() == View.VISIBLE;
+ }
+
+ /**
+ * Hides buttons immediately
+ */
+ public void hideButtons()
+ {
+ UiUtils.invisible(mLlBookmarks, mLlDownloader, mLlSettings, mLlShare, mLlSearch);
+ // IMPORTANT views after alpha animations with 'setFillAfter' on 2.3 can't become GONE, until clearAnimationAfterAlpha is called.
+ UiUtils.clearAnimationAfterAlpha(mLlSearch, mLlBookmarks, mLlDownloader, mLlSettings, mLlShare);
+ if (mButtonsAnimation != null && mButtonsAnimation.isRunning())
+ mButtonsAnimation.end();
+
+ mBtnMenu.setImageResource(R.drawable.btn_green_menu);
+ mBtnMenu.setVisibility(View.VISIBLE);
+ }
+
+ /**
+ * Show buttons immediately
+ */
+ public void showButtons()
+ {
+ UiUtils.show(mLlBookmarks, mLlDownloader, mLlSettings, mLlShare, mLlSearch);
+ mBtnMenu.setVisibility(View.GONE);
+ refreshOutdatedMapsCounter();
+ }
+
+ /**
+ * Shows buttons with animation
+ */
+ public void slideButtonsIn()
+ {
+ playMenuButtonAnimation();
+ mBtnMenu.setVisibility(View.GONE);
+ refreshOutdatedMapsCounter();
+ mButtonsAnimation = new AnimatorSet();
+ mLlSearch.setVisibility(View.VISIBLE);
+ final float baseY = ViewCompat.getY(mLlSearch);
+ mButtonsAnimation.play(generateMenuAnimator(mLlBookmarks, baseY - ViewCompat.getY(mLlBookmarks)));
+ mButtonsAnimation.play(generateMenuAnimator(mLlDownloader, baseY - ViewCompat.getY(mLlDownloader)));
+ mButtonsAnimation.play(generateMenuAnimator(mLlSettings, baseY - ViewCompat.getY(mLlSettings)));
+ mButtonsAnimation.play(generateMenuAnimator(mLlShare, baseY - ViewCompat.getY(mLlShare)));
+ mButtonsAnimation.addListener(new UiUtils.SimpleNineoldAnimationListener()
+ {
+ @Override
+ public void onAnimationEnd(Animator animation)
+ {
+ mBtnMenu.setVisibility(View.GONE);
+ }
+ });
+ mButtonsAnimation.start();
+ }
+
+ /**
+ * Hides buttons with animation
+ */
+ public void slideButtonsOut()
+ {
+ hideButtons();
+ playReverseMenuButtonAnimation();
+ }
+
+ private Animator generateMenuAnimator(@NonNull final View layout, final float translationY)
+ {
+ final float durationMultiplier = translationY / layout.getHeight();
+ final AnimatorSet result = new AnimatorSet();
+ ValueAnimator animator = ObjectAnimator.ofFloat(layout, "translationY", translationY, 0);
+ animator.addListener(new UiUtils.SimpleNineoldAnimationListener()
+ {
+ @Override
+ public void onAnimationStart(Animator animation)
+ {
+ layout.setVisibility(View.VISIBLE);
+ ViewCompat.setAlpha(layout, 0);
+ }
+ });
+ animator.setInterpolator(new LinearInterpolator());
+ animator.setDuration((long) (BUTTONS_ANIM_DURATION * durationMultiplier));
+ result.play(animator);
+
+ animator = ObjectAnimator.ofFloat(layout, "alpha", 0, 1);
+ animator.setDuration((long) (BUTTONS_ANIM_DURATION_LONG * durationMultiplier));
+ animator.setInterpolator(new AccelerateInterpolator());
+ result.play(animator);
+
+ return result;
+ }
+
+ private void refreshOutdatedMapsCounter()
+ {
+ final int count = ActiveCountryTree.getOutOfDateCount();
+ if (count == 0)
+ mTvOutdatedCount.setVisibility(View.GONE);
+ else
+ UiUtils.setTextAndShow(mTvOutdatedCount, String.valueOf(count));
+ }
+
+ private void playMenuButtonAnimation()
+ {
+ mAnimMenu.selectDrawable(0);
+ mAnimMenu.stop();
+ mBtnSearch.setImageDrawable(mAnimMenu);
+ mAnimMenu.start();
+ }
+
+ private void playReverseMenuButtonAnimation()
+ {
+ mAnimMenuReversed.selectDrawable(0);
+ mAnimMenuReversed.stop();
+ mBtnMenu.setImageDrawable(mAnimMenuReversed);
+ mAnimMenuReversed.start();
+ }
+}
diff --git a/android/src/com/mapswithme/maps/widget/FadeView.java b/android/src/com/mapswithme/maps/widget/FadeView.java
index b38a257019..a78171ee03 100644
--- a/android/src/com/mapswithme/maps/widget/FadeView.java
+++ b/android/src/com/mapswithme/maps/widget/FadeView.java
@@ -2,6 +2,7 @@ package com.mapswithme.maps.widget;
import android.content.Context;
import android.support.annotation.NonNull;
+import android.support.v4.view.ViewCompat;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
@@ -24,7 +25,8 @@ public class FadeView extends FrameLayout
@Override
public void onAnimationEnd(Animator animation)
{
- UiUtils.hideAfterAlphaAnimation(FadeView.this);
+ setVisibility(View.GONE);
+ UiUtils.clearAnimationAfterAlpha(FadeView.this);
if (mFadeListener != null && mDoNotify)
mFadeListener.onFadeOut();
}
@@ -71,6 +73,7 @@ public class FadeView extends FrameLayout
/**
* Fades out view and notifies on animation end, if requested
+ *
* @param notify whether we want notification
*/
public void fadeIn(boolean notify)
@@ -84,6 +87,7 @@ public class FadeView extends FrameLayout
/**
* Fades out view and notifies on animation end, if requested
+ *
* @param notify whether we want notification
*/
public void fadeOut(boolean notify)
@@ -104,6 +108,18 @@ public class FadeView extends FrameLayout
return mFadeOutAnimation != null && mFadeOutAnimation.isRunning();
}
+ public void fadeInInstantly()
+ {
+ setVisibility(View.VISIBLE);
+ ViewCompat.setAlpha(this, FADE_ALPHA_VALUE);
+ }
+
+ public void fadeOutInstantly()
+ {
+ setVisibility(View.GONE);
+ ViewCompat.setAlpha(this, 0);
+ }
+
@Override
public boolean onTouchEvent(@NonNull MotionEvent event)
{
diff --git a/android/src/com/mapswithme/util/UiUtils.java b/android/src/com/mapswithme/util/UiUtils.java
index 3535e9645e..b459be87b1 100644
--- a/android/src/com/mapswithme/util/UiUtils.java
+++ b/android/src/com/mapswithme/util/UiUtils.java
@@ -63,16 +63,13 @@ public final class UiUtils
}
/*
- Views after alpha animations with 'setFillAfter' on 2.3 can't become GONE, until clearAnimation is called.
+ Views after alpha animations with 'setFillAfter' on 2.3 can't become GONE, until clearAnimationAfterAlpha is called.
*/
- public static void hideAfterAlphaAnimation(View... views)
+ public static void clearAnimationAfterAlpha(View... views)
{
- for (final View view : views)
- {
- hide(view);
- if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB)
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB)
+ for (final View view : views)
view.clearAnimation();
- }
}
public static Drawable drawCircle(int color, int sizeResId, Resources res)
@@ -341,7 +338,8 @@ public final class UiUtils
/**
* View's default getHitRect() had a bug and would not apply transforms properly.
* More details : http://stackoverflow.com/questions/17750116/strange-view-gethitrect-behaviour
- * @param v view
+ *
+ * @param v view
* @param rect rect
*/
public static void getHitRect(View v, Rect rect)
@@ -354,7 +352,8 @@ public final class UiUtils
/**
* Tests, whether views intercects each other in parent coordinates.
- * @param firstView base view
+ *
+ * @param firstView base view
* @param secondView covering view
* @return intersects or not
*/