Settings ViewPager now correctly handles RTL mode

Previously, the settings and support tabs were incorrectly orderded,
and had inverted transitions on click and on swipe.
Ordering of tabs now correctly displays All Settings as the default,
right tab, and the Support tab to its left. The tab headers also now
function properly in transition, and onclick.

Change-Id: Iab499ee13433cb78941bc33cbb0e99ffe2937174
Fixes: 30079049
This commit is contained in:
Matthew Fritze
2016-07-14 12:57:04 -07:00
parent b10df69a84
commit 44564126c3
4 changed files with 119 additions and 16 deletions

View File

@@ -18,7 +18,6 @@ package com.android.settings.widget;
import android.content.Context;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.LayoutInflater;
@@ -39,7 +38,7 @@ public final class SlidingTabLayout extends FrameLayout implements View.OnClickL
private final View mIndicatorView;
private final LayoutInflater mLayoutInflater;
private ViewPager mViewPager;
private RtlCompatibleViewPager mViewPager;
private int mSelectedPosition;
private float mSelectionOffset;
@@ -58,7 +57,7 @@ public final class SlidingTabLayout extends FrameLayout implements View.OnClickL
* Sets the associated view pager. Note that the assumption here is that the pager content
* (number of tabs and tab titles) does not change after this call has been made.
*/
public void setViewPager(ViewPager viewPager) {
public void setViewPager(RtlCompatibleViewPager viewPager) {
mTitleView.removeAllViews();
mViewPager = viewPager;
@@ -87,8 +86,19 @@ public final class SlidingTabLayout extends FrameLayout implements View.OnClickL
mTitleView.layout(0, 0, mTitleView.getMeasuredWidth(), mTitleView.getMeasuredHeight());
final int indicatorBottom = getMeasuredHeight();
final int indicatorHeight = mIndicatorView.getMeasuredHeight();
mIndicatorView.layout(0, indicatorBottom - indicatorHeight,
mIndicatorView.getMeasuredWidth(), indicatorBottom);
final int indicatorWidth = mIndicatorView.getMeasuredWidth();
final int totalWidth = getMeasuredWidth();
// IndicatorView should start on the right when RTL mode is enabled
if (isRtlMode()) {
mIndicatorView.layout(totalWidth - indicatorWidth,
indicatorBottom - indicatorHeight, totalWidth,
indicatorBottom);
} else {
mIndicatorView.layout(0, indicatorBottom - indicatorHeight,
indicatorWidth, indicatorBottom);
}
}
}
@@ -106,7 +116,9 @@ public final class SlidingTabLayout extends FrameLayout implements View.OnClickL
private void onViewPagerPageChanged(int position, float positionOffset) {
mSelectedPosition = position;
mSelectionOffset = positionOffset;
mIndicatorView.setTranslationX(getIndicatorLeft());
// Translation should be reversed in RTL mode
final int leftIndicator = isRtlMode() ? -getIndicatorLeft() : getIndicatorLeft();
mIndicatorView.setTranslationX(leftIndicator);
}
private void populateTabStrip() {
@@ -135,7 +147,12 @@ public final class SlidingTabLayout extends FrameLayout implements View.OnClickL
return left;
}
private final class InternalViewPagerListener implements ViewPager.OnPageChangeListener {
private boolean isRtlMode() {
return getLayoutDirection() == LAYOUT_DIRECTION_RTL;
}
private final class InternalViewPagerListener implements
RtlCompatibleViewPager.OnPageChangeListener {
private int mScrollState;
@Override
@@ -154,7 +171,8 @@ public final class SlidingTabLayout extends FrameLayout implements View.OnClickL
@Override
public void onPageSelected(int position) {
if (mScrollState == ViewPager.SCROLL_STATE_IDLE) {
position = mViewPager.getRtlAwareIndex(position);
if (mScrollState == RtlCompatibleViewPager.SCROLL_STATE_IDLE) {
onViewPagerPageChanged(position, 0f);
}
final int titleCount = mTitleView.getChildCount();