diff --git a/android/res/values/attrs.xml b/android/res/values/attrs.xml
index c101e936aa..03f5cb033b 100644
--- a/android/res/values/attrs.xml
+++ b/android/res/values/attrs.xml
@@ -94,7 +94,7 @@
-
+
diff --git a/android/src/com/mapswithme/maps/widget/FragmentPageViewProvider.java b/android/src/com/mapswithme/maps/widget/FragmentPageViewProvider.java
new file mode 100644
index 0000000000..8e5b83c861
--- /dev/null
+++ b/android/src/com/mapswithme/maps/widget/FragmentPageViewProvider.java
@@ -0,0 +1,71 @@
+package com.mapswithme.maps.widget;
+
+import android.support.annotation.NonNull;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentManager;
+import android.support.v4.app.FragmentPagerAdapter;
+import android.support.v4.view.ViewPager;
+import android.view.View;
+
+import java.util.NoSuchElementException;
+import java.util.Objects;
+
+public class FragmentPageViewProvider implements PageViewProvider
+{
+ private static final String ANDROID_SWITCHER_TAG_SEGMENT = "android:switcher:";
+ private static final String SEPARATOR_TAG_SEGMENT = ":";
+
+ @NonNull
+ private final FragmentManager mFragManager;
+ private final int mPagerId;
+
+ FragmentPageViewProvider(@NonNull FragmentManager fragManager, @NonNull ViewPager pager)
+ {
+ checkAdapterClass(pager);
+ mFragManager = fragManager;
+ mPagerId = pager.getId();
+ }
+
+ private static void checkAdapterClass(@NonNull ViewPager pager)
+ {
+ try
+ {
+ FragmentPagerAdapter adapter = (FragmentPagerAdapter) pager.getAdapter();
+ if (adapter == null)
+ throw new IllegalStateException("Adapter not found");
+ }
+ catch (ClassCastException e)
+ {
+ throw new IllegalStateException("Adapter has to be FragmentPagerAdapter or its descendant");
+ }
+ }
+
+ @NonNull
+ @Override
+ public View findViewByIndex(int index)
+ {
+ String tag = makePagerFragmentTag(index);
+ Fragment page = getSupportFragmentManager().findFragmentByTag(tag);
+ if (page == null)
+ throw new NoSuchElementException("No such element for tag : " + tag);
+
+ return Objects.requireNonNull(page.getView());
+ }
+
+ private int getId()
+ {
+ return mPagerId;
+ }
+
+ @NonNull
+ private FragmentManager getSupportFragmentManager()
+ {
+ return mFragManager;
+ }
+
+ @NonNull
+ private String makePagerFragmentTag(int index)
+ {
+ return ANDROID_SWITCHER_TAG_SEGMENT + getId() + SEPARATOR_TAG_SEGMENT + index;
+ }
+}
diff --git a/android/src/com/mapswithme/maps/widget/PageViewProvider.java b/android/src/com/mapswithme/maps/widget/PageViewProvider.java
new file mode 100644
index 0000000000..edd363bdfa
--- /dev/null
+++ b/android/src/com/mapswithme/maps/widget/PageViewProvider.java
@@ -0,0 +1,10 @@
+package com.mapswithme.maps.widget;
+
+import android.support.annotation.NonNull;
+import android.view.View;
+
+interface PageViewProvider
+{
+ @NonNull
+ View findViewByIndex(int index);
+}
diff --git a/android/src/com/mapswithme/maps/widget/PageViewProviderFactory.java b/android/src/com/mapswithme/maps/widget/PageViewProviderFactory.java
new file mode 100644
index 0000000000..6c4e9d9188
--- /dev/null
+++ b/android/src/com/mapswithme/maps/widget/PageViewProviderFactory.java
@@ -0,0 +1,15 @@
+package com.mapswithme.maps.widget;
+
+import android.support.annotation.NonNull;
+import android.support.v4.view.ViewPager;
+import android.support.v7.app.AppCompatActivity;
+
+public class PageViewProviderFactory
+{
+ @NonNull
+ static PageViewProvider defaultProvider(@NonNull AppCompatActivity activity,
+ @NonNull ViewPager pager)
+ {
+ return new FragmentPageViewProvider(activity.getSupportFragmentManager(), pager);
+ }
+}
diff --git a/android/src/com/mapswithme/maps/widget/ParallaxBackgroundPageListener.java b/android/src/com/mapswithme/maps/widget/ParallaxBackgroundPageListener.java
index 558477a7ec..db3fd6bbce 100755
--- a/android/src/com/mapswithme/maps/widget/ParallaxBackgroundPageListener.java
+++ b/android/src/com/mapswithme/maps/widget/ParallaxBackgroundPageListener.java
@@ -1,26 +1,21 @@
package com.mapswithme.maps.widget;
import android.support.annotation.NonNull;
-import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ImageView;
+import java.util.Collections;
import java.util.List;
-import java.util.NoSuchElementException;
-import java.util.Objects;
public class ParallaxBackgroundPageListener implements ViewPager.OnPageChangeListener
{
- private static final String ANDROID_SWITCHER_TAG_SEGMENT = "android:switcher:";
- private static final String SEPARATOR_TAG_SEGMENT = ":";
- private static final float POSITION_OFFSET_BASE = 0.5f;
- private static final int POSITION_OFFSET_PIXELS_BASE = 1;
- private static final float ALPHA_TRANSPARENT = 0.0F;
- private static final float ALPHA_OPAQUE = 1.0f;
+ private static final float MIDDLE_POSITION_OFFSET = 0.5f;
+ private static final int MIDDLE_POSITION_OFFSET_PIXELS = 1;
+ private static final float ALPHA_TRANSPARENT = 0;
+ private static final float ALPHA_OPAQUE = 1;
private static final int MINUS_INFINITY_EDGE = -1;
private static final int PLUS_INFINITY_EDGE = 1;
private static final float SETTLED_PAGE_POSITION = 0.0f;
@@ -28,102 +23,91 @@ public class ParallaxBackgroundPageListener implements ViewPager.OnPageChangeLis
@NonNull
private final ViewPager mPager;
@NonNull
- private final FragmentPagerAdapter mAdapter;
- @NonNull
private final AppCompatActivity mActivity;
@NonNull
private final List mItems;
private int mCurrentPagePosition;
- private boolean mIsScrollToRight = true;
- private boolean mIsScrollStarted;
+ private boolean mScrollToRight = true;
+ private boolean mScrollStarted;
private boolean mShouldCalculateScrollDirection;
+ @NonNull
+ private final PageViewProvider mPageViewProvider;
public ParallaxBackgroundPageListener(@NonNull AppCompatActivity activity,
@NonNull ViewPager pager,
- @NonNull FragmentPagerAdapter adapter,
- @NonNull List items)
+ @NonNull List items,
+ @NonNull PageViewProvider pageViewProvider)
{
mPager = pager;
- mAdapter = adapter;
mActivity = activity;
- mItems = items;
+ mItems = Collections.unmodifiableList(items);
+ mPageViewProvider = pageViewProvider;
+ }
+
+ public ParallaxBackgroundPageListener(@NonNull AppCompatActivity activity,
+ @NonNull ViewPager pager,
+ @NonNull List items)
+ {
+ this(activity, pager, items, PageViewProviderFactory.defaultProvider(activity, pager));
}
@Override
public void onPageScrollStateChanged(int state)
{
if (state == ViewPager.SCROLL_STATE_IDLE)
- {
- mCurrentPagePosition = mPager.getCurrentItem();
- mIsScrollToRight = true;
- }
+ setIdlePosition();
- boolean isDragScroll = isDragScroll(state);
+ boolean isDragging = state == ViewPager.SCROLL_STATE_DRAGGING;
+ mScrollStarted = isDragging && !mScrollStarted;
- mIsScrollStarted = isDragScroll;
- if (isDragScroll)
+ if (mScrollStarted)
mShouldCalculateScrollDirection = true;
}
+ private void setIdlePosition()
+ {
+ mCurrentPagePosition = mPager.getCurrentItem();
+ mScrollToRight = true;
+ }
+
@Override
public void onPageSelected(int position)
{
if (position == 0)
- onPageScrollStateChanged(ViewPager.SCROLL_STATE_IDLE);
+ setIdlePosition();
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels)
{
- recalculateScrollDirection(positionOffset, positionOffsetPixels);
+ if (mShouldCalculateScrollDirection)
+ {
+ mScrollToRight =
+ MIDDLE_POSITION_OFFSET > positionOffset && positionOffsetPixels > MIDDLE_POSITION_OFFSET_PIXELS;
+ mShouldCalculateScrollDirection = false;
+ }
int scrollX = mPager.getScrollX();
- if (canScrollToLeft(scrollX) || isRightEdge(scrollX))
+ if (scrollX == 0 && !mScrollToRight || scrollX == mPager.getWidth() * mItems.size())
return;
- int animatedItemIndex = mIsScrollToRight ? mCurrentPagePosition : mCurrentPagePosition - 1;
+ int animatedItemIndex = mScrollToRight ? mCurrentPagePosition : mCurrentPagePosition - 1;
setAlpha(animatedItemIndex, scrollX);
- if (isLeftEdge(scrollX))
+ if (scrollX == 0)
restoreInitialAlphaValues();
}
- private boolean isDragScroll(int state)
- {
- return !mIsScrollStarted && state == ViewPager.SCROLL_STATE_DRAGGING;
- }
-
- private boolean canScrollToLeft(int scrollX)
- {
- return isLeftEdge(scrollX) && !mIsScrollToRight;
- }
-
private void setAlpha(int animatedItemIndex, int scrollX)
{
- View child = findFragmentViewByIndex(animatedItemIndex);
- ViewPager.LayoutParams lp = (ViewPager.LayoutParams) child.getLayoutParams();
+ View view = mPageViewProvider.findViewByIndex(animatedItemIndex);
+ ViewPager.LayoutParams lp = (ViewPager.LayoutParams) view.getLayoutParams();
if (lp.isDecor)
return;
- float transformPos = (float) (child.getLeft() - scrollX) / (float) getClientWidth();
- initCurrentAlpha(transformPos, animatedItemIndex);
- }
-
- @NonNull
- private View findFragmentViewByIndex(int index)
- {
- String tag = makePagerFragmentTag(index, mPager.getId());
- Fragment page = mActivity.getSupportFragmentManager().findFragmentByTag(tag);
- if (page == null)
- throw new NoSuchElementException("no such element for tag : " + tag);
-
- return Objects.requireNonNull(page.getView());
- }
-
- private void initCurrentAlpha(float transformPos, int itemIndex)
- {
- ImageView currentImage = mActivity.findViewById(mItems.get(itemIndex));
+ float transformPos = (float) (view.getLeft() - scrollX) / (float) getPagerWidth();
+ ImageView currentImage = mActivity.findViewById(mItems.get(animatedItemIndex));
if (transformPos <= MINUS_INFINITY_EDGE || transformPos >= PLUS_INFINITY_EDGE)
currentImage.setAlpha(ALPHA_TRANSPARENT);
else if (transformPos == SETTLED_PAGE_POSITION)
@@ -132,16 +116,6 @@ public class ParallaxBackgroundPageListener implements ViewPager.OnPageChangeLis
currentImage.setAlpha(ALPHA_OPAQUE - Math.abs(transformPos));
}
- private boolean isLeftEdge(int scrollX)
- {
- return scrollX == 0;
- }
-
- private boolean isRightEdge(int scrollX)
- {
- return scrollX == mPager.getWidth() * mAdapter.getCount();
- }
-
private void restoreInitialAlphaValues()
{
for (int j = mItems.size() - 1; j >= 0; j--)
@@ -151,24 +125,8 @@ public class ParallaxBackgroundPageListener implements ViewPager.OnPageChangeLis
}
}
- private void recalculateScrollDirection(float positionOffset, int positionOffsetPixels)
- {
- if (mShouldCalculateScrollDirection)
- {
- mIsScrollToRight =
- POSITION_OFFSET_BASE > positionOffset && positionOffsetPixels > POSITION_OFFSET_PIXELS_BASE;
- mShouldCalculateScrollDirection = false;
- }
- }
-
- private int getClientWidth()
+ private int getPagerWidth()
{
return mPager.getMeasuredWidth() - mPager.getPaddingLeft() - mPager.getPaddingRight();
}
-
- @NonNull
- private static String makePagerFragmentTag(int index, int pagerId)
- {
- return ANDROID_SWITCHER_TAG_SEGMENT + pagerId + SEPARATOR_TAG_SEGMENT + index;
- }
}
diff --git a/android/src/com/mapswithme/maps/widget/ParallaxBackgroundViewPager.java b/android/src/com/mapswithme/maps/widget/ParallaxBackgroundViewPager.java
index c66485b2d1..5b9fa6617a 100755
--- a/android/src/com/mapswithme/maps/widget/ParallaxBackgroundViewPager.java
+++ b/android/src/com/mapswithme/maps/widget/ParallaxBackgroundViewPager.java
@@ -5,7 +5,6 @@ import android.content.res.TypedArray;
import android.os.Handler;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
-import android.support.v4.view.MotionEventCompat;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
@@ -19,7 +18,7 @@ public class ParallaxBackgroundViewPager extends ViewPager
private static final int DEFAULT_AUTO_SCROLL_PERIOD = 3000;
private static final int CAROUSEL_ITEMS_MIN_COUNT = 2;
private final int mAutoScrollPeriod;
- private final boolean mHasAutoScroll;
+ private final boolean mAutoScroll;
@NonNull
private final Handler mAutoScrollHandler;
@NonNull
@@ -35,11 +34,11 @@ public class ParallaxBackgroundViewPager extends ViewPager
{
super(context, attrs);
TypedArray a = context.getTheme()
- .obtainStyledAttributes(attrs, R.styleable.ParallaxBgViewPager, 0, 0);
+ .obtainStyledAttributes(attrs, R.styleable.ParallaxViewPagerBg, 0, 0);
try
{
- mHasAutoScroll = a.getBoolean(R.styleable.ParallaxBgViewPager_autoScroll, false);
- mAutoScrollPeriod = a.getInt(R.styleable.ParallaxBgViewPager_scrollPeriod,
+ mAutoScroll = a.getBoolean(R.styleable.ParallaxViewPagerBg_autoScroll, false);
+ mAutoScrollPeriod = a.getInt(R.styleable.ParallaxViewPagerBg_scrollPeriod,
DEFAULT_AUTO_SCROLL_PERIOD);
}
finally
@@ -63,9 +62,9 @@ public class ParallaxBackgroundViewPager extends ViewPager
@Override
public boolean dispatchTouchEvent(MotionEvent ev)
{
- int action = MotionEventCompat.getActionMasked(ev);
+ int action = ev.getAction();
- if (action == MotionEvent.ACTION_DOWN && mHasAutoScroll)
+ if (action == MotionEvent.ACTION_DOWN && mAutoScroll)
stopAutoScroll();
else if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_OUTSIDE)
startAutoScroll();
@@ -118,7 +117,7 @@ public class ParallaxBackgroundViewPager extends ViewPager
PagerAdapter adapter = getAdapter();
if (adapter == null
|| adapter.getCount() < CAROUSEL_ITEMS_MIN_COUNT
- || !mHasAutoScroll)
+ || !mAutoScroll)
return;
if (isLastAutoScrollPosition())